Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -493,7 +493,7 @@ jobs:
throw new Error(`exact Sigstore bundle verification failed: ${`${verified.stderr}\n${verified.stdout}`.trim()}`);
}
const result = parseJson(verified.stdout, "exact Sigstore bundle verification");
if (!/^\\d+\\.\\d+\\.\\d+/.test(result.sigstore_version ?? "")) {
if (!/^\d+\.\d+\.\d+/.test(result.sigstore_version ?? "")) {
throw new Error("exact Sigstore bundle verification did not identify its verifier");
}
return result;
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.2:** Matrix mode gives the whole team one live, private Git memory across fresh
> **New in v1.9.3:** 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.
Expand Down Expand Up @@ -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.2
npm i -g @davesheffer/hunch@1.9.3
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"
Expand All @@ -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.2
npm i -g @davesheffer/hunch@1.9.3
git pull
hunch init
hunch doctor
Expand Down
10 changes: 5 additions & 5 deletions docs/cookbook.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.2
npm i -g @davesheffer/hunch@1.9.3
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"
Expand All @@ -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.2
npm i -g @davesheffer/hunch@1.9.3
git pull
hunch init
hunch doctor
Expand Down Expand Up @@ -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.2 version dist.integrity dist.attestations --json
git tag --list v1.9.2 vscode-v0.17.3
npm view @davesheffer/hunch@1.9.3 version dist.integrity dist.attestations --json
git tag --list v1.9.3 vscode-v0.17.3
```

**Observe:** npm reports `1.9.2`, an integrity digest, and provenance metadata. Open VSX reports
**Observe:** npm reports `1.9.3`, 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.
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@davesheffer/hunch",
"version": "1.9.2",
"version": "1.9.3",
"license": "Apache-2.0",
"author": "Dave Sheffer <dave.sheffer1@gmail.com>",
"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.",
Expand Down
1 change: 1 addition & 0 deletions site/ar/changelog/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ <h1>كل إصدار، منذ <em>v0.1</em>.</h1>
<div class="clog">
<div class="clog-group">
<div class="clog-date">23 يوليو 2026</div>
<div class="clog-row"><span class="rel-tag">v1.9.3</span><span class="clog-t"><b>إيصالات إصدار npm موثّقة</b></span></div>
<div class="clog-row"><span class="rel-tag">v1.9.2</span><span class="clog-t"><b>وصول OIDC الخاص بـnpm إلى السجل</b></span></div>
<div class="clog-row"><span class="rel-tag">v1.9.1</span><span class="clog-t"><b>نشر الإضافة عبر Open VSX فقط</b></span></div>
</div>
Expand Down
2 changes: 1 addition & 1 deletion site/blog/posts.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions site/changelog.html
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ <h1>Every release, since <em>v0.1</em>.</h1>
<div class="clog">
<div class="clog-group">
<div class="clog-date">Jul 23, 2026</div>
<div class="clog-row"><span class="rel-tag">v1.9.3</span><span class="clog-t"><b>Verified npm release receipts</b> — fixes the executable semantic-version guard used after successful Sigstore bundle verification, so the immutable npm release closes with a content-addressed publication receipt instead of rejecting its own verifier metadata.</span></div>
<div class="clog-row"><span class="rel-tag">v1.9.2</span><span class="clog-t"><b>npm OIDC reaches the registry</b> — 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.</span></div>
<div class="clog-row"><span class="rel-tag">v1.9.1</span><span class="clog-t"><b>Open VSX-only editor publishing</b> — 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.</span></div>
</div>
Expand Down
1 change: 1 addition & 0 deletions site/changelog/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ <h1>Every release, since <em>v0.1</em>.</h1>
<div class="clog">
<div class="clog-group">
<div class="clog-date">Jul 23, 2026</div>
<div class="clog-row"><span class="rel-tag">v1.9.3</span><span class="clog-t"><b>Verified npm release receipts</b> — fixes the executable semantic-version guard used after successful Sigstore bundle verification, so the immutable npm release closes with a content-addressed publication receipt instead of rejecting its own verifier metadata.</span></div>
<div class="clog-row"><span class="rel-tag">v1.9.2</span><span class="clog-t"><b>npm OIDC reaches the registry</b> — 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.</span></div>
<div class="clog-row"><span class="rel-tag">v1.9.1</span><span class="clog-t"><b>Open VSX-only editor publishing</b> — 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.</span></div>
</div>
Expand Down
10 changes: 5 additions & 5 deletions site/cookbook.html
Original file line number Diff line number Diff line change
Expand Up @@ -318,13 +318,13 @@ <h2>9 · Benchmark your own setup<a class="anchor" href="#bench">#</a></h2>
<section id="matrix">
<h2>10 · Connect the team-memory Matrix<a class="anchor" href="#matrix">#</a></h2>
<p>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:</p>
<div class="code" data-lang="bash"><div class="code-head"><span class="lbl">terminal</span><button class="copy">Copy</button></div><pre><span class="k">npm</span> i -g @davesheffer/hunch@1.9.2
<div class="code" data-lang="bash"><div class="code-head"><span class="lbl">terminal</span><button class="copy">Copy</button></div><pre><span class="k">npm</span> i -g @davesheffer/hunch@1.9.3
<span class="k">hunch</span> shared --repo git@github.com:acme/project-hunch-memory.git
<span class="k">git</span> add .gitignore .hunch/team.json
<span class="k">git</span> commit -m "chore: connect shared Hunch memory"
<span class="k">git</span> push</pre></div>
<p>Add <code>--migrate</code> only when moving existing public <code>.hunch/</code> memory into the dedicated store. On every teammate machine:</p>
<div class="code" data-lang="bash"><div class="code-head"><span class="lbl">terminal</span><button class="copy">Copy</button></div><pre><span class="k">npm</span> i -g @davesheffer/hunch@1.9.2
<div class="code" data-lang="bash"><div class="code-head"><span class="lbl">terminal</span><button class="copy">Copy</button></div><pre><span class="k">npm</span> i -g @davesheffer/hunch@1.9.3
<span class="k">git</span> pull
<span class="k">hunch</span> init
<span class="k">hunch</span> doctor</pre></div>
Expand Down Expand Up @@ -376,9 +376,9 @@ <h2>13 · Use a local or self-hosted model<a class="anchor" href="#local-models"
<section id="editor-release">
<h2>14 · Install the editor companion and verify a release<a class="anchor" href="#editor-release">#</a></h2>
<p>Install Hunch from <a class="link" href="https://open-vsx.org/extension/davesheffer/hunch-vscode" target="_blank" rel="noopener">Open VSX</a>, 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.</p>
<div class="code" data-lang="bash"><div class="code-head"><span class="lbl">audit</span><button class="copy">Copy</button></div><pre><span class="k">npm</span> view @davesheffer/hunch@1.9.2 version dist.integrity dist.attestations --json
<span class="k">git</span> tag --list v1.9.2 vscode-v0.17.3</pre></div>
<p><b>Observe:</b> 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.</p>
<div class="code" data-lang="bash"><div class="code-head"><span class="lbl">audit</span><button class="copy">Copy</button></div><pre><span class="k">npm</span> view @davesheffer/hunch@1.9.3 version dist.integrity dist.attestations --json
<span class="k">git</span> tag --list v1.9.3 vscode-v0.17.3</pre></div>
<p><b>Observe:</b> npm reports version 1.9.3, 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.</p>
</section>
</main>

Expand Down
8 changes: 4 additions & 4 deletions site/docs.html
Original file line number Diff line number Diff line change
Expand Up @@ -722,13 +722,13 @@ <h2>Doctor &amp; troubleshooting<a class="anchor" href="#doctor">#</a></h2>
<h2>Working as a team — the Matrix <span class="pill ok">v1.9</span><a class="anchor" href="#team">#</a></h2>
<p>Matrix mode gives a project one living engineering-memory spine across teammates, branches, worktrees, agents, and operating systems. The source of truth is a <strong>separate private Git repository you control</strong>; Hunch hosts nothing and never places credentials in the code repository.</p>
<p>Create that repository first, grant the team normal Git access, and have one maintainer connect it:</p>
<div class="code" data-lang="bash"><div class="code-head"><span class="lbl">maintainer</span><button class="copy">Copy</button></div><pre><span class="k">npm</span> i -g @davesheffer/hunch@1.9.2
<div class="code" data-lang="bash"><div class="code-head"><span class="lbl">maintainer</span><button class="copy">Copy</button></div><pre><span class="k">npm</span> i -g @davesheffer/hunch@1.9.3
<span class="k">hunch</span> shared --repo git@github.com:acme/project-hunch-memory.git
<span class="k">git</span> add .gitignore .hunch/team.json
<span class="k">git</span> commit -m "chore: connect shared Hunch memory"
<span class="k">git</span> push</pre></div>
<p>Use a credential-free HTTPS or SSH URL and leave authentication in SSH or the Git credential helper. Add <code>--migrate</code> only when moving existing public <code>.hunch/</code> records into the dedicated store.</p>
<p>After the pointer commit lands, each teammate installs v1.9.2, pulls, and runs <code>hunch init</code>. Hunch validates <code>.hunch/team.json</code>, creates an ignored <code>.hunch-private/</code> clone, and merges the local path and preferences into ignored <code>.hunch/local.json</code>. An unparseable local config is never overwritten.</p>
<p>After the pointer commit lands, each teammate installs v1.9.3, pulls, and runs <code>hunch init</code>. Hunch validates <code>.hunch/team.json</code>, creates an ignored <code>.hunch-private/</code> clone, and merges the local path and preferences into ignored <code>.hunch/local.json</code>. An unparseable local config is never overwritten.</p>
<p><strong>Always pumping.</strong> 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 <code>hunch shared --sync</code> to retry.</p>
<p><strong>Authority stays fail-closed.</strong> Captures become advisory memory immediately. Blocking policy authority still requires an explicit audited human action, and public receipts should use <code>--public-only</code> so the shared graph never appears on a public surface.</p>
<h3>Pause or roll back without deleting memory</h3>
Expand All @@ -749,8 +749,8 @@ <h2>Maintenance<a class="anchor" href="#maintenance">#</a></h2>
<section id="release-integrity">
<h2>Release integrity<a class="anchor" href="#release-integrity">#</a></h2>
<p>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.</p>
<div class="code" data-lang="bash"><div class="code-head"><span class="lbl">audit</span><button class="copy">Copy</button></div><pre><span class="k">npm</span> view @davesheffer/hunch@1.9.2 version dist.integrity dist.attestations --json
<span class="k">git</span> tag --list v1.9.2 vscode-v0.17.3</pre></div>
<div class="code" data-lang="bash"><div class="code-head"><span class="lbl">audit</span><button class="copy">Copy</button></div><pre><span class="k">npm</span> view @davesheffer/hunch@1.9.3 version dist.integrity dist.attestations --json
<span class="k">git</span> tag --list v1.9.3 vscode-v0.17.3</pre></div>
<p>Inspect <a class="link" href="https://github.com/davesheffer/hunch/actions" target="_blank" rel="noopener">GitHub Actions</a>, <a class="link" href="https://www.npmjs.com/package/@davesheffer/hunch" target="_blank" rel="noopener">npm</a>, and <a class="link" href="https://open-vsx.org/extension/davesheffer/hunch-vscode" target="_blank" rel="noopener">Open VSX</a> for the public receipts.</p>
</section>

Expand Down
1 change: 1 addition & 0 deletions site/es/changelog/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ <h1>Cada versión, desde <em>v0.1</em>.</h1>
<div class="clog">
<div class="clog-group">
<div class="clog-date">23 de julio de 2026</div>
<div class="clog-row"><span class="rel-tag">v1.9.3</span><span class="clog-t"><b>Recibos de publicación npm verificados</b></span></div>
<div class="clog-row"><span class="rel-tag">v1.9.2</span><span class="clog-t"><b>OIDC de npm llega al registro</b></span></div>
<div class="clog-row"><span class="rel-tag">v1.9.1</span><span class="clog-t"><b>Publicación de la extensión solo mediante Open VSX</b></span></div>
</div>
Expand Down
1 change: 1 addition & 0 deletions site/he/changelog/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ <h1>כל גרסה, מאז <em>v0.1</em>.</h1>
<div class="clog">
<div class="clog-group">
<div class="clog-date">23 ביולי 2026</div>
<div class="clog-row"><span class="rel-tag">v1.9.3</span><span class="clog-t"><b>קבלות מהדורת npm מאומתות</b></span></div>
<div class="clog-row"><span class="rel-tag">v1.9.2</span><span class="clog-t"><b>OIDC של npm מגיע לרישום</b></span></div>
<div class="clog-row"><span class="rel-tag">v1.9.1</span><span class="clog-t"><b>פרסום תוסף דרך Open VSX בלבד</b></span></div>
</div>
Expand Down
1 change: 1 addition & 0 deletions site/ru/changelog/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ <h1>Все выпуски, начиная с <em>v0.1</em>.</h1>
<div class="clog">
<div class="clog-group">
<div class="clog-date">23 июля 2026 г.</div>
<div class="clog-row"><span class="rel-tag">v1.9.3</span><span class="clog-t"><b>Проверенные квитанции выпуска npm</b></span></div>
<div class="clog-row"><span class="rel-tag">v1.9.2</span><span class="clog-t"><b>npm OIDC достигает реестра</b></span></div>
<div class="clog-row"><span class="rel-tag">v1.9.1</span><span class="clog-t"><b>Публикация расширения только через Open VSX</b></span></div>
</div>
Expand Down
4 changes: 4 additions & 0 deletions test/workflow-release-contract.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,10 @@ test("npm publication isolates OIDC from repository code and publishes only vali
assert.match(publish, /cryptographic_attestation_verified/);
assert.match(publish, /raw_and_cryptographic_bundle_match/);
assert.match(publish, /cryptographic_attestation_bundle_sha256/);
const sigstoreVersionGuard = /if \(!\/\^(.+?)\/\.test\(result\.sigstore_version/.exec(publish)?.[1];
assert.ok(sigstoreVersionGuard, "the Sigstore verifier version guard must remain executable workflow code");
assert.equal(new RegExp(sigstoreVersionGuard).test("4.0.0"), true,
"the Sigstore verifier version guard must recognize a real semantic version");
assert.match(publish, /attestation_bundle_sha256/);
assert.match(publish, /signature_audit_sha256/);
assert.match(publish, /dependency\.uri === expectedDependencyUri/,
Expand Down
Loading
Loading