From 3a802cbfd07e46cbbbdef10205d49815d0ea76d8 Mon Sep 17 00:00:00 2001 From: Hasan Alp Caferoglu Date: Fri, 9 Oct 2026 23:38:44 +0300 Subject: [PATCH 1/3] chore: add Apache-2.0 license, contributing, code of conduct and data-handling docs, CI and release workflows --- .claude-plugin/marketplace.json | 6 +- .claude-plugin/plugin.json | 21 ++- .codex-plugin/plugin.json | 38 +++++- .cursor-plugin/plugin.json | 19 ++- .github/check-plugin.sh | 94 +++++++++++++ .github/workflows/ci.yml | 19 +++ .github/workflows/lint-pr-title.yml | 28 ++++ .github/workflows/release.yml | 36 +++++ CODE_OF_CONDUCT.md | 83 ++++++++++++ CONTRIBUTING.md | 39 ++++++ DATA_HANDLING.md | 75 +++++++++++ LICENSE | 202 ++++++++++++++++++++++++++++ NOTICE | 4 + README.md | 117 ++++------------ install-skills.sh | 3 +- scripts/datasqrl-agent.sh | 33 +++-- scripts/datasqrl-cloud.sh | 1 + 17 files changed, 698 insertions(+), 120 deletions(-) create mode 100755 .github/check-plugin.sh create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/lint-pr-title.yml create mode 100644 .github/workflows/release.yml create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 DATA_HANDLING.md create mode 100644 LICENSE create mode 100644 NOTICE diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 1b5e68a..e9b7255 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -1,7 +1,11 @@ { "name": "datasqrl", "description": "Build DataSQRL data pipelines from your coding agent, using the Dockerized DataSQRL Code Agent.", - "owner": { "name": "DataSQRL" }, + "owner": { + "name": "DataSQRL", + "email": "contact@datasqrl.com", + "url": "https://datasqrl.com" + }, "plugins": [ { "name": "datasqrl", diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 0a1d683..2125ef4 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,7 +1,22 @@ { "name": "datasqrl", - "version": "0.2.0", + "displayName": "DataSQRL", + "version": "0.3.0", "description": "Plan and implement DataSQRL data pipelines with the Dockerized DataSQRL Code Agent.", - "author": { "name": "DataSQRL" }, - "homepage": "https://datasqrl.com" + "author": { + "name": "DataSQRL", + "email": "contact@datasqrl.com", + "url": "https://datasqrl.com" + }, + "homepage": "https://datasqrl.com", + "repository": "https://github.com/DataSQRL/datasqrl-plugin", + "license": "Apache-2.0", + "keywords": [ + "datasqrl", + "sqrl", + "data-pipelines", + "streaming", + "flink", + "graphql" + ] } diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index b4b9fc7..654bd3d 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -1,6 +1,40 @@ { "name": "datasqrl", - "version": "0.2.0", + "version": "0.3.0", "description": "Plan and implement DataSQRL data pipelines with the Dockerized DataSQRL Code Agent.", - "skills": "./skills/" + "author": { + "name": "DataSQRL", + "email": "contact@datasqrl.com", + "url": "https://datasqrl.com" + }, + "homepage": "https://datasqrl.com", + "repository": "https://github.com/DataSQRL/datasqrl-plugin", + "license": "Apache-2.0", + "keywords": [ + "datasqrl", + "sqrl", + "data-pipelines", + "streaming", + "flink", + "graphql" + ], + "skills": "./skills/", + "interface": { + "displayName": "DataSQRL", + "shortDescription": "Plan, build and deploy DataSQRL data pipelines", + "longDescription": "Describe a data pipeline in plain English. The plugin turns it into a requirements document, runs the Dockerized DataSQRL Code Agent to plan it, waits for your review, then implements, compiles, tests and verifies it. Small changes to an existing project go straight to a patch run, and finished projects deploy to DataSQRL Cloud.", + "developerName": "DataSQRL", + "category": "Developer Tools", + "capabilities": [ + "Interactive", + "Read", + "Write" + ], + "websiteURL": "https://datasqrl.com", + "defaultPrompt": [ + "I want a pipeline that ingests our order events and reports daily revenue.", + "Plan a DataSQRL pipeline from my requirements document.", + "Is my DataSQRL run still going?" + ] + } } diff --git a/.cursor-plugin/plugin.json b/.cursor-plugin/plugin.json index 2c68b56..ab76632 100644 --- a/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugin.json @@ -1,6 +1,21 @@ { "name": "datasqrl", - "version": "0.2.0", + "version": "0.3.0", "description": "Plan and implement DataSQRL data pipelines with the Dockerized DataSQRL Code Agent.", - "author": { "name": "DataSQRL" } + "author": { + "name": "DataSQRL", + "email": "contact@datasqrl.com" + }, + "homepage": "https://datasqrl.com", + "repository": "https://github.com/DataSQRL/datasqrl-plugin", + "license": "Apache-2.0", + "keywords": [ + "datasqrl", + "sqrl", + "data-pipelines", + "streaming", + "flink", + "graphql" + ], + "skills": "./skills/" } diff --git a/.github/check-plugin.sh b/.github/check-plugin.sh new file mode 100755 index 0000000..4dcd4c4 --- /dev/null +++ b/.github/check-plugin.sh @@ -0,0 +1,94 @@ +#!/bin/bash +# SPDX-License-Identifier: Apache-2.0 +# +# Checks that this repository installs as a working plugin. CI runs it on every pull request and +# before every release; run it locally before opening a pull request. +# +# Usage, from the repository root: +# .github/check-plugin.sh # every check +# .github/check-plugin.sh --tag 1.2.3 # also require the tag to match the manifest version +# +# Needs bash, python3 and, when installed, shellcheck. Without shellcheck the lint step is skipped +# with a notice; CI always has it. + +set -euo pipefail + +cd "$(dirname "${BASH_SOURCE[0]}")/.." + +TAG="" +if [ "${1:-}" = "--tag" ]; then + TAG="${2:?--tag needs a value such as 1.2.3}" +fi + +failures=0 +fail() { + echo "FAIL: $*" >&2 + failures=$((failures + 1)) +} + +# 1. Scripts: real files, executable, valid bash, and clean under shellcheck. A plugin host copies +# the plugin into a cache on install, so a symlink would arrive empty and every skill would fail +# to find its script. +scripts=(scripts/datasqrl-agent.sh scripts/datasqrl-cloud.sh install-skills.sh .github/check-plugin.sh) +for f in "${scripts[@]}"; do + if [ ! -e "$f" ]; then fail "$f is missing"; continue; fi + [ -L "$f" ] && fail "$f is a symlink; it must be a real file" + [ -x "$f" ] || fail "$f is not executable (git update-index --chmod=+x $f)" + bash -n "$f" || fail "$f is not valid bash" +done +if command -v shellcheck >/dev/null 2>&1; then + shellcheck -S error "${scripts[@]}" || fail "shellcheck reported errors" +else + echo "NOTICE: shellcheck is not installed; skipping the lint step." >&2 +fi + +# 2. Manifests: each host reads its own, so each must parse, and all must carry one version. +manifests=(.claude-plugin/marketplace.json .claude-plugin/plugin.json .codex-plugin/plugin.json .cursor-plugin/plugin.json) +for m in "${manifests[@]}"; do + [ -f "$m" ] || { fail "$m is missing"; continue; } + python3 -c 'import json,sys; json.load(open(sys.argv[1]))' "$m" || fail "$m is not valid JSON" +done +versions=$(python3 - <<'EOF' +import json +for m in (".claude-plugin/plugin.json", ".codex-plugin/plugin.json", ".cursor-plugin/plugin.json"): + try: + print(m, json.load(open(m)).get("version", "")) + except Exception: + print(m, "") +EOF +) +VERSION=$(echo "$versions" | awk 'NR==1{print $2}') +if [ "$(echo "$versions" | awk '{print $2}' | sort -u | wc -l | tr -d ' ')" != "1" ]; then + fail "the manifests disagree on the version:"$'\n'"$versions" +fi + +# 3. The Claude manifest keeps the default skills/ scan; a skills key would hide every skill it omits. +python3 -c 'import json,sys; sys.exit("skills" in json.load(open(".claude-plugin/plugin.json")))' \ + || fail ".claude-plugin/plugin.json declares a skills key, which hides every skill it does not list" + +# 4. Skills: every directory has a SKILL.md whose name matches the directory. +shopt -s nullglob +skill_dirs=(skills/*/) +[ "${#skill_dirs[@]}" -ge 1 ] || fail "no skills found under skills/" +for d in "${skill_dirs[@]}"; do + s=$(basename "$d") + if [ ! -f "$d/SKILL.md" ]; then fail "skills/$s/SKILL.md is missing"; continue; fi + grep -qx "name: $s" "$d/SKILL.md" || fail "skills/$s/SKILL.md has no 'name: $s' line" +done + +# 5. Skills reach users exactly as written, so maintainer notes belong in CONTRIBUTING.md. An HTML +# comment is invisible when rendered but is read by the agent as plain text. +if grep -rn ' + +## Area + +- [ ] Skills +- [ ] Launcher (`scripts/datasqrl-agent.sh`) +- [ ] Cloud client (`scripts/datasqrl-cloud.sh`) +- [ ] Manifests +- [ ] CI +- [ ] Docs + +## How did you test it? + + + +## Checklist + +- [ ] The PR title starts with a type such as `feat:`, `fix:` or `docs:` +- [ ] `.github/check-plugin.sh` passes +- [ ] Skills contain no SQRL and no HTML comments +- [ ] A launcher change that needs a new agent image option waits until that image is published +- [ ] README or DATA_HANDLING.md is updated if behavior or data handling changed