From c70264aa69aa8379d6956b52834c8c01049015d5 Mon Sep 17 00:00:00 2001 From: Paul Dotterer <44400894+PaulDotterer@users.noreply.github.com> Date: Sun, 5 Jul 2026 20:38:50 +0200 Subject: [PATCH 1/8] =?UTF-8?q?fix(core,cli):=20resolve=20issues=20#1?= =?UTF-8?q?=E2=80=93#3=20and=20core=20open-review=20findings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Issue #1 — bash symbol resolution crashed with "resolved is not a function" on any script whose parse reached the external scanner (a `[ … ]` test, extglob, or $'…'). tree-sitter-wasms' bash build imports a libc symbol (isalpha) no web-tree-sitter runtime exports, so the emscripten lazy stub blew up. Vendor a source-built bash grammar (pinned CLI, sha256-checked) like proto, wire it into VENDORED_GRAMMARS and the standalone binary's embed list. Issue #2 — `docref check ` surfaced a raw EISDIR. docFiles now expands a directory argument to every scanned doc under it (a file is still taken verbatim; a missing path is kept so the read fails loudly). Issue #3 — the code-side anchor scan skipped dot-directories while the resolver read them by path, so an unused marker under .github/ was never flagged. anchorFiles globs with dot:true so both walk the same files. Findings: - gitcache SCP_LIKE let an option-shaped host/path through (git@-oProxyCommand=…:x, the CVE-2017-1000117 ssh RCE class). Reject a leading '-' on host and path, and whitespace in the path. - ops.update persisted docref.lock before refresh; a refresh failure left the lock advanced past the docs. Write the lock only after refresh. - ops.addRepo appended the [repos.] block before update fetched; an unreachable remote left a dangling block. Fetch first, persist last, roll back the in-memory alias on failure. - selfupdate.test evaluated assetName at describe scope, crashing the whole file on an unsupported platform. Pin a fixed supported platform for the injected-IO decision tests. - symbols.test's code() helper cast every error to DocrefError and read .code, masking a TypeError as undefined. Re-throw non-DocrefErrors. - install.sh: SC2015 (A && B || C) and SC2086 (unquoted $dir/docref). Tests cover each: bash external-scanner constructs, directory scoping, dot-directory anchors, scp-url host/path injection, findRootOrNull. --- .../03-tooling/01-cli/03-cross-repo-update.md | 2 +- docs/04-internals/04-parsing-a-reference.md | 10 +-- install.sh | 6 +- packages/cli/src/selfupdate.test.ts | 12 +++- packages/cli/src/standalone.ts | 5 +- packages/core/grammars/tree-sitter-bash.wasm | Bin 0 -> 1358264 bytes packages/core/src/config.test.ts | 17 ++++- packages/core/src/config.ts | 18 +++-- packages/core/src/gitcache.test.ts | 8 +++ packages/core/src/gitcache.ts | 7 +- packages/core/src/index.ts | 2 +- packages/core/src/ops.test.ts | 68 ++++++++++++++++++ packages/core/src/ops.ts | 61 ++++++++++++++-- packages/core/src/symbols.test.ts | 25 ++++++- packages/core/src/symbols.ts | 5 +- scripts/build-vendored-grammars.mjs | 13 ++++ 16 files changed, 227 insertions(+), 32 deletions(-) create mode 100755 packages/core/grammars/tree-sitter-bash.wasm diff --git a/docs/03-tooling/01-cli/03-cross-repo-update.md b/docs/03-tooling/01-cli/03-cross-repo-update.md index de1fa45..ee9ee67 100644 --- a/docs/03-tooling/01-cli/03-cross-repo-update.md +++ b/docs/03-tooling/01-cli/03-cross-repo-update.md @@ -7,7 +7,7 @@ description: Advance cross-repo pins in docref.lock to a tracked branch's tip, r ## `docref update [alias...] [--check]` - + For each alias (default: all): fetch the tracked branch, advance `docref.lock` to its tip, refresh all snippets referencing the alias, and report every claim that became `stale-claim` under the new rev. diff --git a/docs/04-internals/04-parsing-a-reference.md b/docs/04-internals/04-parsing-a-reference.md index 174137f..d63ec12 100644 --- a/docs/04-internals/04-parsing-a-reference.md +++ b/docs/04-internals/04-parsing-a-reference.md @@ -61,14 +61,8 @@ export function parseRef(raw: string): Ref { Run from anywhere inside the repository: `docref` walks up to the nearest `docref.toml`, falling back to the working directory. -```ts docref=packages/core/src/config.ts#findRoot:371ad98d +```ts docref=packages/core/src/config.ts#findRoot:64be4c67 export function findRoot(cwd: string): string { - let dir = cwd; - for (;;) { - if (existsSync(join(dir, 'docref.toml'))) return dir; - const parent = dirname(dir); - if (parent === dir) return cwd; - dir = parent; - } + return findRootOrNull(cwd) ?? cwd; } ``` diff --git a/install.sh b/install.sh index 71ff003..22d2c0c 100755 --- a/install.sh +++ b/install.sh @@ -56,10 +56,10 @@ download_asset() { # select the asset object by name and read its API url as a unit — never # rely on name/url field adjacency (the url precedes the name in the JSON) url=$(printf '%s' "$release_json" | jq -r --arg n "$name" '.assets[] | select(.name==$n) | .url') - [ -n "$url" ] && [ "$url" != "null" ] || { + if [ -z "$url" ] || [ "$url" = "null" ]; then echo "docref: no asset '$name' in the latest release." >&2 exit 1 - } + fi curl -fSL -H "Authorization: Bearer $GITHUB_TOKEN" -H "Accept: application/octet-stream" "$url" -o "$out" else curl -fSL "https://github.com/${repo}/releases/latest/download/${name}" -o "$out" @@ -106,7 +106,7 @@ trap - EXIT rm -f "$sums" echo "docref: installed to $dir/docref" -"$dir/docref" --version >/dev/null 2>&1 && echo "docref: $($dir/docref --version) ready — run 'docref check', update with 'docref self-update'." +"$dir/docref" --version >/dev/null 2>&1 && echo "docref: $("$dir/docref" --version) ready — run 'docref check', update with 'docref self-update'." case ":$PATH:" in *":$dir:"*) ;; diff --git a/packages/cli/src/selfupdate.test.ts b/packages/cli/src/selfupdate.test.ts index f02b673..d3fda8e 100644 --- a/packages/cli/src/selfupdate.test.ts +++ b/packages/cli/src/selfupdate.test.ts @@ -30,7 +30,13 @@ describe('assetName', () => { // Covers correct / absent / present-but-wrong for each step, including the // checksum gate that guards the binary swap. describe('selfUpdate: decision and failure paths', () => { - const presentAsset = assetName(process.platform, process.arch); + // A fixed supported platform, injected into the IO, keeps these tests + // deterministic and independent of the running platform — so collection never + // throws on an unsupported host (assetName evaluated at describe scope would + // crash the whole file on, e.g., FreeBSD). The real platform matrix is + // covered in the assetName describe above. + const [PLATFORM, ARCH] = ['linux', 'x64']; + const presentAsset = assetName(PLATFORM, ARCH); const BINARY = Buffer.from('new-binary'); const BIN_SHA = createHash('sha256').update(BINARY).digest('hex'); // a valid SHA256SUMS manifest matching BINARY for this platform's asset @@ -46,8 +52,8 @@ describe('selfUpdate: decision and failure paths', () => { downloadAsset: async (asset) => (asset.name === 'SHA256SUMS' ? SUMS : BINARY), replaceBinary: () => {}, refreshExtension: async () => ({ code: 0, out: 'extension refreshed' }), - platform: process.platform, - arch: process.arch, + platform: PLATFORM, + arch: ARCH, execPath: '/fake/docref', ...over }); diff --git a/packages/cli/src/standalone.ts b/packages/cli/src/standalone.ts index 991f1df..6443f5f 100644 --- a/packages/cli/src/standalone.ts +++ b/packages/cli/src/standalone.ts @@ -24,7 +24,10 @@ import phpWasm from 'tree-sitter-wasms/out/tree-sitter-php.wasm' with { type: 'f import swiftWasm from 'tree-sitter-wasms/out/tree-sitter-swift.wasm' with { type: 'file' }; import kotlinWasm from 'tree-sitter-wasms/out/tree-sitter-kotlin.wasm' with { type: 'file' }; import scalaWasm from 'tree-sitter-wasms/out/tree-sitter-scala.wasm' with { type: 'file' }; -import bashWasm from 'tree-sitter-wasms/out/tree-sitter-bash.wasm' with { type: 'file' }; +// bash and proto are vendored (source-built): tree-sitter-wasms ships no proto, +// and its bash build imports a libc symbol the runtime lacks, crashing the +// external scanner (issue #1) — the vendored copy resolves it. +import bashWasm from '@open-docref/core/grammars/tree-sitter-bash.wasm' with { type: 'file' }; import protoWasm from '@open-docref/core/grammars/tree-sitter-proto.wasm' with { type: 'file' }; import { configureWasm } from '@open-docref/core'; import { run, VERSION } from './main'; diff --git a/packages/core/grammars/tree-sitter-bash.wasm b/packages/core/grammars/tree-sitter-bash.wasm new file mode 100755 index 0000000000000000000000000000000000000000..b7f654da5832515fa6060f8c9e51c87a8c763558 GIT binary patch literal 1358264 zcmeFadwf+zn)kccbps(b+V<6+nFM=!?7P$NOwV-N)8n4^sM9mk@0|Pn9LMQ#&b0JZ zo%cO+&U=ml0tN{XFhGC+0RjY#8W9u~H6ki1YD83&00B`!A_j~aAmIDls#dL9Yi;&k z$bUV4rpbP)o~mDcpQmcoy6m+J*WL6>rvU$V;h2B=w_p7HSChVTxf3=VyT&gToIfA; z56&%xe{gSs|8Z_{Zo$9ce+z|wD8N77E%eEUf1sTH5o^Ic?p)wq|EvEP{_MJ6{NmR? zD|q-}%+GK7PdEMMx}RNNaPg!6&o^FweW8GV7H_=Xs2Bc{KTs`ny6zXh`Iqb1i9i18 zUw_FTYp=cbx|?pg{>GcH{pag`{)7p8-Mo8-*BIwx%S$dZockkldk>EuYdll zo3FpoyT!pe;P=bxfBEYh|Lxj;yzZv!y<14d_-n7d`MQ7n#r38w?qYS;bdH^2C|YyauGo3Fd}#_IvxO@(n| zYn{TSZcXvx&(~Zue!_+09cSD}XU1LN6`Y!N-*Cp?a;a0=_V&|-8{prL_20VT`)&dL z+Afyf&x)Z>41F(rO)NXb(zEi%V%eqYyaUZmbhxE{Rc#22Y#I>L&>feF<)E_Mqb!G% z+xDlF+n}nnNmUvWOUEP1GOXORWkl6^N!1x8i_2OXQ0t{`$q^+@^w}x(Zqss`#niFk zn^LJooLu?bDxW?1+$NuW`P?p_1Nqz`pF{cFNuQn4fbOA7EYFXXDx1VG{Z194&0=ZM zmR_+maTx0y2;}bZ(!fqBd||u}%`Pz=P&)g?a9j;!KnzchkyZ|hp;_g{Au&u*hCwmh zae=rDiQ(gm#4s#|RTtbaG2keSh-vhq8zxF%M#XdlOht*+A&iw%ny;E}6vI4aXcEIB zWoQ<|9A#(`!*XS46+@dcw27ff8QR4#Ss6OS(5?)fVmMPPL+ld6DP`yugUWy&`Mg0H zHi%)l;tioFgr&Mxz*}Dnk<*>ST3lmeTvwG-(mTyDH;b#c;2RRGSz+sF7f|i(%C` zF?5LGS=C0T7*?y;b%|kxa_JVse${A?7~WQf4Pv-QQQahlb&C6DF|@0Z_KIPNGHeyY z9JTOl69cRXV;T8&v3NI3^x4uUmU*g`onlxIfeN|KE-~#>;`+t#x-txiVYf0I6vHlM zI3$K6YQ%$LctEX2Lt4?(Q ztg0(Rix}Dzj8-wsSB5q*sMxp5=i@3vJH&8Q89K#qP#L4QwmZTJCJSOs{ye4eRB*C&R(3dl||tO)cn zy-Q5{mHd7*)JZxGNa>5Jg@a<~f^@3ku^bZ9adluC6hn{FF(ignO6jl|_Nvg2h~bnn zjEbR8$!a*lgWau&HHzVGP$Jx##H4bv89%F`w9p5c0eKoE&DwUP2ojypT9rQsC zeVyXhtWrr|*`yrXIy62qIyFerv2$}l8` zx0GR64DTt!h!_ql!>AaZSB8c`PJvY_NgBm4M-8q?3@ea_SYs%j!V5RSYZD9NZ>`jcP7z7sCm)xb~r;PGs+t()G%J7nMqy^_w3C%nt|Y zgB+d@;Rjfc9#9A0K`NDHVu(J-fooW*-leFIP^sEY(g&HU4ey~&nSYJ=0lHAruSq_? zt`_iSF)UC6X%WK*Dx9ri7*S-}#IRS@Xcxm=W#|yY3}xsP!)0

ypp6D;eEl=u;8v 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

G>Y1Fk4=Hs|)r@ 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

tDtWldbZMe9jj>z8bY;n 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 { // (parent === dir) and returns the original cwd, never looping forever expect(findRoot(nested)).toBe(nested); }); + + it('findRootOrNull returns the governing root, or null when there is none', () => { + // the governing-root rule the extension needs: a file belongs to the + // nearest docref.toml above it, independent of any workspace folder. In a + // multi-repo layout each sibling resolves to its OWN root, not a shared one. + const ws = tmp(); // the "workspace folder" — no docref.toml of its own + write(ws, 'sdk/docref.toml', ''); + write(ws, 'docs/docref.toml', ''); + mkdirSync(join(ws, 'sdk', 'pkg'), { recursive: true }); + mkdirSync(join(ws, 'docs', 'content'), { recursive: true }); + expect(findRootOrNull(join(ws, 'sdk', 'pkg'))).toBe(join(ws, 'sdk')); + expect(findRootOrNull(join(ws, 'docs', 'content'))).toBe(join(ws, 'docs')); + // the workspace folder itself governs nothing (no docref.toml at or above) + expect(findRootOrNull(ws)).toBeNull(); + }); }); diff --git a/packages/core/src/config.ts b/packages/core/src/config.ts index acfd241..a6d7060 100644 --- a/packages/core/src/config.ts +++ b/packages/core/src/config.ts @@ -125,13 +125,23 @@ export function appendRepoBlock(root: string, alias: string, url: string, ref?: writeFileSync(path, prefix + block + '\n'); } -/** Walk up from cwd to the nearest docref.toml; fall back to cwd itself. */ -export function findRoot(cwd: string): string { - let dir = cwd; +/** + * Walk up from `from` to the nearest directory containing docref.toml, or null + * if none is found before the filesystem root. This is the governing-root rule + * (ESLint/EditorConfig style): a file's project is the closest docref.toml at or + * above it, independent of any editor's workspace folder. + */ +export function findRootOrNull(from: string): string | null { + let dir = from; for (;;) { if (existsSync(join(dir, 'docref.toml'))) return dir; const parent = dirname(dir); - if (parent === dir) return cwd; + if (parent === dir) return null; dir = parent; } } + +/** Walk up from cwd to the nearest docref.toml; fall back to cwd itself. */ +export function findRoot(cwd: string): string { + return findRootOrNull(cwd) ?? cwd; +} diff --git a/packages/core/src/gitcache.test.ts b/packages/core/src/gitcache.test.ts index 8a8eb9f..41469ed 100644 --- a/packages/core/src/gitcache.test.ts +++ b/packages/core/src/gitcache.test.ts @@ -105,6 +105,14 @@ describe('assertUrl: a remote url safe to hand git', () => { expect(() => assertUrl('--upload-pack=touch /tmp/pwned')).toThrow(DocrefError); }); + it('rejects an scp-like url whose host or path is option-shaped (ssh -oProxyCommand RCE)', () => { + // host starting with '-' becomes an ssh option (CVE-2017-1000117 class) + expect(() => assertUrl('git@-oProxyCommand=touch /tmp/pwned:repo.git')).toThrow(DocrefError); + // path starting with '-' can reach the remote git as an option + expect(() => assertUrl('git@github.com:--upload-pack=touch /tmp/pwned')).toThrow(DocrefError); + expect(() => assertUrl('git@github.com:-x')).toThrow(DocrefError); + }); + it('rejects empty and unknown/no scheme', () => { expect(() => assertUrl('')).toThrow(DocrefError); expect(() => assertUrl('javascript:alert(1)')).toThrow(DocrefError); diff --git a/packages/core/src/gitcache.ts b/packages/core/src/gitcache.ts index 4a1bc5b..9e95fad 100644 --- a/packages/core/src/gitcache.ts +++ b/packages/core/src/gitcache.ts @@ -43,7 +43,12 @@ export function cacheDirFor(url: string): string { const REV = /^[0-9a-f]{7,64}$/i; const REF = /^[0-9A-Za-z._/-]+$/; const URL_SCHEME = /^(https?|ssh|git|file):\/\//i; -const SCP_LIKE = /^[^\s/:-][^\s/:]*@[^\s/:]+:.+$/; +// scp-like `user@host:path`. The first char of user, host, AND path all exclude +// '-': git hands the host to ssh, where a leading-dash host is parsed as an +// option (`-oProxyCommand=`, the CVE-2017-1000117 RCE class), and a +// leading-dash path can reach the remote git as an option. The path also forbids +// whitespace so a `host:--flag ` payload cannot smuggle a second token. +const SCP_LIKE = /^[^\s/:-][^\s/:]*@[^\s/:-][^\s/:]*:[^\s-][^\s]*$/; export function assertRev(rev: string): string { if (typeof rev !== 'string' || !REV.test(rev)) { diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 83bc315..5d1e04f 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -18,7 +18,7 @@ export { export { listDeclarations, findSymbol, configureWasm, type Decl, type WasmConfig } from './symbols'; export { languageForFile, fenceLanguageForRef, type LanguageId, type LanguageInfo } from './languages'; export { workingTreeSource, resolveAnchor, type FileSource, type Anchor } from './resolve'; -export { loadProject, writeLock, findRoot, GATE_LEVELS, type Project, type RepoConfig, type GateLevel } from './config'; +export { loadProject, writeLock, findRoot, findRootOrNull, GATE_LEVELS, type Project, type RepoConfig, type GateLevel } from './config'; export { ensureCommit, branchTip, gitRevSource } from './gitcache'; export { check, diff --git a/packages/core/src/ops.test.ts b/packages/core/src/ops.test.ts index aefff4e..24736a8 100644 --- a/packages/core/src/ops.test.ts +++ b/packages/core/src/ops.test.ts @@ -321,6 +321,56 @@ describe('affected: mapping changes to carriers', () => { }); }); +describe('path scoping: a directory argument (issue #2)', () => { + // A directory passed to a path-scoped op used to hit readFileSync and surface + // a raw EISDIR. It now expands to every scanned doc under it (the natural way + // to gate one section of a docs tree); a file is still taken verbatim. + // each doc carries one snippet ref to a missing file, so it surfaces as a + // broken entry keyed by its own doc path — the signal that proves which docs + // a given scope actually visited. + const brokenRef = (name: string) => ['```txt docref=' + name + '.txt#@x', '```', ''].join('\n'); + function tree(): string { + const root = tmp(); + write(root, 'content/01-intro/a.md', brokenRef('a')); + write(root, 'content/02-concepts/b.md', brokenRef('b')); + write(root, 'content/02-concepts/nested/c.md', brokenRef('c')); + write(root, 'other/d.md', brokenRef('d')); + return root; + } + const docsIn = (r: Report) => new Set(r.entries.map((e) => e.doc)); + + it('scans every doc under the directory instead of throwing EISDIR', async () => { + const root = tree(); + const report = await check(loadProject(root), ['content/02-concepts']); + // the directory (including its nested doc) is in scope; siblings are not + expect(docsIn(report)).toEqual( + new Set(['content/02-concepts/b.md', 'content/02-concepts/nested/c.md']) + ); + }); + + it('a trailing slash is tolerated and a nested directory scopes tighter', async () => { + const root = tree(); + expect(docsIn(await check(loadProject(root), ['content/02-concepts/']))).toEqual( + new Set(['content/02-concepts/b.md', 'content/02-concepts/nested/c.md']) + ); + expect(docsIn(await check(loadProject(root), ['content/02-concepts/nested']))).toEqual( + new Set(['content/02-concepts/nested/c.md']) + ); + }); + + it('still checks a single explicit file verbatim', async () => { + const root = tree(); + expect(docsIn(await check(loadProject(root), ['content/01-intro/a.md']))).toEqual( + new Set(['content/01-intro/a.md']) + ); + }); + + it('keeps a nonexistent path so the read fails loudly (ENOENT), not silently dropped', async () => { + const root = tree(); + await expect(check(loadProject(root), ['content/missing.md'])).rejects.toThrow(); + }); +}); + describe('anchors: the code-side inventory', () => { // The reverse view (tooling.md): every declared region marker in the // codebase, each flagged with its references or as not used. Symbols @@ -379,6 +429,24 @@ describe('anchors: the code-side inventory', () => { const result = await anchors(loadProject(root)); expect(result.anchors.map((a) => a.name)).toEqual(['mine']); }); + + it('lists markers inside dot-directories, so an unused one there is flagged', async () => { + // regression for issue #3: the code-side scan skipped dot-directories + // (.github/ especially) while the reference resolver read them by path, so + // a marker nothing references was never reported as unused — the fail-loud + // guarantee had a hole exactly where CI configs live. + const root = tmp(); + write( + root, + '.github/workflows/release.yml', + '# docref: begin release-trigger\non: push\n# docref: end release-trigger\n' + ); + const result = await anchors(loadProject(root)); + expect(result.errors).toEqual([]); + const ref = '.github/workflows/release.yml#@release-trigger'; + expect(result.anchors.map((a) => `${a.file}#@${a.name}`)).toContain(ref); + expect(result.anchors.find((a) => a.name === 'release-trigger')!.references).toEqual([]); + }); }); describe('unused anchors fail the gate', () => { diff --git a/packages/core/src/ops.ts b/packages/core/src/ops.ts index 9a08435..b937c92 100644 --- a/packages/core/src/ops.ts +++ b/packages/core/src/ops.ts @@ -111,8 +111,7 @@ function summarize(entries: ReportEntry[]): Report['summary'] { return summary; } -async function docFiles(project: Project, paths?: string[]): Promise { - if (paths?.length) return [...paths].sort(); +async function scannedDocs(project: Project): Promise { const found = await glob(project.scan.include, { cwd: project.root, ignore: project.scan.exclude @@ -120,6 +119,36 @@ async function docFiles(project: Project, paths?: string[]): Promise { return found.sort(); } +/** + * The docs a path-scoped op runs over. No paths → the whole scan set. A path + * argument that is a directory expands to every scanned doc under it (the + * natural way to gate one section of a docs tree, and what agents/CI pass + * reflexively); a file is taken verbatim, even outside the scan scope, so a + * single explicit file still checks. A path that is neither is kept as-is so + * the downstream read fails loudly (ENOENT) instead of being silently dropped. + */ +async function docFiles(project: Project, paths?: string[]): Promise { + if (!paths?.length) return scannedDocs(project); + let scanned: string[] | null = null; + const out = new Set(); + for (const p of paths) { + let isDir = false; + try { + isDir = statSync(join(project.root, p)).isDirectory(); + } catch { + // not on disk: keep it so the read reports a clear ENOENT, not a drop + } + if (isDir) { + scanned ??= await scannedDocs(project); + const prefix = p.replace(/\/+$/, '') + '/'; + for (const f of scanned) if (f.startsWith(prefix)) out.add(f); + } else { + out.add(p); + } + } + return [...out].sort(); +} + type RevOverrides = Record; /** Lazily build one FileSource per (alias, rev); same-repo = working tree. */ @@ -412,9 +441,13 @@ export async function update( }; } + // Advance the lock in-memory and refresh snippets against the new revs + // FIRST; persist the lock only once refresh succeeds, so a refresh failure + // (IO error, or a resolve throw) never leaves docref.lock advanced past + // documents that still hold the old content. for (const [alias, rev] of Object.entries(overrides)) project.lock[alias] = { rev }; - writeLock(project); const { report } = await refresh(project); + writeLock(project); return { changed, report }; } @@ -442,10 +475,19 @@ export async function addRepo( assertUrl(url); if (ref !== undefined) assertRef(ref); - appendRepoBlock(project.root, alias, url, ref); - // reflect it in-memory so update() sees the new alias, then lock its tip + // Reflect the alias in-memory so update() sees it, then fetch+lock its tip + // BEFORE persisting anything. update() throws (unreachable remote, bad ref) + // prior to any disk write, so an unfetchable repo never leaves a dangling + // [repos.] block in docref.toml. Roll the in-memory mutation back on + // failure in case the caller reuses the Project. Persist the toml block last. project.repos[alias] = { url, ...(ref ? { ref } : {}) }; - await update(project, { aliases: [alias] }); + try { + await update(project, { aliases: [alias] }); + } catch (e) { + delete project.repos[alias]; + throw e; + } + appendRepoBlock(project.root, alias, url, ref); return { alias, url, ...(ref ? { ref } : {}), rev: project.lock[alias]!.rev }; } @@ -778,7 +820,12 @@ function refsOf(c: Reference): string[] { export async function anchorFiles(project: Project): Promise { let files = await glob(project.anchors.include, { cwd: project.root, - ignore: project.anchors.exclude + ignore: project.anchors.exclude, + // walk dot-directories (.github/ especially): markers live in workflow + // files and the reference resolver reads them by path, so the code-side + // inventory must see them too or unused-marker detection has a blind spot + // exactly where CI configs live (issue #3) + dot: true }); // in a git repo, respect gitignore: build outputs and generated trees // carry marker COPIES that would otherwise show up as anchors diff --git a/packages/core/src/symbols.test.ts b/packages/core/src/symbols.test.ts index 0d78176..182966c 100644 --- a/packages/core/src/symbols.test.ts +++ b/packages/core/src/symbols.test.ts @@ -13,7 +13,11 @@ const code = async (e: () => Promise): Promise => { await e(); return 'no-error'; } catch (err) { - return (err as DocrefError).code; + // only a classified DocrefError carries a `.code`; re-throw anything else + // (a TypeError, a wasm crash) so it fails the test loudly instead of + // returning undefined and masking the real failure + if (err instanceof DocrefError) return err.code; + throw err; } }; @@ -769,3 +773,22 @@ describe('symbol resolution across popular languages', () => { }); } }); + +describe('bash: constructs that reach the external scanner', () => { + // Regression for issue #1: the tree-sitter-wasms bash build imported a libc + // symbol (isalpha) no web-tree-sitter runtime exports, so any script whose + // parse reached the external scanner — a `[ … ]` test, extglob, or $'…' — + // crashed with a raw "resolved is not a function" instead of resolving. The + // vendored, source-built grammar resolves the import; these parse cleanly. + const CONSTRUCTS: { name: string; src: string }[] = [ + { name: 'test bracket', src: 'setup() {\n [ -f /etc/hosts ] && echo ok\n}\n' }, + { name: 'extglob', src: 'setup() {\n case $x in\n ?(a|b)) echo m ;;\n esac\n}\n' }, + { name: 'ansi-c quoting', src: "setup() {\n printf $'\\n\\t'\n}\n" } + ]; + for (const c of CONSTRUCTS) { + it(`resolves a function containing a ${c.name} without crashing`, async () => { + const d = await findSymbol(c.src, 'setup.sh', 'setup'); + expect(d.content).toContain('setup()'); + }); + } +}); diff --git a/packages/core/src/symbols.ts b/packages/core/src/symbols.ts index 311ad88..8a5e4af 100644 --- a/packages/core/src/symbols.ts +++ b/packages/core/src/symbols.ts @@ -79,7 +79,10 @@ function runtimeWasmPath(name: string): string { // dir, exposed via the package's "./grammars/*" export. They resolve through // node module resolution exactly like tree-sitter-wasms, so the same lookup // works from source, from a dependent's node_modules, and via self-reference. -const VENDORED_GRAMMARS = new Set(['proto']); +// bash is vendored not because tree-sitter-wasms omits it, but because its +// shipped build imports a libc symbol (isalpha) the runtime does not export, +// crashing the external scanner (issue #1); the source-built copy resolves it. +const VENDORED_GRAMMARS = new Set(['proto', 'bash']); function grammarWasmPath(wasm: string): string { const file = `tree-sitter-${wasm}.wasm`; diff --git a/scripts/build-vendored-grammars.mjs b/scripts/build-vendored-grammars.mjs index 9cb5bb4..ea3d0a8 100644 --- a/scripts/build-vendored-grammars.mjs +++ b/scripts/build-vendored-grammars.mjs @@ -18,6 +18,19 @@ import { tmpdir } from 'node:os'; const CLI_VERSION = '0.25.10'; const GRAMMARS = [ + { + // tree-sitter-wasms builds bash against a mismatched ABI: its external + // scanner imports `isalpha`, which no web-tree-sitter runtime exports, so + // parsing `[ -f x ]`, extglob, or $'…' crashes the emscripten lazy stub + // with a raw "resolved is not a function" (issue #1). Built from source + // with the pinned CLI, the import resolves and those constructs parse. + name: 'bash', + repo: 'https://github.com/tree-sitter/tree-sitter-bash.git', + commit: 'a06c2e4415e9bc0346c6b86d401879ffb44058f7', // v0.25.1 + fileTypes: ['sh', 'bash'], + license: 'MIT', + sha256: '474a86db0ded2b2478e130640ebfa9493143862f57546c19cf8a8d9bf26e3a17' + }, { // proto3/proto2; every declaration node (message/enum/service/rpc) exposes // a `name` field, so core's generic collector handles it unchanged. From 17ffd6ff3fe97d57ae7dcfc333d452afa472b725 Mon Sep 17 00:00:00 2001 From: Paul Dotterer <44400894+PaulDotterer@users.noreply.github.com> Date: Sun, 5 Jul 2026 20:39:04 +0200 Subject: [PATCH 2/8] fix(vscode): resolve each doc's docref.toml per-file (issue #4) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The extension loaded a single project from the first workspace folder (loadProject(findRoot(workspaceFolder))). In a multi-repo workspace the docref.toml files sit in subdirectories, so findRoot walked up and found none, loading a default config with no aliases and workspace-relative paths — 100+ false "broken"/"undeclared alias" diagnostics on green docs. Resolve each file's governing project by walking up from the file to its nearest docref.toml (ESLint/EditorConfig style), independent of the workspace folder: - core: findRootOrNull(from) — the nullable governing-root walk; findRoot now delegates to it. - rescan discovers every docref.toml under the workspace and scans each project against its own config; diagnostics and the actionable-at lookup are keyed by absolute path so two projects' docs never collide. - per-document commands (completion, code actions, drift, approve, refresh, add-repo, create/stage anchor) resolve the active file's project. - sidebar trees aggregate across projects with each node tagged with its root, so a node action targets the right repo; a single-repo workspace renders exactly as before. openLocation now opens absolute paths. The pure decision logic — tagRoot, mergeProjectTrees, aggregateStatusText — lives in logic.ts with unit tests, per the extension's thin-wiring rule. Also bound driftDocs: evict each virtual diff doc when its tab closes, so the map no longer grows for the life of the session. --- packages/vscode/src/extension.ts | 378 +++++++++++++++++++----------- packages/vscode/src/logic.test.ts | 58 +++++ packages/vscode/src/logic.ts | 70 ++++++ 3 files changed, 372 insertions(+), 134 deletions(-) diff --git a/packages/vscode/src/extension.ts b/packages/vscode/src/extension.ts index 4d21c91..e04dcdc 100644 --- a/packages/vscode/src/extension.ts +++ b/packages/vscode/src/extension.ts @@ -3,10 +3,10 @@ // this file only moves data between the core and the editor. import * as vscode from 'vscode'; import { readFileSync } from 'node:fs'; -import { join } from 'node:path'; +import { join, dirname } from 'node:path'; import { configureWasm, - findRoot, + findRootOrNull, loadProject, parseRef, workingTreeSource, @@ -51,9 +51,10 @@ import { buildReferencesTree, buildAnchorsTree, buildStageTree, + mergeProjectTrees, + aggregateStatusText, isRelevantChange, relPath, - statusText, refCompletionContext, pathCompletionsFromFiles, type Leader, @@ -144,18 +145,69 @@ function fenceLang(ref: string, fallback = ''): string { } } -let report: Report | null = null; -let index: RefIndex | null = null; -let anchorIndex: AnchorsResult | null = null; -let anchorFileList: string[] = []; // the [anchors] scope, for path completion +// One project's scan result. A workspace holds one of these per docref.toml +// (one in the common single-repo case, several in a multi-repo workspace), so +// every doc is evaluated against its OWN governing config rather than a single +// workspace-folder project. +type Scan = { + root: string; + project: Project; + report: Report; + index: RefIndex; + anchorIndex: AnchorsResult; + anchorFileList: string[]; // the [anchors] scope, for path completion + refPaths: Set; // same-repo ref target files (project-relative) + anchorFileSet: Set; // declared-anchor files (project-relative) +}; +let scans: Scan[] = []; + +function scanForRoot(root: string): Scan | undefined { + return scans.find((s) => s.root === root); +} + +function workspaceFolders(): string[] { + return (vscode.workspace.workspaceFolders ?? []).map((f) => f.uri.fsPath); +} + +/** + * The governing project for a file: the nearest docref.toml at or above it + * (ESLint/EditorConfig style), independent of any workspace folder. This is the + * fix for multi-repo workspaces — a doc under sdk/ resolves against sdk/'s + * docref.toml (its aliases, its relative paths), not the workspace folder that + * may hold no config at all. + */ +function projectFor(fsPath: string): { project: Project; root: string } | null { + const root = findRootOrNull(dirname(fsPath)); + return root ? { project: loadProject(root), root } : null; +} -function workspaceRoot(): string | null { - return vscode.workspace.workspaceFolders?.[0]?.uri.fsPath ?? null; +/** The governing project of the active editor's document, if it has one. */ +function activeProject(): { project: Project; root: string } | null { + const f = vscode.window.activeTextEditor?.document.uri.fsPath; + return f ? projectFor(f) : null; } -function project(): Project | null { - const ws = workspaceRoot(); - return ws ? loadProject(findRoot(ws)) : null; +/** A tree node's own project (root stamped at build time), falling back to the + * active editor's project when the node carries none. */ +function projectForNode(n: { root?: string } | undefined): { project: Project; root: string } | null { + return n?.root ? { project: loadProject(n.root), root: n.root } : activeProject(); +} + +/** + * Every project root reachable from the workspace: each folder that is itself + * inside a project (walk up), plus every docref.toml discovered beneath the + * folders. In a single-repo workspace this is one root; in a multi-repo one it + * is each sibling repo's root, so each is scanned against its own config. + */ +async function discoverRoots(): Promise { + const roots = new Set(); + for (const ws of workspaceFolders()) { + const up = findRootOrNull(ws); + if (up) roots.add(up); + } + const found = await vscode.workspace.findFiles('**/docref.toml', '**/node_modules/**'); + for (const uri of found) roots.add(dirname(uri.fsPath)); + return [...roots]; } const STATE_ICONS: Record = { @@ -198,19 +250,22 @@ class SidebarTree implements vscode.TreeDataProvider, vscode.Dispos break; case 'issue': item.iconPath = new vscode.ThemeIcon(n.severity === 'error' ? 'error' : 'warning'); - item.command = { command: 'docref.openLocation', title: 'Open', arguments: [n.doc, n.line] }; + if (n.root && n.doc) + item.command = { command: 'docref.openLocation', title: 'Open', arguments: [join(n.root, n.doc), n.line] }; break; case 'file': item.iconPath = new vscode.ThemeIcon('file-code'); - item.command = { command: 'docref.openLocation', title: 'Open', arguments: [n.path, 1] }; + if (n.root && n.path) + item.command = { command: 'docref.openLocation', title: 'Open', arguments: [join(n.root, n.path), 1] }; break; case 'ref': item.iconPath = STATE_ICONS[n.state ?? 'unknown']; - item.command = { command: 'docref.openAnchor', title: 'Open code', arguments: [n.ref] }; + item.command = { command: 'docref.openAnchor', title: 'Open code', arguments: [n.ref, n.root] }; break; case 'location': item.iconPath = new vscode.ThemeIcon(n.kind === 'claim' ? 'note' : 'code'); - item.command = { command: 'docref.openLocation', title: 'Open', arguments: [n.doc, n.line] }; + if (n.root && n.doc) + item.command = { command: 'docref.openLocation', title: 'Open', arguments: [join(n.root, n.doc), n.line] }; break; } return item; @@ -229,12 +284,17 @@ export function activate(context: vscode.ExtensionContext): void { grammarsDir: join(context.extensionPath, 'dist', 'wasm') }); - // `${doc}:${line}` -> the ref and state under each docref squiggle, so the - // code-action provider can offer jump-to-code / diff without re-deriving from - // the report. Rebuilt on every rescan, in lockstep with the diagnostics. - let actionableAt = new Map(); + // `${absDoc}:${line}` -> the ref, state, and governing project root under each + // docref squiggle, so the code-action provider can offer jump-to-code / diff + // (and resolve against the right repo) without re-deriving from the report. + // Keyed by ABSOLUTE doc path so multi-repo docs never collide. Rebuilt on + // every rescan, in lockstep with the diagnostics. + let actionableAt = new Map(); // virtual documents backing the approved-vs-current drift diffs + // Evicted when a diff tab closes (onDidCloseTextDocument, in subscriptions), + // so the map stays bounded by the number of open drift diffs instead of + // growing for the whole session. const driftDocs = new Map(); let driftSeq = 0; const driftProvider: vscode.TextDocumentContentProvider = { @@ -249,10 +309,11 @@ export function activate(context: vscode.ExtensionContext): void { async function openDrift(opts?: { doc?: string; ref?: string; + root?: string; }): Promise<{ opened: number; total: number }> { - const p = project(); - if (!p) return { opened: 0, total: 0 }; - const all = (await diff(p, opts?.doc ? [opts.doc] : undefined)).entries; + const pr = opts?.root ? { project: loadProject(opts.root), root: opts.root } : activeProject(); + if (!pr) return { opened: 0, total: 0 }; + const all = (await diff(pr.project, opts?.doc ? [opts.doc] : undefined)).entries; const entries = opts?.ref ? all.filter((e) => e.ref === opts.ref) : all; let opened = 0; for (const e of entries) { @@ -280,8 +341,12 @@ export function activate(context: vscode.ExtensionContext): void { status.command = 'docrefRefs.focus'; status.text = 'docref'; status.show(); - const tree = new SidebarTree(() => (index ? buildReferencesTree(index, report) : [])); - const anchorTree = new SidebarTree(() => (anchorIndex ? buildAnchorsTree(anchorIndex) : [])); + const tree = new SidebarTree(() => + mergeProjectTrees(scans.map((s) => ({ root: s.root, nodes: buildReferencesTree(s.index, s.report) }))) + ); + const anchorTree = new SidebarTree(() => + mergeProjectTrees(scans.map((s) => ({ root: s.root, nodes: buildAnchorsTree(s.anchorIndex) }))) + ); // the staging area: refs collected (sha computed at stage time for // display, recomputed at insert time so pastes are always current) @@ -292,18 +357,20 @@ export function activate(context: vscode.ExtensionContext): void { stageTree.refresh(); } - async function resolveRefNow(refRaw: string): Promise<{ content: string; sha: string } | null> { - const p = project(); - if (!p) return null; + async function resolveRefNow( + refRaw: string, + pr: { project: Project } | null + ): Promise<{ content: string; sha: string } | null> { + if (!pr) return null; try { - return await resolveReference(p, refRaw); + return await resolveReference(pr.project, refRaw); } catch { return null; } } - async function stageAdd(ref: string): Promise { - const resolved = await resolveRefNow(ref); + async function stageAdd(ref: string, pr: { project: Project } | null): Promise { + const resolved = await resolveRefNow(ref, pr); staged = [ ...staged.filter((s) => s.ref !== ref), { ref, ...(resolved ? { sha: resolved.sha } : {}) } @@ -318,7 +385,7 @@ export function activate(context: vscode.ExtensionContext): void { void vscode.window.showWarningMessage('docref: open the target document and place the cursor first.'); return; } - const resolved = await resolveRefNow(n.ref); + const resolved = await resolveRefNow(n.ref, projectForNode(n)); if (!resolved) { void vscode.window.showWarningMessage(`docref: ${n.ref} does not resolve right now.`); return; @@ -334,57 +401,71 @@ export function activate(context: vscode.ExtensionContext): void { } let pending: NodeJS.Timeout | undefined; - // Derived from the indexes and only changing on rescan, so they are computed - // once here rather than rebuilt from the whole index on every '**/*' fs event - // (which fires constantly for build/.git churn). Named distinctly so they do - // not shadow the imported core `anchorFiles`. - let cachedRefPaths = new Set(); - let cachedAnchorFileSet = new Set(); async function rescan(): Promise { - const p = project(); - if (!p) return; + const roots = await discoverRoots(); + const next: Scan[] = []; try { - report = await check(p); - index = await ls(p); - anchorIndex = await anchors(p); - anchorFileList = await anchorFiles(p); + for (const root of roots) { + const project = loadProject(root); + const [report, index, anchorIndex, anchorFileList] = await Promise.all([ + check(project), + ls(project), + anchors(project), + anchorFiles(project) + ]); + next.push({ + root, + project, + report, + index, + anchorIndex, + anchorFileList, + refPaths: new Set( + index.refs + .map((r) => r.ref) + .filter((ref) => !ref.includes(':')) + .map((ref) => ref.split('#')[0]!) + ), + anchorFileSet: new Set(anchorIndex.anchors.map((a) => a.file)) + }); + } } catch (e) { void vscode.window.showErrorMessage(`docref: ${(e as Error).message}`); return; } - cachedRefPaths = new Set( - index.refs - .map((r) => r.ref) - .filter((ref) => !ref.includes(':')) - .map((ref) => ref.split('#')[0]!) - ); - cachedAnchorFileSet = new Set(anchorIndex.anchors.map((a) => a.file)); + scans = next; + + // diagnostics and the actionable-at lookup are keyed by ABSOLUTE path, so + // two projects that both hold a `docs/x.md` never collide diagnostics.clear(); actionableAt = new Map(); - const level = p.check.level; - for (const [doc, list] of diagnosticsFromReport(report, level)) { - for (const d of list) actionableAt.set(`${doc}:${d.line}`, { ref: d.ref, code: d.code }); - diagnostics.set( - vscode.Uri.file(`${p.root}/${doc}`), - list.map((d) => { - const severity = - d.severity === 'error' - ? vscode.DiagnosticSeverity.Error - : d.severity === 'information' - ? vscode.DiagnosticSeverity.Information - : vscode.DiagnosticSeverity.Warning; - const diag = new vscode.Diagnostic( - new vscode.Range(d.line - 1, 0, d.line - 1, 1000), - d.message, - severity - ); - diag.source = 'docref'; - diag.code = d.code; - return diag; - }) - ); + for (const s of scans) { + const level = s.project.check.level; + for (const [doc, list] of diagnosticsFromReport(s.report, level)) { + const abs = join(s.root, doc); + for (const d of list) actionableAt.set(`${abs}:${d.line}`, { ref: d.ref, code: d.code, root: s.root }); + diagnostics.set( + vscode.Uri.file(abs), + list.map((d) => { + const severity = + d.severity === 'error' + ? vscode.DiagnosticSeverity.Error + : d.severity === 'information' + ? vscode.DiagnosticSeverity.Information + : vscode.DiagnosticSeverity.Warning; + const diag = new vscode.Diagnostic( + new vscode.Range(d.line - 1, 0, d.line - 1, 1000), + d.message, + severity + ); + diag.source = 'docref'; + diag.code = d.code; + return diag; + }) + ); + } } - status.text = statusText(report, level); + status.text = aggregateStatusText(scans.map((s) => ({ report: s.report, level: s.project.check.level }))); tree.refresh(); anchorTree.refresh(); } @@ -397,20 +478,36 @@ export function activate(context: vscode.ExtensionContext): void { // branch switches, or any external edit update the views unprompted const watcher = vscode.workspace.createFileSystemWatcher('**/*'); function onFsEvent(uri: vscode.Uri): void { - const root = workspaceRoot(); - if (!root) return; - const rel = relPath(root, uri.fsPath); - if (rel === null) return; // outside the workspace (POSIX/Windows correct) - if (isRelevantChange(rel, cachedRefPaths, cachedAnchorFileSet)) rescanSoon(); + // any docref config appearing/changing may add or reshape a project + if (/[\\/]docref\.(toml|lock)$/.test(uri.fsPath)) { + rescanSoon(); + return; + } + // otherwise, relevant only if it belongs to a known project's scan set + for (const s of scans) { + if (uri.fsPath !== s.root && !uri.fsPath.startsWith(s.root + '/')) continue; + const rel = relPath(s.root, uri.fsPath); + if (rel !== null && isRelevantChange(rel, s.refPaths, s.anchorFileSet)) { + rescanSoon(); + return; + } + } } async function refFromSelection(): Promise { const editor = vscode.window.activeTextEditor; - const root = workspaceRoot(); - if (!editor || !root || editor.selection.isEmpty) { + if (!editor || editor.selection.isEmpty) { void vscode.window.showWarningMessage('docref: select the code to anchor first.'); return null; } + // the ref is relative to the file's OWN governing project root, so it + // resolves in a multi-repo workspace regardless of the workspace folder + const pr = projectFor(editor.document.uri.fsPath); + if (!pr) { + void vscode.window.showWarningMessage('docref: this file is not inside a docref project (no docref.toml above it).'); + return null; + } + const root = pr.root; const doc = editor.document; const rel = relPath(root, doc.uri.fsPath) ?? ''; const [startLine, endLine] = normalizeSelectionLines( @@ -472,7 +569,8 @@ export function activate(context: vscode.ExtensionContext): void { /** Offer the freshly anchored ref: stage it, or copy paste-ready text. */ async function offerRef(ref: string): Promise { - const resolved = await resolveRefNow(ref); + const pr = activeProject(); + const resolved = await resolveRefNow(ref, pr); const pinned = resolved ? `${ref}:${resolved.sha}` : ref; await vscode.env.clipboard.writeText(pinned); const action = await vscode.window.showInformationMessage( @@ -482,7 +580,7 @@ export function activate(context: vscode.ExtensionContext): void { 'Copy snippet' ); if (action === 'Stage') { - await stageAdd(ref); + await stageAdd(ref, pr); } else if (action === 'Copy claim') { await vscode.env.clipboard.writeText( claimBlockText([{ ref, ...(resolved ? { sha: resolved.sha } : {}) }]) @@ -506,10 +604,11 @@ export function activate(context: vscode.ExtensionContext): void { const lensProvider: vscode.CodeLensProvider = { async provideCodeLenses(doc) { - const root = workspaceRoot(); - if (!root || !index) return []; - const rel = relPath(root, doc.uri.fsPath) ?? ''; - const mine = index.refs.filter((r) => r.ref.split('#')[0] === rel && !r.ref.includes(':')); + const pr = projectFor(doc.uri.fsPath); + const scan = pr ? scanForRoot(pr.root) : undefined; + if (!pr || !scan) return []; + const rel = relPath(pr.root, doc.uri.fsPath) ?? ''; + const mine = scan.index.refs.filter((r) => r.ref.split('#')[0] === rel && !r.ref.includes(':')); if (mine.length === 0) return []; const lineFor = new Map(); @@ -534,7 +633,7 @@ export function activate(context: vscode.ExtensionContext): void { new vscode.CodeLens(new vscode.Range(line - 1, 0, line - 1, 0), { title: `docref: referenced by ${r.locations.length} location(s)`, command: 'docref.showLocations', - arguments: [r.locations] + arguments: [r.locations, pr.root] }) ); } @@ -577,9 +676,11 @@ export function activate(context: vscode.ExtensionContext): void { return [claimScaffold(range, trigLen ? before.slice(before.length - trigLen) : 'docref')]; } if (ctx.alias) return; // cross-repo file/symbol listing is not offered - const p = project(); - const root = workspaceRoot(); - if (!p || !root) return; + // the reference is completed against the markdown file's OWN governing + // project, so a multi-repo workspace offers each doc its own repo's files + const pr = projectFor(doc.uri.fsPath); + if (!pr) return; + const { project: p, root } = pr; const word = ctx.phase === 'path' ? ctx.partial.slice(ctx.partial.lastIndexOf('/') + 1) : ctx.partial; const range = new vscode.Range( @@ -589,15 +690,16 @@ export function activate(context: vscode.ExtensionContext): void { position.character ); if (ctx.phase === 'path') { - // populated by rescan; fetch once if completion fires first - if (anchorFileList.length === 0) { + // prefer the list cached by rescan; fetch once if completion fires first + let files = scanForRoot(root)?.anchorFileList ?? []; + if (files.length === 0) { try { - anchorFileList = await anchorFiles(p); + files = await anchorFiles(p); } catch { /* leave empty */ } } - return pathCompletions(anchorFileList, ctx.partial, range); + return pathCompletions(files, ctx.partial, range); } const items = await fragmentCompletions(root, ctx.path, ctx.kind, range); if (items.length > 0) return items; @@ -624,9 +726,6 @@ export function activate(context: vscode.ExtensionContext): void { const QUICK_FIX = vscode.CodeActionKind.QuickFix; const codeActionProvider: vscode.CodeActionProvider = { provideCodeActions(doc, _range, ctx) { - const root = workspaceRoot(); - if (!root) return; - const rel = relPath(root, doc.uri.fsPath) ?? ''; const actions: vscode.CodeAction[] = []; const make = ( title: string, @@ -643,13 +742,15 @@ export function activate(context: vscode.ExtensionContext): void { }; for (const diag of ctx.diagnostics) { if (diag.source !== 'docref') continue; - const info = actionableAt.get(`${rel}:${diag.range.start.line + 1}`); + // actionableAt is keyed by absolute doc path; a ref-bearing action + // carries the governing project root so it targets the right repo + const info = actionableAt.get(`${doc.uri.fsPath}:${diag.range.start.line + 1}`); const fixes = quickFixesForState(String(diag.code)); if (info?.ref && fixes.openCode) { - make('docref: Open referenced code', 'docref.openAnchor', [info.ref], diag, true); + make('docref: Open referenced code', 'docref.openAnchor', [info.ref, info.root], diag, true); } if (info?.ref && fixes.showDiff) { - make('docref: Show drift diff (approved vs current)', 'docref.showDriftForRef', [info.ref], diag); + make('docref: Show drift diff (approved vs current)', 'docref.showDriftForRef', [info.ref, info.root], diag); } if (fixes.approve) make('docref: Approve claims in this document', 'docref.approveClaims', [], diag); if (fixes.refresh) make('docref: Refresh stale snippets', 'docref.refreshSnippets', [], diag); @@ -675,10 +776,10 @@ export function activate(context: vscode.ExtensionContext): void { vscode.window.registerTreeDataProvider('docrefStaged', stageTree), vscode.commands.registerCommand('docref.stageSelection', async () => { const ref = await refFromSelection(); - if (ref) await stageAdd(ref); + if (ref) await stageAdd(ref, activeProject()); }), vscode.commands.registerCommand('docref.stageRef', async (n: SidebarNode) => { - if (n?.ref) await stageAdd(n.ref); + if (n?.ref) await stageAdd(n.ref, projectForNode(n)); }), vscode.commands.registerCommand('docref.unstage', async (n: SidebarNode) => { staged = staged.filter((s) => s.ref !== n.ref); @@ -695,8 +796,9 @@ export function activate(context: vscode.ExtensionContext): void { insertReference(n, 'snippet') ), vscode.commands.registerCommand('docref.removeEverywhere', async (n: SidebarNode) => { - const p = project(); - if (!p || !n?.ref) return; + const pr = projectForNode(n); + if (!pr || !n?.ref) return; + const p = pr.project; const marker = n.ref.includes('#@') ? ' Its marker pair is deleted from the code.' : ''; const confirmed = await vscode.window.showWarningMessage( `Delete ${n.ref} everywhere? Snippets are removed whole; claim comments are removed and the prose stays.${marker}`, @@ -744,11 +846,12 @@ export function activate(context: vscode.ExtensionContext): void { // `docref repo add`). Invoked from the palette, or from the broken-ref // quick fix prefilled with the undeclared alias. vscode.commands.registerCommand('docref.addRepository', async (prefilledAlias?: string) => { - const p = project(); - if (!p) { - void vscode.window.showWarningMessage('docref: open a workspace with a docref.toml first.'); + const pr = activeProject(); + if (!pr) { + void vscode.window.showWarningMessage('docref: open a file inside a docref project (with a docref.toml) first.'); return; } + const p = pr.project; const alias = await vscode.window.showInputBox({ title: 'docref: add repository', prompt: 'Alias for the cross-repo reference', @@ -785,9 +888,9 @@ export function activate(context: vscode.ExtensionContext): void { }), vscode.commands.registerCommand('docref.rescan', () => rescan()), vscode.commands.registerCommand('docref.refreshSnippets', async () => { - const p = project(); - if (!p) return; - const { changedDocs } = await refresh(p); + const pr = activeProject(); + if (!pr) return; + const { changedDocs } = await refresh(pr.project); void vscode.window.showInformationMessage( changedDocs.length ? `docref: refreshed ${changedDocs.join(', ')}` @@ -798,9 +901,11 @@ export function activate(context: vscode.ExtensionContext): void { vscode.workspace.registerTextDocumentContentProvider('docref-drift', driftProvider), vscode.commands.registerCommand('docref.showDrift', async () => { const editor = vscode.window.activeTextEditor; - const root = workspaceRoot(); - const rel = editor && root ? (relPath(root, editor.document.uri.fsPath) ?? undefined) : undefined; - const { opened, total } = await openDrift(rel?.endsWith('.md') ? { doc: rel } : undefined); + const pr = editor ? projectFor(editor.document.uri.fsPath) : null; + const rel = editor && pr ? (relPath(pr.root, editor.document.uri.fsPath) ?? undefined) : undefined; + const { opened, total } = await openDrift( + pr ? { ...(rel?.endsWith('.md') ? { doc: rel } : {}), root: pr.root } : undefined + ); if (opened === 0) { void vscode.window.showInformationMessage( total === 0 @@ -810,13 +915,12 @@ export function activate(context: vscode.ExtensionContext): void { } }), vscode.commands.registerCommand('docref.approveClaims', async () => { - const p = project(); const editor = vscode.window.activeTextEditor; - const root = workspaceRoot(); - if (!p || !editor || !root) return; - const rel = relPath(root, editor.document.uri.fsPath) ?? ''; + const pr = editor ? projectFor(editor.document.uri.fsPath) : null; + if (!editor || !pr) return; + const rel = relPath(pr.root, editor.document.uri.fsPath) ?? ''; // show the evidence first: one diff tab per recoverable claim - const { opened } = await openDrift({ doc: rel }); + const { opened } = await openDrift({ doc: rel, root: pr.root }); const confirmed = await vscode.window.showWarningMessage( `Approve all claims in ${rel}? Only do this after reading the claimed prose against the current code.` + (opened > 0 ? ` ${opened} drift diff(s) are open in the editor.` : ''), @@ -824,18 +928,19 @@ export function activate(context: vscode.ExtensionContext): void { 'Approve' ); if (confirmed !== 'Approve') return; - const result = await approve(p, [rel]); + const result = await approve(pr.project, [rel]); void vscode.window.showInformationMessage( `docref: approved ${result.approved} claim(s)` + (result.refused.length ? `, refused ${result.refused.length} broken` : '') ); await rescan(); }), - // Accepts a raw ref string (tree click, code action) or a sidebar node - // (right-click menu), so one command serves every entry point. - vscode.commands.registerCommand('docref.openAnchor', async (arg: string | SidebarNode) => { - const root = workspaceRoot(); + // Accepts a raw ref string + its project root (tree click, code action) or a + // sidebar node carrying its own root (right-click menu), so one command + // serves every entry point and resolves against the right repo. + vscode.commands.registerCommand('docref.openAnchor', async (arg: string | SidebarNode, rootArg?: string) => { const refRaw = typeof arg === 'string' ? arg : arg?.ref; + const root = typeof arg === 'string' ? rootArg : arg?.root; if (!root || !refRaw) return; try { const ref = parseRef(refRaw); @@ -848,7 +953,7 @@ export function activate(context: vscode.ExtensionContext): void { const anchor = await resolveAnchor(workingTreeSource(root), ref); await vscode.commands.executeCommand( 'docref.openLocation', - ref.path, + join(root, ref.path), anchor.span?.startLine ?? 1 ); } catch (e) { @@ -857,36 +962,41 @@ export function activate(context: vscode.ExtensionContext): void { }), // The approved-vs-current diff for ONE claim (from the squiggle quick fix // or a sidebar right-click), as opposed to docref.showDrift's whole-file - // sweep. Accepts a ref string or a sidebar node. - vscode.commands.registerCommand('docref.showDriftForRef', async (arg: string | SidebarNode) => { + // sweep. Accepts a ref string + root or a sidebar node. + vscode.commands.registerCommand('docref.showDriftForRef', async (arg: string | SidebarNode, rootArg?: string) => { const ref = typeof arg === 'string' ? arg : arg?.ref; + const root = typeof arg === 'string' ? rootArg : arg?.root; if (!ref) return; - const { opened } = await openDrift({ ref }); + const { opened } = await openDrift({ ref, ...(root ? { root } : {}) }); if (opened === 0) { void vscode.window.showInformationMessage( `docref: no approved-vs-current diff for ${ref} — it is not a drifted claim with a recoverable approved state.` ); } }), - vscode.commands.registerCommand('docref.openLocation', async (doc: string, line: number) => { - const root = workspaceRoot(); - if (!root) return; - const editor = await vscode.window.showTextDocument(vscode.Uri.file(`${root}/${doc}`)); + // Opens an ABSOLUTE file path; callers join the doc onto its project root. + vscode.commands.registerCommand('docref.openLocation', async (absPath: string, line: number) => { + const editor = await vscode.window.showTextDocument(vscode.Uri.file(absPath)); const pos = new vscode.Position(line - 1, 0); editor.selection = new vscode.Selection(pos, pos); editor.revealRange(new vscode.Range(pos, pos), vscode.TextEditorRevealType.InCenter); }), vscode.commands.registerCommand( 'docref.showLocations', - async (locations: { doc: string; line: number; kind: string }[]) => { + async (locations: { doc: string; line: number; kind: string }[], root: string) => { const picked = await vscode.window.showQuickPick( locations.map((l) => ({ label: `${l.doc}:${l.line}`, description: l.kind, l })), { title: 'docref: referencing locations' } ); - if (picked) await vscode.commands.executeCommand('docref.openLocation', picked.l.doc, picked.l.line); + if (picked) await vscode.commands.executeCommand('docref.openLocation', join(root, picked.l.doc), picked.l.line); } ), vscode.workspace.onDidSaveTextDocument(() => rescanSoon()), + // free a drift virtual doc when its diff tab closes, so driftDocs stays + // bounded by open diffs rather than leaking for the session + vscode.workspace.onDidCloseTextDocument((doc) => { + if (doc.uri.scheme === 'docref-drift') driftDocs.delete(doc.uri.path); + }), watcher, watcher.onDidChange(onFsEvent), watcher.onDidCreate(onFsEvent), diff --git a/packages/vscode/src/logic.test.ts b/packages/vscode/src/logic.test.ts index dde0060..b6c6453 100644 --- a/packages/vscode/src/logic.test.ts +++ b/packages/vscode/src/logic.test.ts @@ -16,6 +16,9 @@ import { buildReferencesTree, buildAnchorsTree, buildStageTree, + tagRoot, + mergeProjectTrees, + aggregateStatusText, type SidebarNode, isRelevantChange, relPath, @@ -485,6 +488,61 @@ describe('buildStageTree', () => { }); }); +describe('multi-project aggregation (issue #4)', () => { + // A multi-repo workspace scans each governing docref.toml separately; these + // pure helpers merge the per-project trees and status so one repo's view is + // unchanged and several are shown without collision, each node tagged with + // its root so actions target the right repo. + const nodesFor = (label: string): SidebarNode[] => [ + { type: 'group', id: 'all', label, mood: 'ok', children: [{ type: 'file', id: `f:${label}`, label, path: 'x.ts' }] } + ]; + + it('tagRoot stamps the root through the whole subtree', () => { + const nodes = nodesFor('a'); + tagRoot(nodes, '/repo/a'); + expect(nodes[0]!.root).toBe('/repo/a'); + expect(nodes[0]!.children![0]!.root).toBe('/repo/a'); + }); + + it('a single project passes its tree through unchanged but root-tagged', () => { + const merged = mergeProjectTrees([{ root: '/ws', nodes: nodesFor('all') }]); + expect(merged.map((n) => n.id)).toEqual(['all']); // no wrapper group + expect(merged[0]!.root).toBe('/ws'); + }); + + it('several projects nest under one group each, labeled by root, empties dropped', () => { + const merged = mergeProjectTrees([ + { root: '/ws/sdk', nodes: nodesFor('sdk') }, + { root: '/ws/docs', nodes: nodesFor('docs') }, + { root: '/ws/empty', nodes: [] } + ]); + expect(merged.map((n) => n.label)).toEqual(['sdk', 'docs']); // empty project dropped + expect(merged.map((n) => n.id)).toEqual(['project:/ws/sdk', 'project:/ws/docs']); + // each project's nodes carry that project's root, so actions hit the right repo + expect(merged[0]!.children![0]!.root).toBe('/ws/sdk'); + expect(merged[1]!.children![0]!.root).toBe('/ws/docs'); + }); + + it('aggregateStatusText sums project summaries and keeps the strictest gate', () => { + expect(aggregateStatusText([])).toBe('docref'); + // one project → identical to statusText + expect(aggregateStatusText([{ report: REPORT, level: 'strict' }])).toBe(statusText(REPORT, 'strict')); + // two projects: broken counts merge; a strict project keeps the error glyph + const advisoryClean: Report = { + entries: [], + errors: [], + unusedAnchors: [], + summary: { upToDate: 5, staleSnippet: 0, staleClaim: 0, broken: 0 } + }; + const merged = aggregateStatusText([ + { report: REPORT, level: 'strict' }, + { report: advisoryClean, level: 'advisory' } + ]); + expect(merged).toContain('$(error)'); + expect(merged).toContain('1 broken'); + }); +}); + describe('isRelevantChange', () => { // The background watcher sees every filesystem event; only changes // that can move a docref state are worth a rescan. diff --git a/packages/vscode/src/logic.ts b/packages/vscode/src/logic.ts index e9425d6..afffcca 100644 --- a/packages/vscode/src/logic.ts +++ b/packages/vscode/src/logic.ts @@ -279,6 +279,10 @@ export type SidebarNode = { path?: string; ref?: string; kind?: string; + /** The governing project root for this node, so a node action (open a doc, + * resolve a ref) targets the right repo in a multi-repo workspace. Stamped by + * the thin vscode layer after the (project-relative) tree is built. */ + root?: string; children?: SidebarNode[]; }; @@ -495,6 +499,72 @@ export function isRelevantChange( return refPaths.has(rel) || anchorFiles.has(rel); } +/** Recursively stamp a project root onto a freshly built (project-relative) + * tree, so each node action resolves against the right repo in a multi-repo + * workspace. Mutates and returns the same nodes. */ +export function tagRoot(nodes: SidebarNode[], root: string): SidebarNode[] { + for (const n of nodes) { + n.root = root; + if (n.children) tagRoot(n.children, root); + } + return nodes; +} + +/** + * Aggregate per-project sidebar trees. One project → its tree unchanged (so the + * single-repo view is exactly as before); several → each non-empty tree under a + * collapsed group labeled by the project's root, so a multi-repo workspace shows + * every repo without doc-path collisions. Every node is tagged with its root. + */ +export function mergeProjectTrees(perProject: { root: string; nodes: SidebarNode[] }[]): SidebarNode[] { + if (perProject.length === 1) return tagRoot(perProject[0]!.nodes, perProject[0]!.root); + const out: SidebarNode[] = []; + for (const { root, nodes } of perProject) { + const tagged = tagRoot(nodes, root); + if (tagged.length === 0) continue; + out.push({ + type: 'group', + id: `project:${root}`, + label: root.split(/[\\/]/).pop() || root, + description: root, + mood: 'ok', + root, + children: tagged + }); + } + return out; +} + +/** + * The one-line status across every scanned project. One project → its own status + * text unchanged; several → their summaries merged, with the strictest gate any + * project uses driving the glyph (the loudest, most honest default). + */ +export function aggregateStatusText(projects: { report: Report; level: GateLevel }[]): string { + if (projects.length === 0) return 'docref'; + if (projects.length === 1) return statusText(projects[0]!.report, projects[0]!.level); + const merged: Report = { + entries: projects.flatMap((p) => p.report.entries), + errors: projects.flatMap((p) => p.report.errors), + unusedAnchors: projects.flatMap((p) => p.report.unusedAnchors), + summary: projects.reduce( + (a, p) => ({ + upToDate: a.upToDate + p.report.summary.upToDate, + staleSnippet: a.staleSnippet + p.report.summary.staleSnippet, + staleClaim: a.staleClaim + p.report.summary.staleClaim, + broken: a.broken + p.report.summary.broken + }), + { upToDate: 0, staleSnippet: 0, staleClaim: 0, broken: 0 } + ) + }; + const level: GateLevel = projects.some((p) => p.level === 'strict') + ? 'strict' + : projects.some((p) => p.level === 'lenient') + ? 'lenient' + : 'advisory'; + return statusText(merged, level); +} + export function statusText(report: Report | null, level: GateLevel = 'strict'): string { if (!report) return 'docref'; const s = report.summary; From 3f1d523831b2a84bd6060717c3c1abc429709805 Mon Sep 17 00:00:00 2001 From: Paul Dotterer <44400894+PaulDotterer@users.noreply.github.com> Date: Sun, 5 Jul 2026 20:46:31 +0200 Subject: [PATCH 3/8] ci(open-review): mark /repo safe so containerized git can diff MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit open-review runs its `git diff origin/main...HEAD` inside the container as root over the runner-owned checkout. git's dubious-ownership guard then rejects the mount ("Not a git repository. Use --no-index"), so the reviewer crashes with exit 2 before it can review — gating every PR. Pass safe.directory=/repo via GIT_CONFIG_* env on the docker run, which applies to every git call inside the container without a config file. Reproduced the crash and verified the fix locally against the published image (static scan then runs clean: 0 findings across the changed files). The dogfood job doesn't hit this because `docref check` tolerates git failing (it falls back to a glob); open-review hard-fails on the diff. --- .github/workflows/open-review.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/open-review.yml b/.github/workflows/open-review.yml index 0d393d1..e89b876 100644 --- a/.github/workflows/open-review.yml +++ b/.github/workflows/open-review.yml @@ -39,9 +39,14 @@ jobs: OR_LLM_API_KEY: ${{ secrets.OR_LLM_API_KEY }} GH_TOKEN: ${{ github.token }} run: | + # The container's git runs as root over the runner-owned checkout, so + # git's dubious-ownership guard rejects it ("Not a git repository") and + # open-review crashes before it can diff. Mark /repo safe via GIT_CONFIG_* + # env (applies to every git call inside the container, no config file). docker run --rm --env-file or.env \ -e OR_LLM_API_KEY -e GITHUB_TOKEN="$GH_TOKEN" \ -e GITHUB_ACTIONS=true -e GITHUB_BASE_REF="${{ github.base_ref }}" \ + -e GIT_CONFIG_COUNT=1 -e GIT_CONFIG_KEY_0=safe.directory -e GIT_CONFIG_VALUE_0=/repo \ -v "$PWD":/repo -w /repo \ ghcr.io/manchtools/open-review:latest run # gate, sarif, provider pin, --emit-* etc. all come from OR_* env — no flags here. From 17c4e67968faf66a4fe7227a6f9a37e1c7dd0f3a Mon Sep 17 00:00:00 2001 From: Paul Dotterer <44400894+PaulDotterer@users.noreply.github.com> Date: Sun, 5 Jul 2026 21:02:20 +0200 Subject: [PATCH 4/8] fix: address open-review findings on the PR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - vscode onFsEvent (WARNING, gating): the watcher's per-project match used `uri.fsPath.startsWith(s.root + '/')` with a hardcoded '/', so on Windows (backslash fsPaths) it always skipped and never rescanned on source/doc changes — only on-save and config events worked. Drop the buggy manual guard and rely on relPath, which normalizes separators and returns null outside root (the codebase's Windows-safe pattern, already unit-tested). - ops.update (NOTE): it advanced project.lock in-memory before refresh but, unlike addRepo's project.repos rollback, did not restore it if refresh threw — leaving a reused Project advanced past disk. Add the symmetric rollback, with a regression test (red-checked) that forces refresh to fail mid-update and asserts both the in-memory and on-disk lock are intact. The one discarded finding (tagRoot in-place mutation) was correctly dropped by the judge as speculative — the docstring documents the mutation and all callers pass freshly-built trees. --- .../03-tooling/01-cli/03-cross-repo-update.md | 2 +- packages/core/src/ops.test.ts | 28 ++++++++++++++++++- packages/core/src/ops.ts | 21 ++++++++++++-- packages/vscode/src/extension.ts | 9 ++++-- 4 files changed, 52 insertions(+), 8 deletions(-) diff --git a/docs/03-tooling/01-cli/03-cross-repo-update.md b/docs/03-tooling/01-cli/03-cross-repo-update.md index ee9ee67..5e01953 100644 --- a/docs/03-tooling/01-cli/03-cross-repo-update.md +++ b/docs/03-tooling/01-cli/03-cross-repo-update.md @@ -7,7 +7,7 @@ description: Advance cross-repo pins in docref.lock to a tracked branch's tip, r ## `docref update [alias...] [--check]` - + For each alias (default: all): fetch the tracked branch, advance `docref.lock` to its tip, refresh all snippets referencing the alias, and report every claim that became `stale-claim` under the new rev. diff --git a/packages/core/src/ops.test.ts b/packages/core/src/ops.test.ts index 24736a8..0890986 100644 --- a/packages/core/src/ops.test.ts +++ b/packages/core/src/ops.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect, beforeAll, afterAll } from 'vitest'; -import { existsSync, rmSync } from 'node:fs'; +import { existsSync, rmSync, chmodSync } from 'node:fs'; import { join } from 'node:path'; import { loadProject } from './config'; import { check, refresh, approve, update, addRepo, affected, ls, anchors, diff, remove, exitCode, exitCodeFor, suggest, type Report } from './ops'; @@ -866,6 +866,32 @@ describe('cross-repo: lock, update, pinned resolution', () => { expect(u2.report.summary.staleSnippet).toBe(0); }); + it('restores the in-memory lock when refresh fails mid-update', async () => { + // update advances project.lock in-memory before refresh and persists only + // after; if refresh throws, the on-disk lock stays put AND the in-memory + // lock is rolled back, so a reused Project is never left advanced past disk. + const { remote, root } = remoteFixture(); + await update(loadProject(root)); // establish a prior locked rev + const p = loadProject(root); + const priorRev = p.lock.lib!.rev; + const lockOnDisk = read(root, 'docref.lock'); + + // the remote moves, so the next update wants to refresh the snippet + write(remote, 'src/handler.go', 'package api\n\nfunc Verify() { /* v2 */ }\n'); + commitAll(remote, 'v2'); + // make the doc unwritable so refresh's writeFileSync throws mid-update + chmodSync(join(root, 'docs/x.md'), 0o444); + try { + await expect(update(p)).rejects.toThrow(); + // in-memory lock rolled back to the prior rev, not the new tip + expect(p.lock.lib!.rev).toBe(priorRev); + // and the on-disk lock was never advanced + expect(read(root, 'docref.lock')).toBe(lockOnDisk); + } finally { + chmodSync(join(root, 'docs/x.md'), 0o644); + } + }); + it('fails closed at load on a poisoned lock rev instead of running git on it', () => { const { remote, root } = remoteFixture(); // a malicious PR could ship a docref.lock whose rev is a git option; diff --git a/packages/core/src/ops.ts b/packages/core/src/ops.ts index b937c92..dacf7bd 100644 --- a/packages/core/src/ops.ts +++ b/packages/core/src/ops.ts @@ -444,9 +444,24 @@ export async function update( // Advance the lock in-memory and refresh snippets against the new revs // FIRST; persist the lock only once refresh succeeds, so a refresh failure // (IO error, or a resolve throw) never leaves docref.lock advanced past - // documents that still hold the old content. - for (const [alias, rev] of Object.entries(overrides)) project.lock[alias] = { rev }; - const { report } = await refresh(project); + // documents that still hold the old content. On failure, restore the prior + // in-memory lock too, so a reused Project is not left advanced past disk + // (symmetry with addRepo's project.repos rollback). + const priorLock = new Map(); + for (const [alias, rev] of Object.entries(overrides)) { + priorLock.set(alias, project.lock[alias]); + project.lock[alias] = { rev }; + } + let report: Report; + try { + report = (await refresh(project)).report; + } catch (e) { + for (const [alias, prev] of priorLock) { + if (prev) project.lock[alias] = prev; + else delete project.lock[alias]; + } + throw e; + } writeLock(project); return { changed, report }; } diff --git a/packages/vscode/src/extension.ts b/packages/vscode/src/extension.ts index e04dcdc..242be14 100644 --- a/packages/vscode/src/extension.ts +++ b/packages/vscode/src/extension.ts @@ -483,11 +483,14 @@ export function activate(context: vscode.ExtensionContext): void { rescanSoon(); return; } - // otherwise, relevant only if it belongs to a known project's scan set + // otherwise, relevant only if it belongs to a known project's scan set. + // relPath does the containment check AND separator normalization (\\ -> /) + // and returns null when the path is outside root — so it is Windows-correct + // where a hand-rolled `startsWith(root + '/')` guard would wrongly skip + // every event on Windows (fsPath uses backslashes). for (const s of scans) { - if (uri.fsPath !== s.root && !uri.fsPath.startsWith(s.root + '/')) continue; const rel = relPath(s.root, uri.fsPath); - if (rel !== null && isRelevantChange(rel, s.refPaths, s.anchorFileSet)) { + if (rel !== null && rel !== '' && isRelevantChange(rel, s.refPaths, s.anchorFileSet)) { rescanSoon(); return; } From b8c521f84c2abac7b3dbb4c5bed57b7805249088 Mon Sep 17 00:00:00 2001 From: Paul Dotterer <44400894+PaulDotterer@users.noreply.github.com> Date: Mon, 6 Jul 2026 07:27:33 +0200 Subject: [PATCH 5/8] refactor(core): async stat in docFiles/anchors (open-review note) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit open-review flagged the synchronous statSync inside async docFiles as event-loop-blocking. Swap both statSync sites (docFiles and anchors) for `stat` from node:fs/promises; the anchors loop now does one stat per file instead of two. Pure internal change — no behavioral difference — so the anchors claim prose is re-approved unchanged. --- README.md | 2 +- docs/01-getting-started/01-introduction.md | 2 +- docs/03-tooling/01-cli/05-ls-and-anchors.md | 2 +- packages/core/src/ops.ts | 8 +++++--- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index c59a837..ad2471b 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ source with `docref: begin ` / `docref: end `, for sub-symbol slices and languages without addressable symbols, such as CSS). The code side has its own loud signal, not just the docs: - + `docref anchors` inventories every region marker and what references it, and a marker that nothing references is flagged **not used** — which fails `docref check` unless `[anchors] allow-unused = true`. A stranded marker, like a broken diff --git a/docs/01-getting-started/01-introduction.md b/docs/01-getting-started/01-introduction.md index eeca5ad..ae977fa 100644 --- a/docs/01-getting-started/01-introduction.md +++ b/docs/01-getting-started/01-introduction.md @@ -48,7 +48,7 @@ no marker needed) or a **region** (a span named in the source with `docref: begin ` / `docref: end `, for sub-symbol slices). The code side has its own loud signal, not just the docs: - + `docref anchors` inventories every region marker and what references it, and a marker that nothing references is flagged **not used**, which fails `docref check` unless `[anchors] allow-unused = true`. A stranded marker, like a diff --git a/docs/03-tooling/01-cli/05-ls-and-anchors.md b/docs/03-tooling/01-cli/05-ls-and-anchors.md index 5277971..bf821b2 100644 --- a/docs/03-tooling/01-cli/05-ls-and-anchors.md +++ b/docs/03-tooling/01-cli/05-ls-and-anchors.md @@ -15,7 +15,7 @@ Dump the reverse index: every referenced anchor and everything referencing it. T ## `docref anchors [--json]` - + The code-side inventory, the reverse of `ls`: scan the source tree for every declared region marker and list each with the references to it; an anchor with none is flagged **not used**. Marker errors (duplicate names, unmatched begin/end) surface here even in files nothing references, which `check` alone would never visit. Exit `2` on marker errors, `0` otherwise (an unused anchor is information, not a failure). diff --git a/packages/core/src/ops.ts b/packages/core/src/ops.ts index dacf7bd..b7bcf0a 100644 --- a/packages/core/src/ops.ts +++ b/packages/core/src/ops.ts @@ -3,7 +3,8 @@ // out of stale-snippet on its own (refresh), and never moves anything out // of stale-claim (approve is explicit) or broken (author intervention). import { execFileSync } from 'node:child_process'; -import { readFileSync, statSync, writeFileSync } from 'node:fs'; +import { readFileSync, writeFileSync } from 'node:fs'; +import { stat } from 'node:fs/promises'; import { join } from 'node:path'; import { glob } from 'tinyglobby'; import type { Project, GateLevel } from './config'; @@ -134,7 +135,7 @@ async function docFiles(project: Project, paths?: string[]): Promise { for (const p of paths) { let isDir = false; try { - isDir = statSync(join(project.root, p)).isDirectory(); + isDir = (await stat(join(project.root, p))).isDirectory(); } catch { // not on disk: keep it so the read reports a clear ENOENT, not a drop } @@ -889,7 +890,8 @@ export async function anchors(project: Project): Promise { const abs = join(project.root, file); let text: string; try { - if (!statSync(abs).isFile() || statSync(abs).size > 2_000_000) continue; + const st = await stat(abs); // one stat, not two; async so the loop never blocks the event loop + if (!st.isFile() || st.size > 2_000_000) continue; text = readFileSync(abs, 'utf8'); } catch { continue; From 3203fafc166d68fcbae38acde154eafa9b29063b Mon Sep 17 00:00:00 2001 From: Paul Dotterer <44400894+PaulDotterer@users.noreply.github.com> Date: Mon, 6 Jul 2026 07:57:08 +0200 Subject: [PATCH 6/8] fix(core): close partial-failure windows in update/addRepo (open-review) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit open-review flagged two write-ordering gaps in the earlier rollback work: - update(): writeLock ran outside the try/catch, so a lock-write failure (disk full) left the in-memory lock advanced while the file stayed old. Move writeLock inside the guarded region — on failure the in-memory lock is rolled back to match the unwritten file. - addRepo(): appendRepoBlock ran after the lock-writing update, so an appendRepoBlock failure left a lock entry with no toml declaration. Reorder to: checkOnly update (reachability, no writes) → append the toml block → real update (lock + refresh). A failure now persists nothing, or at worst leaves a declared-but-unlocked alias (recoverable via update), never a lock without its declaration. Also reworded the docFiles stat-catch comment: it swallows any stat error (missing / permission / symlink), not only ENOENT, so it no longer claims the downstream read always reports ENOENT. --- .../03-tooling/01-cli/03-cross-repo-update.md | 2 +- packages/core/src/ops.ts | 30 +++++++++++++------ 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/docs/03-tooling/01-cli/03-cross-repo-update.md b/docs/03-tooling/01-cli/03-cross-repo-update.md index 5e01953..b572680 100644 --- a/docs/03-tooling/01-cli/03-cross-repo-update.md +++ b/docs/03-tooling/01-cli/03-cross-repo-update.md @@ -7,7 +7,7 @@ description: Advance cross-repo pins in docref.lock to a tracked branch's tip, r ## `docref update [alias...] [--check]` - + For each alias (default: all): fetch the tracked branch, advance `docref.lock` to its tip, refresh all snippets referencing the alias, and report every claim that became `stale-claim` under the new rev. diff --git a/packages/core/src/ops.ts b/packages/core/src/ops.ts index b7bcf0a..c1e21c4 100644 --- a/packages/core/src/ops.ts +++ b/packages/core/src/ops.ts @@ -137,7 +137,8 @@ async function docFiles(project: Project, paths?: string[]): Promise { try { isDir = (await stat(join(project.root, p))).isDirectory(); } catch { - // not on disk: keep it so the read reports a clear ENOENT, not a drop + // stat failed (missing path, or a permission/symlink error): keep the arg + // so the downstream read surfaces the real error, not a silent drop } if (isDir) { scanned ??= await scannedDocs(project); @@ -453,9 +454,15 @@ export async function update( priorLock.set(alias, project.lock[alias]); project.lock[alias] = { rev }; } + // writeLock is inside the guarded region too: if persisting the lock fails + // (disk full, permissions) the in-memory lock is rolled back to match the + // unchanged file, so in-memory and on-disk never disagree. (The refreshed + // docs remain on disk, but that is visible, recoverable drift — check flags + // it, and re-running update is idempotent.) let report: Report; try { report = (await refresh(project)).report; + writeLock(project); } catch (e) { for (const [alias, prev] of priorLock) { if (prev) project.lock[alias] = prev; @@ -463,7 +470,6 @@ export async function update( } throw e; } - writeLock(project); return { changed, report }; } @@ -491,19 +497,25 @@ export async function addRepo( assertUrl(url); if (ref !== undefined) assertRef(ref); - // Reflect the alias in-memory so update() sees it, then fetch+lock its tip - // BEFORE persisting anything. update() throws (unreachable remote, bad ref) - // prior to any disk write, so an unfetchable repo never leaves a dangling - // [repos.] block in docref.toml. Roll the in-memory mutation back on - // failure in case the caller reuses the Project. Persist the toml block last. + // Reflect the alias in-memory so update() sees it. Order the persistence so no + // two-file inconsistency can survive a failure: + // 1. checkOnly update — fetch the tip to prove the remote is reachable, + // WITHOUT writing anything (an unfetchable repo throws here, before any + // file is touched); + // 2. append the [repos.] block to docref.toml; + // 3. real update — write the lock and refresh. + // A failure in 1 or 2 rolls the in-memory alias back and persists nothing. A + // failure in 3 leaves a declared-but-unlocked alias (recoverable via + // `docref update`), never a lock entry with no toml declaration. project.repos[alias] = { url, ...(ref ? { ref } : {}) }; try { - await update(project, { aliases: [alias] }); + await update(project, { aliases: [alias], checkOnly: true }); + appendRepoBlock(project.root, alias, url, ref); } catch (e) { delete project.repos[alias]; throw e; } - appendRepoBlock(project.root, alias, url, ref); + await update(project, { aliases: [alias] }); return { alias, url, ...(ref ? { ref } : {}), rev: project.lock[alias]!.rev }; } From a0bdbebaa41b4a51075f54b983bbf795d70ed2f9 Mon Sep 17 00:00:00 2001 From: Paul Dotterer <44400894+PaulDotterer@users.noreply.github.com> Date: Mon, 6 Jul 2026 08:24:22 +0200 Subject: [PATCH 7/8] fix(vscode): openAnchor falls back to the active project for rootless nodes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Regression from the multi-repo refactor: staged sidebar items (buildStageTree) carry no `root`, so clicking one called openAnchor(ref, undefined) and the new `if (!root || !refRaw) return` guard silently did nothing — where the old code used workspaceRoot(). Fall back to the active editor's project when no root is supplied, matching how the other staged-item actions resolve via projectForNode. open-review surfaced this but its cascade discarded it on a wrong-line-number technicality; re-verifying against the actual code confirmed the regression is real, so fixing it despite the discard. --- packages/vscode/src/extension.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/vscode/src/extension.ts b/packages/vscode/src/extension.ts index 242be14..9a7e1d7 100644 --- a/packages/vscode/src/extension.ts +++ b/packages/vscode/src/extension.ts @@ -940,10 +940,12 @@ export function activate(context: vscode.ExtensionContext): void { }), // Accepts a raw ref string + its project root (tree click, code action) or a // sidebar node carrying its own root (right-click menu), so one command - // serves every entry point and resolves against the right repo. + // serves every entry point and resolves against the right repo. Staged + // nodes carry no root, so fall back to the active editor's project (as the + // other staged-item actions do via projectForNode) rather than no-op. vscode.commands.registerCommand('docref.openAnchor', async (arg: string | SidebarNode, rootArg?: string) => { const refRaw = typeof arg === 'string' ? arg : arg?.ref; - const root = typeof arg === 'string' ? rootArg : arg?.root; + const root = (typeof arg === 'string' ? rootArg : arg?.root) ?? activeProject()?.root; if (!root || !refRaw) return; try { const ref = parseRef(refRaw); From 54bf0b93a8833e43252d28c1abb1d230cabb6228 Mon Sep 17 00:00:00 2001 From: Paul Dotterer <44400894+PaulDotterer@users.noreply.github.com> Date: Mon, 6 Jul 2026 08:36:37 +0200 Subject: [PATCH 8/8] fix(core): normalize separators in docFiles directory prefix (Windows) The issue #2 directory-scoping built its match prefix from the raw CLI arg, but scanned docs are POSIX paths (tinyglobby). On Windows a `content\dir` argument would match nothing and the directory would silently expand to an empty set (exit 0, looking like a clean pass). Normalize the arg's backslashes to forward slashes before building the prefix. Surfaced (then discarded as low-risk) by open-review; it's the same hardcoded-'/' vs Windows-'\' class as the onFsEvent fix, in a feature this PR adds, so hardening it is in-scope. --- packages/core/src/ops.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/core/src/ops.ts b/packages/core/src/ops.ts index c1e21c4..e8ea990 100644 --- a/packages/core/src/ops.ts +++ b/packages/core/src/ops.ts @@ -142,7 +142,10 @@ async function docFiles(project: Project, paths?: string[]): Promise { } if (isDir) { scanned ??= await scannedDocs(project); - const prefix = p.replace(/\/+$/, '') + '/'; + // scanned paths are POSIX (tinyglobby forward slashes); normalize the + // arg's separators too so a Windows `content\dir` still matches instead + // of silently expanding to nothing + const prefix = p.replace(/\\/g, '/').replace(/\/+$/, '') + '/'; for (const f of scanned) if (f.startsWith(prefix)) out.add(f); } else { out.add(p);