From f1bb99c1badb81cc574ec3aa5054e7a086f47ba7 Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 4 Sep 2026 20:28:26 +0000 Subject: [PATCH 01/34] Initial commit with task details Adding .gitkeep for PR creation (default mode). This file will be removed when the task is complete. Issue: https://github.com/link-foundation/command-stream/issues/199 --- .gitkeep | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitkeep diff --git a/.gitkeep b/.gitkeep new file mode 100644 index 0000000..7a48f06 --- /dev/null +++ b/.gitkeep @@ -0,0 +1 @@ +# .gitkeep file auto-generated at 2026-09-04T20:28:26.756Z for PR creation at branch issue-199-32c07917fc87 for issue https://github.com/link-foundation/command-stream/issues/199 \ No newline at end of file From 469484fb576cbb32dfb8c17ff86436782c40fc31 Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 4 Sep 2026 20:40:43 +0000 Subject: [PATCH 02/34] docs: collect CI/CD evidence and deep analysis for issue #199 --- .../issues/199/pulls/200/analysis/README.md | 240 +++++++++ .../199/pulls/200/api/branch-protection.json | 1 + .../issues/199/pulls/200/api/issue-199.json | 1 + dev/log/issues/199/pulls/200/api/pr-200.json | 1 + dev/log/issues/199/pulls/200/api/repo.json | 1 + .../issues/199/pulls/200/api/rulesets.json | 1 + .../199/pulls/200/api/run-33897699209.json | 1 + .../199/pulls/200/api/run-33910180248.json | 1 + .../199/pulls/200/api/run-33910180769.json | 1 + .../199/pulls/200/api/run-33911660942.json | 1 + .../199/pulls/200/api/run-33911660947.json | 1 + .../199/pulls/200/api/run-33914574263.json | 1 + .../199/pulls/200/api/run-33914574283.json | 1 + .../issues/199/pulls/200/api/runs-recent.json | 1 + .../200/templates/CI-CD-BEST-PRACTICES.md | 469 ++++++++++++++++++ .../pulls/200/templates/js-tmpl.file-tree.txt | 374 ++++++++++++++ .../200/templates/rust-tmpl.file-tree.txt | 146 ++++++ .../200/workflows/check-language-parity.sh | 75 +++ dev/log/issues/199/pulls/200/workflows/js.yml | 420 ++++++++++++++++ .../issues/199/pulls/200/workflows/parity.yml | 37 ++ .../issues/199/pulls/200/workflows/rust.yml | 355 +++++++++++++ 21 files changed, 2129 insertions(+) create mode 100644 dev/log/issues/199/pulls/200/analysis/README.md create mode 100644 dev/log/issues/199/pulls/200/api/branch-protection.json create mode 100644 dev/log/issues/199/pulls/200/api/issue-199.json create mode 100644 dev/log/issues/199/pulls/200/api/pr-200.json create mode 100644 dev/log/issues/199/pulls/200/api/repo.json create mode 100644 dev/log/issues/199/pulls/200/api/rulesets.json create mode 100644 dev/log/issues/199/pulls/200/api/run-33897699209.json create mode 100644 dev/log/issues/199/pulls/200/api/run-33910180248.json create mode 100644 dev/log/issues/199/pulls/200/api/run-33910180769.json create mode 100644 dev/log/issues/199/pulls/200/api/run-33911660942.json create mode 100644 dev/log/issues/199/pulls/200/api/run-33911660947.json create mode 100644 dev/log/issues/199/pulls/200/api/run-33914574263.json create mode 100644 dev/log/issues/199/pulls/200/api/run-33914574283.json create mode 100644 dev/log/issues/199/pulls/200/api/runs-recent.json create mode 100644 dev/log/issues/199/pulls/200/templates/CI-CD-BEST-PRACTICES.md create mode 100644 dev/log/issues/199/pulls/200/templates/js-tmpl.file-tree.txt create mode 100644 dev/log/issues/199/pulls/200/templates/rust-tmpl.file-tree.txt create mode 100755 dev/log/issues/199/pulls/200/workflows/check-language-parity.sh create mode 100644 dev/log/issues/199/pulls/200/workflows/js.yml create mode 100644 dev/log/issues/199/pulls/200/workflows/parity.yml create mode 100644 dev/log/issues/199/pulls/200/workflows/rust.yml diff --git a/dev/log/issues/199/pulls/200/analysis/README.md b/dev/log/issues/199/pulls/200/analysis/README.md new file mode 100644 index 0000000..c932a72 --- /dev/null +++ b/dev/log/issues/199/pulls/200/analysis/README.md @@ -0,0 +1,240 @@ +# Issue #199 β€” deep analysis + +> Evidence root: `dev/log/issues/199/pulls/200/` +> Issue: +> Pull request: + +## 1. Evidence collected + +| Path | What it is | +| --- | --- | +| `api/issue-199.json`, `api/pr-200.json` | Issue and PR metadata + comments | +| `api/repo.json` | Repository settings | +| `api/branch-protection.json` | `404 Branch not protected` for `main` | +| `api/rulesets.json` | `[]` β€” no rulesets configured | +| `api/runs-recent.json` | Last workflow runs on `main` | +| `api/run-.json` | Per-run job/step conclusions (7 runs) | +| `ci-logs/run-.log` | Full raw logs of the same 7 runs (0.8–1.9 MB each) | +| `workflows/` | Snapshot of `.github/workflows/*` before the fix | +| `templates/` | `CI-CD-BEST-PRACTICES.md` + file trees of both pipeline templates | +| `analysis/actionlint-before.log` | actionlint 1.7.7 run against the workflows (4 findings) | +| `analysis/zizmor-before.log` | zizmor `--min-confidence medium` run (58 findings) | +| `analysis/clippy-before.log` | `cargo clippy --all-targets --all-features` (15 warnings, exit 0) | +| `analysis/js-scripts-diff.log` | `js/scripts/*` vs js template | +| `analysis/rust-scripts-diff.log` | `rust/scripts/*` vs rust template | + +## 2. Timeline of the failing release (run 33914574283) + +Reconstructed from `ci-logs/run-33914574283.log`. + +| Time (UTC) | Event | +| --- | --- | +| 20:07:5x | `release` job starts on `main` @ `1975cd7` after `lint` + `test` pass | +| 20:08:36 | `changeset publish` prints `πŸ¦‹ success packages published successfully: command-stream@0.20.1` and `πŸ¦‹ New tag: v0.20.1` β€” **the publish really succeeded** | +| 20:08:36 | `publish-to-npm.mjs` sleeps `VERIFY_DELAY` = 2 s | +| 20:08:38 | `npm view command-stream@0.20.1 version` β†’ `npm error code E404 / 404 No match found for version 0.20.1` β€” registry read replica has not caught up yet | +| 20:08:38 | Script logs `Publish failed: version not found on npm after publish attempt, waiting 10s before retry...` | +| 20:08:48 | Attempt 2: `changeset publish` β†’ `npm error code E409 / 409 Conflict β€” PUT https://registry.npmjs.org/command-stream β€” Cannot publish over previously staged version "0.20.1"` | +| 20:08:5x | `E409` text matches `FAILURE_PATTERNS` (`'npm error code e'`) β†’ treated as a hard failure | +| 20:09:0x | Attempt 3: identical `E409` | +| 20:09:0x | `❌ Failed to publish after 3 attempts` β†’ job **red** | + +Independent verification performed during this investigation: + +``` +$ npm view command-stream versions # includes 0.20.1 +$ npm view command-stream dist-tags # latest: 0.20.1 +``` + +**The npm release succeeded; CI reported a failure. This is the false positive +named in the issue title.** + +## 3. Requirements extracted from issue #199 + +| # | Requirement (verbatim intent) | Where addressed | +| --- | --- | --- | +| R1 | Check for **all false positives** in CI/CD and fix them | Β§4.1, Β§4.9 | +| R2 | Check for **all false negatives** in CI/CD and fix them | Β§4.2, Β§4.3, Β§4.4, Β§4.6 | +| R3 | Check for **all warnings** in CI/CD and fix them | Β§4.2, Β§4.3, Β§4.5 | +| R4 | Check for **all errors** in CI/CD and fix them | Β§4.1, Β§4.5 | +| R5 | Compare **all files** (full tree, all workflows and CI/CD scripts) against `link-foundation/js-ai-driven-development-pipeline-template` | Β§5 | +| R6 | …and against `link-foundation/rust-ai-driven-development-pipeline-template` | Β§5 | +| R7 | Reuse **all their best practices** | Β§5, Β§6 | +| R8 | If the same issue exists in a template, **report an issue in the template too** | Β§7 | +| R9 | Follow `link-assistant/hive-mind/docs/CI-CD-BEST-PRACTICES.md` | Β§6 | +| R10 | Apply every fix **everywhere** the problem occurs (JS *and* Rust, every workflow, every job) | Β§4 (each row lists all sites) | + +## 4. Root causes + +### 4.1 FALSE POSITIVE β€” npm publish reported as failed after a successful publish + +* **Site:** `js/scripts/publish-to-npm.mjs` +* **Root cause A β€” single-shot verification.** `attemptPublish()` sleeps a fixed + `VERIFY_DELAY` (2 s) and then calls `npm view` exactly once. npm's registry is + read-replicated; a freshly published version routinely takes longer than 2 s + to become visible to `npm view`. One miss is treated as "publish failed". +* **Root cause B β€” E409 is misclassified.** On the retry, npm answers + `E409 Cannot publish over previously staged version`, which *proves* the + version is already there. The generic pattern `'npm error code e'` in + `FAILURE_PATTERNS` swallows it as a failure instead of an idempotent success. +* **Solution:** replace one-shot verification with bounded exponential-backoff + polling against the registry metadata endpoint, and classify + "already published / already staged" as success. Ported from the js template's + `publish-retry.mjs` + `npm-registry.mjs` + `publish-failure-classifier.mjs`, + **plus the E409 `previously staged version` pattern that the template is also + missing** (see Β§7). +* **The Rust side is already correct:** `rust/scripts/publish-crate.rs` + `classify_failure()` maps `already uploaded` / `already exists` to + `FailureKind::AlreadyExists` and the workflow accepts + `publish_result == 'already_exists'`. No change needed there; verified by + reading the script and `analysis/rust-scripts-diff.log`. + +### 4.2 FALSE NEGATIVE β€” Rust clippy warnings never fail the build + +* **Site:** `.github/workflows/rust.yml` `Run Clippy` step; `rust/Cargo.toml`. +* **Root cause:** `cargo clippy --all-targets --all-features` without + `-D warnings`, and `Cargo.toml` has no `[lints]` section. Clippy exits 0 while + printing warnings, so CI is green with 15 outstanding warnings + (`analysis/clippy-before.log`). +* **Solution:** add `-- -D warnings`, add `[lints.rust]` / `[lints.clippy]` to + `rust/Cargo.toml` mirroring the Rust template, and fix every warning. + +### 4.3 FALSE NEGATIVE β€” ESLint warnings never fail the build + +* **Site:** `js/package.json` `"lint": "eslint ."`. +* **Root cause:** no `--max-warnings 0`. `js/eslint.config.js` sets ~15 rules to + `warn`, so any regression under those rules passes CI silently. +* **Solution:** `eslint . --max-warnings 0`. The tree is currently clean, so the + gate can be closed without churn and prevents future regressions. + +### 4.4 FALSE NEGATIVE β€” the workflows themselves are never linted + +* **Site:** `.github/workflows/` β€” there is no `workflows.yml`. +* **Root cause:** no actionlint and no zizmor job exists, so shell defects and + workflow security defects reach `main` unreviewed. Baselines: + actionlint 4 findings, zizmor 58 findings. +* **Solution:** add `.github/workflows/workflows.yml` (actionlint via the Docker + image so shellcheck/pyflakes actually run, + zizmor with a repo config), plus + `.github/zizmor.yml` and `.github/actionlint.yaml`, and fix every finding. + +### 4.5 ERRORS/WARNINGS found by the new linters + +| Tool | Finding | Sites | +| --- | --- | --- | +| actionlint | SC2193 β€” `[[ "..." == "changeset-release/"* ]]` comparison always false-ish form | `js.yml:73` | +| actionlint | untrusted `github.head_ref` interpolated into `run:` | `js.yml:73` | +| actionlint | SC2086 β€” unquoted `$GITHUB_OUTPUT` (Γ—2) | `js.yml:251,252` | +| zizmor | `template-injection` Γ—9 | `js.yml:73,345,398`; `rust.yml:300,337` | +| zizmor | `excessive-permissions` Γ—10 | every job without `permissions:` in `js.yml`, `rust.yml` | +| zizmor | `unpinned-uses` Γ—39 | every `uses:` in `js.yml`, `rust.yml`, `parity.yml` | + +### 4.6 FALSE NEGATIVE β€” no branch protection on `main` + +`api/branch-protection.json` = `404 Branch not protected`; `api/rulesets.json` = `[]`. +Nothing prevents merging a PR whose checks are red. This is a repository +*setting*, not a file, so it cannot be fixed inside this PR; it is documented in +`docs/CI-CD.md` as a required manual step. + +### 4.7 Concurrency model violates best practice #10 + +`js.yml` and `rust.yml` declare a **workflow-level** cancellable concurrency +group while the same workflow contains `release` / `instant-release` / +`changeset-pr` write jobs. A cancelled release can leave a committed version bump +without a published artifact. Best practice: cancellable groups only on check +jobs; a single non-cancellable `main-writer-*` group for every writer job. + +### 4.8 `always()` instead of `!cancelled()` + +`js.yml:85,115` and `rust.yml:78,111,146` use `if: always() && ...`, which keeps +jobs running after the run is cancelled. `!cancelled()` is the correct guard for +"run even though an upstream job was skipped". + +### 4.9 FALSE POSITIVE risk β€” matrix job-name collision + +`js.yml` names the test job `Test JavaScript (${{ matrix.runtime }} on ${{ matrix.os }})` +but the Node entries differ only by `matrix.node-version`. Result: three checks +all named `Test JavaScript (node on ubuntu-latest)`. Required-status-check rules +and humans cannot tell them apart, and a failure in one is indistinguishable +from a failure in another. + +## 5. File-by-file comparison against both templates + +Scripts (`analysis/js-scripts-diff.log`, `analysis/rust-scripts-diff.log`): + +* `rust/scripts/` β€” 8 of 17 files byte-identical to the template. The 5 that + differ are *ahead* of the template (e.g. `publish-crate.rs` uses + `--manifest-path` instead of `cd`, which is strictly better) or repo-specific. + Template-only scripts that matter for CI hygiene: + `check-cargo-lock.rs`, `simulate-fresh-merge.sh`, `install-rust-script.sh`. +* `js/scripts/` β€” every shared file differs; the important structural gap is + that the template splits publishing into `publish-retry.mjs`, + `npm-registry.mjs` and `publish-failure-classifier.mjs` with unit tests, while + this repo has a single monolithic `publish-to-npm.mjs` with the defect in Β§4.1. + +Workflows β€” present in **both** templates, absent here: + +| Template file | Purpose | +| --- | --- | +| `.github/workflows/workflows.yml` | actionlint + zizmor | +| `.github/workflows/security.yml` | CodeQL, dependency review, ecosystem audit | +| `.github/zizmor.yml` | `unpinned-uses` policy | +| `.github/actionlint.yaml` | known-runner-label allowlist | + +## 6. Best practices applied from `CI-CD-BEST-PRACTICES.md` + +1. Least-privilege `permissions:` at workflow level (`contents: read`) with + per-job elevation only where a write is genuinely needed. +2. No `${{ }}` interpolation inside `run:` β€” every value passes through `env:`. +3. Third-party actions hash-pinned; trusted namespaces ref-pinned by policy. +4. `persist-credentials: false` on every `actions/checkout` that does not push. +5. Cancellable `check-*` concurrency for checks; single non-cancellable + `main-writer-*` group for writers. +6. `!cancelled()` rather than `always()`. +7. Every job has `timeout-minutes`. +8. Workflow linting (actionlint **with shellcheck**) and workflow security + auditing (zizmor) as first-class CI jobs. +9. Warnings are errors (`-D warnings`, `--max-warnings 0`). +10. Verification of published artifacts (`wait-for-npm.mjs`, + `wait-for-crate.rs`) so a green release means an installable artifact. + +## 7. Upstream issue to report + +**Repository:** `link-foundation/js-ai-driven-development-pipeline-template` + +`scripts/publish-retry.mjs` defines `ALREADY_PUBLISHED_PATTERNS` as: + +```js +const ALREADY_PUBLISHED_PATTERNS = [ + 'epublishconflict', + 'cannot publish over the previously published version', + 'cannot publish over previously published version', + 'you cannot publish over the previously published versions', + 'already published', +]; +``` + +npm's real E409 message for a re-publish of a version whose tarball was already +staged is: + +``` +npm error code E409 +npm error 409 Conflict - PUT https://registry.npmjs.org/ - Cannot publish over previously staged version "0.20.1" +``` + +`staged` β‰  `published`, so none of the patterns match, and `E409` is not handled +anywhere in the template (`grep -rn 'staged\|E409\|409' scripts/` β†’ no hits). +A retry after a slow-propagating publish therefore fails the release even though +the version is live. Reproducible example, workaround and the code fix are in +the issue text (see Β§9 of the PR description). + +## 8. Existing components / libraries surveyed + +| Component | Used for | +| --- | --- | +| [`rhysd/actionlint`](https://github.com/rhysd/actionlint) 1.7.7 (Docker image) | Workflow syntax + embedded shellcheck/pyflakes. The Docker image is required: a bare binary without shellcheck on `PATH` silently skips shell checks. | +| [`zizmor`](https://docs.zizmor.sh/) via `zizmorcore/zizmor-action` | Workflow *security* audit β€” unpinned actions, template injection, excessive permissions, credential persistence. | +| [`github/codeql-action`](https://github.com/github/codeql-action) | Static analysis for `javascript-typescript` and `actions`. | +| [`actions/dependency-review-action`](https://github.com/actions/dependency-review-action) | Blocks PRs introducing high-severity advisories. | +| `npm audit --package-lock-only --audit-level=high` | Dependency advisories without a network install. | +| [`@changesets/cli`](https://github.com/changesets/changesets) | Already in use for versioning/publishing. | +| npm registry metadata endpoint (`https://registry.npmjs.org/`) | Publication check that does not depend on `npm view`'s cache/replica behaviour. | diff --git a/dev/log/issues/199/pulls/200/api/branch-protection.json b/dev/log/issues/199/pulls/200/api/branch-protection.json new file mode 100644 index 0000000..405d446 --- /dev/null +++ b/dev/log/issues/199/pulls/200/api/branch-protection.json @@ -0,0 +1 @@ +{"message":"Branch not protected","documentation_url":"https://docs.github.com/rest/branches/branch-protection#get-branch-protection","status":"404"}gh: Branch not protected (HTTP 404) diff --git a/dev/log/issues/199/pulls/200/api/issue-199.json b/dev/log/issues/199/pulls/200/api/issue-199.json new file mode 100644 index 0000000..20f0ac5 --- /dev/null +++ b/dev/log/issues/199/pulls/200/api/issue-199.json @@ -0,0 +1 @@ +{"author":{"id":"MDQ6VXNlcjE0MzE5MDQ=","is_bot":false,"login":"konard","name":"Konstantin Diachenko"},"body":"### Recent CI/CD runs on `main`\n\n| Workflow | Status | Conclusion | Commit | Run |\n| --- | --- | --- | --- | --- |\n| JavaScript checks and release | completed | failure | `000dbea` | [run](https://github.com/link-foundation/command-stream/actions/runs/33914574283) |\n| Rust checks and release | completed | success | `000dbea` | [run](https://github.com/link-foundation/command-stream/actions/runs/33914574263) |\n| Checks and release | completed | success | `2cd09e6` | [run](https://github.com/link-foundation/command-stream/actions/runs/27137676052) |\n| Deploy | completed | success | `e68c710` | [run](https://github.com/link-foundation/command-stream/actions/runs/20540466607) |\n| CI | completed | success | `e68c710` | [run](https://github.com/link-foundation/command-stream/actions/runs/20540466606) |\n\nUse all the best practices from CI/CD templates (check full file tree to compare for all GitHub workflow and CI/CD scripts file), if the same issue is found in template report issue also in templates:\n\n- https://github.com/link-foundation/js-ai-driven-development-pipeline-template\n- https://github.com/link-foundation/rust-ai-driven-development-pipeline-template\n\nWe should compare all files, so we don't have more CI/CD errors in the future and reuse all the best practices from these templates.\n\nFollow the CI/CD best practices collected in [https://github.com/link-assistant/hive-mind/blob/main/docs/CI-CD-BEST-PRACTICES.md](https://github.com/link-assistant/hive-mind/blob/main/docs/CI-CD-BEST-PRACTICES.md).\n\nPlease plan and execute everything in this single pull request, you have unlimited time and context, as context auto-compacts and you can continue indefinitely, until it is each and every requirement fully addressed, and everything is totally done.\n\n---\n\n
\nContext collected by /fix --ci-cd\n\n- **Repository:** [link-foundation/command-stream](https://github.com/link-foundation/command-stream)\n- **Default branch:** `main`\n- **Latest commit:** `4511c4d` ([commit](https://github.com/link-foundation/command-stream/commit/4511c4df6b358a44dc334dfd3b13916a441a946f)) β€” chore: release rust-v0.17.1 (Rust)\n- **CI/CD runs found:** 5 (1 not passing)\n\n**Detected languages**\n\n- **JavaScript** β€” 76.3%\n- **Rust** β€” 23.0%\n- **Shell** β€” 0.7%\n\n**Recommended CI/CD templates**\n\nApply the best practices from these templates, in priority order (most-used language first):\n\n1. **JavaScript / TypeScript** β€” [link-foundation/js-ai-driven-development-pipeline-template](https://github.com/link-foundation/js-ai-driven-development-pipeline-template) _(detected: JavaScript)_\n2. **Rust** β€” [link-foundation/rust-ai-driven-development-pipeline-template](https://github.com/link-foundation/rust-ai-driven-development-pipeline-template) _(detected: Rust)_\n\nOther detected languages without a dedicated template: Shell.\n\n
","comments":[],"createdAt":"2026-09-04T20:27:53Z","title":"Check for all false positives, false negatives, warnings and errors in CI/CD and fix them all"} diff --git a/dev/log/issues/199/pulls/200/api/pr-200.json b/dev/log/issues/199/pulls/200/api/pr-200.json new file mode 100644 index 0000000..caf97c2 --- /dev/null +++ b/dev/log/issues/199/pulls/200/api/pr-200.json @@ -0,0 +1 @@ +{"body":"## πŸ€– AI-Powered Solution Draft\n\nThis pull request is being automatically generated to solve issue #199.\n\n### πŸ“‹ Issue Reference\nFixes #199\n\n### 🚧 Status\n**Work in Progress** - The AI assistant is currently analyzing and implementing the solution draft.\n\n### πŸ“ Implementation Details\n_Details will be added as the solution draft is developed..._\n\n---\n*This PR was created automatically by the AI issue solver*","comments":[],"createdAt":"2026-09-04T20:28:37Z","headRefName":"issue-199-32c07917fc87","isDraft":true,"title":"[WIP] Check for all false positives, false negatives, warnings and errors in CI/CD and fix them all"} diff --git a/dev/log/issues/199/pulls/200/api/repo.json b/dev/log/issues/199/pulls/200/api/repo.json new file mode 100644 index 0000000..5a71810 --- /dev/null +++ b/dev/log/issues/199/pulls/200/api/repo.json @@ -0,0 +1 @@ +{"id":1036989446,"node_id":"R_kgDOPc80Bg","name":"command-stream","full_name":"link-foundation/command-stream","private":false,"owner":{"login":"link-foundation","id":176174013,"node_id":"O_kgDOCoAzvQ","avatar_url":"https://avatars.githubusercontent.com/u/176174013?v=4","gravatar_id":"","url":"https://api.github.com/users/link-foundation","html_url":"https://github.com/link-foundation","followers_url":"https://api.github.com/users/link-foundation/followers","following_url":"https://api.github.com/users/link-foundation/following{/other_user}","gists_url":"https://api.github.com/users/link-foundation/gists{/gist_id}","starred_url":"https://api.github.com/users/link-foundation/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/link-foundation/subscriptions","organizations_url":"https://api.github.com/users/link-foundation/orgs","repos_url":"https://api.github.com/users/link-foundation/repos","events_url":"https://api.github.com/users/link-foundation/events{/privacy}","received_events_url":"https://api.github.com/users/link-foundation/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/link-foundation/command-stream","description":"$treamable commands executor","fork":false,"url":"https://api.github.com/repos/link-foundation/command-stream","forks_url":"https://api.github.com/repos/link-foundation/command-stream/forks","keys_url":"https://api.github.com/repos/link-foundation/command-stream/keys{/key_id}","collaborators_url":"https://api.github.com/repos/link-foundation/command-stream/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/link-foundation/command-stream/teams","hooks_url":"https://api.github.com/repos/link-foundation/command-stream/hooks","issue_events_url":"https://api.github.com/repos/link-foundation/command-stream/issues/events{/number}","events_url":"https://api.github.com/repos/link-foundation/command-stream/events","assignees_url":"https://api.github.com/repos/link-foundation/command-stream/assignees{/user}","branches_url":"https://api.github.com/repos/link-foundation/command-stream/branches{/branch}","tags_url":"https://api.github.com/repos/link-foundation/command-stream/tags","blobs_url":"https://api.github.com/repos/link-foundation/command-stream/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/link-foundation/command-stream/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/link-foundation/command-stream/git/refs{/sha}","trees_url":"https://api.github.com/repos/link-foundation/command-stream/git/trees{/sha}","statuses_url":"https://api.github.com/repos/link-foundation/command-stream/statuses/{sha}","languages_url":"https://api.github.com/repos/link-foundation/command-stream/languages","stargazers_url":"https://api.github.com/repos/link-foundation/command-stream/stargazers","contributors_url":"https://api.github.com/repos/link-foundation/command-stream/contributors","subscribers_url":"https://api.github.com/repos/link-foundation/command-stream/subscribers","subscription_url":"https://api.github.com/repos/link-foundation/command-stream/subscription","commits_url":"https://api.github.com/repos/link-foundation/command-stream/commits{/sha}","git_commits_url":"https://api.github.com/repos/link-foundation/command-stream/git/commits{/sha}","comments_url":"https://api.github.com/repos/link-foundation/command-stream/comments{/number}","issue_comment_url":"https://api.github.com/repos/link-foundation/command-stream/issues/comments{/number}","contents_url":"https://api.github.com/repos/link-foundation/command-stream/contents/{+path}","compare_url":"https://api.github.com/repos/link-foundation/command-stream/compare/{base}...{head}","merges_url":"https://api.github.com/repos/link-foundation/command-stream/merges","archive_url":"https://api.github.com/repos/link-foundation/command-stream/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/link-foundation/command-stream/downloads","issues_url":"https://api.github.com/repos/link-foundation/command-stream/issues{/number}","pulls_url":"https://api.github.com/repos/link-foundation/command-stream/pulls{/number}","milestones_url":"https://api.github.com/repos/link-foundation/command-stream/milestones{/number}","notifications_url":"https://api.github.com/repos/link-foundation/command-stream/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/link-foundation/command-stream/labels{/name}","releases_url":"https://api.github.com/repos/link-foundation/command-stream/releases{/id}","deployments_url":"https://api.github.com/repos/link-foundation/command-stream/deployments","created_at":"2025-08-12T22:30:25Z","updated_at":"2026-09-04T20:10:41Z","pushed_at":"2026-09-04T20:28:29Z","git_url":"git://github.com/link-foundation/command-stream.git","ssh_url":"git@github.com:link-foundation/command-stream.git","clone_url":"https://github.com/link-foundation/command-stream.git","svn_url":"https://github.com/link-foundation/command-stream","homepage":null,"size":11814,"stargazers_count":4,"watchers_count":4,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":false,"has_wiki":true,"has_pages":false,"has_discussions":false,"forks_count":1,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":62,"license":{"key":"unlicense","name":"The Unlicense","spdx_id":"Unlicense","url":"https://api.github.com/licenses/unlicense","node_id":"MDc6TGljZW5zZTE1"},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"has_pull_requests":true,"pull_request_creation_policy":"all","topics":[],"visibility":"public","forks":1,"open_issues":62,"watchers":4,"default_branch":"main","permissions":{"admin":true,"maintain":true,"push":true,"triage":true,"pull":true},"temp_clone_token":"","allow_squash_merge":true,"allow_merge_commit":true,"allow_rebase_merge":true,"allow_auto_merge":false,"delete_branch_on_merge":false,"allow_update_branch":false,"use_squash_pr_title_as_default":false,"squash_merge_commit_message":"COMMIT_MESSAGES","squash_merge_commit_title":"COMMIT_OR_PR_TITLE","merge_commit_message":"PR_TITLE","merge_commit_title":"MERGE_MESSAGE","custom_properties":{},"organization":{"login":"link-foundation","id":176174013,"node_id":"O_kgDOCoAzvQ","avatar_url":"https://avatars.githubusercontent.com/u/176174013?v=4","gravatar_id":"","url":"https://api.github.com/users/link-foundation","html_url":"https://github.com/link-foundation","followers_url":"https://api.github.com/users/link-foundation/followers","following_url":"https://api.github.com/users/link-foundation/following{/other_user}","gists_url":"https://api.github.com/users/link-foundation/gists{/gist_id}","starred_url":"https://api.github.com/users/link-foundation/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/link-foundation/subscriptions","organizations_url":"https://api.github.com/users/link-foundation/orgs","repos_url":"https://api.github.com/users/link-foundation/repos","events_url":"https://api.github.com/users/link-foundation/events{/privacy}","received_events_url":"https://api.github.com/users/link-foundation/received_events","type":"Organization","user_view_type":"public","site_admin":false},"security_and_analysis":{"secret_scanning":{"status":"disabled"},"secret_scanning_push_protection":{"status":"disabled"},"dependabot_security_updates":{"status":"disabled"},"secret_scanning_non_provider_patterns":{"status":"disabled"},"secret_scanning_validity_checks":{"status":"disabled"}},"network_count":1,"subscribers_count":0} \ No newline at end of file diff --git a/dev/log/issues/199/pulls/200/api/rulesets.json b/dev/log/issues/199/pulls/200/api/rulesets.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/dev/log/issues/199/pulls/200/api/rulesets.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/dev/log/issues/199/pulls/200/api/run-33897699209.json b/dev/log/issues/199/pulls/200/api/run-33897699209.json new file mode 100644 index 0000000..5227110 --- /dev/null +++ b/dev/log/issues/199/pulls/200/api/run-33897699209.json @@ -0,0 +1 @@ +{"conclusion":"failure","createdAt":"2026-09-04T16:54:18Z","databaseId":33897699209,"event":"push","headBranch":"main","headSha":"7e2b7018494b9ad9129391829a7abd5e4d085228","jobs":[{"completedAt":"2026-09-04T16:54:40Z","conclusion":"success","databaseId":101104129837,"name":"Lint and format JavaScript","startedAt":"2026-09-04T16:54:21Z","status":"completed","steps":[{"completedAt":"2026-09-04T16:54:23Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T16:54:22Z","status":"completed"},{"completedAt":"2026-09-04T16:54:24Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T16:54:23Z","status":"completed"},{"completedAt":"2026-09-04T16:54:25Z","conclusion":"success","name":"Setup Bun","number":3,"startedAt":"2026-09-04T16:54:24Z","status":"completed"},{"completedAt":"2026-09-04T16:54:26Z","conclusion":"success","name":"Install dependencies","number":4,"startedAt":"2026-09-04T16:54:25Z","status":"completed"},{"completedAt":"2026-09-04T16:54:32Z","conclusion":"success","name":"Run ESLint","number":5,"startedAt":"2026-09-04T16:54:26Z","status":"completed"},{"completedAt":"2026-09-04T16:54:37Z","conclusion":"success","name":"Check formatting","number":6,"startedAt":"2026-09-04T16:54:32Z","status":"completed"},{"completedAt":"2026-09-04T16:54:37Z","conclusion":"success","name":"Check code duplication","number":7,"startedAt":"2026-09-04T16:54:37Z","status":"completed"},{"completedAt":"2026-09-04T16:54:37Z","conclusion":"success","name":"Post Setup Bun","number":13,"startedAt":"2026-09-04T16:54:37Z","status":"completed"},{"completedAt":"2026-09-04T16:54:38Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":14,"startedAt":"2026-09-04T16:54:37Z","status":"completed"},{"completedAt":"2026-09-04T16:54:38Z","conclusion":"success","name":"Complete job","number":15,"startedAt":"2026-09-04T16:54:38Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33897699209/job/101104129837"},{"completedAt":"2026-09-04T16:54:42Z","conclusion":"success","databaseId":101104130005,"name":"Test JavaScript (node on ubuntu-latest)","startedAt":"2026-09-04T16:54:21Z","status":"completed","steps":[{"completedAt":"2026-09-04T16:54:23Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T16:54:22Z","status":"completed"},{"completedAt":"2026-09-04T16:54:25Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T16:54:23Z","status":"completed"},{"completedAt":"2026-09-04T16:54:25Z","conclusion":"skipped","name":"Setup Bun","number":3,"startedAt":"2026-09-04T16:54:25Z","status":"completed"},{"completedAt":"2026-09-04T16:54:25Z","conclusion":"skipped","name":"Setup Node.js PTY host","number":4,"startedAt":"2026-09-04T16:54:25Z","status":"completed"},{"completedAt":"2026-09-04T16:54:33Z","conclusion":"success","name":"Install system dependencies (Ubuntu)","number":5,"startedAt":"2026-09-04T16:54:25Z","status":"completed"},{"completedAt":"2026-09-04T16:54:33Z","conclusion":"skipped","name":"Install system dependencies (macOS)","number":6,"startedAt":"2026-09-04T16:54:33Z","status":"completed"},{"completedAt":"2026-09-04T16:54:33Z","conclusion":"skipped","name":"Install system dependencies (Windows)","number":7,"startedAt":"2026-09-04T16:54:33Z","status":"completed"},{"completedAt":"2026-09-04T16:54:33Z","conclusion":"skipped","name":"Install dependencies (Bun)","number":8,"startedAt":"2026-09-04T16:54:33Z","status":"completed"},{"completedAt":"2026-09-04T16:54:33Z","conclusion":"skipped","name":"Run tests (Bun)","number":9,"startedAt":"2026-09-04T16:54:33Z","status":"completed"},{"completedAt":"2026-09-04T16:54:34Z","conclusion":"success","name":"Setup Node.js","number":10,"startedAt":"2026-09-04T16:54:33Z","status":"completed"},{"completedAt":"2026-09-04T16:54:39Z","conclusion":"success","name":"Install dependencies (Node)","number":11,"startedAt":"2026-09-04T16:54:34Z","status":"completed"},{"completedAt":"2026-09-04T16:54:40Z","conclusion":"success","name":"Test Node.js compatibility","number":12,"startedAt":"2026-09-04T16:54:39Z","status":"completed"},{"completedAt":"2026-09-04T16:54:40Z","conclusion":"success","name":"Post Setup Node.js","number":23,"startedAt":"2026-09-04T16:54:40Z","status":"completed"},{"completedAt":"2026-09-04T16:54:40Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":24,"startedAt":"2026-09-04T16:54:40Z","status":"completed"},{"completedAt":"2026-09-04T16:54:40Z","conclusion":"success","name":"Complete job","number":25,"startedAt":"2026-09-04T16:54:40Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33897699209/job/101104130005"},{"completedAt":"2026-09-04T16:55:27Z","conclusion":"success","databaseId":101104130053,"name":"Test JavaScript (bun on ubuntu-latest)","startedAt":"2026-09-04T16:54:21Z","status":"completed","steps":[{"completedAt":"2026-09-04T16:54:23Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T16:54:22Z","status":"completed"},{"completedAt":"2026-09-04T16:54:25Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T16:54:23Z","status":"completed"},{"completedAt":"2026-09-04T16:54:27Z","conclusion":"success","name":"Setup Bun","number":3,"startedAt":"2026-09-04T16:54:25Z","status":"completed"},{"completedAt":"2026-09-04T16:54:28Z","conclusion":"success","name":"Setup Node.js PTY host","number":4,"startedAt":"2026-09-04T16:54:27Z","status":"completed"},{"completedAt":"2026-09-04T16:54:35Z","conclusion":"success","name":"Install system dependencies (Ubuntu)","number":5,"startedAt":"2026-09-04T16:54:28Z","status":"completed"},{"completedAt":"2026-09-04T16:54:35Z","conclusion":"skipped","name":"Install system dependencies (macOS)","number":6,"startedAt":"2026-09-04T16:54:35Z","status":"completed"},{"completedAt":"2026-09-04T16:54:35Z","conclusion":"skipped","name":"Install system dependencies (Windows)","number":7,"startedAt":"2026-09-04T16:54:35Z","status":"completed"},{"completedAt":"2026-09-04T16:54:36Z","conclusion":"success","name":"Install dependencies (Bun)","number":8,"startedAt":"2026-09-04T16:54:35Z","status":"completed"},{"completedAt":"2026-09-04T16:55:24Z","conclusion":"success","name":"Run tests (Bun)","number":9,"startedAt":"2026-09-04T16:54:36Z","status":"completed"},{"completedAt":"2026-09-04T16:55:24Z","conclusion":"skipped","name":"Setup Node.js","number":10,"startedAt":"2026-09-04T16:55:24Z","status":"completed"},{"completedAt":"2026-09-04T16:55:24Z","conclusion":"skipped","name":"Install dependencies (Node)","number":11,"startedAt":"2026-09-04T16:55:24Z","status":"completed"},{"completedAt":"2026-09-04T16:55:24Z","conclusion":"skipped","name":"Test Node.js compatibility","number":12,"startedAt":"2026-09-04T16:55:24Z","status":"completed"},{"completedAt":"2026-09-04T16:55:24Z","conclusion":"success","name":"Post Setup Node.js PTY host","number":22,"startedAt":"2026-09-04T16:55:24Z","status":"completed"},{"completedAt":"2026-09-04T16:55:24Z","conclusion":"success","name":"Post Setup Bun","number":23,"startedAt":"2026-09-04T16:55:24Z","status":"completed"},{"completedAt":"2026-09-04T16:55:24Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":24,"startedAt":"2026-09-04T16:55:24Z","status":"completed"},{"completedAt":"2026-09-04T16:55:24Z","conclusion":"success","name":"Complete job","number":25,"startedAt":"2026-09-04T16:55:24Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33897699209/job/101104130053"},{"completedAt":"2026-09-04T16:54:38Z","conclusion":"success","databaseId":101104130103,"name":"Test JavaScript (node on ubuntu-latest)","startedAt":"2026-09-04T16:54:21Z","status":"completed","steps":[{"completedAt":"2026-09-04T16:54:23Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T16:54:22Z","status":"completed"},{"completedAt":"2026-09-04T16:54:24Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T16:54:23Z","status":"completed"},{"completedAt":"2026-09-04T16:54:24Z","conclusion":"skipped","name":"Setup Bun","number":3,"startedAt":"2026-09-04T16:54:24Z","status":"completed"},{"completedAt":"2026-09-04T16:54:24Z","conclusion":"skipped","name":"Setup Node.js PTY host","number":4,"startedAt":"2026-09-04T16:54:24Z","status":"completed"},{"completedAt":"2026-09-04T16:54:30Z","conclusion":"success","name":"Install system dependencies (Ubuntu)","number":5,"startedAt":"2026-09-04T16:54:24Z","status":"completed"},{"completedAt":"2026-09-04T16:54:30Z","conclusion":"skipped","name":"Install system dependencies (macOS)","number":6,"startedAt":"2026-09-04T16:54:30Z","status":"completed"},{"completedAt":"2026-09-04T16:54:30Z","conclusion":"skipped","name":"Install system dependencies (Windows)","number":7,"startedAt":"2026-09-04T16:54:30Z","status":"completed"},{"completedAt":"2026-09-04T16:54:30Z","conclusion":"skipped","name":"Install dependencies (Bun)","number":8,"startedAt":"2026-09-04T16:54:30Z","status":"completed"},{"completedAt":"2026-09-04T16:54:30Z","conclusion":"skipped","name":"Run tests (Bun)","number":9,"startedAt":"2026-09-04T16:54:30Z","status":"completed"},{"completedAt":"2026-09-04T16:54:31Z","conclusion":"success","name":"Setup Node.js","number":10,"startedAt":"2026-09-04T16:54:30Z","status":"completed"},{"completedAt":"2026-09-04T16:54:36Z","conclusion":"success","name":"Install dependencies (Node)","number":11,"startedAt":"2026-09-04T16:54:31Z","status":"completed"},{"completedAt":"2026-09-04T16:54:36Z","conclusion":"success","name":"Test Node.js compatibility","number":12,"startedAt":"2026-09-04T16:54:36Z","status":"completed"},{"completedAt":"2026-09-04T16:54:36Z","conclusion":"success","name":"Post Setup Node.js","number":23,"startedAt":"2026-09-04T16:54:36Z","status":"completed"},{"completedAt":"2026-09-04T16:54:36Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":24,"startedAt":"2026-09-04T16:54:36Z","status":"completed"},{"completedAt":"2026-09-04T16:54:36Z","conclusion":"success","name":"Complete job","number":25,"startedAt":"2026-09-04T16:54:36Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33897699209/job/101104130103"},{"completedAt":"2026-09-04T16:55:45Z","conclusion":"success","databaseId":101104130171,"name":"Test JavaScript (bun on windows-latest)","startedAt":"2026-09-04T16:54:23Z","status":"completed","steps":[{"completedAt":"2026-09-04T16:54:27Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T16:54:25Z","status":"completed"},{"completedAt":"2026-09-04T16:54:33Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T16:54:27Z","status":"completed"},{"completedAt":"2026-09-04T16:54:44Z","conclusion":"success","name":"Setup Bun","number":3,"startedAt":"2026-09-04T16:54:33Z","status":"completed"},{"completedAt":"2026-09-04T16:54:48Z","conclusion":"success","name":"Setup Node.js PTY host","number":4,"startedAt":"2026-09-04T16:54:44Z","status":"completed"},{"completedAt":"2026-09-04T16:54:48Z","conclusion":"skipped","name":"Install system dependencies (Ubuntu)","number":5,"startedAt":"2026-09-04T16:54:48Z","status":"completed"},{"completedAt":"2026-09-04T16:54:48Z","conclusion":"skipped","name":"Install system dependencies (macOS)","number":6,"startedAt":"2026-09-04T16:54:48Z","status":"completed"},{"completedAt":"2026-09-04T16:54:54Z","conclusion":"success","name":"Install system dependencies (Windows)","number":7,"startedAt":"2026-09-04T16:54:48Z","status":"completed"},{"completedAt":"2026-09-04T16:55:04Z","conclusion":"success","name":"Install dependencies (Bun)","number":8,"startedAt":"2026-09-04T16:54:54Z","status":"completed"},{"completedAt":"2026-09-04T16:55:41Z","conclusion":"success","name":"Run tests (Bun)","number":9,"startedAt":"2026-09-04T16:55:04Z","status":"completed"},{"completedAt":"2026-09-04T16:55:41Z","conclusion":"skipped","name":"Setup Node.js","number":10,"startedAt":"2026-09-04T16:55:41Z","status":"completed"},{"completedAt":"2026-09-04T16:55:41Z","conclusion":"skipped","name":"Install dependencies (Node)","number":11,"startedAt":"2026-09-04T16:55:41Z","status":"completed"},{"completedAt":"2026-09-04T16:55:41Z","conclusion":"skipped","name":"Test Node.js compatibility","number":12,"startedAt":"2026-09-04T16:55:41Z","status":"completed"},{"completedAt":"2026-09-04T16:55:41Z","conclusion":"success","name":"Post Setup Node.js PTY host","number":22,"startedAt":"2026-09-04T16:55:41Z","status":"completed"},{"completedAt":"2026-09-04T16:55:41Z","conclusion":"success","name":"Post Setup Bun","number":23,"startedAt":"2026-09-04T16:55:41Z","status":"completed"},{"completedAt":"2026-09-04T16:55:43Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":24,"startedAt":"2026-09-04T16:55:41Z","status":"completed"},{"completedAt":"2026-09-04T16:55:43Z","conclusion":"success","name":"Complete job","number":25,"startedAt":"2026-09-04T16:55:43Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33897699209/job/101104130171"},{"completedAt":"2026-09-04T16:55:55Z","conclusion":"success","databaseId":101104130184,"name":"Test JavaScript (bun on macos-latest)","startedAt":"2026-09-04T16:54:26Z","status":"completed","steps":[{"completedAt":"2026-09-04T16:54:27Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T16:54:26Z","status":"completed"},{"completedAt":"2026-09-04T16:54:30Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T16:54:27Z","status":"completed"},{"completedAt":"2026-09-04T16:54:31Z","conclusion":"success","name":"Setup Bun","number":3,"startedAt":"2026-09-04T16:54:30Z","status":"completed"},{"completedAt":"2026-09-04T16:54:32Z","conclusion":"success","name":"Setup Node.js PTY host","number":4,"startedAt":"2026-09-04T16:54:31Z","status":"completed"},{"completedAt":"2026-09-04T16:54:32Z","conclusion":"skipped","name":"Install system dependencies (Ubuntu)","number":5,"startedAt":"2026-09-04T16:54:32Z","status":"completed"},{"completedAt":"2026-09-04T16:54:34Z","conclusion":"success","name":"Install system dependencies (macOS)","number":6,"startedAt":"2026-09-04T16:54:32Z","status":"completed"},{"completedAt":"2026-09-04T16:54:34Z","conclusion":"skipped","name":"Install system dependencies (Windows)","number":7,"startedAt":"2026-09-04T16:54:34Z","status":"completed"},{"completedAt":"2026-09-04T16:54:36Z","conclusion":"success","name":"Install dependencies (Bun)","number":8,"startedAt":"2026-09-04T16:54:34Z","status":"completed"},{"completedAt":"2026-09-04T16:55:50Z","conclusion":"success","name":"Run tests (Bun)","number":9,"startedAt":"2026-09-04T16:54:36Z","status":"completed"},{"completedAt":"2026-09-04T16:55:50Z","conclusion":"skipped","name":"Setup Node.js","number":10,"startedAt":"2026-09-04T16:55:50Z","status":"completed"},{"completedAt":"2026-09-04T16:55:50Z","conclusion":"skipped","name":"Install dependencies (Node)","number":11,"startedAt":"2026-09-04T16:55:50Z","status":"completed"},{"completedAt":"2026-09-04T16:55:50Z","conclusion":"skipped","name":"Test Node.js compatibility","number":12,"startedAt":"2026-09-04T16:55:50Z","status":"completed"},{"completedAt":"2026-09-04T16:55:50Z","conclusion":"success","name":"Post Setup Node.js PTY host","number":22,"startedAt":"2026-09-04T16:55:50Z","status":"completed"},{"completedAt":"2026-09-04T16:55:51Z","conclusion":"success","name":"Post Setup Bun","number":23,"startedAt":"2026-09-04T16:55:50Z","status":"completed"},{"completedAt":"2026-09-04T16:55:51Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":24,"startedAt":"2026-09-04T16:55:51Z","status":"completed"},{"completedAt":"2026-09-04T16:55:53Z","conclusion":"success","name":"Complete job","number":25,"startedAt":"2026-09-04T16:55:51Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33897699209/job/101104130184"},{"completedAt":"2026-09-04T16:54:47Z","conclusion":"success","databaseId":101104130195,"name":"Test JavaScript (node on ubuntu-latest)","startedAt":"2026-09-04T16:54:22Z","status":"completed","steps":[{"completedAt":"2026-09-04T16:54:24Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T16:54:23Z","status":"completed"},{"completedAt":"2026-09-04T16:54:25Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T16:54:24Z","status":"completed"},{"completedAt":"2026-09-04T16:54:25Z","conclusion":"skipped","name":"Setup Bun","number":3,"startedAt":"2026-09-04T16:54:25Z","status":"completed"},{"completedAt":"2026-09-04T16:54:25Z","conclusion":"skipped","name":"Setup Node.js PTY host","number":4,"startedAt":"2026-09-04T16:54:25Z","status":"completed"},{"completedAt":"2026-09-04T16:54:31Z","conclusion":"success","name":"Install system dependencies (Ubuntu)","number":5,"startedAt":"2026-09-04T16:54:25Z","status":"completed"},{"completedAt":"2026-09-04T16:54:31Z","conclusion":"skipped","name":"Install system dependencies (macOS)","number":6,"startedAt":"2026-09-04T16:54:31Z","status":"completed"},{"completedAt":"2026-09-04T16:54:31Z","conclusion":"skipped","name":"Install system dependencies (Windows)","number":7,"startedAt":"2026-09-04T16:54:31Z","status":"completed"},{"completedAt":"2026-09-04T16:54:31Z","conclusion":"skipped","name":"Install dependencies (Bun)","number":8,"startedAt":"2026-09-04T16:54:31Z","status":"completed"},{"completedAt":"2026-09-04T16:54:31Z","conclusion":"skipped","name":"Run tests (Bun)","number":9,"startedAt":"2026-09-04T16:54:31Z","status":"completed"},{"completedAt":"2026-09-04T16:54:36Z","conclusion":"success","name":"Setup Node.js","number":10,"startedAt":"2026-09-04T16:54:31Z","status":"completed"},{"completedAt":"2026-09-04T16:54:42Z","conclusion":"success","name":"Install dependencies (Node)","number":11,"startedAt":"2026-09-04T16:54:36Z","status":"completed"},{"completedAt":"2026-09-04T16:54:43Z","conclusion":"success","name":"Test Node.js compatibility","number":12,"startedAt":"2026-09-04T16:54:42Z","status":"completed"},{"completedAt":"2026-09-04T16:54:43Z","conclusion":"success","name":"Post Setup Node.js","number":23,"startedAt":"2026-09-04T16:54:43Z","status":"completed"},{"completedAt":"2026-09-04T16:54:44Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":24,"startedAt":"2026-09-04T16:54:43Z","status":"completed"},{"completedAt":"2026-09-04T16:54:44Z","conclusion":"success","name":"Complete job","number":25,"startedAt":"2026-09-04T16:54:44Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33897699209/job/101104130195"},{"completedAt":"2026-09-04T16:54:19Z","conclusion":"skipped","databaseId":101104130711,"name":"Create JavaScript changeset PR","startedAt":"2026-09-04T16:54:19Z","status":"completed","steps":[],"url":"https://github.com/link-foundation/command-stream/actions/runs/33897699209/job/101104130711"},{"completedAt":"2026-09-04T16:54:19Z","conclusion":"skipped","databaseId":101104156006,"name":"Instant JavaScript release","startedAt":"2026-09-04T16:54:24Z","status":"completed","steps":[],"url":"https://github.com/link-foundation/command-stream/actions/runs/33897699209/job/101104156006"},{"completedAt":"2026-09-04T16:54:19Z","conclusion":"skipped","databaseId":101104160882,"name":"Check for JavaScript changesets","startedAt":"2026-09-04T16:54:25Z","status":"completed","steps":[],"url":"https://github.com/link-foundation/command-stream/actions/runs/33897699209/job/101104160882"},{"completedAt":"2026-09-04T16:57:00Z","conclusion":"failure","databaseId":101104595745,"name":"Release JavaScript package","startedAt":"2026-09-04T16:55:57Z","status":"completed","steps":[{"completedAt":"2026-09-04T16:55:59Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T16:55:58Z","status":"completed"},{"completedAt":"2026-09-04T16:56:01Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T16:55:59Z","status":"completed"},{"completedAt":"2026-09-04T16:56:01Z","conclusion":"success","name":"Setup Node.js","number":3,"startedAt":"2026-09-04T16:56:01Z","status":"completed"},{"completedAt":"2026-09-04T16:56:03Z","conclusion":"success","name":"Setup Bun","number":4,"startedAt":"2026-09-04T16:56:01Z","status":"completed"},{"completedAt":"2026-09-04T16:56:04Z","conclusion":"success","name":"Install dependencies","number":5,"startedAt":"2026-09-04T16:56:03Z","status":"completed"},{"completedAt":"2026-09-04T16:56:09Z","conclusion":"success","name":"Update npm for OIDC trusted publishing","number":6,"startedAt":"2026-09-04T16:56:04Z","status":"completed"},{"completedAt":"2026-09-04T16:56:09Z","conclusion":"success","name":"Check for changesets","number":7,"startedAt":"2026-09-04T16:56:09Z","status":"completed"},{"completedAt":"2026-09-04T16:56:10Z","conclusion":"success","name":"Check if release is needed","number":8,"startedAt":"2026-09-04T16:56:09Z","status":"completed"},{"completedAt":"2026-09-04T16:56:10Z","conclusion":"skipped","name":"Merge multiple changesets","number":9,"startedAt":"2026-09-04T16:56:10Z","status":"completed"},{"completedAt":"2026-09-04T16:56:15Z","conclusion":"success","name":"Version package and commit to main","number":10,"startedAt":"2026-09-04T16:56:10Z","status":"completed"},{"completedAt":"2026-09-04T16:56:58Z","conclusion":"failure","name":"Publish to npm","number":11,"startedAt":"2026-09-04T16:56:15Z","status":"completed"},{"completedAt":"2026-09-04T16:56:58Z","conclusion":"skipped","name":"Create JavaScript GitHub Release","number":12,"startedAt":"2026-09-04T16:56:58Z","status":"completed"},{"completedAt":"2026-09-04T16:56:58Z","conclusion":"skipped","name":"Format JavaScript GitHub release notes","number":13,"startedAt":"2026-09-04T16:56:58Z","status":"completed"},{"completedAt":"2026-09-04T16:56:58Z","conclusion":"skipped","name":"Verify npm availability","number":14,"startedAt":"2026-09-04T16:56:58Z","status":"completed"},{"completedAt":"2026-09-04T16:56:58Z","conclusion":"skipped","name":"Post Setup Bun","number":26,"startedAt":"2026-09-04T16:56:58Z","status":"completed"},{"completedAt":"2026-09-04T16:56:58Z","conclusion":"skipped","name":"Post Setup Node.js","number":27,"startedAt":"2026-09-04T16:56:58Z","status":"completed"},{"completedAt":"2026-09-04T16:56:58Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":28,"startedAt":"2026-09-04T16:56:58Z","status":"completed"},{"completedAt":"2026-09-04T16:56:58Z","conclusion":"success","name":"Complete job","number":29,"startedAt":"2026-09-04T16:56:58Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33897699209/job/101104595745"}],"workflowName":"JavaScript checks and release"} diff --git a/dev/log/issues/199/pulls/200/api/run-33910180248.json b/dev/log/issues/199/pulls/200/api/run-33910180248.json new file mode 100644 index 0000000..cb5e4da --- /dev/null +++ b/dev/log/issues/199/pulls/200/api/run-33910180248.json @@ -0,0 +1 @@ +{"conclusion":"failure","createdAt":"2026-09-04T19:15:05Z","databaseId":33910180248,"event":"pull_request","headBranch":"issue-197-b748bb92cd2d","headSha":"e6a3eef7a59135824f249871756fae5c9aac872e","jobs":[{"completedAt":"2026-09-04T19:15:18Z","conclusion":"success","databaseId":101144503760,"name":"Check for JavaScript changesets","startedAt":"2026-09-04T19:15:08Z","status":"completed","steps":[{"completedAt":"2026-09-04T19:15:10Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T19:15:09Z","status":"completed"},{"completedAt":"2026-09-04T19:15:12Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T19:15:10Z","status":"completed"},{"completedAt":"2026-09-04T19:15:13Z","conclusion":"success","name":"Setup Bun","number":3,"startedAt":"2026-09-04T19:15:12Z","status":"completed"},{"completedAt":"2026-09-04T19:15:14Z","conclusion":"success","name":"Install dependencies","number":4,"startedAt":"2026-09-04T19:15:13Z","status":"completed"},{"completedAt":"2026-09-04T19:15:14Z","conclusion":"success","name":"Check for changesets","number":5,"startedAt":"2026-09-04T19:15:14Z","status":"completed"},{"completedAt":"2026-09-04T19:15:14Z","conclusion":"success","name":"Post Setup Bun","number":9,"startedAt":"2026-09-04T19:15:14Z","status":"completed"},{"completedAt":"2026-09-04T19:15:15Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":10,"startedAt":"2026-09-04T19:15:14Z","status":"completed"},{"completedAt":"2026-09-04T19:15:15Z","conclusion":"success","name":"Complete job","number":11,"startedAt":"2026-09-04T19:15:15Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33910180248/job/101144503760"},{"completedAt":"2026-09-04T19:15:06Z","conclusion":"skipped","databaseId":101144505393,"name":"Create JavaScript changeset PR","startedAt":"2026-09-04T19:15:06Z","status":"completed","steps":[],"url":"https://github.com/link-foundation/command-stream/actions/runs/33910180248/job/101144505393"},{"completedAt":"2026-09-04T19:15:06Z","conclusion":"skipped","databaseId":101144505539,"name":"Instant JavaScript release","startedAt":"2026-09-04T19:15:06Z","status":"completed","steps":[],"url":"https://github.com/link-foundation/command-stream/actions/runs/33910180248/job/101144505539"},{"completedAt":"2026-09-04T19:15:40Z","conclusion":"success","databaseId":101144565888,"name":"Lint and format JavaScript","startedAt":"2026-09-04T19:15:20Z","status":"completed","steps":[{"completedAt":"2026-09-04T19:15:22Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T19:15:21Z","status":"completed"},{"completedAt":"2026-09-04T19:15:23Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T19:15:22Z","status":"completed"},{"completedAt":"2026-09-04T19:15:26Z","conclusion":"success","name":"Setup Bun","number":3,"startedAt":"2026-09-04T19:15:23Z","status":"completed"},{"completedAt":"2026-09-04T19:15:27Z","conclusion":"success","name":"Install dependencies","number":4,"startedAt":"2026-09-04T19:15:26Z","status":"completed"},{"completedAt":"2026-09-04T19:15:33Z","conclusion":"success","name":"Run ESLint","number":5,"startedAt":"2026-09-04T19:15:27Z","status":"completed"},{"completedAt":"2026-09-04T19:15:37Z","conclusion":"success","name":"Check formatting","number":6,"startedAt":"2026-09-04T19:15:33Z","status":"completed"},{"completedAt":"2026-09-04T19:15:38Z","conclusion":"success","name":"Check code duplication","number":7,"startedAt":"2026-09-04T19:15:37Z","status":"completed"},{"completedAt":"2026-09-04T19:15:38Z","conclusion":"success","name":"Post Setup Bun","number":13,"startedAt":"2026-09-04T19:15:38Z","status":"completed"},{"completedAt":"2026-09-04T19:15:38Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":14,"startedAt":"2026-09-04T19:15:38Z","status":"completed"},{"completedAt":"2026-09-04T19:15:38Z","conclusion":"success","name":"Complete job","number":15,"startedAt":"2026-09-04T19:15:38Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33910180248/job/101144565888"},{"completedAt":"2026-09-04T19:15:40Z","conclusion":"success","databaseId":101144565938,"name":"Test JavaScript (node on ubuntu-latest)","startedAt":"2026-09-04T19:15:20Z","status":"completed","steps":[{"completedAt":"2026-09-04T19:15:23Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T19:15:21Z","status":"completed"},{"completedAt":"2026-09-04T19:15:24Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T19:15:23Z","status":"completed"},{"completedAt":"2026-09-04T19:15:24Z","conclusion":"skipped","name":"Setup Bun","number":3,"startedAt":"2026-09-04T19:15:24Z","status":"completed"},{"completedAt":"2026-09-04T19:15:24Z","conclusion":"skipped","name":"Setup Node.js PTY host","number":4,"startedAt":"2026-09-04T19:15:24Z","status":"completed"},{"completedAt":"2026-09-04T19:15:30Z","conclusion":"success","name":"Install system dependencies (Ubuntu)","number":5,"startedAt":"2026-09-04T19:15:24Z","status":"completed"},{"completedAt":"2026-09-04T19:15:30Z","conclusion":"skipped","name":"Install system dependencies (macOS)","number":6,"startedAt":"2026-09-04T19:15:30Z","status":"completed"},{"completedAt":"2026-09-04T19:15:30Z","conclusion":"skipped","name":"Install system dependencies (Windows)","number":7,"startedAt":"2026-09-04T19:15:30Z","status":"completed"},{"completedAt":"2026-09-04T19:15:30Z","conclusion":"skipped","name":"Install dependencies (Bun)","number":8,"startedAt":"2026-09-04T19:15:30Z","status":"completed"},{"completedAt":"2026-09-04T19:15:31Z","conclusion":"skipped","name":"Run tests (Bun)","number":9,"startedAt":"2026-09-04T19:15:30Z","status":"completed"},{"completedAt":"2026-09-04T19:15:31Z","conclusion":"success","name":"Setup Node.js","number":10,"startedAt":"2026-09-04T19:15:31Z","status":"completed"},{"completedAt":"2026-09-04T19:15:37Z","conclusion":"success","name":"Install dependencies (Node)","number":11,"startedAt":"2026-09-04T19:15:31Z","status":"completed"},{"completedAt":"2026-09-04T19:15:37Z","conclusion":"success","name":"Test Node.js compatibility","number":12,"startedAt":"2026-09-04T19:15:37Z","status":"completed"},{"completedAt":"2026-09-04T19:15:37Z","conclusion":"success","name":"Post Setup Node.js","number":23,"startedAt":"2026-09-04T19:15:37Z","status":"completed"},{"completedAt":"2026-09-04T19:15:37Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":24,"startedAt":"2026-09-04T19:15:37Z","status":"completed"},{"completedAt":"2026-09-04T19:15:37Z","conclusion":"success","name":"Complete job","number":25,"startedAt":"2026-09-04T19:15:37Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33910180248/job/101144565938"},{"completedAt":"2026-09-04T19:16:54Z","conclusion":"failure","databaseId":101144565940,"name":"Test JavaScript (bun on macos-latest)","startedAt":"2026-09-04T19:15:21Z","status":"completed","steps":[{"completedAt":"2026-09-04T19:15:23Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T19:15:22Z","status":"completed"},{"completedAt":"2026-09-04T19:15:25Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T19:15:23Z","status":"completed"},{"completedAt":"2026-09-04T19:15:27Z","conclusion":"success","name":"Setup Bun","number":3,"startedAt":"2026-09-04T19:15:25Z","status":"completed"},{"completedAt":"2026-09-04T19:15:28Z","conclusion":"success","name":"Setup Node.js PTY host","number":4,"startedAt":"2026-09-04T19:15:27Z","status":"completed"},{"completedAt":"2026-09-04T19:15:28Z","conclusion":"skipped","name":"Install system dependencies (Ubuntu)","number":5,"startedAt":"2026-09-04T19:15:28Z","status":"completed"},{"completedAt":"2026-09-04T19:15:30Z","conclusion":"success","name":"Install system dependencies (macOS)","number":6,"startedAt":"2026-09-04T19:15:28Z","status":"completed"},{"completedAt":"2026-09-04T19:15:30Z","conclusion":"skipped","name":"Install system dependencies (Windows)","number":7,"startedAt":"2026-09-04T19:15:30Z","status":"completed"},{"completedAt":"2026-09-04T19:15:32Z","conclusion":"success","name":"Install dependencies (Bun)","number":8,"startedAt":"2026-09-04T19:15:30Z","status":"completed"},{"completedAt":"2026-09-04T19:16:50Z","conclusion":"failure","name":"Run tests (Bun)","number":9,"startedAt":"2026-09-04T19:15:32Z","status":"completed"},{"completedAt":"2026-09-04T19:16:50Z","conclusion":"skipped","name":"Setup Node.js","number":10,"startedAt":"2026-09-04T19:16:50Z","status":"completed"},{"completedAt":"2026-09-04T19:16:50Z","conclusion":"skipped","name":"Install dependencies (Node)","number":11,"startedAt":"2026-09-04T19:16:50Z","status":"completed"},{"completedAt":"2026-09-04T19:16:50Z","conclusion":"skipped","name":"Test Node.js compatibility","number":12,"startedAt":"2026-09-04T19:16:50Z","status":"completed"},{"completedAt":"2026-09-04T19:16:50Z","conclusion":"skipped","name":"Post Setup Node.js PTY host","number":22,"startedAt":"2026-09-04T19:16:50Z","status":"completed"},{"completedAt":"2026-09-04T19:16:50Z","conclusion":"skipped","name":"Post Setup Bun","number":23,"startedAt":"2026-09-04T19:16:50Z","status":"completed"},{"completedAt":"2026-09-04T19:16:51Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":24,"startedAt":"2026-09-04T19:16:50Z","status":"completed"},{"completedAt":"2026-09-04T19:16:52Z","conclusion":"success","name":"Complete job","number":25,"startedAt":"2026-09-04T19:16:51Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33910180248/job/101144565940"},{"completedAt":"2026-09-04T19:15:45Z","conclusion":"success","databaseId":101144565968,"name":"Test JavaScript (node on ubuntu-latest)","startedAt":"2026-09-04T19:15:21Z","status":"completed","steps":[{"completedAt":"2026-09-04T19:15:24Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T19:15:22Z","status":"completed"},{"completedAt":"2026-09-04T19:15:25Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T19:15:24Z","status":"completed"},{"completedAt":"2026-09-04T19:15:25Z","conclusion":"skipped","name":"Setup Bun","number":3,"startedAt":"2026-09-04T19:15:25Z","status":"completed"},{"completedAt":"2026-09-04T19:15:25Z","conclusion":"skipped","name":"Setup Node.js PTY host","number":4,"startedAt":"2026-09-04T19:15:25Z","status":"completed"},{"completedAt":"2026-09-04T19:15:31Z","conclusion":"success","name":"Install system dependencies (Ubuntu)","number":5,"startedAt":"2026-09-04T19:15:25Z","status":"completed"},{"completedAt":"2026-09-04T19:15:31Z","conclusion":"skipped","name":"Install system dependencies (macOS)","number":6,"startedAt":"2026-09-04T19:15:31Z","status":"completed"},{"completedAt":"2026-09-04T19:15:31Z","conclusion":"skipped","name":"Install system dependencies (Windows)","number":7,"startedAt":"2026-09-04T19:15:31Z","status":"completed"},{"completedAt":"2026-09-04T19:15:31Z","conclusion":"skipped","name":"Install dependencies (Bun)","number":8,"startedAt":"2026-09-04T19:15:31Z","status":"completed"},{"completedAt":"2026-09-04T19:15:31Z","conclusion":"skipped","name":"Run tests (Bun)","number":9,"startedAt":"2026-09-04T19:15:31Z","status":"completed"},{"completedAt":"2026-09-04T19:15:36Z","conclusion":"success","name":"Setup Node.js","number":10,"startedAt":"2026-09-04T19:15:31Z","status":"completed"},{"completedAt":"2026-09-04T19:15:41Z","conclusion":"success","name":"Install dependencies (Node)","number":11,"startedAt":"2026-09-04T19:15:36Z","status":"completed"},{"completedAt":"2026-09-04T19:15:42Z","conclusion":"success","name":"Test Node.js compatibility","number":12,"startedAt":"2026-09-04T19:15:41Z","status":"completed"},{"completedAt":"2026-09-04T19:15:42Z","conclusion":"success","name":"Post Setup Node.js","number":23,"startedAt":"2026-09-04T19:15:42Z","status":"completed"},{"completedAt":"2026-09-04T19:15:42Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":24,"startedAt":"2026-09-04T19:15:42Z","status":"completed"},{"completedAt":"2026-09-04T19:15:42Z","conclusion":"success","name":"Complete job","number":25,"startedAt":"2026-09-04T19:15:42Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33910180248/job/101144565968"},{"completedAt":"2026-09-04T19:16:19Z","conclusion":"failure","databaseId":101144566024,"name":"Test JavaScript (bun on ubuntu-latest)","startedAt":"2026-09-04T19:15:20Z","status":"completed","steps":[{"completedAt":"2026-09-04T19:15:22Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T19:15:21Z","status":"completed"},{"completedAt":"2026-09-04T19:15:23Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T19:15:22Z","status":"completed"},{"completedAt":"2026-09-04T19:15:24Z","conclusion":"success","name":"Setup Bun","number":3,"startedAt":"2026-09-04T19:15:23Z","status":"completed"},{"completedAt":"2026-09-04T19:15:25Z","conclusion":"success","name":"Setup Node.js PTY host","number":4,"startedAt":"2026-09-04T19:15:24Z","status":"completed"},{"completedAt":"2026-09-04T19:15:31Z","conclusion":"success","name":"Install system dependencies (Ubuntu)","number":5,"startedAt":"2026-09-04T19:15:25Z","status":"completed"},{"completedAt":"2026-09-04T19:15:31Z","conclusion":"skipped","name":"Install system dependencies (macOS)","number":6,"startedAt":"2026-09-04T19:15:31Z","status":"completed"},{"completedAt":"2026-09-04T19:15:31Z","conclusion":"skipped","name":"Install system dependencies (Windows)","number":7,"startedAt":"2026-09-04T19:15:31Z","status":"completed"},{"completedAt":"2026-09-04T19:15:31Z","conclusion":"success","name":"Install dependencies (Bun)","number":8,"startedAt":"2026-09-04T19:15:31Z","status":"completed"},{"completedAt":"2026-09-04T19:16:18Z","conclusion":"failure","name":"Run tests (Bun)","number":9,"startedAt":"2026-09-04T19:15:31Z","status":"completed"},{"completedAt":"2026-09-04T19:16:18Z","conclusion":"skipped","name":"Setup Node.js","number":10,"startedAt":"2026-09-04T19:16:18Z","status":"completed"},{"completedAt":"2026-09-04T19:16:18Z","conclusion":"skipped","name":"Install dependencies (Node)","number":11,"startedAt":"2026-09-04T19:16:18Z","status":"completed"},{"completedAt":"2026-09-04T19:16:18Z","conclusion":"skipped","name":"Test Node.js compatibility","number":12,"startedAt":"2026-09-04T19:16:18Z","status":"completed"},{"completedAt":"2026-09-04T19:16:18Z","conclusion":"skipped","name":"Post Setup Node.js PTY host","number":22,"startedAt":"2026-09-04T19:16:18Z","status":"completed"},{"completedAt":"2026-09-04T19:16:18Z","conclusion":"skipped","name":"Post Setup Bun","number":23,"startedAt":"2026-09-04T19:16:18Z","status":"completed"},{"completedAt":"2026-09-04T19:16:18Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":24,"startedAt":"2026-09-04T19:16:18Z","status":"completed"},{"completedAt":"2026-09-04T19:16:18Z","conclusion":"success","name":"Complete job","number":25,"startedAt":"2026-09-04T19:16:18Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33910180248/job/101144566024"},{"completedAt":"2026-09-04T19:15:37Z","conclusion":"success","databaseId":101144566053,"name":"Test JavaScript (node on ubuntu-latest)","startedAt":"2026-09-04T19:15:20Z","status":"completed","steps":[{"completedAt":"2026-09-04T19:15:22Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T19:15:21Z","status":"completed"},{"completedAt":"2026-09-04T19:15:23Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T19:15:22Z","status":"completed"},{"completedAt":"2026-09-04T19:15:23Z","conclusion":"skipped","name":"Setup Bun","number":3,"startedAt":"2026-09-04T19:15:23Z","status":"completed"},{"completedAt":"2026-09-04T19:15:23Z","conclusion":"skipped","name":"Setup Node.js PTY host","number":4,"startedAt":"2026-09-04T19:15:23Z","status":"completed"},{"completedAt":"2026-09-04T19:15:29Z","conclusion":"success","name":"Install system dependencies (Ubuntu)","number":5,"startedAt":"2026-09-04T19:15:23Z","status":"completed"},{"completedAt":"2026-09-04T19:15:29Z","conclusion":"skipped","name":"Install system dependencies (macOS)","number":6,"startedAt":"2026-09-04T19:15:29Z","status":"completed"},{"completedAt":"2026-09-04T19:15:29Z","conclusion":"skipped","name":"Install system dependencies (Windows)","number":7,"startedAt":"2026-09-04T19:15:29Z","status":"completed"},{"completedAt":"2026-09-04T19:15:29Z","conclusion":"skipped","name":"Install dependencies (Bun)","number":8,"startedAt":"2026-09-04T19:15:29Z","status":"completed"},{"completedAt":"2026-09-04T19:15:29Z","conclusion":"skipped","name":"Run tests (Bun)","number":9,"startedAt":"2026-09-04T19:15:29Z","status":"completed"},{"completedAt":"2026-09-04T19:15:29Z","conclusion":"success","name":"Setup Node.js","number":10,"startedAt":"2026-09-04T19:15:29Z","status":"completed"},{"completedAt":"2026-09-04T19:15:35Z","conclusion":"success","name":"Install dependencies (Node)","number":11,"startedAt":"2026-09-04T19:15:29Z","status":"completed"},{"completedAt":"2026-09-04T19:15:35Z","conclusion":"success","name":"Test Node.js compatibility","number":12,"startedAt":"2026-09-04T19:15:35Z","status":"completed"},{"completedAt":"2026-09-04T19:15:35Z","conclusion":"success","name":"Post Setup Node.js","number":23,"startedAt":"2026-09-04T19:15:35Z","status":"completed"},{"completedAt":"2026-09-04T19:15:35Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":24,"startedAt":"2026-09-04T19:15:35Z","status":"completed"},{"completedAt":"2026-09-04T19:15:35Z","conclusion":"success","name":"Complete job","number":25,"startedAt":"2026-09-04T19:15:35Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33910180248/job/101144566053"},{"completedAt":"2026-09-04T19:17:26Z","conclusion":"failure","databaseId":101144566072,"name":"Test JavaScript (bun on windows-latest)","startedAt":"2026-09-04T19:15:21Z","status":"completed","steps":[{"completedAt":"2026-09-04T19:15:24Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T19:15:22Z","status":"completed"},{"completedAt":"2026-09-04T19:15:35Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T19:15:24Z","status":"completed"},{"completedAt":"2026-09-04T19:15:38Z","conclusion":"success","name":"Setup Bun","number":3,"startedAt":"2026-09-04T19:15:35Z","status":"completed"},{"completedAt":"2026-09-04T19:15:54Z","conclusion":"success","name":"Setup Node.js PTY host","number":4,"startedAt":"2026-09-04T19:15:38Z","status":"completed"},{"completedAt":"2026-09-04T19:15:54Z","conclusion":"skipped","name":"Install system dependencies (Ubuntu)","number":5,"startedAt":"2026-09-04T19:15:54Z","status":"completed"},{"completedAt":"2026-09-04T19:15:54Z","conclusion":"skipped","name":"Install system dependencies (macOS)","number":6,"startedAt":"2026-09-04T19:15:54Z","status":"completed"},{"completedAt":"2026-09-04T19:16:06Z","conclusion":"success","name":"Install system dependencies (Windows)","number":7,"startedAt":"2026-09-04T19:15:54Z","status":"completed"},{"completedAt":"2026-09-04T19:16:17Z","conclusion":"success","name":"Install dependencies (Bun)","number":8,"startedAt":"2026-09-04T19:16:06Z","status":"completed"},{"completedAt":"2026-09-04T19:17:21Z","conclusion":"failure","name":"Run tests (Bun)","number":9,"startedAt":"2026-09-04T19:16:17Z","status":"completed"},{"completedAt":"2026-09-04T19:17:21Z","conclusion":"skipped","name":"Setup Node.js","number":10,"startedAt":"2026-09-04T19:17:21Z","status":"completed"},{"completedAt":"2026-09-04T19:17:21Z","conclusion":"skipped","name":"Install dependencies (Node)","number":11,"startedAt":"2026-09-04T19:17:21Z","status":"completed"},{"completedAt":"2026-09-04T19:17:21Z","conclusion":"skipped","name":"Test Node.js compatibility","number":12,"startedAt":"2026-09-04T19:17:21Z","status":"completed"},{"completedAt":"2026-09-04T19:17:21Z","conclusion":"skipped","name":"Post Setup Node.js PTY host","number":22,"startedAt":"2026-09-04T19:17:21Z","status":"completed"},{"completedAt":"2026-09-04T19:17:21Z","conclusion":"skipped","name":"Post Setup Bun","number":23,"startedAt":"2026-09-04T19:17:21Z","status":"completed"},{"completedAt":"2026-09-04T19:17:24Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":24,"startedAt":"2026-09-04T19:17:21Z","status":"completed"},{"completedAt":"2026-09-04T19:17:24Z","conclusion":"success","name":"Complete job","number":25,"startedAt":"2026-09-04T19:17:24Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33910180248/job/101144566072"},{"completedAt":"2026-09-04T19:17:26Z","conclusion":"skipped","databaseId":101145176653,"name":"Release JavaScript package","startedAt":"2026-09-04T19:17:27Z","status":"completed","steps":[],"url":"https://github.com/link-foundation/command-stream/actions/runs/33910180248/job/101145176653"}],"workflowName":"JavaScript checks and release"} diff --git a/dev/log/issues/199/pulls/200/api/run-33910180769.json b/dev/log/issues/199/pulls/200/api/run-33910180769.json new file mode 100644 index 0000000..8131e81 --- /dev/null +++ b/dev/log/issues/199/pulls/200/api/run-33910180769.json @@ -0,0 +1 @@ +{"conclusion":"failure","createdAt":"2026-09-04T19:15:06Z","databaseId":33910180769,"event":"pull_request","headBranch":"issue-197-b748bb92cd2d","headSha":"e6a3eef7a59135824f249871756fae5c9aac872e","jobs":[{"completedAt":"2026-09-04T19:15:58Z","conclusion":"success","databaseId":101144506278,"name":"Rust changelog fragment check","startedAt":"2026-09-04T19:15:09Z","status":"completed","steps":[{"completedAt":"2026-09-04T19:15:10Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T19:15:10Z","status":"completed"},{"completedAt":"2026-09-04T19:15:12Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T19:15:10Z","status":"completed"},{"completedAt":"2026-09-04T19:15:21Z","conclusion":"success","name":"Setup Rust","number":3,"startedAt":"2026-09-04T19:15:12Z","status":"completed"},{"completedAt":"2026-09-04T19:15:50Z","conclusion":"success","name":"Install rust-script","number":4,"startedAt":"2026-09-04T19:15:21Z","status":"completed"},{"completedAt":"2026-09-04T19:15:56Z","conclusion":"success","name":"Check for changelog fragments","number":5,"startedAt":"2026-09-04T19:15:50Z","status":"completed"},{"completedAt":"2026-09-04T19:15:56Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":10,"startedAt":"2026-09-04T19:15:56Z","status":"completed"},{"completedAt":"2026-09-04T19:15:56Z","conclusion":"success","name":"Complete job","number":11,"startedAt":"2026-09-04T19:15:56Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33910180769/job/101144506278"},{"completedAt":"2026-09-04T19:15:07Z","conclusion":"skipped","databaseId":101144509597,"name":"Create Rust changelog PR","startedAt":"2026-09-04T19:15:07Z","status":"completed","steps":[],"url":"https://github.com/link-foundation/command-stream/actions/runs/33910180769/job/101144509597"},{"completedAt":"2026-09-04T19:15:07Z","conclusion":"skipped","databaseId":101144509650,"name":"Instant Rust release","startedAt":"2026-09-04T19:15:07Z","status":"completed","steps":[],"url":"https://github.com/link-foundation/command-stream/actions/runs/33910180769/job/101144509650"},{"completedAt":"2026-09-04T19:16:33Z","conclusion":"success","databaseId":101144761375,"name":"Lint and format Rust","startedAt":"2026-09-04T19:16:01Z","status":"completed","steps":[{"completedAt":"2026-09-04T19:16:03Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T19:16:02Z","status":"completed"},{"completedAt":"2026-09-04T19:16:04Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T19:16:03Z","status":"completed"},{"completedAt":"2026-09-04T19:16:16Z","conclusion":"success","name":"Setup Rust","number":3,"startedAt":"2026-09-04T19:16:04Z","status":"completed"},{"completedAt":"2026-09-04T19:16:19Z","conclusion":"success","name":"Cache cargo registry","number":4,"startedAt":"2026-09-04T19:16:16Z","status":"completed"},{"completedAt":"2026-09-04T19:16:19Z","conclusion":"success","name":"Check formatting","number":5,"startedAt":"2026-09-04T19:16:19Z","status":"completed"},{"completedAt":"2026-09-04T19:16:27Z","conclusion":"success","name":"Run Clippy","number":6,"startedAt":"2026-09-04T19:16:19Z","status":"completed"},{"completedAt":"2026-09-04T19:16:31Z","conclusion":"success","name":"Post Cache cargo registry","number":11,"startedAt":"2026-09-04T19:16:27Z","status":"completed"},{"completedAt":"2026-09-04T19:16:31Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":12,"startedAt":"2026-09-04T19:16:31Z","status":"completed"},{"completedAt":"2026-09-04T19:16:31Z","conclusion":"success","name":"Complete job","number":13,"startedAt":"2026-09-04T19:16:31Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33910180769/job/101144761375"},{"completedAt":"2026-09-04T19:17:05Z","conclusion":"success","databaseId":101144761406,"name":"Test Rust release scripts","startedAt":"2026-09-04T19:16:00Z","status":"completed","steps":[{"completedAt":"2026-09-04T19:16:02Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T19:16:01Z","status":"completed"},{"completedAt":"2026-09-04T19:16:03Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T19:16:02Z","status":"completed"},{"completedAt":"2026-09-04T19:16:13Z","conclusion":"success","name":"Setup Rust","number":3,"startedAt":"2026-09-04T19:16:03Z","status":"completed"},{"completedAt":"2026-09-04T19:16:14Z","conclusion":"success","name":"Cache cargo registry","number":4,"startedAt":"2026-09-04T19:16:13Z","status":"completed"},{"completedAt":"2026-09-04T19:16:44Z","conclusion":"success","name":"Install rust-script","number":5,"startedAt":"2026-09-04T19:16:14Z","status":"completed"},{"completedAt":"2026-09-04T19:17:02Z","conclusion":"success","name":"Run release script unit tests","number":6,"startedAt":"2026-09-04T19:16:44Z","status":"completed"},{"completedAt":"2026-09-04T19:17:04Z","conclusion":"success","name":"Post Cache cargo registry","number":11,"startedAt":"2026-09-04T19:17:02Z","status":"completed"},{"completedAt":"2026-09-04T19:17:04Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":12,"startedAt":"2026-09-04T19:17:04Z","status":"completed"},{"completedAt":"2026-09-04T19:17:04Z","conclusion":"success","name":"Complete job","number":13,"startedAt":"2026-09-04T19:17:04Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33910180769/job/101144761406"},{"completedAt":"2026-09-04T19:16:31Z","conclusion":"failure","databaseId":101144761410,"name":"Test Rust (macos-latest)","startedAt":"2026-09-04T19:16:04Z","status":"completed","steps":[{"completedAt":"2026-09-04T19:16:06Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T19:16:05Z","status":"completed"},{"completedAt":"2026-09-04T19:16:08Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T19:16:06Z","status":"completed"},{"completedAt":"2026-09-04T19:16:15Z","conclusion":"success","name":"Setup Rust","number":3,"startedAt":"2026-09-04T19:16:08Z","status":"completed"},{"completedAt":"2026-09-04T19:16:19Z","conclusion":"success","name":"Cache cargo registry","number":4,"startedAt":"2026-09-04T19:16:15Z","status":"completed"},{"completedAt":"2026-09-04T19:16:29Z","conclusion":"failure","name":"Run tests","number":5,"startedAt":"2026-09-04T19:16:19Z","status":"completed"},{"completedAt":"2026-09-04T19:16:29Z","conclusion":"skipped","name":"Run doc tests","number":6,"startedAt":"2026-09-04T19:16:29Z","status":"completed"},{"completedAt":"2026-09-04T19:16:29Z","conclusion":"skipped","name":"Post Cache cargo registry","number":11,"startedAt":"2026-09-04T19:16:29Z","status":"completed"},{"completedAt":"2026-09-04T19:16:30Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":12,"startedAt":"2026-09-04T19:16:29Z","status":"completed"},{"completedAt":"2026-09-04T19:16:30Z","conclusion":"success","name":"Complete job","number":13,"startedAt":"2026-09-04T19:16:30Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33910180769/job/101144761410"},{"completedAt":"2026-09-04T19:16:49Z","conclusion":"success","databaseId":101144761422,"name":"Test Rust (ubuntu-latest)","startedAt":"2026-09-04T19:16:01Z","status":"completed","steps":[{"completedAt":"2026-09-04T19:16:03Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T19:16:01Z","status":"completed"},{"completedAt":"2026-09-04T19:16:04Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T19:16:03Z","status":"completed"},{"completedAt":"2026-09-04T19:16:14Z","conclusion":"success","name":"Setup Rust","number":3,"startedAt":"2026-09-04T19:16:04Z","status":"completed"},{"completedAt":"2026-09-04T19:16:18Z","conclusion":"success","name":"Cache cargo registry","number":4,"startedAt":"2026-09-04T19:16:14Z","status":"completed"},{"completedAt":"2026-09-04T19:16:42Z","conclusion":"success","name":"Run tests","number":5,"startedAt":"2026-09-04T19:16:18Z","status":"completed"},{"completedAt":"2026-09-04T19:16:43Z","conclusion":"success","name":"Run doc tests","number":6,"startedAt":"2026-09-04T19:16:42Z","status":"completed"},{"completedAt":"2026-09-04T19:16:47Z","conclusion":"success","name":"Post Cache cargo registry","number":11,"startedAt":"2026-09-04T19:16:43Z","status":"completed"},{"completedAt":"2026-09-04T19:16:47Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":12,"startedAt":"2026-09-04T19:16:47Z","status":"completed"},{"completedAt":"2026-09-04T19:16:47Z","conclusion":"success","name":"Complete job","number":13,"startedAt":"2026-09-04T19:16:47Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33910180769/job/101144761422"},{"completedAt":"2026-09-04T19:17:08Z","conclusion":"failure","databaseId":101144761454,"name":"Test Rust (windows-latest)","startedAt":"2026-09-04T19:16:00Z","status":"completed","steps":[{"completedAt":"2026-09-04T19:16:02Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T19:16:01Z","status":"completed"},{"completedAt":"2026-09-04T19:16:09Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T19:16:02Z","status":"completed"},{"completedAt":"2026-09-04T19:16:31Z","conclusion":"success","name":"Setup Rust","number":3,"startedAt":"2026-09-04T19:16:09Z","status":"completed"},{"completedAt":"2026-09-04T19:16:46Z","conclusion":"success","name":"Cache cargo registry","number":4,"startedAt":"2026-09-04T19:16:31Z","status":"completed"},{"completedAt":"2026-09-04T19:17:03Z","conclusion":"failure","name":"Run tests","number":5,"startedAt":"2026-09-04T19:16:46Z","status":"completed"},{"completedAt":"2026-09-04T19:17:03Z","conclusion":"skipped","name":"Run doc tests","number":6,"startedAt":"2026-09-04T19:17:03Z","status":"completed"},{"completedAt":"2026-09-04T19:17:03Z","conclusion":"skipped","name":"Post Cache cargo registry","number":11,"startedAt":"2026-09-04T19:17:03Z","status":"completed"},{"completedAt":"2026-09-04T19:17:06Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":12,"startedAt":"2026-09-04T19:17:03Z","status":"completed"},{"completedAt":"2026-09-04T19:17:06Z","conclusion":"success","name":"Complete job","number":13,"startedAt":"2026-09-04T19:17:06Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33910180769/job/101144761454"},{"completedAt":"2026-09-04T19:17:08Z","conclusion":"skipped","databaseId":101145091314,"name":"Build Rust package","startedAt":"2026-09-04T19:17:08Z","status":"completed","steps":[],"url":"https://github.com/link-foundation/command-stream/actions/runs/33910180769/job/101145091314"},{"completedAt":"2026-09-04T19:17:08Z","conclusion":"skipped","databaseId":101145092034,"name":"Release Rust crate","startedAt":"2026-09-04T19:17:09Z","status":"completed","steps":[],"url":"https://github.com/link-foundation/command-stream/actions/runs/33910180769/job/101145092034"}],"workflowName":"Rust checks and release"} diff --git a/dev/log/issues/199/pulls/200/api/run-33911660942.json b/dev/log/issues/199/pulls/200/api/run-33911660942.json new file mode 100644 index 0000000..115351d --- /dev/null +++ b/dev/log/issues/199/pulls/200/api/run-33911660942.json @@ -0,0 +1 @@ +{"conclusion":"failure","createdAt":"2026-09-04T19:32:11Z","databaseId":33911660942,"event":"pull_request","headBranch":"issue-197-b748bb92cd2d","headSha":"f9bf3decd6e9f52f5928777050e97439adc03b10","jobs":[{"completedAt":"2026-09-04T19:33:16Z","conclusion":"success","databaseId":101149244149,"name":"Rust changelog fragment check","startedAt":"2026-09-04T19:32:15Z","status":"completed","steps":[{"completedAt":"2026-09-04T19:32:17Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T19:32:16Z","status":"completed"},{"completedAt":"2026-09-04T19:32:19Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T19:32:17Z","status":"completed"},{"completedAt":"2026-09-04T19:32:30Z","conclusion":"success","name":"Setup Rust","number":3,"startedAt":"2026-09-04T19:32:19Z","status":"completed"},{"completedAt":"2026-09-04T19:33:05Z","conclusion":"success","name":"Install rust-script","number":4,"startedAt":"2026-09-04T19:32:30Z","status":"completed"},{"completedAt":"2026-09-04T19:33:14Z","conclusion":"success","name":"Check for changelog fragments","number":5,"startedAt":"2026-09-04T19:33:05Z","status":"completed"},{"completedAt":"2026-09-04T19:33:14Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":10,"startedAt":"2026-09-04T19:33:14Z","status":"completed"},{"completedAt":"2026-09-04T19:33:14Z","conclusion":"success","name":"Complete job","number":11,"startedAt":"2026-09-04T19:33:14Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33911660942/job/101149244149"},{"completedAt":"2026-09-04T19:32:12Z","conclusion":"skipped","databaseId":101149245347,"name":"Instant Rust release","startedAt":"2026-09-04T19:32:12Z","status":"completed","steps":[],"url":"https://github.com/link-foundation/command-stream/actions/runs/33911660942/job/101149245347"},{"completedAt":"2026-09-04T19:32:12Z","conclusion":"skipped","databaseId":101149245733,"name":"Create Rust changelog PR","startedAt":"2026-09-04T19:32:12Z","status":"completed","steps":[],"url":"https://github.com/link-foundation/command-stream/actions/runs/33911660942/job/101149245733"},{"completedAt":"2026-09-04T19:33:57Z","conclusion":"failure","databaseId":101149531858,"name":"Test Rust (macos-latest)","startedAt":"2026-09-04T19:33:23Z","status":"completed","steps":[{"completedAt":"2026-09-04T19:33:25Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T19:33:24Z","status":"completed"},{"completedAt":"2026-09-04T19:33:27Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T19:33:25Z","status":"completed"},{"completedAt":"2026-09-04T19:33:35Z","conclusion":"success","name":"Setup Rust","number":3,"startedAt":"2026-09-04T19:33:27Z","status":"completed"},{"completedAt":"2026-09-04T19:33:41Z","conclusion":"success","name":"Cache cargo registry","number":4,"startedAt":"2026-09-04T19:33:35Z","status":"completed"},{"completedAt":"2026-09-04T19:33:53Z","conclusion":"failure","name":"Run tests","number":5,"startedAt":"2026-09-04T19:33:41Z","status":"completed"},{"completedAt":"2026-09-04T19:33:53Z","conclusion":"skipped","name":"Run doc tests","number":6,"startedAt":"2026-09-04T19:33:53Z","status":"completed"},{"completedAt":"2026-09-04T19:33:53Z","conclusion":"skipped","name":"Post Cache cargo registry","number":11,"startedAt":"2026-09-04T19:33:53Z","status":"completed"},{"completedAt":"2026-09-04T19:33:54Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":12,"startedAt":"2026-09-04T19:33:53Z","status":"completed"},{"completedAt":"2026-09-04T19:33:54Z","conclusion":"success","name":"Complete job","number":13,"startedAt":"2026-09-04T19:33:54Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33911660942/job/101149531858"},{"completedAt":"2026-09-04T19:34:42Z","conclusion":"success","databaseId":101149531866,"name":"Test Rust release scripts","startedAt":"2026-09-04T19:33:19Z","status":"completed","steps":[{"completedAt":"2026-09-04T19:33:21Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T19:33:19Z","status":"completed"},{"completedAt":"2026-09-04T19:33:22Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T19:33:21Z","status":"completed"},{"completedAt":"2026-09-04T19:33:33Z","conclusion":"success","name":"Setup Rust","number":3,"startedAt":"2026-09-04T19:33:22Z","status":"completed"},{"completedAt":"2026-09-04T19:33:35Z","conclusion":"success","name":"Cache cargo registry","number":4,"startedAt":"2026-09-04T19:33:33Z","status":"completed"},{"completedAt":"2026-09-04T19:34:11Z","conclusion":"success","name":"Install rust-script","number":5,"startedAt":"2026-09-04T19:33:35Z","status":"completed"},{"completedAt":"2026-09-04T19:34:39Z","conclusion":"success","name":"Run release script unit tests","number":6,"startedAt":"2026-09-04T19:34:11Z","status":"completed"},{"completedAt":"2026-09-04T19:34:39Z","conclusion":"success","name":"Post Cache cargo registry","number":11,"startedAt":"2026-09-04T19:34:39Z","status":"completed"},{"completedAt":"2026-09-04T19:34:40Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":12,"startedAt":"2026-09-04T19:34:39Z","status":"completed"},{"completedAt":"2026-09-04T19:34:40Z","conclusion":"success","name":"Complete job","number":13,"startedAt":"2026-09-04T19:34:40Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33911660942/job/101149531866"},{"completedAt":"2026-09-04T19:34:55Z","conclusion":"success","databaseId":101149531868,"name":"Test Rust (windows-latest)","startedAt":"2026-09-04T19:33:18Z","status":"completed","steps":[{"completedAt":"2026-09-04T19:33:20Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T19:33:19Z","status":"completed"},{"completedAt":"2026-09-04T19:33:25Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T19:33:20Z","status":"completed"},{"completedAt":"2026-09-04T19:33:47Z","conclusion":"success","name":"Setup Rust","number":3,"startedAt":"2026-09-04T19:33:25Z","status":"completed"},{"completedAt":"2026-09-04T19:34:02Z","conclusion":"success","name":"Cache cargo registry","number":4,"startedAt":"2026-09-04T19:33:47Z","status":"completed"},{"completedAt":"2026-09-04T19:34:37Z","conclusion":"success","name":"Run tests","number":5,"startedAt":"2026-09-04T19:34:02Z","status":"completed"},{"completedAt":"2026-09-04T19:34:43Z","conclusion":"success","name":"Run doc tests","number":6,"startedAt":"2026-09-04T19:34:37Z","status":"completed"},{"completedAt":"2026-09-04T19:34:51Z","conclusion":"success","name":"Post Cache cargo registry","number":11,"startedAt":"2026-09-04T19:34:43Z","status":"completed"},{"completedAt":"2026-09-04T19:34:54Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":12,"startedAt":"2026-09-04T19:34:51Z","status":"completed"},{"completedAt":"2026-09-04T19:34:54Z","conclusion":"success","name":"Complete job","number":13,"startedAt":"2026-09-04T19:34:54Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33911660942/job/101149531868"},{"completedAt":"2026-09-04T19:34:00Z","conclusion":"success","databaseId":101149531908,"name":"Test Rust (ubuntu-latest)","startedAt":"2026-09-04T19:33:18Z","status":"completed","steps":[{"completedAt":"2026-09-04T19:33:20Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T19:33:19Z","status":"completed"},{"completedAt":"2026-09-04T19:33:21Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T19:33:20Z","status":"completed"},{"completedAt":"2026-09-04T19:33:31Z","conclusion":"success","name":"Setup Rust","number":3,"startedAt":"2026-09-04T19:33:21Z","status":"completed"},{"completedAt":"2026-09-04T19:33:33Z","conclusion":"success","name":"Cache cargo registry","number":4,"startedAt":"2026-09-04T19:33:31Z","status":"completed"},{"completedAt":"2026-09-04T19:33:57Z","conclusion":"success","name":"Run tests","number":5,"startedAt":"2026-09-04T19:33:33Z","status":"completed"},{"completedAt":"2026-09-04T19:33:59Z","conclusion":"success","name":"Run doc tests","number":6,"startedAt":"2026-09-04T19:33:57Z","status":"completed"},{"completedAt":"2026-09-04T19:33:59Z","conclusion":"success","name":"Post Cache cargo registry","number":11,"startedAt":"2026-09-04T19:33:59Z","status":"completed"},{"completedAt":"2026-09-04T19:33:59Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":12,"startedAt":"2026-09-04T19:33:59Z","status":"completed"},{"completedAt":"2026-09-04T19:33:59Z","conclusion":"success","name":"Complete job","number":13,"startedAt":"2026-09-04T19:33:59Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33911660942/job/101149531908"},{"completedAt":"2026-09-04T19:33:36Z","conclusion":"success","databaseId":101149531924,"name":"Lint and format Rust","startedAt":"2026-09-04T19:33:18Z","status":"completed","steps":[{"completedAt":"2026-09-04T19:33:20Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T19:33:19Z","status":"completed"},{"completedAt":"2026-09-04T19:33:21Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T19:33:20Z","status":"completed"},{"completedAt":"2026-09-04T19:33:30Z","conclusion":"success","name":"Setup Rust","number":3,"startedAt":"2026-09-04T19:33:21Z","status":"completed"},{"completedAt":"2026-09-04T19:33:33Z","conclusion":"success","name":"Cache cargo registry","number":4,"startedAt":"2026-09-04T19:33:30Z","status":"completed"},{"completedAt":"2026-09-04T19:33:33Z","conclusion":"success","name":"Check formatting","number":5,"startedAt":"2026-09-04T19:33:33Z","status":"completed"},{"completedAt":"2026-09-04T19:33:34Z","conclusion":"success","name":"Run Clippy","number":6,"startedAt":"2026-09-04T19:33:33Z","status":"completed"},{"completedAt":"2026-09-04T19:33:34Z","conclusion":"success","name":"Post Cache cargo registry","number":11,"startedAt":"2026-09-04T19:33:34Z","status":"completed"},{"completedAt":"2026-09-04T19:33:35Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":12,"startedAt":"2026-09-04T19:33:34Z","status":"completed"},{"completedAt":"2026-09-04T19:33:35Z","conclusion":"success","name":"Complete job","number":13,"startedAt":"2026-09-04T19:33:35Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33911660942/job/101149531924"},{"completedAt":"2026-09-04T19:34:55Z","conclusion":"skipped","databaseId":101149978503,"name":"Build Rust package","startedAt":"2026-09-04T19:34:55Z","status":"completed","steps":[],"url":"https://github.com/link-foundation/command-stream/actions/runs/33911660942/job/101149978503"},{"completedAt":"2026-09-04T19:34:55Z","conclusion":"skipped","databaseId":101149978626,"name":"Release Rust crate","startedAt":"2026-09-04T19:34:55Z","status":"completed","steps":[],"url":"https://github.com/link-foundation/command-stream/actions/runs/33911660942/job/101149978626"}],"workflowName":"Rust checks and release"} diff --git a/dev/log/issues/199/pulls/200/api/run-33911660947.json b/dev/log/issues/199/pulls/200/api/run-33911660947.json new file mode 100644 index 0000000..24066f8 --- /dev/null +++ b/dev/log/issues/199/pulls/200/api/run-33911660947.json @@ -0,0 +1 @@ +{"conclusion":"failure","createdAt":"2026-09-04T19:32:11Z","databaseId":33911660947,"event":"pull_request","headBranch":"issue-197-b748bb92cd2d","headSha":"f9bf3decd6e9f52f5928777050e97439adc03b10","jobs":[{"completedAt":"2026-09-04T19:32:21Z","conclusion":"success","databaseId":101149244065,"name":"Check for JavaScript changesets","startedAt":"2026-09-04T19:32:13Z","status":"completed","steps":[{"completedAt":"2026-09-04T19:32:15Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T19:32:14Z","status":"completed"},{"completedAt":"2026-09-04T19:32:16Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T19:32:15Z","status":"completed"},{"completedAt":"2026-09-04T19:32:18Z","conclusion":"success","name":"Setup Bun","number":3,"startedAt":"2026-09-04T19:32:16Z","status":"completed"},{"completedAt":"2026-09-04T19:32:19Z","conclusion":"success","name":"Install dependencies","number":4,"startedAt":"2026-09-04T19:32:18Z","status":"completed"},{"completedAt":"2026-09-04T19:32:19Z","conclusion":"success","name":"Check for changesets","number":5,"startedAt":"2026-09-04T19:32:19Z","status":"completed"},{"completedAt":"2026-09-04T19:32:19Z","conclusion":"success","name":"Post Setup Bun","number":9,"startedAt":"2026-09-04T19:32:19Z","status":"completed"},{"completedAt":"2026-09-04T19:32:19Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":10,"startedAt":"2026-09-04T19:32:19Z","status":"completed"},{"completedAt":"2026-09-04T19:32:19Z","conclusion":"success","name":"Complete job","number":11,"startedAt":"2026-09-04T19:32:19Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33911660947/job/101149244065"},{"completedAt":"2026-09-04T19:32:12Z","conclusion":"skipped","databaseId":101149245348,"name":"Instant JavaScript release","startedAt":"2026-09-04T19:32:12Z","status":"completed","steps":[],"url":"https://github.com/link-foundation/command-stream/actions/runs/33911660947/job/101149245348"},{"completedAt":"2026-09-04T19:32:12Z","conclusion":"skipped","databaseId":101149245522,"name":"Create JavaScript changeset PR","startedAt":"2026-09-04T19:32:12Z","status":"completed","steps":[],"url":"https://github.com/link-foundation/command-stream/actions/runs/33911660947/job/101149245522"},{"completedAt":"2026-09-04T19:32:43Z","conclusion":"success","databaseId":101149289076,"name":"Lint and format JavaScript","startedAt":"2026-09-04T19:32:24Z","status":"completed","steps":[{"completedAt":"2026-09-04T19:32:26Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T19:32:25Z","status":"completed"},{"completedAt":"2026-09-04T19:32:28Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T19:32:26Z","status":"completed"},{"completedAt":"2026-09-04T19:32:29Z","conclusion":"success","name":"Setup Bun","number":3,"startedAt":"2026-09-04T19:32:28Z","status":"completed"},{"completedAt":"2026-09-04T19:32:30Z","conclusion":"success","name":"Install dependencies","number":4,"startedAt":"2026-09-04T19:32:29Z","status":"completed"},{"completedAt":"2026-09-04T19:32:37Z","conclusion":"success","name":"Run ESLint","number":5,"startedAt":"2026-09-04T19:32:30Z","status":"completed"},{"completedAt":"2026-09-04T19:32:41Z","conclusion":"success","name":"Check formatting","number":6,"startedAt":"2026-09-04T19:32:37Z","status":"completed"},{"completedAt":"2026-09-04T19:32:41Z","conclusion":"success","name":"Check code duplication","number":7,"startedAt":"2026-09-04T19:32:41Z","status":"completed"},{"completedAt":"2026-09-04T19:32:41Z","conclusion":"success","name":"Post Setup Bun","number":13,"startedAt":"2026-09-04T19:32:41Z","status":"completed"},{"completedAt":"2026-09-04T19:32:42Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":14,"startedAt":"2026-09-04T19:32:41Z","status":"completed"},{"completedAt":"2026-09-04T19:32:42Z","conclusion":"success","name":"Complete job","number":15,"startedAt":"2026-09-04T19:32:42Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33911660947/job/101149289076"},{"completedAt":"2026-09-04T19:33:52Z","conclusion":"failure","databaseId":101149289153,"name":"Test JavaScript (bun on macos-latest)","startedAt":"2026-09-04T19:32:28Z","status":"completed","steps":[{"completedAt":"2026-09-04T19:32:30Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T19:32:29Z","status":"completed"},{"completedAt":"2026-09-04T19:32:32Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T19:32:30Z","status":"completed"},{"completedAt":"2026-09-04T19:32:34Z","conclusion":"success","name":"Setup Bun","number":3,"startedAt":"2026-09-04T19:32:32Z","status":"completed"},{"completedAt":"2026-09-04T19:32:35Z","conclusion":"success","name":"Setup Node.js PTY host","number":4,"startedAt":"2026-09-04T19:32:34Z","status":"completed"},{"completedAt":"2026-09-04T19:32:35Z","conclusion":"skipped","name":"Install system dependencies (Ubuntu)","number":5,"startedAt":"2026-09-04T19:32:35Z","status":"completed"},{"completedAt":"2026-09-04T19:32:37Z","conclusion":"success","name":"Install system dependencies (macOS)","number":6,"startedAt":"2026-09-04T19:32:35Z","status":"completed"},{"completedAt":"2026-09-04T19:32:37Z","conclusion":"skipped","name":"Install system dependencies (Windows)","number":7,"startedAt":"2026-09-04T19:32:37Z","status":"completed"},{"completedAt":"2026-09-04T19:32:39Z","conclusion":"success","name":"Install dependencies (Bun)","number":8,"startedAt":"2026-09-04T19:32:37Z","status":"completed"},{"completedAt":"2026-09-04T19:33:47Z","conclusion":"failure","name":"Run tests (Bun)","number":9,"startedAt":"2026-09-04T19:32:39Z","status":"completed"},{"completedAt":"2026-09-04T19:33:47Z","conclusion":"skipped","name":"Setup Node.js","number":10,"startedAt":"2026-09-04T19:33:47Z","status":"completed"},{"completedAt":"2026-09-04T19:33:47Z","conclusion":"skipped","name":"Install dependencies (Node)","number":11,"startedAt":"2026-09-04T19:33:47Z","status":"completed"},{"completedAt":"2026-09-04T19:33:47Z","conclusion":"skipped","name":"Test Node.js compatibility","number":12,"startedAt":"2026-09-04T19:33:47Z","status":"completed"},{"completedAt":"2026-09-04T19:33:47Z","conclusion":"skipped","name":"Post Setup Node.js PTY host","number":22,"startedAt":"2026-09-04T19:33:47Z","status":"completed"},{"completedAt":"2026-09-04T19:33:47Z","conclusion":"skipped","name":"Post Setup Bun","number":23,"startedAt":"2026-09-04T19:33:47Z","status":"completed"},{"completedAt":"2026-09-04T19:33:48Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":24,"startedAt":"2026-09-04T19:33:47Z","status":"completed"},{"completedAt":"2026-09-04T19:33:49Z","conclusion":"success","name":"Complete job","number":25,"startedAt":"2026-09-04T19:33:48Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33911660947/job/101149289153"},{"completedAt":"2026-09-04T19:32:46Z","conclusion":"success","databaseId":101149289155,"name":"Test JavaScript (node on ubuntu-latest)","startedAt":"2026-09-04T19:32:23Z","status":"completed","steps":[{"completedAt":"2026-09-04T19:32:26Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T19:32:24Z","status":"completed"},{"completedAt":"2026-09-04T19:32:28Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T19:32:26Z","status":"completed"},{"completedAt":"2026-09-04T19:32:28Z","conclusion":"skipped","name":"Setup Bun","number":3,"startedAt":"2026-09-04T19:32:28Z","status":"completed"},{"completedAt":"2026-09-04T19:32:28Z","conclusion":"skipped","name":"Setup Node.js PTY host","number":4,"startedAt":"2026-09-04T19:32:28Z","status":"completed"},{"completedAt":"2026-09-04T19:32:34Z","conclusion":"success","name":"Install system dependencies (Ubuntu)","number":5,"startedAt":"2026-09-04T19:32:28Z","status":"completed"},{"completedAt":"2026-09-04T19:32:34Z","conclusion":"skipped","name":"Install system dependencies (macOS)","number":6,"startedAt":"2026-09-04T19:32:34Z","status":"completed"},{"completedAt":"2026-09-04T19:32:34Z","conclusion":"skipped","name":"Install system dependencies (Windows)","number":7,"startedAt":"2026-09-04T19:32:34Z","status":"completed"},{"completedAt":"2026-09-04T19:32:34Z","conclusion":"skipped","name":"Install dependencies (Bun)","number":8,"startedAt":"2026-09-04T19:32:34Z","status":"completed"},{"completedAt":"2026-09-04T19:32:34Z","conclusion":"skipped","name":"Run tests (Bun)","number":9,"startedAt":"2026-09-04T19:32:34Z","status":"completed"},{"completedAt":"2026-09-04T19:32:40Z","conclusion":"success","name":"Setup Node.js","number":10,"startedAt":"2026-09-04T19:32:34Z","status":"completed"},{"completedAt":"2026-09-04T19:32:44Z","conclusion":"success","name":"Install dependencies (Node)","number":11,"startedAt":"2026-09-04T19:32:40Z","status":"completed"},{"completedAt":"2026-09-04T19:32:44Z","conclusion":"success","name":"Test Node.js compatibility","number":12,"startedAt":"2026-09-04T19:32:44Z","status":"completed"},{"completedAt":"2026-09-04T19:32:45Z","conclusion":"success","name":"Post Setup Node.js","number":23,"startedAt":"2026-09-04T19:32:44Z","status":"completed"},{"completedAt":"2026-09-04T19:32:45Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":24,"startedAt":"2026-09-04T19:32:45Z","status":"completed"},{"completedAt":"2026-09-04T19:32:45Z","conclusion":"success","name":"Complete job","number":25,"startedAt":"2026-09-04T19:32:45Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33911660947/job/101149289155"},{"completedAt":"2026-09-04T19:33:59Z","conclusion":"success","databaseId":101149289192,"name":"Test JavaScript (bun on ubuntu-latest)","startedAt":"2026-09-04T19:33:00Z","status":"completed","steps":[{"completedAt":"2026-09-04T19:33:01Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T19:33:00Z","status":"completed"},{"completedAt":"2026-09-04T19:33:02Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T19:33:01Z","status":"completed"},{"completedAt":"2026-09-04T19:33:04Z","conclusion":"success","name":"Setup Bun","number":3,"startedAt":"2026-09-04T19:33:02Z","status":"completed"},{"completedAt":"2026-09-04T19:33:04Z","conclusion":"success","name":"Setup Node.js PTY host","number":4,"startedAt":"2026-09-04T19:33:04Z","status":"completed"},{"completedAt":"2026-09-04T19:33:10Z","conclusion":"success","name":"Install system dependencies (Ubuntu)","number":5,"startedAt":"2026-09-04T19:33:04Z","status":"completed"},{"completedAt":"2026-09-04T19:33:10Z","conclusion":"skipped","name":"Install system dependencies (macOS)","number":6,"startedAt":"2026-09-04T19:33:10Z","status":"completed"},{"completedAt":"2026-09-04T19:33:10Z","conclusion":"skipped","name":"Install system dependencies (Windows)","number":7,"startedAt":"2026-09-04T19:33:10Z","status":"completed"},{"completedAt":"2026-09-04T19:33:11Z","conclusion":"success","name":"Install dependencies (Bun)","number":8,"startedAt":"2026-09-04T19:33:10Z","status":"completed"},{"completedAt":"2026-09-04T19:33:56Z","conclusion":"success","name":"Run tests (Bun)","number":9,"startedAt":"2026-09-04T19:33:11Z","status":"completed"},{"completedAt":"2026-09-04T19:33:56Z","conclusion":"skipped","name":"Setup Node.js","number":10,"startedAt":"2026-09-04T19:33:56Z","status":"completed"},{"completedAt":"2026-09-04T19:33:56Z","conclusion":"skipped","name":"Install dependencies (Node)","number":11,"startedAt":"2026-09-04T19:33:56Z","status":"completed"},{"completedAt":"2026-09-04T19:33:56Z","conclusion":"skipped","name":"Test Node.js compatibility","number":12,"startedAt":"2026-09-04T19:33:56Z","status":"completed"},{"completedAt":"2026-09-04T19:33:57Z","conclusion":"success","name":"Post Setup Node.js PTY host","number":22,"startedAt":"2026-09-04T19:33:56Z","status":"completed"},{"completedAt":"2026-09-04T19:33:57Z","conclusion":"success","name":"Post Setup Bun","number":23,"startedAt":"2026-09-04T19:33:57Z","status":"completed"},{"completedAt":"2026-09-04T19:33:57Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":24,"startedAt":"2026-09-04T19:33:57Z","status":"completed"},{"completedAt":"2026-09-04T19:33:57Z","conclusion":"success","name":"Complete job","number":25,"startedAt":"2026-09-04T19:33:57Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33911660947/job/101149289192"},{"completedAt":"2026-09-04T19:32:46Z","conclusion":"success","databaseId":101149289225,"name":"Test JavaScript (node on ubuntu-latest)","startedAt":"2026-09-04T19:32:24Z","status":"completed","steps":[{"completedAt":"2026-09-04T19:32:26Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T19:32:25Z","status":"completed"},{"completedAt":"2026-09-04T19:32:28Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T19:32:26Z","status":"completed"},{"completedAt":"2026-09-04T19:32:28Z","conclusion":"skipped","name":"Setup Bun","number":3,"startedAt":"2026-09-04T19:32:28Z","status":"completed"},{"completedAt":"2026-09-04T19:32:28Z","conclusion":"skipped","name":"Setup Node.js PTY host","number":4,"startedAt":"2026-09-04T19:32:28Z","status":"completed"},{"completedAt":"2026-09-04T19:32:36Z","conclusion":"success","name":"Install system dependencies (Ubuntu)","number":5,"startedAt":"2026-09-04T19:32:28Z","status":"completed"},{"completedAt":"2026-09-04T19:32:36Z","conclusion":"skipped","name":"Install system dependencies (macOS)","number":6,"startedAt":"2026-09-04T19:32:36Z","status":"completed"},{"completedAt":"2026-09-04T19:32:36Z","conclusion":"skipped","name":"Install system dependencies (Windows)","number":7,"startedAt":"2026-09-04T19:32:36Z","status":"completed"},{"completedAt":"2026-09-04T19:32:36Z","conclusion":"skipped","name":"Install dependencies (Bun)","number":8,"startedAt":"2026-09-04T19:32:36Z","status":"completed"},{"completedAt":"2026-09-04T19:32:36Z","conclusion":"skipped","name":"Run tests (Bun)","number":9,"startedAt":"2026-09-04T19:32:36Z","status":"completed"},{"completedAt":"2026-09-04T19:32:37Z","conclusion":"success","name":"Setup Node.js","number":10,"startedAt":"2026-09-04T19:32:36Z","status":"completed"},{"completedAt":"2026-09-04T19:32:42Z","conclusion":"success","name":"Install dependencies (Node)","number":11,"startedAt":"2026-09-04T19:32:37Z","status":"completed"},{"completedAt":"2026-09-04T19:32:44Z","conclusion":"success","name":"Test Node.js compatibility","number":12,"startedAt":"2026-09-04T19:32:42Z","status":"completed"},{"completedAt":"2026-09-04T19:32:44Z","conclusion":"success","name":"Post Setup Node.js","number":23,"startedAt":"2026-09-04T19:32:44Z","status":"completed"},{"completedAt":"2026-09-04T19:32:44Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":24,"startedAt":"2026-09-04T19:32:44Z","status":"completed"},{"completedAt":"2026-09-04T19:32:44Z","conclusion":"success","name":"Complete job","number":25,"startedAt":"2026-09-04T19:32:44Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33911660947/job/101149289225"},{"completedAt":"2026-09-04T19:33:38Z","conclusion":"success","databaseId":101149289236,"name":"Test JavaScript (bun on windows-latest)","startedAt":"2026-09-04T19:32:23Z","status":"completed","steps":[{"completedAt":"2026-09-04T19:32:26Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T19:32:25Z","status":"completed"},{"completedAt":"2026-09-04T19:32:31Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T19:32:26Z","status":"completed"},{"completedAt":"2026-09-04T19:32:34Z","conclusion":"success","name":"Setup Bun","number":3,"startedAt":"2026-09-04T19:32:31Z","status":"completed"},{"completedAt":"2026-09-04T19:32:40Z","conclusion":"success","name":"Setup Node.js PTY host","number":4,"startedAt":"2026-09-04T19:32:34Z","status":"completed"},{"completedAt":"2026-09-04T19:32:40Z","conclusion":"skipped","name":"Install system dependencies (Ubuntu)","number":5,"startedAt":"2026-09-04T19:32:40Z","status":"completed"},{"completedAt":"2026-09-04T19:32:40Z","conclusion":"skipped","name":"Install system dependencies (macOS)","number":6,"startedAt":"2026-09-04T19:32:40Z","status":"completed"},{"completedAt":"2026-09-04T19:32:46Z","conclusion":"success","name":"Install system dependencies (Windows)","number":7,"startedAt":"2026-09-04T19:32:40Z","status":"completed"},{"completedAt":"2026-09-04T19:32:56Z","conclusion":"success","name":"Install dependencies (Bun)","number":8,"startedAt":"2026-09-04T19:32:46Z","status":"completed"},{"completedAt":"2026-09-04T19:33:33Z","conclusion":"success","name":"Run tests (Bun)","number":9,"startedAt":"2026-09-04T19:32:56Z","status":"completed"},{"completedAt":"2026-09-04T19:33:33Z","conclusion":"skipped","name":"Setup Node.js","number":10,"startedAt":"2026-09-04T19:33:33Z","status":"completed"},{"completedAt":"2026-09-04T19:33:33Z","conclusion":"skipped","name":"Install dependencies (Node)","number":11,"startedAt":"2026-09-04T19:33:33Z","status":"completed"},{"completedAt":"2026-09-04T19:33:33Z","conclusion":"skipped","name":"Test Node.js compatibility","number":12,"startedAt":"2026-09-04T19:33:33Z","status":"completed"},{"completedAt":"2026-09-04T19:33:34Z","conclusion":"success","name":"Post Setup Node.js PTY host","number":22,"startedAt":"2026-09-04T19:33:33Z","status":"completed"},{"completedAt":"2026-09-04T19:33:34Z","conclusion":"success","name":"Post Setup Bun","number":23,"startedAt":"2026-09-04T19:33:34Z","status":"completed"},{"completedAt":"2026-09-04T19:33:36Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":24,"startedAt":"2026-09-04T19:33:34Z","status":"completed"},{"completedAt":"2026-09-04T19:33:36Z","conclusion":"success","name":"Complete job","number":25,"startedAt":"2026-09-04T19:33:36Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33911660947/job/101149289236"},{"completedAt":"2026-09-04T19:32:47Z","conclusion":"success","databaseId":101149289294,"name":"Test JavaScript (node on ubuntu-latest)","startedAt":"2026-09-04T19:32:24Z","status":"completed","steps":[{"completedAt":"2026-09-04T19:32:25Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T19:32:24Z","status":"completed"},{"completedAt":"2026-09-04T19:32:26Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T19:32:25Z","status":"completed"},{"completedAt":"2026-09-04T19:32:26Z","conclusion":"skipped","name":"Setup Bun","number":3,"startedAt":"2026-09-04T19:32:26Z","status":"completed"},{"completedAt":"2026-09-04T19:32:26Z","conclusion":"skipped","name":"Setup Node.js PTY host","number":4,"startedAt":"2026-09-04T19:32:26Z","status":"completed"},{"completedAt":"2026-09-04T19:32:35Z","conclusion":"success","name":"Install system dependencies (Ubuntu)","number":5,"startedAt":"2026-09-04T19:32:26Z","status":"completed"},{"completedAt":"2026-09-04T19:32:35Z","conclusion":"skipped","name":"Install system dependencies (macOS)","number":6,"startedAt":"2026-09-04T19:32:35Z","status":"completed"},{"completedAt":"2026-09-04T19:32:35Z","conclusion":"skipped","name":"Install system dependencies (Windows)","number":7,"startedAt":"2026-09-04T19:32:35Z","status":"completed"},{"completedAt":"2026-09-04T19:32:35Z","conclusion":"skipped","name":"Install dependencies (Bun)","number":8,"startedAt":"2026-09-04T19:32:35Z","status":"completed"},{"completedAt":"2026-09-04T19:32:35Z","conclusion":"skipped","name":"Run tests (Bun)","number":9,"startedAt":"2026-09-04T19:32:35Z","status":"completed"},{"completedAt":"2026-09-04T19:32:36Z","conclusion":"success","name":"Setup Node.js","number":10,"startedAt":"2026-09-04T19:32:35Z","status":"completed"},{"completedAt":"2026-09-04T19:32:43Z","conclusion":"success","name":"Install dependencies (Node)","number":11,"startedAt":"2026-09-04T19:32:36Z","status":"completed"},{"completedAt":"2026-09-04T19:32:45Z","conclusion":"success","name":"Test Node.js compatibility","number":12,"startedAt":"2026-09-04T19:32:43Z","status":"completed"},{"completedAt":"2026-09-04T19:32:45Z","conclusion":"success","name":"Post Setup Node.js","number":23,"startedAt":"2026-09-04T19:32:45Z","status":"completed"},{"completedAt":"2026-09-04T19:32:45Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":24,"startedAt":"2026-09-04T19:32:45Z","status":"completed"},{"completedAt":"2026-09-04T19:32:45Z","conclusion":"success","name":"Complete job","number":25,"startedAt":"2026-09-04T19:32:45Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33911660947/job/101149289294"},{"completedAt":"2026-09-04T19:33:59Z","conclusion":"skipped","databaseId":101149726844,"name":"Release JavaScript package","startedAt":"2026-09-04T19:33:59Z","status":"completed","steps":[],"url":"https://github.com/link-foundation/command-stream/actions/runs/33911660947/job/101149726844"}],"workflowName":"JavaScript checks and release"} diff --git a/dev/log/issues/199/pulls/200/api/run-33914574263.json b/dev/log/issues/199/pulls/200/api/run-33914574263.json new file mode 100644 index 0000000..72c34b0 --- /dev/null +++ b/dev/log/issues/199/pulls/200/api/run-33914574263.json @@ -0,0 +1 @@ +{"conclusion":"success","createdAt":"2026-09-04T20:06:37Z","databaseId":33914574263,"event":"push","headBranch":"main","headSha":"000dbeab30fd580f07b4d21a73ac40c55ce2e7fc","jobs":[{"completedAt":"2026-09-04T20:08:00Z","conclusion":"success","databaseId":101158646286,"name":"Test Rust release scripts","startedAt":"2026-09-04T20:06:39Z","status":"completed","steps":[{"completedAt":"2026-09-04T20:06:41Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T20:06:40Z","status":"completed"},{"completedAt":"2026-09-04T20:06:43Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T20:06:41Z","status":"completed"},{"completedAt":"2026-09-04T20:06:52Z","conclusion":"success","name":"Setup Rust","number":3,"startedAt":"2026-09-04T20:06:43Z","status":"completed"},{"completedAt":"2026-09-04T20:07:01Z","conclusion":"success","name":"Cache cargo registry","number":4,"startedAt":"2026-09-04T20:06:52Z","status":"completed"},{"completedAt":"2026-09-04T20:07:34Z","conclusion":"success","name":"Install rust-script","number":5,"startedAt":"2026-09-04T20:07:01Z","status":"completed"},{"completedAt":"2026-09-04T20:07:54Z","conclusion":"success","name":"Run release script unit tests","number":6,"startedAt":"2026-09-04T20:07:34Z","status":"completed"},{"completedAt":"2026-09-04T20:07:58Z","conclusion":"success","name":"Post Cache cargo registry","number":11,"startedAt":"2026-09-04T20:07:54Z","status":"completed"},{"completedAt":"2026-09-04T20:07:58Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":12,"startedAt":"2026-09-04T20:07:58Z","status":"completed"},{"completedAt":"2026-09-04T20:07:58Z","conclusion":"success","name":"Complete job","number":13,"startedAt":"2026-09-04T20:07:58Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33914574263/job/101158646286"},{"completedAt":"2026-09-04T20:08:16Z","conclusion":"success","databaseId":101158646616,"name":"Test Rust (windows-latest)","startedAt":"2026-09-04T20:06:40Z","status":"completed","steps":[{"completedAt":"2026-09-04T20:06:42Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T20:06:41Z","status":"completed"},{"completedAt":"2026-09-04T20:06:48Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T20:06:42Z","status":"completed"},{"completedAt":"2026-09-04T20:07:09Z","conclusion":"success","name":"Setup Rust","number":3,"startedAt":"2026-09-04T20:06:48Z","status":"completed"},{"completedAt":"2026-09-04T20:07:24Z","conclusion":"success","name":"Cache cargo registry","number":4,"startedAt":"2026-09-04T20:07:09Z","status":"completed"},{"completedAt":"2026-09-04T20:07:57Z","conclusion":"success","name":"Run tests","number":5,"startedAt":"2026-09-04T20:07:24Z","status":"completed"},{"completedAt":"2026-09-04T20:08:03Z","conclusion":"success","name":"Run doc tests","number":6,"startedAt":"2026-09-04T20:07:57Z","status":"completed"},{"completedAt":"2026-09-04T20:08:12Z","conclusion":"success","name":"Post Cache cargo registry","number":11,"startedAt":"2026-09-04T20:08:03Z","status":"completed"},{"completedAt":"2026-09-04T20:08:14Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":12,"startedAt":"2026-09-04T20:08:12Z","status":"completed"},{"completedAt":"2026-09-04T20:08:14Z","conclusion":"success","name":"Complete job","number":13,"startedAt":"2026-09-04T20:08:14Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33914574263/job/101158646616"},{"completedAt":"2026-09-04T20:07:24Z","conclusion":"success","databaseId":101158646711,"name":"Test Rust (ubuntu-latest)","startedAt":"2026-09-04T20:06:39Z","status":"completed","steps":[{"completedAt":"2026-09-04T20:06:41Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T20:06:40Z","status":"completed"},{"completedAt":"2026-09-04T20:06:42Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T20:06:41Z","status":"completed"},{"completedAt":"2026-09-04T20:06:51Z","conclusion":"success","name":"Setup Rust","number":3,"startedAt":"2026-09-04T20:06:42Z","status":"completed"},{"completedAt":"2026-09-04T20:06:53Z","conclusion":"success","name":"Cache cargo registry","number":4,"startedAt":"2026-09-04T20:06:51Z","status":"completed"},{"completedAt":"2026-09-04T20:07:17Z","conclusion":"success","name":"Run tests","number":5,"startedAt":"2026-09-04T20:06:53Z","status":"completed"},{"completedAt":"2026-09-04T20:07:19Z","conclusion":"success","name":"Run doc tests","number":6,"startedAt":"2026-09-04T20:07:17Z","status":"completed"},{"completedAt":"2026-09-04T20:07:23Z","conclusion":"success","name":"Post Cache cargo registry","number":11,"startedAt":"2026-09-04T20:07:19Z","status":"completed"},{"completedAt":"2026-09-04T20:07:23Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":12,"startedAt":"2026-09-04T20:07:23Z","status":"completed"},{"completedAt":"2026-09-04T20:07:23Z","conclusion":"success","name":"Complete job","number":13,"startedAt":"2026-09-04T20:07:23Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33914574263/job/101158646711"},{"completedAt":"2026-09-04T20:07:14Z","conclusion":"success","databaseId":101158646788,"name":"Lint and format Rust","startedAt":"2026-09-04T20:06:40Z","status":"completed","steps":[{"completedAt":"2026-09-04T20:06:43Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T20:06:41Z","status":"completed"},{"completedAt":"2026-09-04T20:06:45Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T20:06:43Z","status":"completed"},{"completedAt":"2026-09-04T20:06:56Z","conclusion":"success","name":"Setup Rust","number":3,"startedAt":"2026-09-04T20:06:45Z","status":"completed"},{"completedAt":"2026-09-04T20:06:59Z","conclusion":"success","name":"Cache cargo registry","number":4,"startedAt":"2026-09-04T20:06:56Z","status":"completed"},{"completedAt":"2026-09-04T20:06:59Z","conclusion":"success","name":"Check formatting","number":5,"startedAt":"2026-09-04T20:06:59Z","status":"completed"},{"completedAt":"2026-09-04T20:07:07Z","conclusion":"success","name":"Run Clippy","number":6,"startedAt":"2026-09-04T20:06:59Z","status":"completed"},{"completedAt":"2026-09-04T20:07:12Z","conclusion":"success","name":"Post Cache cargo registry","number":11,"startedAt":"2026-09-04T20:07:07Z","status":"completed"},{"completedAt":"2026-09-04T20:07:12Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":12,"startedAt":"2026-09-04T20:07:12Z","status":"completed"},{"completedAt":"2026-09-04T20:07:12Z","conclusion":"success","name":"Complete job","number":13,"startedAt":"2026-09-04T20:07:12Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33914574263/job/101158646788"},{"completedAt":"2026-09-04T20:07:48Z","conclusion":"success","databaseId":101158646795,"name":"Test Rust (macos-latest)","startedAt":"2026-09-04T20:06:45Z","status":"completed","steps":[{"completedAt":"2026-09-04T20:06:47Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T20:06:46Z","status":"completed"},{"completedAt":"2026-09-04T20:06:49Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T20:06:47Z","status":"completed"},{"completedAt":"2026-09-04T20:06:59Z","conclusion":"success","name":"Setup Rust","number":3,"startedAt":"2026-09-04T20:06:49Z","status":"completed"},{"completedAt":"2026-09-04T20:07:09Z","conclusion":"success","name":"Cache cargo registry","number":4,"startedAt":"2026-09-04T20:06:59Z","status":"completed"},{"completedAt":"2026-09-04T20:07:35Z","conclusion":"success","name":"Run tests","number":5,"startedAt":"2026-09-04T20:07:09Z","status":"completed"},{"completedAt":"2026-09-04T20:07:38Z","conclusion":"success","name":"Run doc tests","number":6,"startedAt":"2026-09-04T20:07:35Z","status":"completed"},{"completedAt":"2026-09-04T20:07:44Z","conclusion":"success","name":"Post Cache cargo registry","number":11,"startedAt":"2026-09-04T20:07:38Z","status":"completed"},{"completedAt":"2026-09-04T20:07:45Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":12,"startedAt":"2026-09-04T20:07:44Z","status":"completed"},{"completedAt":"2026-09-04T20:07:46Z","conclusion":"success","name":"Complete job","number":13,"startedAt":"2026-09-04T20:07:45Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33914574263/job/101158646795"},{"completedAt":"2026-09-04T20:06:37Z","conclusion":"skipped","databaseId":101158647300,"name":"Create Rust changelog PR","startedAt":"2026-09-04T20:06:38Z","status":"completed","steps":[],"url":"https://github.com/link-foundation/command-stream/actions/runs/33914574263/job/101158647300"},{"completedAt":"2026-09-04T20:06:37Z","conclusion":"skipped","databaseId":101158647604,"name":"Instant Rust release","startedAt":"2026-09-04T20:06:38Z","status":"completed","steps":[],"url":"https://github.com/link-foundation/command-stream/actions/runs/33914574263/job/101158647604"},{"completedAt":"2026-09-04T20:06:37Z","conclusion":"skipped","databaseId":101158679874,"name":"Rust changelog fragment check","startedAt":"2026-09-04T20:06:45Z","status":"completed","steps":[],"url":"https://github.com/link-foundation/command-stream/actions/runs/33914574263/job/101158679874"},{"completedAt":"2026-09-04T20:08:57Z","conclusion":"success","databaseId":101159094132,"name":"Build Rust package","startedAt":"2026-09-04T20:08:19Z","status":"completed","steps":[{"completedAt":"2026-09-04T20:08:21Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T20:08:20Z","status":"completed"},{"completedAt":"2026-09-04T20:08:22Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T20:08:21Z","status":"completed"},{"completedAt":"2026-09-04T20:08:32Z","conclusion":"success","name":"Setup Rust","number":3,"startedAt":"2026-09-04T20:08:22Z","status":"completed"},{"completedAt":"2026-09-04T20:08:36Z","conclusion":"success","name":"Cache cargo registry","number":4,"startedAt":"2026-09-04T20:08:32Z","status":"completed"},{"completedAt":"2026-09-04T20:08:49Z","conclusion":"success","name":"Build release","number":5,"startedAt":"2026-09-04T20:08:36Z","status":"completed"},{"completedAt":"2026-09-04T20:08:51Z","conclusion":"success","name":"Check package","number":6,"startedAt":"2026-09-04T20:08:49Z","status":"completed"},{"completedAt":"2026-09-04T20:08:55Z","conclusion":"success","name":"Post Cache cargo registry","number":11,"startedAt":"2026-09-04T20:08:51Z","status":"completed"},{"completedAt":"2026-09-04T20:08:55Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":12,"startedAt":"2026-09-04T20:08:55Z","status":"completed"},{"completedAt":"2026-09-04T20:08:55Z","conclusion":"success","name":"Complete job","number":13,"startedAt":"2026-09-04T20:08:55Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33914574263/job/101159094132"},{"completedAt":"2026-09-04T20:10:58Z","conclusion":"success","databaseId":101159276079,"name":"Release Rust crate","startedAt":"2026-09-04T20:08:59Z","status":"completed","steps":[{"completedAt":"2026-09-04T20:09:01Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T20:09:00Z","status":"completed"},{"completedAt":"2026-09-04T20:09:03Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T20:09:01Z","status":"completed"},{"completedAt":"2026-09-04T20:09:13Z","conclusion":"success","name":"Setup Rust","number":3,"startedAt":"2026-09-04T20:09:03Z","status":"completed"},{"completedAt":"2026-09-04T20:09:49Z","conclusion":"success","name":"Install rust-script","number":4,"startedAt":"2026-09-04T20:09:13Z","status":"completed"},{"completedAt":"2026-09-04T20:09:58Z","conclusion":"success","name":"Determine bump type","number":5,"startedAt":"2026-09-04T20:09:49Z","status":"completed"},{"completedAt":"2026-09-04T20:10:23Z","conclusion":"success","name":"Check whether Rust release is needed","number":6,"startedAt":"2026-09-04T20:09:58Z","status":"completed"},{"completedAt":"2026-09-04T20:10:30Z","conclusion":"success","name":"Version Rust crate and commit to main","number":7,"startedAt":"2026-09-04T20:10:23Z","status":"completed"},{"completedAt":"2026-09-04T20:10:31Z","conclusion":"success","name":"Read Rust release version","number":8,"startedAt":"2026-09-04T20:10:30Z","status":"completed"},{"completedAt":"2026-09-04T20:10:49Z","conclusion":"success","name":"Publish to crates.io","number":9,"startedAt":"2026-09-04T20:10:31Z","status":"completed"},{"completedAt":"2026-09-04T20:10:54Z","conclusion":"success","name":"Create Rust GitHub Release","number":10,"startedAt":"2026-09-04T20:10:49Z","status":"completed"},{"completedAt":"2026-09-04T20:10:55Z","conclusion":"success","name":"Wait for crate availability","number":11,"startedAt":"2026-09-04T20:10:54Z","status":"completed"},{"completedAt":"2026-09-04T20:10:55Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":22,"startedAt":"2026-09-04T20:10:55Z","status":"completed"},{"completedAt":"2026-09-04T20:10:55Z","conclusion":"success","name":"Complete job","number":23,"startedAt":"2026-09-04T20:10:55Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33914574263/job/101159276079"}],"workflowName":"Rust checks and release"} diff --git a/dev/log/issues/199/pulls/200/api/run-33914574283.json b/dev/log/issues/199/pulls/200/api/run-33914574283.json new file mode 100644 index 0000000..96cce22 --- /dev/null +++ b/dev/log/issues/199/pulls/200/api/run-33914574283.json @@ -0,0 +1 @@ +{"conclusion":"failure","createdAt":"2026-09-04T20:06:37Z","databaseId":33914574283,"event":"push","headBranch":"main","headSha":"000dbeab30fd580f07b4d21a73ac40c55ce2e7fc","jobs":[{"completedAt":"2026-09-04T20:06:58Z","conclusion":"success","databaseId":101158646560,"name":"Lint and format JavaScript","startedAt":"2026-09-04T20:06:39Z","status":"completed","steps":[{"completedAt":"2026-09-04T20:06:40Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T20:06:40Z","status":"completed"},{"completedAt":"2026-09-04T20:06:41Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T20:06:40Z","status":"completed"},{"completedAt":"2026-09-04T20:06:43Z","conclusion":"success","name":"Setup Bun","number":3,"startedAt":"2026-09-04T20:06:41Z","status":"completed"},{"completedAt":"2026-09-04T20:06:44Z","conclusion":"success","name":"Install dependencies","number":4,"startedAt":"2026-09-04T20:06:43Z","status":"completed"},{"completedAt":"2026-09-04T20:06:51Z","conclusion":"success","name":"Run ESLint","number":5,"startedAt":"2026-09-04T20:06:44Z","status":"completed"},{"completedAt":"2026-09-04T20:06:55Z","conclusion":"success","name":"Check formatting","number":6,"startedAt":"2026-09-04T20:06:51Z","status":"completed"},{"completedAt":"2026-09-04T20:06:56Z","conclusion":"success","name":"Check code duplication","number":7,"startedAt":"2026-09-04T20:06:55Z","status":"completed"},{"completedAt":"2026-09-04T20:06:56Z","conclusion":"success","name":"Post Setup Bun","number":13,"startedAt":"2026-09-04T20:06:56Z","status":"completed"},{"completedAt":"2026-09-04T20:06:56Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":14,"startedAt":"2026-09-04T20:06:56Z","status":"completed"},{"completedAt":"2026-09-04T20:06:56Z","conclusion":"success","name":"Complete job","number":15,"startedAt":"2026-09-04T20:06:56Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33914574283/job/101158646560"},{"completedAt":"2026-09-04T20:07:38Z","conclusion":"success","databaseId":101158646745,"name":"Test JavaScript (bun on ubuntu-latest)","startedAt":"2026-09-04T20:06:39Z","status":"completed","steps":[{"completedAt":"2026-09-04T20:06:41Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T20:06:40Z","status":"completed"},{"completedAt":"2026-09-04T20:06:42Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T20:06:41Z","status":"completed"},{"completedAt":"2026-09-04T20:06:43Z","conclusion":"success","name":"Setup Bun","number":3,"startedAt":"2026-09-04T20:06:42Z","status":"completed"},{"completedAt":"2026-09-04T20:06:44Z","conclusion":"success","name":"Setup Node.js PTY host","number":4,"startedAt":"2026-09-04T20:06:43Z","status":"completed"},{"completedAt":"2026-09-04T20:06:50Z","conclusion":"success","name":"Install system dependencies (Ubuntu)","number":5,"startedAt":"2026-09-04T20:06:44Z","status":"completed"},{"completedAt":"2026-09-04T20:06:50Z","conclusion":"skipped","name":"Install system dependencies (macOS)","number":6,"startedAt":"2026-09-04T20:06:50Z","status":"completed"},{"completedAt":"2026-09-04T20:06:50Z","conclusion":"skipped","name":"Install system dependencies (Windows)","number":7,"startedAt":"2026-09-04T20:06:50Z","status":"completed"},{"completedAt":"2026-09-04T20:06:50Z","conclusion":"success","name":"Install dependencies (Bun)","number":8,"startedAt":"2026-09-04T20:06:50Z","status":"completed"},{"completedAt":"2026-09-04T20:07:36Z","conclusion":"success","name":"Run tests (Bun)","number":9,"startedAt":"2026-09-04T20:06:50Z","status":"completed"},{"completedAt":"2026-09-04T20:07:36Z","conclusion":"skipped","name":"Setup Node.js","number":10,"startedAt":"2026-09-04T20:07:36Z","status":"completed"},{"completedAt":"2026-09-04T20:07:36Z","conclusion":"skipped","name":"Install dependencies (Node)","number":11,"startedAt":"2026-09-04T20:07:36Z","status":"completed"},{"completedAt":"2026-09-04T20:07:36Z","conclusion":"skipped","name":"Test Node.js compatibility","number":12,"startedAt":"2026-09-04T20:07:36Z","status":"completed"},{"completedAt":"2026-09-04T20:07:36Z","conclusion":"success","name":"Post Setup Node.js PTY host","number":22,"startedAt":"2026-09-04T20:07:36Z","status":"completed"},{"completedAt":"2026-09-04T20:07:37Z","conclusion":"success","name":"Post Setup Bun","number":23,"startedAt":"2026-09-04T20:07:36Z","status":"completed"},{"completedAt":"2026-09-04T20:07:37Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":24,"startedAt":"2026-09-04T20:07:37Z","status":"completed"},{"completedAt":"2026-09-04T20:07:37Z","conclusion":"success","name":"Complete job","number":25,"startedAt":"2026-09-04T20:07:37Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33914574283/job/101158646745"},{"completedAt":"2026-09-04T20:07:57Z","conclusion":"success","databaseId":101158646852,"name":"Test JavaScript (bun on windows-latest)","startedAt":"2026-09-04T20:06:39Z","status":"completed","steps":[{"completedAt":"2026-09-04T20:06:41Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T20:06:40Z","status":"completed"},{"completedAt":"2026-09-04T20:06:47Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T20:06:41Z","status":"completed"},{"completedAt":"2026-09-04T20:06:50Z","conclusion":"success","name":"Setup Bun","number":3,"startedAt":"2026-09-04T20:06:47Z","status":"completed"},{"completedAt":"2026-09-04T20:06:56Z","conclusion":"success","name":"Setup Node.js PTY host","number":4,"startedAt":"2026-09-04T20:06:50Z","status":"completed"},{"completedAt":"2026-09-04T20:06:56Z","conclusion":"skipped","name":"Install system dependencies (Ubuntu)","number":5,"startedAt":"2026-09-04T20:06:56Z","status":"completed"},{"completedAt":"2026-09-04T20:06:56Z","conclusion":"skipped","name":"Install system dependencies (macOS)","number":6,"startedAt":"2026-09-04T20:06:56Z","status":"completed"},{"completedAt":"2026-09-04T20:07:03Z","conclusion":"success","name":"Install system dependencies (Windows)","number":7,"startedAt":"2026-09-04T20:06:56Z","status":"completed"},{"completedAt":"2026-09-04T20:07:15Z","conclusion":"success","name":"Install dependencies (Bun)","number":8,"startedAt":"2026-09-04T20:07:03Z","status":"completed"},{"completedAt":"2026-09-04T20:07:53Z","conclusion":"success","name":"Run tests (Bun)","number":9,"startedAt":"2026-09-04T20:07:15Z","status":"completed"},{"completedAt":"2026-09-04T20:07:53Z","conclusion":"skipped","name":"Setup Node.js","number":10,"startedAt":"2026-09-04T20:07:53Z","status":"completed"},{"completedAt":"2026-09-04T20:07:53Z","conclusion":"skipped","name":"Install dependencies (Node)","number":11,"startedAt":"2026-09-04T20:07:53Z","status":"completed"},{"completedAt":"2026-09-04T20:07:53Z","conclusion":"skipped","name":"Test Node.js compatibility","number":12,"startedAt":"2026-09-04T20:07:53Z","status":"completed"},{"completedAt":"2026-09-04T20:07:53Z","conclusion":"success","name":"Post Setup Node.js PTY host","number":22,"startedAt":"2026-09-04T20:07:53Z","status":"completed"},{"completedAt":"2026-09-04T20:07:53Z","conclusion":"success","name":"Post Setup Bun","number":23,"startedAt":"2026-09-04T20:07:53Z","status":"completed"},{"completedAt":"2026-09-04T20:07:56Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":24,"startedAt":"2026-09-04T20:07:53Z","status":"completed"},{"completedAt":"2026-09-04T20:07:56Z","conclusion":"success","name":"Complete job","number":25,"startedAt":"2026-09-04T20:07:56Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33914574283/job/101158646852"},{"completedAt":"2026-09-04T20:06:56Z","conclusion":"success","databaseId":101158646917,"name":"Test JavaScript (node on ubuntu-latest)","startedAt":"2026-09-04T20:06:39Z","status":"completed","steps":[{"completedAt":"2026-09-04T20:06:42Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T20:06:40Z","status":"completed"},{"completedAt":"2026-09-04T20:06:43Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T20:06:42Z","status":"completed"},{"completedAt":"2026-09-04T20:06:43Z","conclusion":"skipped","name":"Setup Bun","number":3,"startedAt":"2026-09-04T20:06:43Z","status":"completed"},{"completedAt":"2026-09-04T20:06:43Z","conclusion":"skipped","name":"Setup Node.js PTY host","number":4,"startedAt":"2026-09-04T20:06:43Z","status":"completed"},{"completedAt":"2026-09-04T20:06:49Z","conclusion":"success","name":"Install system dependencies (Ubuntu)","number":5,"startedAt":"2026-09-04T20:06:43Z","status":"completed"},{"completedAt":"2026-09-04T20:06:49Z","conclusion":"skipped","name":"Install system dependencies (macOS)","number":6,"startedAt":"2026-09-04T20:06:49Z","status":"completed"},{"completedAt":"2026-09-04T20:06:49Z","conclusion":"skipped","name":"Install system dependencies (Windows)","number":7,"startedAt":"2026-09-04T20:06:49Z","status":"completed"},{"completedAt":"2026-09-04T20:06:49Z","conclusion":"skipped","name":"Install dependencies (Bun)","number":8,"startedAt":"2026-09-04T20:06:49Z","status":"completed"},{"completedAt":"2026-09-04T20:06:49Z","conclusion":"skipped","name":"Run tests (Bun)","number":9,"startedAt":"2026-09-04T20:06:49Z","status":"completed"},{"completedAt":"2026-09-04T20:06:49Z","conclusion":"success","name":"Setup Node.js","number":10,"startedAt":"2026-09-04T20:06:49Z","status":"completed"},{"completedAt":"2026-09-04T20:06:53Z","conclusion":"success","name":"Install dependencies (Node)","number":11,"startedAt":"2026-09-04T20:06:49Z","status":"completed"},{"completedAt":"2026-09-04T20:06:54Z","conclusion":"success","name":"Test Node.js compatibility","number":12,"startedAt":"2026-09-04T20:06:53Z","status":"completed"},{"completedAt":"2026-09-04T20:06:54Z","conclusion":"success","name":"Post Setup Node.js","number":23,"startedAt":"2026-09-04T20:06:54Z","status":"completed"},{"completedAt":"2026-09-04T20:06:54Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":24,"startedAt":"2026-09-04T20:06:54Z","status":"completed"},{"completedAt":"2026-09-04T20:06:54Z","conclusion":"success","name":"Complete job","number":25,"startedAt":"2026-09-04T20:06:54Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33914574283/job/101158646917"},{"completedAt":"2026-09-04T20:07:12Z","conclusion":"success","databaseId":101158646956,"name":"Test JavaScript (node on ubuntu-latest)","startedAt":"2026-09-04T20:06:40Z","status":"completed","steps":[{"completedAt":"2026-09-04T20:06:44Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T20:06:41Z","status":"completed"},{"completedAt":"2026-09-04T20:06:46Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T20:06:44Z","status":"completed"},{"completedAt":"2026-09-04T20:06:46Z","conclusion":"skipped","name":"Setup Bun","number":3,"startedAt":"2026-09-04T20:06:46Z","status":"completed"},{"completedAt":"2026-09-04T20:06:46Z","conclusion":"skipped","name":"Setup Node.js PTY host","number":4,"startedAt":"2026-09-04T20:06:46Z","status":"completed"},{"completedAt":"2026-09-04T20:06:55Z","conclusion":"success","name":"Install system dependencies (Ubuntu)","number":5,"startedAt":"2026-09-04T20:06:46Z","status":"completed"},{"completedAt":"2026-09-04T20:06:55Z","conclusion":"skipped","name":"Install system dependencies (macOS)","number":6,"startedAt":"2026-09-04T20:06:55Z","status":"completed"},{"completedAt":"2026-09-04T20:06:55Z","conclusion":"skipped","name":"Install system dependencies (Windows)","number":7,"startedAt":"2026-09-04T20:06:55Z","status":"completed"},{"completedAt":"2026-09-04T20:06:55Z","conclusion":"skipped","name":"Install dependencies (Bun)","number":8,"startedAt":"2026-09-04T20:06:55Z","status":"completed"},{"completedAt":"2026-09-04T20:06:55Z","conclusion":"skipped","name":"Run tests (Bun)","number":9,"startedAt":"2026-09-04T20:06:55Z","status":"completed"},{"completedAt":"2026-09-04T20:07:01Z","conclusion":"success","name":"Setup Node.js","number":10,"startedAt":"2026-09-04T20:06:55Z","status":"completed"},{"completedAt":"2026-09-04T20:07:06Z","conclusion":"success","name":"Install dependencies (Node)","number":11,"startedAt":"2026-09-04T20:07:01Z","status":"completed"},{"completedAt":"2026-09-04T20:07:09Z","conclusion":"success","name":"Test Node.js compatibility","number":12,"startedAt":"2026-09-04T20:07:06Z","status":"completed"},{"completedAt":"2026-09-04T20:07:09Z","conclusion":"success","name":"Post Setup Node.js","number":23,"startedAt":"2026-09-04T20:07:09Z","status":"completed"},{"completedAt":"2026-09-04T20:07:10Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":24,"startedAt":"2026-09-04T20:07:09Z","status":"completed"},{"completedAt":"2026-09-04T20:07:10Z","conclusion":"success","name":"Complete job","number":25,"startedAt":"2026-09-04T20:07:10Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33914574283/job/101158646956"},{"completedAt":"2026-09-04T20:08:06Z","conclusion":"success","databaseId":101158646970,"name":"Test JavaScript (bun on macos-latest)","startedAt":"2026-09-04T20:06:40Z","status":"completed","steps":[{"completedAt":"2026-09-04T20:06:42Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T20:06:41Z","status":"completed"},{"completedAt":"2026-09-04T20:06:44Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T20:06:42Z","status":"completed"},{"completedAt":"2026-09-04T20:06:46Z","conclusion":"success","name":"Setup Bun","number":3,"startedAt":"2026-09-04T20:06:44Z","status":"completed"},{"completedAt":"2026-09-04T20:06:48Z","conclusion":"success","name":"Setup Node.js PTY host","number":4,"startedAt":"2026-09-04T20:06:46Z","status":"completed"},{"completedAt":"2026-09-04T20:06:48Z","conclusion":"skipped","name":"Install system dependencies (Ubuntu)","number":5,"startedAt":"2026-09-04T20:06:48Z","status":"completed"},{"completedAt":"2026-09-04T20:06:51Z","conclusion":"success","name":"Install system dependencies (macOS)","number":6,"startedAt":"2026-09-04T20:06:48Z","status":"completed"},{"completedAt":"2026-09-04T20:06:51Z","conclusion":"skipped","name":"Install system dependencies (Windows)","number":7,"startedAt":"2026-09-04T20:06:51Z","status":"completed"},{"completedAt":"2026-09-04T20:06:52Z","conclusion":"success","name":"Install dependencies (Bun)","number":8,"startedAt":"2026-09-04T20:06:51Z","status":"completed"},{"completedAt":"2026-09-04T20:08:02Z","conclusion":"success","name":"Run tests (Bun)","number":9,"startedAt":"2026-09-04T20:06:52Z","status":"completed"},{"completedAt":"2026-09-04T20:08:02Z","conclusion":"skipped","name":"Setup Node.js","number":10,"startedAt":"2026-09-04T20:08:02Z","status":"completed"},{"completedAt":"2026-09-04T20:08:02Z","conclusion":"skipped","name":"Install dependencies (Node)","number":11,"startedAt":"2026-09-04T20:08:02Z","status":"completed"},{"completedAt":"2026-09-04T20:08:02Z","conclusion":"skipped","name":"Test Node.js compatibility","number":12,"startedAt":"2026-09-04T20:08:02Z","status":"completed"},{"completedAt":"2026-09-04T20:08:02Z","conclusion":"success","name":"Post Setup Node.js PTY host","number":22,"startedAt":"2026-09-04T20:08:02Z","status":"completed"},{"completedAt":"2026-09-04T20:08:03Z","conclusion":"success","name":"Post Setup Bun","number":23,"startedAt":"2026-09-04T20:08:02Z","status":"completed"},{"completedAt":"2026-09-04T20:08:03Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":24,"startedAt":"2026-09-04T20:08:03Z","status":"completed"},{"completedAt":"2026-09-04T20:08:04Z","conclusion":"success","name":"Complete job","number":25,"startedAt":"2026-09-04T20:08:03Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33914574283/job/101158646970"},{"completedAt":"2026-09-04T20:07:01Z","conclusion":"success","databaseId":101158647093,"name":"Test JavaScript (node on ubuntu-latest)","startedAt":"2026-09-04T20:06:40Z","status":"completed","steps":[{"completedAt":"2026-09-04T20:06:43Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T20:06:42Z","status":"completed"},{"completedAt":"2026-09-04T20:06:45Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T20:06:43Z","status":"completed"},{"completedAt":"2026-09-04T20:06:45Z","conclusion":"skipped","name":"Setup Bun","number":3,"startedAt":"2026-09-04T20:06:45Z","status":"completed"},{"completedAt":"2026-09-04T20:06:45Z","conclusion":"skipped","name":"Setup Node.js PTY host","number":4,"startedAt":"2026-09-04T20:06:45Z","status":"completed"},{"completedAt":"2026-09-04T20:06:50Z","conclusion":"success","name":"Install system dependencies (Ubuntu)","number":5,"startedAt":"2026-09-04T20:06:45Z","status":"completed"},{"completedAt":"2026-09-04T20:06:50Z","conclusion":"skipped","name":"Install system dependencies (macOS)","number":6,"startedAt":"2026-09-04T20:06:50Z","status":"completed"},{"completedAt":"2026-09-04T20:06:50Z","conclusion":"skipped","name":"Install system dependencies (Windows)","number":7,"startedAt":"2026-09-04T20:06:50Z","status":"completed"},{"completedAt":"2026-09-04T20:06:50Z","conclusion":"skipped","name":"Install dependencies (Bun)","number":8,"startedAt":"2026-09-04T20:06:50Z","status":"completed"},{"completedAt":"2026-09-04T20:06:50Z","conclusion":"skipped","name":"Run tests (Bun)","number":9,"startedAt":"2026-09-04T20:06:50Z","status":"completed"},{"completedAt":"2026-09-04T20:06:51Z","conclusion":"success","name":"Setup Node.js","number":10,"startedAt":"2026-09-04T20:06:50Z","status":"completed"},{"completedAt":"2026-09-04T20:06:57Z","conclusion":"success","name":"Install dependencies (Node)","number":11,"startedAt":"2026-09-04T20:06:51Z","status":"completed"},{"completedAt":"2026-09-04T20:06:58Z","conclusion":"success","name":"Test Node.js compatibility","number":12,"startedAt":"2026-09-04T20:06:57Z","status":"completed"},{"completedAt":"2026-09-04T20:06:59Z","conclusion":"success","name":"Post Setup Node.js","number":23,"startedAt":"2026-09-04T20:06:58Z","status":"completed"},{"completedAt":"2026-09-04T20:06:59Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":24,"startedAt":"2026-09-04T20:06:59Z","status":"completed"},{"completedAt":"2026-09-04T20:06:59Z","conclusion":"success","name":"Complete job","number":25,"startedAt":"2026-09-04T20:06:59Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33914574283/job/101158647093"},{"completedAt":"2026-09-04T20:06:37Z","conclusion":"skipped","databaseId":101158647419,"name":"Check for JavaScript changesets","startedAt":"2026-09-04T20:06:38Z","status":"completed","steps":[],"url":"https://github.com/link-foundation/command-stream/actions/runs/33914574283/job/101158647419"},{"completedAt":"2026-09-04T20:06:37Z","conclusion":"skipped","databaseId":101158647639,"name":"Create JavaScript changeset PR","startedAt":"2026-09-04T20:06:38Z","status":"completed","steps":[],"url":"https://github.com/link-foundation/command-stream/actions/runs/33914574283/job/101158647639"},{"completedAt":"2026-09-04T20:06:37Z","conclusion":"skipped","databaseId":101158672537,"name":"Instant JavaScript release","startedAt":"2026-09-04T20:06:43Z","status":"completed","steps":[],"url":"https://github.com/link-foundation/command-stream/actions/runs/33914574283/job/101158672537"},{"completedAt":"2026-09-04T20:09:12Z","conclusion":"failure","databaseId":101159049363,"name":"Release JavaScript package","startedAt":"2026-09-04T20:08:11Z","status":"completed","steps":[{"completedAt":"2026-09-04T20:08:13Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-09-04T20:08:12Z","status":"completed"},{"completedAt":"2026-09-04T20:08:15Z","conclusion":"success","name":"Run actions/checkout@v6","number":2,"startedAt":"2026-09-04T20:08:13Z","status":"completed"},{"completedAt":"2026-09-04T20:08:16Z","conclusion":"success","name":"Setup Node.js","number":3,"startedAt":"2026-09-04T20:08:15Z","status":"completed"},{"completedAt":"2026-09-04T20:08:17Z","conclusion":"success","name":"Setup Bun","number":4,"startedAt":"2026-09-04T20:08:16Z","status":"completed"},{"completedAt":"2026-09-04T20:08:18Z","conclusion":"success","name":"Install dependencies","number":5,"startedAt":"2026-09-04T20:08:17Z","status":"completed"},{"completedAt":"2026-09-04T20:08:23Z","conclusion":"success","name":"Update npm for OIDC trusted publishing","number":6,"startedAt":"2026-09-04T20:08:18Z","status":"completed"},{"completedAt":"2026-09-04T20:08:23Z","conclusion":"success","name":"Check for changesets","number":7,"startedAt":"2026-09-04T20:08:23Z","status":"completed"},{"completedAt":"2026-09-04T20:08:24Z","conclusion":"success","name":"Check if release is needed","number":8,"startedAt":"2026-09-04T20:08:23Z","status":"completed"},{"completedAt":"2026-09-04T20:08:24Z","conclusion":"skipped","name":"Merge multiple changesets","number":9,"startedAt":"2026-09-04T20:08:24Z","status":"completed"},{"completedAt":"2026-09-04T20:08:29Z","conclusion":"success","name":"Version package and commit to main","number":10,"startedAt":"2026-09-04T20:08:24Z","status":"completed"},{"completedAt":"2026-09-04T20:09:09Z","conclusion":"failure","name":"Publish to npm","number":11,"startedAt":"2026-09-04T20:08:29Z","status":"completed"},{"completedAt":"2026-09-04T20:09:09Z","conclusion":"skipped","name":"Create JavaScript GitHub Release","number":12,"startedAt":"2026-09-04T20:09:09Z","status":"completed"},{"completedAt":"2026-09-04T20:09:09Z","conclusion":"skipped","name":"Format JavaScript GitHub release notes","number":13,"startedAt":"2026-09-04T20:09:09Z","status":"completed"},{"completedAt":"2026-09-04T20:09:09Z","conclusion":"skipped","name":"Verify npm availability","number":14,"startedAt":"2026-09-04T20:09:09Z","status":"completed"},{"completedAt":"2026-09-04T20:09:09Z","conclusion":"skipped","name":"Post Setup Bun","number":26,"startedAt":"2026-09-04T20:09:09Z","status":"completed"},{"completedAt":"2026-09-04T20:09:09Z","conclusion":"skipped","name":"Post Setup Node.js","number":27,"startedAt":"2026-09-04T20:09:09Z","status":"completed"},{"completedAt":"2026-09-04T20:09:09Z","conclusion":"success","name":"Post Run actions/checkout@v6","number":28,"startedAt":"2026-09-04T20:09:09Z","status":"completed"},{"completedAt":"2026-09-04T20:09:09Z","conclusion":"success","name":"Complete job","number":29,"startedAt":"2026-09-04T20:09:09Z","status":"completed"}],"url":"https://github.com/link-foundation/command-stream/actions/runs/33914574283/job/101159049363"}],"workflowName":"JavaScript checks and release"} diff --git a/dev/log/issues/199/pulls/200/api/runs-recent.json b/dev/log/issues/199/pulls/200/api/runs-recent.json new file mode 100644 index 0000000..c1e5937 --- /dev/null +++ b/dev/log/issues/199/pulls/200/api/runs-recent.json @@ -0,0 +1 @@ +[{"conclusion":"success","createdAt":"2026-09-04T20:28:41Z","databaseId":33916414387,"event":"pull_request","headBranch":"issue-199-32c07917fc87","headSha":"f1bb99c1badb81cc574ec3aa5054e7a086f47ba7","name":"Language parity check","status":"completed","workflowName":"Language parity check"},{"conclusion":"failure","createdAt":"2026-09-04T20:06:37Z","databaseId":33914574283,"event":"push","headBranch":"main","headSha":"000dbeab30fd580f07b4d21a73ac40c55ce2e7fc","name":"JavaScript checks and release","status":"completed","workflowName":"JavaScript checks and release"},{"conclusion":"success","createdAt":"2026-09-04T20:06:37Z","databaseId":33914574263,"event":"push","headBranch":"main","headSha":"000dbeab30fd580f07b4d21a73ac40c55ce2e7fc","name":"Rust checks and release","status":"completed","workflowName":"Rust checks and release"},{"conclusion":"success","createdAt":"2026-09-04T19:52:29Z","databaseId":33913378539,"event":"pull_request","headBranch":"issue-197-b748bb92cd2d","headSha":"6027b7fd3c25055597cc3d44f7945da02a2d6251","name":"JavaScript checks and release","status":"completed","workflowName":"JavaScript checks and release"},{"conclusion":"success","createdAt":"2026-09-04T19:52:28Z","databaseId":33913378338,"event":"pull_request","headBranch":"issue-197-b748bb92cd2d","headSha":"6027b7fd3c25055597cc3d44f7945da02a2d6251","name":"Language parity check","status":"completed","workflowName":"Language parity check"},{"conclusion":"success","createdAt":"2026-09-04T19:52:28Z","databaseId":33913378273,"event":"pull_request","headBranch":"issue-197-b748bb92cd2d","headSha":"6027b7fd3c25055597cc3d44f7945da02a2d6251","name":"Rust checks and release","status":"completed","workflowName":"Rust checks and release"},{"conclusion":"success","createdAt":"2026-09-04T19:32:11Z","databaseId":33911660948,"event":"pull_request","headBranch":"issue-197-b748bb92cd2d","headSha":"f9bf3decd6e9f52f5928777050e97439adc03b10","name":"Language parity check","status":"completed","workflowName":"Language parity check"},{"conclusion":"failure","createdAt":"2026-09-04T19:32:11Z","databaseId":33911660947,"event":"pull_request","headBranch":"issue-197-b748bb92cd2d","headSha":"f9bf3decd6e9f52f5928777050e97439adc03b10","name":"JavaScript checks and release","status":"completed","workflowName":"JavaScript checks and release"},{"conclusion":"failure","createdAt":"2026-09-04T19:32:11Z","databaseId":33911660942,"event":"pull_request","headBranch":"issue-197-b748bb92cd2d","headSha":"f9bf3decd6e9f52f5928777050e97439adc03b10","name":"Rust checks and release","status":"completed","workflowName":"Rust checks and release"},{"conclusion":"failure","createdAt":"2026-09-04T19:15:06Z","databaseId":33910180769,"event":"pull_request","headBranch":"issue-197-b748bb92cd2d","headSha":"e6a3eef7a59135824f249871756fae5c9aac872e","name":"Rust checks and release","status":"completed","workflowName":"Rust checks and release"},{"conclusion":"success","createdAt":"2026-09-04T19:15:05Z","databaseId":33910180425,"event":"pull_request","headBranch":"issue-197-b748bb92cd2d","headSha":"e6a3eef7a59135824f249871756fae5c9aac872e","name":"Language parity check","status":"completed","workflowName":"Language parity check"},{"conclusion":"failure","createdAt":"2026-09-04T19:15:05Z","databaseId":33910180248,"event":"pull_request","headBranch":"issue-197-b748bb92cd2d","headSha":"e6a3eef7a59135824f249871756fae5c9aac872e","name":"JavaScript checks and release","status":"completed","workflowName":"JavaScript checks and release"},{"conclusion":"success","createdAt":"2026-09-04T16:59:31Z","databaseId":33898153785,"event":"pull_request","headBranch":"issue-197-b748bb92cd2d","headSha":"7b39dd098f11d09b03f0c7643a8d393348d44b1f","name":"Language parity check","status":"completed","workflowName":"Language parity check"},{"conclusion":"success","createdAt":"2026-09-04T16:54:18Z","databaseId":33897699303,"event":"push","headBranch":"main","headSha":"7e2b7018494b9ad9129391829a7abd5e4d085228","name":"Rust checks and release","status":"completed","workflowName":"Rust checks and release"},{"conclusion":"failure","createdAt":"2026-09-04T16:54:18Z","databaseId":33897699209,"event":"push","headBranch":"main","headSha":"7e2b7018494b9ad9129391829a7abd5e4d085228","name":"JavaScript checks and release","status":"completed","workflowName":"JavaScript checks and release"},{"conclusion":"success","createdAt":"2026-09-04T16:46:58Z","databaseId":33897043761,"event":"pull_request","headBranch":"issue-49-08e57741","headSha":"9042b5d030e6d7c6274aca09ed3ebb1503cb27dd","name":"Language parity check","status":"completed","workflowName":"Language parity check"},{"conclusion":"success","createdAt":"2026-09-04T16:46:57Z","databaseId":33897043609,"event":"pull_request","headBranch":"issue-49-08e57741","headSha":"9042b5d030e6d7c6274aca09ed3ebb1503cb27dd","name":"JavaScript checks and release","status":"completed","workflowName":"JavaScript checks and release"},{"conclusion":"success","createdAt":"2026-09-04T16:46:57Z","databaseId":33897043480,"event":"pull_request","headBranch":"issue-49-08e57741","headSha":"9042b5d030e6d7c6274aca09ed3ebb1503cb27dd","name":"Rust checks and release","status":"completed","workflowName":"Rust checks and release"},{"conclusion":"success","createdAt":"2026-08-11T11:26:02Z","databaseId":31486604993,"event":"push","headBranch":"main","headSha":"3b21e7642d86e4fe24c7bd471af425756886d9f0","name":"JavaScript checks and release","status":"completed","workflowName":"JavaScript checks and release"},{"conclusion":"skipped","createdAt":"2026-08-11T11:20:35Z","databaseId":31486196661,"event":"pull_request","headBranch":"issue-189-a73113905acf","headSha":"95184683d13aef0074e15c890e7d36fad8c9567a","name":"Language parity check","status":"completed","workflowName":"Language parity check"},{"conclusion":"success","createdAt":"2026-08-11T11:20:35Z","databaseId":31486196636,"event":"pull_request","headBranch":"issue-189-a73113905acf","headSha":"95184683d13aef0074e15c890e7d36fad8c9567a","name":"JavaScript checks and release","status":"completed","workflowName":"JavaScript checks and release"},{"conclusion":"success","createdAt":"2026-08-11T11:18:00Z","databaseId":31486007677,"event":"push","headBranch":"main","headSha":"391535afa9d8a73213fb05fa4c2dfb601a7b0fa8","name":"Rust checks and release","status":"completed","workflowName":"Rust checks and release"},{"conclusion":"success","createdAt":"2026-08-11T11:11:20Z","databaseId":31485514037,"event":"pull_request","headBranch":"issue-190-3191ec24d668","headSha":"cc7d6b7df2b974bb1ac18a3e4863ba1865e1a992","name":"Rust checks and release","status":"completed","workflowName":"Rust checks and release"},{"conclusion":"skipped","createdAt":"2026-08-11T11:11:20Z","databaseId":31485514025,"event":"pull_request","headBranch":"issue-190-3191ec24d668","headSha":"cc7d6b7df2b974bb1ac18a3e4863ba1865e1a992","name":"Language parity check","status":"completed","workflowName":"Language parity check"},{"conclusion":"skipped","createdAt":"2026-08-11T11:06:41Z","databaseId":31485168814,"event":"pull_request","headBranch":"issue-190-3191ec24d668","headSha":"e122cc04ff1bdcaee970a34f03c6bc9ed484b796","name":"Language parity check","status":"completed","workflowName":"Language parity check"},{"conclusion":"success","createdAt":"2026-08-11T11:06:41Z","databaseId":31485168809,"event":"pull_request","headBranch":"issue-190-3191ec24d668","headSha":"e122cc04ff1bdcaee970a34f03c6bc9ed484b796","name":"Rust checks and release","status":"completed","workflowName":"Rust checks and release"},{"conclusion":"success","createdAt":"2026-08-11T11:02:20Z","databaseId":31484840295,"event":"push","headBranch":"main","headSha":"ba87d0c6399cd6cd1c10825a9aec53b38b44b531","name":"JavaScript checks and release","status":"completed","workflowName":"JavaScript checks and release"},{"conclusion":"skipped","createdAt":"2026-08-11T11:01:10Z","databaseId":31484756228,"event":"pull_request","headBranch":"issue-190-3191ec24d668","headSha":"2fe1ed3e20eafa3064f8479dcea733bdf06b0480","name":"Language parity check","status":"completed","workflowName":"Language parity check"},{"conclusion":"cancelled","createdAt":"2026-08-11T11:00:48Z","databaseId":31484727690,"event":"pull_request","headBranch":"issue-190-3191ec24d668","headSha":"2fe1ed3e20eafa3064f8479dcea733bdf06b0480","name":"Language parity check","status":"completed","workflowName":"Language parity check"},{"conclusion":"success","createdAt":"2026-08-11T11:00:48Z","databaseId":31484727626,"event":"pull_request","headBranch":"issue-190-3191ec24d668","headSha":"2fe1ed3e20eafa3064f8479dcea733bdf06b0480","name":"Rust checks and release","status":"completed","workflowName":"Rust checks and release"},{"conclusion":"success","createdAt":"2026-08-11T10:55:21Z","databaseId":31484329550,"event":"pull_request","headBranch":"issue-191-70b38becaee6","headSha":"0130712acc64c6b7101f977ade58d97a4498ed77","name":"JavaScript checks and release","status":"completed","workflowName":"JavaScript checks and release"},{"conclusion":"skipped","createdAt":"2026-08-11T10:55:21Z","databaseId":31484329538,"event":"pull_request","headBranch":"issue-191-70b38becaee6","headSha":"0130712acc64c6b7101f977ade58d97a4498ed77","name":"Language parity check","status":"completed","workflowName":"Language parity check"},{"conclusion":"skipped","createdAt":"2026-08-11T10:52:28Z","databaseId":31484124092,"event":"pull_request","headBranch":"issue-191-70b38becaee6","headSha":"189920ffb51d0b0c1af8e001efde3dbd9dc7a7a5","name":"Language parity check","status":"completed","workflowName":"Language parity check"},{"conclusion":"success","createdAt":"2026-08-11T10:52:28Z","databaseId":31484124080,"event":"pull_request","headBranch":"issue-191-70b38becaee6","headSha":"189920ffb51d0b0c1af8e001efde3dbd9dc7a7a5","name":"JavaScript checks and release","status":"completed","workflowName":"JavaScript checks and release"},{"conclusion":"success","createdAt":"2026-08-11T10:42:40Z","databaseId":31483409297,"event":"pull_request","headBranch":"issue-190-3191ec24d668","headSha":"71178552016d2879274a60b0447f92c8ddcd5a2f","name":"Language parity check","status":"completed","workflowName":"Language parity check"},{"conclusion":"skipped","createdAt":"2026-08-11T10:41:49Z","databaseId":31483350432,"event":"pull_request","headBranch":"issue-191-70b38becaee6","headSha":"2d67d773fe0bc108a4d2b5efc4f0e9c15411a57e","name":"Language parity check","status":"completed","workflowName":"Language parity check"},{"conclusion":"failure","createdAt":"2026-08-11T10:41:12Z","databaseId":31483304571,"event":"pull_request","headBranch":"issue-191-70b38becaee6","headSha":"2d67d773fe0bc108a4d2b5efc4f0e9c15411a57e","name":"Language parity check","status":"completed","workflowName":"Language parity check"},{"conclusion":"failure","createdAt":"2026-08-11T10:41:12Z","databaseId":31483304561,"event":"pull_request","headBranch":"issue-191-70b38becaee6","headSha":"2d67d773fe0bc108a4d2b5efc4f0e9c15411a57e","name":"JavaScript checks and release","status":"completed","workflowName":"JavaScript checks and release"},{"conclusion":"success","createdAt":"2026-08-11T10:24:37Z","databaseId":31482070648,"event":"push","headBranch":"main","headSha":"e43ba26cbd43f6976c7bba6b2dde510b42c7f0a6","name":"JavaScript checks and release","status":"completed","workflowName":"JavaScript checks and release"},{"conclusion":"success","createdAt":"2026-08-11T10:18:17Z","databaseId":31481606311,"event":"pull_request","headBranch":"issue-192-3752acabac90","headSha":"8bad68c2b0ed6f52e40c4507eb348725f4d76838","name":"JavaScript checks and release","status":"completed","workflowName":"JavaScript checks and release"}] diff --git a/dev/log/issues/199/pulls/200/templates/CI-CD-BEST-PRACTICES.md b/dev/log/issues/199/pulls/200/templates/CI-CD-BEST-PRACTICES.md new file mode 100644 index 0000000..2b57fb2 --- /dev/null +++ b/dev/log/issues/199/pulls/200/templates/CI-CD-BEST-PRACTICES.md @@ -0,0 +1,469 @@ +# CI/CD Best Practices for AI-Driven Development (languages: en β€’ [zh](CI-CD-BEST-PRACTICES.zh.md) β€’ [hi](CI-CD-BEST-PRACTICES.hi.md) β€’ [ru](CI-CD-BEST-PRACTICES.ru.md)) + +This document describes CI/CD best practices that significantly improve the quality and reliability of AI-driven development workflows. When properly configured, Hive Mind AI solvers are forced to iterate with CI/CD checks until all tests pass, ensuring code quality meets the highest standards. + +## Why CI/CD Matters for AI Development + +Hive Mind's AI issue solver is instructed to pay attention to CI/CD checks in each pull request. This creates a powerful feedback loop: + +1. **AI creates a solution** - The solver generates code based on issue requirements +2. **CI/CD validates the solution** - Automated checks verify code quality +3. **AI iterates until passing** - The solver fixes issues until all checks pass +4. **Quality is guaranteed** - No code merges without passing all gates + +This approach ensures consistent quality regardless of whether the team consists of humans, AIs, or both. + +## Recommended CI/CD Templates + +We provide ready-to-use templates for multiple languages with all best practices pre-configured: + +| Language | Template Repository | +| --------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | +| JavaScript/TypeScript | [js-ai-driven-development-pipeline-template](https://github.com/link-foundation/js-ai-driven-development-pipeline-template) | +| Rust | [rust-ai-driven-development-pipeline-template](https://github.com/link-foundation/rust-ai-driven-development-pipeline-template) | +| Python | [python-ai-driven-development-pipeline-template](https://github.com/link-foundation/python-ai-driven-development-pipeline-template) | +| Go | [go-ai-driven-development-pipeline-template](https://github.com/link-foundation/go-ai-driven-development-pipeline-template) | +| C# | [csharp-ai-driven-development-pipeline-template](https://github.com/link-foundation/csharp-ai-driven-development-pipeline-template) | +| Java | [java-ai-driven-development-pipeline-template](https://github.com/link-foundation/java-ai-driven-development-pipeline-template) | +| PHP | [php-ai-driven-development-pipeline-template](https://github.com/link-foundation/php-ai-driven-development-pipeline-template) | + +> **Tip:** You don't have to pick a template by hand. Run `fix --ci-cd` (see [Automatic CI/CD Remediation](#automatic-cicd-remediation)) and Hive Mind detects the repository's languages and selects the matching templates for you. + +## Key CI/CD Principles + +### 1. Run Checks Only on Relevant File Changes + +**Only trigger checks when relevant files change.** This dramatically reduces CI costs and run times. + +Use a `detect-changes` job at the start of your workflow to determine which file categories changed: + +```yaml +jobs: + detect-changes: + runs-on: ubuntu-latest + outputs: + code-changed: ${{ steps.changes.outputs.code }} + docs-changed: ${{ steps.changes.outputs.docs }} + docker-changed: ${{ steps.changes.outputs.docker }} + workflow-changed: ${{ steps.changes.outputs.workflow }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 2 + - name: Detect changes + id: changes + run: node scripts/detect-code-changes.mjs +``` + +Then gate each job on the relevant output: + +```yaml +test-suites: + needs: [detect-changes] + if: needs.detect-changes.outputs.code-changed == 'true' || needs.detect-changes.outputs.workflow-changed == 'true' + # ... + +validate-docs: + needs: [detect-changes] + if: needs.detect-changes.outputs.docs-changed == 'true' + # ... + +docker-pr-check: + needs: [detect-changes] + if: needs.detect-changes.outputs.docker-changed == 'true' || needs.detect-changes.outputs.workflow-changed == 'true' + # ... +``` + +**What to exclude from "code changes" detection:** + +- Markdown files (`*.md`) β€” documentation-only changes don't need changeset files +- `.changeset/` folder β€” changeset metadata isn't code +- `data/` and `experiments/` folders β€” non-production content +- `.gitkeep` files β€” placeholder files with no functional impact + +**What always triggers checks when changed:** + +- Source code files (`.mjs`, `.ts`, `.py`, `.rs`, `.go`, etc.) +- `package.json` / dependency manifests +- CI/CD workflow files (`.github/workflows/*.yml`) +- `Dockerfile` and related infrastructure files + +### 2. File Size Limits + +**Enforce a maximum of 1000-1500 lines per code file.** + +This constraint benefits both AI and human developers: + +- AI models can read and understand entire files within context windows +- Humans can navigate and comprehend files without cognitive overload +- Forces modular, well-organized code architecture + +Example enforcement in CI (bash): + +```bash +find src/ -name "*.mjs" -type f | while read -r file; do + line_count=$(wc -l < "$file") + if [ "$line_count" -gt 1500 ]; then + echo "ERROR: $file has $line_count lines (limit: 1500)" + echo "::error file=$file::File has $line_count lines (limit: 1500)" + exit 1 + fi +done +``` + +**Synchronize the file-size ESLint rule with the CI check** to catch violations locally before CI: + +```js +// eslint.config.mjs +{ + rules: { + 'max-lines': ['error', { max: 1500 }] + } +} +``` + +### 3. Automated Code Formatting + +Consistent formatting eliminates style debates and reduces diff noise: + +| Language | Tool | +| --------------------- | ----------------------------- | +| JavaScript/TypeScript | ESLint + Prettier | +| Rust | rustfmt | +| Python | Ruff | +| Go | gofmt | +| C# | dotnet format | +| Java | Spotless (Google Java Format) | +| PHP | PHP CS Fixer | + +All templates include pre-commit hooks that run formatters automatically before each commit. + +### 4. Static Analysis & Linting + +Catch bugs and enforce patterns before code reaches review: + +| Language | Tools | +| --------------------- | ----------------------------------- | +| JavaScript/TypeScript | ESLint with strict rules | +| Rust | Clippy (pedantic + nursery) | +| Python | Ruff + mypy | +| Go | go vet + staticcheck | +| C# | .NET analyzers (warnings as errors) | +| Java | SpotBugs (maximum effort) | +| PHP | PHPStan (max level) | + +### 5. Fast-Fail Job Ordering + +**Run fast checks before slow checks** to give the fastest possible feedback: + +``` +Fast checks (~7-30s each): Slow checks (~1-10 min each): +β”œβ”€β”€ test-compilation β”œβ”€β”€ test-suites (unit tests) +β”œβ”€β”€ lint (format + ESLint) β”œβ”€β”€ test-execution (integration) +└── check-file-line-limits β”œβ”€β”€ docker-pr-check + └── helm-pr-check +``` + +Gate slow checks on fast checks: + +```yaml +test-suites: + needs: [test-compilation, lint, check-file-line-limits] + if: | + always() && + !cancelled() && + !contains(needs.*.result, 'failure') && + needs.test-compilation.result == 'success' && + needs.lint.result == 'success' && + needs.check-file-line-limits.result == 'success' +``` + +### 6. Changeset-Based Versioning + +All templates use a changeset system that: + +- **Eliminates merge conflicts** - Each PR creates an independent changeset file +- **Automates version bumps** - Highest bump type wins when merging +- **Generates changelogs** - Release notes are compiled automatically +- **Supports semantic versioning** - patch/minor/major bumps are explicit + +| Language | Tool | +| --------------------- | ---------------------------- | +| JavaScript/TypeScript | @changesets/cli | +| Rust | changelog.d + custom scripts | +| Python | Scriv | +| PHP | changelog.d + custom scripts | +| Go, C#, Java | Custom changeset workflows | + +**Exempt docs-only PRs from changeset requirements:** + +```yaml +changeset-check: + needs: [detect-changes] + if: github.event_name == 'pull_request' && needs.detect-changes.outputs.any-code-changed == 'true' +``` + +Documentation-only changes (updating `.md` files) should not require a version bump. + +### 7. Validate the Actual Merge Result + +**CI must test what will actually be merged, not a stale PR snapshot.** + +When a PR is opened against a base branch that later receives new commits, the GitHub merge preview can become stale. Simulate a fresh merge before running checks: + +```yaml +- name: Simulate fresh merge with base branch (PR only) + if: github.event_name == 'pull_request' + env: + BASE_REF: ${{ github.base_ref }} + run: | + git config user.email "github-actions[bot]@users.noreply.github.com" + git config user.name "github-actions[bot]" + git fetch origin "$BASE_REF" + BEHIND_COUNT=$(git rev-list --count HEAD..origin/$BASE_REF) + if [ "$BEHIND_COUNT" -gt 0 ]; then + git merge origin/$BASE_REF --no-edit || \ + (echo "::error::Merge conflict! PR must be rebased before merging." && exit 1) + fi +``` + +This ensures lint, file-size, and other checks validate the final merged state. + +### 8. Pre-commit Hooks + +Local quality gates prevent broken commits from reaching CI: + +1. Format check and auto-fix +2. Lint and static analysis +3. Type checking (where applicable) +4. File size validation +5. Secrets detection + +This "shift left" approach catches issues immediately rather than waiting for CI. + +### 9. Release Automation + +Automated release workflows ensure: + +- **No manual version management** - Versions update automatically +- **OIDC trusted publishing** - No API tokens needed in CI (npm, PyPI, crates.io) +- **Validated releases only** - All checks must pass before publishing +- **Dual trigger modes** - Both automatic (on merge) and manual (workflow dispatch) + +**Prohibit manual version changes** in PRs β€” all version bumps should be managed by the CI release workflow: + +```yaml +version-check: + if: github.event_name == 'pull_request' + steps: + - name: Check for version changes in package.json + run: node scripts/check-version.mjs +``` + +### 10. Concurrency Control + +**Separate cancellable read-only checks from non-cancellable write jobs.** Configure concurrency at the job level when a workflow contains both kinds of work: + +```yaml +jobs: + lint: + # Include the job identity (and matrix values, when present) so unrelated + # checks remain parallel while a newer run replaces only the stale check. + concurrency: + group: check-${{ github.workflow }}-${{ github.ref }}-lint + cancel-in-progress: true + # ... + + deploy: + needs: [lint] + if: ${{ !cancelled() && needs.lint.result == 'success' }} + # Every job that writes to main or an external deployment target uses this + # repository-wide group, even when the jobs live in different workflows. + concurrency: + group: main-writer-${{ github.repository }}-main + cancel-in-progress: false + # ... +``` + +- **Read-only jobs:** Cancel superseded checks on both pull requests and `main` to reduce runner load. Give each job a distinct suffix; include relevant matrix values so different matrix entries can still run in parallel. +- **Dependent writers:** Use `needs` and require successful prerequisites. A cancelled prerequisite must make its write job not start. +- **Active writers:** Give every release, deploy, tag, generated-content push, and other write job the same repository-scoped group with `cancel-in-progress: false`. An already started writer finishes while the next writer waits in the queue, including writers from another workflow file. +- **Workflow scope:** Do not put cancellable concurrency at workflow level when the workflow has write jobs. Cancelling the workflow would also interrupt a writer that has already started. + +By default, a concurrency group keeps at most one running and one pending job; a newer pending writer replaces the older pending writer. If every queued write must run, add `queue: max` to the writer's concurrency block (up to 100 jobs can wait). `queue: max` cannot be combined with `cancel-in-progress: true`, and execution order follows when jobs start waiting rather than workflow dispatch order, so write jobs should remain idempotent. See [GitHub's concurrency documentation](https://docs.github.com/en/actions/how-tos/write-workflows/choose-when-workflows-run/control-workflow-concurrency) for the current queue limits and semantics. + +Use `!cancelled()` instead of `always()` in job conditions so cancellation propagates correctly through the job graph. A bare `always()` can keep downstream work running after cancellation. + +### 11. Secrets Detection + +Prevent accidental credential leaks in CI: + +- Include a secrets scan step using tools like `secretlint` or `truffleHog` +- Fail CI immediately if secrets are detected +- Never log environment variables or token values + +### 12. Documentation Validation + +**Validate documentation files in CI just like code:** + +- Check file size limits (e.g., max 2500 lines for docs) +- Verify required sections exist in key documents +- Check for broken links using tools like `lychee` + +```yaml +validate-docs: + needs: [detect-changes] + if: needs.detect-changes.outputs.docs-changed == 'true' + steps: + - run: node tests/docs-validation.mjs +``` + +### 13. Container Images: Native Runners per Architecture + +**Build each architecture on its own native runner.** GitHub provides free arm64 Linux runners for public repositories (`ubuntu-24.04-arm`). Emulating arm64 with QEMU on an x86 runner is much slower for compiled languages, and building two architectures inside one job makes them sequential instead of parallel. + +```yaml +build-image: + strategy: + matrix: + include: + - platform: linux/amd64 + runner: ubuntu-latest + - platform: linux/arm64 + runner: ubuntu-24.04-arm + runs-on: ${{ matrix.runner }} + steps: + - uses: docker/build-push-action@v7 + with: + platforms: ${{ matrix.platform }} + cache-from: type=gha + cache-to: type=gha,mode=max + outputs: type=image,push-by-digest=true,name-canonical=true,push=true + +merge-manifest: + needs: [build-image] + steps: + - run: docker buildx imagetools create -t $IMAGE:$VERSION $DIGESTS +``` + +- **No `setup-qemu-action`.** Its presence means an architecture is being emulated; use a native runner instead. +- **Publish images for every architecture your users run.** A single-architecture image silently excludes Apple Silicon, Graviton, and arm CI runners. +- **Always cache.** Set `cache-from: type=gha` and `cache-to: type=gha,mode=max` on every build step; otherwise every architecture rebuilds the full dependency tree for every release. +- **Never gate the release on the image push.** Publish the GitHub Release and language-registry package first, then attach images as they finish. Release notes contain no data derived from image bytes, so a slow or failed registry push must not hide an otherwise completed release. +- **Assert what you shipped.** Verify that the published manifest lists every intended platform and that each default-branch tag has a corresponding GitHub Release; a missing release is otherwise easy to overlook. + +Reference implementations: [`link-foundation/box`](https://github.com/link-foundation/box) and [`link-assistant/hive-mind`](https://github.com/link-assistant/hive-mind). + +### 14. Lint the Workflows Themselves + +**The pipeline is code, and nothing lints it by default.** Workflow files accumulate shell quoting bugs, over-broad `permissions`, unpinned actions and template-injection sinks that no job in the pipeline is looking for, because every job is busy checking the application. + +Two complementary tools, in their own workflow, triggered on changes to `.github/`: + +- [`actionlint`](https://github.com/rhysd/actionlint) β€” syntax, expressions, and (crucially) the shell inside every `run:` block. +- [`zizmor`](https://docs.zizmor.sh/) β€” security audits: `excessive-permissions`, `unpinned-uses`, `template-injection`, `artipacked`. + +```yaml +- uses: docker://rhysd/actionlint:1.7.12 + with: + args: -color +``` + +- **Run actionlint as the Docker image, not a bare binary.** The image bundles `shellcheck` and `pyflakes`. A binary without `shellcheck` on `PATH` silently skips every shell check and exits 0 β€” so a green local run means nothing. This one detail is the difference between finding fourteen shell bugs and finding none. +- **Prefer annotations to SARIF** for zizmor unless code scanning is enabled everywhere the workflow runs. SARIF upload fails silently on forks; annotations fail loudly in both. +- **Set a confidence floor, not a severity floor.** `--min-confidence medium` filters by how sure the tool is, not by how bad the finding is. Review what falls below the floor once and record the decision, rather than discovering later that the floor was hiding a real finding. +- **Scope suppressions to a file, and write down when they can be removed.** A blanket `ignore` is indistinguishable from no gate at all. + +### 15. Audit the Dependency Tree + +**Code scanning does not audit your dependencies, and PR-scoped dependency review does not audit the ones you already have.** These two jobs look like coverage together and leave a hole between them: CodeQL analyses your source, while `dependency-review-action` runs only on `pull_request` and only inspects the dependencies a PR _changes_. An advisory published against a package that has been pinned for a year is invisible to both, forever, because no PR touches that line. + +```yaml +- run: npm audit --package-lock-only --audit-level=high +``` + +- **Audit the lockfile as committed** (`--package-lock-only`). It reports what a consumer would get, and cannot be turned green by a resolution that only happens on this runner. +- **Put the job on the schedule**, not only on push. A scheduled run is the only thing that can notice an advisory published after the code stopped changing. +- **Set the level explicitly.** The default is `low`, which trains everyone to ignore the job; no flag at all is a different failure from a deliberate `--audit-level=high`. + +## Quality Enforcement Strategy + +The templates implement a defense-in-depth approach: + +``` +Developer Machine β†’ CI/CD Pipeline β†’ Release +β”œβ”€β”€ Pre-commit hooks β”œβ”€β”€ detect-changes β”œβ”€β”€ All checks pass +β”œβ”€β”€ Local tests β”œβ”€β”€ version-check β”œβ”€β”€ Version bump +└── IDE integration β”œβ”€β”€ changeset-check β”œβ”€β”€ Changelog update + β”œβ”€β”€ test-compilation └── Publish package + β”œβ”€β”€ lint (format+ESLint) + β”œβ”€β”€ check-file-line-limits + β”œβ”€β”€ test-suites + β”œβ”€β”€ test-execution + β”œβ”€β”€ validate-docs + └── docker-pr-check +``` + +Each layer catches different issues, ensuring no problematic code reaches production. + +## Getting Started + +1. **Choose a template** from the table above matching your language +2. **Use it as a GitHub template** to create your new repository +3. **Configure secrets** if needed for publishing (OIDC preferred) +4. **Start developing** with all best practices pre-configured + +The AI solvers will automatically respect and iterate with all configured checks, producing higher quality output than repositories without CI/CD enforcement. + +## Automatic CI/CD Remediation + +For an existing repository, you don't need to apply these practices by hand. The `fix` command automates the whole flow: + +```bash +fix https://github.com/owner/repo --ci-cd +``` + +This command: + +1. **Detects the repository's languages** using the GitHub Linguist API (`GET /repos/{owner}/{repo}/languages`), ordered by the number of bytes per language. +2. **Selects the matching CI/CD templates** from the table above, sorted so the template for the most-used language comes first. +3. **Inspects the latest default-branch commit** and collects its CI/CD runs (falling back to the most recent runs on the default branch when the latest commit has none). +4. **Creates a remediation issue** that lists the failing runs, the detected languages, the recommended templates, and a link back to this document. The issue is created as a **Bug** (with a `bug` label) and its title and text are taken from the [standard remediation template](https://github.com/link-assistant/web-capture/issues/139). +5. **Hands the issue off to `/solve --development-log --deep-analysis --auto-merge`**, which iterates until the fixes are merged. Every option `fix` does not consume itself (for example `--tool`, `--model`, `--think`) is forwarded to `/solve`. + +### Why the issue is a Bug, and what it leaves out + +`--development-log` replaces the template's retired case-study-folder instruction and collects artifacts under `./dev/log/issues/{issue-id}/pulls/{pull-id}`. `/fix` never emits the retired paragraph, including with `--no-solve` or partial option sets. `--deep-analysis` supplies the timeline, root-cause, debug-output, and upstream-reporting guidance, so `fix` conditionally omits the matching paragraphs instead of delivering them twice. + +That omission is only lossless because `/solve` emits the root-cause wording **only for bug-typed issues** β€” which is why `fix` creates the issue as a Bug. Issue types are configured per organization and labels per repository, so if the target repository accepts neither, the issue is still created without them. + +The retired paragraph cannot be restored by an option combination; `--development-log` is the only supported collection workflow. The remaining conditional omissions are controlled by `--deep-analysis`. + +### Language β†’ Template Mapping + +The command maps detected languages to templates as follows (JavaScript and TypeScript share a single template): + +| Detected Language(s) | Template | +| --------------------- | ---------------------------------------------------------------- | +| JavaScript/TypeScript | `link-foundation/js-ai-driven-development-pipeline-template` | +| Rust | `link-foundation/rust-ai-driven-development-pipeline-template` | +| Python | `link-foundation/python-ai-driven-development-pipeline-template` | +| Go | `link-foundation/go-ai-driven-development-pipeline-template` | +| C# | `link-foundation/csharp-ai-driven-development-pipeline-template` | +| Java | `link-foundation/java-ai-driven-development-pipeline-template` | +| PHP | `link-foundation/php-ai-driven-development-pipeline-template` | + +Languages without a dedicated template (for example Shell or Dockerfile) are listed in the issue for awareness, and the closest matching template is recommended. + +Use `--dry-run` to preview the issue without creating it, and `--no-solve` to create the issue without starting `/solve`: + +```bash +fix owner/repo --ci-cd --dry-run +fix owner/repo --ci-cd --no-solve +``` + +## References + +- [Code Architecture Principles](https://github.com/link-foundation/code-architecture-principles) +- [Contributing Guidelines](./CONTRIBUTING.md) +- [Best Practices](./BEST-PRACTICES.md) diff --git a/dev/log/issues/199/pulls/200/templates/js-tmpl.file-tree.txt b/dev/log/issues/199/pulls/200/templates/js-tmpl.file-tree.txt new file mode 100644 index 0000000..5f58c49 --- /dev/null +++ b/dev/log/issues/199/pulls/200/templates/js-tmpl.file-tree.txt @@ -0,0 +1,374 @@ +./.changeset/README.md +./.changeset/config.json +./.github/actions/publish-dockerhub/action.yml +./.github/actions/setup-buildx-resilient/action.yml +./.github/workflows/example-app.yml +./.github/workflows/links.yml +./.github/workflows/release.yml +./.github/workflows/security.yml +./.github/workflows/workflows.yml +./.github/zizmor.yml +./.gitignore +./.gitkeep +./.husky/pre-commit +./.jscpd.json +./.lycheeignore +./.prettierignore +./.prettierrc +./.secretlintrc.json +./CHANGELOG.md +./LICENSE +./README.md +./bin/example-package-name.js +./bunfig.toml +./deno.json +./deno.lock +./docs/BEST-PRACTICES.md +./docs/CI-TIMEOUT-BUDGETS.md +./docs/CONTRIBUTING.md +./docs/case-studies/issue-13/README.md +./docs/case-studies/issue-13/hive-mind-issue-960.json +./docs/case-studies/issue-13/hive-mind-pr-961-diff.txt +./docs/case-studies/issue-13/hive-mind-pr-961.json +./docs/case-studies/issue-21/README.md +./docs/case-studies/issue-21/ci-logs/run-20803315337.txt +./docs/case-studies/issue-21/ci-logs/run-20885464993.txt +./docs/case-studies/issue-21/issue-111-data.txt +./docs/case-studies/issue-21/issue-113-data.txt +./docs/case-studies/issue-21/pr-112-data.json +./docs/case-studies/issue-21/pr-112-diff.patch +./docs/case-studies/issue-21/pr-114-data.json +./docs/case-studies/issue-21/pr-114-diff.patch +./docs/case-studies/issue-23/README.md +./docs/case-studies/issue-23/data/hive-mind-check-version.mjs +./docs/case-studies/issue-23/data/hive-mind-ci.yml +./docs/case-studies/issue-23/data/hive-mind-eslint.config.mjs +./docs/case-studies/issue-23/data/hive-mind-release.yml +./docs/case-studies/issue-23/data/issue-1126-details.txt +./docs/case-studies/issue-23/data/issue-1141-comments.json +./docs/case-studies/issue-23/data/issue-1141-details.txt +./docs/case-studies/issue-23/data/pr-1127-conversation-comments.json +./docs/case-studies/issue-23/data/pr-1127-diff.txt +./docs/case-studies/issue-23/data/pr-1127-review-comments.json +./docs/case-studies/issue-23/data/pr-1142-conversation-comments.json +./docs/case-studies/issue-23/data/pr-1142-diff.txt +./docs/case-studies/issue-23/data/pr-1142-review-comments.json +./docs/case-studies/issue-25/DETAILED-COMPARISON.md +./docs/case-studies/issue-25/README.md +./docs/case-studies/issue-25/data/hive-mind-file-tree.txt +./docs/case-studies/issue-25/data/issue-1274-case-study.md +./docs/case-studies/issue-25/data/issue-1278-case-study.md +./docs/case-studies/issue-25/data/template-file-tree.txt +./docs/case-studies/issue-29/README.md +./docs/case-studies/issue-3/README.md +./docs/case-studies/issue-3/created-issues.md +./docs/case-studies/issue-3/issue-data.json +./docs/case-studies/issue-3/original-format-release-notes.mjs +./docs/case-studies/issue-3/reference-pr-59-diff.txt +./docs/case-studies/issue-3/reference-pr-59.json +./docs/case-studies/issue-3/release-v0.1.0.json +./docs/case-studies/issue-3/repositories-with-same-script.json +./docs/case-studies/issue-3/research-notes.md +./docs/case-studies/issue-31/README.md +./docs/case-studies/issue-31/web-capture-pr49-commits.json +./docs/case-studies/issue-33/README.md +./docs/case-studies/issue-33/ci-logs/release-24395209194.txt +./docs/case-studies/issue-33/ci-logs/upstream-nodejs-62430.json +./docs/case-studies/issue-33/ci-logs/upstream-npm-cli-9151.json +./docs/case-studies/issue-33/ci-logs/upstream-runner-images-13883.json +./docs/case-studies/issue-36/README.md +./docs/case-studies/issue-36/ci-logs/release-24399965550.txt +./docs/case-studies/issue-38/CASE-STUDY.md +./docs/case-studies/issue-40/CICD-COMPARISON.md +./docs/case-studies/issue-40/README.md +./docs/case-studies/issue-40/data/ci-run-25212337438.json +./docs/case-studies/issue-40/data/ci-runs-branch.json +./docs/case-studies/issue-40/data/downstream-web-capture-issue-98.json +./docs/case-studies/issue-40/data/downstream-web-capture-pr-99.diff +./docs/case-studies/issue-40/data/downstream-web-capture-pr-99.json +./docs/case-studies/issue-40/data/issue-40.json +./docs/case-studies/issue-40/data/js-cicd-files.txt +./docs/case-studies/issue-40/data/js-template-file-tree.txt +./docs/case-studies/issue-40/data/pr-43.json +./docs/case-studies/issue-40/data/related-js-merged-prs.json +./docs/case-studies/issue-40/data/rust-cicd-files.txt +./docs/case-studies/issue-40/data/rust-template-file-tree.txt +./docs/case-studies/issue-40/data/rust-template-head.txt +./docs/case-studies/issue-40/data/shields-broken-prefixed-badge.svg +./docs/case-studies/issue-40/data/shields-broken-prefixed-prerelease-badge.svg +./docs/case-studies/issue-40/data/shields-working-normalized-badge.svg +./docs/case-studies/issue-40/data/shields-working-prerelease-badge.svg +./docs/case-studies/issue-40/rust-template/create-github-release.rs +./docs/case-studies/issue-40/rust-template/release.yml +./docs/case-studies/issue-41/README.md +./docs/case-studies/issue-41/data/hive-mind-check-file-line-limits.sh +./docs/case-studies/issue-41/data/hive-mind-file-tree.txt +./docs/case-studies/issue-41/data/hive-mind-issue-1593-case-study.md +./docs/case-studies/issue-41/data/hive-mind-issue-1593-comments.json +./docs/case-studies/issue-41/data/hive-mind-issue-1593.json +./docs/case-studies/issue-41/data/hive-mind-issue-1730-case-study.md +./docs/case-studies/issue-41/data/hive-mind-issue-1730-comments.json +./docs/case-studies/issue-41/data/hive-mind-issue-1730.json +./docs/case-studies/issue-41/data/js-template-check-file-line-limits-before.sh +./docs/case-studies/issue-41/data/js-template-eslint.config.js +./docs/case-studies/issue-41/data/js-template-file-tree.txt +./docs/case-studies/issue-41/data/js-template-issue-41-comments.json +./docs/case-studies/issue-41/data/js-template-issue-41.json +./docs/case-studies/issue-41/data/js-template-release.yml +./docs/case-studies/issue-41/data/js-template-warn-threshold-search-before.json +./docs/case-studies/issue-41/data/rust-template-check-file-size.rs +./docs/case-studies/issue-41/data/rust-template-created-issue-url.txt +./docs/case-studies/issue-41/data/rust-template-file-tree.txt +./docs/case-studies/issue-41/data/rust-template-issue-40.json +./docs/case-studies/issue-41/data/rust-template-issues.json +./docs/case-studies/issue-41/data/rust-template-max-lines-search.json +./docs/case-studies/issue-41/data/rust-template-release.yml +./docs/case-studies/issue-42/README.md +./docs/case-studies/issue-42/data/ci-runs-branch.json +./docs/case-studies/issue-42/data/issue-42-comments.json +./docs/case-studies/issue-42/data/issue-42.json +./docs/case-studies/issue-42/data/js-template-file-tree.txt +./docs/case-studies/issue-42/data/js-template-pre-fix-head.txt +./docs/case-studies/issue-42/data/link-foundation-my-package-search.txt +./docs/case-studies/issue-42/data/link-foundation-package-name-search.txt +./docs/case-studies/issue-42/data/pr-45-conversation-comments.json +./docs/case-studies/issue-42/data/pr-45-review-comments.json +./docs/case-studies/issue-42/data/pr-45-reviews.json +./docs/case-studies/issue-42/data/pr-45.json +./docs/case-studies/issue-42/data/related-merged-prs-check-release-needed.json +./docs/case-studies/issue-42/data/related-merged-prs-publish-to-npm.json +./docs/case-studies/issue-42/data/rust-template-ci-cd-findings.txt +./docs/case-studies/issue-42/data/rust-template-file-tree.txt +./docs/case-studies/issue-42/data/rust-template-head.txt +./docs/case-studies/issue-56/README.md +./docs/case-studies/issue-56/artifacts/universal-app-mobile.png +./docs/case-studies/issue-56/artifacts/universal-app-web.png +./docs/case-studies/issue-56/data/actions-checkout-release.json +./docs/case-studies/issue-56/data/actions-configure-pages-release.json +./docs/case-studies/issue-56/data/actions-deploy-pages-release.json +./docs/case-studies/issue-56/data/actions-setup-node-release.json +./docs/case-studies/issue-56/data/actions-upload-artifact-release.json +./docs/case-studies/issue-56/data/actions-upload-pages-artifact-release.json +./docs/case-studies/issue-56/data/bun-test-final.log +./docs/case-studies/issue-56/data/changeset-status-after-stage.log +./docs/case-studies/issue-56/data/check-file-line-limits-final-2.log +./docs/case-studies/issue-56/data/check-mjs-syntax-final-2.log +./docs/case-studies/issue-56/data/deep-sdk-capacitor.config.ts +./docs/case-studies/issue-56/data/deep-sdk-electron-package.json +./docs/case-studies/issue-56/data/deep-sdk-file-tree.txt +./docs/case-studies/issue-56/data/deep-sdk-gh-pages.yml +./docs/case-studies/issue-56/data/deep-sdk-package.json +./docs/case-studies/issue-56/data/deep-sdk-repo.json +./docs/case-studies/issue-56/data/deno-test-final.log +./docs/case-studies/issue-56/data/example-desktop-package-final-2.log +./docs/case-studies/issue-56/data/example-mobile-sync-final-2.log +./docs/case-studies/issue-56/data/example-web-build-final-2.log +./docs/case-studies/issue-56/data/issue-56-comments.json +./docs/case-studies/issue-56/data/issue-56.json +./docs/case-studies/issue-56/data/link-foundation-code-search.json +./docs/case-studies/issue-56/data/npm-capacitor-cli.json +./docs/case-studies/issue-56/data/npm-capacitor-core.json +./docs/case-studies/issue-56/data/npm-check-final-4.log +./docs/case-studies/issue-56/data/npm-electron-forge-cli.json +./docs/case-studies/issue-56/data/npm-install-root.log +./docs/case-studies/issue-56/data/npm-install-universal-app-node20-compatible.log +./docs/case-studies/issue-56/data/npm-test-final-3.log +./docs/case-studies/issue-56/data/npm-vite.json +./docs/case-studies/issue-56/data/pr-57.json +./docs/case-studies/issue-56/data/recent-merged-prs.json +./docs/case-studies/issue-56/data/universal-app-test-before.log +./docs/case-studies/issue-56/data/universal-app-test-final-2.log +./docs/case-studies/issue-56/data/validate-changeset-final.log +./docs/case-studies/issue-56/data/vk-bot-desktop-build-renderer.mjs +./docs/case-studies/issue-56/data/vk-bot-desktop-electron-main.cjs +./docs/case-studies/issue-56/data/vk-bot-desktop-file-tree.txt +./docs/case-studies/issue-56/data/vk-bot-desktop-js-workflow.yml +./docs/case-studies/issue-56/data/vk-bot-desktop-package.json +./docs/case-studies/issue-56/data/vk-bot-desktop-repo.json +./docs/case-studies/issue-58/README.md +./docs/case-studies/issue-58/data/actions-configure-pages-release.json +./docs/case-studies/issue-58/data/actions-deploy-pages-release.json +./docs/case-studies/issue-58/data/actions-upload-artifact-release.json +./docs/case-studies/issue-58/data/actions-upload-pages-artifact-release.json +./docs/case-studies/issue-58/data/bun-test.log +./docs/case-studies/issue-58/data/check-file-line-limits.log +./docs/case-studies/issue-58/data/check-mjs-syntax.log +./docs/case-studies/issue-58/data/checks-and-release-25733140225.json +./docs/case-studies/issue-58/data/checks-and-release-25733140225.log +./docs/case-studies/issue-58/data/checks-and-release-25743983223.log +./docs/case-studies/issue-58/data/ci-run-25743983223.json +./docs/case-studies/issue-58/data/csharp-template-file-tree.txt +./docs/case-studies/issue-58/data/csharp-template-release.yml +./docs/case-studies/issue-58/data/deno-test.log +./docs/case-studies/issue-58/data/example-app-25733140224.json +./docs/case-studies/issue-58/data/example-app-25733140224.log +./docs/case-studies/issue-58/data/example-desktop-package.log +./docs/case-studies/issue-58/data/example-mobile-sync.log +./docs/case-studies/issue-58/data/example-web-build.log +./docs/case-studies/issue-58/data/issue-58-comments.json +./docs/case-studies/issue-58/data/issue-58.json +./docs/case-studies/issue-58/data/js-template-file-tree.txt +./docs/case-studies/issue-58/data/link-foundation-example-package-name-search.json +./docs/case-studies/issue-58/data/main-ci-runs.json +./docs/case-studies/issue-58/data/npm-check-final.log +./docs/case-studies/issue-58/data/npm-example-package-name-view.json +./docs/case-studies/issue-58/data/npm-global-install.log +./docs/case-studies/issue-58/data/npm-install-after-metadata.log +./docs/case-studies/issue-58/data/npm-install-universal-app.log +./docs/case-studies/issue-58/data/npm-install.log +./docs/case-studies/issue-58/data/npm-pack-dry-run-final.json +./docs/case-studies/issue-58/data/npm-test-2.log +./docs/case-studies/issue-58/data/npm-whoami.log +./docs/case-studies/issue-58/data/pages-enable-result.json +./docs/case-studies/issue-58/data/pages-status-after-enable.json +./docs/case-studies/issue-58/data/pr-57.diff +./docs/case-studies/issue-58/data/pr-57.json +./docs/case-studies/issue-58/data/pr-59-conversation-comments.json +./docs/case-studies/issue-58/data/pr-59-review-comments.json +./docs/case-studies/issue-58/data/pr-59-reviews.json +./docs/case-studies/issue-58/data/pr-59.json +./docs/case-studies/issue-58/data/python-template-file-tree.txt +./docs/case-studies/issue-58/data/python-template-release.yml +./docs/case-studies/issue-58/data/regression-after-2.log +./docs/case-studies/issue-58/data/regression-after-3.log +./docs/case-studies/issue-58/data/regression-after.log +./docs/case-studies/issue-58/data/regression-before.log +./docs/case-studies/issue-58/data/rust-template-file-tree.txt +./docs/case-studies/issue-58/data/rust-template-release.yml +./docs/case-studies/issue-58/data/secretlint.log +./docs/case-studies/issue-58/data/validate-changeset.log +./docs/case-studies/issue-7/BEST-PRACTICES-COMPARISON.md +./docs/case-studies/issue-7/FORMATTER-COMPARISON.md +./docs/case-studies/issue-7/current-repository-analysis.json +./docs/case-studies/issue-7/effect-template-analysis.json +./docs/case-studies/issue-75/CASE-STUDY.md +./docs/case-studies/issue-93/README.md +./docs/case-studies/issue-93/data/ci-runs-issue-93.json +./docs/case-studies/issue-93/data/issue-93-comments.json +./docs/case-studies/issue-93/data/issue-93.json +./docs/case-studies/issue-93/data/link-foundation-eslint-rules-search.json +./docs/case-studies/issue-93/data/link-foundation-no-changelog-comments-search.json +./docs/case-studies/issue-93/data/merged-prs-case-study.json +./docs/case-studies/issue-93/data/merged-prs-eslint.json +./docs/case-studies/issue-93/data/npm-search-eslint-changelog-comments.json +./docs/case-studies/issue-93/data/pr-94.json +./docs/screenshots/example-app/example-app-en-dark.png +./docs/screenshots/example-app/example-app-en-light.png +./docs/screenshots/example-app/example-app-ru-dark.png +./docs/screenshots/example-app/example-app-ru-light.png +./docs/screenshots/example-app/example-app.png +./eslint-rules/no-changelog-comments.js +./eslint.config.js +./examples/basic-usage.js +./examples/universal-app/README.md +./examples/universal-app/capacitor.config.json +./examples/universal-app/electron/main.cjs +./examples/universal-app/electron/preload.cjs +./examples/universal-app/index.html +./examples/universal-app/package-lock.json +./examples/universal-app/package.json +./examples/universal-app/public/favicon.svg +./examples/universal-app/src/App.js +./examples/universal-app/src/main.js +./examples/universal-app/src/styles.css +./examples/universal-app/vite.config.js +./experiments/budget-runner-demo.sh +./experiments/issue-141-multilang-ignore-list.sh +./experiments/test-changeset-scripts.mjs +./experiments/test-check-release-needed.mjs +./experiments/test-detect-changes.mjs +./experiments/test-failure-detection.mjs +./experiments/test-format-major-changes.mjs +./experiments/test-format-minor-changes.mjs +./experiments/test-format-no-hash.mjs +./experiments/test-format-patch-changes.mjs +./experiments/test-issue75-buildx-mirror-fallback.sh +./package-lock.json +./package.json +./scripts/changeset-version.mjs +./scripts/check-changesets.mjs +./scripts/check-docker-build.mjs +./scripts/check-docker-publish.mjs +./scripts/check-file-line-limits.sh +./scripts/check-mjs-syntax.sh +./scripts/check-pipeline-status.sh +./scripts/check-release-needed.mjs +./scripts/check-version.mjs +./scripts/check-web-archive.mjs +./scripts/create-github-release.mjs +./scripts/create-manual-changeset.mjs +./scripts/debug-print.mjs +./scripts/detect-code-changes.mjs +./scripts/format-github-release.mjs +./scripts/format-release-notes-helpers.mjs +./scripts/format-release-notes.mjs +./scripts/instant-version-bump.mjs +./scripts/js-paths.mjs +./scripts/land-via-pull-request.mjs +./scripts/lint-changed-lines.mjs +./scripts/lint.mjs +./scripts/merge-changesets.mjs +./scripts/npm-registry.mjs +./scripts/package-info.mjs +./scripts/publish-failure-classifier.mjs +./scripts/publish-retry.mjs +./scripts/publish-to-npm.mjs +./scripts/push-failure-classifier.mjs +./scripts/push-main-with-rebase-retry.mjs +./scripts/release-naming.mjs +./scripts/run-command.mjs +./scripts/run-with-budget-warning.sh +./scripts/sanitize-npm-userconfig.mjs +./scripts/setup-npm.mjs +./scripts/simulate-fresh-merge.sh +./scripts/smoke-test-package.mjs +./scripts/update-preview-images.mjs +./scripts/use-module.mjs +./scripts/validate-changeset.mjs +./scripts/version-and-commit.mjs +./scripts/wait-for-npm.mjs +./src/index.d.ts +./src/index.js +./tests/bot-commit-attribution.test.js +./tests/check-changesets.test.js +./tests/check-file-line-limits.test.js +./tests/check-web-archive.test.js +./tests/ci-timeouts.test.js +./tests/create-github-release.test.js +./tests/debug-print.test.js +./tests/detect-code-changes.test.js +./tests/docker-build.test.js +./tests/docker-publish.test.js +./tests/fixtures/lychee-report.md +./tests/index.test.js +./tests/land-via-pull-request.test.js +./tests/links-workflow.test.js +./tests/lint-changed-lines.test.js +./tests/merge-changesets.test.js +./tests/no-changelog-comments.test.js +./tests/npm-registry.test.js +./tests/package-info.test.js +./tests/package-metadata.test.js +./tests/pipeline-status.test.js +./tests/publish-failure-classifier.test.js +./tests/publish-retry.test.js +./tests/push-failure-classifier.test.js +./tests/push-main-with-rebase-retry.test.js +./tests/release-badge.test.js +./tests/release-naming.test.js +./tests/run-with-budget-warning.test.js +./tests/sanitize-npm-userconfig.test.js +./tests/scripts-use-module-adoption.test.js +./tests/security-workflow.test.js +./tests/setup-buildx-resilient.test.js +./tests/setup-npm.test.js +./tests/simulate-fresh-merge.test.js +./tests/smoke-test-package.test.js +./tests/tag-prefix.test.js +./tests/universal-app.test.js +./tests/use-module-integration.test.js +./tests/use-module.test.js +./tests/wait-for-npm.test.js +./tests/workflow-permissions.test.js +./tests/workflow-reliability.test.js +./tests/workflows-lint.test.js diff --git a/dev/log/issues/199/pulls/200/templates/rust-tmpl.file-tree.txt b/dev/log/issues/199/pulls/200/templates/rust-tmpl.file-tree.txt new file mode 100644 index 0000000..df7339e --- /dev/null +++ b/dev/log/issues/199/pulls/200/templates/rust-tmpl.file-tree.txt @@ -0,0 +1,146 @@ +./.github/actionlint.yaml +./.github/actions/setup-buildx-resilient/action.yml +./.github/workflows/desktop-release.yml +./.github/workflows/links.yml +./.github/workflows/release.yml +./.github/workflows/security.yml +./.github/workflows/workflows.yml +./.github/zizmor.yml +./.gitignore +./.gitkeep +./.lycheeignore +./.pre-commit-config.yaml +./.secretlintrc.json +./CHANGELOG.md +./CONTRIBUTING.md +./Cargo.lock +./Cargo.toml +./LICENSE +./README.md +./changelog.d/README.md +./docs/case-studies/issue-11/README.md +./docs/case-studies/issue-11/analysis-crates-io.md +./docs/case-studies/issue-11/analysis-set-output.md +./docs/case-studies/issue-11/analysis-workflow-dispatch.md +./docs/case-studies/issue-11/online-research.md +./docs/case-studies/issue-17/README.md +./docs/case-studies/issue-19/README.md +./docs/case-studies/issue-19/ci-logs/ci-run-20885464993.log.gz +./docs/case-studies/issue-19/pr-114-data/issue-113-details.txt +./docs/case-studies/issue-19/pr-114-data/pr-commits.json +./docs/case-studies/issue-19/pr-114-data/pr-conversation-comments.json +./docs/case-studies/issue-19/pr-114-data/pr-details.json +./docs/case-studies/issue-19/pr-114-data/pr-diff.patch +./docs/case-studies/issue-19/pr-114-data/pr-review-comments.json +./docs/case-studies/issue-19/pr-114-data/pr-reviews.json +./docs/case-studies/issue-19/pr-114-data/solution-draft-log-1.txt.gz +./docs/case-studies/issue-19/pr-114-data/solution-draft-log-2.txt.gz +./docs/case-studies/issue-21/README.md +./docs/case-studies/issue-21/browser-commander-issue-27.md +./docs/case-studies/issue-21/browser-commander-issue-29.md +./docs/case-studies/issue-21/browser-commander-issue-31.md +./docs/case-studies/issue-21/browser-commander-issue-33.md +./docs/case-studies/issue-21/browser-commander-rust.yml +./docs/case-studies/issue-25/README.md +./docs/case-studies/issue-29/README.md +./docs/case-studies/issue-32/README.md +./docs/case-studies/issue-34/README.md +./docs/case-studies/issue-38/README.md +./docs/case-studies/issue-38/raw-data/downstream-meta-after-run-24985948212.json +./docs/case-studies/issue-38/raw-data/downstream-meta-after-run-24985948212.log.gz +./docs/case-studies/issue-38/raw-data/downstream-meta-before-run-24983875003.json +./docs/case-studies/issue-38/raw-data/downstream-meta-before-run-24983875003.log.gz +./docs/case-studies/issue-38/raw-data/downstream-meta-ontology-issue-3.json +./docs/case-studies/issue-38/raw-data/downstream-meta-ontology-pr-4.json +./docs/case-studies/issue-38/raw-data/issue-38-comments.json +./docs/case-studies/issue-38/raw-data/issue-38.json +./docs/case-studies/issue-38/raw-data/js-template-issue-search.json +./docs/case-studies/issue-38/raw-data/main-run-24465255225.json +./docs/case-studies/issue-38/raw-data/main-run-24465255225.log.gz +./docs/case-studies/issue-38/raw-data/main-runs.json +./docs/case-studies/issue-38/raw-data/pr-39-conversation-comments.json +./docs/case-studies/issue-38/raw-data/pr-39-review-comments.json +./docs/case-studies/issue-38/raw-data/pr-39-reviews.json +./docs/case-studies/issue-38/raw-data/pr-39.json +./docs/case-studies/issue-38/raw-data/pr-branch-runs.json +./docs/case-studies/issue-38/raw-data/pr-run-25212295127.json +./docs/case-studies/issue-38/raw-data/pr-run-25212295127.log.gz +./docs/case-studies/issue-38/raw-data/rust-template-issue-search.json +./docs/case-studies/issue-38/template-data/js-template-ci-tree.txt +./docs/case-studies/issue-38/template-data/js-template-links.yml +./docs/case-studies/issue-38/template-data/js-template-release.yml +./docs/case-studies/issue-38/template-data/rust-template-ci-tree.txt +./docs/case-studies/issue-38/template-data/rust-template-release-after.yml +./docs/case-studies/issue-38/template-data/rust-template-release-before.yml +./docs/case-studies/issue-52/README.md +./docs/case-studies/issue-52/raw-data/issue-52-comments.json +./docs/case-studies/issue-52/raw-data/issue-52.json +./docs/case-studies/issue-52/raw-data/js-issue-62.json +./docs/case-studies/issue-52/raw-data/vk-bot-desktop-issue-51.json +./docs/case-studies/issue-52/raw-data/vk-bot-desktop-pr-52.json +./docs/case-studies/issue-69/README.md +./docs/ci-cd/troubleshooting.md +./docs/download/index.html +./docs/screenshots/desktop-download-page.png +./examples/basic_usage.rs +./experiments/issue-139-multi-language-detect-code-changes.sh +./experiments/test-changelog-parsing.rs +./experiments/test-crates-io-check.rs +./experiments/test-detect-code-changes.sh +./experiments/test-issue141-manifest-printf-quoting.sh +./experiments/test-issue143-throttled-crates-io-probe.rs +./experiments/test-issue69-buildx-mirror-fallback.sh +./experiments/test-version-check-dependencies.sh +./experiments/test-version-check.sh +./scripts/bump-version.rs +./scripts/check-cargo-lock.rs +./scripts/check-changelog-fragment.rs +./scripts/check-crate-size.rs +./scripts/check-file-size.rs +./scripts/check-pipeline-status.sh +./scripts/check-release-needed.rs +./scripts/check-version-modification.rs +./scripts/check-web-archive.mjs +./scripts/check-web-archive.test.mjs +./scripts/collect-changelog.rs +./scripts/create-changelog-fragment.rs +./scripts/create-github-release.rs +./scripts/desktop-release-resolve.sh +./scripts/detect-code-changes.rs +./scripts/fixtures/lychee-report.md +./scripts/get-bump-type.rs +./scripts/get-version.rs +./scripts/git-config.rs +./scripts/install-rust-script.sh +./scripts/package-desktop.sh +./scripts/publish-crate.rs +./scripts/release-naming.rs +./scripts/run-with-budget-warning.sh +./scripts/rust-paths.rs +./scripts/simulate-fresh-merge.sh +./scripts/smoke-test-published-crate.rs +./scripts/version-and-commit.rs +./scripts/wait-for-crate.rs +./src/lib.rs +./src/main.rs +./src/sum.rs +./tests/integration/mod.rs +./tests/integration/sum.rs +./tests/unit/ci-cd/changelog_parsing.rs +./tests/unit/ci-cd/desktop_release_resolve.rs +./tests/unit/ci-cd/issue_119.rs +./tests/unit/ci-cd/issue_127.rs +./tests/unit/ci-cd/issue_135.rs +./tests/unit/ci-cd/issue_141.rs +./tests/unit/ci-cd/issue_143.rs +./tests/unit/ci-cd/issue_147.rs +./tests/unit/ci-cd/mod.rs +./tests/unit/ci-cd/release_naming_tests.rs +./tests/unit/ci-cd/version_and_commit_behind_check.rs +./tests/unit/ci-cd/version_and_commit_tag_order.rs +./tests/unit/ci-cd/workflow_desktop_release.rs +./tests/unit/ci-cd/workflow_release.rs +./tests/unit/ci-cd/workflow_security.rs +./tests/unit/ci-cd/workspace_manifest_resolution.rs +./tests/unit/mod.rs +./tests/unit/sum.rs diff --git a/dev/log/issues/199/pulls/200/workflows/check-language-parity.sh b/dev/log/issues/199/pulls/200/workflows/check-language-parity.sh new file mode 100755 index 0000000..e2db50a --- /dev/null +++ b/dev/log/issues/199/pulls/200/workflows/check-language-parity.sh @@ -0,0 +1,75 @@ +#!/usr/bin/env bash +# +# Language parity check. +# +# command-stream ships two implementations that must stay in lock-step: the +# JavaScript library under js/src/** and the Rust library under rust/src/**. +# This script fails when a pull request changes one language's source without +# touching the other's, so that behavioral changes are always made in both +# languages (see issue #155 review feedback). +# +# Escape hatch: add the `parity-exempt` label to the PR for changes that are +# legitimately single-language (the workflow skips this check when the label is +# present). +# +# Environment: +# BASE_REF - the base branch to diff against (default: main). In GitHub +# Actions this is github.base_ref. +# +# Usage (locally): +# BASE_REF=main bash .github/scripts/check-language-parity.sh +set -euo pipefail + +BASE_REF="${BASE_REF:-main}" + +# Make sure the base branch is available locally, then resolve a ref we can diff +# against. Prefer the remote-tracking ref; fall back to the bare branch name. +git fetch --no-tags origin "${BASE_REF}" >/dev/null 2>&1 || true +if git rev-parse --verify --quiet "origin/${BASE_REF}" >/dev/null; then + BASE="origin/${BASE_REF}" +elif git rev-parse --verify --quiet "${BASE_REF}" >/dev/null; then + BASE="${BASE_REF}" +else + echo "::warning::Could not resolve base ref '${BASE_REF}'; skipping parity check." + exit 0 +fi + +MERGE_BASE="$(git merge-base "${BASE}" HEAD 2>/dev/null || echo "${BASE}")" +CHANGED="$(git diff --name-only "${MERGE_BASE}" HEAD)" + +echo "Comparing against ${BASE} (merge-base ${MERGE_BASE})" +echo "Changed files:" +echo "${CHANGED}" | sed 's/^/ /' + +js_changed=false +rust_changed=false +while IFS= read -r f; do + [ -z "${f}" ] && continue + case "${f}" in + js/src/*) js_changed=true ;; + rust/src/*) rust_changed=true ;; + esac +done < console.log('Module loads successfully in Node.js ${{ matrix.node-version }}')) + .catch((error) => { + console.error('Module failed to load:', error.message); + process.exit(1); + }); + " + node -e " + const commandStream = require('./js/src/\$.cjs'); + if (typeof commandStream !== 'function') { + console.error('CommonJS entry did not export a callable \$'); + process.exit(1); + } + console.log('CommonJS entry loads successfully in Node.js ${{ matrix.node-version }}'); + " + node --test js/tests/node-terminal-artifacts.mjs + node --test js/tests/node-commonjs-entry.mjs + + release: + name: Release JavaScript package + needs: [lint, test] + # Required because lint/test depend on the pull-request-only changeset-check + # job, which is skipped on push events. + if: | + always() && !cancelled() && + github.ref == 'refs/heads/main' && + github.event_name == 'push' && + needs.lint.result == 'success' && + needs.test.result == 'success' + runs-on: ubuntu-latest + timeout-minutes: 30 + permissions: + contents: write + pull-requests: write + id-token: write + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: '24.x' + registry-url: 'https://registry.npmjs.org' + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Install dependencies + working-directory: js + run: bun install + + - name: Update npm for OIDC trusted publishing + working-directory: js + run: bun scripts/setup-npm.mjs + + - name: Check for changesets + id: check_changesets + working-directory: js + run: | + CHANGESET_COUNT=$(find .changeset -name "*.md" ! -name "README.md" | wc -l) + echo "Found $CHANGESET_COUNT JavaScript changeset file(s)" + echo "has_changesets=$([[ $CHANGESET_COUNT -gt 0 ]] && echo 'true' || echo 'false')" >> $GITHUB_OUTPUT + echo "changeset_count=$CHANGESET_COUNT" >> $GITHUB_OUTPUT + + - name: Check if release is needed + id: check_release + working-directory: js + env: + HAS_CHANGESETS: ${{ steps.check_changesets.outputs.has_changesets }} + run: bun scripts/check-release-needed.mjs + + - name: Merge multiple changesets + if: steps.check_changesets.outputs.has_changesets == 'true' && fromJSON(steps.check_changesets.outputs.changeset_count) > 1 + working-directory: js + run: bun scripts/merge-changesets.mjs + + - name: Version package and commit to main + if: steps.check_changesets.outputs.has_changesets == 'true' + id: version + working-directory: js + run: bun scripts/version-and-commit.mjs --mode changeset + + - name: Publish to npm + # Run if a changeset bumped+committed the version, if a previous attempt + # already committed it (re-run safety), or if check-release-needed found + # the current package.json version is not on npm. `current_unpublished` + # is the authoritative self-heal trigger: it fires whether or not a + # changeset is present, so it also covers the #166 "failed to do any + # deploy" restart, where a changeset existed locally but the bump had + # already been consumed on origin/main, leaving v0.10.2 stranded. + if: >- + steps.version.outputs.version_committed == 'true' || + steps.version.outputs.already_released == 'true' || + steps.check_release.outputs.current_unpublished == 'true' + id: publish + working-directory: js + run: bun scripts/publish-to-npm.mjs --should-pull + + - name: Create JavaScript GitHub Release + if: steps.publish.outputs.published == 'true' + working-directory: js + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: bun scripts/create-github-release.mjs --release-version "${{ steps.publish.outputs.published_version }}" --repository "${{ github.repository }}" --tag-prefix js-v + + - name: Format JavaScript GitHub release notes + if: steps.publish.outputs.published == 'true' + working-directory: js + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: bun scripts/format-github-release.mjs --release-version "${{ steps.publish.outputs.published_version }}" --repository "${{ github.repository }}" --commit-sha "${{ github.sha }}" --tag-prefix js-v + + - name: Verify npm availability + # Guards against the #166 false positive: a release/tag must correspond + # to a version that is actually installable from npm. + if: steps.publish.outputs.published == 'true' + working-directory: js + run: bun scripts/wait-for-npm.mjs --release-version "${{ steps.publish.outputs.published_version }}" + + instant-release: + name: Instant JavaScript release + if: github.event_name == 'workflow_dispatch' && github.event.inputs.release_mode == 'instant' + runs-on: ubuntu-latest + timeout-minutes: 30 + permissions: + contents: write + pull-requests: write + id-token: write + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: '24.x' + registry-url: 'https://registry.npmjs.org' + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Install dependencies + working-directory: js + run: bun install + + - name: Update npm for OIDC trusted publishing + working-directory: js + run: bun scripts/setup-npm.mjs + + - name: Version package and commit to main + id: version + working-directory: js + run: bun scripts/version-and-commit.mjs --mode instant --bump-type "${{ github.event.inputs.bump_type }}" --description "${{ github.event.inputs.description }}" + + - name: Publish to npm + if: steps.version.outputs.version_committed == 'true' || steps.version.outputs.already_released == 'true' + id: publish + working-directory: js + run: bun scripts/publish-to-npm.mjs + + - name: Create JavaScript GitHub Release + if: steps.publish.outputs.published == 'true' + working-directory: js + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: bun scripts/create-github-release.mjs --release-version "${{ steps.publish.outputs.published_version }}" --repository "${{ github.repository }}" --tag-prefix js-v + + - name: Format JavaScript GitHub release notes + if: steps.publish.outputs.published == 'true' + working-directory: js + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: bun scripts/format-github-release.mjs --release-version "${{ steps.publish.outputs.published_version }}" --repository "${{ github.repository }}" --commit-sha "${{ github.sha }}" --tag-prefix js-v + + - name: Verify npm availability + # Guards against the #166 false positive: a release/tag must correspond + # to a version that is actually installable from npm. + if: steps.publish.outputs.published == 'true' + working-directory: js + run: bun scripts/wait-for-npm.mjs --release-version "${{ steps.publish.outputs.published_version }}" + + changeset-pr: + name: Create JavaScript changeset PR + if: github.event_name == 'workflow_dispatch' && github.event.inputs.release_mode == 'changeset-pr' + runs-on: ubuntu-latest + timeout-minutes: 10 + permissions: + contents: write + pull-requests: write + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Install dependencies + working-directory: js + run: bun install + + - name: Create changeset file + working-directory: js + run: bun scripts/create-manual-changeset.mjs --bump-type "${{ github.event.inputs.bump_type }}" --description "${{ github.event.inputs.description }}" + + - name: Format changeset with Prettier + working-directory: js + run: bunx prettier --write ".changeset/*.md" + + - name: Create Pull Request + uses: peter-evans/create-pull-request@v8 + with: + token: ${{ secrets.GITHUB_TOKEN }} + commit-message: 'chore: add changeset for manual JavaScript ${{ github.event.inputs.bump_type }} release' + branch: changeset-js-manual-release-${{ github.run_id }} + delete-branch: true + title: 'chore: manual JavaScript ${{ github.event.inputs.bump_type }} release' + body: | + ## Manual JavaScript Release Request + + This PR was created by a manual workflow trigger to prepare a **${{ github.event.inputs.bump_type }}** npm release. + + ### Release Details + - Type: ${{ github.event.inputs.bump_type }} + - Description: ${{ github.event.inputs.description || 'Manual JavaScript release' }} + - Triggered by: @${{ github.actor }} diff --git a/dev/log/issues/199/pulls/200/workflows/parity.yml b/dev/log/issues/199/pulls/200/workflows/parity.yml new file mode 100644 index 0000000..5d1a136 --- /dev/null +++ b/dev/log/issues/199/pulls/200/workflows/parity.yml @@ -0,0 +1,37 @@ +name: Language parity check + +# Ensure behavioral changes are made in both the JavaScript (js/src/**) and the +# Rust (rust/src/**) implementations. A PR that changes one without the other +# fails this check unless it carries the `parity-exempt` label. +# +# See issue #155 review feedback: "double check that all features that are +# supported in JavaScript are fully supported in Rust and we have CI/CD rules, +# that check that we do changes in both languages always". + +on: + pull_request: + types: [opened, synchronize, reopened, labeled, unlabeled] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + parity: + name: JS/Rust source parity + runs-on: ubuntu-latest + timeout-minutes: 10 + # Skip entirely when the PR is explicitly marked as a single-language change. + if: ${{ !contains(github.event.pull_request.labels.*.name, 'parity-exempt') }} + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Check JavaScript/Rust source parity + env: + BASE_REF: ${{ github.base_ref }} + run: bash .github/scripts/check-language-parity.sh diff --git a/dev/log/issues/199/pulls/200/workflows/rust.yml b/dev/log/issues/199/pulls/200/workflows/rust.yml new file mode 100644 index 0000000..d4dbf15 --- /dev/null +++ b/dev/log/issues/199/pulls/200/workflows/rust.yml @@ -0,0 +1,355 @@ +name: Rust checks and release + +on: + push: + branches: + - main + paths: + - 'rust/**' + - '.github/workflows/rust.yml' + - 'README.md' + - 'LICENSE' + pull_request: + types: [opened, synchronize, reopened] + paths: + - 'rust/**' + - '.github/workflows/rust.yml' + - 'README.md' + - 'LICENSE' + workflow_dispatch: + inputs: + release_mode: + description: 'Manual release mode' + required: true + type: choice + default: 'instant' + options: + - instant + - changelog-pr + bump_type: + description: 'Version bump type' + required: true + type: choice + options: + - patch + - minor + - major + description: + description: 'Release description (optional)' + required: false + type: string + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} + +env: + CARGO_TERM_COLOR: always + CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN || secrets.CARGO_TOKEN }} + CARGO_TOKEN: ${{ secrets.CARGO_TOKEN }} + +jobs: + changelog: + name: Rust changelog fragment check + runs-on: ubuntu-latest + timeout-minutes: 10 + if: github.event_name == 'pull_request' + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + + - name: Install rust-script + run: cargo install rust-script + + - name: Check for changelog fragments + env: + GITHUB_BASE_REF: ${{ github.base_ref }} + run: rust-script rust/scripts/check-changelog-fragment.rs + + lint: + name: Lint and format Rust + runs-on: ubuntu-latest + timeout-minutes: 10 + needs: [changelog] + if: always() && (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || needs.changelog.result == 'success') + steps: + - uses: actions/checkout@v6 + + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + with: + components: rustfmt, clippy + + - name: Cache cargo registry + uses: actions/cache@v5 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + rust/target + key: ${{ runner.os }}-cargo-${{ hashFiles('rust/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo- + + - name: Check formatting + working-directory: rust + run: cargo fmt --all -- --check + + - name: Run Clippy + working-directory: rust + run: cargo clippy --all-targets --all-features + + test: + name: Test Rust (${{ matrix.os }}) + runs-on: ${{ matrix.os }} + timeout-minutes: 30 + needs: [changelog] + if: always() && (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || needs.changelog.result == 'success') + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + steps: + - uses: actions/checkout@v6 + + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + + - name: Cache cargo registry + uses: actions/cache@v5 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + rust/target + key: ${{ runner.os }}-cargo-${{ hashFiles('rust/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo- + + - name: Run tests + working-directory: rust + run: cargo test --all-features --verbose + + - name: Run doc tests + working-directory: rust + run: cargo test --doc --all-features --verbose + + scripts: + name: Test Rust release scripts + runs-on: ubuntu-latest + timeout-minutes: 15 + needs: [changelog] + if: always() && (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || needs.changelog.result == 'success') + steps: + - uses: actions/checkout@v6 + + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + + - name: Cache cargo registry + uses: actions/cache@v5 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + rust/target + key: ${{ runner.os }}-cargo-scripts-${{ hashFiles('rust/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo-scripts- + + - name: Install rust-script + run: cargo install rust-script + + - name: Run release script unit tests + # Run the inline `#[cfg(test)]` suites for every rust-script under + # rust/scripts/. `cargo test` only covers the library crate, so without + # this step the release-script regression tests (e.g. the rebase + # ordering guard) never execute in CI. + run: | + set -euo pipefail + status=0 + for f in rust/scripts/*.rs; do + if grep -q 'cfg(test)' "$f"; then + echo "::group::rust-script --test $f" + rust-script --test "$f" || status=1 + echo "::endgroup::" + fi + done + exit $status + + build: + name: Build Rust package + runs-on: ubuntu-latest + timeout-minutes: 10 + needs: [lint, test] + if: always() && !cancelled() && needs.lint.result == 'success' && needs.test.result == 'success' + steps: + - uses: actions/checkout@v6 + + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + + - name: Cache cargo registry + uses: actions/cache@v5 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + rust/target + key: ${{ runner.os }}-cargo-build-${{ hashFiles('rust/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo-build- + + - name: Build release + working-directory: rust + run: cargo build --release --verbose + + - name: Check package + working-directory: rust + run: cargo package --allow-dirty + + release: + name: Release Rust crate + needs: [lint, test, scripts, build] + # Required because lint/test depend on the pull-request-only changelog job, + # which is skipped on push events. + if: | + always() && !cancelled() && + github.ref == 'refs/heads/main' && + github.event_name == 'push' && + needs.lint.result == 'success' && + needs.test.result == 'success' && + needs.scripts.result == 'success' && + needs.build.result == 'success' + runs-on: ubuntu-latest + timeout-minutes: 30 + permissions: + contents: write + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + + - name: Install rust-script + run: cargo install rust-script + + - name: Determine bump type + id: bump + run: rust-script rust/scripts/get-bump-type.rs + + - name: Check whether Rust release is needed + id: release_needed + env: + HAS_FRAGMENTS: ${{ steps.bump.outputs.has_fragments }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_REPOSITORY: ${{ github.repository }} + run: rust-script rust/scripts/check-release-needed.rs --tag-prefix rust-v + + - name: Version Rust crate and commit to main + if: steps.release_needed.outputs.should_release == 'true' + id: version + run: rust-script rust/scripts/version-and-commit.rs --bump-type "${{ steps.bump.outputs.bump_type }}" --tag-prefix rust-v --release-label Rust + + - name: Read Rust release version + if: steps.release_needed.outputs.should_release == 'true' + id: current_version + run: rust-script rust/scripts/get-version.rs + + - name: Publish to crates.io + if: steps.version.outputs.version_committed == 'true' || steps.release_needed.outputs.skip_bump == 'true' + id: publish_crate + run: rust-script rust/scripts/publish-crate.rs + + - name: Create Rust GitHub Release + if: steps.publish_crate.outputs.publish_result == 'success' || steps.publish_crate.outputs.publish_result == 'already_exists' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: rust-script rust/scripts/create-github-release.rs --release-version "${{ steps.version.outputs.new_version || steps.current_version.outputs.version }}" --repository "${{ github.repository }}" --tag-prefix rust-v --language Rust --release-label Rust + + - name: Wait for crate availability + if: steps.publish_crate.outputs.publish_result == 'success' + run: rust-script rust/scripts/wait-for-crate.rs --version "${{ steps.version.outputs.new_version || steps.current_version.outputs.version }}" + + instant-release: + name: Instant Rust release + if: github.event_name == 'workflow_dispatch' && github.event.inputs.release_mode == 'instant' + runs-on: ubuntu-latest + timeout-minutes: 30 + permissions: + contents: write + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + + - name: Install rust-script + run: cargo install rust-script + + - name: Version Rust crate and commit to main + id: version + run: rust-script rust/scripts/version-and-commit.rs --bump-type "${{ github.event.inputs.bump_type }}" --description "${{ github.event.inputs.description }}" --tag-prefix rust-v --release-label Rust + + - name: Publish to crates.io + if: steps.version.outputs.version_committed == 'true' + id: publish_crate + run: rust-script rust/scripts/publish-crate.rs + + - name: Create Rust GitHub Release + if: steps.publish_crate.outputs.publish_result == 'success' || steps.publish_crate.outputs.publish_result == 'already_exists' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: rust-script rust/scripts/create-github-release.rs --release-version "${{ steps.version.outputs.new_version }}" --repository "${{ github.repository }}" --tag-prefix rust-v --language Rust --release-label Rust + + - name: Wait for crate availability + if: steps.publish_crate.outputs.publish_result == 'success' + run: rust-script rust/scripts/wait-for-crate.rs --version "${{ steps.version.outputs.new_version }}" + + changelog-pr: + name: Create Rust changelog PR + if: github.event_name == 'workflow_dispatch' && github.event.inputs.release_mode == 'changelog-pr' + runs-on: ubuntu-latest + timeout-minutes: 10 + permissions: + contents: write + pull-requests: write + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + + - name: Install rust-script + run: cargo install rust-script + + - name: Create changelog fragment + run: rust-script rust/scripts/create-changelog-fragment.rs --bump-type "${{ github.event.inputs.bump_type }}" --description "${{ github.event.inputs.description }}" + + - name: Create Pull Request + uses: peter-evans/create-pull-request@v8 + with: + token: ${{ secrets.GITHUB_TOKEN }} + commit-message: 'chore: add changelog fragment for manual Rust ${{ github.event.inputs.bump_type }} release' + branch: changelog-rust-manual-release-${{ github.run_id }} + delete-branch: true + title: 'chore: manual Rust ${{ github.event.inputs.bump_type }} release' + body: | + ## Manual Rust Release Request + + This PR was created by a manual workflow trigger to prepare a **${{ github.event.inputs.bump_type }}** crates.io release. + + ### Release Details + - Type: ${{ github.event.inputs.bump_type }} + - Description: ${{ github.event.inputs.description || 'Manual Rust release' }} + - Triggered by: @${{ github.actor }} From 50c467e9f84cff85cc0bc47c0d54ac7223897341 Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 4 Sep 2026 21:02:58 +0000 Subject: [PATCH 03/34] fix(ci): stop reporting a successful npm publish as a failure Issue #199. The release job for command-stream@0.20.1 logged a successful `changeset publish`, verified the registry once 2 seconds later, got a read-replica E404, republished, and npm answered npm error code E409 npm error 409 Conflict - PUT https://registry.npmjs.org/command-stream - Cannot publish over previously staged version "0.20.1" which matched the generic 'npm error code e' failure pattern. The job went red while 0.20.1 was live on npm. - Split publish orchestration into scripts/publish-retry.mjs: the publish command is retried only when the publish itself failed, and verification polls the registry with exponential backoff instead of sampling it once. - Treat 'already published' AND 'previously staged version' (E409) as a cue to verify, never as a failure. - Verify against registry metadata (scripts/npm-registry.mjs) rather than `npm view`, whose E404 is indistinguishable from a network hiccup. - Do not retry auth/registry-configuration failures (scripts/publish-failure-classifier.mjs); print actionable guidance instead. - Add scripts/debug-print.mjs: verbose `::debug::` tracing, default off, enabled with CI_SCRIPTS_DEBUG=1 or GitHub's re-run-with-debug-logging. The #166 guarantee is unchanged and re-asserted: a publish that never reaches npm still fails the release. Tests: js/tests/publish-retry.test.mjs, npm-registry.test.mjs, publish-failure-classifier.test.mjs, debug-print.test.mjs, and three new end-to-end cases in publish-to-npm.test.mjs driven by a stub registry that lags on demand. experiments/issue-199-publish-false-positive.mjs reproduces the old behaviour side by side with the new one. --- .../issue-199-publish-false-positive.mjs | 157 +++++++++++ js/scripts/debug-print.mjs | 113 ++++++++ js/scripts/npm-registry.mjs | 100 +++++++ js/scripts/publish-failure-classifier.mjs | 77 ++++++ js/scripts/publish-retry.mjs | 232 ++++++++++++++++ js/scripts/publish-to-npm.mjs | 234 +++++++++------- js/tests/debug-print.test.mjs | 70 +++++ js/tests/npm-registry.test.mjs | 105 ++++++++ js/tests/publish-failure-classifier.test.mjs | 42 +++ js/tests/publish-retry.test.mjs | 254 ++++++++++++++++++ js/tests/publish-to-npm.test.mjs | 203 ++++++++++++++ 11 files changed, 1489 insertions(+), 98 deletions(-) create mode 100644 experiments/issue-199-publish-false-positive.mjs create mode 100644 js/scripts/debug-print.mjs create mode 100644 js/scripts/npm-registry.mjs create mode 100644 js/scripts/publish-failure-classifier.mjs create mode 100644 js/scripts/publish-retry.mjs create mode 100644 js/tests/debug-print.test.mjs create mode 100644 js/tests/npm-registry.test.mjs create mode 100644 js/tests/publish-failure-classifier.test.mjs create mode 100644 js/tests/publish-retry.test.mjs diff --git a/experiments/issue-199-publish-false-positive.mjs b/experiments/issue-199-publish-false-positive.mjs new file mode 100644 index 0000000..d76e9c1 --- /dev/null +++ b/experiments/issue-199-publish-false-positive.mjs @@ -0,0 +1,157 @@ +#!/usr/bin/env bun + +/** + * Issue #199 β€” reproduce the npm publish false positive, then show the fix. + * + * Run: bun experiments/issue-199-publish-false-positive.mjs + * + * Simulates the exact sequence observed in run 33914574283 + * (dev/log/issues/199/pulls/200/ci-logs/run-33914574283.log): + * + * 1. `changeset publish` succeeds -> command-stream@0.20.1 is on npm + * 2. verification 2s later misses -> registry replica still answers 404 + * 3. the old loop republishes -> npm E409 "Cannot publish over + * previously staged version" + * 4. E409 matches 'npm error code e' -> reported as a hard failure + * + * The OLD strategy is reimplemented here verbatim so the regression is + * observable; the NEW strategy is imported from the real module. + */ + +import { publishWithRetry } from "../js/scripts/publish-retry.mjs"; + +const E409_STAGED_OUTPUT = [ + "npm error code E409", + 'npm error 409 Conflict - PUT https://registry.npmjs.org/command-stream - Cannot publish over previously staged version "0.20.1"', +].join("\n"); + +const FAILURE_PATTERNS = [ + "packages failed to publish", + "error occurred while publishing", + "npm error code e", + "npm error 404", + "npm error 401", + "npm error 403", + "access token expired", + "eneedauth", + "exited with code 1", +]; + +/** + * A registry that has the version but only reveals it from the Nth read on, + * mimicking npm's read-replica propagation lag. + * @param {number} visibleFromRead + */ +function makeLaggingRegistry(visibleFromRead) { + let reads = 0; + return { + get reads() { + return reads; + }, + async isPublished() { + return ++reads >= visibleFromRead; + }, + }; +} + +/** + * `changeset publish`: succeeds once, then answers E409 because the tarball is + * already staged. + */ +function makePublisher() { + let calls = 0; + return { + get calls() { + return calls; + }, + async run() { + calls++; + if (calls === 1) { + return { + code: 0, + output: "πŸ¦‹ success packages published successfully", + }; + } + return { code: 1, output: E409_STAGED_OUTPUT }; + }, + }; +} + +/** The pre-#199 algorithm: one verification sample, republish on a miss. */ +async function oldStrategy({ publisher, registry, maxRetries = 3 }) { + for (let attempt = 1; attempt <= maxRetries; attempt++) { + const { code, output } = await publisher.run(); + const lower = output.toLowerCase(); + const matched = FAILURE_PATTERNS.find((p) => lower.includes(p)); + if (matched) { + console.log( + ` attempt ${attempt}: failed β€” detected "${matched}" in output`, + ); + continue; + } + if (code !== 0) { + console.log(` attempt ${attempt}: failed β€” exit code ${code}`); + continue; + } + // Single-shot verification, no polling. + if (await registry.isPublished()) { + return { success: true, attempts: attempt }; + } + console.log( + ` attempt ${attempt}: verification missed, republishing (this is the bug)`, + ); + } + return { success: false, attempts: maxRetries }; +} + +/** The post-#199 algorithm, imported from the shipped module. */ +async function newStrategy({ publisher, registry }) { + return publishWithRetry({ + publish: async () => { + const { code, output } = await publisher.run(); + return { + success: code === 0, + error: code === 0 ? null : new Error(`exit code ${code}`), + output, + }; + }, + verify: () => registry.isPublished(), + maxRetries: 3, + retryDelay: 0, + sleepFn: async () => {}, + log: (message) => console.log(` ${message}`), + verifyOptions: { attempts: 7, initialDelay: 0, maxDelay: 0 }, + }); +} + +// The version becomes visible on the 2nd registry read β€” i.e. the very first +// sample misses, exactly as in the failing CI run. +const VISIBLE_FROM_READ = 2; + +console.log("OLD strategy (single-shot verification, republish on a miss):"); +const oldPublisher = makePublisher(); +const oldResult = await oldStrategy({ + publisher: oldPublisher, + registry: makeLaggingRegistry(VISIBLE_FROM_READ), +}); +console.log( + ` => success=${oldResult.success}, publish invocations=${oldPublisher.calls}\n`, +); + +console.log("NEW strategy (bounded verification polling, no republish):"); +const newPublisher = makePublisher(); +const newResult = await newStrategy({ + publisher: newPublisher, + registry: makeLaggingRegistry(VISIBLE_FROM_READ), +}); +console.log( + ` => success=${newResult.success}, publish invocations=${newPublisher.calls}\n`, +); + +const reproduced = oldResult.success === false && newResult.success === true; +console.log( + reproduced + ? "βœ… Reproduced: the old strategy fails a successful release, the new one does not." + : "❌ Not reproduced.", +); +process.exit(reproduced ? 0 : 1); diff --git a/js/scripts/debug-print.mjs b/js/scripts/debug-print.mjs new file mode 100644 index 0000000..53b2764 --- /dev/null +++ b/js/scripts/debug-print.mjs @@ -0,0 +1,113 @@ +#!/usr/bin/env node + +/** + * Lightweight debug logger for the pipeline scripts. + * + * When a dependency fails to load, a bare `$ is not a function` says nothing + * about the module shape that produced it. This helper lets the scripts keep + * such tracing in the code with the default state switched off, so an interop + * regression stays readable from the CI log alone. + * + * Activation: + * - CI_SCRIPTS_DEBUG=1 (preferred local toggle), or + * - RUNNER_DEBUG=1 (GitHub "Re-run all jobs with debug logging"), or + * - ACTIONS_STEP_DEBUG=true (the secret-gated workflow debug switch). + * + * Every line is prefixed with `::debug::` so GitHub Actions renders it in the + * collapsible debug stream, keeping the main log clean. + * + * Usage: + * import { debug } from './debug-print.mjs'; + * debug('loaded command-stream', { keys }); + */ + +/** + * Read one environment variable without ever throwing. + * + * Deno denies `process.env` access unless the run was granted `--allow-env` + * (the Deno test job only passes `--allow-read`), and the denial surfaces as a + * `NotCapable` error on the property read itself. Tracing must never be the + * reason a script or a test fails, so an unreadable variable counts as unset. + * + * @param {string} name variable to read + * @param {Record} [env] explicit source, for tests + * @returns {string | undefined} + */ +export function readEnvVar(name, env) { + const source = + env ?? (typeof process === 'undefined' ? undefined : process.env); + if (!source) { + return undefined; + } + try { + return source[name]; + } catch { + return undefined; + } +} + +/** + * @param {Record} [env] explicit source, for tests + * @returns {boolean} true when debug output is enabled for this process + */ +export function isDebugEnabled(env) { + const flag = readEnvVar('CI_SCRIPTS_DEBUG', env); + return ( + flag === '1' || + flag === 'true' || + readEnvVar('RUNNER_DEBUG', env) === '1' || + readEnvVar('ACTIONS_STEP_DEBUG', env) === 'true' + ); +} + +function format(value) { + if (typeof value === 'string') { + return value; + } + try { + return JSON.stringify(value, null, 2); + } catch { + return String(value); + } +} + +/** + * Render the lines `debug()` would print, without printing them. + * @param {unknown[]} parts values to join into one message + * @returns {string[]} `::debug::`-prefixed lines + */ +export function formatDebugLines(parts) { + return parts + .map(format) + .join(' ') + .split('\n') + .map((chunk) => `::debug::${chunk}`); +} + +/** + * Print a debug line through injected collaborators, but only when debug + * output is enabled. `debug()` is the production binding of this function. + * + * @param {{env?: Record, log?: (line: string) => void}} options + * @param {...unknown} parts values to join into one message + * @returns {string[]} the lines printed, empty when debug output is off + */ +export function debugWith(options, ...parts) { + const { env, log = console.log } = options ?? {}; + if (!isDebugEnabled(env)) { + return []; + } + const lines = formatDebugLines(parts); + for (const line of lines) { + log(line); + } + return lines; +} + +/** + * Print a debug line, but only when debug output is enabled. + * @param {...unknown} parts values to join into one message + */ +export function debug(...parts) { + return debugWith({}, ...parts); +} diff --git a/js/scripts/npm-registry.mjs b/js/scripts/npm-registry.mjs new file mode 100644 index 0000000..f1472d7 --- /dev/null +++ b/js/scripts/npm-registry.mjs @@ -0,0 +1,100 @@ +export const DEFAULT_NPM_REGISTRY_URL = 'https://registry.npmjs.org'; + +function getNpmRegistryFromEnv() { + try { + // npm itself reads the lowercase `npm_config_registry` form, so honor both. + return ( + process.env.NPM_CONFIG_REGISTRY || process.env.npm_config_registry || '' + ); + } catch { + return ''; + } +} + +/** + * Normalize an npm registry URL so package metadata paths can be appended. + * @param {string} registryUrl + * @returns {string} + */ +export function normalizeRegistryUrl( + registryUrl = getNpmRegistryFromEnv() || DEFAULT_NPM_REGISTRY_URL +) { + return String(registryUrl || DEFAULT_NPM_REGISTRY_URL).replace(/\/+$/, ''); +} + +/** + * Encode a package name for npm registry metadata URLs. + * @param {string} packageName + * @returns {string} + */ +export function encodePackageName(packageName) { + if (typeof packageName !== 'string' || packageName.trim() === '') { + throw new Error('Package name is required'); + } + + if (packageName.startsWith('@')) { + const [scope, name] = packageName.split('/'); + if (!scope || !name) { + throw new Error(`Invalid scoped package name: ${packageName}`); + } + return `${scope}%2F${encodeURIComponent(name)}`; + } + + return encodeURIComponent(packageName); +} + +/** + * Build the npm registry package metadata URL. + * @param {string} packageName + * @param {string} registryUrl + * @returns {string} + */ +export function buildPackageMetadataUrl( + packageName, + registryUrl = getNpmRegistryFromEnv() || DEFAULT_NPM_REGISTRY_URL +) { + return `${normalizeRegistryUrl(registryUrl)}/${encodePackageName(packageName)}`; +} + +/** + * Check whether a package version exists in npm registry metadata. + * HTTP 404 means the package has not been published yet and is not an error. + * @param {string} packageName + * @param {string} version + * @param {object} options + * @param {Function} [options.fetchFn] + * @param {string} [options.registryUrl] + * @returns {Promise} + */ +export async function isPackageVersionPublished( + packageName, + version, + { + fetchFn = fetch, + registryUrl = getNpmRegistryFromEnv() || DEFAULT_NPM_REGISTRY_URL, + } = {} +) { + if (typeof version !== 'string' || version.trim() === '') { + throw new Error('Package version is required'); + } + + const metadataUrl = buildPackageMetadataUrl(packageName, registryUrl); + const response = await fetchFn(metadataUrl, { + headers: { + accept: 'application/json', + }, + }); + + if (response.status === 404) { + return false; + } + + if (!response.ok) { + throw new Error( + `Failed to fetch npm package metadata for ${packageName}: ${response.status} ${response.statusText}` + ); + } + + const metadata = await response.json(); + return Object.hasOwn(metadata?.versions || {}, version); +} diff --git a/js/scripts/publish-failure-classifier.mjs b/js/scripts/publish-failure-classifier.mjs new file mode 100644 index 0000000..cbd818a --- /dev/null +++ b/js/scripts/publish-failure-classifier.mjs @@ -0,0 +1,77 @@ +/** + * Classify npm publish failures and build actionable guidance. + * + * Some publish failures are permanent: retrying a 404/401/403 (or any auth / + * registry-configuration error) produces the same error every time and only + * delays a clear, actionable message. The most common case is the FIRST publish + * of a brand-new package via npm OIDC trusted publishing, which returns E404 + * because npm cannot bootstrap a new package with trusted publishing alone β€” a + * trusted publisher can only be configured for a package that already exists. + * + * Addresses issue: + * - link-foundation/js-ai-driven-development-pipeline-template#77 + */ + +// Failures caused by authentication / registry configuration. Retrying these is +// pointless and only hides the real cause behind a generic +// "Failed to publish after N attempts" message. +export const NON_RETRYABLE_PATTERNS = [ + 'npm error 404', + 'npm error 401', + 'npm error 403', + 'e404', + 'e401', + 'e403', + 'access token expired', + 'eneedauth', + 'you must be logged in', + 'unable to authenticate', +]; + +/** + * Determine whether a detected failure is caused by authentication / registry + * configuration (and therefore should not be retried). + * @param {string} output - Combined stdout and stderr (and/or error message) + * @returns {boolean} + */ +export function isNonRetryableFailure(output) { + const lowerOutput = String(output || '').toLowerCase(); + return NON_RETRYABLE_PATTERNS.some((pattern) => + lowerOutput.includes(pattern) + ); +} + +/** + * Build an actionable, human-readable explanation for an authentication / + * registry-configuration publish failure (most commonly an E404 on the very + * first publish of a brand-new package via OIDC trusted publishing). + * @param {string} packageName - The package that failed to publish + * @returns {string} + */ +export function buildAuthFailureGuidance(packageName) { + return [ + '', + '=== NPM PUBLISH AUTHENTICATION / REGISTRY FAILURE ===', + '', + `Failed to publish ${packageName}. This is an authentication or registry`, + 'configuration error, not a transient one, so it was not retried.', + '', + 'Most common cause: the FIRST publish of a brand-new package via npm OIDC', + 'trusted publishing returns "E404 Not Found - PUT". npm cannot bootstrap a', + 'new package with trusted publishing alone, because a trusted publisher can', + 'only be configured for a package that already exists on the registry.', + '', + 'SOLUTION (choose one):', + ' 1. Bootstrap the first release with a classic automation token:', + ' - Create a granular/automation token on npmjs.com with publish access.', + ' - Add it as the repository secret NPM_TOKEN.', + ' - The release workflow passes it as NODE_AUTH_TOKEN automatically, so', + ' the next run will publish the initial version.', + ' 2. After the package exists, configure OIDC trusted publishing on', + ' npmjs.com (Package settings -> Trusted publishing) so future releases', + ' need no token at all. The NPM_TOKEN secret then becomes optional.', + '', + 'See: https://docs.npmjs.com/trusted-publishers', + '', + ].join('\n'); +} diff --git a/js/scripts/publish-retry.mjs b/js/scripts/publish-retry.mjs new file mode 100644 index 0000000..544bba7 --- /dev/null +++ b/js/scripts/publish-retry.mjs @@ -0,0 +1,232 @@ +/** + * Publish orchestration helpers that keep the two failure domains separate: + * + * - the publish command itself failing (retryable: run `changeset publish` again) + * - post-publish verification missing because the npm registry has not + * propagated yet (NOT retryable by republishing: the only correct response is + * to look again) + * + * A single verification check a couple of seconds after a successful publish + * samples a race. Issue #199 is exactly that race: on 2026-09-04 the release job + * for command-stream@0.20.1 logged + * + * πŸ¦‹ success packages published successfully: + * πŸ¦‹ command-stream@0.20.1 + * + * and then, 2 seconds later, `npm view command-stream@0.20.1 version` answered + * `E404 No match found for version 0.20.1` because the registry read replica had + * not caught up. The old loop treated that miss as "publish failed" and + * republished, which npm rejected with + * + * npm error code E409 + * npm error 409 Conflict - PUT https://registry.npmjs.org/command-stream - + * Cannot publish over previously staged version "0.20.1" + * + * The release was reported red even though 0.20.1 was live on npm. + * + * Ported from link-foundation/js-ai-driven-development-pipeline-template + * (scripts/publish-retry.mjs) and extended with the E409 "previously staged + * version" patterns that the template is still missing. + */ + +export const DEFAULT_VERIFY_ATTEMPTS = 7; +export const DEFAULT_VERIFY_INITIAL_DELAY = 2000; +export const DEFAULT_VERIFY_MAX_DELAY = 30000; + +/** + * Default sleep implementation. + * @param {number} ms + * @returns {Promise} + */ +export function sleep(ms) { + return new Promise((resolve) => globalThis.setTimeout(resolve, ms)); +} + +/** + * Patterns that mean "this exact version is already on the registry". + * Such an error is a cue to verify, not to fail. + * + * npm distinguishes *published* from *staged*: a version whose tarball reached + * the registry but whose metadata write is still settling is reported as + * `Cannot publish over previously staged version`. Both wordings prove the + * version exists, so both must be treated the same way. + */ +export const ALREADY_PUBLISHED_PATTERNS = [ + 'epublishconflict', + 'cannot publish over the previously published version', + 'cannot publish over previously published version', + 'you cannot publish over the previously published versions', + 'cannot publish over the previously staged version', + 'cannot publish over previously staged version', + 'previously staged version', + 'already published', + 'npm error code e409', + 'npm error 409', + '409 conflict', +]; + +/** + * Check whether publish output indicates the version is already published. + * @param {string} output + * @returns {boolean} + */ +export function isAlreadyPublishedError(output) { + const lowerOutput = String(output || '').toLowerCase(); + return ALREADY_PUBLISHED_PATTERNS.some((pattern) => + lowerOutput.includes(pattern) + ); +} + +/** + * Poll the registry until the version becomes visible, using exponential + * backoff. Returns true as soon as the version is found. + * @param {object} options + * @param {Function} options.verify - async () => boolean + * @param {number} [options.attempts] + * @param {number} [options.initialDelay] + * @param {number} [options.maxDelay] + * @param {Function} [options.sleepFn] + * @param {Function} [options.log] + * @returns {Promise} + */ +export async function waitForVersionOnRegistry({ + verify, + attempts = DEFAULT_VERIFY_ATTEMPTS, + initialDelay = DEFAULT_VERIFY_INITIAL_DELAY, + maxDelay = DEFAULT_VERIFY_MAX_DELAY, + sleepFn = sleep, + log = () => {}, +}) { + let delay = initialDelay; + for (let attempt = 1; attempt <= attempts; attempt++) { + await sleepFn(delay); + let found = false; + try { + found = await verify(); + } catch (error) { + // A transient registry/network error is indistinguishable from a miss + // here, so polling continues and the release is not failed at this point. + log(`Verification attempt ${attempt} errored: ${error.message}`); + } + if (found) { + log(`Verification succeeded on attempt ${attempt}`); + return true; + } + log( + `Verification attempt ${attempt} of ${attempts}: version not visible yet` + ); + delay = Math.min(delay * 2, maxDelay); + } + return false; +} + +/** + * Decide whether a publish invocation should move on to verification. + * @param {object} outcome + * @param {boolean} outcome.success + * @param {Error} [outcome.error] + * @param {string} [outcome.output] + * @param {Function} outcome.log + * @returns {boolean} + */ +export function shouldVerify({ success, error, output, log = () => {} }) { + if (success) { + return true; + } + if (!isAlreadyPublishedError(output || error?.message || '')) { + return false; + } + log( + 'Publish reported the version is already published or staged, verifying registry.' + ); + return true; +} + +/** + * Build the result of the verification stage. A verification miss is terminal: + * the publish path must not be re-entered, because the package may already be + * live and republishing would fail with a conflict. + * @param {boolean} verified + * @returns {{success: boolean, error: Error|null}} + */ +function verificationOutcome(verified) { + if (verified) { + return { success: true, error: null }; + } + const error = new Error( + 'Package not found on npm after publish; verification polling exhausted' + ); + error.nonRetryable = true; + error.verificationFailed = true; + return { success: false, error }; +} + +/** + * Run the publish command with retries, then verify with bounded polling. + * + * The publish command is retried only when the publish itself failed. Once a + * publish reports success (or reports an "already published"/"already staged" + * conflict), the flow moves to verification and never re-enters the publish + * path. + * + * Verification is still required: a publish that falsely claims success still + * fails the release (issue #166). + * + * @param {object} options + * @param {Function} options.publish - async () => ({ success, error, output }) + * @param {Function} options.verify - async () => boolean + * @param {number} [options.maxRetries] + * @param {number} [options.retryDelay] + * @param {Function} [options.sleepFn] + * @param {Function} [options.log] + * @param {object} [options.verifyOptions] + * @returns {Promise<{success: boolean, error: Error|null, publishAttempts: number}>} + */ +export async function publishWithRetry({ + publish, + verify, + maxRetries = 3, + retryDelay = 10000, + sleepFn = sleep, + log = () => {}, + verifyOptions = {}, +}) { + let publishAttempts = 0; + let lastError = null; + + for (let attempt = 1; attempt <= maxRetries; attempt++) { + log(`Publish attempt ${attempt} of ${maxRetries}...`); + publishAttempts++; + const { success, error, output } = await publish(); + + if (shouldVerify({ success, error, output, log })) { + const verified = await waitForVersionOnRegistry({ + verify, + sleepFn, + log, + ...verifyOptions, + }); + return { ...verificationOutcome(verified), publishAttempts }; + } + + lastError = error; + + if (error?.nonRetryable) { + return { success: false, error, publishAttempts }; + } + + if (attempt < maxRetries) { + log( + `Publish failed: ${error?.message}, waiting ${retryDelay / 1000}s before retry...` + ); + await sleepFn(retryDelay); + } + } + + return { + success: false, + error: + lastError || new Error(`Failed to publish after ${maxRetries} attempts`), + publishAttempts, + }; +} diff --git a/js/scripts/publish-to-npm.mjs b/js/scripts/publish-to-npm.mjs index f405299..3fbcd23 100644 --- a/js/scripts/publish-to-npm.mjs +++ b/js/scripts/publish-to-npm.mjs @@ -5,23 +5,34 @@ * Usage: bun scripts/publish-to-npm.mjs [--should-pull] * should_pull: Optional flag to pull latest changes before publishing (for release job) * - * IMPORTANT: Update the PACKAGE_NAME constant below to match your package.json - * * Reliable success detection (prevents false-positive releases): * command-stream's `$` does NOT throw on a non-zero exit code (errexit is * off by default β€” see issue #156). A bare `await $`cmd`` therefore never - * rejects, so a try/catch around it can never observe a failure. The previous - * version of this script relied on that catch, so a failed `changeset publish` - * (e.g. npm E404) was silently reported as a success β€” which created a - * GitHub release (`js-v0.10.1`) for a version that never reached npm (#166). + * rejects, so a try/catch around it can never observe a failure. An early + * version of this script relied on that catch, so a failed + * `changeset publish` (e.g. npm E404) was silently reported as a success β€” + * which created a GitHub release (`js-v0.10.1`) for a version that never + * reached npm (#166). Output scanning, the exit code and a registry check are + * therefore all required. + * + * Reliable failure detection (prevents false-negative releases): + * The registry check must be *bounded polling*, not a single sample. npm + * serves package metadata from read replicas, so a version can be published + * and still answer 404 for several seconds. Issue #199: command-stream@0.20.1 + * published successfully, failed a single verification 2s later, was + * republished, and npm answered + * `E409 ... Cannot publish over previously staged version "0.20.1"` β€” which + * the old code counted as a hard failure. The release was red while the + * package was live on npm. + * + * Both concerns now live in scripts/publish-retry.mjs: the publish command is + * retried only when the publish itself failed, and an "already published" or + * "already staged" conflict is a cue to verify rather than to fail. * - * This version mirrors the multi-layer detection used by the pipeline - * template (link-foundation/js-ai-driven-development-pipeline-template, - * originally link-assistant/agent PR #116): - * 1. scan the captured output for known failure patterns, - * 2. check the captured exit code, and - * 3. verify the version is actually visible on npm with `npm view`. - * A publish is only reported when all three layers pass. + * Verbose tracing: + * Set CI_SCRIPTS_DEBUG=1 (or re-run the job with GitHub's debug logging, which + * sets RUNNER_DEBUG=1) to emit `::debug::` lines describing every publish and + * verification decision. Off by default. * * Uses link-foundation libraries: * - use-m: Dynamic package loading without package.json dependencies @@ -30,8 +41,22 @@ */ import { readFileSync, appendFileSync } from 'fs'; +import { debug } from './debug-print.mjs'; +import { isPackageVersionPublished } from './npm-registry.mjs'; +import { + buildAuthFailureGuidance, + isNonRetryableFailure, +} from './publish-failure-classifier.mjs'; +import { + DEFAULT_VERIFY_ATTEMPTS, + DEFAULT_VERIFY_INITIAL_DELAY, + DEFAULT_VERIFY_MAX_DELAY, + isAlreadyPublishedError, + publishWithRetry, + sleep, +} from './publish-retry.mjs'; -const PACKAGE_NAME = 'command-stream'; +const FALLBACK_PACKAGE_NAME = 'command-stream'; // Load use-m dynamically const { use } = eval( @@ -55,10 +80,23 @@ const config = makeConfig({ const { shouldPull } = config; const MAX_RETRIES = 3; // Configurable so tests can run the retry loop without waiting (see -// tests/publish-to-npm.test.mjs). Defaults to 10s for real CI runs. +// tests/publish-to-npm.test.mjs). Defaults are tuned for real CI runs. const RETRY_DELAY = Number(process.env.PUBLISH_RETRY_DELAY ?? 10000); // ms -// Wait for the npm registry to propagate before verifying a fresh publish. -const VERIFY_DELAY = Number(process.env.PUBLISH_VERIFY_DELAY ?? 2000); // ms +const VERIFY_DELAY = Number( + process.env.PUBLISH_VERIFY_DELAY ?? DEFAULT_VERIFY_INITIAL_DELAY +); // ms +const VERIFY_ATTEMPTS = Number( + process.env.PUBLISH_VERIFY_ATTEMPTS ?? DEFAULT_VERIFY_ATTEMPTS +); +const VERIFY_MAX_DELAY = Number( + process.env.PUBLISH_VERIFY_MAX_DELAY ?? DEFAULT_VERIFY_MAX_DELAY +); +// Registry used for the publication check only. Unset in production, where +// npm-registry.mjs falls back to NPM_CONFIG_REGISTRY and then to +// https://registry.npmjs.org. Tests point it at a stub registry; overriding +// NPM_CONFIG_REGISTRY instead would also redirect use-m's own module +// installation, which must keep talking to the real registry. +const REGISTRY_URL = process.env.PUBLISH_REGISTRY_URL || undefined; // Patterns that indicate a publish failure in the changeset/npm output. // `changeset publish` can print these and still exit 0 in some npm versions, @@ -76,14 +114,6 @@ const FAILURE_PATTERNS = [ 'exited with code 1', ]; -/** - * Sleep for specified milliseconds - * @param {number} ms - */ -function sleep(ms) { - return new Promise((resolve) => globalThis.setTimeout(resolve, ms)); -} - /** * Append to GitHub Actions output file * @param {string} key @@ -113,62 +143,71 @@ function detectPublishFailure(output) { /** * Verify a package version is actually published on npm. + * + * Reads the registry metadata document directly instead of shelling out to + * `npm view`: `npm view` mixes registry state with local cache/auth + * configuration, and its E404 is indistinguishable from a network hiccup. + * * @param {string} packageName * @param {string} version * @returns {Promise} */ async function verifyPublished(packageName, version) { - const result = await $`npm view "${packageName}@${version}" version`.run({ - capture: true, + const published = await isPackageVersionPublished(packageName, version, { + registryUrl: REGISTRY_URL, }); - return result.code === 0 && result.stdout.trim().includes(version); + debug('registry verification', { packageName, version, published }); + return published; } /** - * Run `changeset:publish` once and decide whether it really succeeded. + * Run `changeset:publish` once and report what happened. * - * command-stream does not throw on non-zero exits, so we capture the output - * and apply three independent checks before trusting the result. + * command-stream does not throw on non-zero exits, so the output and exit code + * are captured and classified here. Registry verification is *not* done here: + * it belongs to publishWithRetry, which must never republish just because a + * verification sample missed. * - * @param {string} packageName - * @param {string} version - * @returns {Promise<{success: boolean, error: Error|null}>} + * @returns {Promise<{success: boolean, error: Error|null, output: string}>} */ -async function attemptPublish(packageName, version) { +async function attemptPublish() { // IMPORTANT: capture:true mirrors output to the console *and* returns it, // so CI logs stay readable while we still get the text and exit code. const result = await $`bun run changeset:publish`.run({ capture: true }); const combinedOutput = `${result.stdout || ''}\n${result.stderr || ''}`; + debug('changeset publish exit code', result.code); - // Layer 1: scan output for known failure signatures. - const failurePattern = detectPublishFailure(combinedOutput); - if (failurePattern) { + // An "already published"/"already staged" conflict proves the version exists. + // Report it verbatim so publishWithRetry moves to verification instead of + // republishing (issue #199). + if (isAlreadyPublishedError(combinedOutput)) { return { success: false, - error: new Error(`detected "${failurePattern}" in publish output`), + error: new Error('npm reports this version is already on the registry'), + output: combinedOutput, }; } - // Layer 2: trust the exit code when it is non-zero. - if (result.code !== 0) { - return { - success: false, - error: new Error(`changeset publish exited with code ${result.code}`), - }; + // Layer 1: scan output for known failure signatures. + const failurePattern = detectPublishFailure(combinedOutput); + if (failurePattern) { + const error = new Error(`detected "${failurePattern}" in publish output`); + // Auth / registry-configuration failures repeat identically on every retry. + error.nonRetryable = isNonRetryableFailure(combinedOutput); + return { success: false, error, output: combinedOutput }; } - // Layer 3: confirm the version is really on npm (the ultimate check). - console.log('Verifying package was published to npm...'); - await sleep(VERIFY_DELAY); - if (await verifyPublished(packageName, version)) { - return { success: true, error: null }; + // Layer 2: trust the exit code when it is non-zero. + if (result.code !== 0) { + const error = new Error( + `changeset publish exited with code ${result.code}` + ); + error.nonRetryable = isNonRetryableFailure(combinedOutput); + return { success: false, error, output: combinedOutput }; } - return { - success: false, - error: new Error('version not found on npm after publish attempt'), - }; + return { success: true, error: null, output: combinedOutput }; } async function main() { @@ -181,66 +220,65 @@ async function main() { // Get current version const packageJson = JSON.parse(readFileSync('./package.json', 'utf8')); const currentVersion = packageJson.version; + const packageName = packageJson.name || FALLBACK_PACKAGE_NAME; console.log(`Current version to publish: ${currentVersion}`); + debug('resolved package', { packageName, currentVersion }); // Check if this version is already published on npm console.log( `Checking if version ${currentVersion} is already published...` ); - const checkResult = - await $`npm view "${PACKAGE_NAME}@${currentVersion}" version`.run({ - capture: true, - }); - - // command-stream returns { code: 0 } on success, { code: 1 } on failure (e.g., E404) - // Exit code 0 means version exists, non-zero means version not found - if (checkResult.code === 0) { + if (await verifyPublished(packageName, currentVersion)) { console.log(`Version ${currentVersion} is already published to npm`); setOutput('published', 'true'); setOutput('published_version', currentVersion); setOutput('already_published', 'true'); return; - } else { - // Version not found on npm (E404), proceed with publish - console.log( - `Version ${currentVersion} not found on npm, proceeding with publish...` - ); } - // Publish to npm using OIDC trusted publishing with retry logic. - // Multi-layer failure detection prevents false-positive releases (#166). - for (let i = 1; i <= MAX_RETRIES; i++) { - console.log(`Publish attempt ${i} of ${MAX_RETRIES}...`); - const { success, error } = await attemptPublish( - PACKAGE_NAME, - currentVersion - ); + console.log( + `Version ${currentVersion} not found on npm, proceeding with publish...` + ); + + // Publish to npm using OIDC trusted publishing. + // - the publish command is retried only when the publish itself failed + // (#166: a silent failure must never be reported as a release), and + // - verification polls the registry with exponential backoff instead of + // sampling it once (#199: a propagation lag must never be reported as a + // failure). + const { success, error } = await publishWithRetry({ + publish: attemptPublish, + verify: () => verifyPublished(packageName, currentVersion), + maxRetries: MAX_RETRIES, + retryDelay: RETRY_DELAY, + sleepFn: sleep, + log: console.log, + verifyOptions: { + attempts: VERIFY_ATTEMPTS, + initialDelay: VERIFY_DELAY, + maxDelay: VERIFY_MAX_DELAY, + }, + }); - if (success) { - setOutput('published', 'true'); - setOutput('published_version', currentVersion); - console.log(`βœ… Published ${PACKAGE_NAME}@${currentVersion} to npm`); - return; - } - - if (i < MAX_RETRIES) { - console.log( - `Publish failed: ${error.message}, waiting ${RETRY_DELAY / 1000}s before retry...` - ); - await sleep(RETRY_DELAY); - } else { - console.error(`Publish attempt ${i} failed: ${error.message}`); - } + if (success) { + setOutput('published', 'true'); + setOutput('published_version', currentVersion); + console.log(`βœ… Published ${packageName}@${currentVersion} to npm`); + return; } - console.error(`❌ Failed to publish after ${MAX_RETRIES} attempts`); - console.error( - 'Hint: an npm E404 on PUT usually means OIDC trusted publishing is not ' + - 'configured for this workflow file. npm allows only one workflow file ' + - 'as a trusted publisher; if the release workflow was renamed (e.g. ' + - 'release.yml -> js.yml), update the trusted publisher on npmjs.com. ' + - 'See docs/case-studies/issue-166/README.md.' - ); + console.error(`❌ Failed to publish ${packageName}@${currentVersion}`); + console.error(`Reason: ${error?.message}`); + if (error?.nonRetryable && !error?.verificationFailed) { + console.error(buildAuthFailureGuidance(packageName)); + console.error( + 'Hint: an npm E404 on PUT usually means OIDC trusted publishing is not ' + + 'configured for this workflow file. npm allows only one workflow file ' + + 'as a trusted publisher; if the release workflow was renamed (e.g. ' + + 'release.yml -> js.yml), update the trusted publisher on npmjs.com. ' + + 'See docs/case-studies/issue-166/README.md.' + ); + } // Ensure no false-positive output leaks to the release job. setOutput('published', 'false'); process.exit(1); diff --git a/js/tests/debug-print.test.mjs b/js/tests/debug-print.test.mjs new file mode 100644 index 0000000..ebcf025 --- /dev/null +++ b/js/tests/debug-print.test.mjs @@ -0,0 +1,70 @@ +// Unit tests for js/scripts/debug-print.mjs +// +// The release scripts keep verbose tracing in the code with the default state +// switched off, so a failing run can be re-run with debug logging and produce +// the evidence needed to find a root cause without a code change. + +import { test, expect } from 'bun:test'; +import { + debugWith, + formatDebugLines, + isDebugEnabled, + readEnvVar, +} from '../scripts/debug-print.mjs'; + +test('debug output is off by default', () => { + expect(isDebugEnabled({})).toBe(false); +}); + +test('every documented switch enables debug output', () => { + expect(isDebugEnabled({ CI_SCRIPTS_DEBUG: '1' })).toBe(true); + expect(isDebugEnabled({ CI_SCRIPTS_DEBUG: 'true' })).toBe(true); + expect(isDebugEnabled({ RUNNER_DEBUG: '1' })).toBe(true); + expect(isDebugEnabled({ ACTIONS_STEP_DEBUG: 'true' })).toBe(true); +}); + +test('an unreadable environment counts as unset', () => { + const hostile = new Proxy( + {}, + { + get() { + throw new Error('NotCapable'); + }, + } + ); + expect(readEnvVar('CI_SCRIPTS_DEBUG', hostile)).toBeUndefined(); + expect(isDebugEnabled(hostile)).toBe(false); +}); + +test('lines are prefixed for the GitHub Actions debug stream', () => { + expect(formatDebugLines(['first\nsecond'])).toEqual([ + '::debug::first', + '::debug::second', + ]); +}); + +test('objects are serialized', () => { + expect(formatDebugLines([{ published: true }])).toEqual([ + '::debug::{', + '::debug:: "published": true', + '::debug::}', + ]); +}); + +test('nothing is printed while debug output is off', () => { + const lines = []; + expect(debugWith({ env: {}, log: (l) => lines.push(l) }, 'hidden')).toEqual( + [] + ); + expect(lines).toEqual([]); +}); + +test('lines are printed once debug output is on', () => { + const lines = []; + debugWith( + { env: { CI_SCRIPTS_DEBUG: '1' }, log: (l) => lines.push(l) }, + 'visible', + { code: 0 } + ); + expect(lines[0]).toBe('::debug::visible {'); +}); diff --git a/js/tests/npm-registry.test.mjs b/js/tests/npm-registry.test.mjs new file mode 100644 index 0000000..93fa664 --- /dev/null +++ b/js/tests/npm-registry.test.mjs @@ -0,0 +1,105 @@ +// Unit tests for js/scripts/npm-registry.mjs +// +// The publish verification in scripts/publish-to-npm.mjs reads registry +// metadata directly rather than shelling out to `npm view`, because `npm view` +// mixes registry state with local cache/auth configuration and its E404 is +// indistinguishable from a network hiccup (issue #199). + +import { test, expect } from 'bun:test'; +import { + buildPackageMetadataUrl, + encodePackageName, + isPackageVersionPublished, + normalizeRegistryUrl, +} from '../scripts/npm-registry.mjs'; + +function jsonResponse(status, body, statusText = 'OK') { + return { + ok: status >= 200 && status < 300, + status, + statusText, + async json() { + return body; + }, + }; +} + +test('normalizes registry URLs by stripping trailing slashes', () => { + expect(normalizeRegistryUrl('https://registry.npmjs.org///')).toBe( + 'https://registry.npmjs.org' + ); + expect(normalizeRegistryUrl('')).toBe('https://registry.npmjs.org'); +}); + +test('encodes unscoped and scoped package names', () => { + expect(encodePackageName('command-stream')).toBe('command-stream'); + expect(encodePackageName('@scope/pkg')).toBe('@scope%2Fpkg'); +}); + +test('rejects an empty package name', () => { + expect(() => encodePackageName('')).toThrow('Package name is required'); + expect(() => encodePackageName(' ')).toThrow('Package name is required'); +}); + +test('builds metadata URLs', () => { + expect(buildPackageMetadataUrl('command-stream')).toBe( + 'https://registry.npmjs.org/command-stream' + ); + expect(buildPackageMetadataUrl('@scope/pkg')).toBe( + 'https://registry.npmjs.org/@scope%2Fpkg' + ); +}); + +test('reports a published version as published', async () => { + const published = await isPackageVersionPublished( + 'command-stream', + '0.20.1', + { + fetchFn: async () => + jsonResponse(200, { versions: { '0.20.0': {}, '0.20.1': {} } }), + } + ); + expect(published).toBe(true); +}); + +test('reports a missing version as not published', async () => { + const published = await isPackageVersionPublished( + 'command-stream', + '99.99.99', + { fetchFn: async () => jsonResponse(200, { versions: { '0.20.1': {} } }) } + ); + expect(published).toBe(false); +}); + +test('treats a 404 as "not published", not an error', async () => { + const published = await isPackageVersionPublished('brand-new-pkg', '1.0.0', { + fetchFn: async () => jsonResponse(404, {}, 'Not Found'), + }); + expect(published).toBe(false); +}); + +test('surfaces other HTTP failures so polling can retry them', async () => { + await expect( + isPackageVersionPublished('command-stream', '0.20.1', { + fetchFn: async () => jsonResponse(503, {}, 'Service Unavailable'), + }) + ).rejects.toThrow('503 Service Unavailable'); +}); + +test('requires a version', async () => { + await expect( + isPackageVersionPublished('command-stream', '', { fetchFn: async () => {} }) + ).rejects.toThrow('Package version is required'); +}); + +test('honours a custom registry URL', async () => { + let requestedUrl = ''; + await isPackageVersionPublished('command-stream', '1.0.0', { + registryUrl: 'https://registry.example.com/', + fetchFn: async (url) => { + requestedUrl = url; + return jsonResponse(200, { versions: { '1.0.0': {} } }); + }, + }); + expect(requestedUrl).toBe('https://registry.example.com/command-stream'); +}); diff --git a/js/tests/publish-failure-classifier.test.mjs b/js/tests/publish-failure-classifier.test.mjs new file mode 100644 index 0000000..569d943 --- /dev/null +++ b/js/tests/publish-failure-classifier.test.mjs @@ -0,0 +1,42 @@ +// Unit tests for js/scripts/publish-failure-classifier.mjs +// +// Auth / registry-configuration failures repeat identically on every retry. +// Retrying them only hides the real cause behind a generic +// "Failed to publish after N attempts" message. + +import { test, expect } from 'bun:test'; +import { + NON_RETRYABLE_PATTERNS, + buildAuthFailureGuidance, + isNonRetryableFailure, +} from '../scripts/publish-failure-classifier.mjs'; + +test('classifies auth and registry-configuration failures as non-retryable', () => { + for (const pattern of NON_RETRYABLE_PATTERNS) { + expect( + isNonRetryableFailure(`prefix ${pattern.toUpperCase()} suffix`) + ).toBe(true); + } +}); + +test('classifies the OIDC bootstrap E404 as non-retryable', () => { + expect( + isNonRetryableFailure( + 'npm error code E404\nnpm error 404 Not Found - PUT https://registry.npmjs.org/command-stream' + ) + ).toBe(true); +}); + +test('does not classify a transient publish failure as non-retryable', () => { + expect(isNonRetryableFailure('npm error code E500')).toBe(false); + expect(isNonRetryableFailure('packages failed to publish')).toBe(false); + expect(isNonRetryableFailure('')).toBe(false); + expect(isNonRetryableFailure(undefined)).toBe(false); +}); + +test('guidance names the package and points at trusted publishing', () => { + const guidance = buildAuthFailureGuidance('command-stream'); + expect(guidance).toContain('command-stream'); + expect(guidance).toContain('https://docs.npmjs.com/trusted-publishers'); + expect(guidance).toContain('NPM_TOKEN'); +}); diff --git a/js/tests/publish-retry.test.mjs b/js/tests/publish-retry.test.mjs new file mode 100644 index 0000000..eac6d90 --- /dev/null +++ b/js/tests/publish-retry.test.mjs @@ -0,0 +1,254 @@ +// Regression tests for js/scripts/publish-retry.mjs +// +// Issue #199: the release job for command-stream@0.20.1 published successfully +// (`πŸ¦‹ success packages published successfully: command-stream@0.20.1`), then +// verified once 2 seconds later, got a registry-replica E404, republished, and +// npm answered: +// +// npm error code E409 +// npm error 409 Conflict - PUT https://registry.npmjs.org/command-stream - +// Cannot publish over previously staged version "0.20.1" +// +// The old loop counted that as a hard failure and turned the release red even +// though 0.20.1 was live on npm. These tests pin both halves of the fix: +// +// 1. an "already published"/"already staged" conflict is a cue to VERIFY, +// never to fail, and +// 2. verification polls with backoff, so a slow registry is not a failure. +// +// The complementary #166 guarantee (a publish that never reached npm must never +// be reported as a release) is asserted too, so the fix cannot regress into a +// false positive. + +import { test, expect } from 'bun:test'; +import { + ALREADY_PUBLISHED_PATTERNS, + isAlreadyPublishedError, + publishWithRetry, + shouldVerify, + waitForVersionOnRegistry, +} from '../scripts/publish-retry.mjs'; + +const noSleep = async () => {}; + +// The verbatim npm output from the failed run, trimmed to the relevant lines. +// Source: dev/log/issues/199/pulls/200/ci-logs/run-33914574283.log +const E409_STAGED_OUTPUT = [ + 'npm error code E409', + 'npm error 409 Conflict - PUT https://registry.npmjs.org/command-stream - Cannot publish over previously staged version "0.20.1"', + 'πŸ¦‹ error an error occurred while publishing command-stream: E409 Conflict', +].join('\n'); + +test('recognises npm E409 "previously staged version" as already published', () => { + expect(isAlreadyPublishedError(E409_STAGED_OUTPUT)).toBe(true); +}); + +test('recognises the classic "previously published version" conflict too', () => { + expect( + isAlreadyPublishedError( + 'npm error You cannot publish over the previously published versions: 0.20.1.' + ) + ).toBe(true); +}); + +test('does not treat an ordinary publish error as already published', () => { + expect( + isAlreadyPublishedError( + 'npm error code E404\nnpm error 404 Not Found - PUT https://registry.npmjs.org/command-stream' + ) + ).toBe(false); + expect(isAlreadyPublishedError('')).toBe(false); + expect(isAlreadyPublishedError(undefined)).toBe(false); +}); + +test('every already-published pattern is matched case-insensitively', () => { + for (const pattern of ALREADY_PUBLISHED_PATTERNS) { + expect(isAlreadyPublishedError(pattern.toUpperCase())).toBe(true); + } +}); + +test('shouldVerify routes an E409 conflict to verification', () => { + expect( + shouldVerify({ + success: false, + error: new Error('changeset publish exited with code 1'), + output: E409_STAGED_OUTPUT, + }) + ).toBe(true); +}); + +test('shouldVerify does not route an unrelated failure to verification', () => { + expect( + shouldVerify({ + success: false, + error: new Error('changeset publish exited with code 1'), + output: 'npm error code E404', + }) + ).toBe(false); +}); + +test('waitForVersionOnRegistry returns true as soon as the version appears', async () => { + let calls = 0; + const found = await waitForVersionOnRegistry({ + verify: async () => ++calls >= 3, + attempts: 7, + initialDelay: 0, + maxDelay: 0, + sleepFn: noSleep, + }); + + expect(found).toBe(true); + expect(calls).toBe(3); +}); + +test('waitForVersionOnRegistry keeps polling through transient errors', async () => { + let calls = 0; + const found = await waitForVersionOnRegistry({ + verify: async () => { + calls++; + if (calls < 3) { + throw new Error('ECONNRESET'); + } + return true; + }, + attempts: 5, + initialDelay: 0, + maxDelay: 0, + sleepFn: noSleep, + }); + + expect(found).toBe(true); + expect(calls).toBe(3); +}); + +test('waitForVersionOnRegistry gives up after the configured attempts', async () => { + let calls = 0; + const found = await waitForVersionOnRegistry({ + verify: async () => { + calls++; + return false; + }, + attempts: 4, + initialDelay: 0, + maxDelay: 0, + sleepFn: noSleep, + }); + + expect(found).toBe(false); + expect(calls).toBe(4); +}); + +test('issue #199: a slow registry after a successful publish is not a failure', async () => { + // The exact shape of the failed run: publish succeeds, the first verification + // sample misses, the next one finds the version. + let publishCalls = 0; + let verifyCalls = 0; + + const result = await publishWithRetry({ + publish: async () => { + publishCalls++; + return { + success: true, + error: null, + output: 'πŸ¦‹ success packages published successfully', + }; + }, + verify: async () => ++verifyCalls >= 2, + maxRetries: 3, + retryDelay: 0, + sleepFn: noSleep, + verifyOptions: { attempts: 7, initialDelay: 0, maxDelay: 0 }, + }); + + expect(result.success).toBe(true); + // The publish command must run exactly once: republishing is what produced + // the E409 that turned the 0.20.1 release red. + expect(publishCalls).toBe(1); + expect(verifyCalls).toBe(2); +}); + +test('issue #199: an E409 staged conflict resolves to success once verified', async () => { + let publishCalls = 0; + + const result = await publishWithRetry({ + publish: async () => { + publishCalls++; + return { + success: false, + error: new Error('detected "npm error code e" in publish output'), + output: E409_STAGED_OUTPUT, + }; + }, + verify: async () => true, + maxRetries: 3, + retryDelay: 0, + sleepFn: noSleep, + verifyOptions: { attempts: 7, initialDelay: 0, maxDelay: 0 }, + }); + + expect(result.success).toBe(true); + expect(publishCalls).toBe(1); +}); + +test('issue #166: a publish that never reaches npm is still a failure', async () => { + const result = await publishWithRetry({ + publish: async () => ({ + success: true, + error: null, + output: 'no projects to publish', + }), + verify: async () => false, + maxRetries: 3, + retryDelay: 0, + sleepFn: noSleep, + verifyOptions: { attempts: 3, initialDelay: 0, maxDelay: 0 }, + }); + + expect(result.success).toBe(false); + expect(result.error.verificationFailed).toBe(true); + expect(result.error.nonRetryable).toBe(true); +}); + +test('a genuinely failing publish is retried up to maxRetries', async () => { + let publishCalls = 0; + + const result = await publishWithRetry({ + publish: async () => { + publishCalls++; + return { + success: false, + error: new Error('changeset publish exited with code 1'), + output: 'packages failed to publish', + }; + }, + verify: async () => false, + maxRetries: 3, + retryDelay: 0, + sleepFn: noSleep, + verifyOptions: { attempts: 1, initialDelay: 0, maxDelay: 0 }, + }); + + expect(result.success).toBe(false); + expect(publishCalls).toBe(3); +}); + +test('a non-retryable auth failure is not retried', async () => { + let publishCalls = 0; + const error = new Error('detected "npm error 404" in publish output'); + error.nonRetryable = true; + + const result = await publishWithRetry({ + publish: async () => { + publishCalls++; + return { success: false, error, output: 'npm error 404 Not Found - PUT' }; + }, + verify: async () => false, + maxRetries: 3, + retryDelay: 0, + sleepFn: noSleep, + verifyOptions: { attempts: 1, initialDelay: 0, maxDelay: 0 }, + }); + + expect(result.success).toBe(false); + expect(publishCalls).toBe(1); +}); diff --git a/js/tests/publish-to-npm.test.mjs b/js/tests/publish-to-npm.test.mjs index db055c2..1399f58 100644 --- a/js/tests/publish-to-npm.test.mjs +++ b/js/tests/publish-to-npm.test.mjs @@ -151,3 +151,206 @@ test('reports published for a version already on npm (legit success path)', () = expect(output).toContain('already_published=true'); expect(status).toBe(0); }, 130000); + +// --------------------------------------------------------------------------- +// Issue #199 β€” a slow registry after a successful publish must not fail the +// release. +// +// The three tests above run against the real npm registry, which cannot be made +// to lag on demand. These run the same real script against a stub registry +// served over HTTP (PUBLISH_REGISTRY_URL redirects the publication check only), +// so the exact production sequence from run 33914574283 is reproducible: +// +// pre-check -> 404 (version not published yet) +// publish -> npm E409 "Cannot publish over previously staged version" +// verification -> 404 on the first poll, then the version appears +// +// Before the fix this ended in "❌ Failed to publish after 3 attempts" while +// the version was live on npm. + +/** + * Serve npm package metadata that reveals `version` only from the Nth read on. + * @param {object} options + * @param {string} options.packageName + * @param {string} options.version + * @param {number} options.visibleFromRead - 1-based read index + * @returns {Promise<{url: string, reads: () => number, stop: () => void}>} + */ +async function startLaggingRegistry({ packageName, version, visibleFromRead }) { + let reads = 0; + const server = Bun.serve({ + port: 0, + fetch(request) { + const wanted = `/${encodeURIComponent(packageName)}`; + if (new URL(request.url).pathname !== wanted) { + return new Response('not found', { status: 404 }); + } + reads++; + if (reads < visibleFromRead) { + return new Response('{}', { status: 404 }); + } + return Response.json({ name: packageName, versions: { [version]: {} } }); + }, + }); + + return { + url: `http://127.0.0.1:${server.port}`, + reads: () => reads, + stop: () => server.stop(true), + }; +} + +/** + * Run publish-to-npm.mjs against a stub registry. + * @param {object} opts + * @param {string} opts.version + * @param {string} opts.publishScript + * @param {string} opts.registryUrl + * @returns {Promise<{status:number, stdout:string, stderr:string, output:string}>} + */ +async function runPublishAgainstRegistry({ + version, + publishScript, + registryUrl, +}) { + const dir = mkdtempSync(join(tmpdir(), 'issue199-publish-')); + writeFileSync( + join(dir, 'package.json'), + JSON.stringify( + { + name: 'command-stream', + version, + scripts: { 'changeset:publish': publishScript }, + }, + null, + 2 + ) + ); + const outputFile = join(dir, 'gh-output.txt'); + writeFileSync(outputFile, ''); + + // Must be asynchronous: the stub registry runs in this process, so a + // synchronous spawn would block the event loop and never answer a request. + const child = Bun.spawn(['bun', SCRIPT], { + cwd: dir, + stdout: 'pipe', + stderr: 'pipe', + env: { + ...process.env, + GITHUB_OUTPUT: outputFile, + // Only the publication check is redirected. Overriding NPM_CONFIG_REGISTRY + // would also redirect use-m's module installation, which must keep + // talking to the real registry. + PUBLISH_REGISTRY_URL: registryUrl, + PUBLISH_RETRY_DELAY: '0', + PUBLISH_VERIFY_DELAY: '0', + PUBLISH_VERIFY_MAX_DELAY: '0', + }, + }); + + const [stdout, stderr, status] = await Promise.all([ + new Response(child.stdout).text(), + new Response(child.stderr).text(), + child.exited, + ]); + + return { + status, + stdout, + stderr, + output: existsSync(outputFile) ? readFileSync(outputFile, 'utf8') : '', + }; +} + +// The verbatim npm output from the failed run, escaped for `node -e`. +const E409_STAGED_OUTPUT = + 'npm error code E409\\nnpm error 409 Conflict - PUT https://registry.npmjs.org/command-stream - Cannot publish over previously staged version "0.20.1"'; + +test('issue #199: an E409 "previously staged version" resolves to a successful release', async () => { + if (!networkAvailable) { + return; + } // offline: skip (the script still fetches use-m from unpkg) + + const registry = await startLaggingRegistry({ + packageName: 'command-stream', + version: '0.20.1', + // read 1 = the pre-check (404), read 2 = first verification poll (404), + // read 3 = the version becomes visible. + visibleFromRead: 3, + }); + + try { + const { status, output, stdout } = await runPublishAgainstRegistry({ + version: '0.20.1', + publishScript: `node -e "console.error('${E409_STAGED_OUTPUT}'); process.exit(1)"`, + registryUrl: registry.url, + }); + + expect(output).toContain('published=true'); + expect(output).toContain('published_version=0.20.1'); + expect(output).not.toContain('published=false'); + expect(status).toBe(0); + // The publish command must not be re-run: republishing is what produced the + // E409 in the first place. + expect(stdout).toContain('Publish attempt 1 of 3'); + expect(stdout).not.toContain('Publish attempt 2 of 3'); + } finally { + registry.stop(); + } +}, 130000); + +test('issue #199: registry propagation lag after a clean publish is not a failure', async () => { + if (!networkAvailable) { + return; + } // offline: skip + + const registry = await startLaggingRegistry({ + packageName: 'command-stream', + version: '0.20.1', + visibleFromRead: 4, + }); + + try { + const { status, output, stdout } = await runPublishAgainstRegistry({ + version: '0.20.1', + publishScript: + 'node -e "console.log(\'πŸ¦‹ success packages published successfully\'); process.exit(0)"', + registryUrl: registry.url, + }); + + expect(output).toContain('published=true'); + expect(status).toBe(0); + expect(stdout).not.toContain('Publish attempt 2 of 3'); + // Polling, not a single sample, is what makes this pass. + expect(registry.reads()).toBeGreaterThan(2); + } finally { + registry.stop(); + } +}, 130000); + +test('issue #166 stays fixed: verification exhaustion still fails the release', async () => { + if (!networkAvailable) { + return; + } // offline: skip + + const registry = await startLaggingRegistry({ + packageName: 'command-stream', + version: '0.20.1', + visibleFromRead: Number.MAX_SAFE_INTEGER, // never becomes visible + }); + + try { + const { status, output } = await runPublishAgainstRegistry({ + version: '0.20.1', + publishScript: + 'node -e "console.log(\'no projects to publish\'); process.exit(0)"', + registryUrl: registry.url, + }); + + expect(output).toContain('published=false'); + expect(output).not.toContain('published=true'); + expect(status).not.toBe(0); + } finally { + registry.stop(); + } +}, 130000); From 7bd6eab5747934b8d59c9c0b37cb8fd5913449ea Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 4 Sep 2026 21:14:25 +0000 Subject: [PATCH 04/34] fix(ci): make Rust warnings fail the build and clear the backlog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Issue #199. `cargo clippy --all-targets --all-features` was run without `-D warnings`, so the Rust lint job printed 15 warnings and exited 0 β€” a false negative on every push since the job was introduced. Nothing in the Rust pipeline could fail on a warning: not clippy, not rustc, not rustdoc. - rust.yml: RUSTFLAGS/RUSTDOCFLAGS=-Dwarnings at workflow level (registry dependencies build with --cap-lints allow, so this only denies warnings in our own code), `-- -D warnings` on clippy because RUSTFLAGS does not reach clippy's own lints, and a `cargo doc --no-deps` gate for the rustdoc-only lints that neither clippy nor `cargo test --doc` reports. - Cargo.toml: [lints.rust] unsafe_code = "forbid" (the crate has no unsafe block) and [lints.clippy] all = warn, mirroring the Rust template. Warnings fixed, rather than silenced: - ls: iterate with .flatten(); drop the dead `file_type` binding β€” the type character is already part of `perms`. - lib.rs: std::io::Error::other; document why `output_rx` is held but never read (dropping it closes the channel, which is how `yes` decides to stop). - touch: check set_file_mtime with .is_err() instead of binding an unused error. - sleep: format! with no arguments -> to_string. - pipeline: keep `Pipeline::add` and explain why should_implement_trait does not apply β€” renaming would break the published API and diverge from JS. - cd: escape `` in the doc comment; rustdoc read it as an HTML tag. - Remove unused imports in main.rs, commands/mod.rs and four test files. - builtin_commands: `ctx_with_cwd` was dead because no test covered CommandContext::cwd. Three tests now do (pwd honours cwd, ls resolves a relative path against it, ls with no argument lists it). cargo clippy -D warnings, cargo test --all-features (16 suites), cargo fmt --check and cargo doc all pass locally. --- .github/workflows/rust.yml | 17 +++++++++++++++- rust/Cargo.toml | 12 ++++++++++++ rust/src/commands/cd.rs | 2 +- rust/src/commands/ls.rs | 29 +++++++++++++-------------- rust/src/commands/mod.rs | 1 - rust/src/commands/sleep.rs | 2 +- rust/src/commands/touch.rs | 4 ++-- rust/src/lib.rs | 15 ++++++++------ rust/src/main.rs | 2 +- rust/src/pipeline.rs | 4 ++++ rust/tests/builtin_commands.rs | 36 +++++++++++++++++++++++++++++++--- rust/tests/pipeline.rs | 2 +- rust/tests/process_runner.rs | 1 - rust/tests/stream.rs | 2 +- 14 files changed, 95 insertions(+), 34 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index d4dbf15..21c02fb 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -45,6 +45,12 @@ concurrency: env: CARGO_TERM_COLOR: always + # Warnings must fail the build. Without this, `cargo clippy` reports problems + # and still exits 0, so every Rust check was a false negative (issue #199). + # Registry dependencies are compiled with `--cap-lints allow`, so this only + # denies warnings in this crate's own code. + RUSTFLAGS: -Dwarnings + RUSTDOCFLAGS: -Dwarnings CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN || secrets.CARGO_TOKEN }} CARGO_TOKEN: ${{ secrets.CARGO_TOKEN }} @@ -101,7 +107,16 @@ jobs: - name: Run Clippy working-directory: rust - run: cargo clippy --all-targets --all-features + # Explicit despite the workflow-level RUSTFLAGS: clippy's own lints are + # not covered by RUSTFLAGS, only rustc's. + run: cargo clippy --all-targets --all-features -- -D warnings + + - name: Build documentation + working-directory: rust + # rustdoc-only lints (broken intra-doc links, unclosed HTML tags) are + # reported by neither clippy nor `cargo test --doc`, so they need their + # own gate. RUSTDOCFLAGS=-Dwarnings comes from the workflow env. + run: cargo doc --no-deps --all-features test: name: Test Rust (${{ matrix.os }}) diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 83bdb00..108cb42 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -44,6 +44,18 @@ assert_cmd = "2.0" default = [] json = [] +# Lint policy. `cargo clippy` and `cargo build` only *report* warnings, so the +# `-D warnings` in .github/workflows/rust.yml is what turns these into a failing +# build. Both halves are needed: this section makes the policy visible to local +# builds and to `cargo clippy --fix`, the workflow makes it enforceable. +[lints.rust] +# The crate contains no `unsafe` block today (nix/libc are used through their +# safe wrappers); `forbid` keeps it that way and cannot be locally overridden. +unsafe_code = "forbid" + +[lints.clippy] +all = { level = "warn", priority = -1 } + [profile.release] opt-level = 3 lto = true diff --git a/rust/src/commands/cd.rs b/rust/src/commands/cd.rs index b52e6fd..7555644 100644 --- a/rust/src/commands/cd.rs +++ b/rust/src/commands/cd.rs @@ -43,7 +43,7 @@ pub(crate) struct CdContext { /// - `cd` -> change to $HOME (or $USERPROFILE on Windows) /// - `cd ~`/`cd ~/x` -> tilde expands to $HOME /// - `cd -` -> change to $OLDPWD and print the new directory (like sh) -/// - `cd ` -> change to (relative paths resolve against the +/// - `cd ` -> change to `` (relative paths resolve against the /// current working directory, or the `cwd` option) /// /// This low-level command API retains its original process-mutating behavior. diff --git a/rust/src/commands/ls.rs b/rust/src/commands/ls.rs index 160f01f..65230fa 100644 --- a/rust/src/commands/ls.rs +++ b/rust/src/commands/ls.rs @@ -67,20 +67,20 @@ pub async fn ls(ctx: CommandContext) -> CommandResult { Ok(entries) => { let mut entry_strs = Vec::new(); - for entry in entries { - if let Ok(entry) = entry { - let name = entry.file_name().to_string_lossy().to_string(); - - // Skip hidden files unless -a is specified - if !show_all && name.starts_with('.') { - continue; - } - - if long_format { - entry_strs.push(format_entry(&entry.path(), true)); - } else { - entry_strs.push(name); - } + // `flatten()` drops unreadable entries, matching the + // behaviour of `ls`, which lists what it can read. + for entry in entries.flatten() { + let name = entry.file_name().to_string_lossy().to_string(); + + // Skip hidden files unless -a is specified + if !show_all && name.starts_with('.') { + continue; + } + + if long_format { + entry_strs.push(format_entry(&entry.path(), true)); + } else { + entry_strs.push(name); } } @@ -121,7 +121,6 @@ fn format_entry(path: &Path, long_format: bool) -> String { Err(_) => return name, }; - let file_type = if metadata.is_dir() { "d" } else { "-" }; let size = metadata.len(); // Simplified permissions diff --git a/rust/src/commands/mod.rs b/rust/src/commands/mod.rs index 48dcbea..fc90fcf 100644 --- a/rust/src/commands/mod.rs +++ b/rust/src/commands/mod.rs @@ -50,7 +50,6 @@ pub use yes::yes; use crate::utils::CommandResult; use std::collections::HashMap; -use std::path::Path; use tokio::sync::mpsc; /// Context for virtual command execution diff --git a/rust/src/commands/sleep.rs b/rust/src/commands/sleep.rs index 81058c1..1ec012b 100644 --- a/rust/src/commands/sleep.rs +++ b/rust/src/commands/sleep.rs @@ -47,7 +47,7 @@ pub async fn sleep(ctx: CommandContext) -> CommandResult { } } => { trace_lazy("VirtualCommand", || { - format!("sleep: cancelled after partial sleep") + "sleep: cancelled after partial sleep".to_string() }); CommandResult::error_with_code("", 130) // SIGINT exit code } diff --git a/rust/src/commands/touch.rs b/rust/src/commands/touch.rs index c6a89bc..61e61b7 100644 --- a/rust/src/commands/touch.rs +++ b/rust/src/commands/touch.rs @@ -30,8 +30,8 @@ pub async fn touch(ctx: CommandContext) -> CommandResult { if resolved_path.exists() { // Update modification time let now = SystemTime::now(); - if let Err(e) = - filetime::set_file_mtime(&resolved_path, filetime::FileTime::from_system_time(now)) + if filetime::set_file_mtime(&resolved_path, filetime::FileTime::from_system_time(now)) + .is_err() { // Fallback: try to just open and close the file if let Err(e2) = OpenOptions::new().write(true).open(&resolved_path) { diff --git a/rust/src/lib.rs b/rust/src/lib.rs index b03c44a..849e826 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -229,6 +229,11 @@ pub struct ProcessRunner { finished: bool, cancelled: bool, output_tx: Option>, + // Held, never read: dropping the receiver would close the channel, and + // streaming virtual commands treat a closed channel as "stop now" (see + // `commands::yes`, which loops until `output_tx.send` fails). Keeping it + // alive is what gives those commands their run-until-cancelled behaviour. + #[allow(dead_code)] output_rx: Option>, } @@ -345,12 +350,10 @@ impl ProcessRunner { return Ok(result.clone()); } - let mut child = self.child.take().ok_or_else(|| { - Error::Io(std::io::Error::new( - std::io::ErrorKind::Other, - "Process not started", - )) - })?; + let mut child = self + .child + .take() + .ok_or_else(|| Error::Io(std::io::Error::other("Process not started")))?; // Handle stdin content if provided if let StdinOption::Content(ref content) = self.options.stdin { diff --git a/rust/src/main.rs b/rust/src/main.rs index d5ff009..01c93ea 100644 --- a/rust/src/main.rs +++ b/rust/src/main.rs @@ -2,7 +2,7 @@ //! //! A simple CLI wrapper for the command-stream library. -use command_stream::{run, ProcessRunner, RunOptions}; +use command_stream::run; use std::env; #[tokio::main] diff --git a/rust/src/pipeline.rs b/rust/src/pipeline.rs index ee9d19a..ef5a4c2 100644 --- a/rust/src/pipeline.rs +++ b/rust/src/pipeline.rs @@ -77,6 +77,10 @@ impl Pipeline { } /// Add a command to the pipeline + // `std::ops::Add` is not a fit for a consuming builder step, and renaming + // this method would break the published 0.x API and diverge from the + // JavaScript `.add()` it mirrors. + #[allow(clippy::should_implement_trait)] pub fn add(mut self, command: impl Into) -> Self { self.commands.push(command.into()); self diff --git a/rust/tests/builtin_commands.rs b/rust/tests/builtin_commands.rs index 0b92322..1c77cdd 100644 --- a/rust/tests/builtin_commands.rs +++ b/rust/tests/builtin_commands.rs @@ -3,10 +3,9 @@ //! These tests mirror the JavaScript tests in js/tests/builtin-commands.test.mjs use command_stream::commands::{ - basename, cat, cd, cp, dirname, echo, env, exit, ls, mkdir, mv, pwd, rm, seq, sleep, test, - touch, which, yes, CommandContext, + basename, cat, cp, dirname, echo, env, exit, ls, mkdir, mv, pwd, rm, seq, sleep, test, touch, + which, yes, CommandContext, }; -use command_stream::utils::CommandResult; use std::fs; use std::path::PathBuf; use tempfile::TempDir; @@ -167,6 +166,37 @@ async fn test_ls_with_a_flag() { assert!(result.stdout.contains("visible.txt")); } +#[tokio::test] +async fn test_pwd_honors_context_cwd() { + let dir = TempDir::new().unwrap(); + let expected = fs::canonicalize(dir.path()).unwrap(); + + let result = pwd(ctx_with_cwd(vec![], expected.clone())).await; + assert!(result.is_success()); + assert_eq!(result.stdout.trim(), expected.to_string_lossy()); +} + +#[tokio::test] +async fn test_ls_resolves_relative_path_against_context_cwd() { + let dir = TempDir::new().unwrap(); + fs::create_dir(dir.path().join("nested")).unwrap(); + fs::write(dir.path().join("nested/inside.txt"), "content").unwrap(); + + let result = ls(ctx_with_cwd(vec!["nested"], dir.path().to_path_buf())).await; + assert!(result.is_success()); + assert!(result.stdout.contains("inside.txt")); +} + +#[tokio::test] +async fn test_ls_without_path_lists_context_cwd() { + let dir = TempDir::new().unwrap(); + fs::write(dir.path().join("listed.txt"), "content").unwrap(); + + let result = ls(ctx_with_cwd(vec![], dir.path().to_path_buf())).await; + assert!(result.is_success()); + assert!(result.stdout.contains("listed.txt")); +} + #[tokio::test] async fn test_ls_with_l_flag() { let dir = TempDir::new().unwrap(); diff --git a/rust/tests/pipeline.rs b/rust/tests/pipeline.rs index fd85400..7e5cf92 100644 --- a/rust/tests/pipeline.rs +++ b/rust/tests/pipeline.rs @@ -1,6 +1,6 @@ //! Tests for the Pipeline module -use command_stream::{Pipeline, PipelineExt, ProcessRunner, RunOptions}; +use command_stream::Pipeline; #[tokio::test] async fn test_pipeline_simple() { diff --git a/rust/tests/process_runner.rs b/rust/tests/process_runner.rs index e041f1f..7349914 100644 --- a/rust/tests/process_runner.rs +++ b/rust/tests/process_runner.rs @@ -4,7 +4,6 @@ use command_stream::{create, exec, run, ProcessRunner, RunOptions, StdinOption}; use std::collections::HashMap; -use std::path::PathBuf; use tempfile::TempDir; // ============================================================================ diff --git a/rust/tests/stream.rs b/rust/tests/stream.rs index c0a9985..5b63907 100644 --- a/rust/tests/stream.rs +++ b/rust/tests/stream.rs @@ -1,6 +1,6 @@ //! Tests for the streaming module -use command_stream::{AsyncIterator, OutputChunk, StreamingRunner}; +use command_stream::{OutputChunk, StreamingRunner}; #[tokio::test] async fn test_streaming_runner_basic() { From 84610d442461c38a723396a05579683aa5c006ff Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 4 Sep 2026 21:28:04 +0000 Subject: [PATCH 05/34] docs(dev-log): commit the CI evidence collected for issue #199 The run logs downloaded for the investigation were sitting untracked: the global `*.log` rule in .gitignore swallowed them, so ./dev/log/issues/199/ pulls/200 was incomplete in the repository. Mirror the exception that already exists for docs/case-studies/**/ci-logs: commit the small tool outputs under analysis/ verbatim, and commit the seven full run logs gzipped (1.2 MB instead of 9.8 MB), which is the same shape as docs/case-studies/issue-166/ci-logs/*.log.gz. Raw *.log stays ignored so a re-download does not add megabytes to a commit by accident. ci-logs/README.md indexes every run with its workflow, commit, conclusion and failing jobs. --- .gitignore | 5 + .../pulls/200/analysis/actionlint-before.log | 33 + .../pulls/200/analysis/js-scripts-diff.log | 2950 +++++++++++++++++ .../pulls/200/analysis/rust-scripts-diff.log | 794 +++++ .../199/pulls/200/analysis/zizmor-before.log | 622 ++++ .../issues/199/pulls/200/ci-logs/README.md | 22 + .../pulls/200/ci-logs/run-33897699209.log.gz | Bin 0 -> 216085 bytes .../pulls/200/ci-logs/run-33910180248.log.gz | Bin 0 -> 227874 bytes .../pulls/200/ci-logs/run-33910180769.log.gz | Bin 0 -> 100019 bytes .../pulls/200/ci-logs/run-33911660942.log.gz | Bin 0 -> 104844 bytes .../pulls/200/ci-logs/run-33911660947.log.gz | Bin 0 -> 224839 bytes .../pulls/200/ci-logs/run-33914574263.log.gz | Bin 0 -> 124170 bytes .../pulls/200/ci-logs/run-33914574283.log.gz | Bin 0 -> 224105 bytes 13 files changed, 4426 insertions(+) create mode 100644 dev/log/issues/199/pulls/200/analysis/actionlint-before.log create mode 100644 dev/log/issues/199/pulls/200/analysis/js-scripts-diff.log create mode 100644 dev/log/issues/199/pulls/200/analysis/rust-scripts-diff.log create mode 100644 dev/log/issues/199/pulls/200/analysis/zizmor-before.log create mode 100644 dev/log/issues/199/pulls/200/ci-logs/README.md create mode 100644 dev/log/issues/199/pulls/200/ci-logs/run-33897699209.log.gz create mode 100644 dev/log/issues/199/pulls/200/ci-logs/run-33910180248.log.gz create mode 100644 dev/log/issues/199/pulls/200/ci-logs/run-33910180769.log.gz create mode 100644 dev/log/issues/199/pulls/200/ci-logs/run-33911660942.log.gz create mode 100644 dev/log/issues/199/pulls/200/ci-logs/run-33911660947.log.gz create mode 100644 dev/log/issues/199/pulls/200/ci-logs/run-33914574263.log.gz create mode 100644 dev/log/issues/199/pulls/200/ci-logs/run-33914574283.log.gz diff --git a/.gitignore b/.gitignore index a459aec..24fb199 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,11 @@ logs # Case-study CI evidence is committed intentionally (downloaded run logs). !docs/case-studies/**/ci-logs/ !docs/case-studies/**/ci-logs/*.log +# Per-issue investigation evidence under dev/log is committed intentionally. +# Raw multi-megabyte run logs stay ignored; commit them gzipped (*.log.gz), +# which git does not ignore. Small tool outputs are committed verbatim. +!dev/log/**/analysis/ +!dev/log/**/analysis/*.log npm-debug.log* yarn-debug.log* yarn-error.log* diff --git a/dev/log/issues/199/pulls/200/analysis/actionlint-before.log b/dev/log/issues/199/pulls/200/analysis/actionlint-before.log new file mode 100644 index 0000000..8d23dfc --- /dev/null +++ b/dev/log/issues/199/pulls/200/analysis/actionlint-before.log @@ -0,0 +1,33 @@ +Unable to find image 'rhysd/actionlint:1.7.7' locally +1.7.7: Pulling from rhysd/actionlint +1f3e46996e29: Pulling fs layer +4e6599d62119: Pulling fs layer +46b6d0e9fe9d: Pulling fs layer +f23002ece875: Pulling fs layer +f23002ece875: Waiting +4e6599d62119: Download complete +1f3e46996e29: Verifying Checksum +1f3e46996e29: Download complete +46b6d0e9fe9d: Verifying Checksum +46b6d0e9fe9d: Download complete +f23002ece875: Verifying Checksum +f23002ece875: Download complete +1f3e46996e29: Pull complete +4e6599d62119: Pull complete +46b6d0e9fe9d: Pull complete +f23002ece875: Pull complete +Digest: sha256:887a259a5a534f3c4f36cb02dca341673c6089431057242cdc931e9f133147e9 +Status: Downloaded newer image for rhysd/actionlint:1.7.7 +.github/workflows/js.yml:72:9: shellcheck reported issue in this script: SC2193:warning:1:32: The arguments to this comparison can never be equal. Make sure your syntax is correct [shellcheck] + | +72 |  run: | + |  ^~~~ +.github/workflows/js.yml:72:25: "github.head_ref" is potentially untrusted. avoid using it directly in inline scripts. instead, pass it through an environment variable. see https://docs.github.com/en/actions/security-for-github-actions/security-guides/security-hardening-for-github-actions for more details [expression] +.github/workflows/js.yml:248:9: shellcheck reported issue in this script: SC2086:info:3:89: Double quote to prevent globbing and word splitting [shellcheck] + | +248 |  run: | + |  ^~~~ +.github/workflows/js.yml:248:9: shellcheck reported issue in this script: SC2086:info:4:44: Double quote to prevent globbing and word splitting [shellcheck] + | +248 |  run: | + |  ^~~~ diff --git a/dev/log/issues/199/pulls/200/analysis/js-scripts-diff.log b/dev/log/issues/199/pulls/200/analysis/js-scripts-diff.log new file mode 100644 index 0000000..739c2f8 --- /dev/null +++ b/dev/log/issues/199/pulls/200/analysis/js-scripts-diff.log @@ -0,0 +1,2950 @@ +########## changeset-version.mjs ########## +--- js/scripts/changeset-version.mjs 2026-09-04 20:28:25.871207709 +0000 ++++ /tmp/tmpl/js-tmpl/scripts/changeset-version.mjs 2026-09-04 20:31:16.597474164 +0000 +@@ -5,36 +5,64 @@ + * with package.json after version bumps. + * + * This script: +- * 1. Runs `changeset version` to update the JavaScript package version +- * 2. Runs `npm install` to synchronize package-lock.json with the new version ++ * 1. Detects the JavaScript package root (supports both single-language and multi-language repos) ++ * 2. Runs `changeset version` to update package versions ++ * 3. Runs `npm install` to synchronize package-lock.json with the new versions ++ * ++ * Configuration: ++ * - CLI: --js-root to explicitly set JavaScript root ++ * - Environment: JS_ROOT= + * + * Uses link-foundation libraries: + * - use-m: Dynamic package loading without package.json dependencies + * - command-stream: Modern shell command execution with streaming support ++ * ++ * Addresses issues documented in: ++ * - Issue #21: Supporting both single and multi-language repository structures ++ * - Reference: link-assistant/agent PR #112 (--legacy-peer-deps fix) ++ * - Reference: link-assistant/agent PR #114 (configurable package root) + */ + +-// Load use-m dynamically +-const { use } = eval( +- await (await fetch('https://unpkg.com/use-m/use.js')).text() +-); ++import { getJsRoot, needsCd, parseJsRootConfig } from './js-paths.mjs'; ++import { loadCommandStream } from './use-module.mjs'; + + // Import command-stream for shell command execution +-const { $ } = await use('command-stream'); ++const { $ } = await loadCommandStream(); ++ ++// Store the original working directory to restore after cd commands ++// IMPORTANT: command-stream's cd is a virtual command that calls process.chdir() ++const originalCwd = process.cwd(); + + try { ++ // Get JavaScript package root (auto-detect or use explicit config) ++ const jsRootConfig = parseJsRootConfig(); ++ const jsRoot = getJsRoot({ jsRoot: jsRootConfig, verbose: true }); ++ + console.log('Running changeset version...'); +- await $`bunx changeset version`; ++ ++ // IMPORTANT: cd is a virtual command that calls process.chdir(), so we restore after ++ if (needsCd({ jsRoot })) { ++ await $`cd ${jsRoot} && npx changeset version`; ++ process.chdir(originalCwd); ++ } else { ++ await $`npx changeset version`; ++ } + + console.log('\nSynchronizing package-lock.json...'); +- try { +- await $`npm install --package-lock-only`; +- } catch { +- // No package-lock.json or npm not available, skip +- console.log('Skipping package-lock.json sync (not applicable)'); ++ ++ // Use --legacy-peer-deps to handle peer dependency conflicts ++ // This addresses npm ERESOLVE errors documented in issue #111 / PR #112 ++ if (needsCd({ jsRoot })) { ++ await $`cd ${jsRoot} && npm install --package-lock-only --legacy-peer-deps`; ++ process.chdir(originalCwd); ++ } else { ++ await $`npm install --package-lock-only --legacy-peer-deps`; + } + + console.log('\nβœ… Version bump complete with synchronized package-lock.json'); + } catch (error) { ++ // Restore cwd on error ++ process.chdir(originalCwd); + console.error('Error during version bump:', error.message); + if (process.env.DEBUG) { + console.error('Stack trace:', error.stack); +########## check-release-needed.mjs ########## +--- js/scripts/check-release-needed.mjs 2026-09-04 20:28:25.871207709 +0000 ++++ /tmp/tmpl/js-tmpl/scripts/check-release-needed.mjs 2026-09-04 20:31:16.598474154 +0000 +@@ -1,153 +1,118 @@ +-#!/usr/bin/env bun ++#!/usr/bin/env node + + /** +- * Check if a release is needed based on changesets and npm registry state. ++ * Check if a release is needed based on changesets and npm registry state + * + * This script checks: +- * 1. If there are changeset files to process, and +- * 2. If the current package.json version has already been published to npm. ++ * 1. If there are changeset files to process ++ * 2. If the current version has already been published to npm + * +- * IMPORTANT: This checks npm (the source of truth for JS packages), NOT git +- * tags / GitHub releases. This is critical because: +- * - Git tags and GitHub releases can exist without the package being on npm +- * (exactly what produced the false-positive `js-v0.10.1` release in #166), +- * - Only npm publication means users can actually `npm install` the package. +- * +- * Self-healing: if a previous release attempt bumped the version and committed +- * it to main but the npm publish failed or was skipped, the repo version is +- * left permanently ahead of npm. By comparing package.json against the +- * registry, the next push to main detects the unpublished version and triggers +- * a catch-up publish. +- * +- * IMPORTANT β€” this is a deliberate improvement over the upstream template +- * (link-foundation/js-ai-driven-development-pipeline-template, +- * scripts/check-release-needed.mjs, issue #36). The template only probes npm +- * when `has_changesets` is false. But issue #166's "failed to do any deploy" +- * restart (run 27224046292) had `has_changesets=true` *locally* while the +- * version bump had already been consumed on `origin/main` by a prior run β€” so +- * `changeset version` found nothing, the version step committed nothing, and +- * the publish was gated off, leaving v0.10.2 stranded (npm was still at 0.9.5). +- * To close that gap we ALWAYS probe npm and emit `current_unpublished`, which +- * the workflow uses to publish the current version whether or not a changeset +- * is present. See docs/case-studies/issue-166/. +- * +- * command-stream's `$` does NOT throw on a non-zero exit code (errexit is off +- * by default β€” see issue #156), so the registry probe checks the captured exit +- * code explicitly instead of relying on a thrown error. ++ * IMPORTANT: This script checks npm (the source of truth for JS packages), ++ * NOT git tags. This is critical because: ++ * - Git tags can exist without the package being published ++ * - GitHub releases create tags but don't publish to npm ++ * - Only npm publication means users can actually install the package ++ * ++ * This provides a self-healing mechanism: if a previous release attempt ++ * failed or was skipped, the next push to main will detect the unpublished ++ * version and trigger a release without requiring a changeset. ++ * ++ * Analogous to check-release-needed.rs in the Rust template. ++ * ++ * Supports both single-language and multi-language repository structures: ++ * - Single-language: package.json in repository root ++ * - Multi-language: package.json in js/ subfolder + * +- * Usage: bun scripts/check-release-needed.mjs +- * (run with working-directory: js, so ./package.json is the JS package) ++ * Usage: node scripts/check-release-needed.mjs [--js-root ] + * + * Environment variables: +- * - HAS_CHANGESETS: 'true' if changeset files exist (from the changeset check) ++ * - HAS_CHANGESETS: 'true' if changeset files exist (from check-changesets.mjs) + * + * Outputs (written to GITHUB_OUTPUT): + * - should_release: 'true' if a release should be created +- * - skip_bump: 'true' if the version bump should be skipped (version already +- * bumped but not yet published β€” self-healing path) +- * - current_unpublished: 'true' if the current package.json version is NOT on +- * npm. This is the authoritative publish trigger: it is true +- * whenever the committed version still needs to reach the +- * registry, regardless of whether a changeset is present, which +- * is what makes the self-heal cover the #166 restart case. ++ * - skip_bump: 'true' if version bump should be skipped (version not yet published) ++ * ++ * Addresses issues documented in: ++ * - Issue #36: Release job silently skips when PRs merge without changesets + */ + +-import { readFileSync, appendFileSync } from 'fs'; ++import { appendFileSync } from 'fs'; + +-// Load use-m dynamically (matches the other release scripts in this folder). +-const { use } = eval( +- await (await fetch('https://unpkg.com/use-m/use.js')).text() +-); ++import { getJsRoot, parseJsRootConfig } from './js-paths.mjs'; ++import { isPackageVersionPublished } from './npm-registry.mjs'; ++import { readPackageInfo } from './package-info.mjs'; + +-const { $ } = await use('command-stream'); ++const jsRootConfig = parseJsRootConfig(); ++const jsRoot = getJsRoot({ jsRoot: jsRootConfig, verbose: true }); + + /** +- * Append to the GitHub Actions output file (and echo for the run log). +- * @param {string} key +- * @param {string} value ++ * Write output to GitHub Actions output file ++ * @param {string} name - Output name ++ * @param {string} value - Output value + */ +-function setOutput(key, value) { ++function setOutput(name, value) { + const outputFile = process.env.GITHUB_OUTPUT; + if (outputFile) { +- appendFileSync(outputFile, `${key}=${value}\n`); ++ appendFileSync(outputFile, `${name}=${value}\n`); + } +- console.log(`Output: ${key}=${value}`); ++ console.log(`Output: ${name}=${value}`); + } + + /** +- * Read the package name and version from the local package.json. ++ * Get the package name and version from package.json + * @returns {{ name: string, version: string }} + */ + function getPackageInfo() { +- const packageJson = JSON.parse(readFileSync('./package.json', 'utf8')); +- return { name: packageJson.name, version: packageJson.version }; ++ return readPackageInfo({ jsRoot }); + } + + /** +- * Check whether a specific version is published on npm. +- * +- * command-stream's `$` does not throw on non-zero exit, so we inspect the +- * captured exit code: `npm view @ version` exits 0 and prints the +- * version when it exists, and exits non-zero (E404) when it does not. +- * ++ * Check if a specific version is published on npm + * @param {string} packageName + * @param {string} version + * @returns {Promise} + */ +-async function checkVersionOnNpm(packageName, version) { +- const result = await $`npm view "${packageName}@${version}" version`.run({ +- capture: true, +- }); +- return result.code === 0 && result.stdout.trim().includes(version); ++function checkVersionOnNpm(packageName, version) { ++ return isPackageVersionPublished(packageName, version); + } + + async function main() { +- try { +- const hasChangesets = process.env.HAS_CHANGESETS === 'true'; +- const { name: packageName, version: currentVersion } = getPackageInfo(); +- +- console.log(`Package: ${packageName}`); +- console.log(`Current version: ${currentVersion}`); +- console.log(`Has changesets: ${hasChangesets}`); ++ const hasChangesets = process.env.HAS_CHANGESETS === 'true'; ++ const { name: packageName, version: currentVersion } = getPackageInfo(); ++ ++ console.log(`Package: ${packageName}`); ++ console.log(`Current version: ${currentVersion}`); ++ console.log(`Has changesets: ${hasChangesets}`); ++ ++ if (hasChangesets) { ++ console.log('Found changesets, proceeding with release'); ++ setOutput('should_release', 'true'); ++ setOutput('skip_bump', 'false'); ++ return; ++ } ++ ++ console.log( ++ `Checking if ${packageName}@${currentVersion} is published on npm...` ++ ); ++ const isPublished = await checkVersionOnNpm(packageName, currentVersion); ++ console.log(`Published on npm: ${isPublished}`); + +- // Always probe npm β€” even with changesets β€” so a committed-but-unpublished +- // version is detected no matter how the release got into that state (#166). ++ if (isPublished) { ++ console.log( ++ `No changesets and v${currentVersion} already published on npm β€” no release needed` ++ ); ++ setOutput('should_release', 'false'); ++ setOutput('skip_bump', 'false'); ++ } else { + console.log( +- `Checking if ${packageName}@${currentVersion} is published on npm...` ++ `No changesets but v${currentVersion} not yet published to npm β€” release needed (self-healing)` + ); +- const isPublished = await checkVersionOnNpm(packageName, currentVersion); +- console.log(`Published on npm: ${isPublished}`); +- setOutput('current_unpublished', isPublished ? 'false' : 'true'); +- +- if (hasChangesets) { +- // A changeset normally produces a NEW version via the bump step, so let +- // the bump run (skip_bump=false). If the changeset turns out to be already +- // consumed on the remote, the bump is a no-op and `current_unpublished` +- // (emitted above) still drives the catch-up publish of the current +- // version β€” the #166 restart case the template's design missed. +- console.log('Found changesets, proceeding with release'); +- setOutput('should_release', 'true'); +- setOutput('skip_bump', 'false'); +- return; +- } +- +- if (isPublished) { +- console.log( +- `No changesets and v${currentVersion} already published on npm β€” no release needed` +- ); +- setOutput('should_release', 'false'); +- setOutput('skip_bump', 'false'); +- } else { +- console.log( +- `No changesets but v${currentVersion} not yet published to npm β€” release needed (self-healing)` +- ); +- setOutput('should_release', 'true'); +- setOutput('skip_bump', 'true'); +- } +- } catch (error) { +- console.error('Error:', error.message); +- process.exit(1); ++ setOutput('should_release', 'true'); ++ setOutput('skip_bump', 'true'); + } + } + +-main(); ++main().catch((error) => { ++ console.error('Error:', error.message); ++ process.exit(1); ++}); +########## create-github-release.mjs ########## +--- js/scripts/create-github-release.mjs 2026-09-04 20:28:25.871207709 +0000 ++++ /tmp/tmpl/js-tmpl/scripts/create-github-release.mjs 2026-09-04 20:31:16.598474154 +0000 +@@ -1,183 +1,309 @@ + #!/usr/bin/env bun + + /** +- * Create a JavaScript GitHub Release from CHANGELOG.md +- * Usage: bun scripts/create-github-release.mjs --release-version --repository [--tag-prefix js-v] ++ * Create GitHub Release from CHANGELOG.md ++ * Usage: node scripts/create-github-release.mjs --release-version --repository [--tag-prefix ] [--language ] [--js-root ] + * release-version: Version number (e.g., 1.0.0) + * repository: GitHub repository (e.g., owner/repo) +- * +- * Uses link-foundation libraries: +- * - use-m: Dynamic package loading without package.json dependencies +- * - command-stream: Modern shell command execution with streaming support +- * - lino-arguments: Unified configuration from CLI args, env vars, and .lenv files ++ * tag-prefix: Prefix for the git tag (default: auto-detect from layout) ++ * language: Human-readable language name for the release title (default: "JavaScript") ++ * js-root: JavaScript package root directory (auto-detected if not specified) + */ + +-import { readFileSync } from 'fs'; ++import { spawnSync } from 'node:child_process'; ++import { readFileSync } from 'node:fs'; ++import path from 'node:path'; ++import { fileURLToPath } from 'node:url'; ++ ++import { getJsRoot } from './js-paths.mjs'; ++import { readPackageInfo } from './package-info.mjs'; ++import { ++ buildReleaseTag, ++ buildReleaseTitle, ++ normalizeReleaseVersion, ++} from './release-naming.mjs'; ++ ++const USAGE = ++ 'Usage: node scripts/create-github-release.mjs --release-version --repository [--tag-prefix ] [--language ] [--js-root ]'; ++const OPTION_CONFIG_KEYS = new Map([ ++ ['--release-version', 'releaseVersion'], ++ ['--repository', 'repository'], ++ ['--tag-prefix', 'tagPrefix'], ++ ['--language', 'language'], ++ ['--js-root', 'jsRoot'], ++]); + +-// Load use-m dynamically +-const { use } = eval( +- await (await fetch('https://unpkg.com/use-m/use.js')).text() +-); +- +-// Import link-foundation libraries +-const { $ } = await use('command-stream'); +-const { makeConfig } = await use('lino-arguments'); +- +-// Parse CLI arguments using lino-arguments +-// Note: Using --release-version instead of --version to avoid conflict with yargs' built-in --version flag +-const config = makeConfig({ +- yargs: ({ yargs, getenv }) => +- yargs +- .option('release-version', { +- type: 'string', +- default: getenv('VERSION', ''), +- describe: 'Version number (e.g., 1.0.0)', +- }) +- .option('repository', { +- type: 'string', +- default: getenv('REPOSITORY', ''), +- describe: 'GitHub repository (e.g., owner/repo)', +- }) +- .option('tag-prefix', { +- type: 'string', +- default: getenv('TAG_PREFIX', 'js-v'), +- describe: 'Git tag prefix for JavaScript releases', +- }), +-}); +- +-const { releaseVersion: version, repository, tagPrefix } = config; +- +-if (!version || !repository) { +- console.error('Error: Missing required arguments'); +- console.error( +- 'Usage: bun scripts/create-github-release.mjs --release-version --repository ' +- ); +- process.exit(1); ++// Keep comfortably below GitHub's observed 125000-character release body limit. ++export const GITHUB_RELEASE_BODY_MAX_BYTES = 120_000; ++const textEncoder = new globalThis.TextEncoder(); ++ ++export function parseArgs(argv, env = process.env) { ++ const config = { ++ jsRoot: env.JS_ROOT ?? '', ++ language: env.LANGUAGE ?? 'JavaScript', ++ releaseVersion: env.VERSION ?? '', ++ repository: env.REPOSITORY ?? '', ++ tagPrefix: env.TAG_PREFIX, ++ }; ++ ++ for (let index = 0; index < argv.length; index++) { ++ const arg = argv[index]; ++ const inlineValueIndex = arg.indexOf('='); ++ ++ if (inlineValueIndex !== -1) { ++ assignOptionValue( ++ config, ++ arg.slice(0, inlineValueIndex), ++ arg.slice(inlineValueIndex + 1) ++ ); ++ continue; ++ } ++ ++ if (OPTION_CONFIG_KEYS.has(arg)) { ++ assignOptionValue(config, arg, readOptionValue(argv, index, arg)); ++ index++; ++ } ++ } ++ ++ return config; + } + +-const tag = `${tagPrefix}${version}`; ++function assignOptionValue(config, optionName, value) { ++ const configKey = OPTION_CONFIG_KEYS.get(optionName); + +-// Keep comfortably below GitHub's observed ~125000-character release-body limit. +-// A long CHANGELOG section would otherwise make the release API return 422 and +-// fail the (now correctly exit-code-checked) step even though npm already +-// published β€” turning a successful publish into a red job. Mirrors the js +-// pipeline template's limitReleaseNotesBytes(). +-const GITHUB_RELEASE_BODY_MAX_BYTES = 120_000; +-const textEncoder = new globalThis.TextEncoder(); ++ if (configKey) { ++ config[configKey] = value; ++ } ++} ++ ++function readOptionValue(argv, index, optionName) { ++ const value = argv[index + 1]; ++ ++ if (value === undefined || value.startsWith('--')) { ++ throw new Error(`Missing value for ${optionName}`); ++ } ++ ++ return value; ++} ++ ++function escapeRegex(value) { ++ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); ++} ++ ++export function extractReleaseNotes(changelog, version) { ++ // Read from CHANGELOG.md between this version header and the next version header. ++ const versionHeaderRegex = new RegExp( ++ `## ${escapeRegex(version)}(?=\\s|$)[\\s\\S]*?(?=## \\d|$)` ++ ); ++ const match = changelog.match(versionHeaderRegex); ++ ++ if (!match) { ++ return `Release ${version}`; ++ } ++ ++ const releaseNotes = match[0].replace(`## ${version}`, '').trim(); ++ ++ return releaseNotes || `Release ${version}`; ++} + +-/** +- * UTF-8 byte length of a string. +- * @param {string} value +- * @returns {number} +- */ + function getUtf8ByteLength(value) { + return textEncoder.encode(value).byteLength; + } + +-/** +- * Truncate a string so its UTF-8 encoding does not exceed maxBytes, never +- * splitting a multi-byte character. +- * @param {string} value +- * @param {number} maxBytes +- * @returns {string} +- */ + function truncateToUtf8Bytes(value, maxBytes) { + const chunks = []; + let usedBytes = 0; ++ + for (const character of value) { + const characterBytes = getUtf8ByteLength(character); ++ + if (usedBytes + characterBytes > maxBytes) { + break; + } ++ + chunks.push(character); + usedBytes += characterBytes; + } ++ + return chunks.join(''); + } + +-/** +- * Cap release notes to the GitHub body limit, appending a pointer to the full +- * tagged CHANGELOG when truncation happens. +- * @param {string} releaseNotes +- * @returns {string} +- */ +-function limitReleaseNotesBytes(releaseNotes) { +- if (getUtf8ByteLength(releaseNotes) <= GITHUB_RELEASE_BODY_MAX_BYTES) { ++function buildTaggedChangelogUrl(repository, tag) { ++ return `https://github.com/${repository}/blob/${tag}/CHANGELOG.md`; ++} ++ ++function buildTruncatedReleaseNotesNotice({ repository, tag }) { ++ const changelogUrl = buildTaggedChangelogUrl(repository, tag); ++ ++ return `Release notes were shortened to fit GitHub's release body limit. See the full tagged CHANGELOG.md: ${changelogUrl}`; ++} ++ ++export function limitReleaseNotesBytes({ ++ maxBytes = GITHUB_RELEASE_BODY_MAX_BYTES, ++ releaseNotes, ++ repository, ++ tag, ++}) { ++ if (getUtf8ByteLength(releaseNotes) <= maxBytes) { + return releaseNotes; + } +- const changelogUrl = `https://github.com/${repository}/blob/${tag}/CHANGELOG.md`; +- const suffix = `\n\n...\n\nRelease notes were shortened to fit GitHub's release body limit. See the full tagged CHANGELOG.md: ${changelogUrl}`; +- const availableBytes = Math.max( +- 0, +- GITHUB_RELEASE_BODY_MAX_BYTES - getUtf8ByteLength(suffix) +- ); +- const shortened = truncateToUtf8Bytes(releaseNotes, availableBytes).trimEnd(); +- const limited = `${shortened}${suffix}`; +- return getUtf8ByteLength(limited) <= GITHUB_RELEASE_BODY_MAX_BYTES +- ? limited +- : truncateToUtf8Bytes(limited, GITHUB_RELEASE_BODY_MAX_BYTES); +-} +- +-console.log(`Creating JavaScript GitHub release for ${tag}...`); +- +-try { +- // Read CHANGELOG.md +- const changelog = readFileSync('./CHANGELOG.md', 'utf8'); +- +- // Extract changelog entry for this version +- // Read from CHANGELOG.md between this version header and the next version header +- const versionHeaderRegex = new RegExp(`## ${version}[\\s\\S]*?(?=## \\d|$)`); +- const match = changelog.match(versionHeaderRegex); + +- let releaseNotes = ''; +- if (match) { +- // Remove the version header itself and trim +- releaseNotes = match[0].replace(`## ${version}`, '').trim(); +- } ++ const suffix = `\n\n...\n\n${buildTruncatedReleaseNotesNotice({ ++ repository, ++ tag, ++ })}`; ++ const suffixBytes = getUtf8ByteLength(suffix); ++ const availableBytes = Math.max(0, maxBytes - suffixBytes); ++ const shortenedNotes = truncateToUtf8Bytes( ++ releaseNotes, ++ availableBytes ++ ).trimEnd(); ++ const limitedNotes = `${shortenedNotes}${suffix}`; + +- if (!releaseNotes) { +- releaseNotes = `Release ${version}`; ++ if (getUtf8ByteLength(limitedNotes) <= maxBytes) { ++ return limitedNotes; + } + +- // Create release using GitHub API with JSON input +- // This avoids shell escaping issues that occur when passing text via command-line arguments +- // (Previously caused apostrophes like "didn't" to appear as "didn'''" in releases) +- const payload = JSON.stringify({ ++ return truncateToUtf8Bytes(limitedNotes, maxBytes); ++} ++ ++export function buildReleasePayload({ ++ changelog, ++ jsRoot = '.', ++ language, ++ packageName, ++ repository, ++ tag, ++ version, ++}) { ++ const normalizedVersion = normalizeReleaseVersion(version); ++ const releaseNotes = extractReleaseNotes(changelog, normalizedVersion); ++ ++ return JSON.stringify({ + tag_name: tag, +- name: `JavaScript ${version}`, +- body: limitReleaseNotesBytes(releaseNotes), ++ name: buildReleaseTitle(tag, { ++ jsRoot, ++ language: language ?? 'JavaScript', ++ packageName, ++ }), ++ body: limitReleaseNotesBytes({ releaseNotes, repository, tag }), + }); ++} ++ ++function formatGhOutput(result) { ++ return [result.stderr, result.stdout] ++ .filter((output) => typeof output === 'string' && output.trim()) ++ .map((output) => output.trim()) ++ .join('\n'); ++} ++ ++function getGhExitDescription(result) { ++ if (result.signal) { ++ return `signal ${result.signal}`; ++ } ++ ++ if (typeof result.status === 'number') { ++ return `code ${result.status}`; ++ } ++ ++ return 'unknown exit status'; ++} ++ ++export function createRelease({ payload, repository, spawn = spawnSync }) { ++ const result = spawn( ++ 'gh', ++ ['api', `repos/${repository}/releases`, '-X', 'POST', '--input', '-'], ++ { ++ encoding: 'utf8', ++ input: payload, ++ } ++ ); + +- // command-stream's `$` does NOT throw on a non-zero exit (errexit is off by +- // default β€” see issue #156), so we must inspect the result code explicitly. +- // Otherwise a failed `gh api` call would be silently reported as a created +- // release (the same false-positive class that produced #166). +- const result = +- await $`gh api repos/${repository}/releases -X POST --input -`.run({ +- stdin: payload, +- capture: true, ++ if (result.error) { ++ throw new Error(`gh api failed to start: ${result.error.message}`); ++ } ++ ++ if (result.status === 0) { ++ return { alreadyExists: false }; ++ } ++ ++ const output = formatGhOutput(result); ++ ++ if (/already_exists/i.test(output)) { ++ return { alreadyExists: true }; ++ } ++ ++ const details = output ? `:\n${output}` : ''; ++ throw new Error( ++ `gh api failed with ${getGhExitDescription(result)}${details}` ++ ); ++} ++ ++export function main({ ++ argv = process.argv.slice(2), ++ cwd = process.cwd(), ++ env = process.env, ++ spawn = spawnSync, ++ stderr = console.error, ++ stdout = console.log, ++} = {}) { ++ try { ++ const { ++ language, ++ jsRoot: configuredJsRoot, ++ releaseVersion: version, ++ repository, ++ tagPrefix, ++ } = parseArgs(argv, env); ++ ++ if (!version || !repository) { ++ stderr('Error: Missing required arguments'); ++ stderr(USAGE); ++ return 1; ++ } ++ ++ const jsRoot = getJsRoot({ jsRoot: configuredJsRoot || undefined }); ++ const tag = buildReleaseTag(version, { jsRoot, tagPrefix }); ++ const normalizedVersion = normalizeReleaseVersion(version); ++ const { name: packageName } = readPackageInfo({ jsRoot }); ++ ++ stdout(`Creating GitHub release for ${tag}...`); ++ ++ const changelogPath = ++ jsRoot === '.' ? 'CHANGELOG.md' : path.join(jsRoot, 'CHANGELOG.md'); ++ const changelog = readFileSync(path.join(cwd, changelogPath), 'utf8'); ++ const payload = buildReleasePayload({ ++ changelog, ++ jsRoot, ++ language, ++ packageName, ++ repository, ++ tag, ++ version: normalizedVersion, + }); ++ const result = createRelease({ payload, repository, spawn }); + +- if (result.code !== 0) { +- // Idempotency: a self-healing re-run (or a retried job) may try to create a +- // release whose tag already exists. GitHub returns 422 already_exists; that +- // is a success for our purposes, not a failure β€” so the publish does not +- // get turned into a red job on re-run. Mirrors the template's behaviour. +- const combinedOutput = +- `${result.stderr || ''}\n${result.stdout || ''}`.trim(); +- if (/already_exists/i.test(combinedOutput)) { +- console.log( +- `JavaScript GitHub release already exists: ${tag}. Skipping creation.` +- ); +- } else { +- throw new Error( +- `gh api failed to create release ${tag} (exit code ${result.code}): ${result.stderr?.trim() || 'no stderr'}` +- ); ++ if (result.alreadyExists) { ++ stdout(`GitHub release already exists: ${tag}. Skipping creation.`); ++ return 0; + } +- } else { +- console.log(`Created JavaScript GitHub release: ${tag}`); ++ ++ stdout(`\u2705 Created GitHub release: ${tag}`); ++ return 0; ++ } catch (error) { ++ stderr(`Error creating release: ${error.message}`); ++ return 1; + } +-} catch (error) { +- console.error('Error creating release:', error.message); +- process.exit(1); ++} ++ ++function isCliEntryPoint() { ++ return ( ++ typeof process !== 'undefined' && ++ process.argv?.[1] && ++ fileURLToPath(import.meta.url) === path.resolve(process.argv[1]) ++ ); ++} ++ ++if (isCliEntryPoint()) { ++ process.exitCode = main(); + } +########## create-manual-changeset.mjs ########## +--- js/scripts/create-manual-changeset.mjs 2026-09-04 20:28:25.871207709 +0000 ++++ /tmp/tmpl/js-tmpl/scripts/create-manual-changeset.mjs 2026-09-04 20:31:16.598474154 +0000 +@@ -2,9 +2,7 @@ + + /** + * Create a changeset file for manual releases +- * Usage: bun scripts/create-manual-changeset.mjs --bump-type [--description ] +- * +- * IMPORTANT: Update the PACKAGE_NAME constant below to match your package.json ++ * Usage: node scripts/create-manual-changeset.mjs --bump-type [--description ] [--js-root ] + * + * Uses link-foundation libraries: + * - use-m: Dynamic package loading without package.json dependencies +@@ -12,19 +10,17 @@ + * - lino-arguments: Unified configuration from CLI args, env vars, and .lenv files + */ + +-import { writeFileSync } from 'fs'; ++import { mkdirSync, writeFileSync } from 'fs'; + import { randomBytes } from 'crypto'; ++import { join } from 'path'; + +-const PACKAGE_NAME = 'command-stream'; +- +-// Load use-m dynamically +-const { use } = eval( +- await (await fetch('https://unpkg.com/use-m/use.js')).text() +-); ++import { getChangesetDir, getJsRoot, parseJsRootConfig } from './js-paths.mjs'; ++import { formatChangesetHeader, readPackageInfo } from './package-info.mjs'; ++import { loadCommandStream, loadLinoArguments } from './use-module.mjs'; + + // Import link-foundation libraries +-const { $ } = await use('command-stream'); +-const { makeConfig } = await use('lino-arguments'); ++const { $ } = await loadCommandStream(); ++const { makeConfig } = await loadLinoArguments(); + + // Parse CLI arguments using lino-arguments + const config = makeConfig({ +@@ -40,34 +36,46 @@ + type: 'string', + default: getenv('DESCRIPTION', ''), + describe: 'Description for the changeset', ++ }) ++ .option('js-root', { ++ type: 'string', ++ default: getenv('JS_ROOT', ''), ++ describe: ++ 'JavaScript package root directory (auto-detected if not specified)', + }), + }); + + try { +- const { bumpType, description: descriptionArg } = config; ++ const { bumpType, description: descriptionArg, jsRoot: jsRootArg } = config; + + // Use provided description or default based on bump type + const description = descriptionArg || `Manual ${bumpType} release`; + + if (!bumpType || !['major', 'minor', 'patch'].includes(bumpType)) { + console.error( +- 'Usage: bun scripts/create-manual-changeset.mjs --bump-type [--description ]' ++ 'Usage: node scripts/create-manual-changeset.mjs --bump-type [--description ]' + ); + process.exit(1); + } + ++ const jsRootConfig = jsRootArg || parseJsRootConfig(); ++ const jsRoot = getJsRoot({ jsRoot: jsRootConfig, verbose: true }); ++ const changesetDir = getChangesetDir({ jsRoot }); ++ const { name: packageName } = readPackageInfo({ jsRoot }); ++ + // Generate a random changeset ID + const changesetId = randomBytes(4).toString('hex'); +- const changesetFile = `.changeset/manual-release-${changesetId}.md`; ++ const changesetFile = join(changesetDir, `manual-release-${changesetId}.md`); + + // Create the changeset file with single quotes to match Prettier config + const content = `--- +-'${PACKAGE_NAME}': ${bumpType} ++${formatChangesetHeader(packageName, bumpType)} + --- + + ${description} + `; + ++ mkdirSync(changesetDir, { recursive: true }); + writeFileSync(changesetFile, content, 'utf-8'); + + console.log(`Created changeset: ${changesetFile}`); +@@ -76,7 +84,7 @@ + + // Format with Prettier + console.log('\nFormatting with Prettier...'); +- await $`bunx prettier --write "${changesetFile}"`; ++ await $`npx prettier --write "${changesetFile}"`; + + console.log('\nβœ… Changeset created and formatted successfully'); + } catch (error) { +########## format-github-release.mjs ########## +--- js/scripts/format-github-release.mjs 2026-09-04 20:28:25.871207709 +0000 ++++ /tmp/tmpl/js-tmpl/scripts/format-github-release.mjs 2026-09-04 20:31:16.598474154 +0000 +@@ -1,11 +1,13 @@ + #!/usr/bin/env bun + + /** +- * Format JavaScript GitHub release notes using the format-release-notes.mjs script +- * Usage: bun scripts/format-github-release.mjs --release-version --repository --commit-sha [--tag-prefix js-v] ++ * Format GitHub release notes using the format-release-notes.mjs script ++ * Usage: node scripts/format-github-release.mjs --release-version --repository --commit-sha [--tag-prefix ] [--js-root ] + * release-version: Version number (e.g., 1.0.0) + * repository: GitHub repository (e.g., owner/repo) + * commit_sha: Commit SHA for PR detection ++ * tag-prefix: Prefix for the git tag (default: auto-detect from layout) ++ * js-root: JavaScript package root directory (auto-detected if not specified) + * + * Uses link-foundation libraries: + * - use-m: Dynamic package loading without package.json dependencies +@@ -13,14 +15,13 @@ + * - lino-arguments: Unified configuration from CLI args, env vars, and .lenv files + */ + +-// Load use-m dynamically +-const { use } = eval( +- await (await fetch('https://unpkg.com/use-m/use.js')).text() +-); ++import { getJsRoot, parseJsRootConfig } from './js-paths.mjs'; ++import { buildReleaseTag, normalizeReleaseVersion } from './release-naming.mjs'; ++import { loadCommandStream, loadLinoArguments } from './use-module.mjs'; + + // Import link-foundation libraries +-const { $ } = await use('command-stream'); +-const { makeConfig } = await use('lino-arguments'); ++const { $ } = await loadCommandStream(); ++const { makeConfig } = await loadLinoArguments(); + + // Parse CLI arguments using lino-arguments + // Note: Using --release-version instead of --version to avoid conflict with yargs' built-in --version flag +@@ -44,22 +45,41 @@ + }) + .option('tag-prefix', { + type: 'string', +- default: getenv('TAG_PREFIX', 'js-v'), +- describe: 'Git tag prefix for JavaScript releases', ++ default: getenv('TAG_PREFIX', ''), ++ describe: 'Prefix for the git tag (auto-detected when omitted)', ++ }) ++ .option('js-root', { ++ type: 'string', ++ default: getenv('JS_ROOT', ''), ++ describe: ++ 'JavaScript package root directory (auto-detected if not specified)', + }), + }); + +-const { releaseVersion: version, repository, commitSha, tagPrefix } = config; ++const { ++ releaseVersion: version, ++ repository, ++ commitSha, ++ tagPrefix: configuredTagPrefix, ++ jsRoot: configuredJsRoot, ++} = config; + + if (!version || !repository || !commitSha) { + console.error('Error: Missing required arguments'); + console.error( +- 'Usage: bun scripts/format-github-release.mjs --release-version --repository --commit-sha ' ++ 'Usage: node scripts/format-github-release.mjs --release-version --repository --commit-sha [--tag-prefix ] [--js-root ]' + ); + process.exit(1); + } + +-const tag = `${tagPrefix}${version}`; ++const jsRoot = getJsRoot({ ++ jsRoot: configuredJsRoot || parseJsRootConfig() || undefined, ++}); ++const tag = buildReleaseTag(version, { ++ jsRoot, ++ tagPrefix: configuredTagPrefix || undefined, ++}); ++const normalizedVersion = normalizeReleaseVersion(version); + + try { + // Get the release ID for this version +@@ -76,11 +96,11 @@ + } + + if (releaseId) { +- console.log(`Formatting JavaScript release notes for ${tag}...`); ++ console.log(`Formatting release notes for ${tag}...`); + // Pass the trigger commit SHA for PR detection + // This allows proper PR lookup even if the changelog doesn't have a commit hash +- await $`bun scripts/format-release-notes.mjs --release-id "${releaseId}" --release-version "${tag}" --repository "${repository}" --commit-sha "${commitSha}"`; +- console.log(`Formatted JavaScript release notes for ${tag}`); ++ await $`node scripts/format-release-notes.mjs --release-id "${releaseId}" --release-version "${normalizedVersion}" --repository "${repository}" --commit-sha "${commitSha}"`; ++ console.log(`\u2705 Formatted release notes for ${tag}`); + } + } catch (error) { + console.error('Error formatting release:', error.message); +########## format-release-notes.mjs ########## +--- js/scripts/format-release-notes.mjs 2026-09-04 20:28:25.871207709 +0000 ++++ /tmp/tmpl/js-tmpl/scripts/format-release-notes.mjs 2026-09-04 20:31:16.598474154 +0000 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env bun ++#!/usr/bin/env node + + /** + * Script to format GitHub release notes with proper formatting: +@@ -7,8 +7,6 @@ + * - Add shields.io NPM version badge + * - Format nicely with proper markdown + * +- * IMPORTANT: Update the PACKAGE_NAME constant below to match your package.json +- * + * PR Detection Logic: + * 1. Extract commit hash from changelog entry (if present) + * 2. Fall back to --commit-sha argument (passed from workflow) +@@ -23,16 +21,17 @@ + * Note: Uses --release-version instead of --version to avoid conflict with yargs' built-in --version flag. + */ + +-const PACKAGE_NAME = 'command-stream'; +- +-// Load use-m dynamically +-const { use } = eval( +- await (await fetch('https://unpkg.com/use-m/use.js')).text() +-); ++import { getJsRoot, parseJsRootConfig } from './js-paths.mjs'; ++import { readPackageInfo } from './package-info.mjs'; ++import { ++ buildNpmVersionBadge, ++ normalizeReleaseVersionForBadge, ++} from './format-release-notes-helpers.mjs'; ++import { loadCommandStream, loadLinoArguments } from './use-module.mjs'; + + // Import link-foundation libraries +-const { $ } = await use('command-stream'); +-const { makeConfig } = await use('lino-arguments'); ++const { $ } = await loadCommandStream(); ++const { makeConfig } = await loadLinoArguments(); + + // Parse CLI arguments using lino-arguments + // Note: Using --release-version instead of --version to avoid conflict with yargs' built-in --version flag +@@ -58,6 +57,12 @@ + type: 'string', + default: getenv('COMMIT_SHA', ''), + describe: 'Commit SHA for PR detection', ++ }) ++ .option('js-root', { ++ type: 'string', ++ default: getenv('JS_ROOT', ''), ++ describe: ++ 'JavaScript package root directory (auto-detected if not specified)', + }), + }); + +@@ -65,6 +70,9 @@ + const version = config.releaseVersion; + const repository = config.repository; + const passedCommitSha = config.commitSha; ++const jsRootConfig = config.jsRoot || parseJsRootConfig(); ++const jsRoot = getJsRoot({ jsRoot: jsRootConfig, verbose: true }); ++const { name: packageName } = readPackageInfo({ jsRoot }); + + if (!releaseId || !version || !repository) { + console.error( +@@ -188,8 +196,8 @@ + } + + // Build formatted release notes +- const versionWithoutV = version.replace(/^js-v/, '').replace(/^v/, ''); +- const npmBadge = `[![npm version](https://img.shields.io/badge/npm-${versionWithoutV}-blue.svg)](https://www.npmjs.com/package/${PACKAGE_NAME}/v/${versionWithoutV})`; ++ const versionWithoutV = normalizeReleaseVersionForBadge(version); ++ const npmBadge = buildNpmVersionBadge(packageName, version); + + let formattedBody = `${cleanDescription}`; + +########## instant-version-bump.mjs ########## +--- js/scripts/instant-version-bump.mjs 2026-09-04 20:28:25.872207699 +0000 ++++ /tmp/tmpl/js-tmpl/scripts/instant-version-bump.mjs 2026-09-04 20:31:16.598474154 +0000 +@@ -4,24 +4,37 @@ + * Instant version bump script for manual releases + * Bypasses the changeset workflow and directly updates version and changelog + * +- * Usage: bun scripts/instant-version-bump.mjs --bump-type [--description ] ++ * Usage: node scripts/instant-version-bump.mjs --bump-type [--description ] [--js-root ] ++ * ++ * Configuration: ++ * - CLI: --js-root to explicitly set JavaScript root ++ * - Environment: JS_ROOT= + * + * Uses link-foundation libraries: + * - use-m: Dynamic package loading without package.json dependencies + * - command-stream: Modern shell command execution with streaming support + * - lino-arguments: Unified configuration from CLI args, env vars, and .lenv files ++ * ++ * Addresses issues documented in: ++ * - Issue #21: Supporting both single and multi-language repository structures ++ * - Reference: link-assistant/agent PR #112 (--legacy-peer-deps fix) ++ * - Reference: link-assistant/agent PR #114 (configurable package root) + */ + + import { readFileSync, writeFileSync } from 'fs'; ++import { join } from 'path'; + +-// Load use-m dynamically +-const { use } = eval( +- await (await fetch('https://unpkg.com/use-m/use.js')).text() +-); ++import { ++ getJsRoot, ++ getPackageJsonPath, ++ needsCd, ++ parseJsRootConfig, ++} from './js-paths.mjs'; ++import { loadCommandStream, loadLinoArguments } from './use-module.mjs'; + + // Import link-foundation libraries +-const { $ } = await use('command-stream'); +-const { makeConfig } = await use('lino-arguments'); ++const { $ } = await loadCommandStream(); ++const { makeConfig } = await loadLinoArguments(); + + // Parse CLI arguments using lino-arguments + const config = makeConfig({ +@@ -37,16 +50,31 @@ + type: 'string', + default: getenv('DESCRIPTION', ''), + describe: 'Description for the version bump', ++ }) ++ .option('js-root', { ++ type: 'string', ++ default: getenv('JS_ROOT', ''), ++ describe: ++ 'JavaScript package root directory (auto-detected if not specified)', + }), + }); + ++// Store the original working directory to restore after cd commands ++// IMPORTANT: command-stream's cd is a virtual command that calls process.chdir() ++const originalCwd = process.cwd(); ++ + try { +- const { bumpType, description } = config; ++ const { bumpType, description, jsRoot: jsRootArg } = config; ++ ++ // Get JavaScript package root (auto-detect or use explicit config) ++ const jsRootConfig = jsRootArg || parseJsRootConfig(); ++ const jsRoot = getJsRoot({ jsRoot: jsRootConfig, verbose: true }); ++ + const finalDescription = description || `Manual ${bumpType} release`; + + if (!bumpType || !['major', 'minor', 'patch'].includes(bumpType)) { + console.error( +- 'Usage: bun scripts/instant-version-bump.mjs --bump-type [--description ]' ++ 'Usage: node scripts/instant-version-bump.mjs --bump-type [--description ] [--js-root ]' + ); + process.exit(1); + } +@@ -54,21 +82,29 @@ + console.log(`\nBumping version (${bumpType})...`); + + // Get current version +- const packageJson = JSON.parse(readFileSync('package.json', 'utf-8')); ++ const packageJsonPath = getPackageJsonPath({ jsRoot }); ++ const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8')); + const oldVersion = packageJson.version; + console.log(`Current version: ${oldVersion}`); + + // Bump version using npm version (doesn't create git tag) +- await $`npm version ${bumpType} --no-git-tag-version`; ++ // IMPORTANT: cd is a virtual command that calls process.chdir(), so we restore after ++ if (needsCd({ jsRoot })) { ++ await $`cd ${jsRoot} && npm version ${bumpType} --no-git-tag-version`; ++ process.chdir(originalCwd); ++ } else { ++ await $`npm version ${bumpType} --no-git-tag-version`; ++ } + + // Get new version +- const updatedPackageJson = JSON.parse(readFileSync('package.json', 'utf-8')); ++ const updatedPackageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8')); + const newVersion = updatedPackageJson.version; + console.log(`New version: ${newVersion}`); + + // Update CHANGELOG.md + console.log('\nUpdating CHANGELOG.md...'); +- const changelogPath = 'CHANGELOG.md'; ++ const changelogPath = ++ jsRoot === '.' ? 'CHANGELOG.md' : join(jsRoot, 'CHANGELOG.md'); + let changelog = readFileSync(changelogPath, 'utf-8'); + + // Create new changelog entry +@@ -106,18 +142,24 @@ + writeFileSync(changelogPath, changelog, 'utf-8'); + console.log('βœ… CHANGELOG.md updated'); + +- // Synchronize package-lock.json if it exists +- try { +- console.log('\nSynchronizing package-lock.json...'); +- await $`npm install --package-lock-only`; +- } catch { +- // No package-lock.json or npm not available, skip +- console.log('Skipping package-lock.json sync (not applicable)'); ++ // Synchronize package-lock.json ++ console.log('\nSynchronizing package-lock.json...'); ++ ++ // Use --legacy-peer-deps to handle peer dependency conflicts ++ // This addresses npm ERESOLVE errors documented in issue #111 / PR #112 ++ // IMPORTANT: cd is a virtual command that calls process.chdir(), so we restore after ++ if (needsCd({ jsRoot })) { ++ await $`cd ${jsRoot} && npm install --package-lock-only --legacy-peer-deps`; ++ process.chdir(originalCwd); ++ } else { ++ await $`npm install --package-lock-only --legacy-peer-deps`; + } + + console.log('\nβœ… Instant version bump complete'); + console.log(`Version: ${oldVersion} β†’ ${newVersion}`); + } catch (error) { ++ // Restore cwd on error ++ process.chdir(originalCwd); + console.error('Error during instant version bump:', error.message); + if (process.env.DEBUG) { + console.error('Stack trace:', error.stack); +########## merge-changesets.mjs ########## +--- js/scripts/merge-changesets.mjs 2026-09-04 20:28:25.872207699 +0000 ++++ /tmp/tmpl/js-tmpl/scripts/merge-changesets.mjs 2026-09-04 20:31:16.600474133 +0000 +@@ -9,11 +9,10 @@ + * - Preserves all descriptions in chronological order (by file modification time) + * - Removes the individual changeset files after merging + * - Does nothing if there's only one or no changesets ++ * - Fails if any changeset cannot be parsed + * + * This script is run before `changeset version` to ensure a clean release + * even when multiple PRs have merged before a release cycle. +- * +- * IMPORTANT: Update the package name below to match your package.json + */ + + import { +@@ -25,8 +24,12 @@ + } from 'fs'; + import { join } from 'path'; + +-const PACKAGE_NAME = 'command-stream'; +-const CHANGESET_DIR = '.changeset'; ++import { getChangesetDir, getJsRoot, parseJsRootConfig } from './js-paths.mjs'; ++import { ++ formatChangesetHeader, ++ getChangesetVersionTypeRegex, ++ readPackageInfo, ++} from './package-info.mjs'; + + // Version bump type priority (higher number = higher priority) + const BUMP_PRIORITY = { +@@ -112,41 +115,45 @@ + /** + * Parse a changeset file and extract its metadata + * @param {string} filePath +- * @returns {{type: string, description: string, mtime: Date} | null} ++ * @param {string} packageName ++ * @returns {{type: string, description: string, mtime: Date}} + */ +-function parseChangeset(filePath) { ++function parseChangeset(filePath, packageName) { ++ let content; ++ let stats; ++ + try { +- const content = readFileSync(filePath, 'utf-8'); +- const stats = statSync(filePath); ++ content = readFileSync(filePath, 'utf-8'); ++ stats = statSync(filePath); ++ } catch (error) { ++ throw new Error(`Failed to read ${filePath}: ${error.message}`); ++ } + +- // Extract version type - support both quoted and unquoted package names +- const versionTypeRegex = new RegExp( +- `^['"]?${PACKAGE_NAME.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}['"]?:\\s+(major|minor|patch)`, +- 'm' ++ // Extract version type - support both quoted and unquoted package names ++ const versionTypeRegex = getChangesetVersionTypeRegex(packageName, { ++ requireQuotes: false, ++ }); ++ const versionTypeMatch = content.match(versionTypeRegex); ++ ++ if (!versionTypeMatch) { ++ throw new Error( ++ `Could not parse version type from ${filePath}. Expected a changeset header like ${formatChangesetHeader( ++ packageName, ++ 'patch' ++ )} with version type major, minor, or patch.` + ); +- const versionTypeMatch = content.match(versionTypeRegex); +- +- if (!versionTypeMatch) { +- console.warn( +- `Warning: Could not parse version type from ${filePath}, skipping` +- ); +- return null; +- } +- +- // Extract description +- const parts = content.split('---'); +- const description = +- parts.length >= 3 ? parts.slice(2).join('---').trim() : ''; +- +- return { +- type: versionTypeMatch[1], +- description, +- mtime: stats.mtime, +- }; +- } catch (error) { +- console.warn(`Warning: Failed to parse ${filePath}: ${error.message}`); +- return null; + } ++ ++ // Extract description ++ const parts = content.split('---'); ++ const description = ++ parts.length >= 3 ? parts.slice(2).join('---').trim() : ''; ++ ++ return { ++ type: versionTypeMatch[1], ++ description, ++ mtime: stats.mtime, ++ }; + } + + /** +@@ -168,13 +175,14 @@ + * Create a merged changeset file + * @param {string} type + * @param {string[]} descriptions ++ * @param {string} packageName + * @returns {string} + */ +-function createMergedChangeset(type, descriptions) { ++function createMergedChangeset(type, descriptions, packageName) { + const combinedDescription = descriptions.join('\n\n'); + + return `--- +-'${PACKAGE_NAME}': ${type} ++${formatChangesetHeader(packageName, type)} + --- + + ${combinedDescription} +@@ -183,9 +191,14 @@ + + function main() { + console.log('Checking for multiple changesets to merge...'); ++ const jsRootConfig = parseJsRootConfig(); ++ const jsRoot = getJsRoot({ jsRoot: jsRootConfig, verbose: true }); ++ const changesetDir = getChangesetDir({ jsRoot }); ++ const { name: packageName } = readPackageInfo({ jsRoot }); ++ console.log(`Package: ${packageName}`); + + // Get all changeset files +- const changesetFiles = readdirSync(CHANGESET_DIR).filter( ++ const changesetFiles = readdirSync(changesetDir).filter( + (file) => file.endsWith('.md') && file !== 'README.md' + ); + +@@ -203,8 +216,8 @@ + // Parse all changesets + const parsedChangesets = []; + for (const file of changesetFiles) { +- const filePath = join(CHANGESET_DIR, file); +- const parsed = parseChangeset(filePath); ++ const filePath = join(changesetDir, file); ++ const parsed = parseChangeset(filePath, packageName); + if (parsed) { + parsedChangesets.push({ + file, +@@ -238,11 +251,15 @@ + console.log(` Descriptions to merge: ${descriptions.length}`); + + // Create merged changeset content +- const mergedContent = createMergedChangeset(highestBumpType, descriptions); ++ const mergedContent = createMergedChangeset( ++ highestBumpType, ++ descriptions, ++ packageName ++ ); + + // Generate a unique name for the merged changeset + const mergedFileName = `merged-${generateChangesetName()}.md`; +- const mergedFilePath = join(CHANGESET_DIR, mergedFileName); ++ const mergedFilePath = join(changesetDir, mergedFileName); + + // Write the merged changeset + writeFileSync(mergedFilePath, mergedContent); +@@ -259,4 +276,12 @@ + console.log(`\nMerged changeset content:\n${mergedContent}`); + } + +-main(); ++try { ++ main(); ++} catch (error) { ++ console.error(`::error::${error.message}`); ++ if (process.env.DEBUG) { ++ console.error('Stack trace:', error.stack); ++ } ++ process.exit(1); ++} +########## publish-to-npm.mjs ########## +--- js/scripts/publish-to-npm.mjs 2026-09-04 20:28:25.872207699 +0000 ++++ /tmp/tmpl/js-tmpl/scripts/publish-to-npm.mjs 2026-09-04 20:31:16.600474133 +0000 +@@ -2,86 +2,108 @@ + + /** + * Publish to npm using OIDC trusted publishing +- * Usage: bun scripts/publish-to-npm.mjs [--should-pull] ++ * Usage: node scripts/publish-to-npm.mjs [--should-pull] [--js-root ] + * should_pull: Optional flag to pull latest changes before publishing (for release job) + * +- * IMPORTANT: Update the PACKAGE_NAME constant below to match your package.json +- * +- * Reliable success detection (prevents false-positive releases): +- * command-stream's `$` does NOT throw on a non-zero exit code (errexit is +- * off by default β€” see issue #156). A bare `await $`cmd`` therefore never +- * rejects, so a try/catch around it can never observe a failure. The previous +- * version of this script relied on that catch, so a failed `changeset publish` +- * (e.g. npm E404) was silently reported as a success β€” which created a +- * GitHub release (`js-v0.10.1`) for a version that never reached npm (#166). +- * +- * This version mirrors the multi-layer detection used by the pipeline +- * template (link-foundation/js-ai-driven-development-pipeline-template, +- * originally link-assistant/agent PR #116): +- * 1. scan the captured output for known failure patterns, +- * 2. check the captured exit code, and +- * 3. verify the version is actually visible on npm with `npm view`. +- * A publish is only reported when all three layers pass. ++ * Configuration: ++ * - CLI: --js-root to explicitly set JavaScript root ++ * - Environment: JS_ROOT= + * + * Uses link-foundation libraries: + * - use-m: Dynamic package loading without package.json dependencies + * - command-stream: Modern shell command execution with streaming support + * - lino-arguments: Unified configuration from CLI args, env vars, and .lenv files ++ * ++ * Supports both single and multi-language repository structures via a ++ * configurable package root. + */ + +-import { readFileSync, appendFileSync } from 'fs'; ++import { appendFileSync } from 'fs'; + +-const PACKAGE_NAME = 'command-stream'; +- +-// Load use-m dynamically +-const { use } = eval( +- await (await fetch('https://unpkg.com/use-m/use.js')).text() +-); ++import { getJsRoot, needsCd, parseJsRootConfig } from './js-paths.mjs'; ++import { isPackageVersionPublished } from './npm-registry.mjs'; ++import { readPackageInfo } from './package-info.mjs'; ++import { ++ buildAuthFailureGuidance, ++ isNonRetryableFailure, ++} from './publish-failure-classifier.mjs'; ++import { ++ isAlreadyPublishedError, ++ publishWithRetry, ++ sleep, ++} from './publish-retry.mjs'; ++import { loadCommandStream, loadLinoArguments } from './use-module.mjs'; + + // Import link-foundation libraries +-const { $ } = await use('command-stream'); +-const { makeConfig } = await use('lino-arguments'); ++const { $ } = await loadCommandStream(); ++const { makeConfig } = await loadLinoArguments(); + + // Parse CLI arguments using lino-arguments + const config = makeConfig({ + yargs: ({ yargs, getenv }) => +- yargs.option('should-pull', { +- type: 'boolean', +- default: getenv('SHOULD_PULL', false), +- describe: 'Pull latest changes before publishing', +- }), ++ yargs ++ .option('should-pull', { ++ type: 'boolean', ++ default: getenv('SHOULD_PULL', false), ++ describe: 'Pull latest changes before publishing', ++ }) ++ .option('js-root', { ++ type: 'string', ++ default: getenv('JS_ROOT', ''), ++ describe: ++ 'JavaScript package root directory (auto-detected if not specified)', ++ }), + }); + +-const { shouldPull } = config; ++const { shouldPull, jsRoot: jsRootArg } = config; ++ ++// Get JavaScript package root (auto-detect or use explicit config) ++const jsRootConfig = jsRootArg || parseJsRootConfig(); ++const jsRoot = getJsRoot({ jsRoot: jsRootConfig, verbose: true }); ++ + const MAX_RETRIES = 3; +-// Configurable so tests can run the retry loop without waiting (see +-// tests/publish-to-npm.test.mjs). Defaults to 10s for real CI runs. +-const RETRY_DELAY = Number(process.env.PUBLISH_RETRY_DELAY ?? 10000); // ms +-// Wait for the npm registry to propagate before verifying a fresh publish. +-const VERIFY_DELAY = Number(process.env.PUBLISH_VERIFY_DELAY ?? 2000); // ms +- +-// Patterns that indicate a publish failure in the changeset/npm output. +-// `changeset publish` can print these and still exit 0 in some npm versions, +-// so output scanning is the most reliable first line of defense. +-// Reference: link-assistant/agent PR #116 β€” prevent false positives in CI/CD. ++const RETRY_DELAY = 10000; // 10 seconds ++ ++// Store the original working directory to restore after cd commands ++// IMPORTANT: command-stream's cd is a virtual command that calls process.chdir() ++const originalCwd = process.cwd(); ++ ++// Patterns that indicate publish failure in changeset output ++// Guards against false positives in CI/CD output parsing. + const FAILURE_PATTERNS = [ + 'packages failed to publish', + 'error occurred while publishing', +- 'npm error code e', ++ 'npm error code E', + 'npm error 404', + 'npm error 401', + 'npm error 403', +- 'access token expired', +- 'eneedauth', +- 'exited with code 1', ++ 'Access token expired', ++ 'ENEEDAUTH', + ]; + + /** +- * Sleep for specified milliseconds +- * @param {number} ms ++ * Check if the output contains any failure patterns ++ * @param {string} output - Combined stdout and stderr ++ * @returns {string|null} - The matched failure pattern or null if no failure detected + */ +-function sleep(ms) { +- return new Promise((resolve) => globalThis.setTimeout(resolve, ms)); ++function detectPublishFailure(output) { ++ const lowerOutput = output.toLowerCase(); ++ for (const pattern of FAILURE_PATTERNS) { ++ if (lowerOutput.includes(pattern.toLowerCase())) { ++ return pattern; ++ } ++ } ++ return null; ++} ++ ++/** ++ * Verify that a package version is published on npm ++ * @param {string} packageName ++ * @param {string} version ++ * @returns {Promise} ++ */ ++function verifyPublished(packageName, version) { ++ return isPackageVersionPublished(packageName, version); + } + + /** +@@ -97,78 +119,107 @@ + } + + /** +- * Check if the combined output contains any known failure pattern. +- * @param {string} output - Combined stdout and stderr +- * @returns {string|null} - The matched failure pattern, or null when clean ++ * Run changeset:publish command with output capture ++ * @param {Function} shell ++ * @param {string} jsRoot ++ * @param {string} originalCwd ++ * @returns {Promise<{result: object|null, error: Error|null}>} + */ +-function detectPublishFailure(output) { +- const lowerOutput = output.toLowerCase(); +- for (const pattern of FAILURE_PATTERNS) { +- if (lowerOutput.includes(pattern)) { +- return pattern; ++async function runChangesetPublish(shell, jsRoot, originalCwd) { ++ try { ++ // Run changeset:publish from the js directory where package.json with this script exists ++ // IMPORTANT: Use .run({ capture: true }) to capture output for failure detection ++ // IMPORTANT: cd is a virtual command that calls process.chdir(), so we restore after ++ if (needsCd({ jsRoot })) { ++ const result = await shell`cd ${jsRoot} && npm run changeset:publish`.run( ++ { ++ capture: true, ++ } ++ ); ++ process.chdir(originalCwd); ++ return { result, error: null }; ++ } ++ const result = await shell`npm run changeset:publish`.run({ ++ capture: true, ++ }); ++ return { result, error: null }; ++ } catch (error) { ++ // Restore cwd on error before retry ++ if (needsCd({ jsRoot })) { ++ process.chdir(originalCwd); + } ++ return { result: null, error }; + } +- return null; + } + + /** +- * Verify a package version is actually published on npm. +- * @param {string} packageName +- * @param {string} version +- * @returns {Promise} ++ * Analyze publish result for failures using multi-layer detection ++ * @param {object|null} publishResult - The result from runChangesetPublish ++ * @param {Error|null} commandError - Error thrown by the command ++ * @returns {Error|null} - Error if failure detected, null otherwise + */ +-async function verifyPublished(packageName, version) { +- const result = await $`npm view "${packageName}@${version}" version`.run({ +- capture: true, +- }); +- return result.code === 0 && result.stdout.trim().includes(version); ++function analyzePublishResult(publishResult, commandError) { ++ if (commandError) { ++ return commandError; ++ } ++ ++ const combinedOutput = publishResult ++ ? `${publishResult.stdout || ''}\n${publishResult.stderr || ''}` ++ : ''; ++ ++ // Log the output for debugging ++ if (combinedOutput.trim()) { ++ console.log('Changeset output:', combinedOutput); ++ } ++ ++ // Check for failure patterns in output (most reliable for changeset) ++ const failurePattern = detectPublishFailure(combinedOutput); ++ if (failurePattern) { ++ console.error(`Detected publish failure: "${failurePattern}"`); ++ return new Error(`Publish failed: detected "${failurePattern}" in output`); ++ } ++ ++ // Check exit code (if available and non-zero) ++ if (publishResult && publishResult.code !== 0) { ++ console.error(`Changeset exited with code ${publishResult.code}`); ++ return new Error(`Publish failed with exit code ${publishResult.code}`); ++ } ++ ++ return null; + } + + /** +- * Run `changeset:publish` once and decide whether it really succeeded. +- * +- * command-stream does not throw on non-zero exits, so we capture the output +- * and apply three independent checks before trusting the result. +- * +- * @param {string} packageName +- * @param {string} version +- * @returns {Promise<{success: boolean, error: Error|null}>} ++ * Run a single publish command invocation (no verification). ++ * Verification is a separate failure domain handled by publishWithRetry. ++ * @param {Function} shell ++ * @param {string} jsRoot ++ * @param {string} originalCwd ++ * @returns {Promise<{success: boolean, error: Error|null, output: string}>} + */ +-async function attemptPublish(packageName, version) { +- // IMPORTANT: capture:true mirrors output to the console *and* returns it, +- // so CI logs stay readable while we still get the text and exit code. +- const result = await $`bun run changeset:publish`.run({ capture: true }); +- +- const combinedOutput = `${result.stdout || ''}\n${result.stderr || ''}`; ++async function runPublishCommand(shell, jsRoot, originalCwd) { ++ const { result, error } = await runChangesetPublish( ++ shell, ++ jsRoot, ++ originalCwd ++ ); ++ const analysisError = analyzePublishResult(result, error); ++ const output = [ ++ analysisError?.message || '', ++ result?.stdout || '', ++ result?.stderr || '', ++ ].join('\n'); ++ ++ if (analysisError) { ++ // Mark authentication / registry-configuration failures as non-retryable so ++ // the retry loop can fail fast with actionable guidance without burning ++ // through MAX_RETRIES. ++ if (!isAlreadyPublishedError(output) && isNonRetryableFailure(output)) { ++ analysisError.nonRetryable = true; ++ } ++ return { success: false, error: analysisError, output }; ++ } + +- // Layer 1: scan output for known failure signatures. +- const failurePattern = detectPublishFailure(combinedOutput); +- if (failurePattern) { +- return { +- success: false, +- error: new Error(`detected "${failurePattern}" in publish output`), +- }; +- } +- +- // Layer 2: trust the exit code when it is non-zero. +- if (result.code !== 0) { +- return { +- success: false, +- error: new Error(`changeset publish exited with code ${result.code}`), +- }; +- } +- +- // Layer 3: confirm the version is really on npm (the ultimate check). +- console.log('Verifying package was published to npm...'); +- await sleep(VERIFY_DELAY); +- if (await verifyPublished(packageName, version)) { +- return { success: true, error: null }; +- } +- +- return { +- success: false, +- error: new Error('version not found on npm after publish attempt'), +- }; ++ return { success: true, error: null, output }; + } + + async function main() { +@@ -179,74 +230,68 @@ + } + + // Get current version +- const packageJson = JSON.parse(readFileSync('./package.json', 'utf8')); +- const currentVersion = packageJson.version; ++ const { name: packageName, version: currentVersion } = readPackageInfo({ ++ jsRoot, ++ }); ++ console.log(`Package to publish: ${packageName}`); + console.log(`Current version to publish: ${currentVersion}`); + + // Check if this version is already published on npm + console.log( + `Checking if version ${currentVersion} is already published...` + ); +- const checkResult = +- await $`npm view "${PACKAGE_NAME}@${currentVersion}" version`.run({ +- capture: true, +- }); +- +- // command-stream returns { code: 0 } on success, { code: 1 } on failure (e.g., E404) +- // Exit code 0 means version exists, non-zero means version not found +- if (checkResult.code === 0) { ++ const isAlreadyPublished = await isPackageVersionPublished( ++ packageName, ++ currentVersion ++ ); ++ ++ if (isAlreadyPublished) { + console.log(`Version ${currentVersion} is already published to npm`); + setOutput('published', 'true'); + setOutput('published_version', currentVersion); + setOutput('already_published', 'true'); + return; +- } else { +- // Version not found on npm (E404), proceed with publish +- console.log( +- `Version ${currentVersion} not found on npm, proceeding with publish...` +- ); + } + +- // Publish to npm using OIDC trusted publishing with retry logic. +- // Multi-layer failure detection prevents false-positive releases (#166). +- for (let i = 1; i <= MAX_RETRIES; i++) { +- console.log(`Publish attempt ${i} of ${MAX_RETRIES}...`); +- const { success, error } = await attemptPublish( +- PACKAGE_NAME, +- currentVersion +- ); +- +- if (success) { +- setOutput('published', 'true'); +- setOutput('published_version', currentVersion); +- console.log(`βœ… Published ${PACKAGE_NAME}@${currentVersion} to npm`); +- return; +- } +- +- if (i < MAX_RETRIES) { +- console.log( +- `Publish failed: ${error.message}, waiting ${RETRY_DELAY / 1000}s before retry...` +- ); +- await sleep(RETRY_DELAY); +- } else { +- console.error(`Publish attempt ${i} failed: ${error.message}`); +- } +- } +- +- console.error(`❌ Failed to publish after ${MAX_RETRIES} attempts`); +- console.error( +- 'Hint: an npm E404 on PUT usually means OIDC trusted publishing is not ' + +- 'configured for this workflow file. npm allows only one workflow file ' + +- 'as a trusted publisher; if the release workflow was renamed (e.g. ' + +- 'release.yml -> js.yml), update the trusted publisher on npmjs.com. ' + +- 'See docs/case-studies/issue-166/README.md.' ++ // Version not found on npm (E404), proceed with publish ++ console.log( ++ `Version ${currentVersion} not found on npm, proceeding with publish...` + ); +- // Ensure no false-positive output leaks to the release job. +- setOutput('published', 'false'); ++ ++ // Publish to npm using OIDC trusted publishing with retry logic ++ // Multi-layer failure detection guards against a publish command that ++ // reports success without actually publishing. ++ // ++ // The publish command is retried only when the publish itself failed. ++ // A verification miss is handled by bounded polling and never triggers a ++ // republish. ++ const { success, error } = await publishWithRetry({ ++ publish: () => runPublishCommand($, jsRoot, originalCwd), ++ verify: () => verifyPublished(packageName, currentVersion), ++ maxRetries: MAX_RETRIES, ++ retryDelay: RETRY_DELAY, ++ sleepFn: sleep, ++ log: (message) => console.log(message), ++ }); ++ ++ if (success) { ++ setOutput('published', 'true'); ++ setOutput('published_version', currentVersion); ++ console.log(`\u2705 Published ${packageName}@${currentVersion} to npm`); ++ return; ++ } ++ ++ console.error(`\u274C Publish failed: ${error.message}`); ++ // Authentication / registry-configuration errors will not be fixed by ++ // retrying, so print actionable guidance for the operator. ++ if (error?.nonRetryable && !error?.verificationFailed) { ++ console.error(buildAuthFailureGuidance(packageName)); ++ } + process.exit(1); + } catch (error) { ++ // Restore cwd on error ++ process.chdir(originalCwd); + console.error('Error:', error.message); +- setOutput('published', 'false'); + process.exit(1); + } + } +########## setup-npm.mjs ########## +--- js/scripts/setup-npm.mjs 2026-09-04 20:28:25.872207699 +0000 ++++ /tmp/tmpl/js-tmpl/scripts/setup-npm.mjs 2026-09-04 20:31:16.601474123 +0000 +@@ -1,42 +1,24 @@ +-#!/usr/bin/env bun ++#!/usr/bin/env node ++ ++import { resolve } from 'node:path'; ++import process from 'node:process'; ++import { fileURLToPath } from 'node:url'; + + /** +- * Update npm for OIDC trusted publishing. +- * +- * npm trusted publishing (the keyless, secret-free flow this repo relies on) +- * requires npm >= 11.5.1. The Node.js runtimes used by GitHub Actions ship with +- * older npm, so we must update before publishing. If npm cannot be brought to a +- * version that supports OIDC, publishing would silently fall back to (missing) +- * token auth and fail with an opaque E404 on PUT β€” one of the failure modes +- * behind issue #166. So this script asserts the final npm version and fails +- * loudly when OIDC is unsupported, instead of letting the publish step discover +- * it later. +- * +- * Ported from the js pipeline template +- * (link-foundation/js-ai-driven-development-pipeline-template, +- * scripts/setup-npm.mjs), adapted to bun. The pure version helpers are exported +- * so tests can exercise the gating logic without fetching dependencies or +- * mutating the global npm install. ++ * Update npm for OIDC trusted publishing ++ * npm trusted publishing requires npm >= 11.5.1 ++ * Node.js 20.x ships with npm 10.x, so we need to update + * + * Uses link-foundation libraries: + * - use-m: Dynamic package loading without package.json dependencies + * - command-stream: Modern shell command execution with streaming support + */ + +-import { resolve } from 'node:path'; +-import process from 'node:process'; +-import { fileURLToPath } from 'node:url'; +- + export const NPM_MIN_VERSION = '11.5.1'; + export const NODE_MIN_VERSION = '22.14.0'; + export const NPM_TARGET_MAJOR = 11; + export const NPM_REGISTRY_METADATA_URL = 'https://registry.npmjs.org/npm'; + +-/** +- * Parse a semantic version string into numeric components. +- * @param {string} version +- * @returns {{major: number, minor: number, patch: number, prerelease: string}} +- */ + export function parseVersion(version) { + const match = String(version) + .trim() +@@ -56,12 +38,6 @@ + }; + } + +-/** +- * Compare two semantic versions (-1, 0, 1). +- * @param {string} leftVersion +- * @param {string} rightVersion +- * @returns {number} +- */ + export function compareVersions(leftVersion, rightVersion) { + const left = parseVersion(leftVersion); + const right = parseVersion(rightVersion); +@@ -88,40 +64,18 @@ + return left.prerelease > right.prerelease ? 1 : -1; + } + +-/** +- * Whether version >= minimumVersion. +- * @param {string} version +- * @param {string} minimumVersion +- * @returns {boolean} +- */ + export function isVersionAtLeast(version, minimumVersion) { + return compareVersions(version, minimumVersion) >= 0; + } + +-/** +- * Whether the npm version supports OIDC trusted publishing. +- * @param {string} version +- * @returns {boolean} +- */ + export function isSupportedNpmVersion(version) { + return isVersionAtLeast(version, NPM_MIN_VERSION); + } + +-/** +- * Whether the Node.js version is new enough for the OIDC setup path. +- * @param {string} version +- * @returns {boolean} +- */ + export function isSupportedNodeVersion(version) { + return isVersionAtLeast(version, NODE_MIN_VERSION); + } + +-/** +- * Pick the newest stable npm 11.x release (at or above the OIDC minimum) from +- * registry metadata. +- * @param {{versions?: Object}} metadata +- * @returns {{version: string, tarballUrl: string}} +- */ + export function selectLatestSupportedNpmRelease(metadata) { + const releases = Object.entries(metadata?.versions || {}) + .filter(([version, release]) => { +@@ -166,12 +120,12 @@ + return selectLatestSupportedNpmRelease(metadata); + } + +-// Update npm for OIDC trusted publishing (requires >= 11.5.1). +-// Pin to npm@11 to avoid breaking changes from future major versions. ++// Update npm for OIDC trusted publishing (requires >= 11.5.1) ++// Pin to npm@11 to avoid breaking changes from future major versions + // +-// Known issue: some GitHub Actions runner images ship a broken npm that is +-// missing the 'promise-retry' module, causing `npm install -g` to fail with +-// MODULE_NOT_FOUND. ++// Known issue: Node.js 22.22.2 on GitHub Actions (ubuntu-24.04 image >= 20260329.72.1) ++// ships with a broken npm 10.9.7 that is missing the 'promise-retry' module, ++// causing `npm install -g` to fail with MODULE_NOT_FOUND. + // See: https://github.com/actions/runner-images/issues/13883 + // See: https://github.com/nodejs/node/issues/62430 + // See: https://github.com/npm/cli/issues/9151 +@@ -236,12 +190,6 @@ + process.exit(1); + } + +-/** +- * Bring npm to an OIDC-capable version, trying multiple strategies, and assert +- * the result. command-stream's `$` is passed in so this stays testable. +- * @param {Function} $ - command-stream tagged template +- * @param {Function} [fetchFn] - fetch implementation (overridable in tests) +- */ + export async function setupNpm($, fetchFn = fetch) { + const nodeVersion = process.version; + console.log(`Current Node.js version: ${nodeVersion}`); +@@ -269,12 +217,16 @@ + break; + } + console.warn( +- 'This may be a broken bundled-npm runner image (actions/runner-images#13883).' ++ 'This may be the Node.js 22.22.2 broken npm issue (actions/runner-images#13883).' + ); + } + +- if (!success && isSupportedNpmVersion(currentVersion)) { +- console.log('Current npm version already supports OIDC trusted publishing'); ++ if (!success) { ++ if (isSupportedNpmVersion(currentVersion)) { ++ console.log( ++ 'Current npm version already supports OIDC trusted publishing' ++ ); ++ } + } + + const updatedResult = await $`npm --version`.run({ capture: true }); +@@ -298,12 +250,11 @@ + failUnsupportedNodeVersion(process.version); + } + +- // Load use-m dynamically only for CLI execution, so tests can import the +- // pure version helpers without fetching dependencies or mutating npm. +- const { use } = eval( +- await (await fetch('https://unpkg.com/use-m/use.js')).text() +- ); +- const { $ } = await use('command-stream'); ++ // Load command-stream dynamically only for CLI execution, so tests can ++ // import the pure version helpers without fetching dependencies or ++ // mutating npm. ++ const { loadCommandStream } = await import('./use-module.mjs'); ++ const { $ } = await loadCommandStream(); + + await setupNpm($); + } catch (error) { +########## validate-changeset.mjs ########## +--- js/scripts/validate-changeset.mjs 2026-09-04 20:28:25.872207699 +0000 ++++ /tmp/tmpl/js-tmpl/scripts/validate-changeset.mjs 2026-09-04 20:31:16.602474113 +0000 +@@ -8,19 +8,17 @@ + * - Uses git diff to compare PR head against base branch + * - Validates that the PR adds exactly one changeset with proper format + * - Falls back to checking all changesets for local development +- * +- * IMPORTANT: Update the package name below to match your package.json + */ + + import { execSync } from 'child_process'; + import { readFileSync, readdirSync, existsSync } from 'fs'; + import { join } from 'path'; + +-const PACKAGE_NAME = 'command-stream'; +-const CHANGESET_DIR = '.changeset'; +-const GIT_CHANGESET_DIR = existsSync('../.git') +- ? 'js/.changeset' +- : CHANGESET_DIR; ++import { getChangesetDir, getJsRoot, parseJsRootConfig } from './js-paths.mjs'; ++import { ++ getChangesetVersionTypeRegex, ++ readPackageInfo, ++} from './package-info.mjs'; + + /** + * Ensure a git commit is available locally, fetching if necessary +@@ -42,10 +40,14 @@ + /** + * Parse git diff output and extract added changeset files + * @param {string} diffOutput Output from git diff --name-status ++ * @param {string} changesetDir Path to the changeset directory + * @returns {string[]} Array of added changeset file names + */ +-function parseAddedChangesets(diffOutput) { ++function parseAddedChangesets(diffOutput, changesetDir) { + const addedChangesets = []; ++ const changesetGitPath = changesetDir ++ .replace(/\\/g, '/') ++ .replace(/^\.\//, ''); + for (const line of diffOutput.trim().split('\n')) { + if (!line) { + continue; +@@ -53,16 +55,11 @@ + const [status, filePath] = line.split('\t'); + if ( + status === 'A' && +- (filePath.startsWith(`${CHANGESET_DIR}/`) || +- filePath.startsWith(`${GIT_CHANGESET_DIR}/`)) && ++ filePath.startsWith(`${changesetGitPath}/`) && + filePath.endsWith('.md') && + !filePath.endsWith('README.md') + ) { +- addedChangesets.push( +- filePath +- .replace(`${GIT_CHANGESET_DIR}/`, '') +- .replace(`${CHANGESET_DIR}/`, '') +- ); ++ addedChangesets.push(filePath.replace(`${changesetGitPath}/`, '')); + } + } + return addedChangesets; +@@ -72,9 +69,10 @@ + * Try to get changesets using explicit SHA comparison + * @param {string} baseSha Base commit SHA + * @param {string} headSha Head commit SHA ++ * @param {string} changesetDir Path to the changeset directory + * @returns {string[] | null} Array of changeset files or null if failed + */ +-function tryExplicitShaComparison(baseSha, headSha) { ++function tryExplicitShaComparison(baseSha, headSha, changesetDir) { + console.log(`Comparing ${baseSha}...${headSha}`); + try { + ensureCommitAvailable(baseSha); +@@ -82,7 +80,7 @@ + `git diff --name-status ${baseSha} ${headSha}`, + { encoding: 'utf-8' } + ); +- return parseAddedChangesets(diffOutput); ++ return parseAddedChangesets(diffOutput, changesetDir); + } catch (error) { + console.log(`Git diff with explicit SHAs failed: ${error.message}`); + return null; +@@ -92,9 +90,10 @@ + /** + * Try to get changesets using base branch comparison + * @param {string} prBase Base branch name ++ * @param {string} changesetDir Path to the changeset directory + * @returns {string[] | null} Array of changeset files or null if failed + */ +-function tryBaseBranchComparison(prBase) { ++function tryBaseBranchComparison(prBase, changesetDir) { + console.log(`Comparing against base branch: ${prBase}`); + try { + try { +@@ -106,7 +105,7 @@ + `git diff --name-status origin/${prBase}...HEAD`, + { encoding: 'utf-8' } + ); +- return parseAddedChangesets(diffOutput); ++ return parseAddedChangesets(diffOutput, changesetDir); + } catch (error) { + console.log(`Git diff with base ref failed: ${error.message}`); + return null; +@@ -115,31 +114,33 @@ + + /** + * Fallback: get all changesets in directory ++ * @param {string} changesetDir Path to the changeset directory + * @returns {string[]} Array of all changeset file names + */ +-function getAllChangesets() { ++function getAllChangesets(changesetDir) { + console.log( + 'Warning: Could not determine PR diff, checking all changesets in directory' + ); +- if (!existsSync(CHANGESET_DIR)) { ++ if (!existsSync(changesetDir)) { + return []; + } +- return readdirSync(CHANGESET_DIR).filter( ++ return readdirSync(changesetDir).filter( + (file) => file.endsWith('.md') && file !== 'README.md' + ); + } + + /** + * Get changeset files added in the current PR using git diff ++ * @param {string} changesetDir Path to the changeset directory + * @returns {string[]} Array of added changeset file names + */ +-function getAddedChangesetFiles() { ++function getAddedChangesetFiles(changesetDir) { + const baseSha = process.env.GITHUB_BASE_SHA || process.env.BASE_SHA; + const headSha = process.env.GITHUB_HEAD_SHA || process.env.HEAD_SHA; + + // Try explicit SHAs first + if (baseSha && headSha) { +- const result = tryExplicitShaComparison(baseSha, headSha); ++ const result = tryExplicitShaComparison(baseSha, headSha, changesetDir); + if (result !== null) { + return result; + } +@@ -148,36 +149,34 @@ + // Try base branch comparison + const prBase = process.env.GITHUB_BASE_REF; + if (prBase) { +- const result = tryBaseBranchComparison(prBase); ++ const result = tryBaseBranchComparison(prBase, changesetDir); + if (result !== null) { + return result; + } + } + + // Fallback to checking all changesets +- return getAllChangesets(); ++ return getAllChangesets(changesetDir); + } + + /** + * Validate a single changeset file + * @param {string} filePath Full path to the changeset file ++ * @param {string} packageName + * @returns {{valid: boolean, type?: string, description?: string, error?: string}} + */ +-function validateChangesetFile(filePath) { ++function validateChangesetFile(filePath, packageName) { + try { + const content = readFileSync(filePath, 'utf-8'); + + // Check if changeset has a valid type (major, minor, or patch) +- const versionTypeRegex = new RegExp( +- `^['"]${PACKAGE_NAME.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}['"]:\\s+(major|minor|patch)`, +- 'm' +- ); ++ const versionTypeRegex = getChangesetVersionTypeRegex(packageName); + const versionTypeMatch = content.match(versionTypeRegex); + + if (!versionTypeMatch) { + return { + valid: false, +- error: `Changeset must specify a version type: major, minor, or patch\nExpected format:\n---\n'${PACKAGE_NAME}': patch\n---\n\nYour description here`, ++ error: `Changeset must specify a version type: major, minor, or patch\nExpected format:\n---\n'${packageName}': patch\n---\n\nYour description here`, + }; + } + +@@ -214,9 +213,14 @@ + + try { + console.log('Validating changesets added by this PR...'); ++ const jsRootConfig = parseJsRootConfig(); ++ const jsRoot = getJsRoot({ jsRoot: jsRootConfig, verbose: true }); ++ const changesetDir = getChangesetDir({ jsRoot }); ++ const { name: packageName } = readPackageInfo({ jsRoot }); ++ console.log(`Package: ${packageName}`); + + // Get changeset files added in this PR +- const addedChangesetFiles = getAddedChangesetFiles(); ++ const addedChangesetFiles = getAddedChangesetFiles(changesetDir); + const changesetCount = addedChangesetFiles.length; + + console.log(`Found ${changesetCount} changeset file(s) added by this PR`); +@@ -228,7 +232,7 @@ + // Ensure exactly one changeset file was added + if (changesetCount === 0) { + console.error( +- "::error::No changeset found in this PR. Please add a changeset by running 'bun run changeset' and commit the result." ++ "::error::No changeset found in this PR. Please add a changeset by running 'npm run changeset' and commit the result." + ); + process.exit(1); + } else if (changesetCount > 1) { +@@ -244,10 +248,10 @@ + } + + // Validate the single changeset file +- const changesetFile = join(CHANGESET_DIR, addedChangesetFiles[0]); ++ const changesetFile = join(changesetDir, addedChangesetFiles[0]); + console.log(`Validating changeset: ${changesetFile}`); + +- const validation = validateChangesetFile(changesetFile); ++ const validation = validateChangesetFile(changesetFile, packageName); + + if (!validation.valid) { + console.error(`::error::${validation.error}`); +########## version-and-commit.mjs ########## +--- js/scripts/version-and-commit.mjs 2026-09-04 20:28:25.872207699 +0000 ++++ /tmp/tmpl/js-tmpl/scripts/version-and-commit.mjs 2026-09-04 20:31:16.603474103 +0000 +@@ -1,11 +1,15 @@ + #!/usr/bin/env bun + + /** +- * Version the JavaScript package and commit to main +- * Usage: bun scripts/version-and-commit.mjs --mode [--bump-type ] [--description ] ++ * Version packages and commit to main ++ * Usage: node scripts/version-and-commit.mjs --mode [--bump-type ] [--description ] [--js-root ] + * changeset: Run changeset version + * instant: Run instant version bump with bump_type (patch|minor|major) and optional description + * ++ * Configuration: ++ * - CLI: --js-root to explicitly set JavaScript root ++ * - Environment: JS_ROOT= ++ * + * Uses link-foundation libraries: + * - use-m: Dynamic package loading without package.json dependencies + * - command-stream: Modern shell command execution with streaming support +@@ -14,14 +18,18 @@ + + import { readFileSync, appendFileSync, readdirSync } from 'fs'; + +-// Load use-m dynamically +-const { use } = eval( +- await (await fetch('https://unpkg.com/use-m/use.js')).text() +-); ++import { ++ getJsRoot, ++ getPackageJsonPath, ++ getChangesetDir, ++ needsCd, ++ parseJsRootConfig, ++} from './js-paths.mjs'; ++import { loadCommandStream, loadLinoArguments } from './use-module.mjs'; + + // Import link-foundation libraries +-const { $ } = await use('command-stream'); +-const { makeConfig } = await use('lino-arguments'); ++const { $ } = await loadCommandStream(); ++const { makeConfig } = await loadLinoArguments(); + + // Parse CLI arguments using lino-arguments + const config = makeConfig({ +@@ -42,16 +50,27 @@ + type: 'string', + default: getenv('DESCRIPTION', ''), + describe: 'Description for instant version bump', ++ }) ++ .option('js-root', { ++ type: 'string', ++ default: getenv('JS_ROOT', ''), ++ describe: ++ 'JavaScript package root directory (auto-detected if not specified)', + }), + }); + +-const { mode, bumpType, description } = config; ++const { mode, bumpType, description, jsRoot: jsRootArg } = config; ++ ++// Get JavaScript package root (auto-detect or use explicit config) ++const jsRootConfig = jsRootArg || parseJsRootConfig(); ++const jsRoot = getJsRoot({ jsRoot: jsRootConfig, verbose: true }); + + // Debug: Log parsed configuration + console.log('Parsed configuration:', { + mode, + bumpType, + description: description || '(none)', ++ jsRoot, + }); + + // Detect if positional arguments were used (common mistake) +@@ -61,21 +80,26 @@ + console.error('Command line arguments:', args); + console.error(''); + console.error( +- 'This script requires named arguments (--mode, --bump-type, --description).' ++ 'This script requires named arguments (--mode, --bump-type, --description, --js-root).' + ); + console.error('Usage:'); + console.error(' Changeset mode:'); +- console.error(' bun scripts/version-and-commit.mjs --mode changeset'); ++ console.error( ++ ' node scripts/version-and-commit.mjs --mode changeset [--js-root ]' ++ ); + console.error(' Instant mode:'); + console.error( +- ' bun scripts/version-and-commit.mjs --mode instant --bump-type [--description ]' ++ ' node scripts/version-and-commit.mjs --mode instant --bump-type [--description ] [--js-root ]' + ); + console.error(''); + console.error('Examples:'); + console.error( +- ' bun scripts/version-and-commit.mjs --mode instant --bump-type patch --description "Fix bug"' ++ ' node scripts/version-and-commit.mjs --mode instant --bump-type patch --description "Fix bug"' ++ ); ++ console.error(' node scripts/version-and-commit.mjs --mode changeset'); ++ console.error( ++ ' node scripts/version-and-commit.mjs --mode changeset --js-root js' + ); +- console.error(' bun scripts/version-and-commit.mjs --mode changeset'); + process.exit(1); + } + +@@ -90,11 +114,15 @@ + if (mode === 'instant' && !bumpType) { + console.error('Error: --bump-type is required for instant mode'); + console.error( +- 'Usage: bun scripts/version-and-commit.mjs --mode instant --bump-type [--description ]' ++ 'Usage: node scripts/version-and-commit.mjs --mode instant --bump-type [--description ] [--js-root ]' + ); + process.exit(1); + } + ++// Store the original working directory to restore after cd commands ++// IMPORTANT: command-stream's cd is a virtual command that calls process.chdir() ++const originalCwd = process.cwd(); ++ + /** + * Append to GitHub Actions output file + * @param {string} key +@@ -112,7 +140,7 @@ + */ + function countChangesets() { + try { +- const changesetDir = '.changeset'; ++ const changesetDir = getChangesetDir({ jsRoot }); + const files = readdirSync(changesetDir); + return files.filter((f) => f.endsWith('.md') && f !== 'README.md').length; + } catch { +@@ -125,20 +153,25 @@ + * @param {string} source - 'local' or 'remote' + */ + async function getVersion(source = 'local') { ++ const packageJsonPath = getPackageJsonPath({ jsRoot }); + if (source === 'remote') { +- const result = await $`git show origin/main:js/package.json`.run({ ++ const result = await $`git show origin/main:${packageJsonPath}`.run({ + capture: true, + }); + return JSON.parse(result.stdout).version; + } +- return JSON.parse(readFileSync('./package.json', 'utf8')).version; ++ return JSON.parse(readFileSync(packageJsonPath, 'utf8')).version; + } + + async function main() { + try { + // Configure git ++ // The 41898282+ prefix is what links the commit to the github-actions[bot] ++ // account. Without it the commit is "unattributed", and a ruleset with ++ // require_extra_approval_for_unattributed_changes will demand a human ++ // approval before an automated release pull request can be merged. + await $`git config user.name "github-actions[bot]"`; +- await $`git config user.email "github-actions[bot]@users.noreply.github.com"`; ++ await $`git config user.email "41898282+github-actions[bot]@users.noreply.github.com"`; + + // Check if remote main has advanced (handles re-runs after partial success) + console.log('Checking for remote changes...'); +@@ -187,16 +220,23 @@ + if (mode === 'instant') { + console.log('Running instant version bump...'); + // Run instant version bump script ++ // Pass --js-root to ensure consistent path handling + // Rely on command-stream's auto-quoting for proper argument handling + if (description) { +- await $`bun scripts/instant-version-bump.mjs --bump-type ${bumpType} --description ${description}`; ++ await $`node scripts/instant-version-bump.mjs --bump-type ${bumpType} --description ${description} --js-root ${jsRoot}`; + } else { +- await $`bun scripts/instant-version-bump.mjs --bump-type ${bumpType}`; ++ await $`node scripts/instant-version-bump.mjs --bump-type ${bumpType} --js-root ${jsRoot}`; + } + } else { + console.log('Running changeset version...'); + // Run changeset version to bump versions and update CHANGELOG +- await $`bun run changeset:version`; ++ // IMPORTANT: cd is a virtual command that calls process.chdir(), so we restore after ++ if (needsCd({ jsRoot })) { ++ await $`cd ${jsRoot} && npm run changeset:version`; ++ process.chdir(originalCwd); ++ } else { ++ await $`npm run changeset:version`; ++ } + } + + // Get new version after bump +@@ -219,26 +259,34 @@ + const escapedMessage = commitMessage.replace(/"/g, '\\"'); + await $`git commit -m "${escapedMessage}"`; + +- // Push directly to main. +- // command-stream's `$` does NOT throw on a non-zero exit (errexit is off +- // by default, see issue #156), so we check the result code explicitly. +- // A silently-failed push would otherwise report version_committed=true and +- // let the release job publish/release a version that is not on main (the +- // same false-positive class that produced #166). +- const pushResult = await $`git push origin main`.run({ capture: true }); ++ // Push directly to main, rebasing and retrying if another main writer won ++ // the race between this commit and the push, and landing the commit ++ // through a pull request when a repository ruleset declines direct ++ // pushes to main (link-foundation/js-ai-driven-development-pipeline-template#143). ++ // ++ // command-stream's `$` resolves (it does not throw) on a non-zero exit ++ // code, so the exit code is checked explicitly: reporting ++ // version_committed=true for a push that never landed would let the ++ // publish job work from a version that exists only in the runner. ++ const pushResult = ++ await $`node scripts/push-main-with-rebase-retry.mjs origin main --label ${newVersion}`.run( ++ { capture: true, mirror: true } ++ ); + if (pushResult.code !== 0) { + throw new Error( +- `git push origin main failed (exit code ${pushResult.code}): ${pushResult.stderr?.trim() || 'no stderr'}` ++ `Failed to push version ${newVersion} to main (exit ${pushResult.code})` + ); + } + +- console.log('βœ… Version bump committed and pushed to main'); ++ console.log('\u2705 Version bump committed and pushed to main'); + setOutput('version_committed', 'true'); + } else { + console.log('No changes to commit'); + setOutput('version_committed', 'false'); + } + } catch (error) { ++ // Restore cwd on error ++ process.chdir(originalCwd); + console.error('Error:', error.message); + process.exit(1); + } +########## wait-for-npm.mjs ########## +--- js/scripts/wait-for-npm.mjs 2026-09-04 20:28:25.872207699 +0000 ++++ /tmp/tmpl/js-tmpl/scripts/wait-for-npm.mjs 2026-09-04 20:31:16.603474103 +0000 +@@ -1,44 +1,236 @@ +-#!/usr/bin/env bun ++#!/usr/bin/env node + + /** + * Wait for a package version to become available on npm. + * +- * Issue #166 was a *false-positive* release: a git tag and GitHub release +- * existed for js-v0.10.1, but the package was never installable from npm. This +- * step closes that gap by asserting, after publish, that the exact version is +- * actually queryable on the registry (npm visibility can lag a few seconds +- * after a successful publish). If it never appears, the job fails loudly +- * instead of leaving behind a release nobody can `npm install`. +- * +- * Ported from the js pipeline template +- * (link-foundation/js-ai-driven-development-pipeline-template, +- * scripts/wait-for-npm.mjs), adapted to command-stream's `$` and bun. The pure +- * polling logic is exported so it can be unit-tested without hitting npm. +- * +- * Uses link-foundation libraries: +- * - use-m: Dynamic package loading without package.json dependencies +- * - command-stream: Modern shell command execution with streaming support +- * - lino-arguments: Unified configuration from CLI args, env vars, and .lenv files +- * +- * Usage: bun scripts/wait-for-npm.mjs --release-version [--package-name ] +- * [--max-attempts ] [--sleep-seconds ] ++ * The Docker publish job runs after npm publishing, but npm registry visibility ++ * can lag briefly. Waiting here keeps Docker tags tied to an installable npm ++ * version. + */ + +-import { appendFileSync, readFileSync } from 'node:fs'; ++import { appendFileSync } from 'node:fs'; + import path from 'node:path'; +-import process from 'node:process'; + import { fileURLToPath } from 'node:url'; + +-export const DEFAULT_MAX_ATTEMPTS = 30; +-export const DEFAULT_SLEEP_SECONDS = 10; ++import { buildPackageMetadataUrl } from './npm-registry.mjs'; ++import { formatNpmPackageVersion, readPackageInfo } from './package-info.mjs'; ++ ++const DEFAULT_MAX_ATTEMPTS = 30; ++const NPM_REGISTRY_USER_AGENT = ++ 'js-ai-driven-development-pipeline-template wait-for-npm'; ++const DEFAULT_SLEEP_SECONDS = 10; ++const USAGE = ++ 'Usage: node scripts/wait-for-npm.mjs --release-version [--package-name ] [--max-attempts ] [--sleep-seconds ] [--js-root ]'; ++ ++function parsePositiveInteger(value, optionName) { ++ const parsed = Number(value); ++ if (!Number.isInteger(parsed) || parsed < 1) { ++ throw new Error(`${optionName} must be a positive integer`); ++ } ++ return parsed; ++} ++ ++function readCliOptions(argv) { ++ const options = {}; ++ ++ for (let index = 0; index < argv.length; index++) { ++ const arg = argv[index]; ++ if (!arg.startsWith('--')) { ++ continue; ++ } ++ ++ const inlineValueIndex = arg.indexOf('='); ++ if (inlineValueIndex !== -1) { ++ options[arg.slice(2, inlineValueIndex)] = arg.slice(inlineValueIndex + 1); ++ continue; ++ } ++ ++ const value = argv[index + 1]; ++ if (value === undefined || value.startsWith('--')) { ++ throw new Error(`Missing value for ${arg}`); ++ } ++ ++ options[arg.slice(2)] = value; ++ index++; ++ } ++ ++ return options; ++} ++ ++export function parseArgs(argv, env = process.env) { ++ const cliOptions = readCliOptions(argv); ++ ++ const config = { ++ jsRoot: cliOptions['js-root'] ?? env.JS_ROOT ?? '', ++ maxAttempts: parsePositiveInteger( ++ cliOptions['max-attempts'] || ++ env.MAX_ATTEMPTS || ++ String(DEFAULT_MAX_ATTEMPTS), ++ '--max-attempts' ++ ), ++ packageName: cliOptions['package-name'] ?? env.PACKAGE_NAME ?? '', ++ releaseVersion: cliOptions['release-version'] ?? env.VERSION ?? '', ++ sleepSeconds: parsePositiveInteger( ++ cliOptions['sleep-seconds'] || ++ env.SLEEP_SECONDS || ++ String(DEFAULT_SLEEP_SECONDS), ++ '--sleep-seconds' ++ ), ++ }; ++ ++ return config; ++} ++ ++/** ++ * Build the registry URL for a single package version document. ++ * @param {string} packageName ++ * @param {string} version ++ * @param {string} [registryUrl] ++ * @returns {string} ++ */ ++export function buildPackageVersionUrl(packageName, version, registryUrl) { ++ return `${buildPackageMetadataUrl(packageName, registryUrl)}/${encodeURIComponent(version)}`; ++} + + /** +- * Append a step output (and echo for the run log). +- * @param {string} name +- * @param {string} value ++ * Normalize a check result so callers always see the same shape. ++ * A boolean from an injected `checkAvailability` is also accepted. ++ * @param {boolean|object} result ++ * @returns {{available: boolean, status: string, error?: string, url?: string, httpStatus?: number}} + */ ++export function normalizeCheckResult(result) { ++ if (typeof result === 'boolean') { ++ return { available: result, status: result ? 'ok' : 'not-published' }; ++ } ++ ++ return { ++ available: Boolean(result?.available), ++ status: result?.status ?? 'unknown', ++ ...(result?.error === undefined ? {} : { error: result.error }), ++ ...(result?.url === undefined ? {} : { url: result.url }), ++ ...(result?.httpStatus === undefined ++ ? {} ++ : { httpStatus: result.httpStatus }), ++ }; ++} ++ ++/** ++ * Describe a check result for a per-attempt log line. ++ * @param {{status: string, httpStatus?: number, error?: string}} result ++ * @returns {string} ++ */ ++export function describeCheckResult(result) { ++ const httpStatus = ++ result.httpStatus === undefined ? '' : `HTTP ${result.httpStatus}`; ++ ++ if (result.status === 'ok') { ++ return result.available ++ ? `available${httpStatus ? ` (${httpStatus})` : ''}` ++ : `version mismatch${httpStatus ? ` (${httpStatus})` : ''}`; ++ } ++ ++ if (result.status === 'not-published') { ++ return `not published yet${httpStatus ? ` (${httpStatus})` : ''}`; ++ } ++ ++ return `check failed: ${[httpStatus, result.error].filter(Boolean).join(' ')}`; ++} ++ ++/** ++ * Ask the npm registry whether a package version exists. ++ * ++ * Queries the registry over HTTP so the real status code is available: a ++ * genuine "not published" (404) is reported separately from "we could not get ++ * an answer" (5xx, rate limits, DNS, proxy errors), which says nothing about ++ * whether the publish succeeded. ++ * ++ * @param {string} packageName ++ * @param {string} version ++ * @param {object} [options] ++ * @param {Function} [options.fetchFn] ++ * @param {string} [options.registryUrl] ++ * @returns {Promise<{available: boolean, status: 'ok'|'not-published'|'unknown', httpStatus?: number, url: string, error?: string}>} ++ */ ++export async function checkNpmVersion( ++ packageName, ++ version, ++ { fetchFn = fetch, registryUrl } = {} ++) { ++ let url; ++ try { ++ url = buildPackageVersionUrl(packageName, version, registryUrl); ++ } catch (error) { ++ return { available: false, status: 'unknown', error: error.message }; ++ } ++ ++ try { ++ const response = await fetchFn(url, { ++ headers: { ++ accept: 'application/json', ++ // Some registries reject requests without a User-Agent with 403. ++ 'user-agent': NPM_REGISTRY_USER_AGENT, ++ }, ++ }); ++ ++ if (response.status === 404) { ++ return { ++ available: false, ++ status: 'not-published', ++ httpStatus: 404, ++ url, ++ }; ++ } ++ ++ if (!response.ok) { ++ return { ++ available: false, ++ status: 'unknown', ++ httpStatus: response.status, ++ url, ++ error: `${response.status} ${response.statusText ?? ''}`.trim(), ++ }; ++ } ++ ++ const metadata = await response.json(); ++ return { ++ available: metadata?.version === version, ++ status: 'ok', ++ httpStatus: response.status, ++ url, ++ }; ++ } catch (error) { ++ // `fetch` reports transport failures as a bare "fetch failed"; the cause ++ // holds the actual reason (ECONNREFUSED, EAI_AGAIN, certificate errors). ++ const cause = error?.cause?.message; ++ const message = error?.message ?? String(error); ++ ++ return { ++ available: false, ++ status: 'unknown', ++ url, ++ error: cause && cause !== message ? `${message}: ${cause}` : message, ++ }; ++ } ++} ++ ++function sleep(seconds) { ++ return new Promise((resolve) => ++ globalThis.setTimeout(resolve, seconds * 1000) ++ ); ++} ++ ++function readGithubOutputPath() { ++ try { ++ return process.env.GITHUB_OUTPUT || ''; ++ } catch { ++ // Runtimes with restricted environment access (Deno without --allow-env) ++ // throw here; step outputs are simply unavailable then. ++ return ''; ++ } ++} ++ + function setOutput(name, value) { +- const outputFile = process.env.GITHUB_OUTPUT; ++ const outputFile = readGithubOutputPath(); + if (outputFile) { + appendFileSync(outputFile, `${name}=${value}\n`); + } +@@ -46,38 +238,37 @@ + } + + /** +- * Poll until a specific package version is visible on npm, or attempts run out. +- * +- * The availability check and sleep are injectable so the loop can be unit-tested +- * deterministically without network access or real delays. +- * +- * @param {object} options +- * @param {string} options.packageName +- * @param {string} options.version +- * @param {(packageName: string, version: string) => (boolean | Promise)} options.checkAvailability +- * @param {number} [options.maxAttempts] +- * @param {number} [options.sleepSeconds] +- * @param {(seconds: number) => Promise} [options.sleepFn] +- * @param {(message: string) => void} [options.stdout] +- * @returns {Promise} ++ * Poll the registry until the version shows up or attempts run out. ++ * @returns {Promise<{available: boolean, status: string, error?: string, url?: string, httpStatus?: number, attempts: number}>} + */ + export async function waitForNpmVersion({ +- packageName, +- version, +- checkAvailability, ++ checkAvailability = checkNpmVersion, + maxAttempts = DEFAULT_MAX_ATTEMPTS, ++ packageName, ++ registryUrl, ++ sleepFn = sleep, + sleepSeconds = DEFAULT_SLEEP_SECONDS, +- sleepFn = (seconds) => +- new Promise((resolve) => globalThis.setTimeout(resolve, seconds * 1000)), + stdout = console.log, ++ version, + }) { ++ let lastResult = { ++ available: false, ++ status: 'unknown', ++ error: 'no attempts were made', ++ }; ++ + for (let attempt = 1; attempt <= maxAttempts; attempt++) { ++ lastResult = normalizeCheckResult( ++ await checkAvailability(packageName, version, { registryUrl }) ++ ); ++ + stdout( +- `Checking npm for ${packageName}@${version} (attempt ${attempt}/${maxAttempts})` ++ `Checking npm for ${formatNpmPackageVersion(packageName, version)} ` + ++ `(attempt ${attempt}/${maxAttempts}): ${describeCheckResult(lastResult)}` + ); + +- if (await checkAvailability(packageName, version)) { +- return true; ++ if (lastResult.available) { ++ return { ...lastResult, attempts: attempt }; + } + + if (attempt < maxAttempts) { +@@ -85,7 +276,29 @@ + } + } + +- return false; ++ return { ...lastResult, attempts: maxAttempts }; ++} ++ ++/** ++ * Build the failure message for an exhausted wait. ++ * @param {string} packageSpecifier ++ * @param {{status: string, error?: string, url?: string}} result ++ * @param {number} maxAttempts ++ * @returns {string} ++ */ ++export function formatFailureMessage(packageSpecifier, result, maxAttempts) { ++ if (result.status !== 'unknown') { ++ return `${packageSpecifier} did not become available on npm`; ++ } ++ ++ const reason = result.error ? ` The last error was: ${result.error}.` : ''; ++ const where = result.url ? ` Check ${result.url} directly.` : ''; ++ ++ return ( ++ `Could not determine whether ${packageSpecifier} is on npm: ` + ++ `all ${maxAttempts} attempts failed to reach the registry.${reason} ` + ++ `This does NOT mean the publish failed.${where}` ++ ); + } + + function isCliEntryPoint() { +@@ -96,85 +309,57 @@ + ); + } + +-async function runCli() { +- // Load use-m dynamically (matches the other release scripts in this folder). +- const { use } = eval( +- await (await fetch('https://unpkg.com/use-m/use.js')).text() +- ); +- const { $ } = await use('command-stream'); +- const { makeConfig } = await use('lino-arguments'); +- +- const config = makeConfig({ +- yargs: ({ yargs, getenv }) => +- yargs +- .option('release-version', { +- type: 'string', +- default: getenv('VERSION', ''), +- describe: 'Version number to wait for (e.g., 1.0.0)', +- }) +- .option('package-name', { +- type: 'string', +- default: getenv('PACKAGE_NAME', ''), +- describe: 'npm package name (defaults to ./package.json name)', +- }) +- .option('max-attempts', { +- type: 'number', +- default: Number(getenv('MAX_ATTEMPTS', String(DEFAULT_MAX_ATTEMPTS))), +- describe: 'Maximum number of polling attempts', +- }) +- .option('sleep-seconds', { +- type: 'number', +- default: Number( +- getenv('SLEEP_SECONDS', String(DEFAULT_SLEEP_SECONDS)) +- ), +- describe: 'Seconds to wait between attempts', +- }), +- }); +- +- const version = config.releaseVersion; +- if (!version) { +- console.error('Error: Missing required --release-version'); +- return 1; +- } ++export async function main({ ++ argv = process.argv.slice(2), ++ env = process.env, ++ stderr = console.error, ++ stdout = console.log, ++} = {}) { ++ try { ++ const config = parseArgs(argv, env); ++ if (!config.releaseVersion) { ++ stderr('Error: Missing required --release-version'); ++ stderr(USAGE); ++ return 1; ++ } + +- const packageName = +- config.packageName || +- JSON.parse(readFileSync('./package.json', 'utf8')).name; +- +- // command-stream's `$` does NOT throw on non-zero exit (errexit off by +- // default β€” see issue #156); `npm view @ version` exits 0 and +- // prints the version when published, non-zero (E404) otherwise. +- const checkAvailability = async (name, ver) => { +- const result = await $`npm view "${name}@${ver}" version`.run({ +- capture: true, ++ const packageInfo = config.packageName ++ ? { name: config.packageName } ++ : readPackageInfo({ jsRoot: config.jsRoot || undefined }); ++ ++ const result = await waitForNpmVersion({ ++ maxAttempts: config.maxAttempts, ++ packageName: packageInfo.name, ++ registryUrl: ++ env.NPM_CONFIG_REGISTRY || env.npm_config_registry || undefined, ++ sleepSeconds: config.sleepSeconds, ++ stdout, ++ version: config.releaseVersion, + }); +- return result.code === 0 && result.stdout.trim() === ver; +- }; + +- const available = await waitForNpmVersion({ +- packageName, +- version, +- checkAvailability, +- maxAttempts: config.maxAttempts, +- sleepSeconds: config.sleepSeconds, +- }); ++ const packageSpecifier = formatNpmPackageVersion( ++ packageInfo.name, ++ config.releaseVersion ++ ); ++ ++ setOutput('npm_available', result.available ? 'true' : 'false'); ++ setOutput('npm_check_status', result.status); + +- setOutput('npm_available', available ? 'true' : 'false'); ++ if (!result.available) { ++ stderr( ++ formatFailureMessage(packageSpecifier, result, config.maxAttempts) ++ ); ++ return 1; ++ } + +- if (!available) { +- console.error(`${packageName}@${version} did not become available on npm`); ++ stdout(`${packageSpecifier} is available on npm`); ++ return 0; ++ } catch (error) { ++ stderr(`Error: ${error.message}`); + return 1; + } +- +- console.log(`${packageName}@${version} is available on npm`); +- return 0; + } + + if (isCliEntryPoint()) { +- try { +- process.exitCode = await runCli(); +- } catch (error) { +- console.error(`Error: ${error.message}`); +- process.exitCode = 1; +- } ++ process.exitCode = await main(); + } diff --git a/dev/log/issues/199/pulls/200/analysis/rust-scripts-diff.log b/dev/log/issues/199/pulls/200/analysis/rust-scripts-diff.log new file mode 100644 index 0000000..933d0d7 --- /dev/null +++ b/dev/log/issues/199/pulls/200/analysis/rust-scripts-diff.log @@ -0,0 +1,794 @@ +########## check-crate-size.rs ########## +--- rust/scripts/check-crate-size.rs 2026-09-04 20:28:25.904207376 +0000 ++++ /tmp/tmpl/rust-tmpl/scripts/check-crate-size.rs 2026-09-04 20:31:17.683463071 +0000 +@@ -42,6 +42,11 @@ + /// Warn once the archive grows past 80% of the limit so projects can react + /// before a release is actually blocked. + const WARN_CRATE_BYTES: u64 = MAX_CRATE_BYTES * 8 / 10; ++/// `cargo package` may contact the registry index while resolving package ++/// metadata, so retry it before treating a transient network failure as final. ++const CARGO_PACKAGE_MAX_ATTEMPTS: u8 = 3; ++#[cfg(not(test))] ++const CARGO_PACKAGE_RETRY_DELAY_SECONDS: u64 = 5; + + #[derive(Debug, PartialEq, Eq)] + enum SizeStatus { +@@ -66,6 +71,33 @@ + format!("{mib:.2} MiB ({size_bytes} bytes)") + } + ++fn run_cargo_package_with_retries( ++ mut run_package: F, ++ max_attempts: u8, ++ mut wait_before_retry: S, ++) -> std::io::Result ++where ++ F: FnMut() -> std::io::Result, ++ S: FnMut(u8), ++{ ++ let max_attempts = max_attempts.max(1); ++ ++ for attempt in 1..=max_attempts { ++ if run_package()? { ++ return Ok(true); ++ } ++ ++ if attempt < max_attempts { ++ eprintln!( ++ "::warning::cargo package failed on attempt {attempt}/{max_attempts}; retrying" ++ ); ++ wait_before_retry(attempt); ++ } ++ } ++ ++ Ok(false) ++} ++ + #[cfg(not(test))] + fn set_output(key: &str, value: &str) { + if let Ok(output_file) = env::var("GITHUB_OUTPUT") { +@@ -139,8 +171,22 @@ + cmd.current_dir(&rust_root); + } + +- let status = cmd.status().expect("Failed to execute cargo package"); +- if !status.success() { ++ let package_succeeded = match run_cargo_package_with_retries( ++ || cmd.status().map(|status| status.success()), ++ CARGO_PACKAGE_MAX_ATTEMPTS, ++ |_| { ++ std::thread::sleep(std::time::Duration::from_secs( ++ CARGO_PACKAGE_RETRY_DELAY_SECONDS, ++ )) ++ }, ++ ) { ++ Ok(success) => success, ++ Err(e) => { ++ eprintln!("::error::Failed to execute cargo package: {e}"); ++ exit(1); ++ } ++ }; ++ if !package_succeeded { + eprintln!("::error::cargo package failed; cannot determine crate archive size"); + exit(1); + } +@@ -233,6 +279,44 @@ + } + + #[test] ++ fn cargo_package_is_retried_after_transient_failure() { ++ let mut attempts = 0; ++ let package_succeeded = run_cargo_package_with_retries( ++ || { ++ attempts += 1; ++ Ok(attempts == 2) ++ }, ++ CARGO_PACKAGE_MAX_ATTEMPTS, ++ |_| {}, ++ ) ++ .unwrap(); ++ ++ assert!(package_succeeded); ++ assert_eq!(attempts, 2); ++ } ++ ++ #[test] ++ fn cargo_package_failure_is_reported_after_all_retries() { ++ let mut attempts = 0; ++ let mut waits = 0; ++ let package_succeeded = run_cargo_package_with_retries( ++ || { ++ attempts += 1; ++ Ok(false) ++ }, ++ CARGO_PACKAGE_MAX_ATTEMPTS, ++ |_| { ++ waits += 1; ++ }, ++ ) ++ .unwrap(); ++ ++ assert!(!package_succeeded); ++ assert_eq!(attempts, usize::from(CARGO_PACKAGE_MAX_ATTEMPTS)); ++ assert_eq!(waits, usize::from(CARGO_PACKAGE_MAX_ATTEMPTS - 1)); ++ } ++ ++ #[test] + fn find_crate_archive_returns_none_when_missing() { + let nanos = std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) +########## check-file-size.rs ########## +--- rust/scripts/check-file-size.rs 2026-09-04 20:28:25.904207376 +0000 ++++ /tmp/tmpl/rust-tmpl/scripts/check-file-size.rs 2026-09-04 20:31:17.683463071 +0000 +@@ -9,6 +9,7 @@ + //! walkdir = "2" + //! ``` + ++use std::collections::BTreeSet; + use std::fs; + use std::path::Path; + #[cfg(not(test))] +@@ -153,15 +154,43 @@ + ) + } + ++/// Parses the changed-file list provided by CI (newline or space separated). ++/// ++/// Returns `None` when no list is configured, which means every warning is ++/// annotated (the behaviour used for local runs and pushes to the default ++/// branch). ++fn changed_files(raw: Option<&str>) -> Option> { ++ let raw = raw?; ++ if raw.trim().is_empty() { ++ return Some(BTreeSet::new()); ++ } ++ ++ Some( ++ raw.split(['\n', '\r', ' ', '\t']) ++ .map(str::trim) ++ .filter(|entry| !entry.is_empty()) ++ .map(|entry| entry.replace('\\', "/")) ++ .collect(), ++ ) ++} ++ ++/// Warning-band findings only produce GitHub annotations when the file was ++/// changed by the current pull request, so unchanged files stop repeating the ++/// same warning on every run. The hard limit stays repository-wide. ++fn should_annotate(finding: &Finding, changed: Option<&BTreeSet>) -> bool { ++ changed.map_or(true, |changed| changed.contains(&finding.file)) ++} ++ + #[cfg(not(test))] +-fn print_warnings(warnings: &[Finding]) { ++fn print_warnings(warnings: &[Finding], changed: Option<&BTreeSet>) { + if warnings.is_empty() { + return; + } + + for warning in warnings { +- let annotation = warning_annotation(warning); +- println!("{annotation}"); ++ if should_annotate(warning, changed) { ++ println!("{}", warning_annotation(warning)); ++ } + println!( + "WARNING: {} has {} lines (approaching limit of {MAX_LINES}, warning threshold: {WARN_LINES})", + warning.file, warning.lines +@@ -203,7 +232,9 @@ + let cwd = std::env::current_dir().expect("Failed to get current directory"); + let result = check_directory(&cwd); + +- print_warnings(&result.warnings); ++ let raw_changed = std::env::var("CHANGED_FILES").ok(); ++ let changed = changed_files(raw_changed.as_deref()); ++ print_warnings(&result.warnings, changed.as_ref()); + + if result.violations.is_empty() { + println!("All files are within the line limit\n"); +@@ -278,6 +309,74 @@ + ); + } + ++ #[test] ++ fn only_changed_files_in_the_warning_band_are_annotated() { ++ let repo = temp_dir("changed-only"); ++ let src_dir = repo.join("src"); ++ fs::create_dir_all(&src_dir).unwrap(); ++ write_rust_file_with_lines(&src_dir.join("changed.rs"), WARN_LINES + 1); ++ write_rust_file_with_lines(&src_dir.join("unchanged.rs"), WARN_LINES + 1); ++ write_rust_file_with_lines(&src_dir.join("over_limit.rs"), MAX_LINES + 1); ++ ++ let result = check_directory(&repo); ++ let changed = changed_files(Some("src/changed.rs\n")).unwrap(); ++ ++ let annotated: Vec<&str> = result ++ .warnings ++ .iter() ++ .filter(|finding| should_annotate(finding, Some(&changed))) ++ .map(|finding| finding.file.as_str()) ++ .collect(); ++ assert_eq!(annotated, vec!["src/changed.rs"]); ++ ++ // The hard limit stays repository-wide regardless of what changed. ++ assert_eq!( ++ result.violations, ++ vec![Finding { ++ file: "src/over_limit.rs".to_string(), ++ lines: MAX_LINES + 1, ++ }] ++ ); ++ // Both warning-band files remain in the baseline report. ++ assert_eq!(result.warnings.len(), 2); ++ } ++ ++ #[test] ++ fn missing_changed_file_list_annotates_every_warning() { ++ let finding = Finding { ++ file: "src/near_limit.rs".to_string(), ++ lines: WARN_LINES + 1, ++ }; ++ ++ assert_eq!(changed_files(None), None); ++ assert!(should_annotate(&finding, None)); ++ } ++ ++ #[test] ++ fn empty_changed_file_list_annotates_nothing() { ++ let finding = Finding { ++ file: "src/near_limit.rs".to_string(), ++ lines: WARN_LINES + 1, ++ }; ++ let changed = changed_files(Some(" \n")).unwrap(); ++ ++ assert!(changed.is_empty()); ++ assert!(!should_annotate(&finding, Some(&changed))); ++ } ++ ++ #[test] ++ fn changed_file_list_accepts_space_and_newline_separators() { ++ let changed = changed_files(Some("src/a.rs src/b.rs\nsrc\\c.rs\n")).unwrap(); ++ ++ assert_eq!( ++ changed, ++ ["src/a.rs", "src/b.rs", "src/c.rs"] ++ .into_iter() ++ .map(String::from) ++ .collect::>() ++ ); ++ } ++ + #[test] + fn warning_annotation_uses_github_actions_format() { + let finding = Finding { +########## check-release-needed.rs ########## +--- rust/scripts/check-release-needed.rs 2026-09-04 20:28:25.904207376 +0000 ++++ /tmp/tmpl/rust-tmpl/scripts/check-release-needed.rs 2026-09-04 20:31:17.683463071 +0000 +@@ -48,6 +48,8 @@ + + #[path = "rust-paths.rs"] + mod rust_paths; ++#[path = "release-naming.rs"] ++mod release_naming; + + fn get_arg(name: &str) -> Option { + let args: Vec = env::args().collect(); +@@ -312,7 +314,8 @@ + + if !has_fragments { + let crate_published = check_version_on_crates_io(&crate_name, ¤t_version); +- let tag_prefix = get_arg("tag-prefix").unwrap_or_else(|| "v".to_string()); ++ let tag_prefix = get_arg("tag-prefix") ++ .unwrap_or_else(|| release_naming::tag_prefix_for_rust_root(&rust_root).to_string()); + let dockerhub_image = docker_hub_image_to_check(); + let dockerhub_required = dockerhub_image.is_some(); + let dockerhub_published = dockerhub_image +########## publish-crate.rs ########## +--- rust/scripts/publish-crate.rs 2026-09-04 20:28:25.907207345 +0000 ++++ /tmp/tmpl/rust-tmpl/scripts/publish-crate.rs 2026-09-04 20:31:17.685463051 +0000 +@@ -50,6 +50,10 @@ + None + } + ++fn needs_cd(rust_root: &str) -> bool { ++ rust_root != "." ++} ++ + fn set_output(key: &str, value: &str) { + if let Ok(output_file) = env::var("GITHUB_OUTPUT") { + if let Ok(mut file) = fs::OpenOptions::new().create(true).append(true).open(&output_file) { +@@ -179,18 +183,19 @@ + println!("Using provided authentication token"); + } + +- // Build the cargo publish command. Use the manifest path so this works for +- // both a standalone crate and a crate nested under rust/. ++ // Build the cargo publish command + let mut cmd = Command::new("cargo"); +- cmd.arg("publish") +- .arg("--allow-dirty") +- .arg("--manifest-path") +- .arg(&package_manifest); ++ cmd.arg("publish").arg("--allow-dirty").arg("-p").arg(&name); + + if let Some(t) = &token { + cmd.arg("--token").arg(t); + } + ++ // For multi-language repos, change to the rust directory ++ if needs_cd(&rust_root) { ++ cmd.current_dir(&rust_root); ++ } ++ + let output = cmd.output().expect("Failed to execute cargo publish"); + + if output.status.success() { +@@ -259,7 +264,7 @@ + // A rate-limit is a deferred, automatically-recoverable outcome: exit + // successfully so the release job does not go red over a transient + // crates.io throttle. Downstream release-artifact steps are gated on a +- // successful publish (see .github/workflows/rust.yml), so a deferred ++ // successful publish (see .github/workflows/release.yml), so a deferred + // upload never produces partial Docker/GitHub release artifacts. + if kind.is_deferred() { + return; +########## wait-for-crate.rs ########## +--- rust/scripts/wait-for-crate.rs 2026-09-04 20:28:25.908207335 +0000 ++++ /tmp/tmpl/rust-tmpl/scripts/wait-for-crate.rs 2026-09-04 20:31:17.686463041 +0000 +@@ -5,6 +5,13 @@ + //! lag briefly. Waiting here makes Docker Hub tags and GitHub releases point at a + //! crate version that users can already resolve. + //! ++//! Visibility is probed against the sparse index (`https://index.crates.io`), ++//! which is what `cargo` resolves dependencies against and which is not rate ++//! limited, with the JSON API as a fallback. A probe that fails for a reason ++//! other than "this version does not exist" (403, 429, 5xx, DNS, TLS) is ++//! reported as *unknown*, never as "not published": a failed probe says nothing ++//! about whether `cargo publish` succeeded. See issue #143. ++//! + //! Usage: + //! rust-script scripts/wait-for-crate.rs --release-version + //! +@@ -32,6 +39,25 @@ + #[path = "rust-paths.rs"] + mod rust_paths; + ++/// crates.io answers 403 to clients that do not identify themselves, and asks ++/// that the contact address in the `User-Agent` be reachable. ++const USER_AGENT: &str = "rust-script-wait-for-crate (+https://github.com/link-foundation/rust-ai-driven-development-pipeline-template)"; ++ ++/// What a crates.io probe actually established. ++/// ++/// A bare `bool` cannot carry the difference between "crates.io said this ++/// version does not exist" and "crates.io did not answer", which is why a ++/// throttled probe used to be reported as a failed release. ++#[derive(Debug, Clone, PartialEq, Eq)] ++enum Visibility { ++ /// The version is resolvable by `cargo`. ++ Published, ++ /// crates.io answered, and the version is not there (yet). ++ NotPublishedYet, ++ /// crates.io could not be consulted; this says nothing about the release. ++ Unknown(String), ++} ++ + fn get_arg(name: &str) -> Option { + let args: Vec = env::args().collect(); + let flag = format!("--{}", name); +@@ -78,26 +104,152 @@ + .unwrap_or(default) + } + +-fn crate_version_exists(crate_name: &str, version: &str) -> bool { +- let url = format!("https://crates.io/api/v1/crates/{}/{}", crate_name, version); ++/// Sparse index path for a crate, following the `1/x`, `2/xy`, `3/x/xyz`, ++/// `ab/cd/name` layout documented by the registry index specification. ++fn index_path(crate_name: &str) -> String { ++ let name = crate_name.to_lowercase(); ++ let chars: Vec = name.chars().collect(); ++ ++ match chars.len() { ++ 0 => name, ++ 1 => format!("1/{}", name), ++ 2 => format!("2/{}", name), ++ 3 => format!("3/{}/{}", chars[0], name), ++ _ => format!("{}{}/{}{}/{}", chars[0], chars[1], chars[2], chars[3], name), ++ } ++} ++ ++fn index_url(crate_name: &str) -> String { ++ format!("https://index.crates.io/{}", index_path(crate_name)) ++} + +- match ureq::get(&url) +- .set("User-Agent", "rust-script-wait-for-crate") ++fn api_url(crate_name: &str, version: &str) -> String { ++ format!("https://crates.io/api/v1/crates/{}/{}", crate_name, version) ++} ++ ++/// The sparse index returns 200 for any existing crate, so the version has to be ++/// matched inside the newline-delimited JSON body rather than inferred from the ++/// status code. ++fn index_body_has_version(body: &str, version: &str) -> bool { ++ body.lines().any(|line| { ++ line.split("\"vers\"").skip(1).any(|rest| { ++ let rest = rest.trim_start(); ++ let Some(rest) = rest.strip_prefix(':') else { ++ return false; ++ }; ++ let rest = rest.trim_start(); ++ rest.strip_prefix('"') ++ .and_then(|rest| rest.split('"').next()) ++ .is_some_and(|found| found == version) ++ }) ++ }) ++} ++ ++/// Classify a sparse index response. A 404 there means the crate has never been ++/// published under that name; any other non-200 is an unusable answer. ++fn classify_index_response(status: u16, body: &str, version: &str) -> Visibility { ++ match status { ++ 200 => { ++ if index_body_has_version(body, version) { ++ Visibility::Published ++ } else { ++ Visibility::NotPublishedYet ++ } ++ } ++ 404 => Visibility::NotPublishedYet, ++ other => Visibility::Unknown(format!("index.crates.io responded HTTP {}", other)), ++ } ++} ++ ++/// Classify a JSON API response for a specific version. ++fn classify_api_status(status: u16) -> Visibility { ++ match status { ++ 200 => Visibility::Published, ++ 404 => Visibility::NotPublishedYet, ++ other => Visibility::Unknown(format!("crates.io API responded HTTP {}", other)), ++ } ++} ++ ++/// Prefer a definitive answer from either source; only report `Unknown` when ++/// neither source could be consulted. ++fn combine(index: Visibility, api: Visibility) -> Visibility { ++ match (index, api) { ++ (Visibility::Published, _) | (_, Visibility::Published) => Visibility::Published, ++ (Visibility::NotPublishedYet, _) | (_, Visibility::NotPublishedYet) => { ++ Visibility::NotPublishedYet ++ } ++ (Visibility::Unknown(index_reason), Visibility::Unknown(api_reason)) => { ++ Visibility::Unknown(format!("{}; {}", index_reason, api_reason)) ++ } ++ } ++} ++ ++/// The message printed when the wait runs out of attempts. `last_unknown` is ++/// `Some(..)` when no attempt ever got a definitive answer, which means the ++/// release status is unknown rather than broken. ++fn failure_message( ++ crate_name: &str, ++ version: &str, ++ max_attempts: u64, ++ last_unknown: Option<&str>, ++) -> String { ++ match last_unknown { ++ Some(reason) => format!( ++ "Error: could not determine whether {}@{} is on crates.io; \ ++ all {} attempts failed to get an answer, the last one with: {}. \ ++ This does NOT mean the publish failed. Check the sparse index before \ ++ treating the release as broken: curl -s -A 'ci (+https://example.com)' {} | grep '\"vers\":\"{}\"'", ++ crate_name, version, max_attempts, reason, index_url(crate_name), version ++ ), ++ None => format!( ++ "Error: {}@{} was not visible on crates.io after {} attempts", ++ crate_name, version, max_attempts ++ ), ++ } ++} ++ ++#[cfg(not(test))] ++fn check_index(crate_name: &str, version: &str) -> Visibility { ++ match ureq::get(&index_url(crate_name)) ++ .set("User-Agent", USER_AGENT) + .call() + { +- Ok(response) => response.status() == 200, +- Err(ureq::Error::Status(404, _)) => false, +- Err(e) => { +- eprintln!("Warning: Could not check crates.io: {}", e); +- false ++ Ok(response) => { ++ let status = response.status(); ++ let body = response.into_string().unwrap_or_default(); ++ classify_index_response(status, &body, version) + } ++ Err(ureq::Error::Status(status, _)) => classify_index_response(status, "", version), ++ Err(e) => Visibility::Unknown(format!("index.crates.io request failed: {}", e)), ++ } ++} ++ ++#[cfg(not(test))] ++fn check_api(crate_name: &str, version: &str) -> Visibility { ++ match ureq::get(&api_url(crate_name, version)) ++ .set("User-Agent", USER_AGENT) ++ .call() ++ { ++ Ok(response) => classify_api_status(response.status()), ++ Err(ureq::Error::Status(status, _)) => classify_api_status(status), ++ Err(e) => Visibility::Unknown(format!("crates.io API request failed: {}", e)), ++ } ++} ++ ++#[cfg(not(test))] ++fn crate_version_visibility(crate_name: &str, version: &str) -> Visibility { ++ let index = check_index(crate_name, version); ++ if index == Visibility::Published { ++ return index; + } ++ combine(index, check_api(crate_name, version)) + } + + fn should_skip_crate_wait(crate_name: &str) -> bool { + crate_name == "example-sum-package-name" + } + ++#[cfg(not(test))] + fn main() { + let rust_root = match rust_paths::get_rust_root(None, true) { + Ok(root) => root, +@@ -136,35 +288,68 @@ + return; + } + ++ let mut last_unknown: Option = None; ++ let mut saw_definitive_answer = false; ++ + for attempt in 1..=max_attempts { +- if crate_version_exists(&crate_name, &version) { +- println!( +- "{}@{} is visible on crates.io after attempt {}", +- crate_name, version, attempt +- ); +- set_output("crate_available", "true"); +- return; ++ match crate_version_visibility(&crate_name, &version) { ++ Visibility::Published => { ++ println!( ++ "{}@{} is visible on crates.io after attempt {}", ++ crate_name, version, attempt ++ ); ++ set_output("crate_available", "true"); ++ return; ++ } ++ Visibility::NotPublishedYet => { ++ saw_definitive_answer = true; ++ if attempt < max_attempts { ++ println!( ++ "{}@{} is not visible on crates.io yet (attempt {}/{}); waiting {}s", ++ crate_name, version, attempt, max_attempts, sleep_seconds ++ ); ++ } ++ } ++ Visibility::Unknown(reason) => { ++ eprintln!( ++ "Warning: could not check crates.io on attempt {}/{}: {}", ++ attempt, max_attempts, reason ++ ); ++ last_unknown = Some(reason); ++ if attempt < max_attempts { ++ println!("Retrying in {}s", sleep_seconds); ++ } ++ } + } + + if attempt < max_attempts { +- println!( +- "{}@{} is not visible on crates.io yet (attempt {}/{}); waiting {}s", +- crate_name, version, attempt, max_attempts, sleep_seconds +- ); + thread::sleep(Duration::from_secs(sleep_seconds)); + } + } + + eprintln!( +- "Error: {}@{} was not visible on crates.io after {} attempts", +- crate_name, version, max_attempts ++ "{}", ++ failure_message( ++ &crate_name, ++ &version, ++ max_attempts, ++ if saw_definitive_answer { ++ None ++ } else { ++ last_unknown.as_deref() ++ }, ++ ) + ); + exit(1); + } + + #[cfg(test)] + mod tests { +- use super::should_skip_crate_wait; ++ use super::{ ++ api_url, classify_api_status, classify_index_response, combine, failure_message, ++ index_body_has_version, index_path, index_url, should_skip_crate_wait, Visibility, ++ USER_AGENT, ++ }; + + #[test] + fn skips_template_default_package_name() { +@@ -175,4 +360,171 @@ + fn waits_for_real_package_names() { + assert!(!should_skip_crate_wait("real-package-name")); + } ++ ++ #[test] ++ fn index_paths_follow_the_registry_layout() { ++ assert_eq!(index_path("a"), "1/a"); ++ assert_eq!(index_path("ab"), "2/ab"); ++ assert_eq!(index_path("abc"), "3/a/abc"); ++ assert_eq!(index_path("serde"), "se/rd/serde"); ++ assert_eq!( ++ index_path("links-notation"), ++ "li/nk/links-notation", ++ "the layout used by the crate from issue #143" ++ ); ++ assert_eq!(index_path("Serde"), "se/rd/serde", "names are lowercased"); ++ } ++ ++ #[test] ++ fn index_url_points_at_the_sparse_index() { ++ assert_eq!(index_url("serde"), "https://index.crates.io/se/rd/serde"); ++ } ++ ++ #[test] ++ fn api_url_points_at_the_version_endpoint() { ++ assert_eq!( ++ api_url("serde", "1.0.228"), ++ "https://crates.io/api/v1/crates/serde/1.0.228" ++ ); ++ } ++ ++ #[test] ++ fn user_agent_carries_contact_information() { ++ assert!( ++ USER_AGENT.contains("+https://"), ++ "crates.io asks that clients be reachable" ++ ); ++ } ++ ++ #[test] ++ fn index_body_matches_the_published_version_only() { ++ let body = concat!( ++ r#"{"name":"links-notation","vers":"0.15.0","deps":[]}"#, ++ "\n", ++ r#"{"name":"links-notation","vers":"0.16.0","deps":[]}"#, ++ "\n" ++ ); ++ ++ assert!(index_body_has_version(body, "0.16.0")); ++ assert!(index_body_has_version(body, "0.15.0")); ++ assert!(!index_body_has_version(body, "0.17.0")); ++ assert!( ++ !index_body_has_version(body, "0.16"), ++ "a prefix of a published version is not that version" ++ ); ++ } ++ ++ #[test] ++ fn index_body_tolerates_whitespace_around_the_version_field() { ++ let body = r#"{"name":"demo", "vers" : "1.2.3" }"#; ++ assert!(index_body_has_version(body, "1.2.3")); ++ } ++ ++ /// The regression from issue #143: a throttled or forbidden probe must not ++ /// be classified as "not published". ++ #[test] ++ fn throttled_and_forbidden_probes_are_unknown_not_missing() { ++ for status in [403_u16, 429, 500, 502, 503] { ++ assert!( ++ matches!( ++ classify_index_response(status, "", "1.0.0"), ++ Visibility::Unknown(_) ++ ), ++ "index HTTP {} must not be reported as a missing version", ++ status ++ ); ++ assert!( ++ matches!(classify_api_status(status), Visibility::Unknown(_)), ++ "API HTTP {} must not be reported as a missing version", ++ status ++ ); ++ } ++ } ++ ++ #[test] ++ fn definitive_answers_are_classified_as_such() { ++ assert_eq!( ++ classify_index_response(200, r#"{"vers":"1.0.0"}"#, "1.0.0"), ++ Visibility::Published ++ ); ++ assert_eq!( ++ classify_index_response(200, r#"{"vers":"0.9.0"}"#, "1.0.0"), ++ Visibility::NotPublishedYet ++ ); ++ assert_eq!( ++ classify_index_response(404, "", "1.0.0"), ++ Visibility::NotPublishedYet ++ ); ++ assert_eq!(classify_api_status(200), Visibility::Published); ++ assert_eq!(classify_api_status(404), Visibility::NotPublishedYet); ++ } ++ ++ #[test] ++ fn a_definitive_answer_from_either_source_wins() { ++ assert_eq!( ++ combine( ++ Visibility::Unknown("index.crates.io responded HTTP 429".into()), ++ Visibility::Published ++ ), ++ Visibility::Published ++ ); ++ assert_eq!( ++ combine( ++ Visibility::NotPublishedYet, ++ Visibility::Unknown("crates.io API responded HTTP 403".into()) ++ ), ++ Visibility::NotPublishedYet ++ ); ++ } ++ ++ #[test] ++ fn unknown_is_reported_only_when_neither_source_answered() { ++ let combined = combine( ++ Visibility::Unknown("index.crates.io responded HTTP 429".into()), ++ Visibility::Unknown("crates.io API responded HTTP 403".into()), ++ ); ++ ++ let Visibility::Unknown(reason) = combined else { ++ panic!("two unusable answers must combine into Unknown"); ++ }; ++ assert!(reason.contains("429") && reason.contains("403")); ++ } ++ ++ /// The false negative from issue #143: the failure message must not claim ++ /// the release did not happen when nothing was ever established. ++ #[test] ++ fn failure_message_distinguishes_unknown_from_missing() { ++ let unknown = failure_message( ++ "links-notation", ++ "0.16.0", ++ 30, ++ Some("crates.io API responded HTTP 403"), ++ ); ++ assert!( ++ unknown.contains("could not determine"), ++ "unknown outcome must not be phrased as a missing version: {}", ++ unknown ++ ); ++ assert!( ++ unknown.contains("does NOT mean the publish failed"), ++ "the message must point the reader away from the publish step: {}", ++ unknown ++ ); ++ assert!( ++ unknown.contains("https://index.crates.io/li/nk/links-notation"), ++ "the message must show how to verify against the sparse index: {}", ++ unknown ++ ); ++ assert!( ++ !unknown.contains("was not visible on crates.io after"), ++ "unknown outcome must not reuse the missing-version wording: {}", ++ unknown ++ ); ++ ++ let missing = failure_message("links-notation", "0.16.0", 30, None); ++ assert_eq!( ++ missing, ++ "Error: links-notation@0.16.0 was not visible on crates.io after 30 attempts" ++ ); ++ } + } diff --git a/dev/log/issues/199/pulls/200/analysis/zizmor-before.log b/dev/log/issues/199/pulls/200/analysis/zizmor-before.log new file mode 100644 index 0000000..37cc1ef --- /dev/null +++ b/dev/log/issues/199/pulls/200/analysis/zizmor-before.log @@ -0,0 +1,622 @@ + INFO zizmor: 🌈 zizmor v1.30.0 + WARN audit: zizmor: zizmor is running in offline mode by default; some audits and auto-fixes will not be available. see https://docs.zizmor.sh/usage/#operating-modes for details + INFO audit: zizmor: 🌈 completed .github/workflows/js.yml + INFO audit: zizmor: 🌈 completed .github/workflows/parity.yml + INFO audit: zizmor: 🌈 completed .github/workflows/rust.yml +warning[excessive-permissions]: overly broad permissions + --> .github/workflows/js.yml:1:1 + | + 1 | / name: JavaScript checks and release + 2 | | + 3 | | on: + 4 | | push: +... | +419 | | - Description: ${{ github.event.inputs.description || 'Manual JavaScript release' }} +420 | | - Triggered by: @${{ github.actor }} + | |_________________________________________________^ default permissions used due to no permissions: block + | + = note: audit confidence β†’ Medium + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#excessive-permissions + +warning[excessive-permissions]: overly broad permissions + --> .github/workflows/js.yml:47:3 + | +47 | / changeset-check: +48 | | name: Check for JavaScript changesets +49 | | runs-on: ubuntu-latest +50 | | timeout-minutes: 10 +... | +78 | | bun scripts/validate-changeset.mjs + | | ^ + | | | + | |____________________________________________this job + | default permissions used due to no permissions: block + | + = note: audit confidence β†’ Medium + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#excessive-permissions + +warning[excessive-permissions]: overly broad permissions + --> .github/workflows/js.yml:80:3 + | + 80 | / lint: + 81 | | name: Lint and format JavaScript + 82 | | runs-on: ubuntu-latest + 83 | | timeout-minutes: 10 +... | +107 | | working-directory: js +108 | | run: bun run check:duplication + | | ^ + | | | + | |______________________________________this job + | default permissions used due to no permissions: block + | + = note: audit confidence β†’ Medium + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#excessive-permissions + +warning[excessive-permissions]: overly broad permissions + --> .github/workflows/js.yml:110:3 + | +110 | / test: +111 | | name: Test JavaScript (${{ matrix.runtime }} on ${{ matrix.os }}) +112 | | runs-on: ${{ matrix.os }} +113 | | timeout-minutes: 30 +... | +201 | | node --test js/tests/node-terminal-artifacts.mjs +202 | | node --test js/tests/node-commonjs-entry.mjs + | | ^ + | | | + | |______________________________________________________this job + | default permissions used due to no permissions: block + | + = note: audit confidence β†’ Medium + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#excessive-permissions + +error[template-injection]: code injection via template expansion + --> .github/workflows/js.yml:73:22 + | +72 | run: | + | --- this run block +73 | if [[ "${{ github.head_ref }}" == "changeset-release/"* ]]; then + | ^^^^^^^^^^^^^^^ may expand into attacker-controllable code + | + = note: audit confidence β†’ High + = note: this finding has an auto-fix + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#template-injection + +error[template-injection]: code injection via template expansion + --> .github/workflows/js.yml:345:81 + | +345 | run: bun scripts/version-and-commit.mjs --mode instant --bump-type "${{ github.event.inputs.bump_type }}" --description "${... + | --- this run block ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ may expand into attacker-controllable code + | + = note: audit confidence β†’ High + = note: this finding has an auto-fix + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#template-injection + +error[template-injection]: code injection via template expansion + --> .github/workflows/js.yml:345:134 + | +345 | ... run: bun scripts/version-and-commit.mjs --mode instant --bump-type "${{ github.event.inputs.bump_type }}" --description "${{ github.event.inputs.description }}" + | --- this run block ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ may expand into attacker-controllable code + | + = note: audit confidence β†’ High + = note: this finding has an auto-fix + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#template-injection + +error[template-injection]: code injection via template expansion + --> .github/workflows/js.yml:398:71 + | +398 | run: bun scripts/create-manual-changeset.mjs --bump-type "${{ github.event.inputs.bump_type }}" --description "${{ github.e... + | --- this run block ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ may expand into attacker-controllable code + | + = note: audit confidence β†’ High + = note: this finding has an auto-fix + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#template-injection + +error[template-injection]: code injection via template expansion + --> .github/workflows/js.yml:398:124 + | +398 | ... run: bun scripts/create-manual-changeset.mjs --bump-type "${{ github.event.inputs.bump_type }}" --description "${{ github.event.inputs.description }}" + | --- this run block ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ may expand into attacker-controllable code + | + = note: audit confidence β†’ High + = note: this finding has an auto-fix + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#template-injection + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/js.yml:53:15 + | +53 | - uses: actions/checkout@v6 + | ^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/js.yml:58:15 + | +58 | uses: oven-sh/setup-bun@v2 + | ^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/js.yml:87:15 + | +87 | - uses: actions/checkout@v6 + | ^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/js.yml:90:15 + | +90 | uses: oven-sh/setup-bun@v2 + | ^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/js.yml:132:15 + | +132 | - uses: actions/checkout@v6 + | ^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/js.yml:136:15 + | +136 | uses: oven-sh/setup-bun@v2 + | ^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/js.yml:142:15 + | +142 | uses: actions/setup-node@v6 + | ^^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/js.yml:173:15 + | +173 | uses: actions/setup-node@v6 + | ^^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/js.yml:222:15 + | +222 | - uses: actions/checkout@v6 + | ^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/js.yml:227:15 + | +227 | uses: actions/setup-node@v6 + | ^^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/js.yml:233:15 + | +233 | uses: oven-sh/setup-bun@v2 + | ^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/js.yml:319:15 + | +319 | - uses: actions/checkout@v6 + | ^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/js.yml:324:15 + | +324 | uses: actions/setup-node@v6 + | ^^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/js.yml:330:15 + | +330 | uses: oven-sh/setup-bun@v2 + | ^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/js.yml:383:15 + | +383 | - uses: actions/checkout@v6 + | ^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/js.yml:388:15 + | +388 | uses: oven-sh/setup-bun@v2 + | ^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/js.yml:405:15 + | +405 | uses: peter-evans/create-pull-request@v8 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/parity.yml:30:15 + | +30 | - uses: actions/checkout@v6 + | ^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +warning[excessive-permissions]: overly broad permissions + --> .github/workflows/rust.yml:1:1 + | + 1 | / name: Rust checks and release + 2 | | + 3 | | on: + 4 | | push: +... | +354 | | - Description: ${{ github.event.inputs.description || 'Manual Rust release' }} +355 | | - Triggered by: @${{ github.actor }} + | |_________________________________________________^ default permissions used due to no permissions: block + | + = note: audit confidence β†’ Medium + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#excessive-permissions + +warning[excessive-permissions]: overly broad permissions + --> .github/workflows/rust.yml:52:3 + | +52 | / changelog: +53 | | name: Rust changelog fragment check +54 | | runs-on: ubuntu-latest +55 | | timeout-minutes: 10 +... | +70 | | GITHUB_BASE_REF: ${{ github.base_ref }} +71 | | run: rust-script rust/scripts/check-changelog-fragment.rs + | | ^ + | | | + | |_________________________________________________________________this job + | default permissions used due to no permissions: block + | + = note: audit confidence β†’ Medium + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#excessive-permissions + +warning[excessive-permissions]: overly broad permissions + --> .github/workflows/rust.yml:73:3 + | + 73 | / lint: + 74 | | name: Lint and format Rust + 75 | | runs-on: ubuntu-latest + 76 | | timeout-minutes: 10 +... | +103 | | working-directory: rust +104 | | run: cargo clippy --all-targets --all-features + | | ^ + | | | + | |______________________________________________________this job + | default permissions used due to no permissions: block + | + = note: audit confidence β†’ Medium + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#excessive-permissions + +warning[excessive-permissions]: overly broad permissions + --> .github/workflows/rust.yml:106:3 + | +106 | / test: +107 | | name: Test Rust (${{ matrix.os }}) +108 | | runs-on: ${{ matrix.os }} +109 | | timeout-minutes: 30 +... | +138 | | working-directory: rust +139 | | run: cargo test --doc --all-features --verbose + | | ^ + | | | + | |______________________________________________________this job + | default permissions used due to no permissions: block + | + = note: audit confidence β†’ Medium + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#excessive-permissions + +warning[excessive-permissions]: overly broad permissions + --> .github/workflows/rust.yml:141:3 + | +141 | / scripts: +142 | | name: Test Rust release scripts +143 | | runs-on: ubuntu-latest +144 | | timeout-minutes: 15 +... | +181 | | done +182 | | exit $status + | | ^ + | | | + | |______________________this job + | default permissions used due to no permissions: block + | + = note: audit confidence β†’ Medium + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#excessive-permissions + +warning[excessive-permissions]: overly broad permissions + --> .github/workflows/rust.yml:184:3 + | +184 | / build: +185 | | name: Build Rust package +186 | | runs-on: ubuntu-latest +187 | | timeout-minutes: 10 +... | +212 | | working-directory: rust +213 | | run: cargo package --allow-dirty + | | ^ + | | | + | |________________________________________this job + | default permissions used due to no permissions: block + | + = note: audit confidence β†’ Medium + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#excessive-permissions + +error[template-injection]: code injection via template expansion + --> .github/workflows/rust.yml:300:78 + | +300 | run: rust-script rust/scripts/version-and-commit.rs --bump-type "${{ github.event.inputs.bump_type }}" --description "${{ g... + | --- this run block ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ may expand into attacker-controllable code + | + = note: audit confidence β†’ High + = note: this finding has an auto-fix + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#template-injection + +error[template-injection]: code injection via template expansion + --> .github/workflows/rust.yml:300:131 + | +300 | ... run: rust-script rust/scripts/version-and-commit.rs --bump-type "${{ github.event.inputs.bump_type }}" --description "${{ github.event.inputs.description }}... + | --- this run block ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ may expand into attacker-controllable code + | + = note: audit confidence β†’ High + = note: this finding has an auto-fix + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#template-injection + +error[template-injection]: code injection via template expansion + --> .github/workflows/rust.yml:337:85 + | +337 | run: rust-script rust/scripts/create-changelog-fragment.rs --bump-type "${{ github.event.inputs.bump_type }}" --description... + | --- this run block ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ may expand into attacker-controllable code + | + = note: audit confidence β†’ High + = note: this finding has an auto-fix + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#template-injection + +error[template-injection]: code injection via template expansion + --> .github/workflows/rust.yml:337:138 + | +337 | ... run: rust-script rust/scripts/create-changelog-fragment.rs --bump-type "${{ github.event.inputs.bump_type }}" --description "${{ github.event.inputs.description }}" + | --- this run block ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ may expand into attacker-controllable code + | + = note: audit confidence β†’ High + = note: this finding has an auto-fix + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#template-injection + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/rust.yml:58:15 + | +58 | - uses: actions/checkout@v6 + | ^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/rust.yml:63:15 + | +63 | uses: dtolnay/rust-toolchain@stable + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/rust.yml:80:15 + | +80 | - uses: actions/checkout@v6 + | ^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/rust.yml:83:15 + | +83 | uses: dtolnay/rust-toolchain@stable + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/rust.yml:88:15 + | +88 | uses: actions/cache@v5 + | ^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/rust.yml:117:15 + | +117 | - uses: actions/checkout@v6 + | ^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/rust.yml:120:15 + | +120 | uses: dtolnay/rust-toolchain@stable + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/rust.yml:123:15 + | +123 | uses: actions/cache@v5 + | ^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/rust.yml:148:15 + | +148 | - uses: actions/checkout@v6 + | ^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/rust.yml:151:15 + | +151 | uses: dtolnay/rust-toolchain@stable + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/rust.yml:154:15 + | +154 | uses: actions/cache@v5 + | ^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/rust.yml:191:15 + | +191 | - uses: actions/checkout@v6 + | ^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/rust.yml:194:15 + | +194 | uses: dtolnay/rust-toolchain@stable + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/rust.yml:197:15 + | +197 | uses: actions/cache@v5 + | ^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/rust.yml:233:15 + | +233 | - uses: actions/checkout@v6 + | ^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/rust.yml:238:15 + | +238 | uses: dtolnay/rust-toolchain@stable + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/rust.yml:288:15 + | +288 | - uses: actions/checkout@v6 + | ^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/rust.yml:293:15 + | +293 | uses: dtolnay/rust-toolchain@stable + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/rust.yml:326:15 + | +326 | - uses: actions/checkout@v6 + | ^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/rust.yml:331:15 + | +331 | uses: dtolnay/rust-toolchain@stable + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/rust.yml:340:15 + | +340 | uses: peter-evans/create-pull-request@v8 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +112 findings (28 ignored, 26 suppressed, 9 unsafe fixes): 0 informational, 0 low, 10 medium, 48 high diff --git a/dev/log/issues/199/pulls/200/ci-logs/README.md b/dev/log/issues/199/pulls/200/ci-logs/README.md new file mode 100644 index 0000000..d36ddd5 --- /dev/null +++ b/dev/log/issues/199/pulls/200/ci-logs/README.md @@ -0,0 +1,22 @@ +# CI run evidence for issue #199 + +Downloaded with `gh run view --log`. Full logs are committed **gzipped** +(`*.log.gz`, ~1.2 MB total instead of ~9.8 MB) following the precedent set by +`docs/case-studies/issue-166/ci-logs/`. Read one with: + +```bash +gunzip -c dev/log/issues/199/pulls/200/ci-logs/run-33914574283.log.gz | less +``` + +Per-run metadata (workflow, conclusion, per-job conclusions) is in +`../api/run-.json`. + +| Run | Workflow | Branch | Commit | Event | Created (UTC) | Conclusion | Failed jobs | +| --- | --- | --- | --- | --- | --- | --- | --- | +| [33897699209](https://github.com/link-foundation/command-stream/actions/runs/33897699209) | JavaScript checks and release | `main` | `7e2b7018` | push | 2026-09-04T16:54:18Z | failure | `Release JavaScript package` | +| [33910180248](https://github.com/link-foundation/command-stream/actions/runs/33910180248) | JavaScript checks and release | `issue-197-b748bb92cd2d` | `e6a3eef7` | pull_request | 2026-09-04T19:15:05Z | failure | `Test JavaScript (bun on macos-latest)`, `Test JavaScript (bun on ubuntu-latest)`, `Test JavaScript (bun on windows-latest)` | +| [33910180769](https://github.com/link-foundation/command-stream/actions/runs/33910180769) | Rust checks and release | `issue-197-b748bb92cd2d` | `e6a3eef7` | pull_request | 2026-09-04T19:15:06Z | failure | `Test Rust (macos-latest)`, `Test Rust (windows-latest)` | +| [33911660942](https://github.com/link-foundation/command-stream/actions/runs/33911660942) | Rust checks and release | `issue-197-b748bb92cd2d` | `f9bf3dec` | pull_request | 2026-09-04T19:32:11Z | failure | `Test Rust (macos-latest)` | +| [33911660947](https://github.com/link-foundation/command-stream/actions/runs/33911660947) | JavaScript checks and release | `issue-197-b748bb92cd2d` | `f9bf3dec` | pull_request | 2026-09-04T19:32:11Z | failure | `Test JavaScript (bun on macos-latest)` | +| [33914574263](https://github.com/link-foundation/command-stream/actions/runs/33914574263) | Rust checks and release | `main` | `000dbeab` | push | 2026-09-04T20:06:37Z | success | β€” | +| [33914574283](https://github.com/link-foundation/command-stream/actions/runs/33914574283) | JavaScript checks and release | `main` | `000dbeab` | push | 2026-09-04T20:06:37Z | failure | `Release JavaScript package` | diff --git a/dev/log/issues/199/pulls/200/ci-logs/run-33897699209.log.gz b/dev/log/issues/199/pulls/200/ci-logs/run-33897699209.log.gz new file mode 100644 index 0000000000000000000000000000000000000000..b484d7ff54b779c2184751ad5e14a5bccd99511b GIT binary patch literal 216085 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 oQ$h&{hYQxzP)$Q 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≪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 % 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≀19RAd&o_&sWF}o`crK0*nbKAU*8ApO*q&; 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 literal 0 HcmV?d00001 diff --git a/dev/log/issues/199/pulls/200/ci-logs/run-33910180769.log.gz b/dev/log/issues/199/pulls/200/ci-logs/run-33910180769.log.gz new file mode 100644 index 0000000000000000000000000000000000000000..78614b60cd0ffd10ee8b29606c525d0daee1d31d GIT binary patch literal 100019 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�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 BRd4_R literal 0 HcmV?d00001 diff --git a/dev/log/issues/199/pulls/200/ci-logs/run-33914574263.log.gz b/dev/log/issues/199/pulls/200/ci-logs/run-33914574263.log.gz new file mode 100644 index 0000000000000000000000000000000000000000..224a80d8c6ef3136256d2829c50c6e71d9b0699a GIT binary patch literal 124170 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 z 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 literal 0 HcmV?d00001 diff --git a/dev/log/issues/199/pulls/200/ci-logs/run-33914574283.log.gz b/dev/log/issues/199/pulls/200/ci-logs/run-33914574283.log.gz new file mode 100644 index 0000000000000000000000000000000000000000..e070218162f8bd317c304d1e9ab49a437e2a9bae GIT binary patch literal 224105 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

q3V)<& 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[A?`o*B`wLDAGk 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 A18bX@Ll=98FwrGH$54Wz~@S-Pq2a|fVn|4 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 Date: Fri, 4 Sep 2026 21:36:09 +0000 Subject: [PATCH 06/34] fix(ci): make the JavaScript lint and duplication gates actually check code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two of the three JavaScript quality gates were passing without inspecting anything (issue #199). check:duplication analysed zero files. jscpd's `format` option is the list of *languages* to scan, but .jscpd.json set it to the string "console" β€” a reporter name. @jscpd/finder filters files with `options.format.includes(format)`, and "console".includes("javascript") is false, so every file was skipped: 0 sources, 0 clones, exit 0, in half a millisecond. With the languages declared, jscpd reports 47 clones (4.87%) across src and scripts; threshold 6 keeps that as a ratchet so the number cannot grow while the pre-existing clones are refactored separately. eslint reported 52 warnings and exited 0, because `bun run lint` omitted the `--max-warnings 0` that lint-staged already passes. The warnings are now fatal and the tree is clean. Also: - `**/reports/**` is ignored by eslint and prettier. It is jscpd output, so running check:duplication before lint used to fail on jscpd's bundled prism.js β€” a gate that broke depending on the order the gates ran in. - The override globs in eslint.config.js are anchored with `**/`. The file had both `js/tests/**` and `tests/**` spellings of the same override, one of which could never match whichever directory eslint ran from. tests/duplication-check.test.mjs runs the real jscpd binary against a fixture containing one clone and asserts it is found, and asserts the old "console" value still skips every file. --- js/.jscpd.json | 5 +- js/.prettierignore | 1 + js/eslint.config.js | 56 ++++++------ js/package.json | 6 +- js/tests/duplication-check.test.mjs | 128 ++++++++++++++++++++++++++++ 5 files changed, 163 insertions(+), 33 deletions(-) create mode 100644 js/tests/duplication-check.test.mjs diff --git a/js/.jscpd.json b/js/.jscpd.json index 3f1351b..eaf0307 100644 --- a/js/.jscpd.json +++ b/js/.jscpd.json @@ -1,14 +1,16 @@ { - "threshold": 0, + "threshold": 6, "minTokens": 30, "minLines": 5, "skipComments": true, + "format": ["javascript"], "ignore": [ "**/node_modules/**", "**/build/**", "**/dist/**", "**/*.min.js", "**/coverage/**", + "**/reports/**", "**/.changeset/**", "**/docs/case-studies/**/data/**", "**/docs/case-studies/**/log-excerpts/**", @@ -17,7 +19,6 @@ "**/pnpm-lock.yaml", "**/yarn.lock" ], - "format": "console", "reporters": ["console", "html"], "output": "./reports/jscpd" } diff --git a/js/.prettierignore b/js/.prettierignore index a2fd810..abf80ab 100644 --- a/js/.prettierignore +++ b/js/.prettierignore @@ -1,5 +1,6 @@ node_modules coverage +reports dist *.min.js package-lock.json diff --git a/js/eslint.config.js b/js/eslint.config.js index c878573..c2973e1 100644 --- a/js/eslint.config.js +++ b/js/eslint.config.js @@ -1,3 +1,9 @@ +// ESLint runs with `js/` as the working directory (`bun run lint`), while +// lint-staged and editors may invoke it from the repository root. Flat-config +// globs resolve against the working directory, so every override below is +// anchored with `**/` and matches under either one. Anchoring the globs to one +// directory is how `js/tests/**` and `tests/**` ended up duplicated here, with +// one of the two always dead. import js from '@eslint/js'; import prettierConfig from 'eslint-config-prettier'; import prettierPlugin from 'eslint-plugin-prettier'; @@ -147,14 +153,7 @@ export default [ }, { // Test files have different requirements - files: [ - 'tests/**/*.js', - 'tests/**/*.mjs', - 'js/tests/**/*.js', - 'js/tests/**/*.mjs', - '**/*.test.js', - '**/*.test.mjs', - ], + files: ['**/tests/**/*.{js,mjs}', '**/*.test.{js,mjs}'], rules: { 'no-unused-vars': 'off', // Tests often have unused vars for demonstration or intentional non-use 'require-await': 'off', // Async functions without await are common in tests @@ -173,13 +172,9 @@ export default [ { // Example, experiment, and debug files are more lenient files: [ - 'examples/**/*.js', - 'examples/**/*.mjs', - 'js/examples/**/*.js', - 'js/examples/**/*.mjs', - 'experiments/**/*.js', - 'experiments/**/*.mjs', - 'claude-profiles.mjs', + '**/examples/**/*.{js,mjs}', + '**/experiments/**/*.{js,mjs}', + '**/claude-profiles.mjs', ], rules: { 'no-unused-vars': 'off', // Examples often have unused vars for demonstration @@ -202,7 +197,7 @@ export default [ }, { // Virtual command implementations have specific interface requirements - files: ['src/commands/**/*.mjs', 'js/src/commands/**/*.mjs'], + files: ['**/src/commands/**/*.mjs'], rules: { 'require-await': 'off', // Commands must be async to match interface even if they don't await complexity: 'off', // Commands can be complex due to argument parsing and validation @@ -228,10 +223,8 @@ export default [ // These wrapper functions are larger than typical functions but contain // method definitions themselves, not complex logic. files: [ - 'js/src/$.process-runner-execution.mjs', - 'js/src/$.process-runner-pipeline.mjs', - 'src/$.process-runner-execution.mjs', - 'src/$.process-runner-pipeline.mjs', + '**/src/$.process-runner-execution.mjs', + '**/src/$.process-runner-pipeline.mjs', ], rules: { 'max-lines-per-function': [ @@ -246,14 +239,21 @@ export default [ }, { ignores: [ - 'node_modules/**', - 'coverage/**', - 'dist/**', - '*.min.js', - '.eslintcache', - 'docs/case-studies/**/data/**', - 'docs/case-studies/**/log-excerpts/**', - 'docs/case-studies/**/templates/**', + '**/node_modules/**', + '**/coverage/**', + '**/dist/**', + // Generated by `bun run check:duplication`; running it before `bun run + // lint` used to make the lint step fail on jscpd's bundled prism.js. + '**/reports/**', + '**/*.min.js', + '**/.eslintcache', + // Build output: rustdoc ships minified JavaScript that is not ours. + '**/rust/target/**', + '**/docs/case-studies/**/data/**', + '**/docs/case-studies/**/log-excerpts/**', + '**/docs/case-studies/**/templates/**', + // Collected CI evidence, kept verbatim. + '**/dev/log/**', ], }, ]; diff --git a/js/package.json b/js/package.json index 748186a..e26797f 100644 --- a/js/package.json +++ b/js/package.json @@ -32,11 +32,11 @@ "test:sync": "cd .. && bun test js/tests/sync.test.mjs --timeout 10000", "test:builtin": "cd .. && bun test js/tests/builtin-commands.test.mjs --timeout 10000", "test:pipe": "cd .. && bun test js/tests/pipe.test.mjs --timeout 10000", - "lint": "eslint .", - "lint:fix": "eslint . --fix", + "lint": "eslint . --max-warnings 0", + "lint:fix": "eslint . --fix --max-warnings 0", "format": "prettier --write .", "format:check": "prettier --check .", - "check:duplication": "jscpd .", + "check:duplication": "jscpd src scripts", "check": "bun run lint && bun run format:check && bun run check:duplication", "build:terminal-font": "node scripts/build-terminal-font.mjs", "prepare": "cd .. && js/node_modules/.bin/husky || true", diff --git a/js/tests/duplication-check.test.mjs b/js/tests/duplication-check.test.mjs new file mode 100644 index 0000000..1ddaf67 --- /dev/null +++ b/js/tests/duplication-check.test.mjs @@ -0,0 +1,128 @@ +// Regression tests for the jscpd duplication check (issue #199). +// +// `bun run check:duplication` was a no-op that always passed. jscpd's `format` +// option is the list of *languages* to analyse, but .jscpd.json set it to the +// string "console" β€” a reporter name. The finder filters files with +// +// options.format.includes(format) // @jscpd/finder +// +// and `"console".includes("javascript")` is false, so every file was skipped: +// zero sources, zero clones, exit 0, in under a millisecond. The check reported +// success without ever looking at the code (a false negative). +// +// These tests run the real binary against a fixture that contains one obvious +// clone, so they fail if the configuration ever stops analysing JavaScript. + +import { test, expect, beforeAll, afterAll } from 'bun:test'; +import { spawnSync } from 'child_process'; +import { + mkdtempSync, + mkdirSync, + writeFileSync, + rmSync, + readFileSync, + existsSync, +} from 'fs'; +import { tmpdir } from 'os'; +import { join, dirname } from 'path'; +import { fileURLToPath } from 'url'; + +const jsDir = join(dirname(fileURLToPath(import.meta.url)), '..'); +const jscpdBin = join(jsDir, 'node_modules', '.bin', 'jscpd'); +const repoConfig = JSON.parse(readFileSync(join(jsDir, '.jscpd.json'), 'utf8')); + +// Two files sharing an identical block, comfortably above minTokens/minLines. +const DUPLICATED_BLOCK = [ + 'export function normalize(input) {', + " const trimmed = String(input ?? '').trim();", + ' if (trimmed.length === 0) {', + " return { ok: false, reason: 'empty' };", + ' }', + " const parts = trimmed.split(',').map((part) => part.trim());", + ' const unique = Array.from(new Set(parts));', + " return { ok: true, value: unique.join('|') };", + '}', +].join('\n'); + +let workDir; + +beforeAll(() => { + workDir = mkdtempSync(join(tmpdir(), 'jscpd-check-')); + mkdirSync(join(workDir, 'src')); + writeFileSync(join(workDir, 'src', 'first.mjs'), `${DUPLICATED_BLOCK}\n`); + writeFileSync(join(workDir, 'src', 'second.mjs'), `${DUPLICATED_BLOCK}\n`); +}); + +afterAll(() => { + if (workDir) { + rmSync(workDir, { recursive: true, force: true }); + } +}); + +/** + * Run jscpd over the fixture with the given `format` value and return the + * statistics it produced. `threshold` is high so the run always exits 0 and the + * assertions are about what jscpd *saw*, not about its verdict. + */ +function runJscpd(format, outputName) { + const output = join(workDir, outputName); + const configPath = join(workDir, `${outputName}.json`); + writeFileSync( + configPath, + JSON.stringify({ + minTokens: repoConfig.minTokens, + minLines: repoConfig.minLines, + threshold: 100, + format, + reporters: ['json'], + output, + }) + ); + + const result = spawnSync(jscpdBin, ['-c', configPath, 'src'], { + cwd: workDir, + encoding: 'utf8', + }); + // jscpd writes no report at all when it analysed nothing, which is itself + // the symptom of the bug; report that as zero sources rather than crashing. + const reportPath = join(output, 'jscpd-report.json'); + const total = existsSync(reportPath) + ? JSON.parse(readFileSync(reportPath, 'utf8')).statistics.total + : { sources: 0, clones: 0 }; + return { exitCode: result.status, total }; +} + +test('the repository config analyses JavaScript, not a reporter name', () => { + // The exact shape of the bug: a bare string here silently disables the check. + expect(Array.isArray(repoConfig.format)).toBe(true); + expect(repoConfig.format).toContain('javascript'); +}); + +test('the repository config detects a real clone', () => { + const { exitCode, total } = runJscpd(repoConfig.format, 'out-repo-config'); + expect(exitCode).toBe(0); + expect(total.sources).toBe(2); + expect(total.clones).toBeGreaterThan(0); +}); + +test('the old "console" format skipped every file', () => { + // Documents the false negative so nobody reintroduces it as a "fix". + const { total } = runJscpd('console', 'out-old-config'); + expect(total.sources).toBe(0); + expect(total.clones).toBe(0); +}); + +test('the duplication script points at directories that exist', () => { + const pkg = JSON.parse(readFileSync(join(jsDir, 'package.json'), 'utf8')); + const script = pkg.scripts['check:duplication']; + expect(script.startsWith('jscpd ')).toBe(true); + + // A path typo would make jscpd scan nothing and pass, exactly like the + // format bug did, so the targets are checked against the working tree. + const targets = script.split(/\s+/).slice(1); + expect(targets).toContain('src'); + expect(targets).toContain('scripts'); + for (const target of targets) { + expect(existsSync(join(jsDir, target))).toBe(true); + } +}); From a0d9fd56556c251ce52cc95d9f23414132fdfcc8 Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 4 Sep 2026 21:41:10 +0000 Subject: [PATCH 07/34] fix(ci): lint and format the whole repository, not just js/ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit eslint and prettier were configured inside js/, and both tools treat the directory holding their configuration as the root of the project. Repository-root JavaScript was therefore unreachable: pointing eslint at it answered "the file is ignored because it is located outside of the base path". claude-profiles.mjs and the 20 experiments/ reproductions β€” including the one added for this issue β€” had never been checked, and CI reported green over them (issue #199). The same split made parts of the configuration dead. js/.prettierignore listed docs/case-studies/**/data|log-excerpts|templates, but from js/ those patterns name js/docs/case-studies, which does not exist, so the vendored upstream template copies were never actually protected from reformatting. Move eslint.config.js (as a re-export), .prettierrc and .prettierignore to the repository root and run both tools from there. The 87 problems this uncovered are all formatting and were fixed with --fix/--write; `git diff -w` over experiments/ shows no semantic change. .prettierignore now genuinely covers the archived investigation records (docs/case-studies, dev/log) and generated files (rust/target, the CHANGELOGs). Case studies are excluded rather than reformatted because prettier re-parses the nested backticks quoted in issue-166/upstream-issue.md and destroys the list. lint-staged moves to a root .lintstagedrc.json for the same reason: it only looks at files under its working directory, so `cd js && lint-staged` skipped every root-level file. --- .husky/pre-commit | 6 +- .lintstagedrc.json | 11 +++ .prettierignore | 21 +++++ js/.prettierrc => .prettierrc | 0 eslint.config.js | 10 +++ experiments/cd-edge.mjs | 9 +- experiments/cd-sh-comparison.mjs | 29 +++++-- experiments/env-expand.mjs | 6 +- experiments/env2.mjs | 10 ++- .../issue-199-publish-false-positive.mjs | 42 ++++----- experiments/issue-49/escape-handling.mjs | 4 +- experiments/issue-49/printf-check.mjs | 2 +- experiments/issue-49/repro.mjs | 8 +- experiments/issue-49/sh-parity.mjs | 85 ++++++++++--------- experiments/repro-issue-170-awaited.mjs | 7 +- experiments/repro-issue-170-parentclose.mjs | 12 +-- js/.prettierignore | 11 --- js/package.json | 19 +---- rust/changelog.d/README.md | 11 +++ 19 files changed, 189 insertions(+), 114 deletions(-) create mode 100644 .lintstagedrc.json create mode 100644 .prettierignore rename js/.prettierrc => .prettierrc (100%) create mode 100644 eslint.config.js delete mode 100644 js/.prettierignore diff --git a/.husky/pre-commit b/.husky/pre-commit index 28dc8b3..bff058c 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1 +1,5 @@ -cd js && npx lint-staged +# Run from the repository root so staged files outside js/ (experiments/, +# claude-profiles.mjs) go through the same gates as CI. lint-staged only +# considers files under its working directory, so the previous `cd js` made the +# hook silently skip every root-level file. +js/node_modules/.bin/lint-staged diff --git a/.lintstagedrc.json b/.lintstagedrc.json new file mode 100644 index 0000000..fae73d1 --- /dev/null +++ b/.lintstagedrc.json @@ -0,0 +1,11 @@ +{ + "*.{js,mjs,cjs}": [ + "js/node_modules/.bin/eslint --fix --max-warnings 0 --no-warn-ignored", + "js/node_modules/.bin/prettier --write --ignore-unknown", + "js/node_modules/.bin/prettier --check --ignore-unknown" + ], + "*.md": [ + "js/node_modules/.bin/prettier --write --ignore-unknown", + "js/node_modules/.bin/prettier --check --ignore-unknown" + ] +} diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..abdefba --- /dev/null +++ b/.prettierignore @@ -0,0 +1,21 @@ +node_modules +coverage +reports +dist +*.min.js +package-lock.json +.eslintcache +CLAUDE.md +# Build output. +rust/target +# Generated by changesets / the Rust changelog tooling. +js/CHANGELOG.md +rust/CHANGELOG.md +# Collected investigation evidence, kept byte-for-byte as downloaded. +dev/log +# Archived investigation records: downloaded logs, verbatim copies of upstream +# template files, and the write-ups quoting them. Kept byte-for-byte so diffs +# against the templates stay meaningful, and so reformatting never rewrites +# quoted evidence (prettier re-parses the ambiguous nested backticks in +# issue-166/upstream-issue.md and destroys the list it is quoting). +docs/case-studies diff --git a/js/.prettierrc b/.prettierrc similarity index 100% rename from js/.prettierrc rename to .prettierrc diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..0e9d2eb --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,10 @@ +// ESLint resolves its configuration by walking up from the working directory, +// and treats the directory holding that file as the root of the linted project. +// Keeping the file here is what puts repository-root JavaScript β€” the +// experiments/ reproductions and claude-profiles.mjs β€” inside the lint scope; +// while the configuration lived in js/, those files could not be linted at all +// ("the file is ignored because it is located outside of the base path"). +// +// The rules themselves stay next to the code and the node_modules they import +// from, so this file only re-exports them. +export { default } from './js/eslint.config.js'; diff --git a/experiments/cd-edge.mjs b/experiments/cd-edge.mjs index 51fa7cb..22888a1 100644 --- a/experiments/cd-edge.mjs +++ b/experiments/cd-edge.mjs @@ -1,6 +1,13 @@ import { $ } from '../js/src/$.mjs'; process.chdir('/tmp'); -async function t(cmd){ try{const r=await $`${{raw:cmd}}`; return `code=${r.code} out=${JSON.stringify((r.stdout||'').toString().trim())} err=${JSON.stringify((r.stderr||'').toString().trim())}`;}catch(e){return 'THROW '+e.message;}} +async function t(cmd) { + try { + const r = await $`${{ raw: cmd }}`; + return `code=${r.code} out=${JSON.stringify((r.stdout || '').toString().trim())} err=${JSON.stringify((r.stderr || '').toString().trim())}`; + } catch (e) { + return 'THROW ' + e.message; + } +} console.log('cd ~ ->', await t('cd ~'), 'cwd:', process.cwd()); process.chdir('/tmp'); console.log('cd ->', await t('cd'), 'cwd:', process.cwd()); diff --git a/experiments/cd-sh-comparison.mjs b/experiments/cd-sh-comparison.mjs index 64f3a30..3027669 100644 --- a/experiments/cd-sh-comparison.mjs +++ b/experiments/cd-sh-comparison.mjs @@ -10,13 +10,27 @@ try { await $`cd sub`; console.log('after cd sub, cwd=', process.cwd()); const r = await $`cd -`; - console.log('cd - stdout:', JSON.stringify(r.stdout), 'code:', r.code, 'cwd now:', process.cwd()); -} catch(e) { console.log('cd - error:', e.message); } + console.log( + 'cd - stdout:', + JSON.stringify(r.stdout), + 'code:', + r.code, + 'cwd now:', + process.cwd() + ); +} catch (e) { + console.log('cd - error:', e.message); +} console.log('=== Test 2: $PWD env var ==='); process.chdir(tmp); const pwdEnv = await $`echo $PWD`; -console.log('echo $PWD ->', JSON.stringify(pwdEnv.stdout), ' actual process.cwd:', process.cwd()); +console.log( + 'echo $PWD ->', + JSON.stringify(pwdEnv.stdout), + ' actual process.cwd:', + process.cwd() +); console.log('=== Test 3: subshell isolation (cd x); pwd ==='); process.chdir(tmp); @@ -25,7 +39,12 @@ console.log('subshell stdout:', JSON.stringify(sub.stdout)); console.log('process.cwd after subshell:', process.cwd()); console.log('=== Test 4: cwd option with cd ==='); -const r4 = await $({cwd: tmp})`cd sub && pwd`; -console.log('cwd-option cd sub && pwd ->', JSON.stringify(r4.stdout), 'code', r4.code); +const r4 = await $({ cwd: tmp })`cd sub && pwd`; +console.log( + 'cwd-option cd sub && pwd ->', + JSON.stringify(r4.stdout), + 'code', + r4.code +); process.chdir('/tmp'); diff --git a/experiments/env-expand.mjs b/experiments/env-expand.mjs index acc3cf7..a3d3dd4 100644 --- a/experiments/env-expand.mjs +++ b/experiments/env-expand.mjs @@ -1,6 +1,8 @@ import { $ } from '../js/src/$.mjs'; process.chdir('/tmp'); for (const cmd of ['echo $HOME', 'echo $PWD', 'echo $OLDPWD', 'echo ~']) { - const r = await $`${{raw: cmd}}`.catch(e=>({stdout:'ERR '+e.message})); - console.log(cmd, '->', JSON.stringify((r.stdout||'').toString().trim())); + const r = await $`${{ raw: cmd }}`.catch((e) => ({ + stdout: 'ERR ' + e.message, + })); + console.log(cmd, '->', JSON.stringify((r.stdout || '').toString().trim())); } diff --git a/experiments/env2.mjs b/experiments/env2.mjs index ce4ba0c..889dd91 100644 --- a/experiments/env2.mjs +++ b/experiments/env2.mjs @@ -1,8 +1,14 @@ import { $ } from '../js/src/$.mjs'; process.chdir('/tmp'); let r = await $`echo $HOME`; -console.log('virtual echo $HOME ->', JSON.stringify(r.stdout.toString().trim())); +console.log( + 'virtual echo $HOME ->', + JSON.stringify(r.stdout.toString().trim()) +); r = await $`/bin/echo $HOME`; console.log('/bin/echo $HOME ->', JSON.stringify(r.stdout.toString().trim())); r = await $`/bin/echo hi && /bin/echo $HOME`; -console.log('chained /bin/echo $HOME ->', JSON.stringify(r.stdout.toString().trim())); +console.log( + 'chained /bin/echo $HOME ->', + JSON.stringify(r.stdout.toString().trim()) +); diff --git a/experiments/issue-199-publish-false-positive.mjs b/experiments/issue-199-publish-false-positive.mjs index d76e9c1..8e887be 100644 --- a/experiments/issue-199-publish-false-positive.mjs +++ b/experiments/issue-199-publish-false-positive.mjs @@ -18,23 +18,23 @@ * observable; the NEW strategy is imported from the real module. */ -import { publishWithRetry } from "../js/scripts/publish-retry.mjs"; +import { publishWithRetry } from '../js/scripts/publish-retry.mjs'; const E409_STAGED_OUTPUT = [ - "npm error code E409", + 'npm error code E409', 'npm error 409 Conflict - PUT https://registry.npmjs.org/command-stream - Cannot publish over previously staged version "0.20.1"', -].join("\n"); +].join('\n'); const FAILURE_PATTERNS = [ - "packages failed to publish", - "error occurred while publishing", - "npm error code e", - "npm error 404", - "npm error 401", - "npm error 403", - "access token expired", - "eneedauth", - "exited with code 1", + 'packages failed to publish', + 'error occurred while publishing', + 'npm error code e', + 'npm error 404', + 'npm error 401', + 'npm error 403', + 'access token expired', + 'eneedauth', + 'exited with code 1', ]; /** @@ -69,7 +69,7 @@ function makePublisher() { if (calls === 1) { return { code: 0, - output: "πŸ¦‹ success packages published successfully", + output: 'πŸ¦‹ success packages published successfully', }; } return { code: 1, output: E409_STAGED_OUTPUT }; @@ -85,7 +85,7 @@ async function oldStrategy({ publisher, registry, maxRetries = 3 }) { const matched = FAILURE_PATTERNS.find((p) => lower.includes(p)); if (matched) { console.log( - ` attempt ${attempt}: failed β€” detected "${matched}" in output`, + ` attempt ${attempt}: failed β€” detected "${matched}" in output` ); continue; } @@ -98,7 +98,7 @@ async function oldStrategy({ publisher, registry, maxRetries = 3 }) { return { success: true, attempts: attempt }; } console.log( - ` attempt ${attempt}: verification missed, republishing (this is the bug)`, + ` attempt ${attempt}: verification missed, republishing (this is the bug)` ); } return { success: false, attempts: maxRetries }; @@ -128,30 +128,30 @@ async function newStrategy({ publisher, registry }) { // sample misses, exactly as in the failing CI run. const VISIBLE_FROM_READ = 2; -console.log("OLD strategy (single-shot verification, republish on a miss):"); +console.log('OLD strategy (single-shot verification, republish on a miss):'); const oldPublisher = makePublisher(); const oldResult = await oldStrategy({ publisher: oldPublisher, registry: makeLaggingRegistry(VISIBLE_FROM_READ), }); console.log( - ` => success=${oldResult.success}, publish invocations=${oldPublisher.calls}\n`, + ` => success=${oldResult.success}, publish invocations=${oldPublisher.calls}\n` ); -console.log("NEW strategy (bounded verification polling, no republish):"); +console.log('NEW strategy (bounded verification polling, no republish):'); const newPublisher = makePublisher(); const newResult = await newStrategy({ publisher: newPublisher, registry: makeLaggingRegistry(VISIBLE_FROM_READ), }); console.log( - ` => success=${newResult.success}, publish invocations=${newPublisher.calls}\n`, + ` => success=${newResult.success}, publish invocations=${newPublisher.calls}\n` ); const reproduced = oldResult.success === false && newResult.success === true; console.log( reproduced - ? "βœ… Reproduced: the old strategy fails a successful release, the new one does not." - : "❌ Not reproduced.", + ? 'βœ… Reproduced: the old strategy fails a successful release, the new one does not.' + : '❌ Not reproduced.' ); process.exit(reproduced ? 0 : 1); diff --git a/experiments/issue-49/escape-handling.mjs b/experiments/issue-49/escape-handling.mjs index f88b581..be8ccc2 100644 --- a/experiments/issue-49/escape-handling.mjs +++ b/experiments/issue-49/escape-handling.mjs @@ -1,6 +1,6 @@ -import { $ } from "../../js/src/$.mjs"; +import { $ } from '../../js/src/$.mjs'; const v = 'price is $5 and "q" and `tick` and back\\slash'; -for (const cmd of ["echo", "/bin/echo", 'printf "%s\\n"']) { +for (const cmd of ['echo', '/bin/echo', 'printf "%s\\n"']) { const strings = Object.assign([`${cmd} "`, '"'], { raw: [`${cmd} "`, '"'] }); const r = await $(strings, v).run({ capture: true, mirror: false }); console.log(cmd.padEnd(16), JSON.stringify(r.stdout)); diff --git a/experiments/issue-49/printf-check.mjs b/experiments/issue-49/printf-check.mjs index ef9df3d..bc24a63 100644 --- a/experiments/issue-49/printf-check.mjs +++ b/experiments/issue-49/printf-check.mjs @@ -1,4 +1,4 @@ -import { $ } from "../../js/src/$.mjs"; +import { $ } from '../../js/src/$.mjs'; const v = 'price is $5 and "q"'; const strings = Object.assign(['printf "%s\\n" "', '"'], { raw: ['printf "%s\\n" "', '"'], diff --git a/experiments/issue-49/repro.mjs b/experiments/issue-49/repro.mjs index bc95be2..baf2e2f 100644 --- a/experiments/issue-49/repro.mjs +++ b/experiments/issue-49/repro.mjs @@ -1,7 +1,7 @@ -import { $ } from "../../js/src/$.mjs"; +import { $ } from '../../js/src/$.mjs'; const cmd = 'for file in a.js b.js; do echo "Processing: $file"; done'; const r = await $`bash -c "${cmd}"`.run({ capture: true, mirror: false }); -console.log("exit:", r.code); -console.log("stdout:", JSON.stringify(r.stdout)); -console.log("stderr:", JSON.stringify(r.stderr)); +console.log('exit:', r.code); +console.log('stdout:', JSON.stringify(r.stdout)); +console.log('stderr:', JSON.stringify(r.stderr)); diff --git a/experiments/issue-49/sh-parity.mjs b/experiments/issue-49/sh-parity.mjs index 1d68c92..674d63f 100644 --- a/experiments/issue-49/sh-parity.mjs +++ b/experiments/issue-49/sh-parity.mjs @@ -3,134 +3,137 @@ // $V in the same position. The reference is a real shell: the value is passed // through the environment (so it is never re-parsed) and the same script text // is run by sh. -import { spawnSync } from "node:child_process"; -import { $ } from "../../js/src/$.mjs"; +import { spawnSync } from 'node:child_process'; +import { $ } from '../../js/src/$.mjs'; // Each case: sh script text using $V, plus the value of V. const cases = [ { - name: "bash -c double quotes (issue #49)", + name: 'bash -c double quotes (issue #49)', sh: 'bash -c "$V"', value: 'for f in a.js b.js; do echo "Processing: $f"; done', }, - { name: "echo double quotes", sh: 'echo "$V"', value: "hello world" }, + { name: 'echo double quotes', sh: 'echo "$V"', value: 'hello world' }, { - name: "echo double quotes with $", + name: 'echo double quotes with $', sh: 'echo "$V"', - value: "price is $5 and $USER", + value: 'price is $5 and $USER', }, { - name: "echo double quotes with backticks", + name: 'echo double quotes with backticks', sh: 'echo "$V"', - value: "a `date` b", + value: 'a `date` b', }, { - name: "echo double quotes with quotes", + name: 'echo double quotes with quotes', sh: 'echo "$V"', value: 'she said "hi" and it\'s fine', }, { - name: "echo double quotes with backslash", + name: 'echo double quotes with backslash', sh: 'echo "$V"', - value: "a\\b\\\\c", + value: 'a\\b\\\\c', }, // Inside '...' a real shell would not expand anything; command-stream splices // the value in as literal text, so the expected output is the value itself. { - name: "echo single quotes", + name: 'echo single quotes', sh: "echo '$V'", value: "literal $V and it's fine", expect: "literal $V and it's fine\n", }, - { name: "echo unquoted", sh: "echo $V", value: "hello world" }, + { name: 'echo unquoted', sh: 'echo $V', value: 'hello world' }, { - name: "sh -c nested quoting", + name: 'sh -c nested quoting', sh: 'sh -c "$V"', value: `echo 'single' && echo "double"`, }, { - name: "double quotes with newline", + name: 'double quotes with newline', sh: 'echo "$V"', - value: "line1\nline2", + value: 'line1\nline2', }, - { name: "double quotes with glob", sh: 'echo "$V"', value: "*.js" }, + { name: 'double quotes with glob', sh: 'echo "$V"', value: '*.js' }, { - name: "double quotes with semicolons", + name: 'double quotes with semicolons', sh: 'echo "$V"', - value: "a; echo pwned; b", + value: 'a; echo pwned; b', }, { - name: "double quotes command substitution text", + name: 'double quotes command substitution text', sh: 'echo "$V"', - value: "$(echo injected)", + value: '$(echo injected)', }, { - name: "bash -c with here-doc", + name: 'bash -c with here-doc', sh: 'bash -c "$V"', - value: "cat < - spawnSync("/bin/sh", ["-c", script], { + spawnSync('/bin/sh', ['-c', script], { env: { ...process.env, V: value }, - encoding: "utf8", + encoding: 'utf8', }); let failures = 0; for (const c of cases) { - const parts = c.sh.split("$V"); - if (parts.length !== 2) + const parts = c.sh.split('$V'); + if (parts.length !== 2) { throw new Error(`case ${c.name} must contain exactly one $V`); + } const strings = Object.assign([parts[0], parts[1]], { raw: [parts[0], parts[1]], }); const ref = c.expect === undefined ? runShell(c.sh, c.value) - : { stdout: c.expect, status: 0, stderr: "" }; + : { stdout: c.expect, status: 0, stderr: '' }; const got = await $(strings, c.value).run({ capture: true, mirror: false }); const ok = got.stdout === ref.stdout && got.code === ref.status; - if (!ok) failures++; - console.log(`${ok ? "PASS" : "FAIL"} ${c.name}`); + if (!ok) { + failures++; + } + console.log(`${ok ? 'PASS' : 'FAIL'} ${c.name}`); if (!ok) { console.log( - ` sh : code=${ref.status} stdout=${JSON.stringify(ref.stdout)} stderr=${JSON.stringify(ref.stderr)}`, + ` sh : code=${ref.status} stdout=${JSON.stringify(ref.stdout)} stderr=${JSON.stringify(ref.stderr)}` ); console.log( - ` cs : code=${got.code} stdout=${JSON.stringify(got.stdout)} stderr=${JSON.stringify(got.stderr)}`, + ` cs : code=${got.code} stdout=${JSON.stringify(got.stdout)} stderr=${JSON.stringify(got.stderr)}` ); } } diff --git a/experiments/repro-issue-170-awaited.mjs b/experiments/repro-issue-170-awaited.mjs index bae5347..78aa7b4 100644 --- a/experiments/repro-issue-170-awaited.mjs +++ b/experiments/repro-issue-170-awaited.mjs @@ -19,7 +19,8 @@ async function run() { let code, stderr, threw; try { - const result = await $`sh -c "echo stdout-marker; echo stderr-marker >&2; sleep 0.3; exit 5"`; + const result = + await $`sh -c "echo stdout-marker; echo stderr-marker >&2; sleep 0.3; exit 5"`; code = result.code; stderr = result.stderr; } catch (error) { @@ -28,7 +29,9 @@ async function run() { stderr = error.stderr; } - console.error(`RESULT threw=${threw} code=${code} stderr=${JSON.stringify(stderr)}`); + console.error( + `RESULT threw=${threw} code=${code} stderr=${JSON.stringify(stderr)}` + ); if (code === 5) { console.error('PASS: real exit code 5 preserved'); process.exit(0); diff --git a/experiments/repro-issue-170-parentclose.mjs b/experiments/repro-issue-170-parentclose.mjs index 9beed35..083ea46 100644 --- a/experiments/repro-issue-170-parentclose.mjs +++ b/experiments/repro-issue-170-parentclose.mjs @@ -6,14 +6,14 @@ // monitorParentStreams' listener -> _handleParentStreamClosure() on every active // runner, which aborts/kills the live command. If that replaces the real exit // code (5) with a synthetic SIGTERM (143), the errexit error is wrong. -import { $, shell } from "../js/src/$.mjs"; +import { $, shell } from '../js/src/$.mjs'; shell.errexit(true); // Fire a spurious 'close' on process.stdout shortly after the command starts. setTimeout(() => { - console.error(">>> emitting spurious close on process.stdout"); - process.stdout.emit("close"); + console.error('>>> emitting spurious close on process.stdout'); + process.stdout.emit('close'); }, 60); let code, stderr, stdout, threw; @@ -31,14 +31,14 @@ try { } console.error( - `RESULT threw=${threw} code=${code} stdout=${JSON.stringify(stdout)} stderr=${JSON.stringify(stderr)}`, + `RESULT threw=${threw} code=${code} stdout=${JSON.stringify(stdout)} stderr=${JSON.stringify(stderr)}` ); if (code === 5) { - console.error("PASS: real exit code 5 preserved"); + console.error('PASS: real exit code 5 preserved'); process.exit(0); } else { console.error( - `FAIL: expected code 5, got ${code} (synthetic SIGTERM means the bug reproduced)`, + `FAIL: expected code 5, got ${code} (synthetic SIGTERM means the bug reproduced)` ); process.exit(1); } diff --git a/js/.prettierignore b/js/.prettierignore deleted file mode 100644 index abf80ab..0000000 --- a/js/.prettierignore +++ /dev/null @@ -1,11 +0,0 @@ -node_modules -coverage -reports -dist -*.min.js -package-lock.json -.eslintcache -CLAUDE.md -docs/case-studies/**/data/** -docs/case-studies/**/log-excerpts/** -docs/case-studies/**/templates/** diff --git a/js/package.json b/js/package.json index e26797f..20a2688 100644 --- a/js/package.json +++ b/js/package.json @@ -32,10 +32,10 @@ "test:sync": "cd .. && bun test js/tests/sync.test.mjs --timeout 10000", "test:builtin": "cd .. && bun test js/tests/builtin-commands.test.mjs --timeout 10000", "test:pipe": "cd .. && bun test js/tests/pipe.test.mjs --timeout 10000", - "lint": "eslint . --max-warnings 0", - "lint:fix": "eslint . --fix --max-warnings 0", - "format": "prettier --write .", - "format:check": "prettier --check .", + "lint": "cd .. && js/node_modules/.bin/eslint . --max-warnings 0", + "lint:fix": "cd .. && js/node_modules/.bin/eslint . --fix --max-warnings 0", + "format": "cd .. && js/node_modules/.bin/prettier --write .", + "format:check": "cd .. && js/node_modules/.bin/prettier --check .", "check:duplication": "jscpd src scripts", "check": "bun run lint && bun run format:check && bun run check:duplication", "build:terminal-font": "node scripts/build-terminal-font.mjs", @@ -81,17 +81,6 @@ "prettier": "^3.6.2", "subset-font": "^2.5.0" }, - "lint-staged": { - "*.{js,mjs,cjs}": [ - "eslint --fix --max-warnings 0 --no-warn-ignored", - "prettier --write", - "prettier --check" - ], - "*.md": [ - "prettier --write", - "prettier --check" - ] - }, "dependencies": { "@resvg/resvg-js": "^2.6.2", "@xterm/headless": "^6.0.0", diff --git a/rust/changelog.d/README.md b/rust/changelog.d/README.md index b3437e3..38d4a02 100644 --- a/rust/changelog.d/README.md +++ b/rust/changelog.d/README.md @@ -23,6 +23,7 @@ bump: patch --- ### Fixed + - Description of bug fix ``` @@ -44,21 +45,27 @@ bump: minor --- ### Added + - Description of new feature ### Changed + - Description of change to existing functionality ### Fixed + - Description of bug fix ### Removed + - Description of removed feature ### Deprecated + - Description of deprecated feature ### Security + - Description of security fix ``` @@ -72,6 +79,7 @@ bump: minor --- ### Added + - New async processing mode for batch operations ``` @@ -83,6 +91,7 @@ bump: patch --- ### Fixed + - Fixed memory leak in connection pool handling ``` @@ -94,9 +103,11 @@ bump: major --- ### Changed + - Renamed `process()` to `process_async()` - this is a breaking change ### Removed + - Removed deprecated `legacy_mode` option ``` From e1e3f3931e690b230115fc0b694fe2262ad25864 Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 4 Sep 2026 21:53:58 +0000 Subject: [PATCH 08/34] fix(ci): lint the workflows themselves and clear every finding Nothing in CI read .github/workflows/**, so workflow defects reached main unchallenged. Adding the two linters used by the pipeline templates surfaced four actionlint reports and 35 zizmor findings across js.yml and rust.yml. New: .github/workflows/workflows.yml runs actionlint from the Docker image that bundles shellcheck (a native binary without shellcheck silently skips every `run:` block and exits 0) plus zizmor with .github/zizmor.yml, whose pinning policy is copied from the templates. Fixed in js.yml, rust.yml and parity.yml: - template injection: `${{ github.head_ref }}` was expanded straight into a `run:` block, where a fork branch name is attacker-controlled shell code. The expansion also made shellcheck compare two literals (SC2193), so the "skip automated release PR" branch could never be taken. All ten sites now pass values through `env:`. - unpinned actions: oven-sh/setup-bun, peter-evans/create-pull-request and dtolnay/rust-toolchain are hash-pinned; actions/* stay on ref pins per policy. - excessive permissions: both workflows now default to `contents: read` and the release jobs raise their own scopes. rust.yml handed CARGO_REGISTRY_TOKEN to every job, including `cargo test` on pull requests; it is declared on the two publishing jobs instead. - SC2086: `$GITHUB_OUTPUT` was unquoted in the changeset count step. - concurrency (best practice #10): the workflow-level cancellable group could cancel a release mid-publish. Checks now use cancellable per-job `check-*` groups that include the matrix values, writers share the non-cancellable `main-writer-${{ github.repository }}-main` group. - `always()` replaced by `!cancelled()` in seven job conditions, so a cancelled prerequisite no longer lets its dependents start. - the three Node matrix entries all reported as "Test JavaScript (node on ubuntu-latest)"; the version is now part of the name. - read-only checkouts no longer persist the token in .git/config. js/tests/workflow-hygiene.test.mjs parses the workflow YAML and asserts these invariants, which neither actionlint nor zizmor checks. --- .github/workflows/js.yml | 117 +++-- .github/workflows/parity.yml | 9 +- .github/workflows/rust.yml | 121 +++-- .github/workflows/workflows.yml | 69 +++ .github/zizmor.yml | 21 + .../pulls/200/analysis/actionlint-step2.log | 13 + .../199/pulls/200/analysis/zizmor-step2.log | 416 ++++++++++++++++++ js/tests/workflow-hygiene.test.mjs | 251 +++++++++++ 8 files changed, 960 insertions(+), 57 deletions(-) create mode 100644 .github/workflows/workflows.yml create mode 100644 .github/zizmor.yml create mode 100644 dev/log/issues/199/pulls/200/analysis/actionlint-step2.log create mode 100644 dev/log/issues/199/pulls/200/analysis/zizmor-step2.log create mode 100644 js/tests/workflow-hygiene.test.mjs diff --git a/.github/workflows/js.yml b/.github/workflows/js.yml index 8f8260f..e9596f9 100644 --- a/.github/workflows/js.yml +++ b/.github/workflows/js.yml @@ -39,9 +39,15 @@ on: required: false type: string -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} +# Least-privilege default. The jobs that write (release, instant-release, +# changeset-pr) raise their own scopes. +permissions: + contents: read + +# Concurrency is declared per job, not here: a workflow-level cancellable group +# would also cancel a release that has already begun publishing to npm. Read-only +# checks use cancellable `check-*` groups, writers share one repository-wide +# non-cancellable group so a started writer always finishes. jobs: changeset-check: @@ -49,13 +55,17 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 10 if: github.event_name == 'pull_request' + concurrency: + group: check-${{ github.workflow }}-${{ github.ref }}-changeset-check + cancel-in-progress: true steps: - uses: actions/checkout@v6 with: fetch-depth: 0 + persist-credentials: false - name: Setup Bun - uses: oven-sh/setup-bun@v2 + uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 with: bun-version: latest @@ -69,8 +79,12 @@ jobs: GITHUB_BASE_REF: ${{ github.base_ref }} GITHUB_BASE_SHA: ${{ github.event.pull_request.base.sha }} GITHUB_HEAD_SHA: ${{ github.event.pull_request.head.sha }} + # Read through the environment rather than expanded into the script: + # a branch name is attacker-controlled on a fork PR, and the expanded + # form also made shellcheck compare two literals (SC2193). + HEAD_REF: ${{ github.head_ref }} run: | - if [[ "${{ github.head_ref }}" == "changeset-release/"* ]]; then + if [[ "$HEAD_REF" == changeset-release/* ]]; then echo "Skipping changeset check for automated release PR" exit 0 fi @@ -82,12 +96,19 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 10 needs: [changeset-check] - if: always() && (github.event_name == 'push' || needs.changeset-check.result == 'success') + # `!cancelled()` rather than `always()`: a cancelled changeset-check must not + # leave this job running. + if: ${{ !cancelled() && (github.event_name == 'push' || needs.changeset-check.result == 'success') }} + concurrency: + group: check-${{ github.workflow }}-${{ github.ref }}-lint + cancel-in-progress: true steps: - uses: actions/checkout@v6 + with: + persist-credentials: false - name: Setup Bun - uses: oven-sh/setup-bun@v2 + uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 with: bun-version: latest @@ -108,11 +129,19 @@ jobs: run: bun run check:duplication test: - name: Test JavaScript (${{ matrix.runtime }} on ${{ matrix.os }}) + # The Node entries differ only by version, so the version has to be part of + # the name; without it three jobs shared the name "Test JavaScript (node on + # ubuntu-latest)" and a required-check rule could not name a single one. + name: Test JavaScript (${{ matrix.runtime }}${{ matrix.node-version && format(' {0}', matrix.node-version) || '' }} on ${{ matrix.os }}) runs-on: ${{ matrix.os }} timeout-minutes: 30 needs: [changeset-check] - if: always() && (github.event_name == 'push' || needs.changeset-check.result == 'success') + if: ${{ !cancelled() && (github.event_name == 'push' || needs.changeset-check.result == 'success') }} + # The matrix values are part of the group so the entries stay parallel and + # only a superseded run of the *same* entry is cancelled. + concurrency: + group: check-${{ github.workflow }}-${{ github.ref }}-test-${{ matrix.os }}-${{ matrix.runtime }}-${{ matrix.node-version || 'default' }} + cancel-in-progress: true strategy: fail-fast: false matrix: @@ -130,10 +159,12 @@ jobs: node-version: 24 steps: - uses: actions/checkout@v6 + with: + persist-credentials: false - name: Setup Bun if: matrix.runtime == 'bun' - uses: oven-sh/setup-bun@v2 + uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 with: bun-version: latest @@ -184,7 +215,7 @@ jobs: run: | node -e " import('./js/src/\$.mjs') - .then(() => console.log('Module loads successfully in Node.js ${{ matrix.node-version }}')) + .then(() => console.log('Module loads successfully in Node.js ' + process.version)) .catch((error) => { console.error('Module failed to load:', error.message); process.exit(1); @@ -196,7 +227,7 @@ jobs: console.error('CommonJS entry did not export a callable \$'); process.exit(1); } - console.log('CommonJS entry loads successfully in Node.js ${{ matrix.node-version }}'); + console.log('CommonJS entry loads successfully in Node.js ' + process.version); " node --test js/tests/node-terminal-artifacts.mjs node --test js/tests/node-commonjs-entry.mjs @@ -207,7 +238,7 @@ jobs: # Required because lint/test depend on the pull-request-only changeset-check # job, which is skipped on push events. if: | - always() && !cancelled() && + !cancelled() && github.ref == 'refs/heads/main' && github.event_name == 'push' && needs.lint.result == 'success' && @@ -218,6 +249,12 @@ jobs: contents: write pull-requests: write id-token: write + # Shared by every job in this repository that pushes to main or publishes. + # `cancel-in-progress: false` lets a started release finish; the next writer + # waits instead of interrupting a half-published version. + concurrency: + group: main-writer-${{ github.repository }}-main + cancel-in-progress: false steps: - uses: actions/checkout@v6 with: @@ -230,7 +267,7 @@ jobs: registry-url: 'https://registry.npmjs.org' - name: Setup Bun - uses: oven-sh/setup-bun@v2 + uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 with: bun-version: latest @@ -248,8 +285,8 @@ jobs: run: | CHANGESET_COUNT=$(find .changeset -name "*.md" ! -name "README.md" | wc -l) echo "Found $CHANGESET_COUNT JavaScript changeset file(s)" - echo "has_changesets=$([[ $CHANGESET_COUNT -gt 0 ]] && echo 'true' || echo 'false')" >> $GITHUB_OUTPUT - echo "changeset_count=$CHANGESET_COUNT" >> $GITHUB_OUTPUT + echo "has_changesets=$([[ $CHANGESET_COUNT -gt 0 ]] && echo 'true' || echo 'false')" >> "$GITHUB_OUTPUT" + echo "changeset_count=$CHANGESET_COUNT" >> "$GITHUB_OUTPUT" - name: Check if release is needed id: check_release @@ -290,21 +327,28 @@ jobs: working-directory: js env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: bun scripts/create-github-release.mjs --release-version "${{ steps.publish.outputs.published_version }}" --repository "${{ github.repository }}" --tag-prefix js-v + PUBLISHED_VERSION: ${{ steps.publish.outputs.published_version }} + REPOSITORY: ${{ github.repository }} + run: bun scripts/create-github-release.mjs --release-version "$PUBLISHED_VERSION" --repository "$REPOSITORY" --tag-prefix js-v - name: Format JavaScript GitHub release notes if: steps.publish.outputs.published == 'true' working-directory: js env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: bun scripts/format-github-release.mjs --release-version "${{ steps.publish.outputs.published_version }}" --repository "${{ github.repository }}" --commit-sha "${{ github.sha }}" --tag-prefix js-v + PUBLISHED_VERSION: ${{ steps.publish.outputs.published_version }} + REPOSITORY: ${{ github.repository }} + COMMIT_SHA: ${{ github.sha }} + run: bun scripts/format-github-release.mjs --release-version "$PUBLISHED_VERSION" --repository "$REPOSITORY" --commit-sha "$COMMIT_SHA" --tag-prefix js-v - name: Verify npm availability # Guards against the #166 false positive: a release/tag must correspond # to a version that is actually installable from npm. if: steps.publish.outputs.published == 'true' working-directory: js - run: bun scripts/wait-for-npm.mjs --release-version "${{ steps.publish.outputs.published_version }}" + env: + PUBLISHED_VERSION: ${{ steps.publish.outputs.published_version }} + run: bun scripts/wait-for-npm.mjs --release-version "$PUBLISHED_VERSION" instant-release: name: Instant JavaScript release @@ -315,6 +359,9 @@ jobs: contents: write pull-requests: write id-token: write + concurrency: + group: main-writer-${{ github.repository }}-main + cancel-in-progress: false steps: - uses: actions/checkout@v6 with: @@ -327,7 +374,7 @@ jobs: registry-url: 'https://registry.npmjs.org' - name: Setup Bun - uses: oven-sh/setup-bun@v2 + uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 with: bun-version: latest @@ -342,7 +389,10 @@ jobs: - name: Version package and commit to main id: version working-directory: js - run: bun scripts/version-and-commit.mjs --mode instant --bump-type "${{ github.event.inputs.bump_type }}" --description "${{ github.event.inputs.description }}" + env: + BUMP_TYPE: ${{ github.event.inputs.bump_type }} + RELEASE_DESCRIPTION: ${{ github.event.inputs.description }} + run: bun scripts/version-and-commit.mjs --mode instant --bump-type "$BUMP_TYPE" --description "$RELEASE_DESCRIPTION" - name: Publish to npm if: steps.version.outputs.version_committed == 'true' || steps.version.outputs.already_released == 'true' @@ -355,21 +405,28 @@ jobs: working-directory: js env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: bun scripts/create-github-release.mjs --release-version "${{ steps.publish.outputs.published_version }}" --repository "${{ github.repository }}" --tag-prefix js-v + PUBLISHED_VERSION: ${{ steps.publish.outputs.published_version }} + REPOSITORY: ${{ github.repository }} + run: bun scripts/create-github-release.mjs --release-version "$PUBLISHED_VERSION" --repository "$REPOSITORY" --tag-prefix js-v - name: Format JavaScript GitHub release notes if: steps.publish.outputs.published == 'true' working-directory: js env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: bun scripts/format-github-release.mjs --release-version "${{ steps.publish.outputs.published_version }}" --repository "${{ github.repository }}" --commit-sha "${{ github.sha }}" --tag-prefix js-v + PUBLISHED_VERSION: ${{ steps.publish.outputs.published_version }} + REPOSITORY: ${{ github.repository }} + COMMIT_SHA: ${{ github.sha }} + run: bun scripts/format-github-release.mjs --release-version "$PUBLISHED_VERSION" --repository "$REPOSITORY" --commit-sha "$COMMIT_SHA" --tag-prefix js-v - name: Verify npm availability # Guards against the #166 false positive: a release/tag must correspond # to a version that is actually installable from npm. if: steps.publish.outputs.published == 'true' working-directory: js - run: bun scripts/wait-for-npm.mjs --release-version "${{ steps.publish.outputs.published_version }}" + env: + PUBLISHED_VERSION: ${{ steps.publish.outputs.published_version }} + run: bun scripts/wait-for-npm.mjs --release-version "$PUBLISHED_VERSION" changeset-pr: name: Create JavaScript changeset PR @@ -379,13 +436,16 @@ jobs: permissions: contents: write pull-requests: write + concurrency: + group: main-writer-${{ github.repository }}-main + cancel-in-progress: false steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Setup Bun - uses: oven-sh/setup-bun@v2 + uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 with: bun-version: latest @@ -395,14 +455,17 @@ jobs: - name: Create changeset file working-directory: js - run: bun scripts/create-manual-changeset.mjs --bump-type "${{ github.event.inputs.bump_type }}" --description "${{ github.event.inputs.description }}" + env: + BUMP_TYPE: ${{ github.event.inputs.bump_type }} + RELEASE_DESCRIPTION: ${{ github.event.inputs.description }} + run: bun scripts/create-manual-changeset.mjs --bump-type "$BUMP_TYPE" --description "$RELEASE_DESCRIPTION" - name: Format changeset with Prettier working-directory: js run: bunx prettier --write ".changeset/*.md" - name: Create Pull Request - uses: peter-evans/create-pull-request@v8 + uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1 with: token: ${{ secrets.GITHUB_TOKEN }} commit-message: 'chore: add changeset for manual JavaScript ${{ github.event.inputs.bump_type }} release' diff --git a/.github/workflows/parity.yml b/.github/workflows/parity.yml index 5d1a136..121cf59 100644 --- a/.github/workflows/parity.yml +++ b/.github/workflows/parity.yml @@ -12,10 +12,6 @@ on: pull_request: types: [opened, synchronize, reopened, labeled, unlabeled] -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - permissions: contents: read @@ -26,10 +22,15 @@ jobs: timeout-minutes: 10 # Skip entirely when the PR is explicitly marked as a single-language change. if: ${{ !contains(github.event.pull_request.labels.*.name, 'parity-exempt') }} + concurrency: + group: check-${{ github.workflow }}-${{ github.ref }}-parity + cancel-in-progress: true steps: - uses: actions/checkout@v6 with: fetch-depth: 0 + # Read-only job: the parity script only diffs the checked-out history. + persist-credentials: false - name: Check JavaScript/Rust source parity env: diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 21c02fb..08f01ad 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -39,9 +39,15 @@ on: required: false type: string -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} +# Least-privilege default. The jobs that write (release, instant-release, +# changelog-pr) raise their own scopes. +permissions: + contents: read + +# Concurrency is declared per job, not here: a workflow-level cancellable group +# would also cancel a release that has already begun publishing to crates.io. +# Read-only checks use cancellable `check-*` groups, writers share one +# repository-wide non-cancellable group so a started writer always finishes. env: CARGO_TERM_COLOR: always @@ -51,8 +57,9 @@ env: # denies warnings in this crate's own code. RUSTFLAGS: -Dwarnings RUSTDOCFLAGS: -Dwarnings - CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN || secrets.CARGO_TOKEN }} - CARGO_TOKEN: ${{ secrets.CARGO_TOKEN }} + # The crates.io credentials are deliberately *not* here: a workflow-level env + # hands them to every job, including the ones that only run `cargo test` on + # a pull request. They are declared on the two publishing jobs instead. jobs: changelog: @@ -60,13 +67,17 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 10 if: github.event_name == 'pull_request' + concurrency: + group: check-${{ github.workflow }}-${{ github.ref }}-changelog + cancel-in-progress: true steps: - uses: actions/checkout@v6 with: fetch-depth: 0 + persist-credentials: false - name: Setup Rust - uses: dtolnay/rust-toolchain@stable + uses: dtolnay/rust-toolchain@6bed0761d98439e5a578e2877258200ad565ba87 # stable branch @ 2026-09-03 - name: Install rust-script run: cargo install rust-script @@ -81,12 +92,19 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 10 needs: [changelog] - if: always() && (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || needs.changelog.result == 'success') + # `!cancelled()` rather than `always()`: a cancelled changelog check must not + # leave this job running. + if: ${{ !cancelled() && (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || needs.changelog.result == 'success') }} + concurrency: + group: check-${{ github.workflow }}-${{ github.ref }}-lint + cancel-in-progress: true steps: - uses: actions/checkout@v6 + with: + persist-credentials: false - name: Setup Rust - uses: dtolnay/rust-toolchain@stable + uses: dtolnay/rust-toolchain@6bed0761d98439e5a578e2877258200ad565ba87 # stable branch @ 2026-09-03 with: components: rustfmt, clippy @@ -123,16 +141,23 @@ jobs: runs-on: ${{ matrix.os }} timeout-minutes: 30 needs: [changelog] - if: always() && (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || needs.changelog.result == 'success') + if: ${{ !cancelled() && (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || needs.changelog.result == 'success') }} + # The matrix value is part of the group so the per-OS entries stay parallel + # and only a superseded run of the *same* entry is cancelled. + concurrency: + group: check-${{ github.workflow }}-${{ github.ref }}-test-${{ matrix.os }} + cancel-in-progress: true strategy: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] steps: - uses: actions/checkout@v6 + with: + persist-credentials: false - name: Setup Rust - uses: dtolnay/rust-toolchain@stable + uses: dtolnay/rust-toolchain@6bed0761d98439e5a578e2877258200ad565ba87 # stable branch @ 2026-09-03 - name: Cache cargo registry uses: actions/cache@v5 @@ -158,12 +183,17 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 15 needs: [changelog] - if: always() && (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || needs.changelog.result == 'success') + if: ${{ !cancelled() && (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || needs.changelog.result == 'success') }} + concurrency: + group: check-${{ github.workflow }}-${{ github.ref }}-scripts + cancel-in-progress: true steps: - uses: actions/checkout@v6 + with: + persist-credentials: false - name: Setup Rust - uses: dtolnay/rust-toolchain@stable + uses: dtolnay/rust-toolchain@6bed0761d98439e5a578e2877258200ad565ba87 # stable branch @ 2026-09-03 - name: Cache cargo registry uses: actions/cache@v5 @@ -201,12 +231,17 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 10 needs: [lint, test] - if: always() && !cancelled() && needs.lint.result == 'success' && needs.test.result == 'success' + if: ${{ !cancelled() && needs.lint.result == 'success' && needs.test.result == 'success' }} + concurrency: + group: check-${{ github.workflow }}-${{ github.ref }}-build + cancel-in-progress: true steps: - uses: actions/checkout@v6 + with: + persist-credentials: false - name: Setup Rust - uses: dtolnay/rust-toolchain@stable + uses: dtolnay/rust-toolchain@6bed0761d98439e5a578e2877258200ad565ba87 # stable branch @ 2026-09-03 - name: Cache cargo registry uses: actions/cache@v5 @@ -233,7 +268,7 @@ jobs: # Required because lint/test depend on the pull-request-only changelog job, # which is skipped on push events. if: | - always() && !cancelled() && + !cancelled() && github.ref == 'refs/heads/main' && github.event_name == 'push' && needs.lint.result == 'success' && @@ -244,13 +279,22 @@ jobs: timeout-minutes: 30 permissions: contents: write + # Shared by every job in this repository that pushes to main or publishes. + # `cancel-in-progress: false` lets a started release finish; the next writer + # waits instead of interrupting a half-published version. + concurrency: + group: main-writer-${{ github.repository }}-main + cancel-in-progress: false + env: + CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN || secrets.CARGO_TOKEN }} + CARGO_TOKEN: ${{ secrets.CARGO_TOKEN }} steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Setup Rust - uses: dtolnay/rust-toolchain@stable + uses: dtolnay/rust-toolchain@6bed0761d98439e5a578e2877258200ad565ba87 # stable branch @ 2026-09-03 - name: Install rust-script run: cargo install rust-script @@ -270,7 +314,9 @@ jobs: - name: Version Rust crate and commit to main if: steps.release_needed.outputs.should_release == 'true' id: version - run: rust-script rust/scripts/version-and-commit.rs --bump-type "${{ steps.bump.outputs.bump_type }}" --tag-prefix rust-v --release-label Rust + env: + BUMP_TYPE: ${{ steps.bump.outputs.bump_type }} + run: rust-script rust/scripts/version-and-commit.rs --bump-type "$BUMP_TYPE" --tag-prefix rust-v --release-label Rust - name: Read Rust release version if: steps.release_needed.outputs.should_release == 'true' @@ -286,11 +332,15 @@ jobs: if: steps.publish_crate.outputs.publish_result == 'success' || steps.publish_crate.outputs.publish_result == 'already_exists' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: rust-script rust/scripts/create-github-release.rs --release-version "${{ steps.version.outputs.new_version || steps.current_version.outputs.version }}" --repository "${{ github.repository }}" --tag-prefix rust-v --language Rust --release-label Rust + RELEASE_VERSION: ${{ steps.version.outputs.new_version || steps.current_version.outputs.version }} + REPOSITORY: ${{ github.repository }} + run: rust-script rust/scripts/create-github-release.rs --release-version "$RELEASE_VERSION" --repository "$REPOSITORY" --tag-prefix rust-v --language Rust --release-label Rust - name: Wait for crate availability if: steps.publish_crate.outputs.publish_result == 'success' - run: rust-script rust/scripts/wait-for-crate.rs --version "${{ steps.version.outputs.new_version || steps.current_version.outputs.version }}" + env: + RELEASE_VERSION: ${{ steps.version.outputs.new_version || steps.current_version.outputs.version }} + run: rust-script rust/scripts/wait-for-crate.rs --version "$RELEASE_VERSION" instant-release: name: Instant Rust release @@ -299,20 +349,29 @@ jobs: timeout-minutes: 30 permissions: contents: write + concurrency: + group: main-writer-${{ github.repository }}-main + cancel-in-progress: false + env: + CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN || secrets.CARGO_TOKEN }} + CARGO_TOKEN: ${{ secrets.CARGO_TOKEN }} steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Setup Rust - uses: dtolnay/rust-toolchain@stable + uses: dtolnay/rust-toolchain@6bed0761d98439e5a578e2877258200ad565ba87 # stable branch @ 2026-09-03 - name: Install rust-script run: cargo install rust-script - name: Version Rust crate and commit to main id: version - run: rust-script rust/scripts/version-and-commit.rs --bump-type "${{ github.event.inputs.bump_type }}" --description "${{ github.event.inputs.description }}" --tag-prefix rust-v --release-label Rust + env: + BUMP_TYPE: ${{ github.event.inputs.bump_type }} + RELEASE_DESCRIPTION: ${{ github.event.inputs.description }} + run: rust-script rust/scripts/version-and-commit.rs --bump-type "$BUMP_TYPE" --description "$RELEASE_DESCRIPTION" --tag-prefix rust-v --release-label Rust - name: Publish to crates.io if: steps.version.outputs.version_committed == 'true' @@ -323,11 +382,15 @@ jobs: if: steps.publish_crate.outputs.publish_result == 'success' || steps.publish_crate.outputs.publish_result == 'already_exists' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: rust-script rust/scripts/create-github-release.rs --release-version "${{ steps.version.outputs.new_version }}" --repository "${{ github.repository }}" --tag-prefix rust-v --language Rust --release-label Rust + RELEASE_VERSION: ${{ steps.version.outputs.new_version }} + REPOSITORY: ${{ github.repository }} + run: rust-script rust/scripts/create-github-release.rs --release-version "$RELEASE_VERSION" --repository "$REPOSITORY" --tag-prefix rust-v --language Rust --release-label Rust - name: Wait for crate availability if: steps.publish_crate.outputs.publish_result == 'success' - run: rust-script rust/scripts/wait-for-crate.rs --version "${{ steps.version.outputs.new_version }}" + env: + RELEASE_VERSION: ${{ steps.version.outputs.new_version }} + run: rust-script rust/scripts/wait-for-crate.rs --version "$RELEASE_VERSION" changelog-pr: name: Create Rust changelog PR @@ -337,22 +400,28 @@ jobs: permissions: contents: write pull-requests: write + concurrency: + group: main-writer-${{ github.repository }}-main + cancel-in-progress: false steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Setup Rust - uses: dtolnay/rust-toolchain@stable + uses: dtolnay/rust-toolchain@6bed0761d98439e5a578e2877258200ad565ba87 # stable branch @ 2026-09-03 - name: Install rust-script run: cargo install rust-script - name: Create changelog fragment - run: rust-script rust/scripts/create-changelog-fragment.rs --bump-type "${{ github.event.inputs.bump_type }}" --description "${{ github.event.inputs.description }}" + env: + BUMP_TYPE: ${{ github.event.inputs.bump_type }} + RELEASE_DESCRIPTION: ${{ github.event.inputs.description }} + run: rust-script rust/scripts/create-changelog-fragment.rs --bump-type "$BUMP_TYPE" --description "$RELEASE_DESCRIPTION" - name: Create Pull Request - uses: peter-evans/create-pull-request@v8 + uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1 with: token: ${{ secrets.GITHUB_TOKEN }} commit-message: 'chore: add changelog fragment for manual Rust ${{ github.event.inputs.bump_type }} release' diff --git a/.github/workflows/workflows.yml b/.github/workflows/workflows.yml new file mode 100644 index 0000000..63fcc9d --- /dev/null +++ b/.github/workflows/workflows.yml @@ -0,0 +1,69 @@ +name: Workflows + +# Lints the workflows themselves. Nothing else in CI reads .github/workflows/**, +# so before this existed a broken `if:` condition, an unquoted variable in a +# `run:` block or an unpinned third-party action reached main unchallenged. + +on: + push: + branches: [main] + paths: ['.github/**'] + pull_request: + paths: ['.github/**'] + workflow_dispatch: + +# Keep the workflow read-only unless a job explicitly needs an additional scope. +permissions: + contents: read + +jobs: + actionlint: + name: Actionlint + runs-on: ubuntu-latest + timeout-minutes: 10 + concurrency: + group: check-${{ github.workflow }}-${{ github.ref }}-actionlint + cancel-in-progress: true + steps: + - uses: actions/checkout@v6 + with: + persist-credentials: false + + # The Docker image bundles shellcheck and pyflakes, so this also lints + # every `run:` block. A *native* actionlint binary without shellcheck on + # PATH silently skips the shell checks and exits 0. Reproduce locally with + # the same image: + # docker run --rm -v "$PWD:/repo" -w /repo rhysd/actionlint:1.7.7 -color + - uses: docker://rhysd/actionlint:1.7.7 + with: + args: -color + + zizmor: + name: Zizmor + runs-on: ubuntu-latest + timeout-minutes: 10 + permissions: + contents: read + concurrency: + group: check-${{ github.workflow }}-${{ github.ref }}-zizmor + cancel-in-progress: true + steps: + - uses: actions/checkout@v6 + with: + persist-credentials: false + + # actionlint cannot see workflow *security* defects: unpinned third-party + # actions, checkouts that persist `GITHUB_TOKEN` in `.git/config`, or + # template injection into `run:` blocks. zizmor covers those. Reproduce + # locally with the same configuration: + # pipx run zizmor --config .github/zizmor.yml \ + # --min-confidence medium --persona regular .github/workflows + # + # Annotations instead of SARIF: code scanning is not enabled on forks, and + # the job should fail loudly either way. + - uses: zizmorcore/zizmor-action@v0.6.2 + with: + advanced-security: false + annotations: true + config: .github/zizmor.yml + min-confidence: medium diff --git a/.github/zizmor.yml b/.github/zizmor.yml new file mode 100644 index 0000000..3e7d757 --- /dev/null +++ b/.github/zizmor.yml @@ -0,0 +1,21 @@ +# zizmor configuration β€” https://docs.zizmor.sh/configuration/ +# +# Mirrors the policy used by the pipeline templates +# (link-foundation/js-ai-driven-development-pipeline-template and +# link-foundation/rust-ai-driven-development-pipeline-template) so that a +# workflow copied from either side keeps passing here. +rules: + unpinned-uses: + config: + policies: + # These publishers are trusted at tag granularity: their release tags + # are the reference this repository is meant to read at a glance. + # Everything else must be pinned to a full commit hash. + actions/*: ref-pin + github/*: ref-pin + docker/*: ref-pin + astral-sh/*: ref-pin + lycheeverse/*: ref-pin + zizmorcore/*: ref-pin + changesets/*: ref-pin + '*': hash-pin diff --git a/dev/log/issues/199/pulls/200/analysis/actionlint-step2.log b/dev/log/issues/199/pulls/200/analysis/actionlint-step2.log new file mode 100644 index 0000000..3371cd4 --- /dev/null +++ b/dev/log/issues/199/pulls/200/analysis/actionlint-step2.log @@ -0,0 +1,13 @@ +.github/workflows/js.yml:72:9: shellcheck reported issue in this script: SC2193:warning:1:32: The arguments to this comparison can never be equal. Make sure your syntax is correct [shellcheck] + | +72 |  run: | + |  ^~~~ +.github/workflows/js.yml:72:25: "github.head_ref" is potentially untrusted. avoid using it directly in inline scripts. instead, pass it through an environment variable. see https://docs.github.com/en/actions/security-for-github-actions/security-guides/security-hardening-for-github-actions for more details [expression] +.github/workflows/js.yml:248:9: shellcheck reported issue in this script: SC2086:info:3:89: Double quote to prevent globbing and word splitting [shellcheck] + | +248 |  run: | + |  ^~~~ +.github/workflows/js.yml:248:9: shellcheck reported issue in this script: SC2086:info:4:44: Double quote to prevent globbing and word splitting [shellcheck] + | +248 |  run: | + |  ^~~~ diff --git a/dev/log/issues/199/pulls/200/analysis/zizmor-step2.log b/dev/log/issues/199/pulls/200/analysis/zizmor-step2.log new file mode 100644 index 0000000..ed284d6 --- /dev/null +++ b/dev/log/issues/199/pulls/200/analysis/zizmor-step2.log @@ -0,0 +1,416 @@ + INFO zizmor: 🌈 zizmor v1.30.0 + WARN audit: zizmor: zizmor is running in offline mode by default; some audits and auto-fixes will not be available. see https://docs.zizmor.sh/usage/#operating-modes for details + INFO audit: zizmor: 🌈 completed .github/workflows/js.yml + INFO audit: zizmor: 🌈 completed .github/workflows/parity.yml + INFO audit: zizmor: 🌈 completed .github/workflows/rust.yml + INFO audit: zizmor: 🌈 completed .github/workflows/workflows.yml +warning[excessive-permissions]: overly broad permissions + --> .github/workflows/js.yml:1:1 + | + 1 | / name: JavaScript checks and release + 2 | | + 3 | | on: + 4 | | push: +... | +419 | | - Description: ${{ github.event.inputs.description || 'Manual JavaScript release' }} +420 | | - Triggered by: @${{ github.actor }} + | |_________________________________________________^ default permissions used due to no permissions: block + | + = note: audit confidence β†’ Medium + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#excessive-permissions + +warning[excessive-permissions]: overly broad permissions + --> .github/workflows/js.yml:47:3 + | +47 | / changeset-check: +48 | | name: Check for JavaScript changesets +49 | | runs-on: ubuntu-latest +50 | | timeout-minutes: 10 +... | +78 | | bun scripts/validate-changeset.mjs + | | ^ + | | | + | |____________________________________________this job + | default permissions used due to no permissions: block + | + = note: audit confidence β†’ Medium + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#excessive-permissions + +warning[excessive-permissions]: overly broad permissions + --> .github/workflows/js.yml:80:3 + | + 80 | / lint: + 81 | | name: Lint and format JavaScript + 82 | | runs-on: ubuntu-latest + 83 | | timeout-minutes: 10 +... | +107 | | working-directory: js +108 | | run: bun run check:duplication + | | ^ + | | | + | |______________________________________this job + | default permissions used due to no permissions: block + | + = note: audit confidence β†’ Medium + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#excessive-permissions + +warning[excessive-permissions]: overly broad permissions + --> .github/workflows/js.yml:110:3 + | +110 | / test: +111 | | name: Test JavaScript (${{ matrix.runtime }} on ${{ matrix.os }}) +112 | | runs-on: ${{ matrix.os }} +113 | | timeout-minutes: 30 +... | +201 | | node --test js/tests/node-terminal-artifacts.mjs +202 | | node --test js/tests/node-commonjs-entry.mjs + | | ^ + | | | + | |______________________________________________________this job + | default permissions used due to no permissions: block + | + = note: audit confidence β†’ Medium + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#excessive-permissions + +error[template-injection]: code injection via template expansion + --> .github/workflows/js.yml:73:22 + | +72 | run: | + | --- this run block +73 | if [[ "${{ github.head_ref }}" == "changeset-release/"* ]]; then + | ^^^^^^^^^^^^^^^ may expand into attacker-controllable code + | + = note: audit confidence β†’ High + = note: this finding has an auto-fix + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#template-injection + +error[template-injection]: code injection via template expansion + --> .github/workflows/js.yml:345:81 + | +345 | run: bun scripts/version-and-commit.mjs --mode instant --bump-type "${{ github.event.inputs.bump_type }}" --description "${... + | --- this run block ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ may expand into attacker-controllable code + | + = note: audit confidence β†’ High + = note: this finding has an auto-fix + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#template-injection + +error[template-injection]: code injection via template expansion + --> .github/workflows/js.yml:345:134 + | +345 | ... run: bun scripts/version-and-commit.mjs --mode instant --bump-type "${{ github.event.inputs.bump_type }}" --description "${{ github.event.inputs.description }}" + | --- this run block ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ may expand into attacker-controllable code + | + = note: audit confidence β†’ High + = note: this finding has an auto-fix + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#template-injection + +error[template-injection]: code injection via template expansion + --> .github/workflows/js.yml:398:71 + | +398 | run: bun scripts/create-manual-changeset.mjs --bump-type "${{ github.event.inputs.bump_type }}" --description "${{ github.e... + | --- this run block ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ may expand into attacker-controllable code + | + = note: audit confidence β†’ High + = note: this finding has an auto-fix + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#template-injection + +error[template-injection]: code injection via template expansion + --> .github/workflows/js.yml:398:124 + | +398 | ... run: bun scripts/create-manual-changeset.mjs --bump-type "${{ github.event.inputs.bump_type }}" --description "${{ github.event.inputs.description }}" + | --- this run block ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ may expand into attacker-controllable code + | + = note: audit confidence β†’ High + = note: this finding has an auto-fix + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#template-injection + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/js.yml:58:15 + | +58 | uses: oven-sh/setup-bun@v2 + | ^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/js.yml:90:15 + | +90 | uses: oven-sh/setup-bun@v2 + | ^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/js.yml:136:15 + | +136 | uses: oven-sh/setup-bun@v2 + | ^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/js.yml:233:15 + | +233 | uses: oven-sh/setup-bun@v2 + | ^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/js.yml:330:15 + | +330 | uses: oven-sh/setup-bun@v2 + | ^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/js.yml:388:15 + | +388 | uses: oven-sh/setup-bun@v2 + | ^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/js.yml:405:15 + | +405 | uses: peter-evans/create-pull-request@v8 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +warning[excessive-permissions]: overly broad permissions + --> .github/workflows/rust.yml:1:1 + | + 1 | / name: Rust checks and release + 2 | | + 3 | | on: + 4 | | push: +... | +369 | | - Description: ${{ github.event.inputs.description || 'Manual Rust release' }} +370 | | - Triggered by: @${{ github.actor }} + | |_________________________________________________^ default permissions used due to no permissions: block + | + = note: audit confidence β†’ Medium + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#excessive-permissions + +warning[excessive-permissions]: overly broad permissions + --> .github/workflows/rust.yml:58:3 + | +58 | / changelog: +59 | | name: Rust changelog fragment check +60 | | runs-on: ubuntu-latest +61 | | timeout-minutes: 10 +... | +76 | | GITHUB_BASE_REF: ${{ github.base_ref }} +77 | | run: rust-script rust/scripts/check-changelog-fragment.rs + | | ^ + | | | + | |_________________________________________________________________this job + | default permissions used due to no permissions: block + | + = note: audit confidence β†’ Medium + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#excessive-permissions + +warning[excessive-permissions]: overly broad permissions + --> .github/workflows/rust.yml:79:3 + | + 79 | / lint: + 80 | | name: Lint and format Rust + 81 | | runs-on: ubuntu-latest + 82 | | timeout-minutes: 10 +... | +118 | | # own gate. RUSTDOCFLAGS=-Dwarnings comes from the workflow env. +119 | | run: cargo doc --no-deps --all-features + | | ^ + | | | + | |_______________________________________________this job + | default permissions used due to no permissions: block + | + = note: audit confidence β†’ Medium + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#excessive-permissions + +warning[excessive-permissions]: overly broad permissions + --> .github/workflows/rust.yml:121:3 + | +121 | / test: +122 | | name: Test Rust (${{ matrix.os }}) +123 | | runs-on: ${{ matrix.os }} +124 | | timeout-minutes: 30 +... | +153 | | working-directory: rust +154 | | run: cargo test --doc --all-features --verbose + | | ^ + | | | + | |______________________________________________________this job + | default permissions used due to no permissions: block + | + = note: audit confidence β†’ Medium + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#excessive-permissions + +warning[excessive-permissions]: overly broad permissions + --> .github/workflows/rust.yml:156:3 + | +156 | / scripts: +157 | | name: Test Rust release scripts +158 | | runs-on: ubuntu-latest +159 | | timeout-minutes: 15 +... | +196 | | done +197 | | exit $status + | | ^ + | | | + | |______________________this job + | default permissions used due to no permissions: block + | + = note: audit confidence β†’ Medium + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#excessive-permissions + +warning[excessive-permissions]: overly broad permissions + --> .github/workflows/rust.yml:199:3 + | +199 | / build: +200 | | name: Build Rust package +201 | | runs-on: ubuntu-latest +202 | | timeout-minutes: 10 +... | +227 | | working-directory: rust +228 | | run: cargo package --allow-dirty + | | ^ + | | | + | |________________________________________this job + | default permissions used due to no permissions: block + | + = note: audit confidence β†’ Medium + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#excessive-permissions + +error[template-injection]: code injection via template expansion + --> .github/workflows/rust.yml:315:78 + | +315 | run: rust-script rust/scripts/version-and-commit.rs --bump-type "${{ github.event.inputs.bump_type }}" --description "${{ g... + | --- this run block ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ may expand into attacker-controllable code + | + = note: audit confidence β†’ High + = note: this finding has an auto-fix + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#template-injection + +error[template-injection]: code injection via template expansion + --> .github/workflows/rust.yml:315:131 + | +315 | ... run: rust-script rust/scripts/version-and-commit.rs --bump-type "${{ github.event.inputs.bump_type }}" --description "${{ github.event.inputs.description }}... + | --- this run block ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ may expand into attacker-controllable code + | + = note: audit confidence β†’ High + = note: this finding has an auto-fix + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#template-injection + +error[template-injection]: code injection via template expansion + --> .github/workflows/rust.yml:352:85 + | +352 | run: rust-script rust/scripts/create-changelog-fragment.rs --bump-type "${{ github.event.inputs.bump_type }}" --description... + | --- this run block ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ may expand into attacker-controllable code + | + = note: audit confidence β†’ High + = note: this finding has an auto-fix + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#template-injection + +error[template-injection]: code injection via template expansion + --> .github/workflows/rust.yml:352:138 + | +352 | ... run: rust-script rust/scripts/create-changelog-fragment.rs --bump-type "${{ github.event.inputs.bump_type }}" --description "${{ github.event.inputs.description }}" + | --- this run block ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ may expand into attacker-controllable code + | + = note: audit confidence β†’ High + = note: this finding has an auto-fix + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#template-injection + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/rust.yml:69:15 + | +69 | uses: dtolnay/rust-toolchain@stable + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/rust.yml:89:15 + | +89 | uses: dtolnay/rust-toolchain@stable + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/rust.yml:135:15 + | +135 | uses: dtolnay/rust-toolchain@stable + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/rust.yml:166:15 + | +166 | uses: dtolnay/rust-toolchain@stable + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/rust.yml:209:15 + | +209 | uses: dtolnay/rust-toolchain@stable + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/rust.yml:253:15 + | +253 | uses: dtolnay/rust-toolchain@stable + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/rust.yml:308:15 + | +308 | uses: dtolnay/rust-toolchain@stable + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/rust.yml:346:15 + | +346 | uses: dtolnay/rust-toolchain@stable + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +error[unpinned-uses]: unpinned action reference + --> .github/workflows/rust.yml:355:15 + | +355 | uses: peter-evans/create-pull-request@v8 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ action is not pinned to a hash (required by blanket policy) + | + = note: audit confidence β†’ High + = help: audit documentation β†’ https://docs.zizmor.sh/audits/#unpinned-uses + +90 findings (28 ignored, 27 suppressed, 9 unsafe fixes): 0 informational, 0 low, 10 medium, 25 high diff --git a/js/tests/workflow-hygiene.test.mjs b/js/tests/workflow-hygiene.test.mjs new file mode 100644 index 0000000..b61075a --- /dev/null +++ b/js/tests/workflow-hygiene.test.mjs @@ -0,0 +1,251 @@ +// Guards the CI/CD invariants fixed for issue #199. actionlint and zizmor run in +// .github/workflows/workflows.yml and cover syntax and security, but neither one +// knows about the repository-specific rules below: how concurrency has to be +// shaped so a release is never cancelled mid-publish, that `always()` must not +// be used where `!cancelled()` is meant, and that matrix job names must stay +// distinguishable. +import { describe, test, expect } from 'bun:test'; +import { readFileSync, readdirSync } from 'fs'; +import { join, dirname, basename } from 'path'; +import { fileURLToPath } from 'url'; + +const repoRoot = join(dirname(fileURLToPath(import.meta.url)), '..', '..'); +const workflowDir = join(repoRoot, '.github', 'workflows'); + +const workflowFiles = readdirSync(workflowDir) + .filter((name) => name.endsWith('.yml') || name.endsWith('.yaml')) + .sort(); + +const workflows = workflowFiles.map((name) => { + const text = readFileSync(join(workflowDir, name), 'utf8'); + return { name, text, doc: Bun.YAML.parse(text) }; +}); + +/** Jobs that push to main, publish a package, or open a PR. */ +const isWriterJob = (job) => { + const perms = job.permissions ?? {}; + return perms['contents'] === 'write' || perms['pull-requests'] === 'write'; +}; + +const WRITER_GROUP = 'main-writer-${{ github.repository }}-main'; + +describe('workflow files', () => { + test('at least the four known workflows are present', () => { + expect(workflowFiles).toContain('js.yml'); + expect(workflowFiles).toContain('rust.yml'); + expect(workflowFiles).toContain('parity.yml'); + // Added for #199: nothing linted the workflows themselves before. + expect(workflowFiles).toContain('workflows.yml'); + }); + + test.each(workflows.map((w) => [w.name, w]))( + '%s declares a least-privilege top-level permissions block', + (_name, workflow) => { + // Without an explicit block the job token keeps whatever the repository + // default is, which is `write-all` on older repositories. + expect(workflow.doc.permissions).toEqual({ contents: 'read' }); + } + ); + + test.each(workflows.map((w) => [w.name, w]))( + '%s uses !cancelled() rather than always()', + (_name, workflow) => { + // `always()` keeps a job running after the run is cancelled, so a + // cancelled prerequisite still lets its dependents start. + const conditions = Object.values(workflow.doc.jobs) + .map((job) => String(job.if ?? '')) + .filter((cond) => cond.includes('always()')); + expect(conditions).toEqual([]); + } + ); + + test.each(workflows.map((w) => [w.name, w]))( + '%s has no expression interpolation inside run: blocks', + (_name, workflow) => { + // `${{ }}` is pasted into the shell before it runs; an attacker-controlled + // value (a branch name on a fork PR) becomes shell code. Pass values + // through `env:` instead. + const offenders = []; + for (const [jobId, job] of Object.entries(workflow.doc.jobs)) { + for (const step of job.steps ?? []) { + if (typeof step.run === 'string' && step.run.includes('${{')) { + offenders.push(`${jobId}: ${step.name ?? step.run.slice(0, 40)}`); + } + } + } + expect(offenders).toEqual([]); + } + ); + + test.each(workflows.map((w) => [w.name, w]))( + '%s pins every third-party action to a full commit hash', + (_name, workflow) => { + // Matches .github/zizmor.yml: these publishers are trusted at tag + // granularity, everything else must be hash-pinned. + const refPinnedOwners = [ + 'actions', + 'github', + 'docker', + 'astral-sh', + 'lycheeverse', + 'zizmorcore', + 'changesets', + ]; + const offenders = []; + for (const job of Object.values(workflow.doc.jobs)) { + for (const step of job.steps ?? []) { + const uses = step.uses; + if (typeof uses !== 'string' || uses.startsWith('docker://')) { + continue; + } + const [path, ref] = uses.split('@'); + if (refPinnedOwners.includes(path.split('/')[0])) { + continue; + } + if (!/^[0-9a-f]{40}$/.test(ref ?? '')) { + offenders.push(uses); + } + } + } + expect(offenders).toEqual([]); + } + ); + + test.each(workflows.map((w) => [w.name, w]))( + '%s scopes concurrency per job instead of per workflow when it can write', + (_name, workflow) => { + const jobs = Object.values(workflow.doc.jobs); + if (!jobs.some(isWriterJob)) { + return; + } + // A workflow-level cancellable group cancels the whole run, including a + // release that has already started publishing. + expect(workflow.doc.concurrency).toBeUndefined(); + } + ); + + test.each(workflows.map((w) => [w.name, w]))( + '%s gives every job a concurrency group', + (_name, workflow) => { + const missing = Object.entries(workflow.doc.jobs) + .filter(([, job]) => !job.concurrency?.group) + .map(([jobId]) => jobId); + expect(missing).toEqual([]); + } + ); + + test.each(workflows.map((w) => [w.name, w]))( + '%s puts writer jobs in the shared non-cancellable group', + (_name, workflow) => { + for (const [jobId, job] of Object.entries(workflow.doc.jobs)) { + if (!isWriterJob(job)) { + continue; + } + expect(`${jobId}: ${job.concurrency.group}`).toBe( + `${jobId}: ${WRITER_GROUP}` + ); + expect(`${jobId}: ${job.concurrency['cancel-in-progress']}`).toBe( + `${jobId}: false` + ); + } + } + ); + + test.each(workflows.map((w) => [w.name, w]))( + '%s keeps check jobs cancellable and matrix entries independent', + (_name, workflow) => { + for (const [jobId, job] of Object.entries(workflow.doc.jobs)) { + if (isWriterJob(job)) { + continue; + } + const group = job.concurrency.group; + expect(`${jobId}: ${group.startsWith('check-')}`).toBe( + `${jobId}: true` + ); + expect(`${jobId}: ${job.concurrency['cancel-in-progress']}`).toBe( + `${jobId}: true` + ); + // Every matrix dimension must appear in the group, otherwise the matrix + // entries share one group and cancel each other. + for (const key of Object.keys(job.strategy?.matrix ?? {})) { + if (key === 'include' || key === 'exclude') { + continue; + } + expect(`${jobId}/${key}: ${group.includes(`matrix.${key}`)}`).toBe( + `${jobId}/${key}: true` + ); + } + } + } + ); + + test.each(workflows.map((w) => [w.name, w]))( + '%s gives every matrix job a name that distinguishes its entries', + (_name, workflow) => { + // Three Node entries in js.yml differed only by `node-version`, which was + // missing from the name, so all three reported as "Test JavaScript (node + // on ubuntu-latest)" and no branch rule could require a specific one. + for (const [jobId, job] of Object.entries(workflow.doc.jobs)) { + const matrix = job.strategy?.matrix; + if (!matrix) { + continue; + } + const keys = new Set( + Object.keys(matrix).filter((k) => k !== 'include') + ); + for (const entry of matrix.include ?? []) { + Object.keys(entry).forEach((k) => keys.add(k)); + } + const name = job.name ?? jobId; + for (const key of keys) { + expect(`${jobId}/${key}: ${name.includes(`matrix.${key}`)}`).toBe( + `${jobId}/${key}: true` + ); + } + } + } + ); +}); + +describe('workflow linting is itself wired into CI', () => { + const lintWorkflow = workflows.find((w) => w.name === 'workflows.yml'); + + test('actionlint runs from the Docker image that bundles shellcheck', () => { + // A native actionlint binary without shellcheck on PATH skips every `run:` + // check and still exits 0. + const uses = Object.values(lintWorkflow.doc.jobs) + .flatMap((job) => job.steps ?? []) + .map((step) => step.uses) + .filter(Boolean); + expect(uses.some((u) => u.startsWith('docker://rhysd/actionlint:'))).toBe( + true + ); + }); + + test('zizmor runs with the repository policy and medium confidence', () => { + const step = Object.values(lintWorkflow.doc.jobs) + .flatMap((job) => job.steps ?? []) + .find((s) => (s.uses ?? '').startsWith('zizmorcore/zizmor-action@')); + expect(step.with.config).toBe('.github/zizmor.yml'); + expect(String(step.with['min-confidence'])).toBe('medium'); + }); + + test('the zizmor policy requires hash pins by default', () => { + const policy = Bun.YAML.parse( + readFileSync(join(repoRoot, '.github', 'zizmor.yml'), 'utf8') + ); + expect(policy.rules['unpinned-uses'].config.policies['*']).toBe('hash-pin'); + }); + + test('the lint workflow triggers on changes to .github', () => { + const paths = lintWorkflow.doc.on.pull_request.paths; + expect(paths.some((p) => p.startsWith('.github'))).toBe(true); + }); + + test('every workflow file is covered by these checks', () => { + expect(workflows.map((w) => basename(w.name)).length).toBe( + workflowFiles.length + ); + expect(workflowFiles.length).toBeGreaterThanOrEqual(4); + }); +}); From 7c418fdab44d0135f579e6578b6de61b21d7921b Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 4 Sep 2026 22:04:38 +0000 Subject: [PATCH 09/34] test(ci): match the layout guard to the root lint config and !cancelled() Two assertions in repository-layout.test.mjs described the state of the tree before this branch changed it, so they now fail for the changes they were never meant to forbid. `keeps JavaScript package files inside js/` required the repository root to have no eslint.config.js. That was true when the whole JavaScript project lived under js/, but eslint treats the directory holding its configuration as the base path of the linted project: with the config in js/ only, root-level JavaScript answered "the file is ignored because it is located outside of the base path" and was never checked. The root file is a re-export that exists to widen that base path, not a second package. Split the intent into its own test that asserts the re-export -- and .prettierrc/.prettierignore/ .lintstagedrc.json alongside it -- is at the root and no longer in js/. `release jobs evaluate after PR-only gate jobs are skipped on push` required the literal `always() && !cancelled()`. The point of that condition is to stop GitHub skipping the release job because a PR-only dependency was skipped, which `!cancelled()` already does by itself; `always()` next to it is subsumed and misleads, since deleting the `!cancelled()` half would leave a condition that publishes out of a cancelled run. Assert `!cancelled()` and the absence of `always()`, which is the property that actually matters. --- js/tests/repository-layout.test.mjs | 36 ++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/js/tests/repository-layout.test.mjs b/js/tests/repository-layout.test.mjs index 4d3fa8a..c4457c4 100644 --- a/js/tests/repository-layout.test.mjs +++ b/js/tests/repository-layout.test.mjs @@ -40,7 +40,6 @@ describe('repository language layout', () => { expect(existsFromRepo('package-lock.json')).toBe(false); expect(existsFromRepo('bun.lock')).toBe(false); expect(existsFromRepo('bunfig.toml')).toBe(false); - expect(existsFromRepo('eslint.config.js')).toBe(false); expect(existsFromRepo('.changeset/config.json')).toBe(false); expect(existsFromRepo('js/package.json')).toBe(true); @@ -52,6 +51,28 @@ describe('repository language layout', () => { expect(existsFromRepo('js/scripts/publish-to-npm.mjs')).toBe(true); }); + test('lints and formats from the repository root, not from js/', () => { + // eslint and prettier both treat the directory holding their configuration + // as the base path of the linted project. While these files lived in js/, + // repository-root JavaScript (claude-profiles.mjs, experiments/) was outside + // that base path and silently unlintable, and js/.prettierignore's + // docs/case-studies patterns named a js/docs/ that does not exist. The root + // copies are what put the whole tree in scope; js/eslint.config.js stays as + // the rule set they re-export. + expect(existsFromRepo('eslint.config.js')).toBe(true); + expect(existsFromRepo('.prettierrc')).toBe(true); + expect(existsFromRepo('.prettierignore')).toBe(true); + expect(existsFromRepo('.lintstagedrc.json')).toBe(true); + + expect(existsFromRepo('js/.prettierrc')).toBe(false); + expect(existsFromRepo('js/.prettierignore')).toBe(false); + expect(existsFromRepo('js/.lintstagedrc.json')).toBe(false); + + expect(readFromRepo('eslint.config.js')).toContain( + "export { default } from './js/eslint.config.js'" + ); + }); + test('does not keep language release scripts at the repository root', () => { expect(existsFromRepo('scripts')).toBe(false); expect(existsFromRepo('scripts/publish-to-npm.mjs')).toBe(false); @@ -88,6 +109,13 @@ describe('repository language layout', () => { }); test('release jobs evaluate after PR-only gate jobs are skipped on push', () => { + // A release job needs an `if:` that is not `success()`, or GitHub skips it + // whenever a dependency was skipped -- which is exactly what happens to the + // PR-only gate jobs on a push to main. `!cancelled()` lifts that implicit + // requirement on its own; `always() && !cancelled()` reads as if it did + // something more, but `always()` is subsumed by the operand next to it and + // only invites `always()` being kept when the `!cancelled()` half is edited + // away, at which point a cancelled run would still publish. const jsWorkflow = readFromRepo('.github/workflows/js.yml'); const rustWorkflow = readFromRepo('.github/workflows/rust.yml'); @@ -102,14 +130,16 @@ describe('repository language layout', () => { ); expect(jsReleaseJob).toContain('needs: [lint, test]'); - expect(jsReleaseJob).toContain('always() && !cancelled()'); + expect(jsReleaseJob).toContain('!cancelled()'); + expect(jsReleaseJob).not.toContain('always()'); expect(jsReleaseJob).toContain("github.ref == 'refs/heads/main'"); expect(jsReleaseJob).toContain("github.event_name == 'push'"); expect(jsReleaseJob).toContain("needs.lint.result == 'success'"); expect(jsReleaseJob).toContain("needs.test.result == 'success'"); expect(rustReleaseJob).toContain('needs: [lint, test, scripts, build]'); - expect(rustReleaseJob).toContain('always() && !cancelled()'); + expect(rustReleaseJob).toContain('!cancelled()'); + expect(rustReleaseJob).not.toContain('always()'); expect(rustReleaseJob).toContain("github.ref == 'refs/heads/main'"); expect(rustReleaseJob).toContain("github.event_name == 'push'"); expect(rustReleaseJob).toContain("needs.lint.result == 'success'"); From 9bae0c4876661725514c7c8b9198e231c89b700f Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 4 Sep 2026 22:04:54 +0000 Subject: [PATCH 10/34] fix(deps): clear the audit findings in both JavaScript lockfiles `npm audit --package-lock-only --audit-level=high` reported 8 vulnerabilities (5 high) and `bun audit --audit-level=high` reported 13, all of them in transitive development dependencies: @humanfs/node, ajv, brace-expansion, flatted, js-yaml, minimatch, picomatch and yaml. Nothing in CI ran either command, so none of this was visible on a green build (issue #199). Raising the direct ranges is not enough on its own. `bun update` left 8 high findings behind because bun.lock pinned the transitive versions that the new ranges no longer require; the lockfile had to be resolved from scratch. Regenerating package-lock.json the same way left one (flatted, reached through flat-cache), cleared by a follow-up `npm audit fix --package-lock-only`. Both lockfiles now report clean: npm "found 0 vulnerabilities", bun "No vulnerabilities found". prettier 3.9.6 changes how an empty `for` update clause is spaced, which is why terminal-artifacts.mjs is reformatted at two loops; `bun run check` is green with the new version. --- js/bun.lock | 672 +++++++++++++++++----------------- js/package-lock.json | 448 ++++++++++++----------- js/package.json | 16 +- js/src/terminal-artifacts.mjs | 4 +- 4 files changed, 572 insertions(+), 568 deletions(-) diff --git a/js/bun.lock b/js/bun.lock index 5d93349..5df44b9 100644 --- a/js/bun.lock +++ b/js/bun.lock @@ -1,6 +1,6 @@ { "lockfileVersion": 1, - "configVersion": 1, + "configVersion": 0, "workspaces": { "": { "name": "command-stream", @@ -8,116 +8,120 @@ "@resvg/resvg-js": "^2.6.2", "@xterm/headless": "^6.0.0", "gifenc": "^1.0.3", - "node-pty": "^1.2.0-beta.14", + "node-pty": "^1.2.0-beta.15", }, "devDependencies": { - "@changesets/cli": "^2.29.7", + "@changesets/cli": "^2.31.1", "dejavu-fonts-ttf": "^2.37.3", - "eslint": "^9.38.0", + "eslint": "^9.39.5", "eslint-config-prettier": "^10.1.8", - "eslint-plugin-prettier": "^5.5.4", + "eslint-plugin-prettier": "^5.5.6", "husky": "^9.1.7", - "jscpd": "^4.0.5", - "lint-staged": "^16.2.6", - "prettier": "^3.6.2", - "subset-font": "^2.5.0", + "jscpd": "^4.3.0", + "lint-staged": "^16.4.0", + "prettier": "^3.9.6", + "subset-font": "^2.7.0", }, }, }, "packages": { - "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, ""], - "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, ""], - "@babel/parser": ["@babel/parser@7.28.5", "", { "dependencies": { "@babel/types": "^7.28.5" }, "bin": "./bin/babel-parser.js" }, "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ=="], + "@babel/parser": ["@babel/parser@7.28.5", "", { "dependencies": { "@babel/types": "^7.28.5" }, "bin": { "parser": "bin/babel-parser.js" } }, ""], - "@babel/runtime": ["@babel/runtime@7.28.4", "", {}, "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ=="], + "@babel/runtime": ["@babel/runtime@7.28.4", "", {}, ""], - "@babel/types": ["@babel/types@7.28.5", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA=="], + "@babel/types": ["@babel/types@7.28.5", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, ""], - "@changesets/apply-release-plan": ["@changesets/apply-release-plan@7.0.14", "", { "dependencies": { "@changesets/config": "^3.1.2", "@changesets/get-version-range-type": "^0.4.0", "@changesets/git": "^3.0.4", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "detect-indent": "^6.0.0", "fs-extra": "^7.0.1", "lodash.startcase": "^4.4.0", "outdent": "^0.5.0", "prettier": "^2.7.1", "resolve-from": "^5.0.0", "semver": "^7.5.3" } }, "sha512-ddBvf9PHdy2YY0OUiEl3TV78mH9sckndJR14QAt87KLEbIov81XO0q0QAmvooBxXlqRRP8I9B7XOzZwQG7JkWA=="], + "@changesets/apply-release-plan": ["@changesets/apply-release-plan@7.1.1", "", { "dependencies": { "@changesets/config": "^3.1.4", "@changesets/get-version-range-type": "^0.4.0", "@changesets/git": "^3.0.4", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "detect-indent": "^6.0.0", "fs-extra": "^7.0.1", "lodash.startcase": "^4.4.0", "outdent": "^0.5.0", "prettier": "^2.7.1", "resolve-from": "^5.0.0", "semver": "^7.5.3" } }, "sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA=="], - "@changesets/assemble-release-plan": ["@changesets/assemble-release-plan@6.0.9", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "semver": "^7.5.3" } }, "sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ=="], + "@changesets/assemble-release-plan": ["@changesets/assemble-release-plan@6.0.10", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.4", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "semver": "^7.5.3" } }, "sha512-rSDcqdJ9KbVyjpBIuCidhvZNIiVt1XaIYp73ycVQRIA5n/j6wQaEk0ChRLMUQ1vkxZe51PTQ9OIhbg6HQMW45A=="], - "@changesets/changelog-git": ["@changesets/changelog-git@0.2.1", "", { "dependencies": { "@changesets/types": "^6.1.0" } }, "sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q=="], + "@changesets/changelog-git": ["@changesets/changelog-git@0.2.1", "", { "dependencies": { "@changesets/types": "^6.1.0" } }, ""], - "@changesets/cli": ["@changesets/cli@2.29.8", "", { "dependencies": { "@changesets/apply-release-plan": "^7.0.14", "@changesets/assemble-release-plan": "^6.0.9", "@changesets/changelog-git": "^0.2.1", "@changesets/config": "^3.1.2", "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/get-release-plan": "^4.0.14", "@changesets/git": "^3.0.4", "@changesets/logger": "^0.1.1", "@changesets/pre": "^2.0.2", "@changesets/read": "^0.6.6", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@changesets/write": "^0.4.0", "@inquirer/external-editor": "^1.0.2", "@manypkg/get-packages": "^1.1.3", "ansi-colors": "^4.1.3", "ci-info": "^3.7.0", "enquirer": "^2.4.1", "fs-extra": "^7.0.1", "mri": "^1.2.0", "p-limit": "^2.2.0", "package-manager-detector": "^0.2.0", "picocolors": "^1.1.0", "resolve-from": "^5.0.0", "semver": "^7.5.3", "spawndamnit": "^3.0.1", "term-size": "^2.1.0" }, "bin": { "changeset": "bin.js" } }, "sha512-1weuGZpP63YWUYjay/E84qqwcnt5yJMM0tep10Up7Q5cS/DGe2IZ0Uj3HNMxGhCINZuR7aO9WBMdKnPit5ZDPA=="], + "@changesets/cli": ["@changesets/cli@2.31.1", "", { "dependencies": { "@changesets/apply-release-plan": "^7.1.1", "@changesets/assemble-release-plan": "^6.0.10", "@changesets/changelog-git": "^0.2.1", "@changesets/config": "^3.1.4", "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.4", "@changesets/get-release-plan": "^4.0.16", "@changesets/git": "^3.0.4", "@changesets/logger": "^0.1.1", "@changesets/pre": "^2.0.2", "@changesets/read": "^0.6.7", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@changesets/write": "^0.4.0", "@inquirer/external-editor": "^1.0.2", "@manypkg/get-packages": "^1.1.3", "ansi-colors": "^4.1.3", "enquirer": "^2.4.1", "fs-extra": "^7.0.1", "mri": "^1.2.0", "package-manager-detector": "^0.2.0", "picocolors": "^1.1.0", "resolve-from": "^5.0.0", "semver": "^7.5.3", "spawndamnit": "^3.0.1", "term-size": "^2.1.0" }, "bin": { "changeset": "bin.js" } }, "sha512-uO05WTcRBwuVOJVSW8Cmpqw6q0WDL53ajGCMyszutvOe5toOnunbpM4jZzf+qxBOz7i0AzopZ8diBuewjmF40w=="], - "@changesets/config": ["@changesets/config@3.1.2", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/logger": "^0.1.1", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "fs-extra": "^7.0.1", "micromatch": "^4.0.8" } }, "sha512-CYiRhA4bWKemdYi/uwImjPxqWNpqGPNbEBdX1BdONALFIDK7MCUj6FPkzD+z9gJcvDFUQJn9aDVf4UG7OT6Kog=="], + "@changesets/config": ["@changesets/config@3.1.4", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.4", "@changesets/logger": "^0.1.1", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "fs-extra": "^7.0.1", "micromatch": "^4.0.8" } }, "sha512-pf0bvD/v6WI2cRlZ6hzpjtZdSlXDXMAJ+Iz7xfFzV4ZxJ8OGGAON+1qYc99ZPrijnt4xp3VGG7eNvAOGS24V1Q=="], - "@changesets/errors": ["@changesets/errors@0.2.0", "", { "dependencies": { "extendable-error": "^0.1.5" } }, "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow=="], + "@changesets/errors": ["@changesets/errors@0.2.0", "", { "dependencies": { "extendable-error": "^0.1.5" } }, ""], - "@changesets/get-dependents-graph": ["@changesets/get-dependents-graph@2.1.3", "", { "dependencies": { "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "picocolors": "^1.1.0", "semver": "^7.5.3" } }, "sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ=="], + "@changesets/get-dependents-graph": ["@changesets/get-dependents-graph@2.1.4", "", { "dependencies": { "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "picocolors": "^1.1.0", "semver": "^7.5.3" } }, "sha512-ZsS00x6WvmHq3sQv8oCMwL0f/z3wbXCVuSVTJwCnnmbC/iBdNJGFx1EcbMG4PC6sXRyH69liM4A2WKXzn/kRPg=="], - "@changesets/get-release-plan": ["@changesets/get-release-plan@4.0.14", "", { "dependencies": { "@changesets/assemble-release-plan": "^6.0.9", "@changesets/config": "^3.1.2", "@changesets/pre": "^2.0.2", "@changesets/read": "^0.6.6", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3" } }, "sha512-yjZMHpUHgl4Xl5gRlolVuxDkm4HgSJqT93Ri1Uz8kGrQb+5iJ8dkXJ20M2j/Y4iV5QzS2c5SeTxVSKX+2eMI0g=="], + "@changesets/get-release-plan": ["@changesets/get-release-plan@4.0.16", "", { "dependencies": { "@changesets/assemble-release-plan": "^6.0.10", "@changesets/config": "^3.1.4", "@changesets/pre": "^2.0.2", "@changesets/read": "^0.6.7", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3" } }, "sha512-2K5Om6CrMPm45rtvckfzWo7e9jOVCKLCnXia5eUPaURH7/LWzri7pK1TycdzAuAtehLkW7VPbWLCSExTHmiI6g=="], - "@changesets/get-version-range-type": ["@changesets/get-version-range-type@0.4.0", "", {}, "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ=="], + "@changesets/get-version-range-type": ["@changesets/get-version-range-type@0.4.0", "", {}, ""], - "@changesets/git": ["@changesets/git@3.0.4", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@manypkg/get-packages": "^1.1.3", "is-subdir": "^1.1.1", "micromatch": "^4.0.8", "spawndamnit": "^3.0.1" } }, "sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw=="], + "@changesets/git": ["@changesets/git@3.0.4", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@manypkg/get-packages": "^1.1.3", "is-subdir": "^1.1.1", "micromatch": "^4.0.8", "spawndamnit": "^3.0.1" } }, ""], - "@changesets/logger": ["@changesets/logger@0.1.1", "", { "dependencies": { "picocolors": "^1.1.0" } }, "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg=="], + "@changesets/logger": ["@changesets/logger@0.1.1", "", { "dependencies": { "picocolors": "^1.1.0" } }, ""], - "@changesets/parse": ["@changesets/parse@0.4.2", "", { "dependencies": { "@changesets/types": "^6.1.0", "js-yaml": "^4.1.1" } }, "sha512-Uo5MC5mfg4OM0jU3up66fmSn6/NE9INK+8/Vn/7sMVcdWg46zfbvvUSjD9EMonVqPi9fbrJH9SXHn48Tr1f2yA=="], + "@changesets/parse": ["@changesets/parse@0.4.3", "", { "dependencies": { "@changesets/types": "^6.1.0", "js-yaml": "^4.1.1" } }, "sha512-ZDmNc53+dXdWEv7fqIUSgRQOLYoUom5Z40gmLgmATmYR9NbL6FJJHwakcCpzaeCy+1D0m0n7mT4jj2B/MQPl7A=="], - "@changesets/pre": ["@changesets/pre@2.0.2", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "fs-extra": "^7.0.1" } }, "sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug=="], + "@changesets/pre": ["@changesets/pre@2.0.2", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "fs-extra": "^7.0.1" } }, ""], - "@changesets/read": ["@changesets/read@0.6.6", "", { "dependencies": { "@changesets/git": "^3.0.4", "@changesets/logger": "^0.1.1", "@changesets/parse": "^0.4.2", "@changesets/types": "^6.1.0", "fs-extra": "^7.0.1", "p-filter": "^2.1.0", "picocolors": "^1.1.0" } }, "sha512-P5QaN9hJSQQKJShzzpBT13FzOSPyHbqdoIBUd2DJdgvnECCyO6LmAOWSV+O8se2TaZJVwSXjL+v9yhb+a9JeJg=="], + "@changesets/read": ["@changesets/read@0.6.7", "", { "dependencies": { "@changesets/git": "^3.0.4", "@changesets/logger": "^0.1.1", "@changesets/parse": "^0.4.3", "@changesets/types": "^6.1.0", "fs-extra": "^7.0.1", "p-filter": "^2.1.0", "picocolors": "^1.1.0" } }, "sha512-D1G4AUYGrBEk8vj8MGwf75k9GpN6XL3wg8i42P2jZZwFLXnlr2Pn7r9yuQNbaMCarP7ZQWNJbV6XLeysAIMhTA=="], - "@changesets/should-skip-package": ["@changesets/should-skip-package@0.1.2", "", { "dependencies": { "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3" } }, "sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw=="], + "@changesets/should-skip-package": ["@changesets/should-skip-package@0.1.2", "", { "dependencies": { "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3" } }, ""], - "@changesets/types": ["@changesets/types@6.1.0", "", {}, "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA=="], + "@changesets/types": ["@changesets/types@6.1.0", "", {}, ""], - "@changesets/write": ["@changesets/write@0.4.0", "", { "dependencies": { "@changesets/types": "^6.1.0", "fs-extra": "^7.0.1", "human-id": "^4.1.1", "prettier": "^2.7.1" } }, "sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q=="], + "@changesets/write": ["@changesets/write@0.4.0", "", { "dependencies": { "@changesets/types": "^6.1.0", "fs-extra": "^7.0.1", "human-id": "^4.1.1", "prettier": "^2.7.1" } }, ""], - "@colors/colors": ["@colors/colors@1.5.0", "", {}, "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ=="], + "@colors/colors": ["@colors/colors@1.5.0", "", {}, ""], - "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g=="], + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, ""], - "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, ""], - "@eslint/config-array": ["@eslint/config-array@0.21.1", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA=="], + "@eslint/config-array": ["@eslint/config-array@0.21.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.5" } }, "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, ""], - "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], + "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, ""], - "@eslint/eslintrc": ["@eslint/eslintrc@3.3.3", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ=="], + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.7", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.3.2", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-F42g89Qd5oAWtp0k0nnSrjziAKza7w8SVT4mStc18LZMaRb4J1HQAHLCalEtDCxrTuksx7NU9qsmeLwpOfPqWw=="], - "@eslint/js": ["@eslint/js@9.39.2", "", {}, "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA=="], + "@eslint/js": ["@eslint/js@9.39.5", "", {}, "sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A=="], - "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], + "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, ""], - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, ""], - "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], + "@humanfs/core": ["@humanfs/core@0.19.2", "", { "dependencies": { "@humanfs/types": "^0.15.0" } }, "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA=="], - "@humanfs/node": ["@humanfs/node@0.16.7", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ=="], + "@humanfs/node": ["@humanfs/node@0.16.8", "", { "dependencies": { "@humanfs/core": "^0.19.2", "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ=="], - "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], + "@humanfs/types": ["@humanfs/types@0.15.0", "", {}, "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q=="], - "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], + "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, ""], - "@inquirer/external-editor": ["@inquirer/external-editor@1.0.3", "", { "dependencies": { "chardet": "^2.1.1", "iconv-lite": "^0.7.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA=="], + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, ""], - "@jscpd/core": ["@jscpd/core@4.0.1", "", { "dependencies": { "eventemitter3": "^5.0.1" } }, "sha512-6Migc68Z8p7q5xqW1wbF3SfIbYHPQoiLHPbJb1A1Z1H9DwImwopFkYflqRDpuamLd0Jfg2jx3ZBmHQt21NbD1g=="], + "@inquirer/external-editor": ["@inquirer/external-editor@1.0.3", "", { "dependencies": { "chardet": "^2.1.1", "iconv-lite": "^0.7.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, ""], - "@jscpd/finder": ["@jscpd/finder@4.0.1", "", { "dependencies": { "@jscpd/core": "4.0.1", "@jscpd/tokenizer": "4.0.1", "blamer": "^1.0.6", "bytes": "^3.1.2", "cli-table3": "^0.6.5", "colors": "^1.4.0", "fast-glob": "^3.3.2", "fs-extra": "^11.2.0", "markdown-table": "^2.0.0", "pug": "^3.0.3" } }, "sha512-TcCT28686GeLl87EUmrBXYmuOFELVMDwyjKkcId+qjNS1zVWRd53Xd5xKwEDzkCEgen/vCs+lorLLToolXp5oQ=="], + "@jscpd/badge-reporter": ["@jscpd/badge-reporter@4.2.5", "", { "dependencies": { "badgen": "^3.2.3", "colors": "^1.4.0", "fs-extra": "^11.2.0" } }, "sha512-ktXrjPeRaRyUDktxTroSA2/w5sshXpQplWkUuq/e6XqEpKBSbGEnwZLIaegSijOrMwIcCXPQ9k4feXIz5eVJNA=="], - "@jscpd/html-reporter": ["@jscpd/html-reporter@4.0.1", "", { "dependencies": { "colors": "1.4.0", "fs-extra": "^11.2.0", "pug": "^3.0.3" } }, "sha512-M9fFETNvXXuy4fWv0M2oMluxwrQUBtubxCHaWw21lb2G8A6SE19moe3dUkluZ/3V4BccywfeF9lSEUg84heLww=="], + "@jscpd/core": ["@jscpd/core@4.2.5", "", { "dependencies": { "eventemitter3": "^5.0.1" } }, "sha512-Esf2deHxaoNEjePwf2jqP6Urzj+BAOsJVPFLbnnSsV+q7rLNMcn0UEEoKBXIOOt4qMkrkhl9DfwpMyPPOr6GkQ=="], - "@jscpd/tokenizer": ["@jscpd/tokenizer@4.0.1", "", { "dependencies": { "@jscpd/core": "4.0.1", "reprism": "^0.0.11", "spark-md5": "^3.0.2" } }, "sha512-l/CPeEigadYcQUsUxf1wdCBfNjyAxYcQU04KciFNmSZAMY+ykJ8fZsiuyfjb+oOuDgsIPZZ9YvbvsCr6NBXueg=="], + "@jscpd/finder": ["@jscpd/finder@4.3.0", "", { "dependencies": { "@jscpd/core": "4.2.5", "@jscpd/tokenizer": "4.2.6", "blamer": "^1.0.6", "bytes": "^3.1.2", "cli-table3": "^0.6.5", "colors": "^1.4.0", "fast-glob": "^3.3.2", "fs-extra": "^11.3.6", "markdown-table": "^2.0.0", "pug": "^3.0.4" } }, "sha512-MnEUyier0D6P9zRIhAlBoyJUV8BYT6d5FDZuhR7X23FdZAgdMV8yaRRO1Q1EveK9/ReA6WVHT1HE8F15rij71A=="], - "@manypkg/find-root": ["@manypkg/find-root@1.1.0", "", { "dependencies": { "@babel/runtime": "^7.5.5", "@types/node": "^12.7.1", "find-up": "^4.1.0", "fs-extra": "^8.1.0" } }, "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA=="], + "@jscpd/html-reporter": ["@jscpd/html-reporter@4.2.5", "", { "dependencies": { "colors": "1.4.0", "fs-extra": "^11.2.0", "pug": "^3.0.4" } }, "sha512-zMMIKbvi43dMgeNeHXlHQy1ovf+KJrzNlUubaBvCAVatqP23ksW8d3fmsevIQG9mMMTH0D1xOz+SxUn1FREOPg=="], - "@manypkg/get-packages": ["@manypkg/get-packages@1.1.3", "", { "dependencies": { "@babel/runtime": "^7.5.5", "@changesets/types": "^4.0.1", "@manypkg/find-root": "^1.1.0", "fs-extra": "^8.1.0", "globby": "^11.0.0", "read-yaml-file": "^1.1.0" } }, "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A=="], + "@jscpd/tokenizer": ["@jscpd/tokenizer@4.2.6", "", { "dependencies": { "@jscpd/core": "4.2.5", "spark-md5": "^3.0.2" } }, "sha512-/eyFjINWLs2mrBTU4H681bs855r5oRyl1O3mZxcd7TpL1JIG85a7pps0RkRPAe9c/2KcjVCc82HbhOz86M0n5g=="], - "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + "@manypkg/find-root": ["@manypkg/find-root@1.1.0", "", { "dependencies": { "@babel/runtime": "^7.5.5", "@types/node": "^12.7.1", "find-up": "^4.1.0", "fs-extra": "^8.1.0" } }, ""], - "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + "@manypkg/get-packages": ["@manypkg/get-packages@1.1.3", "", { "dependencies": { "@babel/runtime": "^7.5.5", "@changesets/types": "^4.0.1", "@manypkg/find-root": "^1.1.0", "fs-extra": "^8.1.0", "globby": "^11.0.0", "read-yaml-file": "^1.1.0" } }, ""], - "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, ""], - "@pkgr/core": ["@pkgr/core@0.2.9", "", {}, "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA=="], + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, ""], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, ""], + + "@pkgr/core": ["@pkgr/core@0.3.6", "", {}, "sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA=="], "@resvg/resvg-js": ["@resvg/resvg-js@2.6.2", "", { "optionalDependencies": { "@resvg/resvg-js-android-arm-eabi": "2.6.2", "@resvg/resvg-js-android-arm64": "2.6.2", "@resvg/resvg-js-darwin-arm64": "2.6.2", "@resvg/resvg-js-darwin-x64": "2.6.2", "@resvg/resvg-js-linux-arm-gnueabihf": "2.6.2", "@resvg/resvg-js-linux-arm64-gnu": "2.6.2", "@resvg/resvg-js-linux-arm64-musl": "2.6.2", "@resvg/resvg-js-linux-x64-gnu": "2.6.2", "@resvg/resvg-js-linux-x64-musl": "2.6.2", "@resvg/resvg-js-win32-arm64-msvc": "2.6.2", "@resvg/resvg-js-win32-ia32-msvc": "2.6.2", "@resvg/resvg-js-win32-x64-msvc": "2.6.2" } }, "sha512-xBaJish5OeGmniDj9cW5PRa/PtmuVU3ziqrbr5xJj901ZDN4TosrVaNZpEiLZAxdfnhAe7uQ7QFWfjPe9d9K2Q=="], @@ -145,574 +149,572 @@ "@resvg/resvg-js-win32-x64-msvc": ["@resvg/resvg-js-win32-x64-msvc@2.6.2", "", { "os": "win32", "cpu": "x64" }, "sha512-ZXtYhtUr5SSaBrUDq7DiyjOFJqBVL/dOBN7N/qmi/pO0IgiWW/f/ue3nbvu9joWE5aAKDoIzy/CxsY0suwGosQ=="], - "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + "@types/estree": ["@types/estree@1.0.8", "", {}, ""], - "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, ""], "@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="], - "@types/sarif": ["@types/sarif@2.1.7", "", {}, "sha512-kRz0VEkJqWLf1LLVN4pT1cg1Z9wAuvI6L97V3m2f5B76Tg8d413ddvLBPTEHAZJlnn4XSvu0FkZtViCQGVyrXQ=="], + "@types/sarif": ["@types/sarif@2.1.7", "", {}, ""], "@xterm/headless": ["@xterm/headless@6.0.0", "", {}, "sha512-5Yj1QINYCyzrZtf8OFIHi47iQtI+0qYFPHmouEfG8dHNxbZ9Tb9YGSuLcsEwj9Z+OL75GJqPyJbyoFer80a2Hw=="], - "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + "acorn": ["acorn@8.15.0", "", { "bin": "bin/acorn" }, ""], - "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, ""], - "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + "ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "ansi-colors": ["ansi-colors@4.1.3", "", {}, "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="], + "ansi-colors": ["ansi-colors@4.1.3", "", {}, ""], - "ansi-escapes": ["ansi-escapes@7.2.0", "", { "dependencies": { "environment": "^1.0.0" } }, "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw=="], + "ansi-escapes": ["ansi-escapes@7.2.0", "", { "dependencies": { "environment": "^1.0.0" } }, ""], - "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "ansi-regex": ["ansi-regex@5.0.1", "", {}, ""], - "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, ""], - "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + "argparse": ["argparse@2.0.1", "", {}, ""], - "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="], + "array-union": ["array-union@2.1.0", "", {}, ""], - "asap": ["asap@2.0.6", "", {}, "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="], + "asap": ["asap@2.0.6", "", {}, ""], - "assert-never": ["assert-never@1.4.0", "", {}, "sha512-5oJg84os6NMQNl27T9LnZkvvqzvAnHu03ShCnoj6bsJwS7L8AO4lf+C/XjK/nvzEqQB744moC6V128RucQd1jA=="], + "assert-never": ["assert-never@1.4.0", "", {}, ""], - "babel-walk": ["babel-walk@3.0.0-canary-5", "", { "dependencies": { "@babel/types": "^7.9.6" } }, "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw=="], + "babel-walk": ["babel-walk@3.0.0-canary-5", "", { "dependencies": { "@babel/types": "^7.9.6" } }, ""], - "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "badgen": ["badgen@3.3.2", "", {}, "sha512-fbQwK9norfdzbdsoPwbLIAmgBXDGEme3jeIyqPAH7o6vp9lmuLHS7uXULvOiQ6XnMLkYNG4gDjILf74hgtTAug=="], - "better-path-resolve": ["better-path-resolve@1.0.0", "", { "dependencies": { "is-windows": "^1.0.0" } }, "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g=="], + "balanced-match": ["balanced-match@1.0.2", "", {}, ""], - "blamer": ["blamer@1.0.7", "", { "dependencies": { "execa": "^4.0.0", "which": "^2.0.2" } }, "sha512-GbBStl/EVlSWkiJQBZps3H1iARBrC7vt++Jb/TTmCNu/jZ04VW7tSN1nScbFXBUy1AN+jzeL7Zep9sbQxLhXKA=="], + "better-path-resolve": ["better-path-resolve@1.0.0", "", { "dependencies": { "is-windows": "^1.0.0" } }, ""], - "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + "blamer": ["blamer@1.0.7", "", { "dependencies": { "execa": "^4.0.0", "which": "^2.0.2" } }, ""], - "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + "brace-expansion": ["brace-expansion@1.1.18", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw=="], - "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, ""], - "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + "bytes": ["bytes@3.1.2", "", {}, ""], - "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, ""], - "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, ""], - "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + "callsites": ["callsites@3.1.0", "", {}, ""], - "character-parser": ["character-parser@2.2.0", "", { "dependencies": { "is-regex": "^1.0.3" } }, "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw=="], + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, ""], - "chardet": ["chardet@2.1.1", "", {}, "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ=="], + "character-parser": ["character-parser@2.2.0", "", { "dependencies": { "is-regex": "^1.0.3" } }, ""], - "ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="], + "chardet": ["chardet@2.1.1", "", {}, ""], - "cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="], + "cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, ""], - "cli-table3": ["cli-table3@0.6.5", "", { "dependencies": { "string-width": "^4.2.0" }, "optionalDependencies": { "@colors/colors": "1.5.0" } }, "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ=="], + "cli-table3": ["cli-table3@0.6.5", "", { "dependencies": { "string-width": "^4.2.0" }, "optionalDependencies": { "@colors/colors": "1.5.0" } }, ""], - "cli-truncate": ["cli-truncate@5.1.1", "", { "dependencies": { "slice-ansi": "^7.1.0", "string-width": "^8.0.0" } }, "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A=="], + "cli-truncate": ["cli-truncate@5.1.1", "", { "dependencies": { "slice-ansi": "^7.1.0", "string-width": "^8.0.0" } }, ""], - "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, ""], - "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + "color-name": ["color-name@1.1.4", "", {}, ""], - "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], + "colorette": ["colorette@2.0.20", "", {}, ""], - "colors": ["colors@1.4.0", "", {}, "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA=="], + "colors": ["colors@1.4.0", "", {}, ""], - "commander": ["commander@5.1.0", "", {}, "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg=="], + "commander": ["commander@15.0.0", "", {}, "sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg=="], - "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + "concat-map": ["concat-map@0.0.1", "", {}, ""], - "constantinople": ["constantinople@4.0.1", "", { "dependencies": { "@babel/parser": "^7.6.0", "@babel/types": "^7.6.1" } }, "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw=="], + "constantinople": ["constantinople@4.0.1", "", { "dependencies": { "@babel/parser": "^7.6.0", "@babel/types": "^7.6.1" } }, ""], - "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, ""], - "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, ""], - "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], + "deep-is": ["deep-is@0.1.4", "", {}, ""], "dejavu-fonts-ttf": ["dejavu-fonts-ttf@2.37.3", "", {}, "sha512-f1hd7jJbeQa1VWcw+K2KrTXS50zTMaHpVC4XIKJpNcDeYR5ajMtj/iLlQDYNvLOKamUB3ARVVCf79lNwNVztSQ=="], - "detect-indent": ["detect-indent@6.1.0", "", {}, "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA=="], + "detect-indent": ["detect-indent@6.1.0", "", {}, ""], - "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="], + "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, ""], - "doctypes": ["doctypes@1.1.0", "", {}, "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ=="], + "doctypes": ["doctypes@1.1.0", "", {}, ""], - "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, ""], - "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + "emoji-regex": ["emoji-regex@8.0.0", "", {}, ""], - "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="], + "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, ""], - "enquirer": ["enquirer@2.4.1", "", { "dependencies": { "ansi-colors": "^4.1.1", "strip-ansi": "^6.0.1" } }, "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ=="], + "enquirer": ["enquirer@2.4.1", "", { "dependencies": { "ansi-colors": "^4.1.1", "strip-ansi": "^6.0.1" } }, ""], - "environment": ["environment@1.1.0", "", {}, "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q=="], + "environment": ["environment@1.1.0", "", {}, ""], - "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + "es-define-property": ["es-define-property@1.0.1", "", {}, ""], - "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + "es-errors": ["es-errors@1.3.0", "", {}, ""], - "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, ""], - "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, ""], - "eslint": ["eslint@9.39.2", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.1", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.39.2", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw=="], + "eslint": ["eslint@9.39.5", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.6", "@eslint/js": "9.39.5", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw=="], - "eslint-config-prettier": ["eslint-config-prettier@10.1.8", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w=="], + "eslint-config-prettier": ["eslint-config-prettier@10.1.8", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": "bin/cli.js" }, ""], - "eslint-plugin-prettier": ["eslint-plugin-prettier@5.5.4", "", { "dependencies": { "prettier-linter-helpers": "^1.0.0", "synckit": "^0.11.7" }, "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", "prettier": ">=3.0.0" }, "optionalPeers": ["@types/eslint", "eslint-config-prettier"] }, "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg=="], + "eslint-plugin-prettier": ["eslint-plugin-prettier@5.5.6", "", { "dependencies": { "prettier-linter-helpers": "^1.0.1", "synckit": "^0.11.13" }, "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", "prettier": ">=3.0.0" }, "optionalPeers": ["@types/eslint", "eslint-config-prettier"] }, "sha512-ifetmTcxWfz+4qRW3pH/ujdTq2jQIj59AxJMIN26K5avYgU8dxycUETQonWiW+wPrYXA0j3Try0l1CnwVQtDqQ=="], - "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, ""], - "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, ""], - "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, ""], - "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" } }, ""], - "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], + "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, ""], - "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], + "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, ""], - "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + "estraverse": ["estraverse@5.3.0", "", {}, ""], - "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + "esutils": ["esutils@2.0.3", "", {}, ""], - "eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], + "eventemitter3": ["eventemitter3@5.0.1", "", {}, ""], - "execa": ["execa@4.1.0", "", { "dependencies": { "cross-spawn": "^7.0.0", "get-stream": "^5.0.0", "human-signals": "^1.1.1", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.0", "onetime": "^5.1.0", "signal-exit": "^3.0.2", "strip-final-newline": "^2.0.0" } }, "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA=="], + "execa": ["execa@4.1.0", "", { "dependencies": { "cross-spawn": "^7.0.0", "get-stream": "^5.0.0", "human-signals": "^1.1.1", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.0", "onetime": "^5.1.0", "signal-exit": "^3.0.2", "strip-final-newline": "^2.0.0" } }, ""], - "extendable-error": ["extendable-error@0.1.7", "", {}, "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg=="], + "extendable-error": ["extendable-error@0.1.7", "", {}, ""], - "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, ""], - "fast-diff": ["fast-diff@1.3.0", "", {}, "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw=="], + "fast-diff": ["fast-diff@1.3.0", "", {}, ""], - "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, ""], - "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, ""], - "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], + "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, ""], - "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], + "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, ""], - "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], + "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, ""], - "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, ""], - "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], + "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, ""], - "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], + "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, ""], - "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], + "flatted": ["flatted@3.4.4", "", {}, "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q=="], "fontverter": ["fontverter@2.0.0", "", { "dependencies": { "wawoff2": "^2.0.0", "woff2sfnt-sfnt2woff": "^1.0.0" } }, "sha512-DFVX5hvXuhi1Jven1tbpebYTCT9XYnvx6/Z+HFUPb7ZRMCW+pj2clU9VMhoTPgWKPhAs7JJDSk3CW1jNUvKCZQ=="], - "fs-extra": ["fs-extra@7.0.1", "", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw=="], + "fs-extra": ["fs-extra@7.0.1", "", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, ""], - "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + "function-bind": ["function-bind@1.1.2", "", {}, ""], - "get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="], + "get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, ""], - "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, ""], - "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, ""], - "get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="], + "get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, ""], "gifenc": ["gifenc@1.0.3", "", {}, "sha512-xdr6AdrfGBcfzncONUOlXMBuc5wJDtOueE3c5rdG0oNgtINLD+f2iFZltrBRZYzACRbKr+mSVU/x98zv2u3jmw=="], - "gitignore-to-glob": ["gitignore-to-glob@0.3.0", "", {}, "sha512-mk74BdnK7lIwDHnotHddx1wsjMOFIThpLY3cPNniJ/2fA/tlLzHnFxIdR+4sLOu5KGgQJdij4kjJ2RoUNnCNMA=="], - - "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, ""], - "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + "globals": ["globals@14.0.0", "", {}, ""], - "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], + "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, ""], - "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + "gopd": ["gopd@1.2.0", "", {}, ""], - "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + "graceful-fs": ["graceful-fs@4.2.11", "", {}, ""], "harfbuzzjs": ["harfbuzzjs@0.10.3", "", {}, "sha512-GJnLUrgLMadlMYrBGEXwYEimObbysy3prWT4HyPpFQERvgTU/OZ+ReUlEPOum6w4RBtFXzXiCCmECOr4sz3qwQ=="], - "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - - "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], - - "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + "has-flag": ["has-flag@4.0.0", "", {}, ""], - "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + "has-symbols": ["has-symbols@1.1.0", "", {}, ""], - "human-id": ["human-id@4.1.3", "", { "bin": { "human-id": "dist/cli.js" } }, "sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q=="], + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, ""], - "human-signals": ["human-signals@1.1.1", "", {}, "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw=="], + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, ""], - "husky": ["husky@9.1.7", "", { "bin": { "husky": "bin.js" } }, "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA=="], + "human-id": ["human-id@4.1.3", "", { "bin": "dist/cli.js" }, ""], - "iconv-lite": ["iconv-lite@0.7.1", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw=="], + "human-signals": ["human-signals@1.1.1", "", {}, ""], - "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "husky": ["husky@9.1.7", "", { "bin": "bin.js" }, ""], - "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + "iconv-lite": ["iconv-lite@0.7.1", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, ""], - "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + "ignore": ["ignore@5.3.2", "", {}, ""], - "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, ""], - "is-expression": ["is-expression@4.0.0", "", { "dependencies": { "acorn": "^7.1.1", "object-assign": "^4.1.1" } }, "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A=="], + "imurmurhash": ["imurmurhash@0.1.4", "", {}, ""], - "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, ""], - "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + "is-expression": ["is-expression@4.0.0", "", { "dependencies": { "acorn": "^7.1.1", "object-assign": "^4.1.1" } }, ""], - "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + "is-extglob": ["is-extglob@2.1.1", "", {}, ""], - "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, ""], - "is-promise": ["is-promise@2.2.2", "", {}, "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="], + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, ""], - "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], + "is-number": ["is-number@7.0.0", "", {}, ""], - "is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], + "is-promise": ["is-promise@2.2.2", "", {}, ""], - "is-subdir": ["is-subdir@1.2.0", "", { "dependencies": { "better-path-resolve": "1.0.0" } }, "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw=="], + "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, ""], - "is-windows": ["is-windows@1.0.2", "", {}, "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="], + "is-stream": ["is-stream@2.0.1", "", {}, ""], - "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + "is-subdir": ["is-subdir@1.2.0", "", { "dependencies": { "better-path-resolve": "1.0.0" } }, ""], - "js-stringify": ["js-stringify@1.0.2", "", {}, "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g=="], + "is-windows": ["is-windows@1.0.2", "", {}, ""], - "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], + "isexe": ["isexe@2.0.0", "", {}, ""], - "jscpd": ["jscpd@4.0.5", "", { "dependencies": { "@jscpd/core": "4.0.1", "@jscpd/finder": "4.0.1", "@jscpd/html-reporter": "4.0.1", "@jscpd/tokenizer": "4.0.1", "colors": "^1.4.0", "commander": "^5.0.0", "fs-extra": "^11.2.0", "gitignore-to-glob": "^0.3.0", "jscpd-sarif-reporter": "4.0.3" }, "bin": { "jscpd": "bin/jscpd" } }, "sha512-AzJlSLvKtXYkQm93DKE1cRN3rf6pkpv3fm5TVuvECwoqljQlCM/56ujHn9xPcE7wyUnH5+yHr7tcTiveIoMBoQ=="], + "js-stringify": ["js-stringify@1.0.2", "", {}, ""], - "jscpd-sarif-reporter": ["jscpd-sarif-reporter@4.0.3", "", { "dependencies": { "colors": "^1.4.0", "fs-extra": "^11.2.0", "node-sarif-builder": "^2.0.3" } }, "sha512-0T7KiWiDIVArvlBkvCorn2NFwQe7p7DJ37o4YFRuPLDpcr1jNHQlEfbFPw8hDdgJ4hpfby6A5YwyHqASKJ7drA=="], + "js-yaml": ["js-yaml@4.3.2", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": "bin/js-yaml.js" }, "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA=="], - "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + "jscpd": ["jscpd@4.3.0", "", { "dependencies": { "@jscpd/badge-reporter": "4.2.5", "@jscpd/core": "4.2.5", "@jscpd/finder": "4.3.0", "@jscpd/html-reporter": "4.2.5", "@jscpd/tokenizer": "4.2.6", "colors": "^1.4.0", "commander": "^15.0.0", "fs-extra": "^11.3.6", "jscpd-sarif-reporter": "4.2.5" }, "bin": { "jscpd": "bin/jscpd" } }, "sha512-yUqcHy/USHvzFamS6Loo49MCSW0Dc+4RL6ELH+Un9o2/jRSQbs9+a5hjfFceV2d3Zgv1opv5PXJ0eZ3fEQdjkg=="], - "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "jscpd-sarif-reporter": ["jscpd-sarif-reporter@4.2.5", "", { "dependencies": { "colors": "^1.4.0", "fs-extra": "^11.2.0", "node-sarif-builder": "^4.1.0" } }, "sha512-O8LcM9grAS5yO5x1Q0yegYaYcUX//IEBEyvzGFSYCeo1YzHbMnAI6EK7oTrwD+7Csjvfg9m8B8G7OOxzcSlr9w=="], - "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], + "json-buffer": ["json-buffer@3.0.1", "", {}, ""], - "jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], + "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, ""], - "jstransformer": ["jstransformer@1.0.0", "", { "dependencies": { "is-promise": "^2.0.0", "promise": "^7.0.1" } }, "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A=="], + "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, ""], - "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + "jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, ""], - "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + "jstransformer": ["jstransformer@1.0.0", "", { "dependencies": { "is-promise": "^2.0.0", "promise": "^7.0.1" } }, ""], - "lint-staged": ["lint-staged@16.2.7", "", { "dependencies": { "commander": "^14.0.2", "listr2": "^9.0.5", "micromatch": "^4.0.8", "nano-spawn": "^2.0.0", "pidtree": "^0.6.0", "string-argv": "^0.3.2", "yaml": "^2.8.1" }, "bin": { "lint-staged": "bin/lint-staged.js" } }, "sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow=="], + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, ""], - "listr2": ["listr2@9.0.5", "", { "dependencies": { "cli-truncate": "^5.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.1.0", "rfdc": "^1.4.1", "wrap-ansi": "^9.0.0" } }, "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g=="], + "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, ""], - "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + "lint-staged": ["lint-staged@16.4.0", "", { "dependencies": { "commander": "^14.0.3", "listr2": "^9.0.5", "picomatch": "^4.0.3", "string-argv": "^0.3.2", "tinyexec": "^1.0.4", "yaml": "^2.8.2" }, "bin": { "lint-staged": "bin/lint-staged.js" } }, "sha512-lBWt8hujh/Cjysw5GYVmZpFHXDCgZzhrOm8vbcUdobADZNOK/bRshr2kM3DfgrrtR1DQhfupW9gnIXOfiFi+bw=="], - "lodash": ["lodash@4.18.1", "", {}, "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q=="], + "listr2": ["listr2@9.0.5", "", { "dependencies": { "cli-truncate": "^5.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.1.0", "rfdc": "^1.4.1", "wrap-ansi": "^9.0.0" } }, ""], - "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, ""], - "lodash.startcase": ["lodash.startcase@4.4.0", "", {}, "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg=="], + "lodash.merge": ["lodash.merge@4.6.2", "", {}, ""], - "log-update": ["log-update@6.1.0", "", { "dependencies": { "ansi-escapes": "^7.0.0", "cli-cursor": "^5.0.0", "slice-ansi": "^7.1.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w=="], + "lodash.startcase": ["lodash.startcase@4.4.0", "", {}, ""], - "markdown-table": ["markdown-table@2.0.0", "", { "dependencies": { "repeat-string": "^1.0.0" } }, "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A=="], + "log-update": ["log-update@6.1.0", "", { "dependencies": { "ansi-escapes": "^7.0.0", "cli-cursor": "^5.0.0", "slice-ansi": "^7.1.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, ""], - "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + "markdown-table": ["markdown-table@2.0.0", "", { "dependencies": { "repeat-string": "^1.0.0" } }, ""], - "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, ""], - "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + "merge-stream": ["merge-stream@2.0.0", "", {}, ""], - "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + "merge2": ["merge2@1.4.1", "", {}, ""], - "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, ""], - "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="], + "mimic-fn": ["mimic-fn@2.1.0", "", {}, ""], - "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + "mimic-function": ["mimic-function@5.0.1", "", {}, ""], - "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], + "minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], - "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + "mri": ["mri@1.2.0", "", {}, ""], - "nano-spawn": ["nano-spawn@2.0.0", "", {}, "sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw=="], + "ms": ["ms@2.1.3", "", {}, ""], - "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + "natural-compare": ["natural-compare@1.4.0", "", {}, ""], "node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="], - "node-pty": ["node-pty@1.2.0-beta.14", "", { "dependencies": { "node-addon-api": "^7.1.0" } }, "sha512-XORU9BQgpxVgqr7WivjJ17mLenOHUgKKWzuZZNaw3NDYgHc/wPJQMSaoLDrpEgqV6aU1nNwil1o/OqYj6lWmUA=="], + "node-pty": ["node-pty@1.2.0-beta.15", "", { "dependencies": { "node-addon-api": "^7.1.0" } }, "sha512-vORSzHXi4Ofl7HemVWpuudLqCPdaQb4LfpRCUpE5HPxhp4JYscl8zZwxh11p26v2wvW24WMwnMfLjhRLixrfxA=="], - "node-sarif-builder": ["node-sarif-builder@2.0.3", "", { "dependencies": { "@types/sarif": "^2.1.4", "fs-extra": "^10.0.0" } }, "sha512-Pzr3rol8fvhG/oJjIq2NTVB0vmdNNlz22FENhhPojYRZ4/ee08CfK4YuKmuL54V9MLhI1kpzxfOJ/63LzmZzDg=="], + "node-sarif-builder": ["node-sarif-builder@4.1.0", "", { "dependencies": { "@types/sarif": "^2.1.7", "fs-extra": "^11.1.1" } }, "sha512-IWqZF6u0EI/07HTBm+zZ+MgXgWl09dnSJRGaDCPBSlOqilDcx6pj3Mpb3HvPN8V2Gr+ISw7ZrMsL7STWs1F++w=="], - "npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="], + "npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, ""], - "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + "object-assign": ["object-assign@4.1.1", "", {}, ""], - "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, ""], - "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], + "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, ""], - "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], + "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, ""], - "outdent": ["outdent@0.5.0", "", {}, "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q=="], + "outdent": ["outdent@0.5.0", "", {}, ""], - "p-filter": ["p-filter@2.1.0", "", { "dependencies": { "p-map": "^2.0.0" } }, "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw=="], + "p-filter": ["p-filter@2.1.0", "", { "dependencies": { "p-map": "^2.0.0" } }, ""], - "p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, ""], - "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, ""], - "p-map": ["p-map@2.1.0", "", {}, "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw=="], + "p-map": ["p-map@2.1.0", "", {}, ""], - "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], + "p-try": ["p-try@2.2.0", "", {}, ""], - "package-manager-detector": ["package-manager-detector@0.2.11", "", { "dependencies": { "quansync": "^0.2.7" } }, "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ=="], + "package-manager-detector": ["package-manager-detector@0.2.11", "", { "dependencies": { "quansync": "^0.2.7" } }, ""], "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], - "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, ""], - "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + "path-exists": ["path-exists@4.0.0", "", {}, ""], - "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + "path-key": ["path-key@3.1.1", "", {}, ""], - "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + "path-parse": ["path-parse@1.0.7", "", {}, ""], - "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], + "path-type": ["path-type@4.0.0", "", {}, ""], - "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + "picocolors": ["picocolors@1.1.1", "", {}, ""], - "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "picomatch": ["picomatch@4.0.7", "", {}, "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA=="], - "pidtree": ["pidtree@0.6.0", "", { "bin": { "pidtree": "bin/pidtree.js" } }, "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g=="], + "pify": ["pify@4.0.1", "", {}, ""], - "pify": ["pify@4.0.1", "", {}, "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="], + "prelude-ls": ["prelude-ls@1.2.1", "", {}, ""], - "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], + "prettier": ["prettier@3.9.6", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g=="], - "prettier": ["prettier@3.7.4", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA=="], + "prettier-linter-helpers": ["prettier-linter-helpers@1.0.1", "", { "dependencies": { "fast-diff": "^1.1.2" } }, "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg=="], - "prettier-linter-helpers": ["prettier-linter-helpers@1.0.0", "", { "dependencies": { "fast-diff": "^1.1.2" } }, "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w=="], + "promise": ["promise@7.3.1", "", { "dependencies": { "asap": "~2.0.3" } }, ""], - "promise": ["promise@7.3.1", "", { "dependencies": { "asap": "~2.0.3" } }, "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg=="], + "pug": ["pug@3.0.4", "", { "dependencies": { "pug-code-gen": "^3.0.4", "pug-filters": "^4.0.0", "pug-lexer": "^5.0.1", "pug-linker": "^4.0.0", "pug-load": "^3.0.0", "pug-parser": "^6.0.0", "pug-runtime": "^3.0.1", "pug-strip-comments": "^2.0.0" } }, "sha512-kFfq5mMzrS7+wrl5pLJzZEzemx34OQ0w4SARfhy/3yxTlhbstsudDwJzhf1hP02yHzbjoVMSXUj/Sz6RNfMyXg=="], - "pug": ["pug@3.0.3", "", { "dependencies": { "pug-code-gen": "^3.0.3", "pug-filters": "^4.0.0", "pug-lexer": "^5.0.1", "pug-linker": "^4.0.0", "pug-load": "^3.0.0", "pug-parser": "^6.0.0", "pug-runtime": "^3.0.1", "pug-strip-comments": "^2.0.0" } }, "sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g=="], + "pug-attrs": ["pug-attrs@3.0.0", "", { "dependencies": { "constantinople": "^4.0.1", "js-stringify": "^1.0.2", "pug-runtime": "^3.0.0" } }, ""], - "pug-attrs": ["pug-attrs@3.0.0", "", { "dependencies": { "constantinople": "^4.0.1", "js-stringify": "^1.0.2", "pug-runtime": "^3.0.0" } }, "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA=="], + "pug-code-gen": ["pug-code-gen@3.0.4", "", { "dependencies": { "constantinople": "^4.0.1", "doctypes": "^1.1.0", "js-stringify": "^1.0.2", "pug-attrs": "^3.0.0", "pug-error": "^2.1.0", "pug-runtime": "^3.0.1", "void-elements": "^3.1.0", "with": "^7.0.0" } }, "sha512-6okWYIKdasTyXICyEtvobmTZAVX57JkzgzIi4iRJlin8kmhG+Xry2dsus+Mun/nGCn6F2U49haHI5mkELXB14g=="], - "pug-code-gen": ["pug-code-gen@3.0.3", "", { "dependencies": { "constantinople": "^4.0.1", "doctypes": "^1.1.0", "js-stringify": "^1.0.2", "pug-attrs": "^3.0.0", "pug-error": "^2.1.0", "pug-runtime": "^3.0.1", "void-elements": "^3.1.0", "with": "^7.0.0" } }, "sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw=="], + "pug-error": ["pug-error@2.1.0", "", {}, ""], - "pug-error": ["pug-error@2.1.0", "", {}, "sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg=="], + "pug-filters": ["pug-filters@4.0.0", "", { "dependencies": { "constantinople": "^4.0.1", "jstransformer": "1.0.0", "pug-error": "^2.0.0", "pug-walk": "^2.0.0", "resolve": "^1.15.1" } }, ""], - "pug-filters": ["pug-filters@4.0.0", "", { "dependencies": { "constantinople": "^4.0.1", "jstransformer": "1.0.0", "pug-error": "^2.0.0", "pug-walk": "^2.0.0", "resolve": "^1.15.1" } }, "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A=="], + "pug-lexer": ["pug-lexer@5.0.1", "", { "dependencies": { "character-parser": "^2.2.0", "is-expression": "^4.0.0", "pug-error": "^2.0.0" } }, ""], - "pug-lexer": ["pug-lexer@5.0.1", "", { "dependencies": { "character-parser": "^2.2.0", "is-expression": "^4.0.0", "pug-error": "^2.0.0" } }, "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w=="], + "pug-linker": ["pug-linker@4.0.0", "", { "dependencies": { "pug-error": "^2.0.0", "pug-walk": "^2.0.0" } }, ""], - "pug-linker": ["pug-linker@4.0.0", "", { "dependencies": { "pug-error": "^2.0.0", "pug-walk": "^2.0.0" } }, "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw=="], + "pug-load": ["pug-load@3.0.0", "", { "dependencies": { "object-assign": "^4.1.1", "pug-walk": "^2.0.0" } }, ""], - "pug-load": ["pug-load@3.0.0", "", { "dependencies": { "object-assign": "^4.1.1", "pug-walk": "^2.0.0" } }, "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ=="], + "pug-parser": ["pug-parser@6.0.0", "", { "dependencies": { "pug-error": "^2.0.0", "token-stream": "1.0.0" } }, ""], - "pug-parser": ["pug-parser@6.0.0", "", { "dependencies": { "pug-error": "^2.0.0", "token-stream": "1.0.0" } }, "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw=="], + "pug-runtime": ["pug-runtime@3.0.1", "", {}, ""], - "pug-runtime": ["pug-runtime@3.0.1", "", {}, "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg=="], + "pug-strip-comments": ["pug-strip-comments@2.0.0", "", { "dependencies": { "pug-error": "^2.0.0" } }, ""], - "pug-strip-comments": ["pug-strip-comments@2.0.0", "", { "dependencies": { "pug-error": "^2.0.0" } }, "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ=="], + "pug-walk": ["pug-walk@2.0.0", "", {}, ""], - "pug-walk": ["pug-walk@2.0.0", "", {}, "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ=="], + "pump": ["pump@3.0.3", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, ""], - "pump": ["pump@3.0.3", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA=="], + "punycode": ["punycode@2.3.1", "", {}, ""], - "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + "quansync": ["quansync@0.2.11", "", {}, ""], - "quansync": ["quansync@0.2.11", "", {}, "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA=="], + "queue-microtask": ["queue-microtask@1.2.3", "", {}, ""], - "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + "read-yaml-file": ["read-yaml-file@1.1.0", "", { "dependencies": { "graceful-fs": "^4.1.5", "js-yaml": "^3.6.1", "pify": "^4.0.1", "strip-bom": "^3.0.0" } }, ""], - "read-yaml-file": ["read-yaml-file@1.1.0", "", { "dependencies": { "graceful-fs": "^4.1.5", "js-yaml": "^3.6.1", "pify": "^4.0.1", "strip-bom": "^3.0.0" } }, "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA=="], + "repeat-string": ["repeat-string@1.6.1", "", {}, ""], - "repeat-string": ["repeat-string@1.6.1", "", {}, "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w=="], + "resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": "bin/resolve" }, ""], - "reprism": ["reprism@0.0.11", "", {}, "sha512-VsxDR5QxZo08M/3nRypNlScw5r3rKeSOPdU/QhDmu3Ai3BJxHn/qgfXGWQp/tAxUtzwYNo9W6997JZR0tPLZsA=="], + "resolve-from": ["resolve-from@5.0.0", "", {}, ""], - "resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], + "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, ""], - "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], + "reusify": ["reusify@1.1.0", "", {}, ""], - "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], + "rfdc": ["rfdc@1.4.1", "", {}, ""], - "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, ""], - "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="], + "safer-buffer": ["safer-buffer@2.1.2", "", {}, ""], - "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + "semver": ["semver@7.7.3", "", { "bin": "bin/semver.js" }, ""], - "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, ""], - "semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], + "shebang-regex": ["shebang-regex@3.0.0", "", {}, ""], - "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + "signal-exit": ["signal-exit@4.1.0", "", {}, ""], - "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + "slash": ["slash@3.0.0", "", {}, ""], - "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + "slice-ansi": ["slice-ansi@7.1.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, ""], - "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], + "spark-md5": ["spark-md5@3.0.2", "", {}, ""], - "slice-ansi": ["slice-ansi@7.1.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w=="], + "spawndamnit": ["spawndamnit@3.0.1", "", { "dependencies": { "cross-spawn": "^7.0.5", "signal-exit": "^4.0.1" } }, ""], - "spark-md5": ["spark-md5@3.0.2", "", {}, "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw=="], + "sprintf-js": ["sprintf-js@1.0.3", "", {}, ""], - "spawndamnit": ["spawndamnit@3.0.1", "", { "dependencies": { "cross-spawn": "^7.0.5", "signal-exit": "^4.0.1" } }, "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg=="], + "string-argv": ["string-argv@0.3.2", "", {}, ""], - "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, ""], - "string-argv": ["string-argv@0.3.2", "", {}, "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q=="], + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, ""], - "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + "strip-bom": ["strip-bom@3.0.0", "", {}, ""], - "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, ""], - "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, ""], - "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], + "subset-font": ["subset-font@2.7.0", "", { "dependencies": { "fontverter": "^2.0.0", "harfbuzzjs": "^0.10.3", "p-limit": "^3.1.0" } }, "sha512-KoBEshkhodCspvR8DweQFkxRB0OxLmXiWV49y8O5fksD9gf/qBK8gcLwUOlGP4ktm55t2Ot0gLRsVQLT4391QQ=="], - "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, ""], - "subset-font": ["subset-font@2.5.0", "", { "dependencies": { "fontverter": "^2.0.0", "harfbuzzjs": "^0.10.3", "lodash": "^4.17.21", "p-limit": "^3.1.0" } }, "sha512-Vsa8ngQ/ohhUj0an7on49y9jLZ2rK5U+T1FzPM4/ZQY0xUy5mLis6BfFtPGzecTjFgYXQlvY7FlsJF4t3R/6Ug=="], + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, ""], - "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "synckit": ["synckit@0.11.13", "", { "dependencies": { "@pkgr/core": "^0.3.6" } }, "sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg=="], - "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + "term-size": ["term-size@2.2.1", "", {}, ""], - "synckit": ["synckit@0.11.11", "", { "dependencies": { "@pkgr/core": "^0.2.9" } }, "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw=="], + "tinyexec": ["tinyexec@1.3.1", "", {}, "sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA=="], - "term-size": ["term-size@2.2.1", "", {}, "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg=="], + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, ""], - "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + "token-stream": ["token-stream@1.0.0", "", {}, ""], - "token-stream": ["token-stream@1.0.0", "", {}, "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg=="], + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, ""], - "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], + "universalify": ["universalify@0.1.2", "", {}, ""], - "universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, ""], - "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], - - "void-elements": ["void-elements@3.1.0", "", {}, "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w=="], + "void-elements": ["void-elements@3.1.0", "", {}, ""], "wawoff2": ["wawoff2@2.0.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "woff2_compress.js": "bin/woff2_compress.js", "woff2_decompress.js": "bin/woff2_decompress.js" } }, "sha512-r0CEmvpH63r4T15ebFqeOjGqU4+EgTx4I510NtK35EMciSdcTxCw3Byy3JnBonz7iyIFZ0AbVo0bbFpEVuhCYA=="], - "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" } }, ""], - "with": ["with@7.0.2", "", { "dependencies": { "@babel/parser": "^7.9.6", "@babel/types": "^7.9.6", "assert-never": "^1.2.1", "babel-walk": "3.0.0-canary-5" } }, "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w=="], + "with": ["with@7.0.2", "", { "dependencies": { "@babel/parser": "^7.9.6", "@babel/types": "^7.9.6", "assert-never": "^1.2.1", "babel-walk": "3.0.0-canary-5" } }, ""], "woff2sfnt-sfnt2woff": ["woff2sfnt-sfnt2woff@1.0.0", "", { "dependencies": { "pako": "^1.0.7" } }, "sha512-edK4COc1c1EpRfMqCZO1xJOvdUtM5dbVb9iz97rScvnTevqEB3GllnLWCmMVp1MfQBdF1DFg/11I0rSyAdS4qQ=="], - "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], + "word-wrap": ["word-wrap@1.2.5", "", {}, ""], + + "wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, ""], + + "wrappy": ["wrappy@1.0.2", "", {}, ""], + + "yaml": ["yaml@2.9.0", "", { "bin": "bin.mjs" }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="], - "wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], + "yocto-queue": ["yocto-queue@0.1.0", "", {}, ""], - "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + "@changesets/apply-release-plan/prettier": ["prettier@2.8.8", "", { "bin": "bin-prettier.js" }, ""], - "yaml": ["yaml@2.8.2", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A=="], + "@changesets/write/prettier": ["prettier@2.8.8", "", { "bin": "bin-prettier.js" }, ""], - "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, ""], - "@changesets/apply-release-plan/prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="], + "@jscpd/badge-reporter/fs-extra": ["fs-extra@11.4.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA=="], - "@changesets/write/prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="], + "@jscpd/finder/fs-extra": ["fs-extra@11.4.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA=="], - "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + "@jscpd/html-reporter/fs-extra": ["fs-extra@11.4.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA=="], - "@jscpd/finder/fs-extra": ["fs-extra@11.3.3", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg=="], + "@manypkg/find-root/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, ""], - "@jscpd/html-reporter/fs-extra": ["fs-extra@11.3.3", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg=="], + "@manypkg/find-root/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, ""], - "@manypkg/find-root/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], + "@manypkg/get-packages/@changesets/types": ["@changesets/types@4.1.0", "", {}, ""], - "@manypkg/find-root/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], + "@manypkg/get-packages/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, ""], - "@manypkg/get-packages/@changesets/types": ["@changesets/types@4.1.0", "", {}, "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw=="], + "cli-truncate/string-width": ["string-width@8.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.0", "strip-ansi": "^7.1.0" } }, ""], - "@manypkg/get-packages/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], + "execa/signal-exit": ["signal-exit@3.0.7", "", {}, ""], - "cli-truncate/string-width": ["string-width@8.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.0", "strip-ansi": "^7.1.0" } }, "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg=="], + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, ""], - "execa/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + "import-fresh/resolve-from": ["resolve-from@4.0.0", "", {}, ""], - "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + "is-expression/acorn": ["acorn@7.4.1", "", { "bin": "bin/acorn" }, ""], - "import-fresh/resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + "jscpd/fs-extra": ["fs-extra@11.4.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA=="], - "is-expression/acorn": ["acorn@7.4.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="], + "jscpd-sarif-reporter/fs-extra": ["fs-extra@11.4.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA=="], - "jscpd/fs-extra": ["fs-extra@11.3.3", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg=="], + "lint-staged/commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="], - "jscpd-sarif-reporter/fs-extra": ["fs-extra@11.3.3", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg=="], + "log-update/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, ""], - "lint-staged/commander": ["commander@14.0.2", "", {}, "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ=="], + "micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], - "log-update/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "node-sarif-builder/fs-extra": ["fs-extra@11.4.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA=="], - "node-sarif-builder/fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], + "read-yaml-file/js-yaml": ["js-yaml@3.15.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": "bin/js-yaml.js" }, "sha512-6EuL879VkRA+1Cz578mKMiKvjPNEuk6+r1JaFzoSWejZmtf7xWbIyw1e3KkxlkzTIt9Taw6JBhEppG7utc1P+w=="], - "p-locate/p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + "restore-cursor/onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, ""], - "read-yaml-file/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="], + "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, ""], - "restore-cursor/onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="], + "slice-ansi/is-fullwidth-code-point": ["is-fullwidth-code-point@5.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.1" } }, ""], - "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, ""], - "slice-ansi/is-fullwidth-code-point": ["is-fullwidth-code-point@5.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.1" } }, "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ=="], + "wrap-ansi/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, ""], - "subset-font/p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + "wrap-ansi/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, ""], - "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "@jscpd/badge-reporter/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, ""], - "wrap-ansi/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + "@jscpd/badge-reporter/fs-extra/universalify": ["universalify@2.0.1", "", {}, ""], - "wrap-ansi/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "@jscpd/finder/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, ""], - "@jscpd/finder/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], + "@jscpd/finder/fs-extra/universalify": ["universalify@2.0.1", "", {}, ""], - "@jscpd/finder/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], + "@jscpd/html-reporter/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, ""], - "@jscpd/html-reporter/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], + "@jscpd/html-reporter/fs-extra/universalify": ["universalify@2.0.1", "", {}, ""], - "@jscpd/html-reporter/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], + "@manypkg/find-root/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, ""], - "@manypkg/find-root/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], + "cli-truncate/string-width/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, ""], - "cli-truncate/string-width/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "jscpd-sarif-reporter/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, ""], - "jscpd-sarif-reporter/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], + "jscpd-sarif-reporter/fs-extra/universalify": ["universalify@2.0.1", "", {}, ""], - "jscpd-sarif-reporter/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], + "jscpd/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, ""], - "jscpd/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], + "jscpd/fs-extra/universalify": ["universalify@2.0.1", "", {}, ""], - "jscpd/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], + "log-update/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, ""], - "log-update/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + "node-sarif-builder/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, ""], - "node-sarif-builder/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], + "node-sarif-builder/fs-extra/universalify": ["universalify@2.0.1", "", {}, ""], - "node-sarif-builder/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], + "read-yaml-file/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, ""], - "read-yaml-file/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + "wrap-ansi/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, ""], - "wrap-ansi/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], + "wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, ""], - "wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + "@manypkg/find-root/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, ""], - "@manypkg/find-root/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], + "cli-truncate/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, ""], - "cli-truncate/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + "@manypkg/find-root/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, ""], } } diff --git a/js/package-lock.json b/js/package-lock.json index ab18677..ce1349b 100644 --- a/js/package-lock.json +++ b/js/package-lock.json @@ -12,19 +12,19 @@ "@resvg/resvg-js": "^2.6.2", "@xterm/headless": "^6.0.0", "gifenc": "^1.0.3", - "node-pty": "^1.2.0-beta.14" + "node-pty": "^1.2.0-beta.15" }, "devDependencies": { - "@changesets/cli": "^2.29.7", + "@changesets/cli": "^2.31.1", "dejavu-fonts-ttf": "^2.37.3", - "eslint": "^9.38.0", + "eslint": "^9.39.5", "eslint-config-prettier": "^10.1.8", - "eslint-plugin-prettier": "^5.5.4", + "eslint-plugin-prettier": "^5.5.6", "husky": "^9.1.7", - "jscpd": "^4.0.5", - "lint-staged": "^16.2.6", - "prettier": "^3.6.2", - "subset-font": "^2.5.0" + "jscpd": "^4.3.0", + "lint-staged": "^16.4.0", + "prettier": "^3.9.6", + "subset-font": "^2.7.0" }, "engines": { "bun": ">=1.0.0", @@ -82,11 +82,11 @@ } }, "node_modules/@changesets/apply-release-plan": { - "version": "7.0.14", + "version": "7.1.1", "dev": true, "license": "MIT", "dependencies": { - "@changesets/config": "^3.1.2", + "@changesets/config": "^3.1.4", "@changesets/get-version-range-type": "^0.4.0", "@changesets/git": "^3.0.4", "@changesets/should-skip-package": "^0.1.2", @@ -116,12 +116,12 @@ } }, "node_modules/@changesets/assemble-release-plan": { - "version": "6.0.9", + "version": "6.0.10", "dev": true, "license": "MIT", "dependencies": { "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.1.3", + "@changesets/get-dependents-graph": "^2.1.4", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", @@ -137,32 +137,30 @@ } }, "node_modules/@changesets/cli": { - "version": "2.29.8", + "version": "2.31.1", "dev": true, "license": "MIT", "dependencies": { - "@changesets/apply-release-plan": "^7.0.14", - "@changesets/assemble-release-plan": "^6.0.9", + "@changesets/apply-release-plan": "^7.1.1", + "@changesets/assemble-release-plan": "^6.0.10", "@changesets/changelog-git": "^0.2.1", - "@changesets/config": "^3.1.2", + "@changesets/config": "^3.1.4", "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.1.3", - "@changesets/get-release-plan": "^4.0.14", + "@changesets/get-dependents-graph": "^2.1.4", + "@changesets/get-release-plan": "^4.0.16", "@changesets/git": "^3.0.4", "@changesets/logger": "^0.1.1", "@changesets/pre": "^2.0.2", - "@changesets/read": "^0.6.6", + "@changesets/read": "^0.6.7", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@changesets/write": "^0.4.0", "@inquirer/external-editor": "^1.0.2", "@manypkg/get-packages": "^1.1.3", "ansi-colors": "^4.1.3", - "ci-info": "^3.7.0", "enquirer": "^2.4.1", "fs-extra": "^7.0.1", "mri": "^1.2.0", - "p-limit": "^2.2.0", "package-manager-detector": "^0.2.0", "picocolors": "^1.1.0", "resolve-from": "^5.0.0", @@ -175,13 +173,14 @@ } }, "node_modules/@changesets/config": { - "version": "3.1.2", + "version": "3.1.4", "dev": true, "license": "MIT", "dependencies": { "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.1.3", + "@changesets/get-dependents-graph": "^2.1.4", "@changesets/logger": "^0.1.1", + "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "fs-extra": "^7.0.1", @@ -197,7 +196,7 @@ } }, "node_modules/@changesets/get-dependents-graph": { - "version": "2.1.3", + "version": "2.1.4", "dev": true, "license": "MIT", "dependencies": { @@ -208,14 +207,14 @@ } }, "node_modules/@changesets/get-release-plan": { - "version": "4.0.14", + "version": "4.0.16", "dev": true, "license": "MIT", "dependencies": { - "@changesets/assemble-release-plan": "^6.0.9", - "@changesets/config": "^3.1.2", + "@changesets/assemble-release-plan": "^6.0.10", + "@changesets/config": "^3.1.4", "@changesets/pre": "^2.0.2", - "@changesets/read": "^0.6.6", + "@changesets/read": "^0.6.7", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3" } @@ -246,7 +245,7 @@ } }, "node_modules/@changesets/parse": { - "version": "0.4.2", + "version": "0.4.3", "dev": true, "license": "MIT", "dependencies": { @@ -266,13 +265,13 @@ } }, "node_modules/@changesets/read": { - "version": "0.6.6", + "version": "0.6.7", "dev": true, "license": "MIT", "dependencies": { "@changesets/git": "^3.0.4", "@changesets/logger": "^0.1.1", - "@changesets/parse": "^0.4.2", + "@changesets/parse": "^0.4.3", "@changesets/types": "^6.1.0", "fs-extra": "^7.0.1", "p-filter": "^2.1.0", @@ -364,13 +363,13 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.21.1", + "version": "0.21.2", "dev": true, "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", - "minimatch": "^3.1.2" + "minimatch": "^3.1.5" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -399,18 +398,18 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.3", + "version": "3.3.7", "dev": true, "license": "MIT", "dependencies": { - "ajv": "^6.12.4", + "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.1", - "minimatch": "^3.1.2", + "js-yaml": "^4.3.2", + "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" }, "engines": { @@ -421,7 +420,7 @@ } }, "node_modules/@eslint/js": { - "version": "9.39.2", + "version": "9.39.5", "dev": true, "license": "MIT", "engines": { @@ -452,25 +451,37 @@ } }, "node_modules/@humanfs/core": { - "version": "0.19.1", + "version": "0.19.2", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, "engines": { "node": ">=18.18.0" } }, "node_modules/@humanfs/node": { - "version": "0.16.7", + "version": "0.16.8", "dev": true, "license": "Apache-2.0", "dependencies": { - "@humanfs/core": "^0.19.1", + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "dev": true, @@ -515,8 +526,50 @@ } } }, + "node_modules/@jscpd/badge-reporter": { + "version": "4.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "badgen": "^3.2.3", + "colors": "^1.4.0", + "fs-extra": "^11.2.0" + } + }, + "node_modules/@jscpd/badge-reporter/node_modules/fs-extra": { + "version": "11.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@jscpd/badge-reporter/node_modules/fs-extra/node_modules/jsonfile": { + "version": "6.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@jscpd/badge-reporter/node_modules/fs-extra/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/@jscpd/core": { - "version": "4.0.1", + "version": "4.2.5", "dev": true, "license": "MIT", "dependencies": { @@ -524,24 +577,24 @@ } }, "node_modules/@jscpd/finder": { - "version": "4.0.1", + "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { - "@jscpd/core": "4.0.1", - "@jscpd/tokenizer": "4.0.1", + "@jscpd/core": "4.2.5", + "@jscpd/tokenizer": "4.2.6", "blamer": "^1.0.6", "bytes": "^3.1.2", "cli-table3": "^0.6.5", "colors": "^1.4.0", "fast-glob": "^3.3.2", - "fs-extra": "^11.2.0", + "fs-extra": "^11.3.6", "markdown-table": "^2.0.0", - "pug": "^3.0.3" + "pug": "^3.0.4" } }, "node_modules/@jscpd/finder/node_modules/fs-extra": { - "version": "11.3.3", + "version": "11.4.0", "dev": true, "license": "MIT", "dependencies": { @@ -573,17 +626,17 @@ } }, "node_modules/@jscpd/html-reporter": { - "version": "4.0.1", + "version": "4.2.5", "dev": true, "license": "MIT", "dependencies": { "colors": "1.4.0", "fs-extra": "^11.2.0", - "pug": "^3.0.3" + "pug": "^3.0.4" } }, "node_modules/@jscpd/html-reporter/node_modules/fs-extra": { - "version": "11.3.3", + "version": "11.4.0", "dev": true, "license": "MIT", "dependencies": { @@ -615,12 +668,11 @@ } }, "node_modules/@jscpd/tokenizer": { - "version": "4.0.1", + "version": "4.2.6", "dev": true, "license": "MIT", "dependencies": { - "@jscpd/core": "4.0.1", - "reprism": "^0.0.11", + "@jscpd/core": "4.2.5", "spark-md5": "^3.0.2" } }, @@ -676,6 +728,20 @@ "node": ">=8" } }, + "node_modules/@manypkg/find-root/node_modules/find-up/node_modules/locate-path/node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@manypkg/find-root/node_modules/fs-extra": { "version": "8.1.0", "dev": true, @@ -753,11 +819,11 @@ } }, "node_modules/@pkgr/core": { - "version": "0.2.9", + "version": "0.3.6", "dev": true, "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + "node": "^14.18.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/pkgr" @@ -765,8 +831,6 @@ }, "node_modules/@resvg/resvg-js": { "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js/-/resvg-js-2.6.2.tgz", - "integrity": "sha512-xBaJish5OeGmniDj9cW5PRa/PtmuVU3ziqrbr5xJj901ZDN4TosrVaNZpEiLZAxdfnhAe7uQ7QFWfjPe9d9K2Q==", "license": "MPL-2.0", "engines": { "node": ">= 10" @@ -906,8 +970,6 @@ }, "node_modules/@resvg/resvg-js-linux-x64-gnu": { "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-x64-gnu/-/resvg-js-linux-x64-gnu-2.6.2.tgz", - "integrity": "sha512-IVUe+ckIerA7xMZ50duAZzwf1U7khQe2E0QpUxu5MBJNao5RqC0zwV/Zm965vw6D3gGFUl7j4m+oJjubBVoftw==", "cpu": [ "x64" ], @@ -925,8 +987,6 @@ }, "node_modules/@resvg/resvg-js-linux-x64-musl": { "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-x64-musl/-/resvg-js-linux-x64-musl-2.6.2.tgz", - "integrity": "sha512-UOf83vqTzoYQO9SZ0fPl2ZIFtNIz/Rr/y+7X8XRX1ZnBYsQ/tTb+cj9TE+KHOdmlTFBxhYzVkP2lRByCzqi4jQ==", "cpu": [ "x64" ], @@ -1007,8 +1067,6 @@ }, "node_modules/@xterm/headless": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@xterm/headless/-/headless-6.0.0.tgz", - "integrity": "sha512-5Yj1QINYCyzrZtf8OFIHi47iQtI+0qYFPHmouEfG8dHNxbZ9Tb9YGSuLcsEwj9Z+OL75GJqPyJbyoFer80a2Hw==", "license": "MIT", "workspaces": [ "addons/*" @@ -1034,7 +1092,7 @@ } }, "node_modules/ajv": { - "version": "6.12.6", + "version": "6.15.0", "dev": true, "license": "MIT", "dependencies": { @@ -1126,6 +1184,11 @@ "node": ">= 10.0.0" } }, + "node_modules/badgen": { + "version": "3.3.2", + "dev": true, + "license": "MIT" + }, "node_modules/balanced-match": { "version": "1.0.2", "dev": true, @@ -1155,7 +1218,7 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.18", "dev": true, "license": "MIT", "dependencies": { @@ -1245,20 +1308,6 @@ "dev": true, "license": "MIT" }, - "node_modules/ci-info": { - "version": "3.9.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/cli-cursor": { "version": "5.0.0", "dev": true, @@ -1372,11 +1421,11 @@ } }, "node_modules/commander": { - "version": "5.1.0", + "version": "15.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">= 6" + "node": ">=22.12.0" } }, "node_modules/concat-map": { @@ -1429,8 +1478,6 @@ }, "node_modules/dejavu-fonts-ttf": { "version": "2.37.3", - "resolved": "https://registry.npmjs.org/dejavu-fonts-ttf/-/dejavu-fonts-ttf-2.37.3.tgz", - "integrity": "sha512-f1hd7jJbeQa1VWcw+K2KrTXS50zTMaHpVC4XIKJpNcDeYR5ajMtj/iLlQDYNvLOKamUB3ARVVCf79lNwNVztSQ==", "dev": true, "license": "SEE LICENSE IN README.md AND LICENSE" }, @@ -1546,23 +1593,23 @@ } }, "node_modules/eslint": { - "version": "9.39.2", + "version": "9.39.5", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", + "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.2", + "@eslint/eslintrc": "^3.3.6", + "@eslint/js": "9.39.5", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "ajv": "^6.12.4", + "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", @@ -1581,7 +1628,7 @@ "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", + "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, @@ -1618,12 +1665,12 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.5.4", + "version": "5.5.6", "dev": true, "license": "MIT", "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.11.7" + "prettier-linter-helpers": "^1.0.1", + "synckit": "^0.11.13" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -1879,14 +1926,14 @@ } }, "node_modules/flatted": { - "version": "3.3.3", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", "dev": true, "license": "ISC" }, "node_modules/fontverter": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fontverter/-/fontverter-2.0.0.tgz", - "integrity": "sha512-DFVX5hvXuhi1Jven1tbpebYTCT9XYnvx6/Z+HFUPb7ZRMCW+pj2clU9VMhoTPgWKPhAs7JJDSk3CW1jNUvKCZQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -1977,18 +2024,8 @@ }, "node_modules/gifenc": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/gifenc/-/gifenc-1.0.3.tgz", - "integrity": "sha512-xdr6AdrfGBcfzncONUOlXMBuc5wJDtOueE3c5rdG0oNgtINLD+f2iFZltrBRZYzACRbKr+mSVU/x98zv2u3jmw==", "license": "MIT" }, - "node_modules/gitignore-to-glob": { - "version": "0.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.4 <5 || >=6.9" - } - }, "node_modules/glob-parent": { "version": "6.0.2", "dev": true, @@ -2048,8 +2085,6 @@ }, "node_modules/harfbuzzjs": { "version": "0.10.3", - "resolved": "https://registry.npmjs.org/harfbuzzjs/-/harfbuzzjs-0.10.3.tgz", - "integrity": "sha512-GJnLUrgLMadlMYrBGEXwYEimObbysy3prWT4HyPpFQERvgTU/OZ+ReUlEPOum6w4RBtFXzXiCCmECOr4sz3qwQ==", "dev": true, "license": "MIT" }, @@ -2313,8 +2348,18 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.1", + "version": "4.3.2", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -2324,36 +2369,36 @@ } }, "node_modules/jscpd": { - "version": "4.0.5", + "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { - "@jscpd/core": "4.0.1", - "@jscpd/finder": "4.0.1", - "@jscpd/html-reporter": "4.0.1", - "@jscpd/tokenizer": "4.0.1", + "@jscpd/badge-reporter": "4.2.5", + "@jscpd/core": "4.2.5", + "@jscpd/finder": "4.3.0", + "@jscpd/html-reporter": "4.2.5", + "@jscpd/tokenizer": "4.2.6", "colors": "^1.4.0", - "commander": "^5.0.0", - "fs-extra": "^11.2.0", - "gitignore-to-glob": "^0.3.0", - "jscpd-sarif-reporter": "4.0.3" + "commander": "^15.0.0", + "fs-extra": "^11.3.6", + "jscpd-sarif-reporter": "4.2.5" }, "bin": { "jscpd": "bin/jscpd" } }, "node_modules/jscpd-sarif-reporter": { - "version": "4.0.3", + "version": "4.2.5", "dev": true, "license": "MIT", "dependencies": { "colors": "^1.4.0", "fs-extra": "^11.2.0", - "node-sarif-builder": "^2.0.3" + "node-sarif-builder": "^4.1.0" } }, "node_modules/jscpd-sarif-reporter/node_modules/fs-extra": { - "version": "11.3.3", + "version": "11.4.0", "dev": true, "license": "MIT", "dependencies": { @@ -2385,7 +2430,7 @@ } }, "node_modules/jscpd/node_modules/fs-extra": { - "version": "11.3.3", + "version": "11.4.0", "dev": true, "license": "MIT", "dependencies": { @@ -2469,17 +2514,16 @@ } }, "node_modules/lint-staged": { - "version": "16.2.7", + "version": "16.4.0", "dev": true, "license": "MIT", "dependencies": { - "commander": "^14.0.2", + "commander": "^14.0.3", "listr2": "^9.0.5", - "micromatch": "^4.0.8", - "nano-spawn": "^2.0.0", - "pidtree": "^0.6.0", + "picomatch": "^4.0.3", "string-argv": "^0.3.2", - "yaml": "^2.8.1" + "tinyexec": "^1.0.4", + "yaml": "^2.8.2" }, "bin": { "lint-staged": "bin/lint-staged.js" @@ -2492,7 +2536,7 @@ } }, "node_modules/lint-staged/node_modules/commander": { - "version": "14.0.2", + "version": "14.0.3", "dev": true, "license": "MIT", "engines": { @@ -2529,13 +2573,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", - "dev": true, - "license": "MIT" - }, "node_modules/lodash.merge": { "version": "4.6.2", "dev": true, @@ -2634,6 +2671,17 @@ "node": ">=8.6" } }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/mimic-fn": { "version": "2.1.0", "dev": true, @@ -2654,7 +2702,7 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", + "version": "3.1.5", "dev": true, "license": "ISC", "dependencies": { @@ -2677,17 +2725,6 @@ "dev": true, "license": "MIT" }, - "node_modules/nano-spawn": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/nano-spawn?sponsor=1" - } - }, "node_modules/natural-compare": { "version": "1.4.0", "dev": true, @@ -2695,14 +2732,10 @@ }, "node_modules/node-addon-api": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", "license": "MIT" }, "node_modules/node-pty": { - "version": "1.2.0-beta.14", - "resolved": "https://registry.npmjs.org/node-pty/-/node-pty-1.2.0-beta.14.tgz", - "integrity": "sha512-XORU9BQgpxVgqr7WivjJ17mLenOHUgKKWzuZZNaw3NDYgHc/wPJQMSaoLDrpEgqV6aU1nNwil1o/OqYj6lWmUA==", + "version": "1.2.0-beta.15", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -2710,19 +2743,19 @@ } }, "node_modules/node-sarif-builder": { - "version": "2.0.3", + "version": "4.1.0", "dev": true, "license": "MIT", "dependencies": { - "@types/sarif": "^2.1.4", - "fs-extra": "^10.0.0" + "@types/sarif": "^2.1.7", + "fs-extra": "^11.1.1" }, "engines": { - "node": ">=14" + "node": ">=20" } }, "node_modules/node-sarif-builder/node_modules/fs-extra": { - "version": "10.1.0", + "version": "11.4.0", "dev": true, "license": "MIT", "dependencies": { @@ -2731,7 +2764,7 @@ "universalify": "^2.0.0" }, "engines": { - "node": ">=12" + "node": ">=14.14" } }, "node_modules/node-sarif-builder/node_modules/fs-extra/node_modules/jsonfile": { @@ -2827,14 +2860,14 @@ } }, "node_modules/p-limit": { - "version": "2.3.0", + "version": "3.1.0", "dev": true, "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2894,8 +2927,6 @@ }, "node_modules/pako": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true, "license": "(MIT AND Zlib)" }, @@ -2945,27 +2976,16 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", + "version": "4.0.7", "dev": true, "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pidtree": { - "version": "0.6.0", - "dev": true, - "license": "MIT", - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/pify": { "version": "4.0.1", "dev": true, @@ -2983,7 +3003,7 @@ } }, "node_modules/prettier": { - "version": "3.7.4", + "version": "3.9.6", "dev": true, "license": "MIT", "bin": { @@ -2997,7 +3017,7 @@ } }, "node_modules/prettier-linter-helpers": { - "version": "1.0.0", + "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { @@ -3016,11 +3036,11 @@ } }, "node_modules/pug": { - "version": "3.0.3", + "version": "3.0.4", "dev": true, "license": "MIT", "dependencies": { - "pug-code-gen": "^3.0.3", + "pug-code-gen": "^3.0.4", "pug-filters": "^4.0.0", "pug-lexer": "^5.0.1", "pug-linker": "^4.0.0", @@ -3041,7 +3061,7 @@ } }, "node_modules/pug-code-gen": { - "version": "3.0.3", + "version": "3.0.4", "dev": true, "license": "MIT", "dependencies": { @@ -3192,8 +3212,18 @@ "node": ">=6" } }, + "node_modules/read-yaml-file/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, "node_modules/read-yaml-file/node_modules/js-yaml": { - "version": "3.14.2", + "version": "3.15.2", "dev": true, "license": "MIT", "dependencies": { @@ -3204,14 +3234,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/read-yaml-file/node_modules/js-yaml/node_modules/argparse": { - "version": "1.0.10", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, "node_modules/repeat-string": { "version": "1.6.1", "dev": true, @@ -3220,11 +3242,6 @@ "node": ">=0.10" } }, - "node_modules/reprism": { - "version": "0.0.11", - "dev": true, - "license": "MIT" - }, "node_modules/resolve": { "version": "1.22.11", "dev": true, @@ -3490,34 +3507,15 @@ } }, "node_modules/subset-font": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/subset-font/-/subset-font-2.5.0.tgz", - "integrity": "sha512-Vsa8ngQ/ohhUj0an7on49y9jLZ2rK5U+T1FzPM4/ZQY0xUy5mLis6BfFtPGzecTjFgYXQlvY7FlsJF4t3R/6Ug==", + "version": "2.7.0", "dev": true, "license": "BSD-3-Clause", "dependencies": { "fontverter": "^2.0.0", "harfbuzzjs": "^0.10.3", - "lodash": "^4.17.21", "p-limit": "^3.1.0" } }, - "node_modules/subset-font/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/supports-color": { "version": "7.2.0", "dev": true, @@ -3541,11 +3539,11 @@ } }, "node_modules/synckit": { - "version": "0.11.11", + "version": "0.11.13", "dev": true, "license": "MIT", "dependencies": { - "@pkgr/core": "^0.2.9" + "@pkgr/core": "^0.3.6" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -3565,6 +3563,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/tinyexec": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "dev": true, @@ -3618,8 +3624,6 @@ }, "node_modules/wawoff2": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wawoff2/-/wawoff2-2.0.1.tgz", - "integrity": "sha512-r0CEmvpH63r4T15ebFqeOjGqU4+EgTx4I510NtK35EMciSdcTxCw3Byy3JnBonz7iyIFZ0AbVo0bbFpEVuhCYA==", "dev": true, "license": "MIT", "dependencies": { @@ -3660,8 +3664,6 @@ }, "node_modules/woff2sfnt-sfnt2woff": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/woff2sfnt-sfnt2woff/-/woff2sfnt-sfnt2woff-1.0.0.tgz", - "integrity": "sha512-edK4COc1c1EpRfMqCZO1xJOvdUtM5dbVb9iz97rScvnTevqEB3GllnLWCmMVp1MfQBdF1DFg/11I0rSyAdS4qQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3755,7 +3757,7 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.8.2", + "version": "2.9.0", "dev": true, "license": "ISC", "bin": { diff --git a/js/package.json b/js/package.json index 20a2688..c86c606 100644 --- a/js/package.json +++ b/js/package.json @@ -70,21 +70,21 @@ "examples/" ], "devDependencies": { - "@changesets/cli": "^2.29.7", + "@changesets/cli": "^2.31.1", "dejavu-fonts-ttf": "^2.37.3", - "eslint": "^9.38.0", + "eslint": "^9.39.5", "eslint-config-prettier": "^10.1.8", - "eslint-plugin-prettier": "^5.5.4", + "eslint-plugin-prettier": "^5.5.6", "husky": "^9.1.7", - "jscpd": "^4.0.5", - "lint-staged": "^16.2.6", - "prettier": "^3.6.2", - "subset-font": "^2.5.0" + "jscpd": "^4.3.0", + "lint-staged": "^16.4.0", + "prettier": "^3.9.6", + "subset-font": "^2.7.0" }, "dependencies": { "@resvg/resvg-js": "^2.6.2", "@xterm/headless": "^6.0.0", "gifenc": "^1.0.3", - "node-pty": "^1.2.0-beta.14" + "node-pty": "^1.2.0-beta.15" } } diff --git a/js/src/terminal-artifacts.mjs b/js/src/terminal-artifacts.mjs index e29d7d8..a0558b7 100644 --- a/js/src/terminal-artifacts.mjs +++ b/js/src/terminal-artifacts.mjs @@ -157,7 +157,7 @@ const isBlankCell = (cell) => (cell.chars || ' ').trim() === ''; const coalesceRow = (cells, options) => { const runs = []; - for (let column = 0; column < cells.length; ) { + for (let column = 0; column < cells.length;) { const cell = cells[column]; if (cell.width === 0) { column += 1; @@ -257,7 +257,7 @@ const renderFrame = (frame, options) => { const backgrounds = []; const foregrounds = []; rows.forEach((cells, row) => { - for (let column = 0; column < cells.length; ) { + for (let column = 0; column < cells.length;) { const first = cells[column]; const background = cellStyle(first, options).bg; let width = Math.max(first.width, 1); From bd6946cf16fac3998f299309dd750d27fcb7e9df Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 4 Sep 2026 22:20:06 +0000 Subject: [PATCH 11/34] feat(ci): audit the dependency trees and analyse the sources CI ran lint, tests and release. Nothing read a lockfile for known vulnerabilities and nothing analysed the sources statically, so a green build carried no security signal at all (issue #199) -- and the audits were not clean: npm reported 5 high advisories, bun 13, and cargo one (RUSTSEC-2026-0007, integer overflow in `BytesMut::reserve`, bytes 1.11.0). The JavaScript side is fixed in the preceding commit; bytes moves to 1.12.1 here, after which `cargo audit --file Cargo.lock` exits 0 and clippy and `cargo test` stay green. security.yml merges the two pipeline templates' security workflows, because this repository ships a package from each of them: - CodeQL over javascript-typescript, rust and actions. `build-mode: none` for all three -- none of them need compiling to extract, and asking CodeQL to autobuild the crate would repeat what rust.yml already does. - dependency-review on pull requests, failing at high severity. - npm, bun and cargo audits of the committed lockfiles. Both JavaScript lockfiles are audited rather than one: they resolve transitive versions independently, and while fixing this issue they disagreed by 8 high-severity advisories. The audits also run weekly. An advisory is published against code that has not changed, so change-triggered runs alone would hide it until the next commit. `isWriterJob` in the hygiene test now keys on `contents: write` alone. dependency-review holds `pull-requests: write` only to post its summary comment; treating that as a writer would have parked every pull request in main's non-cancellable release queue. --- .github/workflows/security.yml | 153 +++++++++++++++++++++++++++++ js/tests/workflow-hygiene.test.mjs | 56 +++++++++-- rust/Cargo.lock | 4 +- 3 files changed, 205 insertions(+), 8 deletions(-) create mode 100644 .github/workflows/security.yml diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml new file mode 100644 index 0000000..3441a68 --- /dev/null +++ b/.github/workflows/security.yml @@ -0,0 +1,153 @@ +name: Security + +# Nothing in this repository read its own dependency tree for known +# vulnerabilities, and no static analysis ran over the sources at all, so a +# fully green build said nothing about either (issue #199). The audits below are +# the two pipeline templates' security workflows merged, because this repository +# ships both a JavaScript package and a Rust crate from the same tree: +# link-foundation/js-ai-driven-development-pipeline-template and +# link-foundation/rust-ai-driven-development-pipeline-template. + +on: + push: + branches: [main] + pull_request: + # Advisories are published against code that has not changed, so a + # change-triggered audit alone goes stale between releases. + schedule: + - cron: '0 6 * * 1' + workflow_dispatch: + +# Least-privilege default; the jobs that need more raise it themselves. +permissions: + contents: read + +# Concurrency is per job, matching js.yml and rust.yml. Every job here is +# read-only, so all of them are cancellable `check-*` groups. + +jobs: + codeql: + name: CodeQL (${{ matrix.language }}) + runs-on: ubuntu-latest + timeout-minutes: 30 + concurrency: + group: check-${{ github.workflow }}-${{ github.ref }}-codeql-${{ matrix.language }} + cancel-in-progress: true + permissions: + # Reading the workflow run is what lets CodeQL attribute results to it. + actions: read + contents: read + security-events: write + strategy: + fail-fast: false + matrix: + # `actions` analyses the workflows in this directory, which is where the + # findings fixed for #199 lived. + language: [javascript-typescript, rust, actions] + steps: + - uses: actions/checkout@v6 + with: + # Analysis reads the tree; it never pushes. + persist-credentials: false + + - name: Initialize CodeQL + uses: github/codeql-action/init@v4 + with: + languages: ${{ matrix.language }} + # All three languages here are extracted without compiling, so there + # is no autobuild step: asking CodeQL to build the crate would spend + # several minutes reproducing what the rust workflow already does. + build-mode: none + + - name: Analyze + uses: github/codeql-action/analyze@v4 + + dependency-review: + name: Dependency Review + # Reviews the diff of a pull request; there is no diff to review on push. + if: ${{ github.event_name == 'pull_request' }} + runs-on: ubuntu-latest + timeout-minutes: 10 + concurrency: + group: check-${{ github.workflow }}-${{ github.ref }}-dependency-review + cancel-in-progress: true + permissions: + contents: read + # Only used to post the summary comment below, never to push. + pull-requests: write + steps: + - uses: actions/checkout@v6 + with: + persist-credentials: false + + - name: Review dependency changes + uses: actions/dependency-review-action@v5 + with: + fail-on-severity: high + comment-summary-in-pr: on-failure + + npm-audit: + name: Audit npm lockfile + runs-on: ubuntu-latest + timeout-minutes: 10 + concurrency: + group: check-${{ github.workflow }}-${{ github.ref }}-npm-audit + cancel-in-progress: true + steps: + - uses: actions/checkout@v6 + with: + persist-credentials: false + + - uses: actions/setup-node@v6 + with: + node-version: 24 + + # --package-lock-only audits what is committed, without installing it, so + # the result describes the lockfile a consumer would resolve rather than + # whatever the runner happened to fetch. + - name: Audit the committed package-lock.json + working-directory: js + run: npm audit --package-lock-only --audit-level=high + + bun-audit: + name: Audit bun lockfile + runs-on: ubuntu-latest + timeout-minutes: 10 + concurrency: + group: check-${{ github.workflow }}-${{ github.ref }}-bun-audit + cancel-in-progress: true + steps: + - uses: actions/checkout@v6 + with: + persist-credentials: false + + - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 + with: + bun-version: latest + + # bun.lock resolves versions independently of package-lock.json, so a + # clean npm audit does not imply a clean bun one: while fixing #199 the + # two lockfiles disagreed by 8 high-severity advisories. + - name: Audit the committed bun.lock + working-directory: js + run: bun audit --audit-level=high + + cargo-audit: + name: Audit Cargo lockfile + runs-on: ubuntu-latest + timeout-minutes: 10 + concurrency: + group: check-${{ github.workflow }}-${{ github.ref }}-cargo-audit + cancel-in-progress: true + steps: + - uses: actions/checkout@v6 + with: + persist-credentials: false + + - uses: taiki-e/install-action@e67fa11c4b9316fa714ddf0abed07a0c3143b95b # v2.87.4 + with: + tool: cargo-audit@0.22.2 + + - name: Audit the committed Cargo.lock + working-directory: rust + run: cargo audit --file Cargo.lock diff --git a/js/tests/workflow-hygiene.test.mjs b/js/tests/workflow-hygiene.test.mjs index b61075a..45a7469 100644 --- a/js/tests/workflow-hygiene.test.mjs +++ b/js/tests/workflow-hygiene.test.mjs @@ -21,11 +21,18 @@ const workflows = workflowFiles.map((name) => { return { name, text, doc: Bun.YAML.parse(text) }; }); -/** Jobs that push to main, publish a package, or open a PR. */ -const isWriterJob = (job) => { - const perms = job.permissions ?? {}; - return perms['contents'] === 'write' || perms['pull-requests'] === 'write'; -}; +/** + * Jobs that mutate the repository: push a commit or a tag to main, publish a + * package, or open a release pull request. These are the ones that must never + * be cancelled halfway. + * + * `contents: write` is the test, not `pull-requests: write`. A job can hold the + * latter alone and still change nothing that outlives the run -- the security + * workflow's dependency-review only uses it to leave a review comment -- and + * putting such a job in the shared non-cancellable group would serialise every + * pull request behind main's releases for no benefit. + */ +const isWriterJob = (job) => (job.permissions ?? {})['contents'] === 'write'; const WRITER_GROUP = 'main-writer-${{ github.repository }}-main'; @@ -34,8 +41,10 @@ describe('workflow files', () => { expect(workflowFiles).toContain('js.yml'); expect(workflowFiles).toContain('rust.yml'); expect(workflowFiles).toContain('parity.yml'); - // Added for #199: nothing linted the workflows themselves before. + // Added for #199: nothing linted the workflows themselves before, and + // nothing audited the dependency trees or analysed the sources. expect(workflowFiles).toContain('workflows.yml'); + expect(workflowFiles).toContain('security.yml'); }); test.each(workflows.map((w) => [w.name, w]))( @@ -249,3 +258,38 @@ describe('workflow linting is itself wired into CI', () => { expect(workflowFiles.length).toBeGreaterThanOrEqual(4); }); }); + +describe('every shipped ecosystem is audited', () => { + const security = workflows.find((w) => w.name === 'security.yml'); + const runs = Object.values(security.doc.jobs) + .flatMap((job) => job.steps ?? []) + .map((step) => step.run) + .filter(Boolean) + .join('\n'); + + test('both JavaScript lockfiles are audited, not just one', () => { + // package-lock.json and bun.lock resolve transitive versions + // independently, so one can be clean while the other is not: they differed + // by 8 high-severity advisories when this workflow was written. + expect(runs).toContain('npm audit --package-lock-only --audit-level=high'); + expect(runs).toContain('bun audit --audit-level=high'); + }); + + test('the Rust lockfile is audited', () => { + expect(runs).toContain('cargo audit --file Cargo.lock'); + }); + + test('CodeQL covers both languages and the workflows', () => { + const languages = security.doc.jobs.codeql.strategy.matrix.language; + expect(languages).toContain('javascript-typescript'); + expect(languages).toContain('rust'); + expect(languages).toContain('actions'); + }); + + test('the audits also run on a schedule', () => { + // A new advisory lands against code that has not changed, so the + // push/pull_request triggers alone would leave it unreported until the + // next commit. + expect(security.doc.on.schedule?.length).toBeGreaterThan(0); + }); +}); diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 2fc246c..4f78b2f 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -123,9 +123,9 @@ checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" [[package]] name = "bytes" -version = "1.11.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" [[package]] name = "cc" From 2d1b6f4e569bb0a1480886f9dbfc6aed819bf828 Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 4 Sep 2026 22:25:08 +0000 Subject: [PATCH 12/34] test(ci): pin the workflow-level-secrets invariant, record the jscpd repro rust.yml used to declare CARGO_REGISTRY_TOKEN in the workflow-level `env:`, which every job inherits -- including `lint`, `test`, `coverage` and `build`, all of which run on pull requests and compile code from the branch under review through build.rs, proc macros and the tests themselves. The token moved onto the two publishing jobs earlier on this branch; this asserts it stays there. Verified by reintroducing the declaration, which fails the new test, and restoring the file byte-identically. experiments/jscpd-format records the reproduction behind the duplication fix: jscpd's `format` option names languages, not reporters, so the previous `"format": "console"` matched no file, analysed nothing and passed a `threshold: 0`. The script builds two identical files and runs jscpd over them with each value -- 0 clones and exit 0 against 1 clone, 43.75% and exit 1. Both defects are also present upstream and reported there: link-foundation/rust-ai-driven-development-pipeline-template#149 and link-foundation/js-ai-driven-development-pipeline-template#157. --- experiments/jscpd-format/README.md | 30 ++++++++++++++++ experiments/jscpd-format/run.mjs | 57 ++++++++++++++++++++++++++++++ js/tests/workflow-hygiene.test.mjs | 16 +++++++++ 3 files changed, 103 insertions(+) create mode 100644 experiments/jscpd-format/README.md create mode 100644 experiments/jscpd-format/run.mjs diff --git a/experiments/jscpd-format/README.md b/experiments/jscpd-format/README.md new file mode 100644 index 0000000..016bf0f --- /dev/null +++ b/experiments/jscpd-format/README.md @@ -0,0 +1,30 @@ +# `"format": "console"` makes jscpd analyse zero files + +`jscpd`'s `format` option is the list of **languages** to analyse, not the list +of reporters β€” reporters are configured separately, under `reporters`. A +configuration that sets `"format": "console"` therefore asks jscpd to analyse a +language called `console`, which no file is written in, so the run finds nothing +and exits 0 no matter how much duplication the tree contains. + +`@jscpd/finder` selects files with `options.format.includes(format)`, where +`format` is the detected language of the file. `'console'.includes('javascript')` +is `false` for every real language, so every file is filtered out. + +## Reproduce + +``` +node run.mjs +``` + +The script writes two byte-identical JavaScript files into a temporary +directory and runs jscpd over them twice, with `threshold: 0`: + +- `"format": "console"` β€” no table is printed, no clone is found, exit code 0. +- `"format": ["javascript"]` β€” 1 clone, 43.75% duplication, exit code 1. + +## Where this mattered + +`js/.jscpd.json` in this repository carried the broken value, so +`bun run check:duplication` passed over a tree it never read (issue #199). The +same value is still present in +`link-foundation/js-ai-driven-development-pipeline-template`. diff --git a/experiments/jscpd-format/run.mjs b/experiments/jscpd-format/run.mjs new file mode 100644 index 0000000..0d08b07 --- /dev/null +++ b/experiments/jscpd-format/run.mjs @@ -0,0 +1,57 @@ +// Demonstrates that jscpd's `format` option names languages, not reporters: +// `"format": "console"` silently narrows the analysis to zero files. +import { mkdtempSync, writeFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { dirname, join, resolve } from 'node:path'; +import { spawnSync } from 'node:child_process'; +import { fileURLToPath } from 'node:url'; + +const here = dirname(fileURLToPath(import.meta.url)); +const jscpd = resolve(here, '..', '..', 'js', 'node_modules', '.bin', 'jscpd'); + +const work = mkdtempSync(join(tmpdir(), 'jscpd-format-')); +const duplicated = `export function alpha(list) { + const out = []; + for (const item of list) { + if (item == null) continue; + out.push(String(item).trim().toLowerCase()); + } + return out; +} +`; +writeFileSync(join(work, 'a.mjs'), duplicated); +writeFileSync(join(work, 'b.mjs'), duplicated); + +const base = { + threshold: 0, + minTokens: 30, + minLines: 5, + reporters: ['console'], +}; + +for (const [label, format] of [ + ['"format": "console"', 'console'], + ['"format": ["javascript"]', ['javascript']], +]) { + const configPath = join( + work, + `config-${Array.isArray(format) ? 'lang' : 'reporter'}.json` + ); + writeFileSync(configPath, JSON.stringify({ ...base, format })); + + const result = spawnSync(jscpd, ['-c', configPath, work], { + encoding: 'utf8', + }); + const found = /Found (\d+) clones/.exec(result.stdout ?? ''); + + console.log(`${label}`); + console.log(` exit code: ${result.status}`); + console.log(` clones found: ${found ? found[1] : 0}`); + console.log( + ` files analysed: ${/β”‚ javascript/.test(result.stdout ?? '') ? 2 : 0}` + ); +} + +console.log( + '\nWith threshold 0 and two identical files, only the second configuration fails.' +); diff --git a/js/tests/workflow-hygiene.test.mjs b/js/tests/workflow-hygiene.test.mjs index 45a7469..e07c598 100644 --- a/js/tests/workflow-hygiene.test.mjs +++ b/js/tests/workflow-hygiene.test.mjs @@ -56,6 +56,22 @@ describe('workflow files', () => { } ); + test.each(workflows.map((w) => [w.name, w]))( + '%s keeps secrets out of the workflow-level env block', + (_name, workflow) => { + // A workflow-level `env:` is inherited by every job, so declaring the + // crates.io token there handed it to `cargo test` and `cargo clippy` on + // pull requests -- both of which compile and run code from the branch + // under review, via build.rs, proc macros or the tests themselves. + // Publishing credentials belong on the jobs that publish. + for (const [key, value] of Object.entries(workflow.doc.env ?? {})) { + expect(`${key}: ${String(value).includes('secrets.')}`).toBe( + `${key}: false` + ); + } + } + ); + test.each(workflows.map((w) => [w.name, w]))( '%s uses !cancelled() rather than always()', (_name, workflow) => { From e08edebddd720d8bd39237e8b83521c5b28a139d Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 4 Sep 2026 22:30:43 +0000 Subject: [PATCH 13/34] fix(ci): scope the zizmor audit and degrade dependency review gracefully The Zizmor job failed with 30 findings in `release.yml`, a file this repository does not have. zizmorcore/zizmor-action defaults to auditing `.`, so it walked the whole tree and picked up the 14 verbatim copies of other repositories' workflows archived under docs/case-studies/**. Those never run here and editing them would falsify the evidence, so the audit is scoped to .github/workflows and the scope is pinned by a test. Dependency review failed with "Dependency review is not supported on this repository": the dependency graph is off and cannot be enabled from a workflow. A check that can only ever be red teaches reviewers to ignore red, so the job now probes the compare endpoint and skips with a warning on 403, fails on any other status, and starts reviewing on its own once an admin enables the graph. --- .github/workflows/security.yml | 34 ++++++++++++++++++++++++++++++ .github/workflows/workflows.yml | 7 ++++++ js/tests/workflow-hygiene.test.mjs | 5 +++++ 3 files changed, 46 insertions(+) diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml index 3441a68..5d7fa4c 100644 --- a/.github/workflows/security.yml +++ b/.github/workflows/security.yml @@ -80,7 +80,41 @@ jobs: with: persist-credentials: false + # actions/dependency-review-action fails with "Dependency review is not + # supported on this repository" when the dependency graph is off, which is + # the state this repository is in: the graph is disabled at the + # organisation level and cannot be turned on from a workflow. Shipping a + # check that can only ever be red trains reviewers to ignore red, so probe + # for the feature and skip with a warning when it is missing. Any other + # HTTP status is still a hard failure, and the job starts reviewing by + # itself the moment an admin enables the graph under + # Settings -> Code security -> Dependency graph. + - name: Check whether the dependency graph is enabled + id: graph + env: + GH_TOKEN: ${{ github.token }} + REPOSITORY: ${{ github.repository }} + BASE_SHA: ${{ github.event.pull_request.base.sha }} + HEAD_SHA: ${{ github.event.pull_request.head.sha }} + run: | + set -uo pipefail + code="$(curl -sS -o /dev/null -w '%{http_code}' \ + -H "Authorization: Bearer $GH_TOKEN" \ + -H 'Accept: application/vnd.github+json' \ + "$GITHUB_API_URL/repos/$REPOSITORY/dependency-graph/compare/$BASE_SHA...$HEAD_SHA")" + echo "Dependency graph compare endpoint answered HTTP $code" + if [ "$code" = '200' ]; then + echo 'enabled=true' >> "$GITHUB_OUTPUT" + elif [ "$code" = '403' ]; then + echo 'enabled=false' >> "$GITHUB_OUTPUT" + echo "::warning::Dependency graph is disabled for $REPOSITORY, so dependency review cannot run. The npm, bun and cargo audit jobs still check the committed lockfiles. Enable the graph under Settings -> Code security to restore per-pull-request review." + else + echo "::error::Unexpected HTTP $code from the dependency-graph compare endpoint" + exit 1 + fi + - name: Review dependency changes + if: ${{ steps.graph.outputs.enabled == 'true' }} uses: actions/dependency-review-action@v5 with: fail-on-severity: high diff --git a/.github/workflows/workflows.yml b/.github/workflows/workflows.yml index 63fcc9d..53068d4 100644 --- a/.github/workflows/workflows.yml +++ b/.github/workflows/workflows.yml @@ -67,3 +67,10 @@ jobs: annotations: true config: .github/zizmor.yml min-confidence: medium + # Audit the workflows this repository runs, not every workflow file + # in the tree. The action's default input is `.`, which also collects + # docs/case-studies/**/templates/** -- verbatim archived copies of + # other repositories' workflows, kept as evidence and deliberately not + # edited. Auditing those reported 30 findings in files that never run + # here and that a fix would falsify. + inputs: .github/workflows diff --git a/js/tests/workflow-hygiene.test.mjs b/js/tests/workflow-hygiene.test.mjs index e07c598..1b1e52f 100644 --- a/js/tests/workflow-hygiene.test.mjs +++ b/js/tests/workflow-hygiene.test.mjs @@ -253,6 +253,11 @@ describe('workflow linting is itself wired into CI', () => { .find((s) => (s.uses ?? '').startsWith('zizmorcore/zizmor-action@')); expect(step.with.config).toBe('.github/zizmor.yml'); expect(String(step.with['min-confidence'])).toBe('medium'); + // The action's default input is `.`, which walks the whole tree and picks up + // docs/case-studies/**/templates/**: verbatim archived copies of other + // repositories' workflows, kept as evidence. Auditing those reported 30 + // findings in files that never run here and that a fix would falsify. + expect(step.with.inputs).toBe('.github/workflows'); }); test('the zizmor policy requires hash pins by default', () => { From a00126b7ad1a978591a8ce1a42b59e7ee191391f Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 4 Sep 2026 22:31:19 +0000 Subject: [PATCH 14/34] chore(release): add the changeset and changelog fragment for issue #199 Both release gates require an entry describing what ships. The JavaScript change is the dependency refresh that cleared the npm and bun audit findings; the Rust change is the bytes bump that cleared RUSTSEC-2026-0007, plus the warning backlog fixed when clippy started denying warnings. --- js/.changeset/ci-audit-and-lint-coverage.md | 5 +++++ .../20260904_223000_ci-warnings-and-audit.md | 13 +++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 js/.changeset/ci-audit-and-lint-coverage.md create mode 100644 rust/changelog.d/20260904_223000_ci-warnings-and-audit.md diff --git a/js/.changeset/ci-audit-and-lint-coverage.md b/js/.changeset/ci-audit-and-lint-coverage.md new file mode 100644 index 0000000..8612d5f --- /dev/null +++ b/js/.changeset/ci-audit-and-lint-coverage.md @@ -0,0 +1,5 @@ +--- +'command-stream': patch +--- + +Update the development toolchain (eslint, prettier, jscpd, lint-staged, changesets, node-pty, subset-font) to versions with no outstanding npm or bun audit findings, and reformat `terminal-artifacts.mjs` for prettier 3.9. No runtime behaviour changes. diff --git a/rust/changelog.d/20260904_223000_ci-warnings-and-audit.md b/rust/changelog.d/20260904_223000_ci-warnings-and-audit.md new file mode 100644 index 0000000..c4b9569 --- /dev/null +++ b/rust/changelog.d/20260904_223000_ci-warnings-and-audit.md @@ -0,0 +1,13 @@ +--- +bump: patch +--- + +### Fixed + +- `bytes` bumped to 1.12.1, clearing RUSTSEC-2026-0007 (integer overflow in `BytesMut::reserve`). The advisory went unnoticed because nothing in the pipeline audited the lockfile; `cargo audit` now runs on every push, pull request and weekly. +- `ls` no longer computes a file type character it never used, and iterates directory entries with `.flatten()` instead of matching on each `Result`. + +### Changed + +- The Rust pipeline denies warnings: `RUSTFLAGS`/`RUSTDOCFLAGS` are `-Dwarnings`, clippy runs with `-- -D warnings`, and `cargo doc --no-deps` gates the rustdoc-only lints. Clippy previously printed 15 warnings and exited 0. `Cargo.toml` forbids `unsafe_code` and warns on `clippy::all`. +- `CommandContext::cwd` is covered by tests: `pwd` honours it, and `ls` resolves both a relative path and its default argument against it. From 0dec3bc36579e0bf316895997567664a597d1c22 Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 4 Sep 2026 22:46:20 +0000 Subject: [PATCH 15/34] fix(ci): clear the two warnings -D warnings surfaced outside Linux Both are real defects that the pipeline could not see before clippy and rustc started denying warnings, and both failed the Rust job on a00126b. - tests/cd_invocation_isolation.rs: `output_env` is read only by the `#[cfg(unix)]` assertions, because the environment dump it parses comes from `/usr/bin/env`. On Windows it was an unused function, so the test crate would not compile. Verified with `cargo check --target x86_64-pc-windows-msvc --all-targets`: it fails with "function `output_env` is never used" before the cfg and passes after. - scripts/version-and-commit.rs: `rust-script --test` builds the script as a test harness, where `main` is not the entry point, so the twelve helpers reachable only from `main` are unreferenced. The imports were already gated on `not(test)` for the same reason; the file now carries `#![cfg_attr(test, allow(dead_code))]`. Without it the step fails with exactly the twelve errors CI reported; with it all six script suites pass. The real, non-test build still denies dead code. Also documents the pipeline in docs/CI-CD.md -- the file the analysis already pointed at for the two settings a workflow cannot change, branch protection on main and the dependency graph -- and records the remaining findings in the issue-199 analysis log, including a correction: the js/.prettierignore case-study patterns resolved against js/, where no data/ or templates/ directories exist; the archived copies they were meant to protect are under the repository-root docs/. --- .../issues/199/pulls/200/analysis/README.md | 110 +++++++++++++++++- docs/CI-CD.md | 80 +++++++++++++ js/tests/repository-layout.test.mjs | 8 +- rust/scripts/version-and-commit.rs | 7 ++ rust/tests/cd_invocation_isolation.rs | 5 + 5 files changed, 206 insertions(+), 4 deletions(-) create mode 100644 docs/CI-CD.md diff --git a/dev/log/issues/199/pulls/200/analysis/README.md b/dev/log/issues/199/pulls/200/analysis/README.md index c932a72..5db5490 100644 --- a/dev/log/issues/199/pulls/200/analysis/README.md +++ b/dev/log/issues/199/pulls/200/analysis/README.md @@ -157,6 +157,96 @@ all named `Test JavaScript (node on ubuntu-latest)`. Required-status-check rules and humans cannot tell them apart, and a failure in one is indistinguishable from a failure in another. +### 4.10 FALSE NEGATIVE β€” the duplication gate analysed zero files + +`.jscpd.json` carried `"format": "console"`. In jscpd, `format` is the list of +**languages** to analyse, not the reporter: `@jscpd/finder` filters every +candidate with `options.format.includes(detectedLanguage)`. No file's language +is `console`, so the detector matched nothing: + +``` +"format": "console" -> exit 0, 0 clones, 0 files analysed +"format": ["javascript"] -> exit 1, 1 clone, 2 files analysed +``` + +Reproduction: `experiments/jscpd-format/run.mjs`. With the correct language list +the repository reports 65 files / 47 clones / 4.84 %, under the 5 % threshold. +The same defect is in the JavaScript template β€” reported upstream (Β§7). + +### 4.11 FALSE NEGATIVE β€” half the repository was outside the lint base path + +`eslint.config.js`, `.prettierrc`, `.prettierignore` and `.lintstagedrc.json` +lived in `js/`. Both tools treat the directory holding their configuration as +the project base path, so repository-root JavaScript (`claude-profiles.mjs`, +`experiments/**`) was reported as "ignored because it is located outside of the +base path" and was silently never linted; lint-staged likewise only considered +files under `js/`. `js/.prettierignore` also listed +`docs/case-studies/**/{data,templates}/**`, which resolved against `js/`: +`js/docs/case-studies` has no `data/` or `templates/` subdirectory, and the +archived upstream copies those rules exist to protect live under the +repository-root `docs/case-studies` β€” outside prettier's reach entirely. The +configs now live at the root and `js/eslint.config.js` remains the rule set they +re-export. + +### 4.12 ERROR β€” nothing audited dependencies or analysed sources + +There was no security workflow at all: no dependency advisory check for any of +the three lockfiles, no static analysis, no scheduled re-run. `cargo audit` +found a live advisory on the first run: + +``` +RUSTSEC-2026-0007 bytes 1.11.0 integer overflow in BytesMut::reserve +``` + +Fixed by `cargo update -p bytes` (1.12.1). `npm audit` and `bun audit` were +cleared by the dev-dependency refresh. `.github/workflows/security.yml` now runs +CodeQL (`javascript-typescript`, `rust`, `actions`, all with `build-mode: none`), +dependency review, and the three audits, weekly as well as per push and pull +request β€” a lockfile that is clean today is not clean in a month. + +### 4.13 FALSE POSITIVE β€” zizmor audited archived evidence + +The first CI run of the Zizmor job reported 30 findings, all in `release.yml` β€” +a file `.github/workflows/` does not contain. `zizmorcore/zizmor-action` defaults +to `inputs: .`, walking the whole tree and collecting the 14 verbatim copies of +other repositories' workflows archived under `docs/case-studies/**/templates/**`. +Those never execute here and editing them would falsify the evidence they exist +to preserve, so the audit is scoped to `.github/workflows` and the scope is +pinned by a test. + +### 4.14 ERROR β€” dependency review cannot run on this repository + +``` +Dependency review is not supported on this repository. Please ensure that +Dependency graph is enabled +``` + +`GET /repos/link-foundation/command-stream` returns no `dependency_graph` key +under `security_and_analysis`; the compare endpoint returns `403 Forbidden` and +the SBOM endpoint `404 Not Found`. A `PATCH` with +`security_and_analysis[dependency_graph][status]=enabled` was accepted but had +no effect β€” the setting is controlled at the organisation level and could not be +changed from here. + +**Manual step required:** enable the dependency graph at +. + +Until then the job probes the compare endpoint and skips with a warning on 403, +rather than failing forever. A check that can only ever be red is itself a false +positive: it teaches reviewers to ignore red. Any status other than 200 or 403 +still fails the job, and the review starts running by itself once the graph is +on. The three audit jobs cover the committed lockfiles in the meantime. + +### 4.15 ERROR β€” a publish token was handed to every pull-request job + +`rust.yml` declared `CARGO_REGISTRY_TOKEN` in the workflow-level `env:`. That +block is inherited by every job, so the crates.io token was in the environment of +`cargo test` and `cargo clippy` on `pull_request` β€” both of which compile and run +code from the branch under review, via `build.rs`, proc macros or the tests +themselves. Publishing credentials now sit on the publishing job only, and a +test asserts no workflow-level `env:` value references `secrets.`. The same +defect is in the Rust template β€” reported upstream (Β§7). + ## 5. File-by-file comparison against both templates Scripts (`analysis/js-scripts-diff.log`, `analysis/rust-scripts-diff.log`): @@ -197,7 +287,25 @@ Workflows β€” present in **both** templates, absent here: 10. Verification of published artifacts (`wait-for-npm.mjs`, `wait-for-crate.rs`) so a green release means an installable artifact. -## 7. Upstream issue to report +## 7. Upstream issues reported + +Three defects found here also exist in the templates the issue asks to compare +against, so each was reported with a reproducible example, a workaround and the +code-level fix: + +| Issue | Repository | Defect | +| --- | --- | --- | +| [#157](https://github.com/link-foundation/js-ai-driven-development-pipeline-template/issues/157) | js template | `.jscpd.json` `"format": "console"` makes the duplication check analyse zero files and always pass (Β§4.10) | +| [#158](https://github.com/link-foundation/js-ai-driven-development-pipeline-template/issues/158) | js template | `publish-retry.mjs` misses npm's E409 "Cannot publish over previously staged version", turning successful releases into failed jobs (Β§4.1) | +| [#149](https://github.com/link-foundation/rust-ai-driven-development-pipeline-template/issues/149) | rust template | `release.yml` puts `CARGO_REGISTRY_TOKEN`/`CARGO_TOKEN` in the workflow-level `env:`, handing the publish token to seven jobs that compile pull-request code (Β§4.15) | + +Checked and deliberately **not** reported, because they are correct as written: +the Rust template's `pipeline-status: if: always()` (it intentionally reports +cancelled jobs), matrix job names that omit a `runner` key when another key +already disambiguates them, and the JavaScript template's three low-confidence +`self-repository` zizmor findings. + +### Detail: #158 **Repository:** `link-foundation/js-ai-driven-development-pipeline-template` diff --git a/docs/CI-CD.md b/docs/CI-CD.md new file mode 100644 index 0000000..b02f649 --- /dev/null +++ b/docs/CI-CD.md @@ -0,0 +1,80 @@ +# CI/CD + +Five workflows guard this repository. Everything below is enforced by +`js/tests/workflow-hygiene.test.mjs` and `js/tests/repository-layout.test.mjs`, +which parse the workflow files themselves β€” if a job drifts from what this +document describes, those tests fail. + +## Workflows + +| Workflow | Runs on | Jobs | +| --------------- | -------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | +| `js.yml` | push to `main`, pull request, dispatch | changeset check, lint and format, test (bun + node 20/22/24 Γ— ubuntu/macos/windows), release, instant release, changeset PR | +| `rust.yml` | push to `main`, pull request, dispatch | changelog fragment check, lint and format, test (ubuntu/macos/windows), release scripts, build, release, instant release, changelog PR | +| `parity.yml` | pull request | JS/Rust source parity | +| `workflows.yml` | push to `main`, pull request, dispatch | actionlint, zizmor | +| `security.yml` | push to `main`, pull request, **weekly**, dispatch | CodeQL, dependency review, npm/bun/cargo audit | + +## Invariants + +- **Warnings are errors.** `eslint --max-warnings 0`; `RUSTFLAGS`/`RUSTDOCFLAGS` + are `-Dwarnings` and clippy runs with `-- -D warnings`, because `RUSTFLAGS` + does not reach clippy's own lints. `cargo doc --no-deps` catches the + rustdoc-only lints that neither clippy nor `cargo test --doc` reports. +- **actionlint runs from `docker://rhysd/actionlint`,** not from a bare binary. + The Docker image bundles shellcheck and pyflakes; a binary without shellcheck + on `PATH` silently skips every `run:` block and still exits 0. +- **zizmor audits `.github/workflows` only.** Its default input is `.`, which + also collects the archived copies of other repositories' workflows under + `docs/case-studies/**/templates/**`. Those never run here. +- **No secret is declared in a workflow-level `env:`.** That block is inherited + by every job in the file, including the ones that compile pull-request code. + Publishing credentials belong on the publishing job. +- **Only jobs that write hold a non-cancellable concurrency group.** Read-only + checks use a cancellable `check-*` group; jobs with `contents: write` share + `main-writer-${{ github.repository }}-main` and are never cancelled halfway. +- **Release jobs gate on `!cancelled()`, not `always()`.** A job with `needs:` + is skipped when a dependency is skipped, and _any_ non-`success()` condition + lifts that β€” so `always()` adds nothing except the risk of running after a + real failure. +- **Lint and format configuration lives at the repository root.** eslint and + prettier treat the directory holding their config as the project base path; + while these files lived in `js/`, root-level JavaScript was outside that path + and silently unlintable. `js/eslint.config.js` remains the rule set the root + copies re-export. + +## Required repository settings + +Two things a workflow cannot configure. Both are open: + +### Branch protection on `main` + +`GET /repos/link-foundation/command-stream/branches/main/protection` returns +`404 Branch not protected` and the ruleset list is empty, so a pull request with +red checks can still be merged. Protect `main` and mark the lint, test and +security jobs as required. + +### Dependency graph + +`actions/dependency-review-action` needs the dependency graph, which is off for +this repository β€” the API reports no `dependency_graph` key and a `PATCH` to +enable it has no effect, so it is controlled at the organisation level. Enable +it at +. + +Until then the job probes the compare endpoint and skips with a warning rather +than failing on every pull request; it starts reviewing on its own once the +graph is on. Any other API status still fails the job. The npm, bun and cargo +audit jobs cover the committed lockfiles in the meantime. + +## Releasing + +JavaScript uses changesets: add a `js/.changeset/*.md` entry describing the +change and its bump type, or the `Check for JavaScript changesets` job fails. +Rust uses changelog fragments: add `rust/changelog.d/YYYYMMDD_HHMMSS_*.md` with +`bump:` frontmatter, or `Rust changelog fragment check` fails. + +`scripts/publish-retry.mjs` treats an "already published" registry error as +success, including npm's E409 `Cannot publish over previously staged version` β€” +a slow-propagating publish used to be reported as a failed release even though +the version was live. diff --git a/js/tests/repository-layout.test.mjs b/js/tests/repository-layout.test.mjs index c4457c4..1e3620b 100644 --- a/js/tests/repository-layout.test.mjs +++ b/js/tests/repository-layout.test.mjs @@ -56,9 +56,11 @@ describe('repository language layout', () => { // as the base path of the linted project. While these files lived in js/, // repository-root JavaScript (claude-profiles.mjs, experiments/) was outside // that base path and silently unlintable, and js/.prettierignore's - // docs/case-studies patterns named a js/docs/ that does not exist. The root - // copies are what put the whole tree in scope; js/eslint.config.js stays as - // the rule set they re-export. + // docs/case-studies/**/{data,templates}/** patterns resolved against js/, + // where no such directories exist -- the archived evidence they were meant + // to protect is under the repository-root docs/. The root copies are what + // put the whole tree in scope; js/eslint.config.js stays as the rule set + // they re-export. expect(existsFromRepo('eslint.config.js')).toBe(true); expect(existsFromRepo('.prettierrc')).toBe(true); expect(existsFromRepo('.prettierignore')).toBe(true); diff --git a/rust/scripts/version-and-commit.rs b/rust/scripts/version-and-commit.rs index d3e0822..c01f39f 100644 --- a/rust/scripts/version-and-commit.rs +++ b/rust/scripts/version-and-commit.rs @@ -23,6 +23,13 @@ //! serde_json = "1" //! ``` +// `rust-script --test` builds this file as a test harness, where `main` is not +// the entry point. Everything reachable only from `main` -- most of the file -- +// is therefore unreferenced, and the pipeline's RUSTFLAGS=-Dwarnings turns that +// into a build failure. The imports below were already gated on `not(test)` for +// the same reason. The real, non-test build still denies dead code. +#![cfg_attr(test, allow(dead_code))] + #[cfg(not(test))] use chrono::Utc; use regex::Regex; diff --git a/rust/tests/cd_invocation_isolation.rs b/rust/tests/cd_invocation_isolation.rs index c24da8a..c44d859 100644 --- a/rust/tests/cd_invocation_isolation.rs +++ b/rust/tests/cd_invocation_isolation.rs @@ -7,6 +7,11 @@ fn canonical(path: impl AsRef) -> std::path::PathBuf { std::fs::canonicalize(path.as_ref()).unwrap_or_else(|_| path.as_ref().to_path_buf()) } +// Only the `#[cfg(unix)]` assertions read this, because the environment dump +// they parse comes from `/usr/bin/env`, which the Windows runner does not have. +// Without the same cfg on the helper, the Windows build sees an unused function +// and `-D warnings` turns that into a hard error. +#[cfg(unix)] fn output_env<'a>(output: &'a str, name: &str) -> Option<&'a str> { output.lines().find_map(|line| { line.strip_prefix(name) From 4243a617c0fd534962323e5e59f6db504952e88f Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 4 Sep 2026 23:05:51 +0000 Subject: [PATCH 16/34] docs(analysis): record the off-Linux warnings and the fourth upstream report Adds section 4.16 (the two warnings that only appear on Windows and under rust-script --test) and the rust template issue #150 row to the upstream report table. --- .../issues/199/pulls/200/analysis/README.md | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/dev/log/issues/199/pulls/200/analysis/README.md b/dev/log/issues/199/pulls/200/analysis/README.md index 5db5490..87ff80d 100644 --- a/dev/log/issues/199/pulls/200/analysis/README.md +++ b/dev/log/issues/199/pulls/200/analysis/README.md @@ -247,6 +247,26 @@ themselves. Publishing credentials now sit on the publishing job only, and a test asserts no workflow-level `env:` value references `secrets.`. The same defect is in the Rust template β€” reported upstream (Β§7). +### 4.16 FALSE NEGATIVE β€” two warnings that only exist off Linux + +Denying warnings surfaced two defects the pipeline had never been able to see, +both of which failed the Rust job on `a00126b`: + +- `tests/cd_invocation_isolation.rs`: `output_env` is read only by the + `#[cfg(unix)]` assertions, because the dump it parses comes from + `/usr/bin/env`. On Windows it was an unused function and the test crate would + not compile. Confirmed both ways with + `cargo check --target x86_64-pc-windows-msvc --all-targets`. +- `scripts/version-and-commit.rs`: `rust-script --test` builds the script as a + test harness, where `main` is not the entry point, so the twelve helpers + reachable only from `main` are unreferenced β€” exactly the twelve errors CI + reported. The imports were already gated on `not(test)` for the same reason. + `#![cfg_attr(test, allow(dead_code))]` covers the test build; the real build + still denies dead code. + +The second one exists in the Rust template too, where it is invisible because +nothing there runs the script suites at all β€” reported upstream (Β§7). + ## 5. File-by-file comparison against both templates Scripts (`analysis/js-scripts-diff.log`, `analysis/rust-scripts-diff.log`): @@ -298,6 +318,7 @@ code-level fix: | [#157](https://github.com/link-foundation/js-ai-driven-development-pipeline-template/issues/157) | js template | `.jscpd.json` `"format": "console"` makes the duplication check analyse zero files and always pass (Β§4.10) | | [#158](https://github.com/link-foundation/js-ai-driven-development-pipeline-template/issues/158) | js template | `publish-retry.mjs` misses npm's E409 "Cannot publish over previously staged version", turning successful releases into failed jobs (Β§4.1) | | [#149](https://github.com/link-foundation/rust-ai-driven-development-pipeline-template/issues/149) | rust template | `release.yml` puts `CARGO_REGISTRY_TOKEN`/`CARGO_TOKEN` in the workflow-level `env:`, handing the publish token to seven jobs that compile pull-request code (Β§4.15) | +| [#150](https://github.com/link-foundation/rust-ai-driven-development-pipeline-template/issues/150) | rust template | No workflow runs `rust-script --test`, so 78 tests across 9 scripts never execute; `create-github-release.rs` does not compile in test mode and `version-and-commit.rs` fails under the template's own `RUSTFLAGS: -Dwarnings` (Β§4.16) | Checked and deliberately **not** reported, because they are correct as written: the Rust template's `pipeline-status: if: always()` (it intentionally reports From 6c267934aa70c0c80806835bad6af97398eb53c3 Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 4 Sep 2026 23:05:53 +0000 Subject: [PATCH 17/34] fix(ci): run the three Rust guards that shipped without a caller rust/scripts/ ships four check-*.rs gates. Only check-changelog-fragment.rs was ever executed: check-file-size.rs, check-version-modification.rs and check-crate-size.rs were referenced by no workflow, no script and no document, so the pipeline reported "all checks passed" for checks that never ran (issue #199). - check-version-modification.rs joins the pull-request-only changelog job, which already installs rust-script and checks out full history. A hand-edited version in rust/Cargo.toml now fails the PR instead of fighting the release job that writes that field. - check-file-size.rs and check-crate-size.rs join the scripts job, the only other job with rust-script installed. File size runs from the repository root so rust/src, rust/tests and rust/scripts are all in scope; crate size packages with --no-verify and fails before a 10 MiB upload turns into an HTTP 413 after the release commit and tag already exist. All three pass on the current tree. The two job display names now describe what the jobs do. Pinned by new tests in workflow-hygiene.test.mjs, which also assert that every rust/scripts entry is either invoked somewhere or listed as a documented exception, so the next gate cannot go dead unnoticed. --- .github/workflows/rust.yml | 28 +++++++++++- js/tests/workflow-hygiene.test.mjs | 71 ++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+), 2 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 08f01ad..4672166 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -63,7 +63,7 @@ env: jobs: changelog: - name: Rust changelog fragment check + name: Rust changelog and version checks runs-on: ubuntu-latest timeout-minutes: 10 if: github.event_name == 'pull_request' @@ -87,6 +87,15 @@ jobs: GITHUB_BASE_REF: ${{ github.base_ref }} run: rust-script rust/scripts/check-changelog-fragment.rs + - name: Check for manual version changes + env: + GITHUB_BASE_REF: ${{ github.base_ref }} + # rust/Cargo.toml's version field is written by the release job from the + # changelog fragments. A hand-edited version in a pull request silently + # fights that and republishes or skips a version. The script shipped with + # the pipeline but no workflow ran it, so the guard was dead (issue #199). + run: rust-script rust/scripts/check-version-modification.rs + lint: name: Lint and format Rust runs-on: ubuntu-latest @@ -179,7 +188,7 @@ jobs: run: cargo test --doc --all-features --verbose scripts: - name: Test Rust release scripts + name: Test Rust scripts and check sizes runs-on: ubuntu-latest timeout-minutes: 15 needs: [changelog] @@ -226,6 +235,21 @@ jobs: done exit $status + - name: Check Rust file sizes + # Best practice: no source file over ~1000 lines. The JavaScript side + # enforces this through eslint's `max-lines`; the Rust side shipped + # check-file-size.rs but nothing invoked it (issue #199). Run from the + # repository root so rust/src, rust/tests and rust/scripts are all in + # scope. Files in the 900-1000 band are reported as warnings only. + run: rust-script rust/scripts/check-file-size.rs + + - name: Check packaged crate size + # crates.io rejects uploads over 10 MiB with an HTTP 413 during publish, + # i.e. after the release commit and tag already exist. This packages the + # crate with --no-verify (the build job does the verifying package run) + # and fails early instead. Also previously dead (issue #199). + run: rust-script rust/scripts/check-crate-size.rs + build: name: Build Rust package runs-on: ubuntu-latest diff --git a/js/tests/workflow-hygiene.test.mjs b/js/tests/workflow-hygiene.test.mjs index 1b1e52f..8207945 100644 --- a/js/tests/workflow-hygiene.test.mjs +++ b/js/tests/workflow-hygiene.test.mjs @@ -314,3 +314,74 @@ describe('every shipped ecosystem is audited', () => { expect(security.doc.on.schedule?.length).toBeGreaterThan(0); }); }); + +describe('the shipped quality gates are actually invoked', () => { + const rust = workflows.find((w) => w.name === 'rust.yml'); + const rustRuns = Object.values(rust.doc.jobs) + .flatMap((job) => job.steps ?? []) + .map((step) => step.run) + .filter(Boolean) + .join('\n'); + + // rust/scripts/ shipped four `check-*.rs` guards, but only the changelog one + // was ever executed: the other three were referenced by no workflow, no + // script and no document (issue #199). A gate nobody runs is a silent false + // negative -- the pipeline reports "all checks passed" while the check does + // not exist. + test.each([ + ['check-changelog-fragment.rs'], + ['check-version-modification.rs'], + ['check-file-size.rs'], + ['check-crate-size.rs'], + ])('rust.yml runs %s', (script) => { + expect(rustRuns).toContain(`rust-script rust/scripts/${script}`); + }); + + test('every rust/scripts entry is invoked or a documented exception', () => { + // Standalone entry points that this repository deliberately does not wire + // up. They come from the Rust pipeline template, where separate workflow + // steps call them; here the same work happens elsewhere. + const unwired = new Map([ + // version-and-commit.rs does its own bumping (`Version::bump`) and its + // own fragment collection (`collect_changelog`), so these two standalone + // entry points would be a second implementation of the same steps. + ['bump-version.rs', 'version-and-commit.rs does both steps itself'], + ['collect-changelog.rs', 'version-and-commit.rs does both steps itself'], + // The workflows select what runs with `on: paths:` filters instead of + // computing a change matrix in a first job. + ['detect-code-changes.rs', 'replaced by on: paths: filters'], + // The release jobs set the bot identity inline, next to the commit they + // are about to make. + ['git-config.rs', 'release jobs configure git inline'], + ]); + + const scriptDir = join(repoRoot, 'rust', 'scripts'); + const scripts = readdirSync(scriptDir).filter((n) => n.endsWith('.rs')); + const sources = scripts.map((n) => + readFileSync(join(scriptDir, n), 'utf8') + ); + const workflowText = workflows.map((w) => w.text).join('\n'); + + for (const script of scripts) { + const referenced = + workflowText.includes(script) || + sources.some( + (text, i) => scripts[i] !== script && text.includes(script) + ); + expect(`${script}: ${referenced || unwired.has(script)}`).toBe( + `${script}: true` + ); + } + }); + + test('both languages enforce a maximum file length', () => { + // Principle #2 of the hive-mind CI/CD best practices. JavaScript gets this + // from eslint; Rust had the script but no caller. + const eslint = readFileSync( + join(repoRoot, 'js', 'eslint.config.js'), + 'utf8' + ); + expect(eslint).toContain("'max-lines': ['error', 1500]"); + expect(rustRuns).toContain('rust-script rust/scripts/check-file-size.rs'); + }); +}); From 2664646a867e3ab69184ccf08af555ee33a4d3e9 Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 4 Sep 2026 23:07:43 +0000 Subject: [PATCH 18/34] feat(ci): scan the tree for committed credentials No check looked for secrets in this repository: CodeQL does not search for them and the three audit jobs only read lockfiles, so a token pasted into a script, a test fixture or an archived case study would have reached main with a fully green run (issue #199, hive-mind CI/CD best practice #11). secretlint with the recommended preset now runs in the security workflow, which has no paths filter and therefore sees every change, on pull requests, on pushes to main and on the weekly schedule. Versions are pinned so a new rule release cannot turn an unrelated pull request red. experiments/secretlint-scope.sh is the probe behind the configuration: with a fake ghp_ token planted in three places it shows that the `**/*` glob does descend into dot-directories such as .github/, and that .secretlintignore is honoured. The ignore list holds only generated trees (node_modules, cargo target, jscpd reports, coverage), and a new test fails if anything authored here is ever added to it. The full scan takes about 10 seconds locally, including the 12 MB of archived CI logs under dev/log/. --- .github/workflows/security.yml | 30 +++++++++++++++++++++ .secretlintignore | 6 +++++ .secretlintrc.json | 7 +++++ experiments/secretlint-scope.sh | 42 ++++++++++++++++++++++++++++++ js/tests/workflow-hygiene.test.mjs | 30 +++++++++++++++++++++ 5 files changed, 115 insertions(+) create mode 100644 .secretlintignore create mode 100644 .secretlintrc.json create mode 100644 experiments/secretlint-scope.sh diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml index 5d7fa4c..bd23462 100644 --- a/.github/workflows/security.yml +++ b/.github/workflows/security.yml @@ -185,3 +185,33 @@ jobs: - name: Audit the committed Cargo.lock working-directory: rust run: cargo audit --file Cargo.lock + + secret-scan: + name: Scan for committed secrets + runs-on: ubuntu-latest + timeout-minutes: 10 + concurrency: + group: check-${{ github.workflow }}-${{ github.ref }}-secret-scan + cancel-in-progress: true + steps: + - uses: actions/checkout@v6 + with: + persist-credentials: false + + # Nothing checked whether a credential had been committed. CodeQL does not + # look for them and the audit jobs only read lockfiles, so a token pasted + # into a script, a fixture or a case study would have reached main with a + # green run (issue #199, best practice #11). + # + # Reproduce locally with the same command, and see + # experiments/secretlint-scope.sh for the probe that shows the glob does + # reach dot-directories such as .github/. Files that are generated rather + # than authored here are listed in .secretlintignore; the rule set is in + # .secretlintrc.json. The versions are pinned so a new rule release cannot + # turn an unrelated pull request red -- bump them deliberately. + - name: Run secretlint over the working tree + run: | + npx --yes \ + -p secretlint@13.0.5 \ + -p @secretlint/secretlint-rule-preset-recommend@13.0.5 \ + secretlint "**/*" diff --git a/.secretlintignore b/.secretlintignore new file mode 100644 index 0000000..dfdd6af --- /dev/null +++ b/.secretlintignore @@ -0,0 +1,6 @@ +# Generated or vendored trees: nothing here is authored in this repository, and +# scanning them turns a sub-minute check into a multi-minute one. +node_modules/** +rust/target/** +js/reports/** +js/coverage/** diff --git a/.secretlintrc.json b/.secretlintrc.json new file mode 100644 index 0000000..7a1a5df --- /dev/null +++ b/.secretlintrc.json @@ -0,0 +1,7 @@ +{ + "rules": [ + { + "id": "@secretlint/secretlint-rule-preset-recommend" + } + ] +} diff --git a/experiments/secretlint-scope.sh b/experiments/secretlint-scope.sh new file mode 100644 index 0000000..a49381b --- /dev/null +++ b/experiments/secretlint-scope.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash +# Does `secretlint "**/*"` reach dot-directories, and is .secretlintignore honoured? +# +# Both questions decide whether the secret-scan job in .github/workflows/security.yml +# is worth anything. A scan that silently skips .github/ or .changeset/ is a false +# negative, and one that cannot be scoped is too slow to keep. +# +# The probe is a *fake* GitHub token: `ghp_` followed by 36 random characters, which +# matches @secretlint/secretlint-rule-github's pattern without being a credential. +# (The AWS example key from the AWS documentation is deliberately not flagged by the +# recommended preset, so it cannot be used as a probe.) +# +# Result on 2026-09-04, secretlint 13.0.5: +# plain file -> reported +# .github/ file -> reported (the glob does descend into dot-directories) +# ignored directory -> not reported (.secretlintignore is picked up from the cwd) +# +# Usage: bash experiments/secretlint-scope.sh +set -uo pipefail +cd "$(dirname "$0")/.." + +probes=('secretlint-probe.txt' '.github/secretlint-probe.txt' 'node_modules/secretlint-probe.txt') +cleanup() { rm -f "${probes[@]}"; } +trap cleanup EXIT + +token="ghp_$(head -c 40 /dev/urandom | base64 | tr -dc 'A-Za-z0-9' | head -c 36)" +mkdir -p node_modules +for probe in "${probes[@]}"; do + printf 'token = %s\n' "$token" > "$probe" +done + +report="$(npx --yes -p secretlint@13.0.5 \ + -p @secretlint/secretlint-rule-preset-recommend@13.0.5 \ + secretlint '**/*' 2>&1 || true)" + +for probe in "${probes[@]}"; do + if grep -qF "$probe" <<<"$report"; then + echo "reported: $probe" + else + echo "not reported: $probe" + fi +done diff --git a/js/tests/workflow-hygiene.test.mjs b/js/tests/workflow-hygiene.test.mjs index 8207945..06d787b 100644 --- a/js/tests/workflow-hygiene.test.mjs +++ b/js/tests/workflow-hygiene.test.mjs @@ -307,6 +307,36 @@ describe('every shipped ecosystem is audited', () => { expect(languages).toContain('actions'); }); + test('the working tree is scanned for committed credentials', () => { + // Nothing looked for credentials in the tree: CodeQL does not, and the + // audit jobs only read lockfiles (issue #199, best practice #11). + expect(runs).toContain('secretlint'); + const policy = JSON.parse( + readFileSync(join(repoRoot, '.secretlintrc.json'), 'utf8') + ); + expect(policy.rules.map((rule) => rule.id)).toContain( + '@secretlint/secretlint-rule-preset-recommend' + ); + // The ignore list may exclude generated trees, never authored source. + const ignored = readFileSync(join(repoRoot, '.secretlintignore'), 'utf8') + .split('\n') + .map((line) => line.trim()) + .filter((line) => line && !line.startsWith('#')); + for (const pattern of ignored) { + expect( + `${pattern}: ${/^(node_modules|rust\/target|js\/(reports|coverage))\//.test(pattern)}` + ).toBe(`${pattern}: true`); + } + }); + + test('the security workflow is not narrowed by a paths filter', () => { + // js.yml and rust.yml only run for their own language's files. The audits + // and the secret scan have to see every change, so this workflow must stay + // unfiltered -- a `paths:` here would let a credential in, say, a case + // study reach main unscanned. + expect(security.doc.on.pull_request?.paths).toBeUndefined(); + }); + test('the audits also run on a schedule', () => { // A new advisory lands against code that has not changed, so the // push/pull_request triggers alone would leave it unreported until the From fa82ddd3473704614037aa4a02fcb0b06b704fe6 Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 4 Sep 2026 23:10:42 +0000 Subject: [PATCH 19/34] feat(ci): validate the real merge result, not a stale merge preview A pull-request run checks out refs/pull/N/merge, which GitHub computes when the pull request is opened or synchronised. When main moves after that, the checks validate a combination that will not exist once the branch lands: the run is green, the merge happens, and main breaks on code no job ever saw together. This is principle #7 of the hive-mind CI/CD best practices and the last one of the fifteen that this repository did not implement (issue #199). .github/scripts/simulate-fresh-merge.sh merges the base branch into the checkout before the checks run, and turns a merge conflict into a clear failure on the pull request instead of a surprise at merge time. It is a no-op when the branch already contains every commit on the base. The five jobs that read the tree -- lint and test in js.yml, lint, test and scripts in rust.yml -- now run it and check out full history; the merge is local and those checkouts keep persist-credentials: false. experiments/fresh-merge-simulation.sh builds throwaway repositories and asserts all three paths: no-op when up to date, merged when the base moved, exit 1 with an ::error:: annotation when the merge conflicts. New hygiene tests pin the wiring, including that the simulation cannot be added to a job that checks out shallowly or outside a pull request. --- .github/scripts/simulate-fresh-merge.sh | 56 ++++++++++++++ .github/workflows/js.yml | 24 ++++++ .github/workflows/rust.yml | 36 +++++++++ experiments/fresh-merge-simulation.sh | 97 +++++++++++++++++++++++++ js/tests/workflow-hygiene.test.mjs | 55 ++++++++++++++ 5 files changed, 268 insertions(+) create mode 100755 .github/scripts/simulate-fresh-merge.sh create mode 100644 experiments/fresh-merge-simulation.sh diff --git a/.github/scripts/simulate-fresh-merge.sh b/.github/scripts/simulate-fresh-merge.sh new file mode 100755 index 0000000..ebc7ef7 --- /dev/null +++ b/.github/scripts/simulate-fresh-merge.sh @@ -0,0 +1,56 @@ +#!/usr/bin/env bash +# +# Fresh merge simulation. +# +# A pull-request run checks out GitHub's merge preview, refs/pull/N/merge. That +# ref is computed when the pull request is opened or synchronised, so a run that +# starts after main has moved can still be validating an old merge base: the +# checks pass, the merge lands, and main breaks on code no job ever saw +# together. Merging the current base branch into the checkout before the checks +# run removes that window, and a merge conflict fails the job with a clear +# message instead of surfacing as a conflict at merge time. +# +# This is principle #7 ("Validate the actual merge result") of +# https://github.com/link-assistant/hive-mind/blob/main/docs/CI-CD-BEST-PRACTICES.md +# +# The merge is local to the runner: nothing is pushed, and the jobs that call +# this check out with persist-credentials: false. +# +# Requirements: the calling job must check out with `fetch-depth: 0`, otherwise +# the shallow clone has no merge base to work from. +# +# Environment: +# BASE_REF - the base branch to merge in (default: main). In GitHub Actions +# this is github.base_ref, which is set only for pull_request +# events; the calling step is guarded accordingly. +# +# Usage (locally, on a branch): +# BASE_REF=main bash .github/scripts/simulate-fresh-merge.sh +set -euo pipefail + +BASE_REF="${BASE_REF:-main}" + +# An identity is required for `git merge` to be able to write a merge commit. +# The 41898282+ prefix is the one that attributes a commit to github-actions[bot]; +# the commit never leaves the runner, but using the right identity keeps it out +# of the "unattributed" bucket if it ever does. +git config user.email '41898282+github-actions[bot]@users.noreply.github.com' +git config user.name 'github-actions[bot]' + +git fetch --no-tags origin "${BASE_REF}" + +behind="$(git rev-list --count "HEAD..origin/${BASE_REF}")" +if [ "${behind}" -eq 0 ]; then + echo "Merge preview already contains every commit on ${BASE_REF}; nothing to simulate." + exit 0 +fi + +echo "${BASE_REF} has ${behind} commit(s) that the merge preview does not contain." +echo "Merging origin/${BASE_REF} so the checks below run against the real merge result." + +if ! git merge "origin/${BASE_REF}" --no-edit; then + echo "::error::Merge conflict with ${BASE_REF}. Update this branch before it can be merged." + exit 1 +fi + +echo "Fresh merge succeeded; the checks below run against the merged tree." diff --git a/.github/workflows/js.yml b/.github/workflows/js.yml index e9596f9..03c8229 100644 --- a/.github/workflows/js.yml +++ b/.github/workflows/js.yml @@ -105,8 +105,20 @@ jobs: steps: - uses: actions/checkout@v6 with: + # The merge simulation below needs the base branch's history. + fetch-depth: 0 persist-credentials: false + # Run the checks below against the real merge result rather than a + # possibly stale merge preview, and fail on a conflict here rather than at + # merge time. Rationale in .github/scripts/simulate-fresh-merge.sh. + - name: Simulate a fresh merge with the base branch + if: github.event_name == 'pull_request' + shell: bash + env: + BASE_REF: ${{ github.base_ref }} + run: bash .github/scripts/simulate-fresh-merge.sh + - name: Setup Bun uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 with: @@ -160,8 +172,20 @@ jobs: steps: - uses: actions/checkout@v6 with: + # The merge simulation below needs the base branch's history. + fetch-depth: 0 persist-credentials: false + # Run the checks below against the real merge result rather than a + # possibly stale merge preview, and fail on a conflict here rather than at + # merge time. Rationale in .github/scripts/simulate-fresh-merge.sh. + - name: Simulate a fresh merge with the base branch + if: github.event_name == 'pull_request' + shell: bash + env: + BASE_REF: ${{ github.base_ref }} + run: bash .github/scripts/simulate-fresh-merge.sh + - name: Setup Bun if: matrix.runtime == 'bun' uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 4672166..064663e 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -110,8 +110,20 @@ jobs: steps: - uses: actions/checkout@v6 with: + # The merge simulation below needs the base branch's history. + fetch-depth: 0 persist-credentials: false + # Run the checks below against the real merge result rather than a + # possibly stale merge preview, and fail on a conflict here rather than at + # merge time. Rationale in .github/scripts/simulate-fresh-merge.sh. + - name: Simulate a fresh merge with the base branch + if: github.event_name == 'pull_request' + shell: bash + env: + BASE_REF: ${{ github.base_ref }} + run: bash .github/scripts/simulate-fresh-merge.sh + - name: Setup Rust uses: dtolnay/rust-toolchain@6bed0761d98439e5a578e2877258200ad565ba87 # stable branch @ 2026-09-03 with: @@ -163,8 +175,20 @@ jobs: steps: - uses: actions/checkout@v6 with: + # The merge simulation below needs the base branch's history. + fetch-depth: 0 persist-credentials: false + # Run the checks below against the real merge result rather than a + # possibly stale merge preview, and fail on a conflict here rather than at + # merge time. Rationale in .github/scripts/simulate-fresh-merge.sh. + - name: Simulate a fresh merge with the base branch + if: github.event_name == 'pull_request' + shell: bash + env: + BASE_REF: ${{ github.base_ref }} + run: bash .github/scripts/simulate-fresh-merge.sh + - name: Setup Rust uses: dtolnay/rust-toolchain@6bed0761d98439e5a578e2877258200ad565ba87 # stable branch @ 2026-09-03 @@ -199,8 +223,20 @@ jobs: steps: - uses: actions/checkout@v6 with: + # The merge simulation below needs the base branch's history. + fetch-depth: 0 persist-credentials: false + # Run the checks below against the real merge result rather than a + # possibly stale merge preview, and fail on a conflict here rather than at + # merge time. Rationale in .github/scripts/simulate-fresh-merge.sh. + - name: Simulate a fresh merge with the base branch + if: github.event_name == 'pull_request' + shell: bash + env: + BASE_REF: ${{ github.base_ref }} + run: bash .github/scripts/simulate-fresh-merge.sh + - name: Setup Rust uses: dtolnay/rust-toolchain@6bed0761d98439e5a578e2877258200ad565ba87 # stable branch @ 2026-09-03 diff --git a/experiments/fresh-merge-simulation.sh b/experiments/fresh-merge-simulation.sh new file mode 100644 index 0000000..8aaf76d --- /dev/null +++ b/experiments/fresh-merge-simulation.sh @@ -0,0 +1,97 @@ +#!/usr/bin/env bash +# +# Exercises .github/scripts/simulate-fresh-merge.sh in a throwaway repository. +# +# Three cases, each asserted: +# 1. the branch already contains every commit on the base -> no-op, exit 0 +# 2. the base moved ahead with a compatible change -> merged, exit 0, +# base file present +# 3. the base moved ahead with a conflicting change -> exit 1 and an +# ::error:: annotation +# +# Usage: bash experiments/fresh-merge-simulation.sh +set -uo pipefail + +script="$(cd "$(dirname "$0")/.." && pwd)/.github/scripts/simulate-fresh-merge.sh" +root="$(mktemp -d)" +trap 'rm -rf "$root"' EXIT +failures=0 + +check() { # check + if [ "$2" = "$3" ]; then + echo "ok - $1" + else + echo "FAIL - $1 (expected exit $2, got $3)" + failures=$((failures + 1)) + fi +} + +setup() { # setup ; prints the clone path + local name="$1" + local origin="$root/$name-origin" clone="$root/$name" + git init -q --bare -b main "$origin" + git init -q -b main "$root/$name-seed" + ( + cd "$root/$name-seed" + git config user.email seed@example.com + git config user.name Seed + echo base > shared.txt + git add shared.txt + git commit -qm 'initial' + git branch -M main + git remote add origin "$origin" + git push -q origin main + ) + git clone -q "$origin" "$clone" + ( + cd "$clone" + git config user.email dev@example.com + git config user.name Dev + git checkout -qb feature + echo feature > feature.txt + git add feature.txt + git commit -qm 'feature work' + ) + echo "$clone" +} + +advance_base() { # advance_base + local seed="$root/$1-seed" + ( + cd "$seed" + git checkout -q main + echo "$3" > "$2" + git add "$2" + git commit -qm "base moves" + git push -q origin main + ) +} + +# 1. nothing to merge +clone="$(setup uptodate)" +out="$(cd "$clone" && BASE_REF=main bash "$script" 2>&1)"; status=$? +check 'up-to-date branch is a no-op' 0 "$status" +grep -q 'nothing to simulate' <<<"$out" || { echo "FAIL - expected the no-op message"; failures=$((failures + 1)); } + +# 2. base moved ahead, no conflict +clone="$(setup clean)" +advance_base clean other.txt 'added on main' +out="$(cd "$clone" && BASE_REF=main bash "$script" 2>&1)"; status=$? +check 'a base commit is merged in' 0 "$status" +[ -f "$clone/other.txt" ] || { echo "FAIL - the base file is missing after the merge"; failures=$((failures + 1)); } + +# 3. base moved ahead with a conflict +clone="$(setup conflict)" +(cd "$clone" && echo 'branch version' > shared.txt && git commit -qam 'branch edits shared.txt') +advance_base conflict shared.txt 'main version' +out="$(cd "$clone" && BASE_REF=main bash "$script" 2>&1)"; status=$? +check 'a conflicting base commit fails the job' 1 "$status" +grep -q '::error::Merge conflict' <<<"$out" || { echo "FAIL - expected an ::error:: annotation"; failures=$((failures + 1)); } + +echo +if [ "$failures" -eq 0 ]; then + echo 'All fresh-merge simulation cases behaved as expected.' +else + echo "$failures case(s) failed." +fi +exit $((failures > 0)) diff --git a/js/tests/workflow-hygiene.test.mjs b/js/tests/workflow-hygiene.test.mjs index 06d787b..e864128 100644 --- a/js/tests/workflow-hygiene.test.mjs +++ b/js/tests/workflow-hygiene.test.mjs @@ -415,3 +415,58 @@ describe('the shipped quality gates are actually invoked', () => { expect(rustRuns).toContain('rust-script rust/scripts/check-file-size.rs'); }); }); + +describe('checks validate the merge result, not a stale preview', () => { + const simulation = '.github/scripts/simulate-fresh-merge.sh'; + + // Best practice #7. A pull-request run checks out refs/pull/N/merge, computed + // when the pull request was last synchronised; if main moved since, the checks + // pass on a combination that will not exist after the merge. + test.each([ + ['js.yml', 'lint'], + ['js.yml', 'test'], + ['rust.yml', 'lint'], + ['rust.yml', 'test'], + ['rust.yml', 'scripts'], + ])( + '%s / %s merges the base branch before it checks anything', + (file, jobId) => { + const steps = workflows.find((w) => w.name === file).doc.jobs[jobId] + .steps; + const index = steps.findIndex((step) => + (step.run ?? '').includes(simulation) + ); + expect(`${file}/${jobId}: ${index !== -1}`).toBe( + `${file}/${jobId}: true` + ); + // Everything that inspects the tree has to come after the merge. + const checkout = steps.findIndex((step) => + (step.uses ?? '').startsWith('actions/checkout@') + ); + expect(checkout).toBeLessThan(index); + expect(index).toBeLessThan(steps.length - 1); + } + ); + + test.each(workflows.map((w) => [w.name, w]))( + '%s only simulates a merge where it can work', + (_name, workflow) => { + for (const [jobId, job] of Object.entries(workflow.doc.jobs)) { + const steps = job.steps ?? []; + if (!steps.some((step) => (step.run ?? '').includes(simulation))) { + continue; + } + const step = steps.find((s) => (s.run ?? '').includes(simulation)); + // `github.base_ref` is empty outside a pull request, and the merge + // needs history a shallow checkout does not have. + expect(`${jobId}: ${step.if}`).toBe( + `${jobId}: github.event_name == 'pull_request'` + ); + const checkout = steps.find((s) => + (s.uses ?? '').startsWith('actions/checkout@') + ); + expect(`${jobId}: ${checkout.with['fetch-depth']}`).toBe(`${jobId}: 0`); + } + } + ); +}); From ed871d85b618823bfda6635c4af253b52a1a7eb0 Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 4 Sep 2026 23:17:39 +0000 Subject: [PATCH 20/34] feat(ci): validate the documentation the same way the code is validated Markdown was the only tracked language with no gate at all: a link could rot, a README could lose the section the release process points readers at, and a case study could grow past the point anyone reads it, all with a green run (issue #199, best practice #12). The new test checks three things over every tracked *.md file: * a 2500-line ceiling, mirroring the 1500-line ceiling eslint enforces for JavaScript and check-file-size.rs enforces for Rust; * every relative link resolves to a file that exists; * the documents other automation depends on still carry the sections it expects (README release/development sections, docs/CI-CD.md invariants, the two changelog-fragment READMEs). External links are deliberately not fetched. A network link checker is a false-positive generator -- rate limits, bot walls and transient 5xx turn an unrelated pull request red -- and false positives are exactly what this issue is about. The link check found two real breakages, fixed here: issue-162 linked to changelog markers that a release had already consumed, and issue-153 pointed one directory level too shallow at BEST-PRACTICES.md. Archived evidence under dev/log/** and the verbatim upstream copies under docs/case-studies/**/templates/** are excluded: they are kept byte-for-byte as downloaded, so "fixing" their links would falsify the record. --- docs/case-studies/issue-162/README.md | 7 +- js/docs/case-studies/issue-153/README.md | 2 +- js/tests/docs-validation.test.mjs | 110 +++++++++++++++++++++++ 3 files changed, 116 insertions(+), 3 deletions(-) create mode 100644 js/tests/docs-validation.test.mjs diff --git a/docs/case-studies/issue-162/README.md b/docs/case-studies/issue-162/README.md index d4afff0..68e7285 100644 --- a/docs/case-studies/issue-162/README.md +++ b/docs/case-studies/issue-162/README.md @@ -114,8 +114,11 @@ passes with the fix. Patch release markers were added for both packages so the next merge to `main` has release input to consume: -- [release-job-skipped-by-gate.md](../../../js/.changeset/release-job-skipped-by-gate.md) -- [20260608_issue_162_release_job_skip.md](../../../rust/changelog.d/20260608_issue_162_release_job_skip.md) +- `js/.changeset/release-job-skipped-by-gate.md` +- `rust/changelog.d/20260608_issue_162_release_job_skip.md` + +Both files are gone from the tree: a release consumes its markers and folds them +into the changelogs, so they are named here rather than linked. ## Template Comparison diff --git a/js/docs/case-studies/issue-153/README.md b/js/docs/case-studies/issue-153/README.md index 8121916..40dbc8f 100644 --- a/js/docs/case-studies/issue-153/README.md +++ b/js/docs/case-studies/issue-153/README.md @@ -156,7 +156,7 @@ When you see errors like these, suspect the Array.join() pitfall: ## Related Documentation -- [BEST-PRACTICES.md](../../BEST-PRACTICES.md) - Best practices for command-stream usage +- [BEST-PRACTICES.md](../../../BEST-PRACTICES.md) - Best practices for command-stream usage - [README.md](../../../../README.md) - Common Pitfalls section - [$.quote.mjs](../../../src/$.quote.mjs) - Quote function implementation diff --git a/js/tests/docs-validation.test.mjs b/js/tests/docs-validation.test.mjs new file mode 100644 index 0000000..08d24b0 --- /dev/null +++ b/js/tests/docs-validation.test.mjs @@ -0,0 +1,110 @@ +// Documentation is validated in CI like code: principle #12 of the hive-mind +// CI/CD best practices, which nothing in this repository implemented before +// issue #199. Three failure modes are covered here, all of them found in the +// tree when this file was written or fixed in the same commit: +// +// - a relative link that points at a file which does not exist (a case study +// linked to two release markers that the release process had consumed, and +// another one was one directory level off), +// - a document that has outgrown any reasonable review size, +// - a key document losing the section a reader is sent to it for. +// +// External links are deliberately not checked: a link checker that reaches the +// network turns unrelated pull requests red when a third-party site rots, which +// is the class of false positive issue #199 is about. +import { describe, test, expect } from 'bun:test'; +import { readFileSync, existsSync } from 'fs'; +import { join, dirname, resolve, relative, sep } from 'path'; +import { execSync } from 'child_process'; + +const repoRoot = join(dirname(Bun.fileURLToPath(import.meta.url)), '..', '..'); + +const markdownFiles = execSync("git ls-files '*.md'", { + cwd: repoRoot, + encoding: 'utf8', +}) + .trim() + .split('\n') + .filter(Boolean); + +/** + * Verbatim copies of other repositories' files, kept as evidence and never + * edited: their links point into the tree they came from, and their size is + * not this repository's to control. + */ +const isArchived = (file) => + file.startsWith('dev/log/') || + /docs\/case-studies\/[^/]+\/(templates|data|template-data)\//.test(file); + +const authored = markdownFiles.filter((file) => !isArchived(file)); + +// Best practice #12 suggests 2500 lines for documentation, above the 1500-line +// limit eslint enforces for source. The longest file in the tree is js/README.md. +const MAX_DOC_LINES = 2500; + +describe('documentation validation', () => { + test('the file list is not empty and skips archived copies', () => { + expect(authored.length).toBeGreaterThan(20); + expect(authored.some(isArchived)).toBe(false); + }); + + test.each(authored.map((file) => [file]))( + '%s stays within the documentation line limit', + (file) => { + const lines = readFileSync(join(repoRoot, file), 'utf8').split( + '\n' + ).length; + expect(`${file}: ${lines <= MAX_DOC_LINES}`).toBe(`${file}: true`); + } + ); + + test.each(authored.map((file) => [file]))( + '%s has no broken relative links', + (file) => { + const text = readFileSync(join(repoRoot, file), 'utf8'); + const targets = [ + ...text.matchAll(/\[[^\]]*\]\(([^)\s]+)(?:\s+"[^"]*")?\)/g), + ].map((match) => match[1]); + + const broken = []; + for (const raw of targets) { + // Anchors, external schemes and inline data are out of scope. + if (/^(https?:|mailto:|tel:|data:|#)/.test(raw)) { + continue; + } + const target = decodeURI(raw.split('#')[0]); + if (!target) { + continue; + } + const absolute = target.startsWith('/') + ? join(repoRoot, target) + : resolve(join(repoRoot, dirname(file)), target); + if (!existsSync(absolute)) { + broken.push(`${raw} (-> ${relative(repoRoot, absolute) || sep})`); + } + } + expect(`${file}: ${broken.join(', ')}`).toBe(`${file}: `); + } + ); + + // A reader following a cross-reference lands on a heading. These are the + // headings other documents and the workflows point at. + test.each([ + ['README.md', ['## Repository Layout', '## Releases', '## Development']], + [ + 'docs/CI-CD.md', + ['## Workflows', '## Invariants', '## Required repository settings'], + ], + ['js/README.md', ['## Installation', '## API Reference']], + ['rust/README.md', ['## Installation', '## Library Usage']], + ['rust/changelog.d/README.md', ['bump:']], + ['js/.changeset/README.md', ['changeset']], + ])('%s keeps its required sections', (file, sections) => { + const text = readFileSync(join(repoRoot, file), 'utf8'); + for (const section of sections) { + expect(`${file}: ${section}: ${text.includes(section)}`).toBe( + `${file}: ${section}: true` + ); + } + }); +}); From 3e3278122c6cc6f7b17224b6967e0e0c8553b186 Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 4 Sep 2026 23:24:22 +0000 Subject: [PATCH 21/34] fix(ci): stop letting whole classes of change go unchecked Every workflow was scoped by a `paths:` filter, and the union of those filters was not the repository (issue #199): * a pull request touching only `docs/**` matched no filter at all and ran zero checks; * prettier reads every tracked file but only ran behind js.yml's `js/**` filter, so a formatting violation introduced in a workflow or a markdown file first turned red on somebody else's JavaScript pull request -- a failure attributed to the wrong change; * eslint resolves its config at the repository root and lints `experiments/**` and `claude-profiles.mjs`, neither of which was in js.yml's trigger; * the workflow-hygiene test, which guards the CI invariants themselves, ran only behind `js/**` -- the one filter guaranteed not to match a workflow-only change. The new Repository quality checks workflow carries no `paths:` filter on purpose and runs the three repository-wide gates: formatting, the documentation validation added in the previous commit, and the workflow invariants. js.yml's filter grows the root-level eslint inputs. The fresh-merge simulation is extended from five jobs to every pull-request job that reads the working tree: the Rust build, the four audit jobs, the secret scan, actionlint, zizmor and the three new ones. Five jobs stay exempt with the reason recorded next to them and in the test: three are diff-based (changeset-check, the Rust changelog checks, parity), dependency-review never reads the tree, and CodeQL uploads results keyed to the checked-out commit, which GitHub rejects for a merge commit created on the runner. Three new invariants keep this from regressing, each verified to fail when its guard is removed: a pull-request job must simulate the merge or appear in the documented exemption list; every file eslint lints outside js/ must be covered by js.yml's trigger; and a workflow's push and pull_request path filters must be identical, so a green pull request keeps predicting a green main. --- .github/workflows/js.yml | 12 +++ .github/workflows/quality.yml | 134 +++++++++++++++++++++++++ .github/workflows/rust.yml | 12 +++ .github/workflows/security.yml | 56 +++++++++++ .github/workflows/workflows.yml | 24 +++++ js/tests/workflow-hygiene.test.mjs | 156 +++++++++++++++++++++++++---- 6 files changed, 373 insertions(+), 21 deletions(-) create mode 100644 .github/workflows/quality.yml diff --git a/.github/workflows/js.yml b/.github/workflows/js.yml index 03c8229..d697fb4 100644 --- a/.github/workflows/js.yml +++ b/.github/workflows/js.yml @@ -6,6 +6,12 @@ on: - main paths: - 'js/**' + # ESLint runs from the repository root, so it also lints these; without + # them here a lint error in an experiment or in claude-profiles.mjs first + # surfaced on an unrelated pull request that happened to touch js/**. + - 'eslint.config.js' + - 'claude-profiles.mjs' + - 'experiments/**' - '.github/workflows/js.yml' - 'README.md' - 'LICENSE' @@ -13,6 +19,12 @@ on: types: [opened, synchronize, reopened] paths: - 'js/**' + # ESLint runs from the repository root, so it also lints these; without + # them here a lint error in an experiment or in claude-profiles.mjs first + # surfaced on an unrelated pull request that happened to touch js/**. + - 'eslint.config.js' + - 'claude-profiles.mjs' + - 'experiments/**' - '.github/workflows/js.yml' - 'README.md' - 'LICENSE' diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml new file mode 100644 index 0000000..78dbfa4 --- /dev/null +++ b/.github/workflows/quality.yml @@ -0,0 +1,134 @@ +name: Repository quality checks + +# The checks in here apply to the whole repository, so they deliberately carry +# no `paths:` filter. +# +# js.yml only runs on `js/**`, rust.yml on `rust/**` and workflows.yml on +# `.github/**`, which left whole classes of change with no check at all +# (issue #199): a pull request that only touched `docs/**` ran nothing, and the +# formatter -- which reads every tracked file, including the workflows and the +# markdown -- only ever ran behind the `js/**` filter, so a formatting violation +# introduced in a workflow file first turned red on somebody else's JavaScript +# pull request. + +on: + push: + branches: [main] + pull_request: + types: [opened, synchronize, reopened] + workflow_dispatch: + +# Least-privilege default; nothing here writes. +permissions: + contents: read + +# Concurrency is per job, matching the other workflows. Every job here is +# read-only, so all of them are cancellable `check-*` groups. + +jobs: + format: + name: Check formatting of every tracked file + runs-on: ubuntu-latest + timeout-minutes: 10 + concurrency: + group: check-${{ github.workflow }}-${{ github.ref }}-format + cancel-in-progress: true + steps: + - uses: actions/checkout@v6 + with: + # The merge simulation below needs the base branch's history. + fetch-depth: 0 + persist-credentials: false + + # Run the checks below against the real merge result rather than a + # possibly stale merge preview, and fail on a conflict here rather than at + # merge time. Rationale in .github/scripts/simulate-fresh-merge.sh. + - name: Simulate a fresh merge with the base branch + if: github.event_name == 'pull_request' + shell: bash + env: + BASE_REF: ${{ github.base_ref }} + run: bash .github/scripts/simulate-fresh-merge.sh + + - name: Setup Bun + uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 + with: + bun-version: latest + + # Prettier lives in js/package.json but formats the whole tree: the + # `format:check` script steps out of js/ to run it from the repository + # root, where .prettierrc and .prettierignore are. + - name: Install dependencies + working-directory: js + run: bun install + + - name: Check formatting + working-directory: js + run: bun run format:check + + docs: + name: Validate documentation + runs-on: ubuntu-latest + timeout-minutes: 10 + concurrency: + group: check-${{ github.workflow }}-${{ github.ref }}-docs + cancel-in-progress: true + steps: + - uses: actions/checkout@v6 + with: + # The merge simulation below needs the base branch's history, and the + # test itself lists the tracked markdown files with `git ls-files`. + fetch-depth: 0 + persist-credentials: false + + - name: Simulate a fresh merge with the base branch + if: github.event_name == 'pull_request' + shell: bash + env: + BASE_REF: ${{ github.base_ref }} + run: bash .github/scripts/simulate-fresh-merge.sh + + - name: Setup Bun + uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 + with: + bun-version: latest + + # No `bun install`: the test reads the tree with the standard library and + # git only. Documentation validation is principle #12 of the hive-mind + # CI/CD best practices; the merge simulation matters here because a link + # breaks when *either* side of the merge moves the file. + - name: Check documentation links, size and required sections + run: bun test js/tests/docs-validation.test.mjs --timeout 10000 + + hygiene: + name: Check workflow invariants + runs-on: ubuntu-latest + timeout-minutes: 10 + concurrency: + group: check-${{ github.workflow }}-${{ github.ref }}-hygiene + cancel-in-progress: true + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + persist-credentials: false + + - name: Simulate a fresh merge with the base branch + if: github.event_name == 'pull_request' + shell: bash + env: + BASE_REF: ${{ github.base_ref }} + run: bash .github/scripts/simulate-fresh-merge.sh + + - name: Setup Bun + uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 + with: + bun-version: latest + + # actionlint and zizmor cover syntax and workflow security; this test + # covers the repository-specific invariants they cannot know about + # (concurrency shape, writer jobs, matrix job names, which quality gates + # are wired up). It ran only behind js.yml's `js/**` filter before, which + # is the one filter guaranteed not to match a workflow-only change. + - name: Check CI/CD invariants + run: bun test js/tests/workflow-hygiene.test.mjs --timeout 10000 diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 064663e..b1df1c3 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -298,8 +298,20 @@ jobs: steps: - uses: actions/checkout@v6 with: + # The merge simulation below needs the base branch's history. + fetch-depth: 0 persist-credentials: false + # Run the checks below against the real merge result rather than a + # possibly stale merge preview, and fail on a conflict here rather than at + # merge time. Rationale in .github/scripts/simulate-fresh-merge.sh. + - name: Simulate a fresh merge with the base branch + if: github.event_name == 'pull_request' + shell: bash + env: + BASE_REF: ${{ github.base_ref }} + run: bash .github/scripts/simulate-fresh-merge.sh + - name: Setup Rust uses: dtolnay/rust-toolchain@6bed0761d98439e5a578e2877258200ad565ba87 # stable branch @ 2026-09-03 diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml index bd23462..3c8a0fd 100644 --- a/.github/workflows/security.yml +++ b/.github/workflows/security.yml @@ -45,6 +45,11 @@ jobs: # findings fixed for #199 lived. language: [javascript-typescript, rust, actions] steps: + # No fresh-merge simulation here, unlike the other tree-reading jobs (see + # .github/scripts/simulate-fresh-merge.sh). The upload step keys the + # results to the commit it finds in the checkout, and GitHub rejects + # results for a commit it has never seen; a merge commit created on the + # runner is exactly that. CodeQL therefore analyses the merge preview. - uses: actions/checkout@v6 with: # Analysis reads the tree; it never pushes. @@ -76,6 +81,9 @@ jobs: # Only used to post the summary comment below, never to push. pull-requests: write steps: + # No fresh-merge simulation here either: this job never reads the working + # tree. It asks the API to compare two commit SHAs, so merging the base + # branch into the checkout would change nothing it looks at. - uses: actions/checkout@v6 with: persist-credentials: false @@ -130,8 +138,20 @@ jobs: steps: - uses: actions/checkout@v6 with: + # The merge simulation below needs the base branch's history. + fetch-depth: 0 persist-credentials: false + # Run the checks below against the real merge result rather than a + # possibly stale merge preview, and fail on a conflict here rather than at + # merge time. Rationale in .github/scripts/simulate-fresh-merge.sh. + - name: Simulate a fresh merge with the base branch + if: github.event_name == 'pull_request' + shell: bash + env: + BASE_REF: ${{ github.base_ref }} + run: bash .github/scripts/simulate-fresh-merge.sh + - uses: actions/setup-node@v6 with: node-version: 24 @@ -153,8 +173,20 @@ jobs: steps: - uses: actions/checkout@v6 with: + # The merge simulation below needs the base branch's history. + fetch-depth: 0 persist-credentials: false + # Run the checks below against the real merge result rather than a + # possibly stale merge preview, and fail on a conflict here rather than at + # merge time. Rationale in .github/scripts/simulate-fresh-merge.sh. + - name: Simulate a fresh merge with the base branch + if: github.event_name == 'pull_request' + shell: bash + env: + BASE_REF: ${{ github.base_ref }} + run: bash .github/scripts/simulate-fresh-merge.sh + - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 with: bun-version: latest @@ -176,8 +208,20 @@ jobs: steps: - uses: actions/checkout@v6 with: + # The merge simulation below needs the base branch's history. + fetch-depth: 0 persist-credentials: false + # Run the checks below against the real merge result rather than a + # possibly stale merge preview, and fail on a conflict here rather than at + # merge time. Rationale in .github/scripts/simulate-fresh-merge.sh. + - name: Simulate a fresh merge with the base branch + if: github.event_name == 'pull_request' + shell: bash + env: + BASE_REF: ${{ github.base_ref }} + run: bash .github/scripts/simulate-fresh-merge.sh + - uses: taiki-e/install-action@e67fa11c4b9316fa714ddf0abed07a0c3143b95b # v2.87.4 with: tool: cargo-audit@0.22.2 @@ -196,8 +240,20 @@ jobs: steps: - uses: actions/checkout@v6 with: + # The merge simulation below needs the base branch's history. + fetch-depth: 0 persist-credentials: false + # Run the checks below against the real merge result rather than a + # possibly stale merge preview, and fail on a conflict here rather than at + # merge time. Rationale in .github/scripts/simulate-fresh-merge.sh. + - name: Simulate a fresh merge with the base branch + if: github.event_name == 'pull_request' + shell: bash + env: + BASE_REF: ${{ github.base_ref }} + run: bash .github/scripts/simulate-fresh-merge.sh + # Nothing checked whether a credential had been committed. CodeQL does not # look for them and the audit jobs only read lockfiles, so a token pasted # into a script, a fixture or a case study would have reached main with a diff --git a/.github/workflows/workflows.yml b/.github/workflows/workflows.yml index 53068d4..23944f6 100644 --- a/.github/workflows/workflows.yml +++ b/.github/workflows/workflows.yml @@ -27,8 +27,20 @@ jobs: steps: - uses: actions/checkout@v6 with: + # The merge simulation below needs the base branch's history. + fetch-depth: 0 persist-credentials: false + # Run the checks below against the real merge result rather than a + # possibly stale merge preview, and fail on a conflict here rather than at + # merge time. Rationale in .github/scripts/simulate-fresh-merge.sh. + - name: Simulate a fresh merge with the base branch + if: github.event_name == 'pull_request' + shell: bash + env: + BASE_REF: ${{ github.base_ref }} + run: bash .github/scripts/simulate-fresh-merge.sh + # The Docker image bundles shellcheck and pyflakes, so this also lints # every `run:` block. A *native* actionlint binary without shellcheck on # PATH silently skips the shell checks and exits 0. Reproduce locally with @@ -50,8 +62,20 @@ jobs: steps: - uses: actions/checkout@v6 with: + # The merge simulation below needs the base branch's history. + fetch-depth: 0 persist-credentials: false + # Run the checks below against the real merge result rather than a + # possibly stale merge preview, and fail on a conflict here rather than at + # merge time. Rationale in .github/scripts/simulate-fresh-merge.sh. + - name: Simulate a fresh merge with the base branch + if: github.event_name == 'pull_request' + shell: bash + env: + BASE_REF: ${{ github.base_ref }} + run: bash .github/scripts/simulate-fresh-merge.sh + # actionlint cannot see workflow *security* defects: unpinned third-party # actions, checkouts that persist `GITHUB_TOKEN` in `.git/config`, or # template injection into `run:` blocks. zizmor covers those. Reproduce diff --git a/js/tests/workflow-hygiene.test.mjs b/js/tests/workflow-hygiene.test.mjs index e864128..fca7136 100644 --- a/js/tests/workflow-hygiene.test.mjs +++ b/js/tests/workflow-hygiene.test.mjs @@ -8,6 +8,7 @@ import { describe, test, expect } from 'bun:test'; import { readFileSync, readdirSync } from 'fs'; import { join, dirname, basename } from 'path'; import { fileURLToPath } from 'url'; +import { execSync } from 'child_process'; const repoRoot = join(dirname(fileURLToPath(import.meta.url)), '..', '..'); const workflowDir = join(repoRoot, '.github', 'workflows'); @@ -422,23 +423,54 @@ describe('checks validate the merge result, not a stale preview', () => { // Best practice #7. A pull-request run checks out refs/pull/N/merge, computed // when the pull request was last synchronised; if main moved since, the checks // pass on a combination that will not exist after the merge. - test.each([ - ['js.yml', 'lint'], - ['js.yml', 'test'], - ['rust.yml', 'lint'], - ['rust.yml', 'test'], - ['rust.yml', 'scripts'], - ])( - '%s / %s merges the base branch before it checks anything', - (file, jobId) => { - const steps = workflows.find((w) => w.name === file).doc.jobs[jobId] - .steps; - const index = steps.findIndex((step) => - (step.run ?? '').includes(simulation) - ); - expect(`${file}/${jobId}: ${index !== -1}`).toBe( - `${file}/${jobId}: true` - ); + const simulationStep = (job) => + (job.steps ?? []).find((step) => (step.run ?? '').includes(simulation)); + + /** + * Jobs that run on pull requests and deliberately do not merge the base + * branch first, with the reason. Anything not listed here has to simulate the + * merge, so a new job cannot quietly go back to checking a stale preview. + */ + const exempt = new Map([ + [ + 'js.yml/changeset-check', + 'diffs base against head; a local merge changes neither side of that diff', + ], + ['rust.yml/changelog', 'same: the two guards it runs are diff-based'], + ['parity.yml/parity', 'same: it diffs the merge base against HEAD'], + [ + 'security.yml/codeql', + 'uploads results keyed to the checked-out commit, and GitHub rejects a commit it has never seen', + ], + [ + 'security.yml/dependency-review', + 'compares two commit SHAs through the API and never reads the tree', + ], + ]); + + const pullRequestJobs = workflows + .filter((workflow) => 'pull_request' in (workflow.doc.on ?? {})) + .flatMap((workflow) => + Object.entries(workflow.doc.jobs) + // Writers run on push and workflow_dispatch, never on a pull request. + .filter(([, job]) => !isWriterJob(job)) + .map(([jobId, job]) => [`${workflow.name}/${jobId}`, job]) + ); + + test('the exemption list has no stale entries', () => { + const known = new Set(pullRequestJobs.map(([key]) => key)); + expect([...exempt.keys()].filter((key) => !known.has(key))).toEqual([]); + }); + + test.each(pullRequestJobs)( + '%s merges the base branch before it checks anything', + (key, job) => { + if (exempt.has(key)) { + return; + } + const steps = job.steps; + const index = steps.indexOf(simulationStep(job)); + expect(`${key}: ${index !== -1}`).toBe(`${key}: true`); // Everything that inspects the tree has to come after the merge. const checkout = steps.findIndex((step) => (step.uses ?? '').startsWith('actions/checkout@') @@ -452,17 +484,16 @@ describe('checks validate the merge result, not a stale preview', () => { '%s only simulates a merge where it can work', (_name, workflow) => { for (const [jobId, job] of Object.entries(workflow.doc.jobs)) { - const steps = job.steps ?? []; - if (!steps.some((step) => (step.run ?? '').includes(simulation))) { + const step = simulationStep(job); + if (!step) { continue; } - const step = steps.find((s) => (s.run ?? '').includes(simulation)); // `github.base_ref` is empty outside a pull request, and the merge // needs history a shallow checkout does not have. expect(`${jobId}: ${step.if}`).toBe( `${jobId}: github.event_name == 'pull_request'` ); - const checkout = steps.find((s) => + const checkout = job.steps.find((s) => (s.uses ?? '').startsWith('actions/checkout@') ); expect(`${jobId}: ${checkout.with['fetch-depth']}`).toBe(`${jobId}: 0`); @@ -470,3 +501,86 @@ describe('checks validate the merge result, not a stale preview', () => { } ); }); + +describe('repository-wide checks are not hidden behind a paths filter', () => { + // Every other workflow is scoped: js.yml to `js/**`, rust.yml to `rust/**`, + // workflows.yml to `.github/**`. A pull request touching only `docs/**` used + // to match none of them and ran nothing at all, and the formatter -- which + // reads every tracked file -- only ran behind the `js/**` filter, so a + // violation introduced in a workflow or a markdown file first turned red on + // an unrelated JavaScript pull request. + const quality = workflows.find((w) => w.name === 'quality.yml'); + + test('the quality workflow exists and runs on every pull request', () => { + expect(quality).toBeDefined(); + expect(quality.doc.on.pull_request?.paths).toBeUndefined(); + expect(quality.doc.on.push.paths).toBeUndefined(); + }); + + test.each([ + ['format', 'bun run format:check'], + ['docs', 'bun test js/tests/docs-validation.test.mjs'], + ['hygiene', 'bun test js/tests/workflow-hygiene.test.mjs'], + ])('the %s job runs %s', (jobId, command) => { + const runs = (quality.doc.jobs[jobId].steps ?? []) + .map((step) => step.run ?? '') + .join('\n'); + expect(`${jobId}: ${runs.includes(command)}`).toBe(`${jobId}: true`); + }); + + test.each(workflows.map((w) => [w.name, w]))( + '%s filters push and pull_request identically', + (_name, workflow) => { + // Two lists that drift apart mean a check runs on the pull request and + // then not on the merge to main, or the other way round. Keeping them + // equal is what makes a green pull request predict a green main. + const on = workflow.doc.on ?? {}; + if (!on.push?.paths || !on.pull_request?.paths) { + return; + } + expect(on.push.paths).toEqual(on.pull_request.paths); + } + ); + + test('every file eslint lints outside js/ triggers the lint job', () => { + // ESLint's configuration sits at the repository root so that experiments/ + // and claude-profiles.mjs are inside the lint scope. js.yml's `paths:` + // filter has to list them too, otherwise the lint job that would catch an + // error in them does not start. + const js = workflows.find((w) => w.name === 'js.yml'); + const patterns = js.doc.on.pull_request.paths; + const linted = execSync("git ls-files '*.mjs' '*.js' '*.cjs'", { + cwd: repoRoot, + encoding: 'utf8', + }) + .trim() + .split('\n') + .filter( + (file) => + !file.startsWith('js/') && + !file.startsWith('dev/log/') && + // Mirrors the ignores in js/eslint.config.js: archived evidence. + !/docs\/case-studies\/[^/]+\/(templates|data|log-excerpts)\//.test( + file + ) + ); + const uncovered = linted.filter( + (file) => + !patterns.some((pattern) => + pattern.endsWith('/**') + ? file.startsWith(pattern.slice(0, -2)) + : file === pattern + ) + ); + expect(uncovered).toEqual([]); + }); + + test('the formatter is not confined to one language directory', () => { + // js/package.json's format:check steps out of js/ on purpose; the ignore + // rules that matter live in the repository-root .prettierignore. + const scripts = JSON.parse( + readFileSync(join(repoRoot, 'js', 'package.json'), 'utf8') + ).scripts; + expect(scripts['format:check']).toContain('cd ..'); + }); +}); From 3dc7470563b1e882080db93b5b5342f14c784166 Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 4 Sep 2026 23:25:26 +0000 Subject: [PATCH 22/34] docs(ci): describe the sixth workflow and the four new invariants The CI/CD reference is the document the hygiene test points reviewers at, so it has to describe what the workflows now do: the repository-wide quality workflow and why it deliberately carries no paths filter, the fresh-merge simulation and its five documented exemptions, the identical push/pull_request filters, the wired Rust gates, the secret scan, and the documentation validation together with the decision not to fetch external links. --- docs/CI-CD.md | 41 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/docs/CI-CD.md b/docs/CI-CD.md index b02f649..a874bbc 100644 --- a/docs/CI-CD.md +++ b/docs/CI-CD.md @@ -1,6 +1,6 @@ # CI/CD -Five workflows guard this repository. Everything below is enforced by +Six workflows guard this repository. Everything below is enforced by `js/tests/workflow-hygiene.test.mjs` and `js/tests/repository-layout.test.mjs`, which parse the workflow files themselves β€” if a job drifts from what this document describes, those tests fail. @@ -13,7 +13,13 @@ document describes, those tests fail. | `rust.yml` | push to `main`, pull request, dispatch | changelog fragment check, lint and format, test (ubuntu/macos/windows), release scripts, build, release, instant release, changelog PR | | `parity.yml` | pull request | JS/Rust source parity | | `workflows.yml` | push to `main`, pull request, dispatch | actionlint, zizmor | -| `security.yml` | push to `main`, pull request, **weekly**, dispatch | CodeQL, dependency review, npm/bun/cargo audit | +| `security.yml` | push to `main`, pull request, **weekly**, dispatch | CodeQL, dependency review, npm/bun/cargo audit, secret scan | +| `quality.yml` | push to `main`, pull request, dispatch | formatting of every tracked file, documentation validation, workflow invariants | + +Every workflow except `quality.yml` is scoped by a `paths:` filter. The union of +those filters is not the repository, which is why `quality.yml` has no filter at +all: a pull request that only touches `docs/**` still runs the three checks that +read the whole tree. ## Invariants @@ -37,11 +43,40 @@ document describes, those tests fail. is skipped when a dependency is skipped, and _any_ non-`success()` condition lifts that β€” so `always()` adds nothing except the risk of running after a real failure. +- **A pull-request job that reads the tree merges the base branch first.** + A pull-request run checks out `refs/pull/N/merge`, computed when the branch + was last synchronised; if `main` moved since, the checks pass on a combination + that will not exist after the merge. + `.github/scripts/simulate-fresh-merge.sh` closes that window and turns a merge + conflict into a clear failure. Five jobs are exempt, each with the reason + recorded next to it and in the hygiene test: `changeset-check`, the Rust + changelog checks and `parity` are diff-based, `dependency-review` compares two + SHAs through the API, and CodeQL uploads results keyed to the checked-out + commit β€” GitHub rejects a merge commit created on the runner. +- **A workflow's `push:` and `pull_request:` path filters are identical.** Two + lists that drift mean a check runs on the pull request and then not on the + merge to `main`, or the reverse, so a green pull request stops predicting a + green `main`. +- **Every quality gate that ships is invoked.** `rust/scripts/` held a + file-size, a crate-size and a version-modification check that no workflow ran; + the hygiene test now fails when a script under `rust/scripts/` is neither + referenced by a workflow nor listed as deliberately unwired. +- **The tree is scanned for committed credentials.** secretlint runs over every + file on each pull request; `.secretlintrc.json` holds the rule set and + `.secretlintignore` only the generated trees. Neither CodeQL nor the audit + jobs look for secrets. +- **Documentation is validated like code.** `js/tests/docs-validation.test.mjs` + enforces a 2500-line ceiling, resolves every relative link, and checks that + the documents other automation points readers at still carry their sections. + External links are deliberately not fetched: a network link checker turns + unrelated pull requests red when a third-party site rots. - **Lint and format configuration lives at the repository root.** eslint and prettier treat the directory holding their config as the project base path; while these files lived in `js/`, root-level JavaScript was outside that path and silently unlintable. `js/eslint.config.js` remains the rule set the root - copies re-export. + copies re-export, and `js.yml`'s trigger lists the root-level files eslint + reaches (`eslint.config.js`, `claude-profiles.mjs`, `experiments/**`) so a + lint error in them cannot first surface on an unrelated pull request. ## Required repository settings From 0a3971eaa9895831c4db84427d59fc28bc9baf18 Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 4 Sep 2026 23:38:07 +0000 Subject: [PATCH 23/34] ci: check external links weekly instead of on pull requests Best practice #12 names lychee, and both pipeline templates run it as a pull-request gate. Copying that here would have made unrelated pull requests red: a lychee run over this tree reports 20 errors, and every one of them is a link that is correct in the document and unreachable from a runner -- npmjs.com answers 403 to any non-browser client, and GitHub serves the stargazers list and the /settings/ pages only to a signed-in session (evidence in dev/log/issues/199/pulls/200/lychee-run.log). So the check is split by who can break the link. Relative links, the only ones a change here can break, are already resolved offline on every pull request by docs-validation.test.mjs. External links are fetched by the new links.yml on a weekly schedule and on demand, where a failure means a link that used to work has stopped working and blocks no merge. .lycheeignore holds the known-unreachable-but-correct URLs; the hygiene test rejects an entry without a comment stating why, so nothing can be muted silently. With it the same run reports 0 errors and 20 exclusions. --- .github/workflows/links.yml | 68 +++++++++++ .lycheeignore | 19 +++ ...en-development-pipeline-template.links.yml | 104 ++++++++++++++++ ...-pipeline-template.simulate-fresh-merge.sh | 65 ++++++++++ ...en-development-pipeline-template.links.yml | 113 ++++++++++++++++++ ...-pipeline-template.simulate-fresh-merge.sh | 76 ++++++++++++ docs/CI-CD.md | 26 ++-- js/tests/docs-validation.test.mjs | 7 +- js/tests/workflow-hygiene.test.mjs | 73 +++++++++++ 9 files changed, 541 insertions(+), 10 deletions(-) create mode 100644 .github/workflows/links.yml create mode 100644 .lycheeignore create mode 100644 dev/log/issues/199/pulls/200/templates/current/js-ai-driven-development-pipeline-template.links.yml create mode 100644 dev/log/issues/199/pulls/200/templates/current/js-ai-driven-development-pipeline-template.simulate-fresh-merge.sh create mode 100644 dev/log/issues/199/pulls/200/templates/current/rust-ai-driven-development-pipeline-template.links.yml create mode 100644 dev/log/issues/199/pulls/200/templates/current/rust-ai-driven-development-pipeline-template.simulate-fresh-merge.sh diff --git a/.github/workflows/links.yml b/.github/workflows/links.yml new file mode 100644 index 0000000..cd4e509 --- /dev/null +++ b/.github/workflows/links.yml @@ -0,0 +1,68 @@ +name: Link check + +# External link rot is checked here, on a schedule, and deliberately not on +# pull requests. +# +# The pipeline templates run lychee as a pull-request gate. Doing the same here +# would have made every pull request red for reasons no pull request caused: +# a run over this tree reports 20 errors, and all 20 are links that are correct +# in the document and unreachable from a runner -- npmjs.com answers 403 to any +# non-browser client, and GitHub serves the stargazers list and the settings +# pages only to a signed-in session. That is exactly the class of false positive +# issue #199 is about, so the split is: +# +# - relative links, which a change can actually break, are resolved offline on +# every pull request by js/tests/docs-validation.test.mjs (quality.yml), +# - external links, which only the rest of the world can break, are fetched +# here once a week and on demand. +# +# A failure of this workflow therefore never blocks a merge; it says a link that +# used to work has stopped working. Known-unreachable-but-correct URLs go in +# .lycheeignore, one commented entry each. + +on: + schedule: + # Mondays at 06:00 UTC, an hour after the weekly security audit. + - cron: '0 6 * * 1' + workflow_dispatch: + +# Least-privilege default; nothing here writes. +permissions: + contents: read + +jobs: + links: + name: Check external links + runs-on: ubuntu-latest + # A run over this repository takes seconds; the budget is for a slow or + # unresponsive third-party host. + timeout-minutes: 15 + concurrency: + group: check-${{ github.workflow }}-${{ github.ref }}-links + cancel-in-progress: true + steps: + - uses: actions/checkout@v6 + with: + persist-credentials: false + + # dev/log and docs/case-studies hold verbatim copies of other + # repositories' documents, kept as evidence: their relative links point + # into the tree they came from and are not this repository's to fix. The + # same directories are skipped by js/tests/docs-validation.test.mjs. + - name: Check links with lychee + uses: lycheeverse/lychee-action@v2 + with: + args: >- + --verbose + --no-progress + --max-retries 2 + --timeout 30 + --exclude-path dev/log + --exclude-path docs/case-studies + './**/*.md' + fail: true + jobSummary: true + env: + # Raises GitHub's anonymous rate limit, which this repository's + # documents would otherwise hit on their own issue and pull links. + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.lycheeignore b/.lycheeignore new file mode 100644 index 0000000..5fea86d --- /dev/null +++ b/.lycheeignore @@ -0,0 +1,19 @@ +# Patterns (regular expressions) that .github/workflows/links.yml excludes from +# the external link check. Every entry needs the comment above it saying why the +# link is unreachable from a runner but still correct in the document -- the +# workflow-hygiene test fails on an uncommented line, so nothing can be muted +# silently. + +# npmjs.com answers every unauthenticated non-browser request with 403, whether +# the package exists or not: +# curl -sIL -o /dev/null -w '%{http_code}\n' https://www.npmjs.com/package/command-stream +# 403 +# The README badges and the comparison table link there on purpose. +^https://(www\.)?npmjs\.com/ + +# GitHub serves the stargazers list and every /settings/ page only to a signed-in +# session; anonymously both answer 404 even for this public repository: +# curl -sIL -o /dev/null -w '%{http_code}\n' https://github.com/link-foundation/command-stream/stargazers +# 404 +# docs/CI-CD.md links to the settings page as the place a maintainer has to visit. +^https://github\.com/link-foundation/command-stream/(stargazers|settings/) diff --git a/dev/log/issues/199/pulls/200/templates/current/js-ai-driven-development-pipeline-template.links.yml b/dev/log/issues/199/pulls/200/templates/current/js-ai-driven-development-pipeline-template.links.yml new file mode 100644 index 0000000..5ff315d --- /dev/null +++ b/dev/log/issues/199/pulls/200/templates/current/js-ai-driven-development-pipeline-template.links.yml @@ -0,0 +1,104 @@ +name: Broken Link Checker + +on: + push: + branches: + - main + paths: + - '**.md' + - '**.html' + - '.github/workflows/links.yml' + pull_request: + types: [opened, synchronize, reopened] + paths: + - '**.md' + - '**.html' + - '.github/workflows/links.yml' + workflow_dispatch: + +# Least-privilege default; jobs escalate individually when needed. +permissions: + contents: read + +# Provide Git config to actions/checkout itself; checkout runs git init before +# any workflow step can configure Git. +env: + GIT_CONFIG_COUNT: '1' + GIT_CONFIG_KEY_0: init.defaultBranch + GIT_CONFIG_VALUE_0: main + +jobs: + link-checker: + name: Check Links + runs-on: ubuntu-latest + # Typical run: <1min with lychee cache. 10min prevents slow + # external hosts or Wayback Machine probes from hanging the workflow. + timeout-minutes: 10 + concurrency: + group: check-${{ github.workflow }}-${{ github.ref }}-link-checker + cancel-in-progress: true + permissions: + contents: read + steps: + - uses: actions/checkout@v6 + + - name: Check links with lychee + id: lychee + uses: lycheeverse/lychee-action@v2 + with: + # Check all Markdown and HTML files + # Exclude case-studies directory - these are research documents from + # external repos with references to files and issues that don't exist + # in this repository (similar exclusion pattern as eslint.config.js) + # Exclude the Vite source HTML because its root-relative app asset + # URLs are only valid when served by Vite. + # Exclude tests/fixtures - the captured lychee reports there contain + # deliberately broken links used as parser test input. + args: >- + --verbose + --no-progress + --cache + --max-cache-age 1d + --max-retries 3 + --timeout 30 + --exclude-path docs/case-studies + --exclude-path examples/universal-app/index.html + --exclude-path tests/fixtures + './**/*.md' + './**/*.html' + # Don't fail the workflow immediately - we want to check web archive first + fail: false + # Output file for broken links report (used by check-web-archive.mjs) + output: lychee/out.md + # Write a job summary + jobSummary: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Check broken links against Web Archive + if: steps.lychee.outputs.exit_code != 0 + id: webarchive + run: node scripts/check-web-archive.mjs + env: + LYCHEE_OUTPUT: lychee/out.md + + - name: Fail if broken links were found + if: always() && steps.lychee.outputs.exit_code != 0 + run: | + echo "::error::Broken live links were detected." + echo "" + echo "What happened:" + echo " lychee found one or more broken links in the *.md and *.html files of this repository." + echo " An archive is a suggested replacement; it does not make the live link valid." + echo "" + echo "How to fix:" + echo " 1. Review the 'Check links with lychee' step above for a full list of broken links." + echo " 2. For links marked with a '::notice::' annotation above, a Web Archive replacement exists." + echo " Replace those broken links with the suggested archive.org URL." + echo " 3. For links with no archive version, either:" + echo " a. Find an updated URL that points to the same or equivalent content." + echo " b. Remove the link if the content is no longer relevant." + echo " c. Add the URL to .lycheeignore if it is a known false positive." + echo "" + echo "Report location: lychee/out.md (available as a workflow artifact if configured)." + exit 1 diff --git a/dev/log/issues/199/pulls/200/templates/current/js-ai-driven-development-pipeline-template.simulate-fresh-merge.sh b/dev/log/issues/199/pulls/200/templates/current/js-ai-driven-development-pipeline-template.simulate-fresh-merge.sh new file mode 100644 index 0000000..b4e7018 --- /dev/null +++ b/dev/log/issues/199/pulls/200/templates/current/js-ai-driven-development-pipeline-template.simulate-fresh-merge.sh @@ -0,0 +1,65 @@ +#!/usr/bin/env bash +# simulate-fresh-merge.sh +# +# Simulates a fresh merge of the current PR branch with the latest base branch. +# This ensures CI checks run against the actual merge result, not a stale merge preview. +# +# Usage: +# BASE_REF=main bash scripts/simulate-fresh-merge.sh +# +# Environment variables: +# BASE_REF The base branch to merge with (e.g. "main"). Required. +# +# Exit code 0 = merge succeeded or not needed; non-zero = merge conflict detected. +# +# See docs/case-studies/issue-23 for why this is critical. + +set -euo pipefail + +echo "=== Synchronizing PR with latest $BASE_REF ===" +echo "This prevents stale merge preview issues (see docs/case-studies/issue-23)" +echo "" + +# Configure git for merge +# The 41898282+ prefix is what links the commit to the github-actions[bot] +# account. Without it the commit is "unattributed", and a ruleset with +# require_extra_approval_for_unattributed_changes will demand a human +# approval before an automated release pull request can be merged. +git config user.email "41898282+github-actions[bot]@users.noreply.github.com" +git config user.name "github-actions[bot]" + +# Fetch the latest base branch +echo "Fetching latest $BASE_REF..." +git fetch origin "$BASE_REF" + +# Get current and base branch info +CURRENT_SHA=$(git rev-parse HEAD) +BASE_SHA=$(git rev-parse "origin/$BASE_REF") + +echo "Current checkout (merge preview): $CURRENT_SHA" +echo "Latest base branch ($BASE_REF): $BASE_SHA" +echo "" + +# Check if base branch has new commits not in the merge preview +BEHIND_COUNT=$(git rev-list --count "HEAD..origin/$BASE_REF") + +if [ "$BEHIND_COUNT" -eq 0 ]; then + echo "Merge preview is up-to-date with $BASE_REF. No simulation needed." +else + echo "Base branch has $BEHIND_COUNT new commit(s) since PR was opened/synced." + echo "Simulating fresh merge to validate actual merge result..." + echo "" + + # Attempt to merge the latest base branch + if git merge "origin/$BASE_REF" --no-edit; then + echo "" + echo "Fresh merge simulation successful!" + echo "Checks will now run against the up-to-date merged state." + else + echo "" + echo "::error::Merge conflict detected! PR needs to be rebased/updated before it can be merged." + echo "The PR branch is out of sync with $BASE_REF and cannot be automatically merged." + exit 1 + fi +fi +echo "" diff --git a/dev/log/issues/199/pulls/200/templates/current/rust-ai-driven-development-pipeline-template.links.yml b/dev/log/issues/199/pulls/200/templates/current/rust-ai-driven-development-pipeline-template.links.yml new file mode 100644 index 0000000..d0f8b1d --- /dev/null +++ b/dev/log/issues/199/pulls/200/templates/current/rust-ai-driven-development-pipeline-template.links.yml @@ -0,0 +1,113 @@ +name: Broken Link Checker + +on: + push: + branches: + - main + paths: + - '**.md' + - '**.html' + - '.github/workflows/links.yml' + - '.lycheeignore' + - 'scripts/check-web-archive.mjs' + - 'scripts/check-web-archive.test.mjs' + - 'scripts/fixtures/lychee-report.md' + pull_request: + types: [opened, synchronize, reopened] + paths: + - '**.md' + - '**.html' + - '.github/workflows/links.yml' + - '.lycheeignore' + - 'scripts/check-web-archive.mjs' + - 'scripts/check-web-archive.test.mjs' + - 'scripts/fixtures/lychee-report.md' + workflow_dispatch: + +# Least-privilege default; jobs escalate individually when needed. +permissions: + contents: read + +# Provide Git config to actions/checkout itself; checkout runs git init before +# any workflow step can configure Git. +env: + GIT_CONFIG_COUNT: '1' + GIT_CONFIG_KEY_0: init.defaultBranch + GIT_CONFIG_VALUE_0: main + +jobs: + link-checker: + name: Check Links + runs-on: ubuntu-latest + # Typical run: <1min with lychee cache. 10min prevents slow + # external hosts or Wayback Machine probes from hanging the workflow. + timeout-minutes: 10 + concurrency: + group: check-${{ github.workflow }}-${{ github.ref }}-link-checker + cancel-in-progress: true + permissions: + contents: read + steps: + - uses: actions/checkout@v6 + with: + persist-credentials: false + + - name: Test Web Archive report parser + run: node --test scripts/check-web-archive.test.mjs + + - name: Check links with lychee + id: lychee + uses: lycheeverse/lychee-action@v2 + with: + # Check all Markdown and HTML files + # Exclude case-studies directory - these are research documents from + # external repos with references to files and issues that don't exist + # in this repository (similar exclusion pattern as eslint.config.js) + args: >- + --verbose + --no-progress + --cache + --max-cache-age 1d + --max-retries 3 + --timeout 30 + --exclude-path docs/case-studies + --exclude-path scripts/fixtures + './**/*.md' + './**/*.html' + # Don't fail the workflow immediately - we want to check web archive first + fail: false + # Output file for broken links report (used by check-web-archive.mjs) + output: lychee/out.md + # Write a job summary + jobSummary: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Check broken links against Web Archive + if: steps.lychee.outputs.exit_code != 0 + id: webarchive + run: node scripts/check-web-archive.mjs + env: + LYCHEE_OUTPUT: lychee/out.md + + - name: Fail if broken links were found + if: always() && steps.lychee.outputs.exit_code != 0 + run: | + echo "::error::Broken live links were detected." + echo "" + echo "What happened:" + echo " lychee found one or more broken links in the *.md and *.html files of this repository." + echo " A Web Archive snapshot is a suggested replacement; it does not fix the broken source link." + echo "" + echo "How to fix:" + echo " 1. Review the 'Check links with lychee' step above for a full list of broken links." + echo " 2. Review the Web Archive step when it ran. For links marked with a '::notice::' annotation," + echo " a Web Archive version exists." + echo " Replace those broken links with the suggested archive.org URL." + echo " 3. For links with no archive version, either:" + echo " a. Find an updated URL that points to the same or equivalent content." + echo " b. Remove the link if the content is no longer relevant." + echo " c. Add the URL to .lycheeignore if it is a known false positive." + echo "" + echo "Report location: lychee/out.md (available as a workflow artifact if configured)." + exit 1 diff --git a/dev/log/issues/199/pulls/200/templates/current/rust-ai-driven-development-pipeline-template.simulate-fresh-merge.sh b/dev/log/issues/199/pulls/200/templates/current/rust-ai-driven-development-pipeline-template.simulate-fresh-merge.sh new file mode 100644 index 0000000..72f7f0e --- /dev/null +++ b/dev/log/issues/199/pulls/200/templates/current/rust-ai-driven-development-pipeline-template.simulate-fresh-merge.sh @@ -0,0 +1,76 @@ +#!/usr/bin/env bash +# Simulate merging the pull request head into a fresh copy of the base branch and +# run the fast checks against that merge result. +# +# A pull request can be green in isolation and still break the base branch when a +# semantic (non-textual) conflict is introduced: both sides merge cleanly, but the +# combined tree no longer compiles or passes tests. GitHub only tests the PR head +# (or a merge commit computed at PR creation time), so this script recreates the +# merge locally against the current tip of the base branch. +# +# Environment: +# GITHUB_BASE_REF - base branch name (set automatically for pull_request events) +# FRESH_MERGE_CHECKS - optional space-separated override of the commands to run +set -euo pipefail + +BASE_REF="${GITHUB_BASE_REF:-main}" + +if [ -z "${GITHUB_BASE_REF:-}" ]; then + echo "GITHUB_BASE_REF is not set; assuming base branch '${BASE_REF}'" +fi + +echo "Fetching origin/${BASE_REF}..." +git fetch --no-tags origin "${BASE_REF}" + +BASE_SHA="$(git rev-parse "origin/${BASE_REF}")" +HEAD_SHA="$(git rev-parse HEAD)" +echo "Base: ${BASE_REF} (${BASE_SHA})" +echo "Head: ${HEAD_SHA}" + +if git merge-base --is-ancestor "${HEAD_SHA}" "${BASE_SHA}"; then + echo "Head is already contained in origin/${BASE_REF}; nothing to simulate." + exit 0 +fi + +# Merge into a detached checkout of the base tip so the working branch is untouched. +git config user.name "${GIT_AUTHOR_NAME:-github-actions[bot]}" +git config user.email "${GIT_AUTHOR_EMAIL:-github-actions[bot]@users.noreply.github.com}" +git checkout --detach "${BASE_SHA}" + +if ! git merge --no-edit "${HEAD_SHA}"; then + echo "::error::Textual merge conflict with origin/${BASE_REF}. Merge the base branch into this pull request and resolve the conflicts." + git merge --abort || true + git checkout --force - + exit 1 +fi + +echo "Merge succeeded. Running checks on the merged tree..." + +status=0 +if [ -n "${FRESH_MERGE_CHECKS:-}" ]; then + # shellcheck disable=SC2086 + for check in ${FRESH_MERGE_CHECKS}; do + echo "::group::${check}" + eval "${check}" || status=1 + echo "::endgroup::" + done +else + echo "::group::cargo fmt --all -- --check" + cargo fmt --all -- --check || status=1 + echo "::endgroup::" + + echo "::group::cargo clippy --all-targets --all-features" + cargo clippy --all-targets --all-features || status=1 + echo "::endgroup::" + + echo "::group::cargo test --all-features" + cargo test --all-features || status=1 + echo "::endgroup::" +fi + +if [ "${status}" -ne 0 ]; then + echo "::error::Checks failed on the simulated merge with origin/${BASE_REF} even though they pass on the pull request head. This is a semantic merge conflict." +fi + +git checkout --force - >/dev/null 2>&1 || true +exit "${status}" diff --git a/docs/CI-CD.md b/docs/CI-CD.md index a874bbc..04bf2e1 100644 --- a/docs/CI-CD.md +++ b/docs/CI-CD.md @@ -1,6 +1,6 @@ # CI/CD -Six workflows guard this repository. Everything below is enforced by +Seven workflows guard this repository. Everything below is enforced by `js/tests/workflow-hygiene.test.mjs` and `js/tests/repository-layout.test.mjs`, which parse the workflow files themselves β€” if a job drifts from what this document describes, those tests fail. @@ -15,11 +15,12 @@ document describes, those tests fail. | `workflows.yml` | push to `main`, pull request, dispatch | actionlint, zizmor | | `security.yml` | push to `main`, pull request, **weekly**, dispatch | CodeQL, dependency review, npm/bun/cargo audit, secret scan | | `quality.yml` | push to `main`, pull request, dispatch | formatting of every tracked file, documentation validation, workflow invariants | +| `links.yml` | **weekly**, dispatch | external link check (lychee) | -Every workflow except `quality.yml` is scoped by a `paths:` filter. The union of -those filters is not the repository, which is why `quality.yml` has no filter at -all: a pull request that only touches `docs/**` still runs the three checks that -read the whole tree. +Every workflow except `quality.yml` and `links.yml` is scoped by a `paths:` +filter. The union of those filters is not the repository, which is why +`quality.yml` has no filter at all: a pull request that only touches `docs/**` +still runs the three checks that read the whole tree. ## Invariants @@ -68,8 +69,19 @@ read the whole tree. - **Documentation is validated like code.** `js/tests/docs-validation.test.mjs` enforces a 2500-line ceiling, resolves every relative link, and checks that the documents other automation points readers at still carry their sections. - External links are deliberately not fetched: a network link checker turns - unrelated pull requests red when a third-party site rots. + External links are deliberately out of scope for that test; they are checked + separately, below. +- **External links are checked weekly, not on pull requests.** Both pipeline + templates run lychee as a pull-request gate. The same job here reports 20 + errors on an unmodified tree, and all 20 are links that are correct in the + document and unreachable from a runner: npmjs.com answers `403` to any + non-browser client, and GitHub serves the stargazers list and the `/settings/` + pages only to a signed-in session. So the check is split by who can break the + link. Relative links β€” the only ones a change here can break β€” are resolved + offline on every pull request; the network is fetched by `links.yml` on a + schedule, where a failure means a link that used to work has stopped working + and blocks no merge. `.lycheeignore` carries the known-unreachable URLs, one + commented entry each, and the hygiene test rejects an uncommented one. - **Lint and format configuration lives at the repository root.** eslint and prettier treat the directory holding their config as the project base path; while these files lived in `js/`, root-level JavaScript was outside that path diff --git a/js/tests/docs-validation.test.mjs b/js/tests/docs-validation.test.mjs index 08d24b0..3c2182f 100644 --- a/js/tests/docs-validation.test.mjs +++ b/js/tests/docs-validation.test.mjs @@ -9,9 +9,10 @@ // - a document that has outgrown any reasonable review size, // - a key document losing the section a reader is sent to it for. // -// External links are deliberately not checked: a link checker that reaches the -// network turns unrelated pull requests red when a third-party site rots, which -// is the class of false positive issue #199 is about. +// External links are deliberately out of scope here: a link checker that +// reaches the network turns unrelated pull requests red when a third-party site +// rots, which is the class of false positive issue #199 is about. They are +// fetched weekly instead, by .github/workflows/links.yml, which blocks nothing. import { describe, test, expect } from 'bun:test'; import { readFileSync, existsSync } from 'fs'; import { join, dirname, resolve, relative, sep } from 'path'; diff --git a/js/tests/workflow-hygiene.test.mjs b/js/tests/workflow-hygiene.test.mjs index fca7136..0aea1e3 100644 --- a/js/tests/workflow-hygiene.test.mjs +++ b/js/tests/workflow-hygiene.test.mjs @@ -584,3 +584,76 @@ describe('repository-wide checks are not hidden behind a paths filter', () => { expect(scripts['format:check']).toContain('cd ..'); }); }); + +describe('external links are checked without gating pull requests', () => { + // Best practice #12 names lychee. Both pipeline templates run it as a + // pull-request gate; here that would have turned unrelated pull requests red, + // because a run over this tree reports 20 errors and every one of them is a + // link that is correct in the document and unreachable from a runner + // (npmjs.com answers 403 to non-browser clients, GitHub serves the stargazers + // list and /settings/ only to a signed-in session). So the check is split: + // relative links -- the only ones a change here can break -- are resolved + // offline on every pull request by docs-validation.test.mjs, and the network + // is fetched on a schedule instead. + const links = workflows.find((w) => w.name === 'links.yml'); + + const lycheeStep = () => + Object.values(links.doc.jobs) + .flatMap((job) => job.steps ?? []) + .find((step) => + (step.uses ?? '').startsWith('lycheeverse/lychee-action') + ); + + test('the link workflow exists and runs lychee', () => { + expect(links).toBeDefined(); + expect(lycheeStep()).toBeDefined(); + }); + + test('it runs on a schedule and on demand, never on a pull request', () => { + const on = links.doc.on ?? {}; + expect(on.schedule?.length).toBeGreaterThan(0); + expect('workflow_dispatch' in on).toBe(true); + // A third-party site going down is not a reason to block someone's merge, + // and a red check nobody can fix from the branch is how a pipeline teaches + // people to ignore red checks. + expect('pull_request' in on).toBe(false); + expect('push' in on).toBe(false); + }); + + test('a broken link fails the scheduled run', () => { + // `fail: false` is what the templates use, because a later step decides; + // there is no later step here, so the action itself has to fail the job or + // the schedule reports success no matter what it found. + expect(lycheeStep().with.fail).toBe(true); + }); + + test('archived copies of other repositories are excluded', () => { + // Same trees docs-validation.test.mjs treats as archived: their links point + // into the repository they were copied from. The archived hive-mind + // best-practices document alone contributes five unfixable errors. + const args = String(lycheeStep().with.args); + expect(args).toContain('--exclude-path dev/log'); + expect(args).toContain('--exclude-path docs/case-studies'); + }); + + test('every .lycheeignore entry is a valid regex with a stated reason', () => { + // An ignore list is where a link checker goes to die: one uncommented line + // and the next reader cannot tell a bot-walled host from a link somebody + // gave up on. + const lines = readFileSync(join(repoRoot, '.lycheeignore'), 'utf8').split( + '\n' + ); + const patterns = []; + lines.forEach((line, index) => { + const value = line.trim(); + if (!value || value.startsWith('#')) { + return; + } + patterns.push(value); + const previous = (lines[index - 1] ?? '').trim(); + expect(`${value}: ${previous.startsWith('#')}`).toBe(`${value}: true`); + expect(() => new RegExp(value)).not.toThrow(); + }); + expect(patterns.length).toBeGreaterThan(0); + }); +}); From 0596cec98003b0df91847df5daf0ad7daf51ca5c Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 4 Sep 2026 23:46:47 +0000 Subject: [PATCH 24/34] test: list tracked files without a shell so the checks work on Windows The Windows leg of the test matrix failed on both new tests: (fail) documentation validation > the file list is not empty and skips archived copies -- Expected: > 20, Received: 0 (fail) every file eslint lints outside js/ triggers the lint job -- Received [""] execSync runs the command through the platform shell: /bin/sh strips the quotes in `git ls-files '*.md'`, cmd.exe does not, so git looked for a path literally named `'*.md'`, matched nothing and exited 0. The documentation check was therefore validating an empty list on Windows -- a silent false negative of exactly the kind this pull request is about, caught only because the assertion that the list is non-empty was already there. execFileSync passes the arguments to git directly, so git expands the pattern itself on every platform. experiments/git-ls-files-quoting.mjs reproduces both behaviours on Linux: execSync, shell strips the quotes (POSIX): 37 file(s) execSync, quotes reach git (what cmd.exe does): 0 file(s) execFileSync, no shell at all: 37 file(s) Also files the two upstream reports for the JavaScript pipeline template (issues #159 and #160) under dev/log. --- .../200/upstream/js-template-artipacked.md | 126 ++++++++++++++++++ .../js-template-lycheeignore-paths.md | 100 ++++++++++++++ experiments/git-ls-files-quoting.mjs | 34 +++++ js/tests/docs-validation.test.mjs | 9 +- js/tests/workflow-hygiene.test.mjs | 8 +- 5 files changed, 273 insertions(+), 4 deletions(-) create mode 100644 dev/log/issues/199/pulls/200/upstream/js-template-artipacked.md create mode 100644 dev/log/issues/199/pulls/200/upstream/js-template-lycheeignore-paths.md create mode 100644 experiments/git-ls-files-quoting.mjs diff --git a/dev/log/issues/199/pulls/200/upstream/js-template-artipacked.md b/dev/log/issues/199/pulls/200/upstream/js-template-artipacked.md new file mode 100644 index 0000000..58cb85d --- /dev/null +++ b/dev/log/issues/199/pulls/200/upstream/js-template-artipacked.md @@ -0,0 +1,126 @@ +`actions/checkout` leaves the job token in `.git/config` unless it is told not +to. In this template 25 of the 27 checkouts leave it there, and the workflow +that is supposed to catch exactly that cannot report it. + +## The blind spot + +`.github/workflows/workflows.yml` runs: + +```yaml + - uses: zizmorcore/zizmor-action@v0.6.2 + with: + advanced-security: false + annotations: true + config: .github/zizmor.yml + min-confidence: medium +``` + +zizmor's `artipacked` audit reports at **Low** confidence, so +`min-confidence: medium` filters every instance out. Run against this +repository's own workflows with its own config: + +```console +$ zizmor --config .github/zizmor.yml --min-confidence medium .github/workflows +58 findings (33 ignored, 22 suppressed, 3 safe fixes): 0 informational, 3 low, 0 medium, 0 high + +$ zizmor --config .github/zizmor.yml --min-confidence low .github/workflows +58 findings (1 ignored, 22 suppressed, 3 safe fixes, 32 unsafe fixes): 7 informational, 28 low, 0 medium, 0 high + +$ zizmor --config .github/zizmor.yml --min-confidence low .github/workflows | grep -c 'help\[artipacked\]' +25 +``` + +(zizmor 1.30.0. The three findings still visible at `medium` are the +`self-repository` ones from #155.) + +Sample: + +``` +help[artipacked]: credential persistence through GitHub Actions artifacts + --> .github/workflows/links.yml:43:9 + | +43 | - uses: actions/checkout@v6 + | ^^^^^^^^^^^^^^^^^^^^^^^^^ does not set persist-credentials: false + | + = note: audit confidence β†’ Low + = note: this finding has an auto-fix +``` + +## Where + +Every checkout except the two in `workflows.yml`: + +| Workflow | Jobs | +| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `release.yml` | `detect-changes`, `test-compilation`, `check-file-line-limits`, `version-check`, `changeset-check`, `lint`, `test`, `docker-build`, `validate-docs`, `docker-publish-config`, `docker-publish-build`, `docker-publish`, `pipeline-status` (read-only) and `release`, `instant-release`, `changeset-pr` (`contents: write`) | +| `security.yml` | `codeql`, `dependency-review`, `npm-audit` | +| `example-app.yml` | `web-build`, `desktop-package`, `android-build`, `ios-build`, `preview-regen` | +| `links.yml` | `link-checker` | + +The Rust template is the counter-example: there, every checkout sets +`persist-credentials: false` except the two jobs that actually push +(`auto-release`, `manual-release` in `release.yml`), which is what a deliberate +decision looks like. + +## Why it matters + +The read-only jobs are the ones worth fixing first, and `lint` and `test` most +of all: both check out a pull-request branch, run `npm install` on it, and then +run that branch's code. A `postinstall` script or a compromised transitive +dependency can read `.git/config` and use the token for as long as the job runs; +anything that uploads the workspace (or a `.git`-containing subdirectory) as an +artifact publishes it outright. That is the whole point of the `artipacked` +audit, and this repository has switched it off by accident. + +## Reproduction + +```console +$ git clone https://github.com/link-foundation/js-ai-driven-development-pipeline-template +$ cd js-ai-driven-development-pipeline-template +$ pipx run zizmor==1.30.0 --config .github/zizmor.yml --min-confidence medium .github/workflows # 0 artipacked +$ pipx run zizmor==1.30.0 --config .github/zizmor.yml --min-confidence low .github/workflows # 25 artipacked +``` + +Or inside a job, without zizmor: + +```yaml + - uses: actions/checkout@v6 + - run: git config --get http.https://github.com/.extraheader # prints AUTHORIZATION: basic *** +``` + +## Workaround + +Add `persist-credentials: false` to the checkouts by hand; the audit that would +have found the next one stays off. + +## Suggested fix + +1. Set `persist-credentials: false` on every checkout in a job that does not + push: + + ```diff + - uses: actions/checkout@v6 + + with: + + persist-credentials: false + ``` + + `zizmor --config .github/zizmor.yml --min-confidence low --fix=all + .github/workflows` applies this, but its fixes are `unsafe` here precisely + because of the three writer jobs β€” review those three (`release`, + `instant-release`, `changeset-pr`) and keep their credentials. + +2. Then lower the workflow's threshold so a new checkout cannot re-introduce it: + + ```diff + config: .github/zizmor.yml + - min-confidence: medium + + min-confidence: low + ``` + + After step 1 that leaves ~10 findings, all in the informational/low bucket + and each either fixable or suppressible with a `# zizmor: ignore[...]` + comment that records the reason β€” which is strictly better than a threshold + that hides an entire audit. + +Found while auditing CI/CD against this template for +link-foundation/command-stream#199. diff --git a/dev/log/issues/199/pulls/200/upstream/js-template-lycheeignore-paths.md b/dev/log/issues/199/pulls/200/upstream/js-template-lycheeignore-paths.md new file mode 100644 index 0000000..e974303 --- /dev/null +++ b/dev/log/issues/199/pulls/200/upstream/js-template-lycheeignore-paths.md @@ -0,0 +1,100 @@ +`links.yml` runs the link checker for changes to `**.md`, `**.html` and the +workflow file itself: + +```yaml +# .github/workflows/links.yml +on: + push: + branches: [main] + paths: + - '**.md' + - '**.html' + - '.github/workflows/links.yml' + pull_request: + types: [opened, synchronize, reopened] + paths: + - '**.md' + - '**.html' + - '.github/workflows/links.yml' +``` + +Two inputs the job actually reads are missing from both lists: + +- `.lycheeignore`, which the lychee step loads on every run, +- `scripts/check-web-archive.mjs`, which the job executes when lychee reports a + broken link. + +The Rust template lists all four ([`rust-ai-driven-development-pipeline-template/.github/workflows/links.yml`](https://github.com/link-foundation/rust-ai-driven-development-pipeline-template/blob/main/.github/workflows/links.yml)): + +```yaml + paths: + - '**.md' + - '**.html' + - '.github/workflows/links.yml' + - '.lycheeignore' + - 'scripts/check-web-archive.mjs' + - 'scripts/check-web-archive.test.mjs' + - 'scripts/fixtures/lychee-report.md' +``` + +## Why it matters + +`.lycheeignore` is the documented escape hatch for a false positive β€” the +failure message the workflow prints says so itself: + +``` +echo " c. Add the URL to .lycheeignore if it is a known false positive." +``` + +Following that instruction does not work on a pull request whose only change is +the ignore entry. `Check Links` does not start, so the red result stays as it +was: with the job listed as a required check the pull request cannot go green +from the branch at all, and without it the author sees a stale failure and has +to push an unrelated `.md` edit, or run the workflow by hand, to clear it. + +The same gap hides a real regression: `scripts/check-web-archive.mjs` runs +inside this workflow, and a change to it does not trigger the workflow that +runs it. + +## Reproduction + +1. On a branch, add a line to `.lycheeignore` and change nothing else. +2. Open a pull request. +3. `Check Links` is not among the checks β€” the `paths:` filter matched nothing. + +## Workaround + +Push a whitespace change to any `.md` file in the same pull request, or trigger +the workflow manually through `workflow_dispatch`. + +## Suggested fix + +Add the missing inputs to both `paths:` lists, as the Rust template already +does: + +```diff + push: + branches: [main] + paths: + - '**.md' + - '**.html' + - '.github/workflows/links.yml' ++ - '.lycheeignore' ++ - 'scripts/check-web-archive.mjs' + pull_request: + types: [opened, synchronize, reopened] + paths: + - '**.md' + - '**.html' + - '.github/workflows/links.yml' ++ - '.lycheeignore' ++ - 'scripts/check-web-archive.mjs' +``` + +`tests/links-workflow.test.js` is a natural place to keep it from drifting +again β€” it already parses this workflow, so an assertion that every file the +job reads appears in both `paths:` lists (and that the two lists are equal) +would fail today. + +Found while auditing CI/CD against this template for +link-foundation/command-stream#199. diff --git a/experiments/git-ls-files-quoting.mjs b/experiments/git-ls-files-quoting.mjs new file mode 100644 index 0000000..e502f51 --- /dev/null +++ b/experiments/git-ls-files-quoting.mjs @@ -0,0 +1,34 @@ +#!/usr/bin/env node +// Why js/tests/*.test.mjs list tracked files with execFileSync. +// +// `execSync("git ls-files '*.md'")` runs through the platform shell: +// /bin/sh on POSIX, which strips the single quotes, and cmd.exe on Windows, +// which does not. git then looks for a path literally named `'*.md'`, matches +// nothing and exits 0, so the caller sees an empty file list instead of an +// error -- js/tests/docs-validation.test.mjs validated zero documents on the +// Windows leg of the matrix until this was fixed. +// +// This script reproduces the Windows behaviour on any platform by quoting the +// pattern twice, and shows that execFileSync is immune because no shell is +// involved. +import { execSync, execFileSync } from 'child_process'; + +const count = (out) => out.trim().split('\n').filter(Boolean).length; +const repoRoot = new URL('..', import.meta.url).pathname; +const run = (label, fn) => { + try { + console.log(`${label}: ${count(fn())} file(s)`); + } catch (error) { + console.log(`${label}: failed with ${error.message.split('\n')[0]}`); + } +}; + +run('execSync, shell strips the quotes (POSIX)', () => + execSync("git ls-files '*.md'", { cwd: repoRoot, encoding: 'utf8' }) +); +run('execSync, quotes reach git (what cmd.exe does)', () => + execSync(`git ls-files "'*.md'"`, { cwd: repoRoot, encoding: 'utf8' }) +); +run('execFileSync, no shell at all', () => + execFileSync('git', ['ls-files', '*.md'], { cwd: repoRoot, encoding: 'utf8' }) +); diff --git a/js/tests/docs-validation.test.mjs b/js/tests/docs-validation.test.mjs index 3c2182f..a1a04aa 100644 --- a/js/tests/docs-validation.test.mjs +++ b/js/tests/docs-validation.test.mjs @@ -16,11 +16,16 @@ import { describe, test, expect } from 'bun:test'; import { readFileSync, existsSync } from 'fs'; import { join, dirname, resolve, relative, sep } from 'path'; -import { execSync } from 'child_process'; +import { execFileSync } from 'child_process'; const repoRoot = join(dirname(Bun.fileURLToPath(import.meta.url)), '..', '..'); -const markdownFiles = execSync("git ls-files '*.md'", { +// execFileSync, not execSync: `git ls-files '*.md'` goes through cmd.exe on +// Windows, which does not strip single quotes, so git looked for a file named +// `'*.md'`, matched nothing, and this file validated an empty list -- green on +// Windows because it checked nothing at all (caught by the Windows leg of the +// test matrix). Without a shell, git expands the pattern itself everywhere. +const markdownFiles = execFileSync('git', ['ls-files', '*.md'], { cwd: repoRoot, encoding: 'utf8', }) diff --git a/js/tests/workflow-hygiene.test.mjs b/js/tests/workflow-hygiene.test.mjs index 0aea1e3..65e30f6 100644 --- a/js/tests/workflow-hygiene.test.mjs +++ b/js/tests/workflow-hygiene.test.mjs @@ -8,7 +8,7 @@ import { describe, test, expect } from 'bun:test'; import { readFileSync, readdirSync } from 'fs'; import { join, dirname, basename } from 'path'; import { fileURLToPath } from 'url'; -import { execSync } from 'child_process'; +import { execFileSync } from 'child_process'; const repoRoot = join(dirname(fileURLToPath(import.meta.url)), '..', '..'); const workflowDir = join(repoRoot, '.github', 'workflows'); @@ -549,12 +549,16 @@ describe('repository-wide checks are not hidden behind a paths filter', () => { // error in them does not start. const js = workflows.find((w) => w.name === 'js.yml'); const patterns = js.doc.on.pull_request.paths; - const linted = execSync("git ls-files '*.mjs' '*.js' '*.cjs'", { + // execFileSync: with a shell, cmd.exe passes the quotes through to git on + // Windows, the pattern matches nothing, and the empty line that leaves + // behind is reported as an uncovered file. + const linted = execFileSync('git', ['ls-files', '*.mjs', '*.js', '*.cjs'], { cwd: repoRoot, encoding: 'utf8', }) .trim() .split('\n') + .filter(Boolean) .filter( (file) => !file.startsWith('js/') && From d76ea3b1cd0cbcb406285883f87bbde9efdc0c8e Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 4 Sep 2026 23:51:04 +0000 Subject: [PATCH 25/34] docs(dev/log): record root causes 4.17-4.23 and the two new upstream reports --- .../issues/199/pulls/200/analysis/README.md | 175 +++++++++++++++++- 1 file changed, 170 insertions(+), 5 deletions(-) diff --git a/dev/log/issues/199/pulls/200/analysis/README.md b/dev/log/issues/199/pulls/200/analysis/README.md index 87ff80d..4f99d87 100644 --- a/dev/log/issues/199/pulls/200/analysis/README.md +++ b/dev/log/issues/199/pulls/200/analysis/README.md @@ -53,10 +53,10 @@ named in the issue title.** | # | Requirement (verbatim intent) | Where addressed | | --- | --- | --- | -| R1 | Check for **all false positives** in CI/CD and fix them | Β§4.1, Β§4.9 | -| R2 | Check for **all false negatives** in CI/CD and fix them | Β§4.2, Β§4.3, Β§4.4, Β§4.6 | -| R3 | Check for **all warnings** in CI/CD and fix them | Β§4.2, Β§4.3, Β§4.5 | -| R4 | Check for **all errors** in CI/CD and fix them | Β§4.1, Β§4.5 | +| R1 | Check for **all false positives** in CI/CD and fix them | Β§4.1, Β§4.9, Β§4.13, Β§4.17, Β§4.21, Β§4.22 | +| R2 | Check for **all false negatives** in CI/CD and fix them | Β§4.2, Β§4.3, Β§4.4, Β§4.6, Β§4.10, Β§4.11, Β§4.16, Β§4.17, Β§4.18, Β§4.19, Β§4.20, Β§4.23 | +| R3 | Check for **all warnings** in CI/CD and fix them | Β§4.2, Β§4.3, Β§4.5, Β§4.16 | +| R4 | Check for **all errors** in CI/CD and fix them | Β§4.1, Β§4.5, Β§4.12, Β§4.14, Β§4.15 | | R5 | Compare **all files** (full tree, all workflows and CI/CD scripts) against `link-foundation/js-ai-driven-development-pipeline-template` | Β§5 | | R6 | …and against `link-foundation/rust-ai-driven-development-pipeline-template` | Β§5 | | R7 | Reuse **all their best practices** | Β§5, Β§6 | @@ -267,6 +267,124 @@ both of which failed the Rust job on `a00126b`: The second one exists in the Rust template too, where it is invisible because nothing there runs the script suites at all β€” reported upstream (Β§7). +### 4.17 FALSE NEGATIVE β€” repository-wide checks were hidden behind `paths:` filters + +`js.yml` ran on `js/**`, `rust.yml` on `rust/**`, `workflows.yml` on +`.github/**`, `parity.yml` on both source trees. The union of those filters is +not the repository, so a pull request touching only `docs/**` matched no +workflow and ran **nothing at all**. Worse, three checks that read the whole +tree lived behind the `js/**` filter: + +* `format:check` runs prettier from the repository root over every tracked file, +* `workflow-hygiene.test.mjs` parses `.github/workflows/*`, +* the documentation checks added for Β§4.20. + +A formatting violation introduced in a workflow file or a markdown document +therefore first turned red on the next unrelated JavaScript pull request β€” the +textbook false positive: a red check on a change that did not cause it. + +Fix: `quality.yml`, deliberately without a `paths:` filter, runs those three +checks on every pull request; `js.yml`'s filter gained the root-level files +eslint reaches (`eslint.config.js`, `claude-profiles.mjs`, `experiments/**`); +and two hygiene invariants keep it that way β€” every file eslint lints outside +`js/` must appear in `js.yml`'s trigger, and a workflow's `push:` and +`pull_request:` filters must be identical, so a green pull request keeps +predicting a green `main`. + +### 4.18 FALSE NEGATIVE β€” three shipped quality gates were never invoked + +`rust/scripts/` contained `check-file-size.rs`, `check-crate-size.rs` and +`check-version-modification.rs`. No workflow, script or document referenced any +of them (`grep -rn` across the tree returned only their own definitions), so the +pipeline reported "all checks passed" for gates that never ran β€” including the +file-size limit that best practice #2 requires and that eslint already enforces +on the JavaScript side. `rust.yml` now runs all three, and a hygiene test fails +when a script under `rust/scripts/` is neither referenced by a workflow nor +listed as a documented exception. + +### 4.19 FALSE NEGATIVE β€” nothing scanned the tree for committed credentials + +Best practice #11. CodeQL does not look for secrets, and the audit jobs only +read lockfiles, so a committed credential would have reached `main` unnoticed. +`security.yml` now runs secretlint with the recommended preset over every file +on each pull request; `.secretlintrc.json` holds the rule set and +`.secretlintignore` only generated trees β€” a hygiene test rejects any ignore +pattern outside `node_modules/`, `rust/target/` and `js/{reports,coverage}/`. + +### 4.20 FALSE NEGATIVE β€” documentation was never validated + +Best practice #12. `js/tests/docs-validation.test.mjs` now enforces the +2500-line ceiling, resolves every relative link in every authored markdown file +and checks that the documents other automation points readers at still carry +their sections. It found two real breakages on the first run: two case-study +links pointed at release markers the release process had consumed, and one +pointed one directory level too high. + +### 4.21 FALSE POSITIVE/NEGATIVE β€” the checks validated a stale merge preview + +Best practice #7. A `pull_request` run checks out `refs/pull/N/merge`, computed +when the branch was last synchronised. If `main` moved since, every check +validated a combination that will not exist after the merge β€” green pull +request, broken `main`. Every pull-request job that reads the tree now runs +`.github/scripts/simulate-fresh-merge.sh` first, which also turns a merge +conflict into a clear failure instead of a surprise at merge time. Five jobs are +exempt with the reason recorded next to them and in the hygiene test +(`changeset-check`, the Rust changelog checks and `parity` are diff-based; +`dependency-review` compares two SHAs through the API; CodeQL uploads results +keyed to a commit GitHub has to know). + +### 4.22 FALSE POSITIVE β€” a link checker on pull requests reports 20 unfixable errors + +Best practice #12 names `lychee`, and both templates run it as a pull-request +gate. Copying that verbatim would have imported a false-positive generator. A +run over this tree (`lychee-run.log`): + +``` +πŸ” 114 Total πŸ”— 73 Unique βœ… 94 OK 🚫 20 Errors +``` + +All 20 are links that are correct in the document and unreachable from a +runner β€” npmjs.com answers `403` to any non-browser client (verified with +`curl -A 'Mozilla/5.0'`, still 403) and GitHub serves the stargazers list and +`/settings/` pages only to a signed-in session (`404` anonymously, even though +the repository is public). Including the archived trees adds five more, from a +verbatim copy of hive-mind's own best-practices document whose links point into +the repository it came from. + +The split is by who can break the link. Relative links β€” the only ones a change +here can break β€” are resolved offline on every pull request (Β§4.20). External +links are fetched weekly and on demand by `links.yml`, whose failure means a +link that used to work has stopped working and blocks no merge. +`.lycheeignore` records the known-unreachable URLs, one commented entry each, +and with it the same run reports `0 Errors, 20 Excluded` +(`lychee-with-ignore.log`). + +### 4.23 FALSE NEGATIVE β€” the new checks validated nothing on Windows + +Found by the Windows leg of the matrix on run 33930261205: + +``` +(fail) documentation validation > the file list is not empty ... Expected: > 20, Received: 0 +(fail) every file eslint lints outside js/ triggers the lint job ... Received [""] +``` + +`execSync("git ls-files '*.md'")` goes through the platform shell. `/bin/sh` +strips the single quotes; `cmd.exe` does not, so git looked for a path literally +named `'*.md'`, matched nothing and exited 0 β€” the documentation checks were +validating an empty list. `execFileSync('git', ['ls-files', '*.md'])` uses no +shell, so git expands the pattern itself everywhere. +`experiments/git-ls-files-quoting.mjs` reproduces both behaviours on Linux: + +``` +execSync, shell strips the quotes (POSIX): 37 file(s) +execSync, quotes reach git (what cmd.exe does): 0 file(s) +execFileSync, no shell at all: 37 file(s) +``` + +Only the assertion that the list is non-empty made this visible, which is the +argument for writing that assertion into every check that discovers its own +inputs. + ## 5. File-by-file comparison against both templates Scripts (`analysis/js-scripts-diff.log`, `analysis/rust-scripts-diff.log`): @@ -289,6 +407,23 @@ Workflows β€” present in **both** templates, absent here: | `.github/workflows/security.yml` | CodeQL, dependency review, ecosystem audit | | `.github/zizmor.yml` | `unpinned-uses` policy | | `.github/actionlint.yaml` | known-runner-label allowlist | +| `.github/workflows/links.yml` | lychee link check | +| `.github/scripts/simulate-fresh-merge.sh` (js) / `scripts/simulate-fresh-merge.sh` (rust) | merge the base branch before checking | +| `.secretlintrc.json`, `.secretlintignore` | committed-credential scan | + +All of them are now present here, with two deliberate divergences, both recorded +in `docs/CI-CD.md` and enforced by the hygiene test: + +* **`links.yml` runs weekly, not on pull requests** (Β§4.22). Both templates gate + merges on it; on this tree that gate reports 20 errors that no change here can + fix. +* **zizmor's input is `.github/workflows`, not `.`** (Β§4.13), because this + repository archives other projects' workflows under `docs/case-studies/`. + +Two defects in the templates' own copies of these files were reported upstream +(Β§7): the js template's `links.yml` `paths:` filter omits the very files the job +reads, and its zizmor job runs at `min-confidence: medium`, which hides the +`artipacked` findings for all 25 of its checkouts that persist credentials. ## 6. Best practices applied from `CI-CD-BEST-PRACTICES.md` @@ -306,6 +441,22 @@ Workflows β€” present in **both** templates, absent here: 9. Warnings are errors (`-D warnings`, `--max-warnings 0`). 10. Verification of published artifacts (`wait-for-npm.mjs`, `wait-for-crate.rs`) so a green release means an installable artifact. +11. #7 *Validate the actual merge result* β€” every pull-request job that reads + the tree merges the base branch first + (`.github/scripts/simulate-fresh-merge.sh`), so a green pull request is a + statement about what `main` will contain; the five diff- or API-based jobs + that must not are exempt with the reason recorded (Β§4.21). +12. #11 *Secrets detection* β€” secretlint with the recommended preset over every + file on each pull request (Β§4.19). +13. #12 *Documentation validation* β€” size ceiling, relative-link resolution and + required-section checks offline on every pull request, external links + weekly (Β§4.20, Β§4.22). +14. Repository-wide checks run without a `paths:` filter (`quality.yml`), and a + workflow's `push:` and `pull_request:` filters must be identical, so no + change class is left unchecked and a green pull request keeps predicting a + green `main` (Β§4.17). +15. Every shipped quality gate is invoked by a workflow, or listed as + deliberately unwired (Β§4.18). ## 7. Upstream issues reported @@ -319,12 +470,23 @@ code-level fix: | [#158](https://github.com/link-foundation/js-ai-driven-development-pipeline-template/issues/158) | js template | `publish-retry.mjs` misses npm's E409 "Cannot publish over previously staged version", turning successful releases into failed jobs (Β§4.1) | | [#149](https://github.com/link-foundation/rust-ai-driven-development-pipeline-template/issues/149) | rust template | `release.yml` puts `CARGO_REGISTRY_TOKEN`/`CARGO_TOKEN` in the workflow-level `env:`, handing the publish token to seven jobs that compile pull-request code (Β§4.15) | | [#150](https://github.com/link-foundation/rust-ai-driven-development-pipeline-template/issues/150) | rust template | No workflow runs `rust-script --test`, so 78 tests across 9 scripts never execute; `create-github-release.rs` does not compile in test mode and `version-and-commit.rs` fails under the template's own `RUSTFLAGS: -Dwarnings` (Β§4.16) | +| [#159](https://github.com/link-foundation/js-ai-driven-development-pipeline-template/issues/159) | js template | `links.yml`'s `paths:` filter omits `.lycheeignore` and `scripts/check-web-archive.mjs`, so editing the ignore list or the archive helper does not re-run the job that reads them | +| [#160](https://github.com/link-foundation/js-ai-driven-development-pipeline-template/issues/160) | js template | 25 of 27 checkouts persist credentials, and `min-confidence: medium` hides every `artipacked` finding (it is a Low-confidence check), so the audit reports 3 findings instead of 28 | Checked and deliberately **not** reported, because they are correct as written: the Rust template's `pipeline-status: if: always()` (it intentionally reports cancelled jobs), matrix job names that omit a `runner` key when another key already disambiguates them, and the JavaScript template's three low-confidence -`self-repository` zizmor findings. +`self-repository` zizmor findings. Two more were tested and dropped: + +* the js template's `secretlint "**/*"` runs after `npm install`, but with a + 131 MB `node_modules/` present the exact command finishes in 19 s with zero + findings, so there is nothing to report; +* both templates' `if: always() && steps.lychee.outputs.exit_code != 0` is + redundant rather than wrong β€” when the step is skipped the output is `''` and + `'' != 0` is false β€” and the js template's own + `tests/links-workflow.test.js` asserts that exact string, so changing it would + break its test suite for no behavioural gain. ### Detail: #158 @@ -367,3 +529,6 @@ the issue text (see Β§9 of the PR description). | `npm audit --package-lock-only --audit-level=high` | Dependency advisories without a network install. | | [`@changesets/cli`](https://github.com/changesets/changesets) | Already in use for versioning/publishing. | | npm registry metadata endpoint (`https://registry.npmjs.org/`) | Publication check that does not depend on `npm view`'s cache/replica behaviour. | +| [`secretlint`](https://github.com/secretlint/secretlint) + `@secretlint/secretlint-rule-preset-recommend` | Committed-credential scan (best practice #11). Chosen over gitleaks/trufflehog because it needs no extra toolchain in a repository that already runs npm, and its ignore file is reviewable text. | +| [`lychee`](https://lychee.cloudflare.dev/) via `lycheeverse/lychee-action` | External link checking, weekly rather than per-pull-request (Β§4.22), with `.lycheeignore` for endpoints that answer only to a browser session. | +| `git ls-files` via `execFileSync` | Input discovery for the documentation and hygiene tests. Deliberately not a glob library: git already knows what is tracked, and going through a shell is what broke it on Windows (Β§4.23). | From 66e1caeb1f9fd9f8d978009508f22953aa514bfd Mon Sep 17 00:00:00 2001 From: konard Date: Fri, 4 Sep 2026 23:55:45 +0000 Subject: [PATCH 26/34] ci: document and pin the duplication threshold, drop the bootstrap .gitkeep --- .gitkeep | 1 - dev/log/issues/199/pulls/200/analysis/README.md | 10 ++++++++-- docs/CI-CD.md | 8 ++++++++ js/tests/duplication-check.test.mjs | 11 +++++++++++ 4 files changed, 27 insertions(+), 3 deletions(-) delete mode 100644 .gitkeep diff --git a/.gitkeep b/.gitkeep deleted file mode 100644 index 7a48f06..0000000 --- a/.gitkeep +++ /dev/null @@ -1 +0,0 @@ -# .gitkeep file auto-generated at 2026-09-04T20:28:26.756Z for PR creation at branch issue-199-32c07917fc87 for issue https://github.com/link-foundation/command-stream/issues/199 \ No newline at end of file diff --git a/dev/log/issues/199/pulls/200/analysis/README.md b/dev/log/issues/199/pulls/200/analysis/README.md index 4f99d87..e887cf1 100644 --- a/dev/log/issues/199/pulls/200/analysis/README.md +++ b/dev/log/issues/199/pulls/200/analysis/README.md @@ -170,8 +170,14 @@ is `console`, so the detector matched nothing: ``` Reproduction: `experiments/jscpd-format/run.mjs`. With the correct language list -the repository reports 65 files / 47 clones / 4.84 %, under the 5 % threshold. -The same defect is in the JavaScript template β€” reported upstream (Β§7). +the repository reports 65 files / 47 clones, 4.84 % of lines and 5.55 % of +tokens duplicated. `threshold` was `0`, which the check had never had to honour; +turning the gate on at `0` would have failed on the existing code rather than on +a regression, so it is set to `6` β€” just above today's measurement, so any +increase in duplication fails the job. `js/tests/duplication-check.test.mjs` +asserts the threshold stays in that range, so the gate cannot be disabled by +raising it. The same `format` defect is in the JavaScript template β€” reported +upstream (Β§7). ### 4.11 FALSE NEGATIVE β€” half the repository was outside the lint base path diff --git a/docs/CI-CD.md b/docs/CI-CD.md index 04bf2e1..ff4eebc 100644 --- a/docs/CI-CD.md +++ b/docs/CI-CD.md @@ -82,6 +82,14 @@ still runs the three checks that read the whole tree. schedule, where a failure means a link that used to work has stopped working and blocks no merge. `.lycheeignore` carries the known-unreachable URLs, one commented entry each, and the hygiene test rejects an uncommented one. +- **The duplication gate has a threshold just above the current measurement.** + jscpd's `format` is the list of _languages_ to analyse, not the reporter; it + read `"console"`, matched no file and passed in under a millisecond. With the + language list corrected the tree measures 4.84 % of lines and 5.55 % of tokens + duplicated, so the threshold is `6`: high enough not to fail on code that was + already there, low enough that adding duplication fails the job. + `js/tests/duplication-check.test.mjs` pins both the language list and the + threshold range. - **Lint and format configuration lives at the repository root.** eslint and prettier treat the directory holding their config as the project base path; while these files lived in `js/`, root-level JavaScript was outside that path diff --git a/js/tests/duplication-check.test.mjs b/js/tests/duplication-check.test.mjs index 1ddaf67..125fd58 100644 --- a/js/tests/duplication-check.test.mjs +++ b/js/tests/duplication-check.test.mjs @@ -126,3 +126,14 @@ test('the duplication script points at directories that exist', () => { expect(existsSync(join(jsDir, target))).toBe(true); } }); + +test('the threshold is a real gate, not a way to switch the check off', () => { + // The check had never run, so the tree already contained 5.55% duplicated + // tokens when it was switched on: a threshold of 0 would have failed on + // existing code instead of on a regression. 6 sits just above today's + // measurement. Anything much higher passes whatever is added, which is the + // same false negative in a different disguise. + expect(typeof repoConfig.threshold).toBe('number'); + expect(repoConfig.threshold).toBeGreaterThan(0); + expect(repoConfig.threshold).toBeLessThanOrEqual(10); +}); From 52ca33074c64245f9e4fcdba87801c1e85b95252 Mon Sep 17 00:00:00 2001 From: konard Date: Sat, 5 Sep 2026 00:00:42 +0000 Subject: [PATCH 27/34] ci: audit workflows at low confidence so credential persistence is visible --- .github/workflows/js.yml | 21 ++++++- .github/workflows/rust.yml | 21 ++++++- .github/workflows/workflows.yml | 8 ++- .../issues/199/pulls/200/analysis/README.md | 22 ++++++++ docs/CI-CD.md | 6 ++ js/tests/workflow-hygiene.test.mjs | 56 ++++++++++++++++++- 6 files changed, 125 insertions(+), 9 deletions(-) diff --git a/.github/workflows/js.yml b/.github/workflows/js.yml index d697fb4..064f053 100644 --- a/.github/workflows/js.yml +++ b/.github/workflows/js.yml @@ -292,7 +292,12 @@ jobs: group: main-writer-${{ github.repository }}-main cancel-in-progress: false steps: - - uses: actions/checkout@v6 + # This job pushes to main and creates the release, so it needs the + # credential actions/checkout persists in .git/config. Everything else in + # this repository sets persist-credentials: false; zizmor runs at + # --min-confidence low so a checkout that forgets it fails the audit, and + # the six writer jobs that legitimately need it say so here. + - uses: actions/checkout@v6 # zizmor: ignore[artipacked] with: fetch-depth: 0 @@ -399,7 +404,12 @@ jobs: group: main-writer-${{ github.repository }}-main cancel-in-progress: false steps: - - uses: actions/checkout@v6 + # This job pushes to main and creates the release, so it needs the + # credential actions/checkout persists in .git/config. Everything else in + # this repository sets persist-credentials: false; zizmor runs at + # --min-confidence low so a checkout that forgets it fails the audit, and + # the six writer jobs that legitimately need it say so here. + - uses: actions/checkout@v6 # zizmor: ignore[artipacked] with: fetch-depth: 0 @@ -476,7 +486,12 @@ jobs: group: main-writer-${{ github.repository }}-main cancel-in-progress: false steps: - - uses: actions/checkout@v6 + # This job pushes to main and creates the release, so it needs the + # credential actions/checkout persists in .git/config. Everything else in + # this repository sets persist-credentials: false; zizmor runs at + # --min-confidence low so a checkout that forgets it fails the audit, and + # the six writer jobs that legitimately need it say so here. + - uses: actions/checkout@v6 # zizmor: ignore[artipacked] with: fetch-depth: 0 diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index b1df1c3..fc9c56e 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -361,7 +361,12 @@ jobs: CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN || secrets.CARGO_TOKEN }} CARGO_TOKEN: ${{ secrets.CARGO_TOKEN }} steps: - - uses: actions/checkout@v6 + # This job pushes to main and creates the release, so it needs the + # credential actions/checkout persists in .git/config. Everything else in + # this repository sets persist-credentials: false; zizmor runs at + # --min-confidence low so a checkout that forgets it fails the audit, and + # the six writer jobs that legitimately need it say so here. + - uses: actions/checkout@v6 # zizmor: ignore[artipacked] with: fetch-depth: 0 @@ -428,7 +433,12 @@ jobs: CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN || secrets.CARGO_TOKEN }} CARGO_TOKEN: ${{ secrets.CARGO_TOKEN }} steps: - - uses: actions/checkout@v6 + # This job pushes to main and creates the release, so it needs the + # credential actions/checkout persists in .git/config. Everything else in + # this repository sets persist-credentials: false; zizmor runs at + # --min-confidence low so a checkout that forgets it fails the audit, and + # the six writer jobs that legitimately need it say so here. + - uses: actions/checkout@v6 # zizmor: ignore[artipacked] with: fetch-depth: 0 @@ -476,7 +486,12 @@ jobs: group: main-writer-${{ github.repository }}-main cancel-in-progress: false steps: - - uses: actions/checkout@v6 + # This job pushes to main and creates the release, so it needs the + # credential actions/checkout persists in .git/config. Everything else in + # this repository sets persist-credentials: false; zizmor runs at + # --min-confidence low so a checkout that forgets it fails the audit, and + # the six writer jobs that legitimately need it say so here. + - uses: actions/checkout@v6 # zizmor: ignore[artipacked] with: fetch-depth: 0 diff --git a/.github/workflows/workflows.yml b/.github/workflows/workflows.yml index 23944f6..d7698af 100644 --- a/.github/workflows/workflows.yml +++ b/.github/workflows/workflows.yml @@ -90,7 +90,13 @@ jobs: advanced-security: false annotations: true config: .github/zizmor.yml - min-confidence: medium + # Low, not medium: `artipacked` is a Low-confidence audit, so + # `medium` hides every checkout that persists credentials -- the exact + # blind spot reported upstream as js-template#160. At `low` the six + # writer jobs that need the credential carry an + # inline artipacked suppression, and everything else has to set + # persist-credentials: false. + min-confidence: low # Audit the workflows this repository runs, not every workflow file # in the tree. The action's default input is `.`, which also collects # docs/case-studies/**/templates/** -- verbatim archived copies of diff --git a/dev/log/issues/199/pulls/200/analysis/README.md b/dev/log/issues/199/pulls/200/analysis/README.md index e887cf1..39d7775 100644 --- a/dev/log/issues/199/pulls/200/analysis/README.md +++ b/dev/log/issues/199/pulls/200/analysis/README.md @@ -391,6 +391,28 @@ Only the assertion that the list is non-empty made this visible, which is the argument for writing that assertion into every check that discovers its own inputs. +### 4.24 FALSE NEGATIVE β€” the workflow audit could not see credential persistence + +Found while writing the upstream report for the JavaScript template (Β§7, #160) +and then checked here, because the same setting had been copied over. zizmor's +`artipacked` audit β€” a checkout that leaves the job token in `.git/config`, +where any later step or uploaded artifact can read it β€” is a **Low**-confidence +check, and the job ran with `min-confidence: medium`. Every finding of that +class was therefore invisible: + +``` +zizmor --config .github/zizmor.yml --min-confidence medium .github/workflows -> No findings +zizmor --config .github/zizmor.yml --min-confidence low .github/workflows -> 6 findings, all artipacked +``` + +All six are the release jobs, which push to `main` and publish, so they do need +the credential. The fix is not to silence them again by raising the threshold: +the job now runs at `--min-confidence low`, the six carry an inline +`ignore[artipacked]` next to the reason, and two hygiene tests hold the line β€” +every `actions/checkout` in every workflow either sets +`persist-credentials: false` or carries that suppression, and the number of +suppressions is asserted, so a seventh cannot arrive by copy-paste. + ## 5. File-by-file comparison against both templates Scripts (`analysis/js-scripts-diff.log`, `analysis/rust-scripts-diff.log`): diff --git a/docs/CI-CD.md b/docs/CI-CD.md index ff4eebc..70628b3 100644 --- a/docs/CI-CD.md +++ b/docs/CI-CD.md @@ -31,6 +31,12 @@ still runs the three checks that read the whole tree. - **actionlint runs from `docker://rhysd/actionlint`,** not from a bare binary. The Docker image bundles shellcheck and pyflakes; a binary without shellcheck on `PATH` silently skips every `run:` block and still exits 0. +- **zizmor runs at `--min-confidence low`, not `medium`.** `artipacked` β€” a + checkout that leaves the job token in `.git/config` β€” is a Low-confidence + audit, so `medium` hides every one of them. At `low` a checkout either sets + `persist-credentials: false` or is one of the six release jobs that pushes + with that credential and says so inline; the hygiene test asserts both, and + the suppression count, so a seventh cannot appear by copy-paste. - **zizmor audits `.github/workflows` only.** Its default input is `.`, which also collects the archived copies of other repositories' workflows under `docs/case-studies/**/templates/**`. Those never run here. diff --git a/js/tests/workflow-hygiene.test.mjs b/js/tests/workflow-hygiene.test.mjs index 65e30f6..4fb4b92 100644 --- a/js/tests/workflow-hygiene.test.mjs +++ b/js/tests/workflow-hygiene.test.mjs @@ -248,12 +248,17 @@ describe('workflow linting is itself wired into CI', () => { ); }); - test('zizmor runs with the repository policy and medium confidence', () => { + test('zizmor runs with the repository policy at low confidence', () => { const step = Object.values(lintWorkflow.doc.jobs) .flatMap((job) => job.steps ?? []) .find((s) => (s.uses ?? '').startsWith('zizmorcore/zizmor-action@')); expect(step.with.config).toBe('.github/zizmor.yml'); - expect(String(step.with['min-confidence'])).toBe('medium'); + // `artipacked` -- a checkout that leaves the job token in .git/config -- is + // a Low-confidence audit, so `medium` hides every one of them. That blind + // spot is what made the JavaScript template ship 25 credential-persisting + // checkouts while its audit reported three findings + // (js-ai-driven-development-pipeline-template#160). + expect(String(step.with['min-confidence'])).toBe('low'); // The action's default input is `.`, which walks the whole tree and picks up // docs/case-studies/**/templates/**: verbatim archived copies of other // repositories' workflows, kept as evidence. Auditing those reported 30 @@ -261,6 +266,53 @@ describe('workflow linting is itself wired into CI', () => { expect(step.with.inputs).toBe('.github/workflows'); }); + test.each(workflows.map((w) => [w.name, w]))( + 'every checkout in %s drops the token or says why it keeps it', + (_name, workflow) => { + // The counterpart of running zizmor at low confidence: a checkout either + // sets persist-credentials: false, or is one of the writer jobs that + // pushes with that credential and carries the suppression inline. A new + // checkout that does neither fails here and in the audit. + const lines = workflow.text.split('\n'); + lines.forEach((line, index) => { + if (!/^\s*-\s+uses:\s*actions\/checkout@/.test(line)) { + return; + } + if (line.includes('zizmor: ignore[artipacked]')) { + return; + } + // The `with:` block of this step: everything indented deeper, up to the + // next step or the end of the file. + const indent = line.search(/\S/); + const block = []; + for (let i = index + 1; i < lines.length; i += 1) { + const next = lines[i]; + if (next.trim() !== '' && next.search(/\S/) <= indent) { + break; + } + block.push(next); + } + expect(`${workflow.name}:${index + 1} ${block.join('\n')}`).toContain( + 'persist-credentials: false' + ); + }); + } + ); + + test('only the release jobs suppress artipacked', () => { + // Six suppressions today, all in jobs that push to main or publish. The + // count is asserted so adding one is a deliberate edit here rather than a + // quiet copy-paste. + const suppressions = workflows.flatMap((workflow) => + workflow.text + .split('\n') + .filter((line) => line.includes('zizmor: ignore[artipacked]')) + .map(() => workflow.name) + ); + expect(suppressions.length).toBe(6); + expect(new Set(suppressions)).toEqual(new Set(['js.yml', 'rust.yml'])); + }); + test('the zizmor policy requires hash pins by default', () => { const policy = Bun.YAML.parse( readFileSync(join(repoRoot, '.github', 'zizmor.yml'), 'utf8') From bff14f3e804abe890808509539c315015ec3e9a0 Mon Sep 17 00:00:00 2001 From: konard Date: Sat, 5 Sep 2026 00:25:26 +0000 Subject: [PATCH 28/34] test: skip the publish suite when the CDN it depends on is unreachable Running the suite twice unchanged produced two different results: the first run failed `reports published for a version already on npm` and `issue #199: registry propagation lag after a clean publish is not a failure` with `Expected to contain: "published=true" / Received: ""`, the second passed all six. publish-to-npm.mjs opens with a module-scope `await fetch('https://unpkg.com/use-m/use.js')`, outside main()'s try/catch, so an unreachable CDN kills it during module initialisation -- before any GITHUB_OUTPUT line and before its first log. The offline guard only probed `npm view`, and npm's registry and unpkg fail independently, so a reachable registry cleared a guard for a dependency that was down. Probe both endpoints, and raise with the child's exit status, stderr and GITHUB_OUTPUT when the script never reaches main(), so the next occurrence names the cause instead of comparing against an empty string. experiments/publish-cdn-unreachable.mjs reproduces it on demand. With the fix the same unreachable-CDN run skips all six tests instead of failing them. --- .../issues/199/pulls/200/analysis/README.md | 60 +++++++++++++- experiments/publish-cdn-unreachable.mjs | 83 +++++++++++++++++++ js/tests/publish-to-npm.test.mjs | 63 ++++++++++++-- 3 files changed, 197 insertions(+), 9 deletions(-) create mode 100644 experiments/publish-cdn-unreachable.mjs diff --git a/dev/log/issues/199/pulls/200/analysis/README.md b/dev/log/issues/199/pulls/200/analysis/README.md index 39d7775..314bd40 100644 --- a/dev/log/issues/199/pulls/200/analysis/README.md +++ b/dev/log/issues/199/pulls/200/analysis/README.md @@ -53,7 +53,7 @@ named in the issue title.** | # | Requirement (verbatim intent) | Where addressed | | --- | --- | --- | -| R1 | Check for **all false positives** in CI/CD and fix them | Β§4.1, Β§4.9, Β§4.13, Β§4.17, Β§4.21, Β§4.22 | +| R1 | Check for **all false positives** in CI/CD and fix them | Β§4.1, Β§4.9, Β§4.13, Β§4.17, Β§4.21, Β§4.22, Β§4.25 | | R2 | Check for **all false negatives** in CI/CD and fix them | Β§4.2, Β§4.3, Β§4.4, Β§4.6, Β§4.10, Β§4.11, Β§4.16, Β§4.17, Β§4.18, Β§4.19, Β§4.20, Β§4.23 | | R3 | Check for **all warnings** in CI/CD and fix them | Β§4.2, Β§4.3, Β§4.5, Β§4.16 | | R4 | Check for **all errors** in CI/CD and fix them | Β§4.1, Β§4.5, Β§4.12, Β§4.14, Β§4.15 | @@ -413,6 +413,64 @@ every `actions/checkout` in every workflow either sets `persist-credentials: false` or carries that suppression, and the number of suppressions is asserted, so a seventh cannot arrive by copy-paste. +### 4.25 FALSE POSITIVE β€” the publish tests fail opaquely when a CDN blinks + +Found by running the suite twice, unchanged, during this iteration: the first +run reported + +``` +(fail) reports published for a version already on npm (legit success path) +(fail) issue #199: registry propagation lag after a clean publish is not a failure + Expected to contain: "published=true" + Received: "" +``` + +and the second run passed all six. The tests are subprocess integration tests: +they spawn the real `publish-to-npm.mjs`, whose **first** statement is a +module-scope `await fetch('https://unpkg.com/use-m/use.js')`. That await is +outside `main()`'s `try/catch`, so an unreachable CDN kills the script during +module initialisation β€” before it writes a single line to `GITHUB_OUTPUT` and +before its first `console.log`. + +Two defects compound: + +* **The offline guard probed the wrong endpoint.** `beforeAll` ran + `npm view command-stream version` and treated success as "we are online". + npm's registry and unpkg are different services that fail independently, so a + reachable registry cleared the guard while the dependency the script needs at + startup was down. Both endpoints are probed now, and the suite skips when + either is unreachable β€” the behaviour the guard was written to provide. +* **The failure named nothing.** With the script dead before any output, + every assertion degenerated to `Received: ""`, which points at the publish + logic rather than at the network. `assertScriptStarted()` now checks for the + script's first log line and, when it is absent, raises with the child's exit + status, stderr and `GITHUB_OUTPUT` contents, so the next occurrence is + diagnosable from the CI log alone. + +`experiments/publish-cdn-unreachable.mjs` reproduces it on demand by routing the +fetch through a proxy on a closed port, instead of waiting for a real outage: + +``` +unpkg unreachable (what the opaque failure looked like): + exit status null + reached main() false + GITHUB_OUTPUT "" +unpkg reachable (normal run): + exit status 0 + reached main() true + GITHUB_OUTPUT "published=true\npublished_version=0.9.5\nalready_published=true\n" +``` + +With the fix, the same unreachable-CDN run skips all six tests rather than +failing them: + +``` +HTTPS_PROXY=http://127.0.0.1:1 bun test js/tests/publish-to-npm.test.mjs -> 6 pass, 0 fail +``` + +This is the same class as Β§4.14 and Β§4.22: a check that goes red for a reason +the pull request did not cause teaches reviewers to ignore red. + ## 5. File-by-file comparison against both templates Scripts (`analysis/js-scripts-diff.log`, `analysis/rust-scripts-diff.log`): diff --git a/experiments/publish-cdn-unreachable.mjs b/experiments/publish-cdn-unreachable.mjs new file mode 100644 index 0000000..2ae12fc --- /dev/null +++ b/experiments/publish-cdn-unreachable.mjs @@ -0,0 +1,83 @@ +#!/usr/bin/env node +// Why js/tests/publish-to-npm.test.mjs probes unpkg as well as npm. +// +// publish-to-npm.mjs starts with a module-scope +// `await fetch('https://unpkg.com/use-m/use.js')`. That await sits outside +// main()'s try/catch, so when the CDN is unreachable the script dies during +// module initialisation: nothing is written to GITHUB_OUTPUT and not even the +// first log line is printed. The suite then failed with +// +// Expected to contain: "published=true" +// Received: "" +// +// which names neither the CDN nor the network. Observed intermittently while +// investigating issue #199: two runs of the same unchanged suite differed only +// in whether unpkg answered. +// +// The old offline guard probed `npm view` only. npm and unpkg fail +// independently, so a reachable registry said "we are online" while the +// dependency the script actually needs at startup was not. +// +// This script forces the failure without waiting for a real outage, by pointing +// the script's DNS-resolvable dependency at a blackholed host through +// use-m's own resolution path -- here simply by running with no network route +// to unpkg, emulated with an unroutable HTTPS proxy. +import { spawnSync } from 'node:child_process'; +import { mkdtempSync, writeFileSync, readFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { join, resolve } from 'node:path'; + +const SCRIPT = resolve( + new URL('..', import.meta.url).pathname, + 'js/scripts/publish-to-npm.mjs' +); + +/** + * Run publish-to-npm.mjs once and report what the test harness would see. + * @param {string} label + * @param {Record} extraEnv + * @returns {void} + */ +function run(label, extraEnv) { + const dir = mkdtempSync(join(tmpdir(), 'publish-cdn-')); + writeFileSync( + join(dir, 'package.json'), + JSON.stringify( + { + name: 'command-stream', + version: '0.9.5', + scripts: { 'changeset:publish': 'node -e "process.exit(1)"' }, + }, + null, + 2 + ) + ); + const outputFile = join(dir, 'gh-output.txt'); + writeFileSync(outputFile, ''); + + const res = spawnSync('bun', [SCRIPT], { + cwd: dir, + encoding: 'utf8', + timeout: 20000, + env: { ...process.env, GITHUB_OUTPUT: outputFile, ...extraEnv }, + }); + + const output = readFileSync(outputFile, 'utf8'); + const started = (res.stdout || '').includes('Current version to publish:'); + console.log(`${label}:`); + console.log(` exit status ${res.status}`); + console.log(` reached main() ${started}`); + console.log(` GITHUB_OUTPUT ${JSON.stringify(output)}`); + console.log( + ` first stderr line ${JSON.stringify((res.stderr || '').split('\n')[0])}` + ); +} + +// 203.0.113.0/24 is TEST-NET-3 (RFC 5737): guaranteed never routable, so the +// unpkg fetch fails the way a real outage makes it fail. +run('unpkg unreachable (what the opaque failure looked like)', { + HTTPS_PROXY: 'http://203.0.113.1:9', + HTTP_PROXY: 'http://203.0.113.1:9', +}); + +run('unpkg reachable (normal run)', {}); diff --git a/js/tests/publish-to-npm.test.mjs b/js/tests/publish-to-npm.test.mjs index 1399f58..c6df54f 100644 --- a/js/tests/publish-to-npm.test.mjs +++ b/js/tests/publish-to-npm.test.mjs @@ -37,15 +37,24 @@ const isWindows = process.platform === 'win32'; let networkAvailable = !isWindows; -beforeAll(() => { +// The very first thing publish-to-npm.mjs does is +// `await fetch('https://unpkg.com/use-m/use.js')` at module scope. That await is +// not inside main()'s try/catch, so when the CDN is unreachable the script dies +// during module initialisation: it never writes a line to GITHUB_OUTPUT and +// never prints its first log. Probing only `npm view` misses this β€” the npm +// registry and unpkg fail independently β€” and the suite then reports +// `Expected to contain: "published=true" / Received: ""`, which names neither +// the CDN nor the network as the cause. Both endpoints are probed. +const USE_M_URL = 'https://unpkg.com/use-m/use.js'; + +beforeAll(async () => { // Skip the probe entirely on Windows so this hook can never exceed the suite's // global test timeout (the per-test timeout does not apply to hooks). if (isWindows) { return; } - // The script loads use-m + command-stream from unpkg/npm at runtime and the - // npm-view checks hit the registry. Skip gracefully when offline. Keep the - // probe timeout below the suite's global --timeout so the hook never trips it. + // Skip gracefully when offline. Keep both probe timeouts below the suite's + // global --timeout so the hook never trips it. try { const probe = spawnSync('npm', ['view', 'command-stream', 'version'], { encoding: 'utf8', @@ -55,8 +64,46 @@ beforeAll(() => { } catch { networkAvailable = false; } + if (!networkAvailable) { + return; + } + try { + const response = await fetch(USE_M_URL, { + signal: AbortSignal.timeout(8000), + }); + networkAvailable = response.ok; + } catch { + networkAvailable = false; + } }); +/** + * Fail with the child's own diagnostics when the script never started. + * + * `publish-to-npm.mjs` prints "Current version to publish: ..." before it does + * anything else, so stdout without that line means module initialisation threw + * (almost always the unpkg fetch above) and every later assertion would compare + * against an empty string. Raising here puts the child's exit status and stderr + * in the failure message instead. + * + * @param {{status:number|null, stdout:string, stderr:string, output:string}} result + * @returns {{status:number|null, stdout:string, stderr:string, output:string}} the same result + */ +function assertScriptStarted(result) { + if (result.stdout.includes('Current version to publish:')) { + return result; + } + throw new Error( + [ + 'publish-to-npm.mjs exited before it produced any output, so it never ran.', + `exit status: ${result.status}`, + `GITHUB_OUTPUT: ${JSON.stringify(result.output)}`, + `stdout: ${JSON.stringify(result.stdout)}`, + `stderr: ${JSON.stringify(result.stderr)}`, + ].join('\n') + ); +} + /** * Run publish-to-npm.mjs in an isolated temp package. * @param {object} opts @@ -94,12 +141,12 @@ function runPublish({ version, publishScript }) { }); const output = existsSync(outputFile) ? readFileSync(outputFile, 'utf8') : ''; - return { + return assertScriptStarted({ status: res.status, stdout: res.stdout || '', stderr: res.stderr || '', output, - }; + }); } test('does NOT report published when changeset:publish fails (exit 1)', () => { @@ -254,12 +301,12 @@ async function runPublishAgainstRegistry({ child.exited, ]); - return { + return assertScriptStarted({ status, stdout, stderr, output: existsSync(outputFile) ? readFileSync(outputFile, 'utf8') : '', - }; + }); } // The verbatim npm output from the failed run, escaped for `node -e`. From 2f8fb5f7ac6705fa57a74214b95aadc2ca9e3b6d Mon Sep 17 00:00:00 2001 From: konard Date: Sat, 5 Sep 2026 00:40:34 +0000 Subject: [PATCH 29/34] docs: describe the CDN reproduction accurately The experiment routes the fetch through an unroutable TEST-NET-3 address, not a closed port, and its null exit status is the harness timeout killing a child still blocked in the module-scope fetch rather than the script exiting. Say both, and name the timeout in the output instead of printing a bare null a reader has to guess at. --- dev/log/issues/199/pulls/200/analysis/README.md | 9 +++++++-- experiments/publish-cdn-unreachable.mjs | 13 +++++++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/dev/log/issues/199/pulls/200/analysis/README.md b/dev/log/issues/199/pulls/200/analysis/README.md index 314bd40..5efc9f7 100644 --- a/dev/log/issues/199/pulls/200/analysis/README.md +++ b/dev/log/issues/199/pulls/200/analysis/README.md @@ -448,11 +448,12 @@ Two defects compound: diagnosable from the CI log alone. `experiments/publish-cdn-unreachable.mjs` reproduces it on demand by routing the -fetch through a proxy on a closed port, instead of waiting for a real outage: +fetch through a proxy at an unroutable TEST-NET-3 address (RFC 5737), instead of +waiting for a real outage: ``` unpkg unreachable (what the opaque failure looked like): - exit status null + exit status null (killed after 20000ms) reached main() false GITHUB_OUTPUT "" unpkg reachable (normal run): @@ -461,6 +462,10 @@ unpkg reachable (normal run): GITHUB_OUTPUT "published=true\npublished_version=0.9.5\nalready_published=true\n" ``` +The null status is the experiment's own timeout killing a child still blocked in +the module-scope fetch. A real outage fails faster, but lands in the same place: +no `GITHUB_OUTPUT`, no log line, nothing for the assertion to name. + With the fix, the same unreachable-CDN run skips all six tests rather than failing them: diff --git a/experiments/publish-cdn-unreachable.mjs b/experiments/publish-cdn-unreachable.mjs index 2ae12fc..1b830bf 100644 --- a/experiments/publish-cdn-unreachable.mjs +++ b/experiments/publish-cdn-unreachable.mjs @@ -27,6 +27,10 @@ import { mkdtempSync, writeFileSync, readFileSync } from 'node:fs'; import { tmpdir } from 'node:os'; import { join, resolve } from 'node:path'; +// Capped so an unroutable proxy stalls the run for a bounded time instead of +// hanging until the connect attempt gives up on its own. +const TIMEOUT_MS = 20000; + const SCRIPT = resolve( new URL('..', import.meta.url).pathname, 'js/scripts/publish-to-npm.mjs' @@ -58,14 +62,19 @@ function run(label, extraEnv) { const res = spawnSync('bun', [SCRIPT], { cwd: dir, encoding: 'utf8', - timeout: 20000, + timeout: TIMEOUT_MS, env: { ...process.env, GITHUB_OUTPUT: outputFile, ...extraEnv }, }); const output = readFileSync(outputFile, 'utf8'); const started = (res.stdout || '').includes('Current version to publish:'); + // A null status means spawnSync hit its own timeout and killed the child: the + // script was still blocked in the module-scope fetch, never reaching main(). + // A real outage fails faster, but lands in the same place -- no output at all. + const status = + res.status === null ? `null (killed after ${TIMEOUT_MS}ms)` : res.status; console.log(`${label}:`); - console.log(` exit status ${res.status}`); + console.log(` exit status ${status}`); console.log(` reached main() ${started}`); console.log(` GITHUB_OUTPUT ${JSON.stringify(output)}`); console.log( From 7b7ae016366cefd1c0689cecac84985816e16670 Mon Sep 17 00:00:00 2001 From: konard Date: Sat, 5 Sep 2026 00:59:33 +0000 Subject: [PATCH 30/34] test: keep the evidence archive non-executable check-language-parity.sh was archived under dev/log with its executable bit, which the checkout environment flipped back to 644 on its own twice, each time producing a working tree that was dirty without any content change. The snapshot is read as evidence and never run from there, so it does not need the bit, and a test now asserts that no tracked file under dev/log carries it. --- .../issues/199/pulls/200/analysis/README.md | 7 +++++++ .../200/workflows/check-language-parity.sh | 0 js/tests/docs-validation.test.mjs | 18 ++++++++++++++++++ 3 files changed, 25 insertions(+) mode change 100755 => 100644 dev/log/issues/199/pulls/200/workflows/check-language-parity.sh diff --git a/dev/log/issues/199/pulls/200/analysis/README.md b/dev/log/issues/199/pulls/200/analysis/README.md index 5efc9f7..b0d231b 100644 --- a/dev/log/issues/199/pulls/200/analysis/README.md +++ b/dev/log/issues/199/pulls/200/analysis/README.md @@ -23,6 +23,13 @@ | `analysis/js-scripts-diff.log` | `js/scripts/*` vs js template | | `analysis/rust-scripts-diff.log` | `rust/scripts/*` vs rust template | +Every file under this evidence root is stored non-executable, including +`workflows/check-language-parity.sh`. The snapshots are read as evidence, never +run from here β€” the runnable copy is `.github/scripts/check-language-parity.sh` +β€” and a tracked executable bit on an inert copy is a mode the environment can +flip without touching a byte of content, which shows up as an unexplained dirty +working tree. + ## 2. Timeline of the failing release (run 33914574283) Reconstructed from `ci-logs/run-33914574283.log`. diff --git a/dev/log/issues/199/pulls/200/workflows/check-language-parity.sh b/dev/log/issues/199/pulls/200/workflows/check-language-parity.sh old mode 100755 new mode 100644 diff --git a/js/tests/docs-validation.test.mjs b/js/tests/docs-validation.test.mjs index a1a04aa..e67a0d1 100644 --- a/js/tests/docs-validation.test.mjs +++ b/js/tests/docs-validation.test.mjs @@ -93,6 +93,24 @@ describe('documentation validation', () => { } ); + // The evidence root holds copies that are read, never run. A tracked + // executable bit on an inert copy is state the checkout environment can flip + // on its own -- it did, twice, and each time it surfaced as a working tree + // that was dirty without a single byte of content having changed. + test('evidence files under dev/log are stored non-executable', () => { + const executable = execFileSync('git', ['ls-files', '-s', 'dev/log'], { + cwd: repoRoot, + encoding: 'utf8', + }) + .trim() + .split('\n') + .filter(Boolean) + .filter((line) => line.startsWith('100755')) + .map((line) => line.split('\t')[1]); + + expect(executable).toEqual([]); + }); + // A reader following a cross-reference lands on a heading. These are the // headings other documents and the workflows point at. test.each([ From cd04d484fb7e787351e1cf3ed943f469d7805fb2 Mon Sep 17 00:00:00 2001 From: konard Date: Sat, 5 Sep 2026 01:13:22 +0000 Subject: [PATCH 31/34] fix(release): load use-m through a shared loader with timeout and retries The eleven release scripts each opened with a module-scope `eval(await (await fetch('https://unpkg.com/use-m/use.js')).text())`: no deadline, no retry, no status check, and outside main()'s try/catch. A CDN blip therefore killed the script during module initialisation -- no log line, nothing in GITHUB_OUTPUT, and a bare `TypeError: fetch failed` -- which the release job reported as a publish defect. js/scripts/use-m-loader.mjs gives that load a per-attempt deadline, bounded retries with exponential backoff, a status check before the eval, ::debug:: tracing that is off by default, and a final error naming the URL, the attempt count and the cause. experiments/publish-cdn-unreachable.mjs now runs both shapes against a TEST-NET-3 address: legacy inline fetch TypeError: fetch failed shared loader Error: Failed to load use-m from ... after 2 attempt(s): The operation was aborted due to timeout. This is a network dependency of the release scripts, not a defect in the published package; re-run the job when the CDN answers again. --- experiments/publish-cdn-unreachable.mjs | 119 +++++++----- js/scripts/changeset-version.mjs | 8 +- js/scripts/check-release-needed.mjs | 5 +- js/scripts/create-github-release.mjs | 5 +- js/scripts/create-manual-changeset.mjs | 5 +- js/scripts/format-github-release.mjs | 8 +- js/scripts/format-release-notes.mjs | 6 +- js/scripts/instant-version-bump.mjs | 5 +- js/scripts/publish-to-npm.mjs | 5 +- js/scripts/setup-npm.mjs | 5 +- js/scripts/use-m-loader.mjs | 202 +++++++++++++++++++++ js/scripts/version-and-commit.mjs | 5 +- js/scripts/wait-for-npm.mjs | 5 +- js/tests/publish-to-npm.test.mjs | 22 ++- js/tests/use-m-loader.test.mjs | 231 ++++++++++++++++++++++++ 15 files changed, 543 insertions(+), 93 deletions(-) create mode 100644 js/scripts/use-m-loader.mjs create mode 100644 js/tests/use-m-loader.test.mjs diff --git a/experiments/publish-cdn-unreachable.mjs b/experiments/publish-cdn-unreachable.mjs index 1b830bf..2a7e8e6 100644 --- a/experiments/publish-cdn-unreachable.mjs +++ b/experiments/publish-cdn-unreachable.mjs @@ -1,11 +1,17 @@ #!/usr/bin/env node -// Why js/tests/publish-to-npm.test.mjs probes unpkg as well as npm. +// Why js/tests/publish-to-npm.test.mjs probes unpkg as well as npm, and what +// js/scripts/use-m-loader.mjs changed about it. // -// publish-to-npm.mjs starts with a module-scope -// `await fetch('https://unpkg.com/use-m/use.js')`. That await sits outside -// main()'s try/catch, so when the CDN is unreachable the script dies during -// module initialisation: nothing is written to GITHUB_OUTPUT and not even the -// first log line is printed. The suite then failed with +// Every release script needs `use-m`, which is fetched from +// https://unpkg.com/use-m/use.js and eval-ed. Eleven scripts did that inline, +// at module scope: +// +// const { use } = eval(await (await fetch('https://unpkg.com/use-m/use.js')).text()); +// +// That await sits outside main()'s try/catch, has no deadline and no retry, so +// an unreachable CDN killed the script during module initialisation: nothing +// was written to GITHUB_OUTPUT and not even the first log line was printed. The +// suite then failed with // // Expected to contain: "published=true" // Received: "" @@ -19,74 +25,87 @@ // dependency the script actually needs at startup was not. // // This script forces the failure without waiting for a real outage, by pointing -// the script's DNS-resolvable dependency at a blackholed host through -// use-m's own resolution path -- here simply by running with no network route -// to unpkg, emulated with an unroutable HTTPS proxy. +// the fetch at a blackholed address, and runs both shapes side by side: the +// legacy inline fetch and the shared loader the scripts use now. import { spawnSync } from 'node:child_process'; -import { mkdtempSync, writeFileSync, readFileSync } from 'node:fs'; +import { mkdtempSync, writeFileSync } from 'node:fs'; import { tmpdir } from 'node:os'; import { join, resolve } from 'node:path'; +// 203.0.113.0/24 is TEST-NET-3 (RFC 5737): guaranteed never routable. Standing +// in for unpkg, it fails the way a real outage makes the CDN fail -- a connect +// that never completes -- without depending on proxy settings a given runtime +// may or may not honour. +const BLACKHOLE_URL = 'https://203.0.113.1/use-m/use.js'; + // Capped so an unroutable proxy stalls the run for a bounded time instead of // hanging until the connect attempt gives up on its own. -const TIMEOUT_MS = 20000; +const TIMEOUT_MS = 30000; -const SCRIPT = resolve( - new URL('..', import.meta.url).pathname, - 'js/scripts/publish-to-npm.mjs' -); +const repoRoot = resolve(new URL('..', import.meta.url).pathname); +const LOADER = join(repoRoot, 'js/scripts/use-m-loader.mjs'); +const dir = mkdtempSync(join(tmpdir(), 'publish-cdn-')); /** - * Run publish-to-npm.mjs once and report what the test harness would see. + * Run one .mjs source in a scratch directory and report what a CI log would + * show: whether the script reached its own code, and what it said when it did + * not. * @param {string} label - * @param {Record} extraEnv + * @param {string} source * @returns {void} */ -function run(label, extraEnv) { - const dir = mkdtempSync(join(tmpdir(), 'publish-cdn-')); - writeFileSync( - join(dir, 'package.json'), - JSON.stringify( - { - name: 'command-stream', - version: '0.9.5', - scripts: { 'changeset:publish': 'node -e "process.exit(1)"' }, - }, - null, - 2 - ) - ); +function run(label, source) { + const script = join(dir, `${label.replace(/\W+/g, '-')}.mjs`); + writeFileSync(script, source); const outputFile = join(dir, 'gh-output.txt'); writeFileSync(outputFile, ''); - const res = spawnSync('bun', [SCRIPT], { + const started = Date.now(); + const res = spawnSync('node', [script], { cwd: dir, encoding: 'utf8', timeout: TIMEOUT_MS, - env: { ...process.env, GITHUB_OUTPUT: outputFile, ...extraEnv }, + env: { ...process.env, GITHUB_OUTPUT: outputFile }, }); - const output = readFileSync(outputFile, 'utf8'); - const started = (res.stdout || '').includes('Current version to publish:'); // A null status means spawnSync hit its own timeout and killed the child: the - // script was still blocked in the module-scope fetch, never reaching main(). - // A real outage fails faster, but lands in the same place -- no output at all. + // script was still blocked in a fetch with no deadline of its own. const status = res.status === null ? `null (killed after ${TIMEOUT_MS}ms)` : res.status; + // Node prints the offending source line before the error itself; the message + // a reader of the CI log actually sees is the first line naming an Error type. + const message = (res.stderr || '') + .split('\n') + .find((line) => /^[A-Za-z]*Error(:| \[)/.test(line.trim())); console.log(`${label}:`); - console.log(` exit status ${status}`); - console.log(` reached main() ${started}`); - console.log(` GITHUB_OUTPUT ${JSON.stringify(output)}`); - console.log( - ` first stderr line ${JSON.stringify((res.stderr || '').split('\n')[0])}` - ); + console.log(` exit status ${status}`); + console.log(` elapsed ${Date.now() - started}ms`); + console.log(` stdout ${JSON.stringify(res.stdout || '')}`); + console.log(` failure reported ${JSON.stringify(message ?? '')}`); + console.log(''); } -// 203.0.113.0/24 is TEST-NET-3 (RFC 5737): guaranteed never routable, so the -// unpkg fetch fails the way a real outage makes it fail. -run('unpkg unreachable (what the opaque failure looked like)', { - HTTPS_PROXY: 'http://203.0.113.1:9', - HTTP_PROXY: 'http://203.0.113.1:9', -}); +// Before: the module-scope fetch the eleven release scripts used to open with. +run( + 'legacy inline fetch', + `const { use } = eval( + await (await fetch(${JSON.stringify(BLACKHOLE_URL)})).text() + ); + console.log('reached the script body');` +); -run('unpkg reachable (normal run)', {}); +// After: the same failure through js/scripts/use-m-loader.mjs. attempts and +// timeoutMs are shortened here only so the experiment finishes quickly; the +// code path, the retry and the message are the production ones. Set +// CI_SCRIPTS_DEBUG=1 to see one ::debug:: line per attempt. +run( + 'shared loader', + `import { loadUseM } from ${JSON.stringify(LOADER)}; + const use = await loadUseM({ + url: ${JSON.stringify(BLACKHOLE_URL)}, + attempts: 2, + timeoutMs: 3000, + retryDelayMs: 200, + }); + console.log('reached the script body');` +); diff --git a/js/scripts/changeset-version.mjs b/js/scripts/changeset-version.mjs index 8813344..7ce2dd2 100644 --- a/js/scripts/changeset-version.mjs +++ b/js/scripts/changeset-version.mjs @@ -13,10 +13,10 @@ * - command-stream: Modern shell command execution with streaming support */ -// Load use-m dynamically -const { use } = eval( - await (await fetch('https://unpkg.com/use-m/use.js')).text() -); +import { loadUseM } from './use-m-loader.mjs'; + +// Load use-m dynamically, retrying a CDN blip instead of dying at module load. +const use = await loadUseM(); // Import command-stream for shell command execution const { $ } = await use('command-stream'); diff --git a/js/scripts/check-release-needed.mjs b/js/scripts/check-release-needed.mjs index 86f8e9d..a97bb5f 100644 --- a/js/scripts/check-release-needed.mjs +++ b/js/scripts/check-release-needed.mjs @@ -53,11 +53,10 @@ */ import { readFileSync, appendFileSync } from 'fs'; +import { loadUseM } from './use-m-loader.mjs'; // Load use-m dynamically (matches the other release scripts in this folder). -const { use } = eval( - await (await fetch('https://unpkg.com/use-m/use.js')).text() -); +const use = await loadUseM(); const { $ } = await use('command-stream'); diff --git a/js/scripts/create-github-release.mjs b/js/scripts/create-github-release.mjs index 430b937..c94cd58 100644 --- a/js/scripts/create-github-release.mjs +++ b/js/scripts/create-github-release.mjs @@ -13,11 +13,10 @@ */ import { readFileSync } from 'fs'; +import { loadUseM } from './use-m-loader.mjs'; // Load use-m dynamically -const { use } = eval( - await (await fetch('https://unpkg.com/use-m/use.js')).text() -); +const use = await loadUseM(); // Import link-foundation libraries const { $ } = await use('command-stream'); diff --git a/js/scripts/create-manual-changeset.mjs b/js/scripts/create-manual-changeset.mjs index 60bfac6..4fce398 100644 --- a/js/scripts/create-manual-changeset.mjs +++ b/js/scripts/create-manual-changeset.mjs @@ -14,13 +14,12 @@ import { writeFileSync } from 'fs'; import { randomBytes } from 'crypto'; +import { loadUseM } from './use-m-loader.mjs'; const PACKAGE_NAME = 'command-stream'; // Load use-m dynamically -const { use } = eval( - await (await fetch('https://unpkg.com/use-m/use.js')).text() -); +const use = await loadUseM(); // Import link-foundation libraries const { $ } = await use('command-stream'); diff --git a/js/scripts/format-github-release.mjs b/js/scripts/format-github-release.mjs index 8ab39b1..c60c09c 100644 --- a/js/scripts/format-github-release.mjs +++ b/js/scripts/format-github-release.mjs @@ -13,10 +13,10 @@ * - lino-arguments: Unified configuration from CLI args, env vars, and .lenv files */ -// Load use-m dynamically -const { use } = eval( - await (await fetch('https://unpkg.com/use-m/use.js')).text() -); +import { loadUseM } from './use-m-loader.mjs'; + +// Load use-m dynamically, retrying a CDN blip instead of dying at module load. +const use = await loadUseM(); // Import link-foundation libraries const { $ } = await use('command-stream'); diff --git a/js/scripts/format-release-notes.mjs b/js/scripts/format-release-notes.mjs index 1e5a15e..c7340a0 100644 --- a/js/scripts/format-release-notes.mjs +++ b/js/scripts/format-release-notes.mjs @@ -23,12 +23,12 @@ * Note: Uses --release-version instead of --version to avoid conflict with yargs' built-in --version flag. */ +import { loadUseM } from './use-m-loader.mjs'; + const PACKAGE_NAME = 'command-stream'; // Load use-m dynamically -const { use } = eval( - await (await fetch('https://unpkg.com/use-m/use.js')).text() -); +const use = await loadUseM(); // Import link-foundation libraries const { $ } = await use('command-stream'); diff --git a/js/scripts/instant-version-bump.mjs b/js/scripts/instant-version-bump.mjs index 8d15132..f78fee0 100644 --- a/js/scripts/instant-version-bump.mjs +++ b/js/scripts/instant-version-bump.mjs @@ -13,11 +13,10 @@ */ import { readFileSync, writeFileSync } from 'fs'; +import { loadUseM } from './use-m-loader.mjs'; // Load use-m dynamically -const { use } = eval( - await (await fetch('https://unpkg.com/use-m/use.js')).text() -); +const use = await loadUseM(); // Import link-foundation libraries const { $ } = await use('command-stream'); diff --git a/js/scripts/publish-to-npm.mjs b/js/scripts/publish-to-npm.mjs index 3fbcd23..5fefff0 100644 --- a/js/scripts/publish-to-npm.mjs +++ b/js/scripts/publish-to-npm.mjs @@ -55,13 +55,12 @@ import { publishWithRetry, sleep, } from './publish-retry.mjs'; +import { loadUseM } from './use-m-loader.mjs'; const FALLBACK_PACKAGE_NAME = 'command-stream'; // Load use-m dynamically -const { use } = eval( - await (await fetch('https://unpkg.com/use-m/use.js')).text() -); +const use = await loadUseM(); // Import link-foundation libraries const { $ } = await use('command-stream'); diff --git a/js/scripts/setup-npm.mjs b/js/scripts/setup-npm.mjs index 3ef1307..4e29a0b 100644 --- a/js/scripts/setup-npm.mjs +++ b/js/scripts/setup-npm.mjs @@ -26,6 +26,7 @@ import { resolve } from 'node:path'; import process from 'node:process'; import { fileURLToPath } from 'node:url'; +import { loadUseM } from './use-m-loader.mjs'; export const NPM_MIN_VERSION = '11.5.1'; export const NODE_MIN_VERSION = '22.14.0'; @@ -300,9 +301,7 @@ if (isMainModule()) { // Load use-m dynamically only for CLI execution, so tests can import the // pure version helpers without fetching dependencies or mutating npm. - const { use } = eval( - await (await fetch('https://unpkg.com/use-m/use.js')).text() - ); + const use = await loadUseM(); const { $ } = await use('command-stream'); await setupNpm($); diff --git a/js/scripts/use-m-loader.mjs b/js/scripts/use-m-loader.mjs new file mode 100644 index 0000000..8e3aa3e --- /dev/null +++ b/js/scripts/use-m-loader.mjs @@ -0,0 +1,202 @@ +#!/usr/bin/env node + +/** + * Load `use-m` from its CDN, with a timeout, bounded retries and an error that + * names what failed. + * + * Every release script in this folder starts by fetching + * https://unpkg.com/use-m/use.js and eval-ing it. Eleven scripts did that + * inline, at module scope, with no timeout and no retry: + * + * const { use } = eval(await (await fetch(USE_M_URL)).text()); + * + * Three failure modes follow from that shape, and all three were observed + * while investigating issue #199: + * + * - A network-level failure (DNS, connect, reset) rejects with a bare + * `TypeError: fetch failed`, thrown during module initialisation. The + * script dies before its first `console.log` and before it writes anything + * to GITHUB_OUTPUT, so the job's log names neither the CDN nor the URL. In + * the publish tests this surfaced as `Expected to contain: "published=true" + * / Received: ""` -- a red release caused by a third-party outage, reported + * as a publish defect. + * - A CDN error page is HTML, and eval-ing HTML raises `SyntaxError: + * Unexpected token '<'`, which points at this repository's code for a + * response it never inspected. The status is checked before the eval here. + * - A stalled connection has no deadline of its own, so the job burned its + * whole `timeout-minutes` on a socket that was never going to answer. + * + * A CDN blip is transient by nature, so the fetch is retried with exponential + * backoff before it is allowed to fail the run at all. + * + * Verbose tracing: set CI_SCRIPTS_DEBUG=1 (or re-run the job with GitHub's + * debug logging) to emit one `::debug::` line per attempt. Off by default. + * + * Usage: + * import { loadUseM } from './use-m-loader.mjs'; + * const use = await loadUseM(); + * const { $ } = await use('command-stream'); + */ + +import { debug } from './debug-print.mjs'; + +/** CDN entry point for use-m, kept in one place. */ +export const USE_M_URL = 'https://unpkg.com/use-m/use.js'; + +/** Total attempts, including the first one. */ +export const DEFAULT_ATTEMPTS = 3; + +/** Per-attempt deadline: a stalled connect must not consume the job's budget. */ +export const DEFAULT_TIMEOUT_MS = 15000; + +/** Delay before the second attempt; doubled for each attempt after it. */ +export const DEFAULT_RETRY_DELAY_MS = 2000; + +/** Cached `use`, so a process fetches use.js at most once. */ +let cachedUse = null; + +/** + * @param {number} ms + * @returns {Promise} + */ +const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); + +/** + * Fetch use.js once and evaluate it. + * + * @param {{fetchImpl: typeof fetch, url: string, timeoutMs: number}} options + * @returns {Promise<(name: string) => Promise>} use-m's `use` + */ +async function fetchUse({ fetchImpl, url, timeoutMs }) { + // AbortSignal.timeout is the deadline the bare fetch never had. Node 18+ and + // Bun both ship it; the scripts here run on nothing older. + const response = await fetchImpl(url, { + signal: AbortSignal.timeout(timeoutMs), + }); + if (!response.ok) { + throw new Error( + `HTTP ${response.status} ${response.statusText || ''}`.trim() + ); + } + const source = await response.text(); + // use-m ships as an eval-able bundle; this is its documented entry point. + const evaluated = await eval(source); + const use = evaluated?.use ?? evaluated?.default?.use; + if (typeof use !== 'function') { + const keys = + evaluated && typeof evaluated === 'object' + ? `[${Object.keys(evaluated).join(', ')}]` + : String(evaluated); + throw new Error(`the bundle did not export a callable "use"; got ${keys}`); + } + return use; +} + +/** + * Apply the defaults. Kept apart from `loadUseM` so the retry loop stays under + * the complexity limit eslint enforces for this repository. + * + * @param {Record} options + * @returns {{ + * fetchImpl: typeof fetch, + * url: string, + * attempts: number, + * timeoutMs: number, + * retryDelayMs: number, + * sleep: (ms: number) => Promise, + * cacheable: boolean, + * }} + */ +function resolveOptions(options) { + const url = options.url ?? USE_M_URL; + return { + fetchImpl: options.fetchImpl ?? fetch, + url, + attempts: options.attempts ?? DEFAULT_ATTEMPTS, + timeoutMs: options.timeoutMs ?? DEFAULT_TIMEOUT_MS, + retryDelayMs: options.retryDelayMs ?? DEFAULT_RETRY_DELAY_MS, + sleep: options.sleep ?? wait, + // Tests inject their own fetch, so a cached `use` from a previous call must + // not answer for them -- and must not be overwritten by their stub either. + cacheable: !options.fetchImpl && url === USE_M_URL, + }; +} + +/** + * Readable text for a thrown value, for logs and for the final message. + * @param {unknown} error + * @returns {string} + */ +const describeError = (error) => error?.message ?? String(error); + +/** + * Load use-m, retrying a transient CDN failure before failing the run. + * + * @param {{ + * fetchImpl?: typeof fetch, + * url?: string, + * attempts?: number, + * timeoutMs?: number, + * retryDelayMs?: number, + * sleep?: (ms: number) => Promise, + * }} [options] injection seams for tests; production passes nothing + * @returns {Promise<(name: string) => Promise>} use-m's `use` + * @throws {Error} naming the URL, the attempt count and the last cause + */ +export async function loadUseM(options = {}) { + const { + fetchImpl, + url, + attempts, + timeoutMs, + retryDelayMs, + sleep, + cacheable, + } = resolveOptions(options); + + if (cacheable && cachedUse) { + return cachedUse; + } + + let lastError; + for (let attempt = 1; attempt <= attempts; attempt += 1) { + try { + const use = await fetchUse({ fetchImpl, url, timeoutMs }); + debug('loaded use-m', { url, attempt }); + if (cacheable) { + cachedUse = use; + } + return use; + } catch (error) { + lastError = error; + debug('use-m load attempt failed', { + url, + attempt, + attempts, + error: describeError(error), + }); + if (attempt < attempts) { + await sleep(retryDelayMs * 2 ** (attempt - 1)); + } + } + } + + // The message is the whole point of this module: it has to be readable from + // the CI log alone, and it has to say that the failure is the CDN's rather + // than this repository's. + throw new Error( + `Failed to load use-m from ${url} after ${attempts} attempt(s): ` + + `${describeError(lastError)}. ` + + 'This is a network dependency of the release scripts, not a defect in ' + + 'the published package; re-run the job when the CDN answers again.', + { cause: lastError } + ); +} + +/** + * Drop the cached `use`. Only tests need this. + * @returns {void} + */ +export function resetUseMCache() { + cachedUse = null; +} diff --git a/js/scripts/version-and-commit.mjs b/js/scripts/version-and-commit.mjs index a474b7a..47e92e1 100644 --- a/js/scripts/version-and-commit.mjs +++ b/js/scripts/version-and-commit.mjs @@ -13,11 +13,10 @@ */ import { readFileSync, appendFileSync, readdirSync } from 'fs'; +import { loadUseM } from './use-m-loader.mjs'; // Load use-m dynamically -const { use } = eval( - await (await fetch('https://unpkg.com/use-m/use.js')).text() -); +const use = await loadUseM(); // Import link-foundation libraries const { $ } = await use('command-stream'); diff --git a/js/scripts/wait-for-npm.mjs b/js/scripts/wait-for-npm.mjs index ca6033f..4f5a5c2 100644 --- a/js/scripts/wait-for-npm.mjs +++ b/js/scripts/wait-for-npm.mjs @@ -28,6 +28,7 @@ import { appendFileSync, readFileSync } from 'node:fs'; import path from 'node:path'; import process from 'node:process'; import { fileURLToPath } from 'node:url'; +import { loadUseM } from './use-m-loader.mjs'; export const DEFAULT_MAX_ATTEMPTS = 30; export const DEFAULT_SLEEP_SECONDS = 10; @@ -98,9 +99,7 @@ function isCliEntryPoint() { async function runCli() { // Load use-m dynamically (matches the other release scripts in this folder). - const { use } = eval( - await (await fetch('https://unpkg.com/use-m/use.js')).text() - ); + const use = await loadUseM(); const { $ } = await use('command-stream'); const { makeConfig } = await use('lino-arguments'); diff --git a/js/tests/publish-to-npm.test.mjs b/js/tests/publish-to-npm.test.mjs index c6df54f..138d2d5 100644 --- a/js/tests/publish-to-npm.test.mjs +++ b/js/tests/publish-to-npm.test.mjs @@ -37,14 +37,19 @@ const isWindows = process.platform === 'win32'; let networkAvailable = !isWindows; -// The very first thing publish-to-npm.mjs does is -// `await fetch('https://unpkg.com/use-m/use.js')` at module scope. That await is -// not inside main()'s try/catch, so when the CDN is unreachable the script dies -// during module initialisation: it never writes a line to GITHUB_OUTPUT and -// never prints its first log. Probing only `npm view` misses this β€” the npm -// registry and unpkg fail independently β€” and the suite then reports +// The very first thing publish-to-npm.mjs does is load use-m from +// https://unpkg.com/use-m/use.js, at module scope β€” outside main()'s +// try/catch. When the CDN is unreachable the script dies during module +// initialisation: it never writes a line to GITHUB_OUTPUT and never prints its +// first log. Probing only `npm view` misses this β€” the npm registry and unpkg +// fail independently β€” and the suite then reports // `Expected to contain: "published=true" / Received: ""`, which names neither // the CDN nor the network as the cause. Both endpoints are probed. +// +// scripts/use-m-loader.mjs now gives that load a deadline, retries and an error +// naming the URL, so an outage is reported honestly instead of opaquely. The +// probe stays: it is cheaper to skip the suite once than to let every spawned +// case spend the loader's whole retry budget on a CDN that is down. const USE_M_URL = 'https://unpkg.com/use-m/use.js'; beforeAll(async () => { @@ -82,9 +87,10 @@ beforeAll(async () => { * * `publish-to-npm.mjs` prints "Current version to publish: ..." before it does * anything else, so stdout without that line means module initialisation threw - * (almost always the unpkg fetch above) and every later assertion would compare + * (almost always the use-m load above) and every later assertion would compare * against an empty string. Raising here puts the child's exit status and stderr - * in the failure message instead. + * in the failure message instead β€” since the loader landed, that stderr names + * the CDN and the URL. * * @param {{status:number|null, stdout:string, stderr:string, output:string}} result * @returns {{status:number|null, stdout:string, stderr:string, output:string}} the same result diff --git a/js/tests/use-m-loader.test.mjs b/js/tests/use-m-loader.test.mjs new file mode 100644 index 0000000..dd7e79d --- /dev/null +++ b/js/tests/use-m-loader.test.mjs @@ -0,0 +1,231 @@ +// Unit tests for js/scripts/use-m-loader.mjs +// +// Every release script starts by fetching https://unpkg.com/use-m/use.js and +// eval-ing it. Eleven of them did that inline, at module scope, with no +// timeout and no retry, so a CDN blip killed the script during module +// initialisation: no log line, nothing written to GITHUB_OUTPUT, and a bare +// `TypeError: fetch failed` on stderr. That is a third-party outage reported as +// a publish defect -- the class of false positive issue #199 is about. +// +// These tests pin the four properties that make the failure honest: a deadline, +// bounded retries, a status check before the eval, and an error naming the URL +// and the cause. The network is never touched: `fetchImpl` is injected. +import { test, expect } from 'bun:test'; +import { readFileSync } from 'fs'; +import { join, dirname } from 'path'; +import { execFileSync } from 'child_process'; +import { + loadUseM, + resetUseMCache, + USE_M_URL, + DEFAULT_ATTEMPTS, + DEFAULT_TIMEOUT_MS, +} from '../scripts/use-m-loader.mjs'; + +const repoRoot = join(dirname(Bun.fileURLToPath(import.meta.url)), '..', '..'); + +/** A use.js bundle whose evaluation yields `{ use }`, like the real one. */ +const BUNDLE = '({ use: async (name) => ({ loaded: name }) })'; + +/** + * @param {string} body response body + * @param {{status?: number, statusText?: string}} [init] + * @returns {Response} + */ +const respond = (body, init = {}) => + new Response(body, { + status: init.status ?? 200, + statusText: init.statusText ?? 'OK', + }); + +/** Records the delays a retry would have slept, without sleeping. */ +const recordingSleep = (delays) => async (ms) => { + delays.push(ms); +}; + +test('a healthy CDN yields a callable use', async () => { + const seen = []; + const use = await loadUseM({ + fetchImpl: async (url, options) => { + seen.push({ url, hasSignal: Boolean(options?.signal) }); + return respond(BUNDLE); + }, + }); + + expect(typeof use).toBe('function'); + expect(await use('command-stream')).toEqual({ loaded: 'command-stream' }); + expect(seen).toEqual([{ url: USE_M_URL, hasSignal: true }]); +}); + +// The bare fetch had no deadline of its own, so a stalled connect burned the +// job's whole timeout-minutes on a socket that was never going to answer. +test('every attempt carries an abort deadline', async () => { + const signals = []; + await loadUseM({ + fetchImpl: async (_url, options) => { + signals.push(options.signal); + return respond(BUNDLE); + }, + }); + + expect(signals).toHaveLength(1); + expect(signals[0]).toBeInstanceOf(AbortSignal); + expect(signals[0].aborted).toBe(false); +}); + +test('an aborted fetch is reported as a load failure, not a hang', async () => { + await expect( + loadUseM({ + attempts: 1, + timeoutMs: 5, + fetchImpl: (_url, options) => + new Promise((_resolve, reject) => { + options.signal.addEventListener('abort', () => + reject(options.signal.reason) + ); + }), + }) + ).rejects.toThrow(/Failed to load use-m from https:\/\/unpkg\.com/); +}); + +// A CDN blip is transient by nature: retrying is the difference between a red +// release and a run that is a couple of seconds slower. +test('a transient failure is retried and then succeeds', async () => { + const delays = []; + let calls = 0; + const use = await loadUseM({ + sleep: recordingSleep(delays), + fetchImpl: async () => { + calls += 1; + if (calls < 3) { + throw new TypeError('fetch failed'); + } + return respond(BUNDLE); + }, + }); + + expect(typeof use).toBe('function'); + expect(calls).toBe(3); + // Exponential backoff: 2000, then 4000. + expect(delays).toEqual([2000, 4000]); +}); + +test('attempts are bounded and the last cause is preserved', async () => { + const delays = []; + let calls = 0; + const failure = new TypeError('fetch failed'); + + const error = await loadUseM({ + sleep: recordingSleep(delays), + fetchImpl: async () => { + calls += 1; + throw failure; + }, + }).then( + () => null, + (thrown) => thrown + ); + + expect(calls).toBe(DEFAULT_ATTEMPTS); + expect(delays).toHaveLength(DEFAULT_ATTEMPTS - 1); + expect(error.message).toContain(USE_M_URL); + expect(error.message).toContain(`after ${DEFAULT_ATTEMPTS} attempt(s)`); + expect(error.message).toContain('fetch failed'); + // The message has to say whose failure this is, so the run is re-run rather + // than investigated as a defect in the published package. + expect(error.message).toContain('network dependency'); + expect(error.cause).toBe(failure); +}); + +// eval-ing a CDN error page raises `SyntaxError: Unexpected token '<'`, which +// points at this repository's code for a response it never inspected. +test('an error page is reported by status, never evaluated', async () => { + let calls = 0; + const error = await loadUseM({ + attempts: 1, + fetchImpl: async () => { + calls += 1; + return respond('503 Service Unavailable', { + status: 503, + statusText: 'Service Unavailable', + }); + }, + }).then( + () => null, + (thrown) => thrown + ); + + expect(calls).toBe(1); + expect(error.message).toContain('HTTP 503 Service Unavailable'); + expect(error.message).not.toContain('Unexpected token'); +}); + +test('a bundle without a callable use names what it did export', async () => { + const error = await loadUseM({ + attempts: 1, + fetchImpl: async () => respond('({ notUse: 1, alsoNotUse: 2 })'), + }).then( + () => null, + (thrown) => thrown + ); + + expect(error.message).toContain('notUse'); + expect(error.message).toContain('alsoNotUse'); +}); + +test('a bundle nested under default is unwrapped', async () => { + const use = await loadUseM({ + fetchImpl: async () => + respond('({ default: { use: async (name) => ({ nested: name }) } })'), + }); + + expect(await use('lino-arguments')).toEqual({ nested: 'lino-arguments' }); +}); + +// An injected fetch must neither read nor write the process-wide cache, or one +// test would answer for the next. +test('injected fetches bypass the cache in both directions', async () => { + resetUseMCache(); + let calls = 0; + const fetchImpl = async () => { + calls += 1; + return respond(BUNDLE); + }; + + await loadUseM({ fetchImpl }); + await loadUseM({ fetchImpl }); + + expect(calls).toBe(2); +}); + +test('the defaults keep a stalled CDN inside a job timeout', () => { + expect(DEFAULT_ATTEMPTS).toBeGreaterThan(1); + // Worst case: attempts * timeout + backoff, well under the 10-minute + // timeout-minutes the release jobs declare. + const worstCaseMs = DEFAULT_ATTEMPTS * DEFAULT_TIMEOUT_MS + 6000; + expect(worstCaseMs).toBeLessThan(10 * 60 * 1000); +}); + +// The point of the shared loader is that the hardening applies everywhere. A +// script that fetches use.js inline gets none of it back. +test('no script fetches use-m inline any more', () => { + const files = execFileSync('git', ['ls-files', 'js/scripts/*.mjs'], { + cwd: repoRoot, + encoding: 'utf8', + }) + .trim() + .split('\n') + .filter(Boolean) + .filter((file) => !file.endsWith('use-m-loader.mjs')); + + const offenders = files.filter((file) => + readFileSync(join(repoRoot, file), 'utf8').includes('unpkg.com/use-m') + ); + + expect(offenders).toEqual([]); + // And the scripts that need use-m go through the loader. + const viaLoader = files.filter((file) => + readFileSync(join(repoRoot, file), 'utf8').includes('loadUseM(') + ); + expect(viaLoader.length).toBeGreaterThanOrEqual(11); +}); From b7b43af4f919dba8df3534d22dd8da6df53f5d44 Mon Sep 17 00:00:00 2001 From: konard Date: Sat, 5 Sep 2026 01:17:42 +0000 Subject: [PATCH 32/34] docs: record the use-m loader invariant, the debug switches and issue #161 --- .../issues/199/pulls/200/analysis/README.md | 102 +++++++++--- .../200/upstream/js-template-use-m-timeout.md | 151 ++++++++++++++++++ docs/CI-CD.md | 34 +++- 3 files changed, 268 insertions(+), 19 deletions(-) create mode 100644 dev/log/issues/199/pulls/200/upstream/js-template-use-m-timeout.md diff --git a/dev/log/issues/199/pulls/200/analysis/README.md b/dev/log/issues/199/pulls/200/analysis/README.md index b0d231b..4201675 100644 --- a/dev/log/issues/199/pulls/200/analysis/README.md +++ b/dev/log/issues/199/pulls/200/analysis/README.md @@ -439,7 +439,7 @@ outside `main()`'s `try/catch`, so an unreachable CDN kills the script during module initialisation β€” before it writes a single line to `GITHUB_OUTPUT` and before its first `console.log`. -Two defects compound: +Three defects compound: * **The offline guard probed the wrong endpoint.** `beforeAll` ran `npm view command-stream version` and treated success as "we are online". @@ -453,27 +453,54 @@ Two defects compound: script's first log line and, when it is absent, raises with the child's exit status, stderr and `GITHUB_OUTPUT` contents, so the next occurrence is diagnosable from the CI log alone. - -`experiments/publish-cdn-unreachable.mjs` reproduces it on demand by routing the -fetch through a proxy at an unroutable TEST-NET-3 address (RFC 5737), instead of -waiting for a real outage: +* **The load itself had no deadline, no retry and no diagnostics.** Eleven + scripts in `js/scripts/` opened with the same inline statement, so the + hardening had to be applied in all of them, not only in the one the tests + spawn. Three failure modes follow from that shape: a network failure rejects + with a bare `TypeError: fetch failed` thrown during module initialisation; a + CDN *error page* is HTML, and eval-ing HTML raises `SyntaxError: Unexpected + token '<'`, which points at this repository's code for a response it never + inspected; and a stalled connection has no deadline of its own β€” undici bounds + only the connect (10 s), while `headersTimeout` defaults to 300 s, so one + fetch can burn five minutes of a job's `timeout-minutes`. + + `js/scripts/use-m-loader.mjs` is now the single place that loads use-m: a + per-attempt `AbortSignal.timeout(15000)`, three attempts with exponential + backoff (a CDN blip is transient by nature), `response.ok` checked before the + eval, one `::debug::` line per attempt (off by default, per the verbose-mode + requirement), and a final error naming the URL, the attempt count and the + cause. All eleven scripts call it; `js/tests/use-m-loader.test.mjs` pins the + behaviour and asserts that no script fetches use.js inline again. + +`experiments/publish-cdn-unreachable.mjs` reproduces it on demand by pointing +the fetch at an unroutable TEST-NET-3 address (RFC 5737), instead of waiting for +a real outage, and runs both shapes side by side: ``` -unpkg unreachable (what the opaque failure looked like): - exit status null (killed after 20000ms) - reached main() false - GITHUB_OUTPUT "" -unpkg reachable (normal run): - exit status 0 - reached main() true - GITHUB_OUTPUT "published=true\npublished_version=0.9.5\nalready_published=true\n" +legacy inline fetch: + exit status 1 + elapsed 10718ms + stdout "" + failure reported "TypeError: fetch failed" + +shared loader: + exit status 1 + elapsed 6314ms + stdout "" + failure reported "Error: Failed to load use-m from https://203.0.113.1/use-m/use.js + after 2 attempt(s): The operation was aborted due to timeout. This + is a network dependency of the release scripts, not a defect in the + published package; re-run the job when the CDN answers again." ``` -The null status is the experiment's own timeout killing a child still blocked in -the module-scope fetch. A real outage fails faster, but lands in the same place: -no `GITHUB_OUTPUT`, no log line, nothing for the assertion to name. +Neither run reaches the script body β€” the load is still at module scope, so the +script cannot write `published=false` itself β€” but the second one says who +failed, which is the difference between re-running a job and investigating a +publish defect. Moving the loads inside `main()` is the remaining step; it is +listed as follow-up 1 in the upstream report, because the same module-scope +shape is what the template ships. -With the fix, the same unreachable-CDN run skips all six tests rather than +With the offline guard fixed, an unreachable CDN skips all six tests rather than failing them: ``` @@ -558,7 +585,7 @@ reads, and its zizmor job runs at `min-confidence: medium`, which hides the ## 7. Upstream issues reported -Three defects found here also exist in the templates the issue asks to compare +Seven defects found here also exist in the templates the issue asks to compare against, so each was reported with a reproducible example, a workaround and the code-level fix: @@ -570,6 +597,7 @@ code-level fix: | [#150](https://github.com/link-foundation/rust-ai-driven-development-pipeline-template/issues/150) | rust template | No workflow runs `rust-script --test`, so 78 tests across 9 scripts never execute; `create-github-release.rs` does not compile in test mode and `version-and-commit.rs` fails under the template's own `RUSTFLAGS: -Dwarnings` (Β§4.16) | | [#159](https://github.com/link-foundation/js-ai-driven-development-pipeline-template/issues/159) | js template | `links.yml`'s `paths:` filter omits `.lycheeignore` and `scripts/check-web-archive.mjs`, so editing the ignore list or the archive helper does not re-run the job that reads them | | [#160](https://github.com/link-foundation/js-ai-driven-development-pipeline-template/issues/160) | js template | 25 of 27 checkouts persist credentials, and `min-confidence: medium` hides every `artipacked` finding (it is a Low-confidence check), so the audit reports 3 findings instead of 28 | +| [#161](https://github.com/link-foundation/js-ai-driven-development-pipeline-template/issues/161) | js template | `use-module.mjs` fetches use-m with no timeout and no retry, and eight scripts call it at module scope, so a CDN blip kills them with a bare `TypeError: fetch failed` and an empty `GITHUB_OUTPUT` (Β§4.25) | Checked and deliberately **not** reported, because they are correct as written: the Rust template's `pipeline-status: if: always()` (it intentionally reports @@ -616,6 +644,43 @@ A retry after a slow-propagating publish therefore fails the release even though the version is live. Reproducible example, workaround and the code fix are in the issue text (see Β§9 of the PR description). +### Detail: #161 + +**Repository:** `link-foundation/js-ai-driven-development-pipeline-template` +**Archived report body:** `../upstream/js-template-use-m-timeout.md` + +`scripts/use-module.mjs:113` is `const response = await fetchImpl(url);` β€” no +`signal`, no retry β€” and seven scripts call it through `loadCommandStream()` at +module scope (`publish-to-npm.mjs:38`, `changeset-version.mjs:30`, +`create-manual-changeset.mjs:22`, `instant-version-bump.mjs:36`, +`format-github-release.mjs:23`, `format-release-notes.mjs:33`, +`version-and-commit.mjs:31`); only `setup-npm.mjs:257` loads inside a function +and can therefore report the failure itself. Checked at `7ae16b0` (0.11.28). + +Two reproductions were run against the template checkout. An unreachable CDN: + +``` +$ node repro.mjs # loadUse({ url: 'https://203.0.113.1/use-m/use.js' }) +elapsed 10620ms +name TypeError +message fetch failed +cause Connect Timeout Error (attempted address: 203.0.113.1:443, timeout: 10000ms) +``` + +The 10 s bound is undici's connect timeout, not the template's. A CDN that +accepts the connection and never answers is not bounded at all: + +``` +$ node stall.mjs # server accepts, never responds +after 25047ms: still waiting +``` + +The report includes both reproductions, the workaround (re-run the job; probe +unpkg as well as `npm view` in test guards), the diff adding the timeout and the +bounded retry, and two follow-ups: move the module-scope loads into `main()` so +the script can still write to `GITHUB_OUTPUT`, and keep the worst case inside +`timeout-minutes`. + ## 8. Existing components / libraries surveyed | Component | Used for | @@ -629,4 +694,5 @@ the issue text (see Β§9 of the PR description). | npm registry metadata endpoint (`https://registry.npmjs.org/`) | Publication check that does not depend on `npm view`'s cache/replica behaviour. | | [`secretlint`](https://github.com/secretlint/secretlint) + `@secretlint/secretlint-rule-preset-recommend` | Committed-credential scan (best practice #11). Chosen over gitleaks/trufflehog because it needs no extra toolchain in a repository that already runs npm, and its ignore file is reviewable text. | | [`lychee`](https://lychee.cloudflare.dev/) via `lycheeverse/lychee-action` | External link checking, weekly rather than per-pull-request (Β§4.22), with `.lycheeignore` for endpoints that answer only to a browser session. | +| `AbortSignal.timeout()` (Node 18+, Bun, Deno) | Per-attempt deadline for the use-m CDN fetch (Β§4.25). Chosen over `p-retry`/`node-fetch-retry`/`fetch-retry`, which do the same job well, because these scripts run with **no `package.json` dependencies at all** β€” that constraint is the reason use-m exists β€” so a retry library would have to be fetched over the very network path it is meant to protect. The whole policy is 40 lines of `js/scripts/use-m-loader.mjs`. | | `git ls-files` via `execFileSync` | Input discovery for the documentation and hygiene tests. Deliberately not a glob library: git already knows what is tracked, and going through a shell is what broke it on Windows (Β§4.23). | diff --git a/dev/log/issues/199/pulls/200/upstream/js-template-use-m-timeout.md b/dev/log/issues/199/pulls/200/upstream/js-template-use-m-timeout.md new file mode 100644 index 0000000..1bee21b --- /dev/null +++ b/dev/log/issues/199/pulls/200/upstream/js-template-use-m-timeout.md @@ -0,0 +1,151 @@ +## Summary + +`scripts/use-module.mjs`'s `loadUse()` fetches `https://unpkg.com/use-m/use.js` with a bare `fetch()` β€” **no deadline, no retry** β€” and eight release scripts call it (through `loadCommandStream()`) at **module scope**, outside their own `main()`/`try`. When the CDN is unreachable or slow, the script dies during module initialisation: it prints nothing, writes nothing to `GITHUB_OUTPUT`, and the job's only diagnostic is `TypeError: fetch failed`, which names neither the CDN nor the URL. + +That turns a third-party outage into what looks like a defect in the release logic. In `link-foundation/command-stream` (which uses this template's scripts) the same shape made the publish suite fail intermittently with + +``` +Expected to contain: "published=true" +Received: "" +``` + +β€” two runs of the same unchanged suite differing only in whether unpkg answered. + +## Where + +* `scripts/use-module.mjs:113` β€” `const response = await fetchImpl(url);` (no `signal`, no retry) +* Module-scope callers, all of which die before their first log line: + * `scripts/changeset-version.mjs:30` + * `scripts/create-manual-changeset.mjs:22` + * `scripts/instant-version-bump.mjs:36` + * `scripts/format-github-release.mjs:23` + * `scripts/format-release-notes.mjs:33` + * `scripts/publish-to-npm.mjs:38` + * `scripts/version-and-commit.mjs:31` + * (`scripts/setup-npm.mjs:257` is inside a function, so it is the one that can report the failure itself) + +Checked at `7ae16b0` (0.11.28). + +## Reproduction 1 β€” unreachable CDN: the message names nothing + +`203.0.113.0/24` is TEST-NET-3 (RFC 5737), guaranteed never routable, so it fails the way a real outage fails. + +```js +// repro.mjs +import { loadUse } from './scripts/use-module.mjs'; +const started = Date.now(); +try { + await loadUse({ url: 'https://203.0.113.1/use-m/use.js' }); +} catch (error) { + console.log(`elapsed ${Date.now() - started}ms`); + console.log(`name ${error.name}`); + console.log(`message ${error.message}`); + console.log(`cause ${error.cause?.message ?? error.cause}`); +} +``` + +``` +$ node repro.mjs +elapsed 10620ms +name TypeError +message fetch failed +cause Connect Timeout Error (attempted address: 203.0.113.1:443, timeout: 10000ms) +``` + +The 10 s bound comes from undici's connect timeout, not from this code, and the `cause` is only visible because the reproduction prints it β€” a script that dies at module scope shows `TypeError: fetch failed` and a stack inside `use-module.mjs`. + +## Reproduction 2 β€” stalled CDN: nothing bounds the wait + +A connect timeout does not cover a server that accepts the connection and then never answers. undici's `headersTimeout` default is 300 s, so one such fetch can burn five minutes of a job's `timeout-minutes`: + +```js +// stall.mjs +import { createServer } from 'node:http'; +import { loadUse } from './scripts/use-module.mjs'; + +const server = createServer(() => {}); // accepts, never responds +await new Promise((r) => server.listen(0, '127.0.0.1', r)); +const url = `http://127.0.0.1:${server.address().port}/use-m/use.js`; + +const started = Date.now(); +const outcome = await Promise.race([ + loadUse({ url }).then(() => 'resolved', (e) => `rejected: ${e.message}`), + new Promise((r) => setTimeout(() => r('still waiting'), 25000)), +]); +console.log(`after ${Date.now() - started}ms: ${outcome}`); +process.exit(0); +``` + +``` +$ node stall.mjs +after 25047ms: still waiting +``` + +## Workaround + +Re-run the job β€” the failure is transient β€” and, in test suites that spawn these scripts, probe `https://unpkg.com/use-m/use.js` (not only `npm view`) before asserting: npm's registry and unpkg are different services that fail independently, so a reachable registry does not mean the dependency the script needs at startup is reachable. + +## Suggested fix + +Give the load a deadline and a bounded retry, and make the final error say what failed. `AbortSignal.timeout()` is available on every runtime these scripts target (Node 18+, Bun): + +```diff ++/** Per-attempt deadline: a stalled connect must not consume the job's budget. */ ++export const DEFAULT_TIMEOUT_MS = 15000; ++/** Total attempts, including the first one. */ ++export const DEFAULT_ATTEMPTS = 3; ++/** Delay before the second attempt; doubled for each attempt after it. */ ++export const DEFAULT_RETRY_DELAY_MS = 2000; ++ + export async function loadUse(options = {}) { +- const { fetchImpl = fetch, url = USE_M_URL } = options; ++ const { ++ fetchImpl = fetch, ++ url = USE_M_URL, ++ attempts = DEFAULT_ATTEMPTS, ++ timeoutMs = DEFAULT_TIMEOUT_MS, ++ retryDelayMs = DEFAULT_RETRY_DELAY_MS, ++ sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)), ++ } = options; + if (cachedUse && !options.fetchImpl) { + return cachedUse; + } +- const response = await fetchImpl(url); +- ... ++ let lastError; ++ for (let attempt = 1; attempt <= attempts; attempt += 1) { ++ try { ++ const use = await fetchOnce({ fetchImpl, url, timeoutMs }); // signal: AbortSignal.timeout(timeoutMs) ++ debug('loaded use-m', { url, attempt }); ++ if (!options.fetchImpl) cachedUse = use; ++ return use; ++ } catch (error) { ++ lastError = error; ++ debug('use-m load attempt failed', { url, attempt, attempts, error: error?.message }); ++ if (attempt < attempts) await sleep(retryDelayMs * 2 ** (attempt - 1)); ++ } ++ } ++ throw new Error( ++ `Failed to load use-m from ${url} after ${attempts} attempt(s): ` + ++ `${lastError?.message ?? String(lastError)}. This is a network dependency ` + ++ 'of the release scripts, not a defect in the published package; re-run ' + ++ 'the job when the CDN answers again.', ++ { cause: lastError } ++ ); + } +``` + +With that in place the same reproduction reports: + +``` +Error: Failed to load use-m from https://203.0.113.1/use-m/use.js after 2 attempt(s): The operation was aborted due to timeout. This is a network dependency of the release scripts, not a defect in the published package; re-run the job when the CDN answers again. +``` + +Two follow-ups worth doing in the same change: + +1. **Move the module-scope `await loadCommandStream()` calls inside `main()`** (as `setup-npm.mjs` already does), so a load failure is caught by the script's own error handling and the script can still write `published=false` / an explanatory line to `GITHUB_OUTPUT` instead of dying silently. +2. Keep the retry bounded so the worst case stays well inside the job's `timeout-minutes` (3 Γ— 15 s + backoff β‰ˆ 51 s). + +## Reference implementation + +`link-foundation/command-stream` ships this as [`js/scripts/use-m-loader.mjs`](https://github.com/link-foundation/command-stream/blob/issue-199-32c07917fc87/js/scripts/use-m-loader.mjs), with unit tests in [`js/tests/use-m-loader.test.mjs`](https://github.com/link-foundation/command-stream/blob/issue-199-32c07917fc87/js/tests/use-m-loader.test.mjs) (deadline present on every attempt, retry-then-succeed, bounded attempts, error page reported by status instead of eval-ed, cause preserved) and a runnable before/after reproduction in [`experiments/publish-cdn-unreachable.mjs`](https://github.com/link-foundation/command-stream/blob/issue-199-32c07917fc87/experiments/publish-cdn-unreachable.mjs). Found while working on link-foundation/command-stream#199. diff --git a/docs/CI-CD.md b/docs/CI-CD.md index 70628b3..a89a53c 100644 --- a/docs/CI-CD.md +++ b/docs/CI-CD.md @@ -96,6 +96,18 @@ still runs the three checks that read the whole tree. already there, low enough that adding duplication fails the job. `js/tests/duplication-check.test.mjs` pins both the language list and the threshold range. +- **Every network dependency of the release scripts loads with a deadline and a + retry.** The scripts carry no `package.json` dependencies: they fetch `use-m` + from `https://unpkg.com/use-m/use.js` and eval it. Done inline, at module + scope, that load has no deadline, no retry and no diagnostics, so a CDN blip + killed the script during module initialisation β€” before its first log line and + before anything reached `GITHUB_OUTPUT` β€” and the job reported a publish + defect. `js/scripts/use-m-loader.mjs` is the single loader: a 15 s deadline per + attempt, three attempts with exponential backoff, the HTTP status checked + before the eval (an error page is HTML, and eval-ing HTML blames this + repository for `Unexpected token '<'`), and a final error naming the URL, the + attempts and the cause. `js/tests/use-m-loader.test.mjs` asserts that no script + fetches use.js inline again. - **Lint and format configuration lives at the repository root.** eslint and prettier treat the directory holding their config as the project base path; while these files lived in `js/`, root-level JavaScript was outside that path @@ -128,6 +140,26 @@ than failing on every pull request; it starts reviewing on its own once the graph is on. Any other API status still fails the job. The npm, bun and cargo audit jobs cover the committed lockfiles in the meantime. +## Debugging a failed run + +The release scripts keep their tracing in the code with the default state +switched off, so a run that failed can be re-run with the tracing on and no code +change. Any of these enables it: + +- `CI_SCRIPTS_DEBUG=1` β€” the local switch, e.g. + `CI_SCRIPTS_DEBUG=1 bun js/scripts/check-release-needed.mjs`; +- `RUNNER_DEBUG=1` β€” set by GitHub's **Re-run all jobs with debug logging**; +- `ACTIONS_STEP_DEBUG=true` β€” the secret-gated workflow debug switch. + +Every line is prefixed with `::debug::`, so Actions renders it in the +collapsible debug stream and the main log stays readable. What it reports: the +publish, registry-verification and resolved-package decisions in +`publish-to-npm.mjs`, and one line per use-m load attempt including the URL and +the failure that caused a retry. `js/scripts/debug-print.mjs` is the +helper; it never throws, because tracing must not be the reason a script fails +(Deno denies `process.env` without `--allow-env`, and the denial surfaces on the +property read itself). + ## Releasing JavaScript uses changesets: add a `js/.changeset/*.md` entry describing the @@ -135,7 +167,7 @@ change and its bump type, or the `Check for JavaScript changesets` job fails. Rust uses changelog fragments: add `rust/changelog.d/YYYYMMDD_HHMMSS_*.md` with `bump:` frontmatter, or `Rust changelog fragment check` fails. -`scripts/publish-retry.mjs` treats an "already published" registry error as +`js/scripts/publish-retry.mjs` treats an "already published" registry error as success, including npm's E409 `Cannot publish over previously staged version` β€” a slow-propagating publish used to be reported as a failed release even though the version was live. From 53737946e86fed81dbaacd399702b0e9929a8ef4 Mon Sep 17 00:00:00 2001 From: konard Date: Sat, 5 Sep 2026 01:19:13 +0000 Subject: [PATCH 33/34] docs(dev/log): correct the module-scope caller count in the #161 report --- .../issues/199/pulls/200/upstream/js-template-use-m-timeout.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/log/issues/199/pulls/200/upstream/js-template-use-m-timeout.md b/dev/log/issues/199/pulls/200/upstream/js-template-use-m-timeout.md index 1bee21b..693e0f0 100644 --- a/dev/log/issues/199/pulls/200/upstream/js-template-use-m-timeout.md +++ b/dev/log/issues/199/pulls/200/upstream/js-template-use-m-timeout.md @@ -1,6 +1,6 @@ ## Summary -`scripts/use-module.mjs`'s `loadUse()` fetches `https://unpkg.com/use-m/use.js` with a bare `fetch()` β€” **no deadline, no retry** β€” and eight release scripts call it (through `loadCommandStream()`) at **module scope**, outside their own `main()`/`try`. When the CDN is unreachable or slow, the script dies during module initialisation: it prints nothing, writes nothing to `GITHUB_OUTPUT`, and the job's only diagnostic is `TypeError: fetch failed`, which names neither the CDN nor the URL. +`scripts/use-module.mjs`'s `loadUse()` fetches `https://unpkg.com/use-m/use.js` with a bare `fetch()` β€” **no deadline, no retry** β€” and seven release scripts call it (through `loadCommandStream()`) at **module scope**, outside their own `main()`/`try`. When the CDN is unreachable or slow, the script dies during module initialisation: it prints nothing, writes nothing to `GITHUB_OUTPUT`, and the job's only diagnostic is `TypeError: fetch failed`, which names neither the CDN nor the URL. That turns a third-party outage into what looks like a defect in the release logic. In `link-foundation/command-stream` (which uses this template's scripts) the same shape made the publish suite fail intermittently with From 25a64939d52edda04f7b3a766fea29fec0b6d760 Mon Sep 17 00:00:00 2001 From: konard Date: Sat, 5 Sep 2026 01:23:09 +0000 Subject: [PATCH 34/34] fix: load use-m through the shared loader in claude-profiles.mjs too The root-level CLI carried the same inline module-scope fetch the eleven release scripts did, so a CDN blip killed it before its first line with a bare `TypeError: fetch failed`. The invariant test now scans every tracked .mjs/.js/.cjs file instead of js/scripts/ alone. --- claude-profiles.mjs | 9 ++--- .../issues/199/pulls/200/analysis/README.md | 13 ++++--- docs/CI-CD.md | 5 +-- js/tests/use-m-loader.test.mjs | 36 ++++++++++++++++--- 4 files changed, 48 insertions(+), 15 deletions(-) diff --git a/claude-profiles.mjs b/claude-profiles.mjs index b2fb02f..58731a7 100755 --- a/claude-profiles.mjs +++ b/claude-profiles.mjs @@ -19,11 +19,12 @@ import fs, { createWriteStream, promises as fsPromises } from 'fs'; import path from 'path'; import os from 'os'; import { createHash } from 'crypto'; +import { loadUseM } from './js/scripts/use-m-loader.mjs'; -// Dynamically load dependencies using use-m -const { use } = eval( - await fetch('https://unpkg.com/use-m/use.js').then((r) => r.text()) -); +// Dynamically load dependencies using use-m, through the shared loader: an +// inline fetch here would die at module load with a bare `TypeError: fetch +// failed` when the CDN blinks (see js/scripts/use-m-loader.mjs). +const use = await loadUseM(); // Load required packages dynamically with specific versions const [yargs, yargsHelpers, archiver] = await Promise.all([ diff --git a/dev/log/issues/199/pulls/200/analysis/README.md b/dev/log/issues/199/pulls/200/analysis/README.md index 4201675..19a7a13 100644 --- a/dev/log/issues/199/pulls/200/analysis/README.md +++ b/dev/log/issues/199/pulls/200/analysis/README.md @@ -454,9 +454,9 @@ Three defects compound: status, stderr and `GITHUB_OUTPUT` contents, so the next occurrence is diagnosable from the CI log alone. * **The load itself had no deadline, no retry and no diagnostics.** Eleven - scripts in `js/scripts/` opened with the same inline statement, so the - hardening had to be applied in all of them, not only in the one the tests - spawn. Three failure modes follow from that shape: a network failure rejects + scripts in `js/scripts/` and the root-level `claude-profiles.mjs` opened with + the same inline statement, so the hardening had to be applied in all twelve, + not only in the one the tests spawn. Three failure modes follow from that shape: a network failure rejects with a bare `TypeError: fetch failed` thrown during module initialisation; a CDN *error page* is HTML, and eval-ing HTML raises `SyntaxError: Unexpected token '<'`, which points at this repository's code for a response it never @@ -469,8 +469,11 @@ Three defects compound: backoff (a CDN blip is transient by nature), `response.ok` checked before the eval, one `::debug::` line per attempt (off by default, per the verbose-mode requirement), and a final error naming the URL, the attempt count and the - cause. All eleven scripts call it; `js/tests/use-m-loader.test.mjs` pins the - behaviour and asserts that no script fetches use.js inline again. + cause. All twelve callers use it; `js/tests/use-m-loader.test.mjs` pins the + behaviour and scans every tracked `.mjs`/`.js`/`.cjs` file β€” excluding the + loader, the tests, the experiment and the archived copies, which quote the old + statement as the thing they are about β€” to assert that nothing fetches use.js + inline again. `experiments/publish-cdn-unreachable.mjs` reproduces it on demand by pointing the fetch at an unroutable TEST-NET-3 address (RFC 5737), instead of waiting for diff --git a/docs/CI-CD.md b/docs/CI-CD.md index a89a53c..aa39acd 100644 --- a/docs/CI-CD.md +++ b/docs/CI-CD.md @@ -106,8 +106,9 @@ still runs the three checks that read the whole tree. attempt, three attempts with exponential backoff, the HTTP status checked before the eval (an error page is HTML, and eval-ing HTML blames this repository for `Unexpected token '<'`), and a final error naming the URL, the - attempts and the cause. `js/tests/use-m-loader.test.mjs` asserts that no script - fetches use.js inline again. + attempts and the cause. Every caller uses it β€” the eleven release scripts and + the `claude-profiles.mjs` CLI β€” and `js/tests/use-m-loader.test.mjs` scans the + whole tree to assert that nothing fetches use.js inline again. - **Lint and format configuration lives at the repository root.** eslint and prettier treat the directory holding their config as the project base path; while these files lived in `js/`, root-level JavaScript was outside that path diff --git a/js/tests/use-m-loader.test.mjs b/js/tests/use-m-loader.test.mjs index dd7e79d..860b599 100644 --- a/js/tests/use-m-loader.test.mjs +++ b/js/tests/use-m-loader.test.mjs @@ -207,25 +207,53 @@ test('the defaults keep a stalled CDN inside a job timeout', () => { }); // The point of the shared loader is that the hardening applies everywhere. A -// script that fetches use.js inline gets none of it back. +// file that fetches use.js inline gets none of it back, so the whole tree is +// checked, not only js/scripts/. test('no script fetches use-m inline any more', () => { - const files = execFileSync('git', ['ls-files', 'js/scripts/*.mjs'], { + // Excluded on purpose: the loader itself, the tests and the experiment, which + // quote the old statement as the thing they are about, and the archived + // copies of other repositories' code under dev/log and docs/case-studies. + const isExcluded = (file) => + file === 'js/scripts/use-m-loader.mjs' || + file.startsWith('js/tests/') || + file.startsWith('experiments/') || + file.startsWith('dev/log/') || + file.startsWith('docs/case-studies/'); + + const files = execFileSync('git', ['ls-files', '*.mjs', '*.js', '*.cjs'], { cwd: repoRoot, encoding: 'utf8', }) .trim() .split('\n') .filter(Boolean) - .filter((file) => !file.endsWith('use-m-loader.mjs')); + .filter((file) => !isExcluded(file)); const offenders = files.filter((file) => readFileSync(join(repoRoot, file), 'utf8').includes('unpkg.com/use-m') ); expect(offenders).toEqual([]); - // And the scripts that need use-m go through the loader. +}); + +// Every script that needs use-m goes through the loader: eleven release +// scripts plus the profile CLI at the repository root. +test('the release scripts load use-m through the loader', () => { + const files = execFileSync('git', ['ls-files', 'js/scripts/*.mjs'], { + cwd: repoRoot, + encoding: 'utf8', + }) + .trim() + .split('\n') + .filter(Boolean) + .filter((file) => !file.endsWith('use-m-loader.mjs')); + const viaLoader = files.filter((file) => readFileSync(join(repoRoot, file), 'utf8').includes('loadUseM(') ); + expect(viaLoader.length).toBeGreaterThanOrEqual(11); + expect(readFileSync(join(repoRoot, 'claude-profiles.mjs'), 'utf8')).toContain( + 'loadUseM(' + ); });

M8{E=6T zyNQ`&Dqd}zK>Hqv(%b=AyE=2<#B~d+T)DS8gXK4Zq?p-Y3NfK~hVF4;LNZ$?XF+P` zuwDrBM?YjCy`&E*J~Lavge@*3PCey&(6+A9%<^vA09t? z`Q-VVlW$&r_vZNd-=Du6wZLEgI5FPXRm17!H&33uI(hkj&GC^}Cok}!BEB}L190G6 z^Sx7oo6wd*g}{ z91Za;z4qkPU7zo+J38_wm2tgdtGn;vqAG{ud^TKbNbNg_p-u*dj`&2&( zA)dL`Jojpmy5Y+5CAs2MW9;|XBEBAW2w?YSdzOqHp&x9?E697=qn>7gJhru~ez;-- z#TZZ6NQ0QvuQLW;vz|`R_~pUyjZnPi?5W&Okw@^@lP*%^q#CzQPz>K;a*!LiB<=SCgU0-rmR2G9sSaWge zeEw?vfe9a>i61>AN06}1eud9wsW-78<+)s1N2xuxlVXk+gGacoE%{~99I7~c?{@tp z@eBeGFlkhKO3w4RG2Yfa`O}$T4x_~HLU^2}X%+9qyJgmb=M6HNun7!vsPaoKi&BBRpqM?#^jZ7ZA?n z2|10+F`89UOeQv|J*IiuL}HJiy(x=6O$I0v@sVV(ZUv>#OFA8ep}bDI-L?2l7yE|-OYr4^6~xLMt8VuLN$AB% z@=dUkTbaTwfe?BLZWs;e-C4Ncd~i4L1@gdq)h4{HDZh>oi-Q?%7Tb1o}`xAkj8C;5ZTA# z$)g`mo<4v1?8iqZ&z^rjBICG%=*8bXhYCZ()V}_1Wm>BaxLZWKZBLwkh5Ay7VMZEx zmnzxPGWZdzM>EcEZ!tX^ct5~^BgUELeg}NJCeaTuco~LRRB?cW0>OMVzB|53D89wI zih~_jD@Zxn_1Aq60nN*zE+8cwwD)sg@TSxQH>bkYdmxx8%#dw9X|^{TT-G|k=dSGJ z3%1O$|3)cI$2NwE%2H)$M#Hg8Ig3LPCz2*gC6?PTOGc&5uwevuyK2~cdx)oGUWU&H zGzzJt5MO+Ykf|Rg^>7tS)Oq1nDNf6OFT*UrI8`N67QaEXCUg0BfK*+Z{oPK7W6ChFC@ z9JWiFx))I09bxM=5tq|Eaqc=C+L_{a0{`vXWwfoEZ#e26C8Puh(~Rl@q&S zXY1~wgaJWN!iogA04PgdJHP$9XTX<45+ny))wx{a17LrRdGuqZr~7}GiR&GK$ymp1 z{~80^&a?I+uGA_1Wf!sj=heAo_e4H%<%1g$Q1zMhUpDKjDK6>}F(1Ke?aK&~d>a|<#- zuy2fKJ#pdteBZFndg{g-ZdjECWU=bg5f zX5(TS-S<4{ce>qbV0V`Xc1tTx8>RwZ$fZCgoJGmN`Q;bK{p1|ax%u_i=ctfUD=f_0 zqKg=N;yE2{f_YS}d{-<%JT#%ESdQ}*ZnJ(r={fxj9IP}eVY(Rg_WSgFnu+`V9jvPH zq%54IEaKsyRewyso#>;pZCpCHXPkMsk~U{Nj;=H3=w#MLCm8G+&JWdTZjYSr{>1FD zJ-s!zfPDuVgWA*O%3Git4^7uE^n2$I=eOzkw3Acg)f4$wrmTm==j}t&T*BT;qA{K-u?W+`q3m|ba?~~i`bqj6{wiDZ!lNC93B5_ zcEeXy!+kmWcejY=d18_GL1Ir6VqUkn6UktR-~6L({2s6l_D$%YTGL5ERJ8=`f~0>ow^1*camqpH_11r zlzfwX+lkJe1;l);J|Ctn6(fsUtC3j`IwSBlwbHz&4)RExi3JP7dfIxJg&f70u6ual z%)GK*SeUh8aJ=<4A->Ne$Ax#9u5^mU#+-kVFIM2pC)Pd!knucoda-#Q0f=)+$$@+X z%on5-Yt}~qqC#iUYSf_vs)~BNDbK^B(j$E4$V~l?TEF5sIQwAi#+_mkVIIflQHI-6 zdP`&aRlka%>W+#I3#^z_7&pD%J$ecDHkjuTW_v7<)HIe0iwJIXk_N-@s<2@VEOI5( z11G5xM!Jf3(K$ZVM*uK(6NI+;vfVy!J71oI!(ncAQ|AQcwz+x&dIm40@hW+2#jJ6K zXQKF!eABy|^Y7QNJi7t7jtzixQ3z>n&jX`Z1iL69Ew^`7LNu^rQuv-)uY@qA%&{2)cvf|z+Uddc^laT(*a#~o1=o3V)(M-} zVDRenX~y171`ZaikNfpfr^{^k5)^zI{&-K|KV~Mkdpl+7Pv5os@ohVu42QP+1Awc% zMYC#KNLzUVouDhW&leh^Nj@|i;brEWbo2&*Hi?JDEp0I!wNvKz4kgpKn2jjSSidrNxrmb^*EW6+a}Em?iF*pkGGOBD#Z!BeOja4xu$s%6dM z;1-R@ZP>%LbM|mwzlJBH@wBYOSi_MyAC$Sc3+_(Fxb0xY5tH7+CZ0VrwwgmpsuN;9 ziRMt!qYd~GN}5=&gJ=#VG0)ARG>4Lc6W*}qP*Uo%>xa}FN-E#i&GOUF??3$fuKNxe z{q+ZE_ILjSZS>;{grrsgfzMP^s>x?ecube)9b^|yQKgH+JTYlJbj(~TbP5|Y_1rrp zx`Mlt^d`+drtT2KAl$2TvOf<(a^>T2H$0eMRnVwfX20#EVxkt@zFsx+~m`Po8vsbO|nTb!_Nlu#WW`xf(p5}Kn)1fGI=Ld6qAEdX#-0s z$07{7J*?dv5dl|>h&`UwEy}(PZUElEK5ZQB4=RZ+*)|28<|0R2e_=6pPXM3d1|Id% zKd>OdxbG>G6L#|?uVy89v8G)%PeSK(faib~?j+8sQvD#NER1KRx~MukvtnN8@{1NE zJnE@=jhpSQO1`Uou0VGGYQrds>!8-KoF*09+MM*QnBsw_$ZB(PnG-t@$=M?dahbl2 z(WgPM-Y9zlqpt!Nxaw+E`4&n>BnOoj(zF1$0ui24?_i6Sf+o{=de}1LNJdl1l)fA;{Esg zKg=~KY!LDdF{b=SAyd;~3oPm{j;vCKwJa|vr#~N5bif@qX1Elki*(2fZ;3Al#Rj(9tYZK6MadD@2ZQqZ^x|g zt1`JOb_ zDb>?RWB_NB`?eAp$#{YvMj|6|MS}xLWT1}AH_b|9B)W8z;Q$gDF~kmuRO`qwLYdrS z5lig6$?Vy&>4_?sYo#oHm149W1 z6JW#hL&;*G&OOnvEC!-N_=lCnfD!Nok7U6Dx!9OGyPmM3B4|v=d!El|u)C0#|6U=F z0sU3{)FvTsM0+t!26mMcWq!Yfj8|5?2`a?H$oa3F1naz_?XR;YIJ70ixn4L-Og4V= zojP|$VLzU&i0W@8v0{g@#f=S1PHY9JhlL)34T`7|7_VQw@4o!$#RqtK{kHq=r?(&8 zf{3bg6NprI;2f>VFnZK(;UgwdQg-#c?N(i%#6>sCkafWWl1ZqZ2u7 zv%Ykd$79F+r*raKbu|9Mp_eW3iwb_dY@Ia49QVb8v=3!AiLM)K#m}F00uy^ieY%{o zV98?GI66AjOmEhR0FLy0UQ8=t*|S16*|S*j=l?~|N}~4dSxg?*bhk>M2hHWisA%dk z2hG`=xU>{J(P}J!OD2`Iy$NLW>HmY+n?O9^2eUUhQB3iM?M)!+GkI8h6EGB&2e3DB zNza#!*_#r4G;a@kQ|-LKOYGS6Ioq(=h&5rIFvrBhU~W!w9qyIJB??_fAG^^@4f<%0 zYLP8W(7=jaNhD>DOwj3(9}PGR)2r5}$uJoMY^f8AeU*m5>c@7K*4+d?xuvTIW4p}8 zNz^WrQ4CGrVkAj#ftlp0u8d7Rv()E&(Lg;QpSJQ?O2+82`MSR$AaU!nF+%`YlOA8Q z(t^cixmUECqw9+`tW%}*hzy$4e+m;UKT*UKf_s7e+Bc99>`?11 zAmtfnhthvQ-CsHz)(}xe`C;{+!dgP)0QwIIdz>|;|9rx*4E*l;FW5QQM%uB-eP3*j z3*9IKx6pW$SaHauP+~=p=tj1z02NuZ^=q*#MWK&jS!gysg(yUDNvvG~Bopuh1&{h* znd+U_gNQ<;E_uVjqexVj@;;y_1PscgXkHW|VeQ8>Bnp{i3WIhI8XyTMo{vW-VdjMS z{e{)>i;AAETe}n(He)&-^m(BC2-+$jJ<2H+J<(Ub2nPhdx5DK`5*e~y-wS1rk%45P z^q3b62#6Kl^LsR=J-F5nLmCev7BbTBvmgvauTNzZ@~Gbwf7Qxc4!_Lu*abd|Wk#Q< z;TSUknz7yne3@rO@wRx8N7uLa}6S8+^znyS&3aXu~%bm#kfn~Va zPH0N{dsv*iK=_nyANH^{VTCo3u%*l|u9H$9gj$er%L1-9Nrruw_c@*hQhWeb-T;ie zc%XWr=S4h>y-0?b60JAjy=VaUd0|fuXw-{YzaI@K>4n0cbJmj7Cmu!z{S-$r$hp3Q zdFz!2t~(w$o`1k>+%59;*|`JqyX8AS{IzHoanukGR3G#;zj&W~0&)8X6%0TCcgDhB z&zeD#YE7YQP}`1sH&|PPlu*wX0n!Ue&*ePkZa_oj_GHL84STHD8yI7$Rer)sdG8$e zrL$vQR4nI(mBq5r7%N(t(pK>GB>lAcocWe5;I*)n1IGnd^NVVf_MOVa988A8`$llk z*9#uw=;PP_{yBjbExs#O8^ORYNC)CSJcnf-R40FMvBa7?h{JM{>x!54>p^qSb%X*K2sldST_f*ogw8awb-86GO@#QV+W@t*= zFvD61>Ct^wz3b`vI~I&vPc7h*2h}bS9l@V~jhw&D^H%6-;g~oSr`2lh3B+6Aof2P> zWuO^S+&4gjiJq1qrt{djB`vSzQ42^;31c;opbq*;gaj*8+9IvM0u(f173RDiG{oFH zQ_ZBGQ|yl@$*fS+dc==mQo7YXEF!X&MZ-$QDXn|Peli#glOBS>Pb|Q^fRUiCLDQnV zA6C6bz5US?r>rVXwjQkqJ%>=#sui)o7posBMVy!2Xw-LZaS6=^F92iHubY7(JR7E2 z1vJm1+bG!X`tbWkv@*L%GFK~RJxsU-9)_~k&4Q~~KU`K#IvY6UY2$iZ*@7iwtI^3U zPyQU-RqF60lJ~B^7TE4~j)MaTE-MUHf@o3Alzzb%@v+73Z zTvEdfl>0+64$ipRK{>b>9BQi}s4o=b59fyd_n)9`uMO-ZO`@zHyGb82VdFnx&i&j}WEH&8ZBi5i~NV1cTQ zD#b396_yZn-8PCx(RGe0LRt+=Ntvv}g2{kD1gm#jK}l8z)k{iUX+mpSVk0=gM5lt) zJ=q9c(c3uEmV}k$^rh6vZ#Kh4**LzMgn1tUncd?lT7_F|nA>5F1iLs%ryjqb&k9io(Vh{G(p>4xLPm`hd<;kH|HXCBS7!cx3e7bGdJ%KambN_Uu)aV5-bI8GvG=`c{)rd5qM_m^{9U?_7|fWq5~=r&<=eK@hIbus=kEpQW=Q^ZW85 zib>tqp6$v{>(;K#&!v~mOxTI*>V*e44M(w~7c#p=lqch|t3SYXumy21y#wshRjW6% zz3O(6N9`o-$9FBWn9%~O4h+B`8mLJ0{GRX2LE8*>SC96##=trZuBp}F4zhd{mYshT zI*<%sI{hTPN;CLTeiluT>*WW4v4Tq?C{S1ZNOwD+YW211hCy=I zy=TNzD=&gi1T8U4ZdU#l?X}h4!$j!b#CaMI*I!>x6|d&u$Bh@eFxXb!kbR8v?qm#2 zgbme&5#LR-wEHQ}vsL#OVG8r_Q``lEFw5^(-IB)ThDOlyyc?EfUaY@7pJXdyBU!uDbdWbpN{Vp$W@%*T!rmmJV>y z^XlBW4TqDsI6b;6wiNS-Ri!WfuhWY|V@9I}@TH``9 zGcND(1=p1HtC1(>EhfN1p`HyellA;N_~7DxWibvTjP9tOytvjN)vfT7=!Yrpi!#<% zaGfQ|G;DdD$DzJ&3I{5#8x6BUf544Sn7;Z@>F^$ns#|dCK{HM6Zl~9$O*egSF6vS9 z68yU|?1yF8VSXG+&+pT)*C#ThS})y|dFbK-6YAxT>v>WR2GJmtDh^a13n68b((Nbt zu6wlYg($CfKkiMgj1r#e<;O^G9B5%wylHgbu}1@9TAzkvv`5Oq!QT1!yM@I>J@(k9 ze`sWD8x74uFfYQ&viGb&g%aC)XWHy#E#C%_6IJVfCRb@Vbg#4Q#+{mFXasXBlaz8^ z>-m~BJiW}MeS2YJb_1f~b*)=oCxtN@&H5d#0Exf`)c1IuCj-*Kcxu!JNa(%#%{>WD zXk0QJH^LH3)cW(rF#w|lycpx5QM>MwoYyT~^zQZgGPTB1wASr?;D0i^237L$FnJ(u z^lZ=*Pgy-2V}$T+=fVH6_iW3J`@zW;glxQO&&nR$$lxMZf%lmXd(NRk&q&Y{l zr<{S#yDw{X@;gmTf$t!uZ!o zuX(ZXAiUa;Lf=#f+a^W9A!aGvB_9$!(6h1uHt7$V(fP)-(y@1AQ z>plZ->^>hUe*`J`%lt^;2GHRVR%W0W#PI+#472Kwm7>CQWoKuKi#fMMP1pE z*IP730eX3V--_aKTcFS!wjZ7C(7t&2;U2=H91Uo<{oG>u_Hm2a2hWGNd|13!vX!b6 zdZO6d;^WKLh=85Ph;g0gh+>`R7N)^q6tlR?#V zNdAT+&T*v~l@7jenN|Ky67ltrpVNwUN3Z=5B>k z{L+VH(9Q@wHCX7{a}^wsp;3)DJ-CTONNAZ6dbinvmP!ZfYfWosy$QQMWK?sQVSDg5 z;j)rElbyLrN`oXNT^CRFIxA6l`s0ry=AqegIUjmIN8RgU{q*>_Tw%j71jY-S*#*{RT!X9)o8&+#ZzdG*WaEx)f`<1p73dXy!K*Qb+lP0>usJ8AFGJU$16T9 z5-N_@xJO08c#S*8jtsnxj%m$s!P90s^pmLe9bjssZfvMvx*XzH{ZQ9Ci!fB$YR&s4 ztIgocbify_u6uyjjQYf*1^bG|p=wEsHO$2hO%h_wv3ZSp_<`3Q&0`LxFX7WZ)0fO5 z5k;bTWNU3eB-rvlTZHJ?OxjN2w`6H}F?Z}%ao^an+NA&Y7Y5m?v=X~-2UCyl+qq6W zScJc^>(9;8{4tp}wlmu`X>{istc zD+7e8B`1t4D;w)16Y>yZ2mdod?z9TnC#Yjqs}h}LedzUIx~N)5s0yW-oZUERx=^m6 zC8dE1s%xqAVPDdQu5d$d6VpCt?9Wj11=R-FX5R$h$C!1!`Duws&Tga@i<&kdaY;^{ zYpkL@Y)tGyB1sv+cbmne1;kn|HET+(G`(9dv-0W+?|?q1x3{a6eU7fFBOhwc=GpAiVKPDhKXq1#^t>ViCh>On8qCuRF@+by)ikMeMw0xa5 zn}^o9cMOtJUiP=dfps-&1Z$~SDVV;HVx=8QGN*R+E2Yk$U+GR%k>=?t)huwf!!*PE zR*z5haqUZdjh8z^#iz9g?kjkdbarL902R({HEpKL`R+ZYFG9{S09&CON9%QPK7bhKxiW8ye1l;x6ZCN#cG{mug1)!QA(d1-qbE^jP@`7ST5Q@ z%C{eVH0GgHXO6yX!PS_@%`o)?2b%1rDxQ4&dSgv?1F6v33*G9d#bIif(c0_7v|1(2 z-KyF7N-vt#ixc*)otIZD`!(wNFznyFy5n)!R{p4*dPYmFFokbmjl98Sd3H4q`I z1UmqU#R0wg2bgvfj*&m}!xR~D@)u`~4dagE_Bh?n@Zo7{tSL)0E{n#MrVfLrX(*W? z#CoNiCboVD=kJ%j(g*gPpR`OGVU+k&gec%GMVzeb5{AZ6q8=a5Y^i1ARIR0vRt-@e>XoE5aZJ@*i_Dbg zD)@L{bk*h9q&77CePeKcK);JybnY!W_ZFRdi_X18=iZ`oM@Hvzue=Y9FfuTqJsDz? zEJ$&*1};gJ+ObeyovTZmlPRaSOWS0jkoh2n$)@zI;jZuSvZctd&RIQQI_(zP@RF9I zwpIt}ggxe;+wSxpS!~~*Ivv_7J%YXcY4_wge7E> z)MhaK`Z&{(c5}gm(p0_1L14URfMDhoehQ76qOCT+eB7I{XhM+RNK}4F*m=~J@VN59uZrdwW@PG)SQj$u zi@XV>kAA6vYg@D09sqoqkesSIEsf%5 z34Pky(LXVnZ1vk!=313Xo;}BKd!UfgCJ&Hfz-i9tIclFNOS{G#9z*=qw;}TFDDso` z)Nqkz=L(gdJs+mOv;}T9eSCcW^a+KLYCZkKH?YSZt3=NK(yR6rxNn%i29HqSTL)^i zx3*M>z!i$y>%Y8cU_okbs{eknvuQxHN-HFF3*!c_R!=j3Skm*$dRnY)@YV7WRgLXK zSe*6$LQIKoagzHJfpKUU;mAQTh4HN0i;%7=b@pM2egGL8mc~n zYB0kMs{UXVBOVO(8tPQxX_0Q+#L0v9-ExukZLFU%P;7qyr15FCsb+Y3pw6n_B;L1F z!7jqa;+;-uJ#c7GZU|L@9Rlo$iw9qa${URSUTmtC&50u$Y6uRdr;Y!;U-AgE3rhzd z17&veP}NTX&~yDzEn(w)MOA#i;=0#C<)Rc{hMBVNpdj z@w)QAqiz_H9Md}tbS`0xn?I&O4po41JiF4C9;h&#VZX4-0(i=S3NYF!o(wn>wPO6kxkigSQX0bh+M@$8CdI^9tc;(6-v9~S!x6UrQfh$Ls;_Rc|DfzYT;-ia zf5e{M=ErWdc=ZK1Zz;jJb)?v+|}^xTzIxYK7}nD`b^X%AkU9 zCDnll+BAC5g|HN*be1Tgq>)Ye@njUGlxC$q>&ueos%C(vsp3TbzyYu?b5+Et`fej& zZzj!~N%LmXyqPp_Ce52k^Co-TWRIKd@pcm>9*3(GM+RTw#Wg)UrO?6GBoN}X1zyt+ z2_!0TWAK5 zm(S<(KF0Wi=}P|m^dq~%l->x&eJPoT*m}{Ph{eCSTZHIfAm6K-U59E>4Wzl@75hO{a8I zzu(mCH#Pgsd+4TRziHWTTK1ck{R0LLO+)x8r}DjfUu3;gtT0T_rMqq0wr$(CZQHi> zZriqP+qP|EzH=s%`IEV+tfcQc-JMEh^?F!ZV>`AGJfYL*jNrF%&blkxW54)g`nXcAHpeq# z651NL!VM{Us4wW~x6G31E9OZJ{mB>?+OtIf6jOyTpKy;!yv|%i_Lz_t-ZI)Vp)A{# zOQ3YLwctCIAC#wuNF7PSviP)03W=qzD%)?-ic-tdL$F|6cHOxsxC^45|%I?_vwLU(JoHwtf9$Y4mIf*Y<{ZZoYDJ}!7mi) zhZ5I8n?%i1-#;}#%?h!{p|TC&QA@Q>8<*4oo@zWe9V`SmQI#$3ZoTrIACZRk@T*2q zZ6S}$*2@2U;*F>8WS0XNbFKI|y>qD!>>2yGpPDE&o&5NE7l0eECC$F0CYJnM8;rfm z3WeVw*ZQA%2ae9|M56(>#&41C@!7Andw_U^nDAHdUnz!b_tlYP6>O##she zzGQPy)21b%z9x1V_S{VG%7yr`44oOGr2c{Juz3VqeJf%?D|7x+|e4!vKXMz+j4k2J!VW%LJO zFwg-;4+tp;YW&`U3y7ckZARpK8D}v-foLwFUw>6zH$04VJwr*3m{}O56ZLr`)=<{F zfJw36dO{>O2TmIFA-R)Fx{rTl++i9xJwTKK_L2x|u#QkdjeUS+aB2e)rnKkNOu}>- z=M<^llOyZG=|8L~T<10^ZsST7VG^QGvt-I0<38?^p+&d&t@EVE-&>~7rl)7`& z`Uao1;cU+hoY^Q43B658Hgn&Sq!K+UeGr-^XXR=eGxgd(e!*JL8w@A8L-^FF9TL;e zeR=~-y-)ajGWaq1p()oEtD6;?M6+CN)~ZJOqW4QtP&VUMf>{O(Qaob z)JCJ*c3+_VK2Q6fFURj3jo&32zjFkBr_lwso%nK}r6Tr8N-AhA6=s{PSn33#=7G;_ zuB30|qnm9O{Du>AKBEF(-WG6*a6}zy*^oj~}>Ag8)v<^CNdY%A^oS!l#Bg*ot9{C;9 zoLBA6bgft_sk6BnvDVCxAy|KjrIoURL=E}0x}9s~mX^YX9~-4mcveLLu_vS=r)<(w zpfpqQ4eu<>=+me}bnAjc2+LoBD9m?OX4oj1m*^O?DyNCXf*J%rhOWGXMU1hZwoHn) zmPLZiO0g+?Y*Y<;(g%T+ITwpeW9SXYcxT9}W4z-+Ik^5jb*NFoRCfcR7S0lujsQ=X z^S@+rlLBdKtaTrq%Km`ByNngHsq6~G`i?@v%7W_E+#IlylOt7n#J2-a40 z5OJ)7(8f&mAV)TcmMCxyv-yUF!s2ch6$z;z+wQ9;YWO8r9wp~Tnk_cyqe!aI*IGir z_vpvLZ6)ZJsZtUW;^lQcMK+Z4RO9R-?2_|XRx+-+3XO=!C3xll@^bq#;0(49x4LUn zn>eo(T4)S?|4b6*OA<^oK3P9)`%IJI&*zK1gTFna9mX60sDeMZ>$5oAlc&P>G)Wuu zj{&#LRsS6N2cjzZAYUZoeZ?A>!7HHey@etJDYqQi51sm9iMMTUa%wFziBx>RiZJOJ#!3w{Jse>>ZsnwR^uzi->e zCt?WTWK)iEAkn`54(^IPa$0WQ(y}P%-?xb@ZGZwLco08$tNVIXm68YUUpJ3T%EA*- zRU=27yJCc))@Tkrl-d0m!o_q{6U~9YXMAAj!#gw&d>WiF3l9xxxmuks5 z&seSoUJcAckzftoL81!0C@k4kM>n7 zbH8a5b;Mo(Kymrx9<_meylgggP4}k*b9nrQe+v1T`+cCFXZ?_t=6^A%OAJ50Ogl33 zGe$<}0eB7?HI7X{W-3LB!ISQqlMQDiJ08X%_dpI>U@((T{?7F00gXRQM1pPI}cH-8<9WCv*PrSj;1E3HGG)8)8w?4$Bm#Uj2LK=Y1pD`j znPy_Nlf}!-MC zb3WT|!-^P&>32iOUHK=V&Z8SEVIc4%u!d;5p9PvTvf`hZ+@4(@5HD;_&ack89}468 zK~gMVUnzJRL*twiw{v#`{^B{d>fJW730=Q(Ib@%){>}Ua$i0M%u&QWJ@_p6dH~1*u!I=9q<@uQ}&s{Cv3Gl~@_W^(K z!2Q4-JHJ112h82f-UalQl)N@Sl1qe{K(~GOd$C73}?O{;3?pntKMTu`I=*fHDAORg4(ikSS~`ft~eIY z^=rNQ0BV?>mF9iv{97Rrv`yB=0L@osqj7@&ZSkKC4KtuV+6eHhwtvz>sEw z$(-`2VoCxJQ@{iu5l{pS;s1($YcqgVtlISwQMJdzPn+5RY6wEAVscnh!JL@Oj4DoI zWC7vHvpS6nqAsx#Lmih!r)6bM&ipOVnXelfdG`CFfWNxES%Ez}eb*0LP=58d`y*$_ zJPkH`b9ej$-*<359seNvWq11nfFD>tnw((!uiu^=2C$;o{Jyvu^xM-%nJhl37BV1D zSqj$7SM<-V%7wXo8k5kt<+?Hzv^1YM4+X12b#I%!9x)Up}$Y}qL3V^IVlZL(j0v^WGY zYHq_RDe71*eUj4yP7Q}08@{&q|1KUX_{X!K!4jFS7W5e}rz-2|Gwsl`j!tYPgs}<% z8p%crRf}TJwwJFJHoaQYkmk=W|C}w~mwnpb`&@mMKTye|GGpGyp|Af2-R`u3nA_W& ze$@&X#iT3cdsm!QO$ev1{^@dU4jXTZ1tIEdv2yKXPWKL~e;E+K%)>56b^j>Q;L|yn0*2lBc$%`;GSgx|at2ex6Q$wBMiV z-Eg`AfHQl-`!+MpW=O8^dkR1(^6SpuLm&?VP^Le!n;;D`6+|UhKO>zjkNw%D%0L30zVe!#lH!qL*?R!CUox7u7s2Z!DkWO6Y4syVIAkB`4bK z#6#kkDkBS!tC3*XfN>D%Rqyv!+)t=<$vit>yWQ7u=KoY!ptIw-SgCX+L}MDbsAbqp z&8!t+RdYr!pE`f#Pqmoc#4_e2C_CG@t(4(B1a28;SWCd;3jJPB=Tgj> zcq)>KY$^9YL|ytRhIP&H-Yv4*ZT?5yH;B>s7Rbn7ma`2Fjs6&(Ni7LJwDt$h+b?o4*!vUz6v4@mI6K{c6L< z5-P<`@3zfshnSW-QTKICCmBz=Zm%RuNpxsEm?YzwXwgh9aG(B34O_m>AtLtpZ62qm z@tGoSn$Dp@?rT(S()C!DVXGQFi7|N5^)S`%d$r~JIji?<<*^)t=5fe>9axL^oJ$!X zxM35`^)khZL-AOC%lAcL_^jXM2jZ~&R_}^K{v%ku2Mk~(^iGQJ5Dj;ob#brCFure? z*{EUIgBYF-;zxsZWw|lX_M$}2spIcad2DH*^h^!=YA}eHBWNtL&SwHm`yyQuCPaym zB4kJz|3m08CpL^iJe*B!d)mT5|1(dak6G@duwcYUY97}-o%%pFL<7x+QJjnS@>_l? z%Ef>AEhkEMtwhjXW<5mKX8;tM1K1%fFycU#dt5ljKc@hjj;}_==)s5)7R! z>cxNgDZdl<<-hz=+>8J8TYf9*{fm0>wM1=uED4HPwWVz=w)N0By7MEu{5E&}4JB?= zpiUhsjZ5 ztT-Fq{}u05rbmZi)W*%-G(ThUjd?f3c#Xc98*hhI;v(1lld2orokrrrKEQW9bBlQlO@AA;m8|8ICwB~${+=Ynf85rl zXJ4l?)jBg29gLM3^Q^QL2I!8%SEk)%pOiBlU_a6SUpqDN1vyk-lVPL;y=p$Oa?@{~ za`k$&#$EwwF7<=O$MiJp!Uvyc_b2&HEvZ+7b`owP{$$3^&fau+gd#D(f(;58tx%in z(jfxyPe&IB%HQVFDno^O-FRuC=5clOLHM<9UqE@VnFsO*B0R8|ls`PAAvJ}mW)^_A zTHh~g6&9@c

}@k2CZ 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 D5?2hj literal 0 HcmV?d00001 diff --git a/dev/log/issues/199/pulls/200/ci-logs/run-33911660942.log.gz b/dev/log/issues/199/pulls/200/ci-logs/run-33911660942.log.gz new file mode 100644 index 0000000000000000000000000000000000000000..635f66e7105adbdab8b5d1a1ae0811adcd698441 GIT binary patch literal 104844 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 literal 0 HcmV?d00001 diff --git a/dev/log/issues/199/pulls/200/ci-logs/run-33911660947.log.gz b/dev/log/issues/199/pulls/200/ci-logs/run-33911660947.log.gz new file mode 100644 index 0000000000000000000000000000000000000000..09a5746230521d72812605d6b033f0d3d29dcdff GIT binary patch literal 224839 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