diff --git a/.cursor/rules/hunch.mdc b/.cursor/rules/hunch.mdc index c03ef9d..df06c1b 100644 --- a/.cursor/rules/hunch.mdc +++ b/.cursor/rules/hunch.mdc @@ -6,7 +6,7 @@ alwaysApply: true ## 🧠 Hunch (Engineering Memory) -This repo has **Hunch** — a curated graph of *why* the code is the way it is (decisions, bug history, invariants). It currently holds **123 decisions, 2 bugs, 9 constraints, 16 components, 3 policies**. +This repo has **Hunch** — a curated graph of *why* the code is the way it is (decisions, bug history, invariants). It currently holds **124 decisions, 2 bugs, 9 constraints, 16 components, 3 policies**. **Consult Hunch via the `hunch_*` MCP tools — pick by MOMENT, not from memory:** diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index e9c744e..8933d62 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -3,7 +3,7 @@ ## 🧠 Hunch (Engineering Memory) -This repo has **Hunch** — a curated graph of *why* the code is the way it is (decisions, bug history, invariants). It currently holds **123 decisions, 2 bugs, 9 constraints, 16 components, 3 policies**. +This repo has **Hunch** — a curated graph of *why* the code is the way it is (decisions, bug history, invariants). It currently holds **124 decisions, 2 bugs, 9 constraints, 16 components, 3 policies**. **Consult Hunch via the `hunch_*` MCP tools — pick by MOMENT, not from memory:** diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9293fb2..093f33f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -294,6 +294,7 @@ jobs: - uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 # v6.5.0 with: node-version: 24 + registry-url: https://registry.npmjs.org package-manager-cache: false # npm trusted publishing currently requires npm >=11.5.1 and Node >=22.14. @@ -326,7 +327,14 @@ jobs: const candidateDirectory = resolve("release-candidate"); const tarballPath = resolve(candidateDirectory, "package.tgz"); - for (const tokenName of ["NODE_AUTH_TOKEN", "NPM_TOKEN", "NPM_AUTH_TOKEN"]) { + // setup-node writes an npmrc that references NODE_AUTH_TOKEN and exports this + // documented fixed sentinel when no token was supplied. npm's OIDC client needs + // that registry configuration; only the exact non-secret sentinel is permitted. + const SETUP_NODE_SENTINEL = "XXXXX-XXXXX-XXXXX-XXXXX"; + if (process.env.NODE_AUTH_TOKEN && process.env.NODE_AUTH_TOKEN !== SETUP_NODE_SENTINEL) { + throw new Error("long-lived npm credential NODE_AUTH_TOKEN is forbidden"); + } + for (const tokenName of ["NPM_TOKEN", "NPM_AUTH_TOKEN"]) { if (process.env[tokenName]) throw new Error(`long-lived npm credential ${tokenName} is forbidden`); } const nonPublishingEnvironment = { ...process.env }; diff --git a/.github/workflows/vscode-open-vsx.yml b/.github/workflows/vscode-open-vsx.yml index 82b43b1..ca140c1 100644 --- a/.github/workflows/vscode-open-vsx.yml +++ b/.github/workflows/vscode-open-vsx.yml @@ -683,6 +683,7 @@ jobs: const NAME = "hunch-vscode"; const version = process.env.EXTENSION_VERSION; const expectedVsixSha256 = process.env.VSIX_SHA256; + const MAX_CONVERGENCE_ATTEMPTS = 36; if (process.env.EXTENSION_IDENTITY !== IDENTITY || !/^\d+\.\d+\.\d+$/.test(version ?? "") || !/^sha256:[0-9a-f]{64}$/.test(expectedVsixSha256 ?? "")) { throw new Error("refusing invalid extension identity, version, or VSIX digest"); @@ -827,7 +828,7 @@ jobs: const poll = async (label, check) => { let lastError = "exact version not visible"; - for (let attempt = 1; attempt <= 12; attempt += 1) { + for (let attempt = 1; attempt <= MAX_CONVERGENCE_ATTEMPTS; attempt += 1) { try { const state = await check(); if (state.verified) return { ...state, attempts: attempt }; @@ -835,7 +836,7 @@ jobs: } catch (error) { lastError = error instanceof Error ? error.message : String(error); } - if (attempt < 12) await pause(5_000); + if (attempt < MAX_CONVERGENCE_ATTEMPTS) await pause(5_000); } throw new Error(`${label} did not converge on ${IDENTITY}@${version}: ${lastError}`); }; diff --git a/.hunch/decisions/dec_4d8628df85.json b/.hunch/decisions/dec_4d8628df85.json new file mode 100644 index 0000000..151e38c --- /dev/null +++ b/.hunch/decisions/dec_4d8628df85.json @@ -0,0 +1,47 @@ +{ + "id": "dec_4d8628df85", + "title": "fix(release): restore npm OIDC registry binding", + "topic": null, + "status": "accepted", + "context": "Touched 4 file(s) across site/blog, test/vscode-open-vsx-workflow.test.ts, test/workflow-release-contract.test.ts, tooling/changelog-locales.mjs.", + "decision": "Changed code in site/blog, test/vscode-open-vsx-workflow.test.ts, test/workflow-release-contract.test.ts, tooling/changelog-locales.mjs (4 file(s)).", + "consequences": [], + "alternatives_rejected": [], + "rejected_tripwires": [], + "related_components": [ + "cmp_04c6efb58b", + "cmp_a94a8fe5cc", + "cmp_c099a42a55" + ], + "related_files": [ + "site/blog/posts.js", + "test/vscode-open-vsx-workflow.test.ts", + "test/workflow-release-contract.test.ts", + "tooling/changelog-locales.mjs" + ], + "supersedes": null, + "superseded_by": null, + "caused_by_bug": null, + "commit": "b797fbd", + "valid_from": "2026-07-23T14:25:17+03:00", + "valid_to": null, + "retired": { + "symbols": [], + "deps": [] + }, + "provenance": { + "source": "inferred", + "confidence": 0.3, + "evidence": [ + "commit:b797fbd", + "synth:provider=deterministic", + "branch:codex/npm-oidc-sentinel-v1.9.2", + "site/blog/posts.js", + "test/vscode-open-vsx-workflow.test.ts", + "test/workflow-release-contract.test.ts", + "tooling/changelog-locales.mjs" + ], + "last_verified": "2026-07-23T11:25:24.054Z" + }, + "date": "2026-07-23T14:25:17+03:00" +} diff --git a/.windsurf/rules/hunch.md b/.windsurf/rules/hunch.md index 723b762..927a5de 100644 --- a/.windsurf/rules/hunch.md +++ b/.windsurf/rules/hunch.md @@ -6,7 +6,7 @@ description: Hunch engineering memory — consult the hunch_* MCP tools before e ## 🧠 Hunch (Engineering Memory) -This repo has **Hunch** — a curated graph of *why* the code is the way it is (decisions, bug history, invariants). It currently holds **123 decisions, 2 bugs, 9 constraints, 16 components, 3 policies**. +This repo has **Hunch** — a curated graph of *why* the code is the way it is (decisions, bug history, invariants). It currently holds **124 decisions, 2 bugs, 9 constraints, 16 components, 3 policies**. **Consult Hunch via the `hunch_*` MCP tools — pick by MOMENT, not from memory:** diff --git a/AGENTS.md b/AGENTS.md index 8a84a3d..eda6f33 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -3,7 +3,7 @@ ## 🧠 Hunch (Engineering Memory) -This repo has **Hunch** — a curated graph of *why* the code is the way it is (decisions, bug history, invariants). It currently holds **123 decisions, 2 bugs, 9 constraints, 16 components, 3 policies**. +This repo has **Hunch** — a curated graph of *why* the code is the way it is (decisions, bug history, invariants). It currently holds **124 decisions, 2 bugs, 9 constraints, 16 components, 3 policies**. **Consult Hunch via the `hunch_*` MCP tools — pick by MOMENT, not from memory:** diff --git a/CLAUDE.md b/CLAUDE.md index fb3bd52..40d436c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -38,7 +38,7 @@ This repo's full engineering memory lives in a **private overlay**; a **curated ## 🧠 Hunch (Engineering Memory) -This repo has **Hunch** — a curated graph of *why* the code is the way it is (decisions, bug history, invariants). It currently holds **123 decisions, 2 bugs, 9 constraints, 16 components, 3 policies**. +This repo has **Hunch** — a curated graph of *why* the code is the way it is (decisions, bug history, invariants). It currently holds **124 decisions, 2 bugs, 9 constraints, 16 components, 3 policies**. **Consult Hunch via the `hunch_*` MCP tools — pick by MOMENT, not from memory:** diff --git a/README.md b/README.md index b892e51..944276f 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ strict enforcement. **Memory is the input. The product boundary is the receipt:** relevant evidence before an edit, then a deterministic check of the change against the rules your team has explicitly trusted. -> **New in v1.9.1:** Matrix mode gives the whole team one live, private Git memory across fresh +> **New in v1.9.2:** Matrix mode gives the whole team one live, private Git memory across fresh > clones, worktrees, CLI checks, and MCP assistants. npm publishes with short-lived OIDC > credentials, while the editor companion ships as one immutable, publicly verified Open VSX > artifact. @@ -82,7 +82,7 @@ Git repo that every teammate can access, install the Matrix release on team mach have one maintainer run: ```bash -npm i -g @davesheffer/hunch@1.9.1 +npm i -g @davesheffer/hunch@1.9.2 hunch shared --repo git@github.com:acme/project-hunch-memory.git git add .gitignore .hunch/team.json git commit -m "chore: connect shared Hunch memory" @@ -97,7 +97,7 @@ printed by Hunch. Omit `--migrate` for a new setup. After the pointer commit lands, teammates need Hunch installed and Git access to the memory repo: ```bash -npm i -g @davesheffer/hunch@1.9.1 +npm i -g @davesheffer/hunch@1.9.2 git pull hunch init hunch doctor diff --git a/docs/cookbook.md b/docs/cookbook.md index 0d665b2..02c0382 100644 --- a/docs/cookbook.md +++ b/docs/cookbook.md @@ -161,7 +161,7 @@ remote, and the URL committed into the code repository must not contain credenti On one maintainer machine: ```bash -npm i -g @davesheffer/hunch@1.9.1 +npm i -g @davesheffer/hunch@1.9.2 hunch shared --repo git@github.com:acme/project-hunch-memory.git git add .gitignore .hunch/team.json git commit -m "chore: connect shared Hunch memory" @@ -173,7 +173,7 @@ into the dedicated store. Review the reported untrack/ignore changes and follow Hunch prints. On every teammate machine: ```bash -npm i -g @davesheffer/hunch@1.9.1 +npm i -g @davesheffer/hunch@1.9.2 git pull hunch init hunch doctor @@ -271,10 +271,10 @@ Matrix memory home as the CLI; it never writes Hunch JSON directly. For a release audit, start with the exact tags and public registry metadata: ```bash -npm view @davesheffer/hunch@1.9.1 version dist.integrity dist.attestations --json -git tag --list v1.9.1 vscode-v0.17.3 +npm view @davesheffer/hunch@1.9.2 version dist.integrity dist.attestations --json +git tag --list v1.9.2 vscode-v0.17.3 ``` -**Observe:** npm reports `1.9.1`, an integrity digest, and provenance metadata. Open VSX reports +**Observe:** npm reports `1.9.2`, an integrity digest, and provenance metadata. Open VSX reports `0.17.3`. The GitHub Actions run for each tag shows a credential-free validation job followed by publication and public byte verification of the same content-addressed artifact. diff --git a/package-lock.json b/package-lock.json index 2e1584f..1d1dec6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@davesheffer/hunch", - "version": "1.9.1", + "version": "1.9.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@davesheffer/hunch", - "version": "1.9.1", + "version": "1.9.2", "license": "Apache-2.0", "dependencies": { "@modelcontextprotocol/sdk": "^1.29.0", diff --git a/package.json b/package.json index 5292d9a..64f39fb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@davesheffer/hunch", - "version": "1.9.1", + "version": "1.9.2", "license": "Apache-2.0", "author": "Dave Sheffer ", "description": "Engineering memory and a deterministic Change Gate for AI-assisted codebases: decisions, rejected approaches, constraints, and bug lineage become portable context and opt-in enforcement for every MCP assistant.", diff --git a/site/ar/changelog/index.html b/site/ar/changelog/index.html index cfd3c47..3057894 100644 --- a/site/ar/changelog/index.html +++ b/site/ar/changelog/index.html @@ -108,7 +108,8 @@

كل إصدار، منذ v0.1.

23 يوليو 2026
-
v1.9.1نشر موثوق عبر Open VSX وnpm
+
v1.9.2وصول OIDC الخاص بـnpm إلى السجل
+
v1.9.1نشر الإضافة عبر Open VSX فقط
22 يوليو 2026
diff --git a/site/blog/posts.js b/site/blog/posts.js index 485ecf6..c436a58 100644 --- a/site/blog/posts.js +++ b/site/blog/posts.js @@ -12,7 +12,7 @@ window.POSTS = [

Connect once; keep the graph live

A maintainer connects the codebase to a dedicated private Git repository with hunch shared --repo …. Hunch commits only a credential-free .hunch/team.json pointer to the code repo. Every teammate then runs hunch init; authentication remains in SSH or the normal Git credential helper.

-
npm i -g @davesheffer/hunch@1.9.1
+
npm i -g @davesheffer/hunch@1.9.2
 hunch shared --repo git@github.com:acme/project-hunch-memory.git
 git add .gitignore .hunch/team.json

CLI operations refresh the memory at startup, long-lived MCP servers refresh at request boundaries, and captures synchronize automatically. Concurrent structured records merge by identity. A failed push remains safe locally and is retried by the next capture or hunch shared --sync.

diff --git a/site/changelog.html b/site/changelog.html index 738ec79..9e591b4 100644 --- a/site/changelog.html +++ b/site/changelog.html @@ -107,7 +107,8 @@

Every release, since v0.1.

Jul 23, 2026
-
v1.9.1Reliable Open VSX and npm publishing — the editor companion now has one explicit public home: Open VSX. Its immutable release gate still validates one credential-free VSIX, publishes only those bytes, and verifies the public download digest. npm trusted publishing no longer receives setup-node's placeholder token, so the OIDC-only gate can reach publication without accepting a long-lived credential.
+
v1.9.2npm OIDC reaches the registry — trusted publishing keeps setup-node's required npm registry configuration, permits only its exact fixed non-secret sentinel, and still rejects every real long-lived npm credential. Open VSX verification also allows the public index a bounded three-minute visibility window. The immutable candidate, provenance, digest, and public-registry verification gates remain unchanged.
+
v1.9.1Open VSX-only editor publishing — the editor companion now has one explicit public home: Open VSX. Its immutable release gate validates one credential-free VSIX, publishes only those bytes, and verifies the public download digest. The accompanying npm hardening exposed setup-node's required sentinel as a follow-up release issue before npm publication.
Jul 22, 2026
diff --git a/site/changelog/index.html b/site/changelog/index.html index 738ec79..9e591b4 100644 --- a/site/changelog/index.html +++ b/site/changelog/index.html @@ -107,7 +107,8 @@

Every release, since v0.1.

Jul 23, 2026
-
v1.9.1Reliable Open VSX and npm publishing — the editor companion now has one explicit public home: Open VSX. Its immutable release gate still validates one credential-free VSIX, publishes only those bytes, and verifies the public download digest. npm trusted publishing no longer receives setup-node's placeholder token, so the OIDC-only gate can reach publication without accepting a long-lived credential.
+
v1.9.2npm OIDC reaches the registry — trusted publishing keeps setup-node's required npm registry configuration, permits only its exact fixed non-secret sentinel, and still rejects every real long-lived npm credential. Open VSX verification also allows the public index a bounded three-minute visibility window. The immutable candidate, provenance, digest, and public-registry verification gates remain unchanged.
+
v1.9.1Open VSX-only editor publishing — the editor companion now has one explicit public home: Open VSX. Its immutable release gate validates one credential-free VSIX, publishes only those bytes, and verifies the public download digest. The accompanying npm hardening exposed setup-node's required sentinel as a follow-up release issue before npm publication.
Jul 22, 2026
diff --git a/site/cookbook.html b/site/cookbook.html index 6ceaae9..b61ccf8 100644 --- a/site/cookbook.html +++ b/site/cookbook.html @@ -318,13 +318,13 @@

9 · Benchmark your own setup#

10 · Connect the team-memory Matrix#

Create a dedicated private Git repository for memory. It must differ from every code-repo remote, and its committed URL must not contain credentials. On one maintainer machine:

-
terminal
npm i -g @davesheffer/hunch@1.9.1
+      
terminal
npm i -g @davesheffer/hunch@1.9.2
 hunch shared --repo git@github.com:acme/project-hunch-memory.git
 git add .gitignore .hunch/team.json
 git commit -m "chore: connect shared Hunch memory"
 git push

Add --migrate only when moving existing public .hunch/ memory into the dedicated store. On every teammate machine:

-
terminal
npm i -g @davesheffer/hunch@1.9.1
+      
terminal
npm i -g @davesheffer/hunch@1.9.2
 git pull
 hunch init
 hunch doctor
@@ -376,9 +376,9 @@

13 · Use a local or self-hosted model

14 · Install the editor companion and verify a release#

Install Hunch from Open VSX, then open a repository initialized with the Hunch CLI. The extension reads the same public, private, or Matrix memory home and never writes Hunch JSON directly.

-
audit
npm view @davesheffer/hunch@1.9.1 version dist.integrity dist.attestations --json
-git tag --list v1.9.1 vscode-v0.17.3
-

Observe: npm reports version 1.9.1, an integrity digest, and provenance metadata; Open VSX reports 0.17.3. Each tag’s GitHub Actions run validates the exact content-addressed artifact before isolated publishing begins and verifies the same public bytes afterward.

+
audit
npm view @davesheffer/hunch@1.9.2 version dist.integrity dist.attestations --json
+git tag --list v1.9.2 vscode-v0.17.3
+

Observe: npm reports version 1.9.2, an integrity digest, and provenance metadata; Open VSX reports 0.17.3. Each tag’s GitHub Actions run validates the exact content-addressed artifact before isolated publishing begins and verifies the same public bytes afterward.

diff --git a/site/docs.html b/site/docs.html index 7af9dde..8c0c88a 100644 --- a/site/docs.html +++ b/site/docs.html @@ -722,13 +722,13 @@

Doctor & troubleshooting#

Working as a team — the Matrix v1.9#

Matrix mode gives a project one living engineering-memory spine across teammates, branches, worktrees, agents, and operating systems. The source of truth is a separate private Git repository you control; Hunch hosts nothing and never places credentials in the code repository.

Create that repository first, grant the team normal Git access, and have one maintainer connect it:

-
maintainer
npm i -g @davesheffer/hunch@1.9.1
+      
maintainer
npm i -g @davesheffer/hunch@1.9.2
 hunch shared --repo git@github.com:acme/project-hunch-memory.git
 git add .gitignore .hunch/team.json
 git commit -m "chore: connect shared Hunch memory"
 git push

Use a credential-free HTTPS or SSH URL and leave authentication in SSH or the Git credential helper. Add --migrate only when moving existing public .hunch/ records into the dedicated store.

-

After the pointer commit lands, each teammate installs v1.9.1, pulls, and runs hunch init. Hunch validates .hunch/team.json, creates an ignored .hunch-private/ clone, and merges the local path and preferences into ignored .hunch/local.json. An unparseable local config is never overwritten.

+

After the pointer commit lands, each teammate installs v1.9.2, pulls, and runs hunch init. Hunch validates .hunch/team.json, creates an ignored .hunch-private/ clone, and merges the local path and preferences into ignored .hunch/local.json. An unparseable local config is never overwritten.

Always pumping. CLI operations attempt a bounded pull at startup; long-lived MCP servers refresh at tool-request boundaries. Captures commit and synchronize the memory-only repository by default, concurrent JSON records merge by identity, and a failed push stays local for hunch shared --sync to retry.

Authority stays fail-closed. Captures become advisory memory immediately. Blocking policy authority still requires an explicit audited human action, and public receipts should use --public-only so the shared graph never appears on a public surface.

Pause or roll back without deleting memory

@@ -749,8 +749,8 @@

Maintenance#

Release integrity#

Hunch tests release artifacts before publication credentials are available. The immutable npm tarball and VSIX are then passed to isolated publishers, which verify the public registries converged on the expected version. npm publishes with GitHub Actions provenance; one tested VSIX goes unchanged to Open VSX and is downloaded again for byte verification.

-
audit
npm view @davesheffer/hunch@1.9.1 version dist.integrity dist.attestations --json
-git tag --list v1.9.1 vscode-v0.17.3
+
audit
npm view @davesheffer/hunch@1.9.2 version dist.integrity dist.attestations --json
+git tag --list v1.9.2 vscode-v0.17.3

Inspect GitHub Actions, npm, and Open VSX for the public receipts.

diff --git a/site/es/changelog/index.html b/site/es/changelog/index.html index f3e5511..6197953 100644 --- a/site/es/changelog/index.html +++ b/site/es/changelog/index.html @@ -108,7 +108,8 @@

Cada versión, desde v0.1.

23 de julio de 2026
-
v1.9.1Publicación fiable mediante Open VSX y npm
+
v1.9.2OIDC de npm llega al registro
+
v1.9.1Publicación de la extensión solo mediante Open VSX
22 de julio de 2026
diff --git a/site/he/changelog/index.html b/site/he/changelog/index.html index 02854a4..d81976e 100644 --- a/site/he/changelog/index.html +++ b/site/he/changelog/index.html @@ -108,7 +108,8 @@

כל גרסה, מאז v0.1.

23 ביולי 2026
-
v1.9.1פרסום אמין דרך Open VSX ו-npm
+
v1.9.2OIDC של npm מגיע לרישום
+
v1.9.1פרסום תוסף דרך Open VSX בלבד
22 ביולי 2026
diff --git a/site/ru/changelog/index.html b/site/ru/changelog/index.html index bd1cbeb..7ab630c 100644 --- a/site/ru/changelog/index.html +++ b/site/ru/changelog/index.html @@ -108,7 +108,8 @@

Все выпуски, начиная с v0.1.

23 июля 2026 г.
-
v1.9.1Надёжная публикация через Open VSX и npm
+
v1.9.2npm OIDC достигает реестра
+
v1.9.1Публикация расширения только через Open VSX
22 июля 2026 г.
diff --git a/test/vscode-open-vsx-workflow.test.ts b/test/vscode-open-vsx-workflow.test.ts index 14bce0b..0f664d1 100644 --- a/test/vscode-open-vsx-workflow.test.ts +++ b/test/vscode-open-vsx-workflow.test.ts @@ -169,6 +169,7 @@ function contractErrors(source: string): string[] { if (!/open-vsx\.org\/api\/\$\{PUBLISHER\}\/\$\{NAME\}\/\$\{version\}/.test(publish) || !/poll\("Open VSX", checkOpenVsx\)/.test(publish) + || !/const MAX_CONVERGENCE_ATTEMPTS = 36/.test(publish) || !/!openVsx\.verified \|\| openVsx\.identity !== IDENTITY/.test(publish) || !/openVsx\.version !== version \|\| openVsx\.asset_sha256 !== expectedVsixSha256/.test(publish) || (source.match(/const verifyRegistryAsset = async/g) ?? []).length !== 2 diff --git a/test/workflow-release-contract.test.ts b/test/workflow-release-contract.test.ts index 528edbe..d6dac99 100644 --- a/test/workflow-release-contract.test.ts +++ b/test/workflow-release-contract.test.ts @@ -189,8 +189,12 @@ test("npm publication isolates OIDC from repository code and publishes only vali assert.match(validate, /actions\/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02/); assert.match(publish, /actions\/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093/); assert.match(publish, /actions\/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38/); - assert.doesNotMatch(publish, /registry-url:/, - "the OIDC publish job must not let setup-node inject a placeholder NODE_AUTH_TOKEN"); + assert.match(publish, /registry-url: https:\/\/registry\.npmjs\.org/, + "trusted publishing needs setup-node's npm registry configuration"); + assert.match(publish, /const SETUP_NODE_SENTINEL = "XXXXX-XXXXX-XXXXX-XXXXX"/, + "the workflow names setup-node's fixed non-secret sentinel explicitly"); + assert.match(publish, /process\.env\.NODE_AUTH_TOKEN !== SETUP_NODE_SENTINEL/, + "only setup-node's exact sentinel may occupy NODE_AUTH_TOKEN"); assert.match(publish, /actions\/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02/); assert.match(publish, /candidate version .* is not newer than current .* dist-tag/, diff --git a/tooling/changelog-locales.mjs b/tooling/changelog-locales.mjs index 41311ba..786a250 100644 --- a/tooling/changelog-locales.mjs +++ b/tooling/changelog-locales.mjs @@ -8,7 +8,7 @@ export const changelogLocales = { footer: "© Hunch — התאמה ארכיטקטונית לקוד AI.", home: "בית", githubReleases: "גרסאות ב-GitHub" }, titles: [ - "פרסום אמין דרך Open VSX ו-npm", "זיכרון הנדסי חי אחד לכל הצוות", "פרסום npm שלא פג תוקף", "CI מחמיר שנשאר זמין", "ניסויים שעברו בדיקת סוקרים וגבול שוק ברור יותר", + "OIDC של npm מגיע לרישום", "פרסום תוסף דרך Open VSX בלבד", "זיכרון הנדסי חי אחד לכל הצוות", "פרסום npm שלא פג תוקף", "CI מחמיר שנשאר זמין", "ניסויים שעברו בדיקת סוקרים וגבול שוק ברור יותר", "מסלול קצר יותר מהתקנה לזיכרון שימושי", "תמיכה ב-Python", "זיכרון שפועל בעצמו", "בחירת מנוי בלי להינעל לספק", "צינור האימות — המסירה נאכפת, לא רק מקווים לה", "היכרות ראשונה ידידותית יותר", "אחזור שעוקב אחרי הגרף, לא רק מילות מפתח", "ה-wiki יודעת מה קורה ומה הלאה", "לולאת סוכן שקטה ומדויקת יותר", "ה-wiki מאמצת את התיעוד — עם שער drift", "תשתית אמינה ושקופה", "hunch structure — המבנה לפני grep", "תוסף Claude Code והמאגר מדגים את עצמו", "AGENTS.md כמשטח drift", "hunch impact + hunch path — רואים את ההשפעה והמסלול", "1.0 — אינדקס בלי תלויות native", @@ -28,7 +28,7 @@ export const changelogLocales = { footer: "© Hunch — архитектурное соответствие для ИИ-кода.", home: "Главная", githubReleases: "Релизы на GitHub" }, titles: [ - "Надёжная публикация через Open VSX и npm", "Единая живая инженерная память для всей команды", "Публикация npm без истекающих учётных данных", "Строгий CI, который остаётся доступным", "Эксперименты с независимой оценкой и более ясная граница рынка", + "npm OIDC достигает реестра", "Публикация расширения только через Open VSX", "Единая живая инженерная память для всей команды", "Публикация npm без истекающих учётных данных", "Строгий CI, который остаётся доступным", "Эксперименты с независимой оценкой и более ясная граница рынка", "Более короткий путь от установки к полезной памяти", "Поддержка Python", "Память, которая работает сама", "Выбор подписки без привязки к поставщику", "Конвейер проверки — доставка гарантирована", "Более дружелюбное первое знакомство", "Поиск следует графу, а не только ключевым словам", "Wiki знает, что происходит и что дальше", "Более тихий и точный цикл агента", "Wiki принимает ваши документы под контроль дрейфа", "Честная и надёжная инфраструктура", "hunch structure — структура до grep", "Плагин Claude Code и самодемонстрирующийся репозиторий", "AGENTS.md как поверхность дрейфа", "hunch impact + hunch path — влияние и путь", "1.0 — индекс без нативных зависимостей", @@ -48,7 +48,7 @@ export const changelogLocales = { footer: "© Hunch — التوافق المعماري لكود الذكاء الاصطناعي.", home: "الرئيسية", githubReleases: "الإصدارات على GitHub" }, titles: [ - "نشر موثوق عبر Open VSX وnpm", "ذاكرة هندسية حية واحدة للفريق كله", "نشر npm بلا بيانات اعتماد منتهية الصلاحية", "تكامل مستمر صارم يبقى متاحًا", "تجارب مؤهلة بالمراجعة وحدود سوق أوضح", + "وصول OIDC الخاص بـnpm إلى السجل", "نشر الإضافة عبر Open VSX فقط", "ذاكرة هندسية حية واحدة للفريق كله", "نشر npm بلا بيانات اعتماد منتهية الصلاحية", "تكامل مستمر صارم يبقى متاحًا", "تجارب مؤهلة بالمراجعة وحدود سوق أوضح", "طريق أقصر من التثبيت إلى ذاكرة مفيدة", "دعم Python", "ذاكرة تعمل بنفسها", "اختيار الاشتراك من دون ارتهان لمزوّد", "مسار التحقق — تسليم مضمون لا مجرد أمل", "ترحيب أول أكثر وضوحاً", "استرجاع يتبع الرسم البياني لا الكلمات فقط", "الـwiki تعرف ما يحدث وما التالي", "حلقة وكيل أهدأ وأكثر دقة", "الـwiki تتولى توثيقك تحت بوابة الانحراف", "بنية تحتية صادقة وموثوقة", "hunch structure — البنية قبل grep", "إضافة Claude Code والمستودع يشرح نفسه", "AGENTS.md كسطح للانحراف", "hunch impact + hunch path — الأثر والمسار", "1.0 — فهرس بلا تبعيات native", @@ -68,7 +68,7 @@ export const changelogLocales = { footer: "© Hunch — conformidad arquitectónica para código de IA.", home: "Inicio", githubReleases: "Versiones en GitHub" }, titles: [ - "Publicación fiable mediante Open VSX y npm", "Una memoria de ingeniería viva para todo el equipo", "Publicación en npm sin credenciales que caduquen", "CI estricto que permanece disponible", "Experimentos validados por revisores y un límite de mercado más claro", + "OIDC de npm llega al registro", "Publicación de la extensión solo mediante Open VSX", "Una memoria de ingeniería viva para todo el equipo", "Publicación en npm sin credenciales que caduquen", "CI estricto que permanece disponible", "Experimentos validados por revisores y un límite de mercado más claro", "Un camino más corto desde la instalación hasta una memoria útil", "Compatibilidad con Python", "Memoria que funciona sola", "Elegir suscripción sin quedar atado a un proveedor", "La canalización de verificación: entrega garantizada", "Una primera bienvenida más amable", "La recuperación sigue el grafo, no solo las palabras", "La wiki sabe qué ocurre y qué viene después", "Un ciclo de agente más silencioso y preciso", "La wiki adopta tus documentos bajo una barrera de deriva", "Infraestructura honesta y fiable", "hunch structure: la estructura antes de grep", "Plugin de Claude Code y un repositorio que se demuestra a sí mismo", "AGENTS.md como superficie de deriva", "hunch impact + hunch path: impacto y recorrido", "1.0: índice sin dependencias nativas",