From 2c156f3884896174346b970bcd3c3ba7ca21cc7b Mon Sep 17 00:00:00 2001 From: James Maes Date: Sat, 7 Nov 2026 16:12:34 -0600 Subject: [PATCH 1/2] ci: build on the shared ci-workflows node.yaml, remove CircleCI Gitea CI runs npm ci, the generated-code drift check, build, test and lint through KofTwentyTwo/ci-workflows node.yaml. Removes the retired qqq-orb files (.circleci, .qqq-ci.yml and the copies seeded into the Homebrew tap) and updates the docs that described them. Publishing is not ported. Co-Authored-By: Claude Opus 5.5 --- .circleci/config.yml | 14 --------- .gitea/workflows/build.yaml | 16 ++++++++++ .qqq-ci.yml | 8 ----- README.md | 4 +-- docs/README.md | 4 +-- docs/ci-lanes.md | 31 ++++++------------- docs/packaging/README.md | 6 ++-- .../homebrew-tap/.circleci/config.yml | 14 --------- docs/packaging/homebrew-tap/.qqq-ci.yml | 5 --- docs/packaging/homebrew-tap/README.md | 6 ++-- docs/release-runbook.md | 5 +++ 11 files changed, 40 insertions(+), 73 deletions(-) delete mode 100644 .circleci/config.yml create mode 100644 .gitea/workflows/build.yaml delete mode 100644 .qqq-ci.yml delete mode 100644 docs/packaging/homebrew-tap/.circleci/config.yml delete mode 100644 docs/packaging/homebrew-tap/.qqq-ci.yml diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 18fd9f1..0000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,14 +0,0 @@ -version: 2.1 -setup: true -orbs: - qqq-orb: kingsrook/qqq-orb@0.8 -workflows: - setup: - jobs: - - qqq-orb/generate_pipeline: - orb_version: '0.8' - filters: - branches: - ignore: automation/qbit-rc-pending - tags: - only: /.*/ diff --git a/.gitea/workflows/build.yaml b/.gitea/workflows/build.yaml new file mode 100644 index 0000000..cb9a3f4 --- /dev/null +++ b/.gitea/workflows/build.yaml @@ -0,0 +1,16 @@ +name: build +on: + push: +jobs: + node: + uses: self:KofTwentyTwo/ci-workflows/.gitea/workflows/node.yaml@main + with: + node-version: '22' + # The TUI (packages/tui) is not an npm workspace and needs Bun; build and test cover the four + # Node workspaces only, as the old CI did. + commands: | + npm run generate + git diff --exit-code -- packages/ui-api-client/src/schema.ts packages/core/src/api/operations.ts + npm run build + npm test + npm run lint diff --git a/.qqq-ci.yml b/.qqq-ci.yml deleted file mode 100644 index 940ce31..0000000 --- a/.qqq-ci.yml +++ /dev/null @@ -1,8 +0,0 @@ -profile: cli -orb_version: '0.8' -default_branch: main -publish: - release: true -publish_context: qqq-maven-registry-credentials -# Native target notes; separate binary entrypoints do not read this CI manifest. -# platforms: [macos-arm64, windows-x64] diff --git a/README.md b/README.md index 4082220..98f9e6c 100644 --- a/README.md +++ b/README.md @@ -324,8 +324,8 @@ scripts/verify-binary.sh dist/qqq-darwin-arm64 --server http://localhost:8077 ``` The CLI runs on Node 20 and later and uses no Bun-only API; Bun is needed only for the TUI and the -binaries. CI is the qqq-orb `cli` profile (`.qqq-ci.yml`); a tag `v` publishes the -packages to GitHub Packages ([`docs/ci-lanes.md`](docs/ci-lanes.md) says what it does and does not cover). +binaries. CI is the shared Gitea `node.yaml` workflow (`.gitea/workflows/build.yaml`): build, test, lint and +a generated-code drift check on every push; it publishes nothing ([`docs/ci-lanes.md`](docs/ci-lanes.md)). ## Contributing, security, license diff --git a/docs/README.md b/docs/README.md index cc96838..758caf3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -23,9 +23,9 @@ Everything under `docs/`: | [release-notes/1.0.0.md](release-notes/1.0.0.md) | the GitHub release body for `cli-v1.0.0` (the release commands are in an HTML comment at the top) | | [release-notes/1.0.0-rc.1.md](release-notes/1.0.0-rc.1.md) | the GitHub release body for the release candidate `cli-v1.0.0-rc.1`, kept for history | | [packaging/README.md](packaging/README.md) | the install paths (curl installer, Homebrew, Scoop, npm), where the formula and manifest live, platform notes (Gatekeeper, SmartScreen, musl), and how the terminal UI is bundled | -| [packaging/homebrew-tap/](packaging/homebrew-tap/README.md) | the complete `QRun-IO/homebrew-tap` repository, ready to copy: `Formula/qqq.rb`, README, LICENSE and its qqq-orb CI files | +| [packaging/homebrew-tap/](packaging/homebrew-tap/README.md) | the complete `QRun-IO/homebrew-tap` repository, ready to copy: `Formula/qqq.rb`, README, LICENSE (its old qqq-orb CI files were removed with CircleCI) | | [packaging/qqq.json](packaging/qqq.json) | the Scoop manifest, copied to `bucket/qqq.json` in `QRun-IO/scoop-bucket` | -| [ci-lanes.md](ci-lanes.md) | what CircleCI (the qqq-orb `cli` profile) runs: the Linux verify-and-publish job and the macOS arm64 and Windows x64 lanes, what is still outside CI, and the history of the orb changes | +| [ci-lanes.md](ci-lanes.md) | what CI runs (the shared Gitea `node.yaml` workflow), what is outside CI, and the history of the retired CircleCI orb lanes | `scripts/update-packaging.mjs` fills the version and checksums of the formula and manifest from a release's `SHA256SUMS`. diff --git a/docs/ci-lanes.md b/docs/ci-lanes.md index 6548360..33d7167 100644 --- a/docs/ci-lanes.md +++ b/docs/ci-lanes.md @@ -2,30 +2,19 @@ ## What runs today -`.circleci/config.yml` is the qqq-orb setup stub on the `0.8` track (it picks up every 0.8.x release by -itself); `.qqq-ci.yml` selects the orb's `cli` profile and, since qqq-orb **0.8.33**, turns on the -platform lanes with `platforms: [macos-arm64, windows-x64]`. The profile generates three jobs: +CircleCI and the qqq-orb were retired on 2026-11-07. CI is the shared Gitea workflow +[`KofTwentyTwo/ci-workflows` `node.yaml`](https://git.kof22.com/KofTwentyTwo/ci-workflows), called from +`.gitea/workflows/build.yaml` on every push, Linux only (`node:22-bookworm`): -| Job | Executor | What it runs | -|---|---|---| -| `cli-macos-arm64` (`qqq-orb/cli_platform`) | macOS, Xcode 16.4, `m4pro.medium` | Node 20.20.2 (the `engines` floor) with nvm, `npm ci`, `npm run build && npm test && npm run lint` | -| `cli-windows-x64` (`qqq-orb/cli_platform`) | Windows Server 2022, `windows.medium`, steps in Git Bash | the same, on Windows (keyring DPAPI path, Windows paths) | -| `qqq-orb/cli_verify_publish` | Linux, `cimg/node:22.23` | `npm ci`; `npm run generate` then `git diff --exit-code` on `schema.ts` and `operations.ts`; build, test, lint; a Prism smoke (`GET /qqq/v1/version`, `/metaData/authentication`); on a tag `v` with `publish.release: true`, publishing (below) | +1. `npm ci` +2. `npm run generate`, then `git diff --exit-code` on `schema.ts` and `operations.ts` (generated-code drift) +3. `npm run build`, `npm test`, `npm run lint` -On branches and pull requests the three jobs run side by side. On a release tag `cli_verify_publish` -**requires both platform lanes**, so nothing is published unless macOS and Windows are green. Publishing -puts all four packages on GitHub Packages (client, core, conformance, CLI, in that order) with the dist-tag -`latest` when all four versions are final and `rc` when any of them has a prerelease part. The CircleCI -plan must include the `m4pro.medium` and `windows.medium` resource classes. +Not in CI: publishing (packages, binaries, Homebrew/Scoop updates are release-machine steps in +`docs/release-runbook.md` until a release workflow is decided), the macOS arm64 and Windows x64 lanes, +the Prism smoke, the TUI (`npm run test:tui`, `typecheck:tui`, which need Bun) and the platform binaries. -The orb's generator accepts this manifest: rendered with `src/scripts/generate_pipeline.py` from qqq-orb -v0.8.33, a push to `main` gives `cli-macos-arm64`, `cli-windows-x64` and `cli_verify_publish` in -`test_only`, and the tag `v1.8.0` gives the same in `publish_release` with `cli_verify_publish` requiring -both lanes and bound to the `qqq-maven-registry-credentials` context. - -Still not in CI: the TUI (`npm run test:tui`, `typecheck:tui`, which need Bun), and building and smoking -the platform binaries (`scripts/build-binaries.mjs --host`, `scripts/verify-binary.sh` / `.ps1`); the -lanes run the Node packages only. Those stay release-machine steps in `docs/release-runbook.md`. +Everything below describes the retired CircleCI setup and is kept for the record. ### History diff --git a/docs/packaging/README.md b/docs/packaging/README.md index 6a02131..1d3fe7d 100644 --- a/docs/packaging/README.md +++ b/docs/packaging/README.md @@ -36,10 +36,8 @@ checkpoint the sums here first, not there. ## Where the formula and manifest live - **`QRun-IO/homebrew-tap`** is laid out under `homebrew-tap/` here (the repository is created by copying - that directory). Its CI is the qqq-orb `homebrew-tap` profile (`.qqq-ci.yml`, with the same setup - `.circleci/config.yml` as `QRun-IO/homebrew-qctl`). That CI fetches and checksums every platform's - download, but it installs the formula and runs `brew test` with the **Linux x64 binary only**; the - macOS (and Linux arm64) binaries are not executed there. qctl stays in `QRun-IO/homebrew-qctl` until it + that directory). Its old CI (the qqq-orb `homebrew-tap` profile on CircleCI) was retired on + 2026-11-07 and the seed no longer carries CI files; tap CI on Gitea is not decided yet. qctl stays in `QRun-IO/homebrew-qctl` until it moves over. - **`QRun-IO/scoop-bucket`** is created from [ScoopInstaller/BucketTemplate](https://github.com/ScoopInstaller/BucketTemplate), with `qqq.json` as diff --git a/docs/packaging/homebrew-tap/.circleci/config.yml b/docs/packaging/homebrew-tap/.circleci/config.yml deleted file mode 100644 index 32df77b..0000000 --- a/docs/packaging/homebrew-tap/.circleci/config.yml +++ /dev/null @@ -1,14 +0,0 @@ -version: 2.1 -setup: true -orbs: - qqq-orb: kingsrook/qqq-orb@0.8 -workflows: - setup: - jobs: - - qqq-orb/generate_pipeline: - orb_version: '0.8' - filters: - branches: - ignore: automation/qbit-rc-pending - tags: - ignore: /.*/ diff --git a/docs/packaging/homebrew-tap/.qqq-ci.yml b/docs/packaging/homebrew-tap/.qqq-ci.yml deleted file mode 100644 index b000ca0..0000000 --- a/docs/packaging/homebrew-tap/.qqq-ci.yml +++ /dev/null @@ -1,5 +0,0 @@ -profile: homebrew-tap -orb_version: '0.8' -default_branch: main -tap: qrun-io/tap -formula: qqq diff --git a/docs/packaging/homebrew-tap/README.md b/docs/packaging/homebrew-tap/README.md index 215ca77..aa19e2b 100644 --- a/docs/packaging/homebrew-tap/README.md +++ b/docs/packaging/homebrew-tap/README.md @@ -20,9 +20,9 @@ here (`Formula/qctl.rb`) once this tap exists, with `homebrew-qctl` kept as a po The formula is generated in qqq-cli: after a `cli-v` GitHub release, run `node scripts/update-packaging.mjs ` there and copy -`docs/packaging/homebrew-tap/Formula/qqq.rb` here. CI (qqq-orb `homebrew-tap` profile) fetches every -platform's download, installs the formula and runs its test, which fails on a wrong or all-zero sum, but -only once the pull request here is opened and its checks are read. The script refuses to write missing or +`docs/packaging/homebrew-tap/Formula/qqq.rb` here. The tap's old CI (qqq-orb `homebrew-tap` profile, +which installed the formula and ran its test) was retired on 2026-11-07; Gitea CI for the tap is not +decided yet, so check the formula by hand (`brew install --build-from-source ./Formula/qqq.rb && brew test qqq`). The script refuses to write missing or malformed sums; still compare the sums in the diff with the release's `SHA256SUMS` before opening the PR. Apache-2.0 diff --git a/docs/release-runbook.md b/docs/release-runbook.md index a615b6f..82812e1 100644 --- a/docs/release-runbook.md +++ b/docs/release-runbook.md @@ -4,6 +4,11 @@ From "the branch is green" to "1.0.0 is published and installable everywhere". I 1.0.0 but holds for any release; replace the versions. Nothing in the repository tags, pushes or publishes by itself: `scripts/release.mjs` checks and prints, people run the commands. +> **2026-11-07:** CircleCI and the qqq-orb are retired. Gitea CI (`.gitea/workflows/build.yaml`) verifies +> only; the orb publish steps below (npm packages on a `v` tag, the platform lanes) have +> no replacement yet. How packages, binaries and the Homebrew/Scoop updates are released is an open +> decision; until then this runbook is the record of the old process. + What ships: | Artifact | Version for 1.0 | Where | Made by | -- 2.54.0 From 4828a73d3244589b03aa61e91d24f5c64a5cdd0a Mon Sep 17 00:00:00 2001 From: James Maes Date: Sat, 7 Nov 2026 16:14:30 -0600 Subject: [PATCH 2/2] ci: pin ci-workflows node.yaml to @v1 Co-Authored-By: Claude Opus 5.5 --- .gitea/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/build.yaml b/.gitea/workflows/build.yaml index cb9a3f4..c5acecc 100644 --- a/.gitea/workflows/build.yaml +++ b/.gitea/workflows/build.yaml @@ -3,7 +3,7 @@ on: push: jobs: node: - uses: self:KofTwentyTwo/ci-workflows/.gitea/workflows/node.yaml@main + uses: self:KofTwentyTwo/ci-workflows/.gitea/workflows/node.yaml@v1 with: node-version: '22' # The TUI (packages/tui) is not an npm workspace and needs Bun; build and test cover the four -- 2.54.0