From 1c36a0f5175f83491efd2054a90a698b83f9a20b Mon Sep 17 00:00:00 2001 From: Matthew Goodwin Date: Thu, 29 Oct 2026 22:32:09 -0500 Subject: [PATCH 1/3] private: add lock/unlock script for an encrypted dev archive Co-Authored-By: Claude Opus 5.5 --- .gitignore | 2 + bunfig.toml | 5 +- private/README.md | 12 +++++ scripts/private.test.ts | 107 ++++++++++++++++++++++++++++++++++++++++ scripts/private.ts | 98 ++++++++++++++++++++++++++++++++++++ 5 files changed, 222 insertions(+), 2 deletions(-) create mode 100644 private/README.md create mode 100644 scripts/private.test.ts create mode 100644 scripts/private.ts diff --git a/.gitignore b/.gitignore index 452a14e..f262119 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,5 @@ packages/zed/extension.toml packages/zed/extension.wasm packages/zed/grammars/ packages/zed/target/ +private/dev/ +private/dev.tar.age.partial diff --git a/bunfig.toml b/bunfig.toml index 4e99371..1b6d7b1 100644 --- a/bunfig.toml +++ b/bunfig.toml @@ -1,3 +1,4 @@ [test] -# Zed clones the whole repository here when the dev extension is installed. -pathIgnorePatterns = ["packages/zed/grammars/**"] +# Zed clones the whole repository into packages/zed/grammars when the dev extension is installed. +# private/dev holds unlocked material whose tests need their own setup. +pathIgnorePatterns = ["packages/zed/grammars/**", "private/**"] diff --git a/private/README.md b/private/README.md new file mode 100644 index 0000000..cff6343 --- /dev/null +++ b/private/README.md @@ -0,0 +1,12 @@ +# private + +Development material that is not public. It lives here as one encrypted archive, `dev.tar.age`. + +```sh +bun scripts/private.ts unlock # decrypt dev.tar.age into private/dev/ +bun scripts/private.ts lock # encrypt private/dev/ back into dev.tar.age +``` + +`unlock` refuses to write into a non-empty `private/dev/`; pass `--force` to overwrite it. + +`private/dev/` is ignored by git, so only the archive is committed. Run `lock` and commit `dev.tar.age` after changing anything under `private/dev/`. diff --git a/scripts/private.test.ts b/scripts/private.test.ts new file mode 100644 index 0000000..08358df --- /dev/null +++ b/scripts/private.test.ts @@ -0,0 +1,107 @@ +import { afterEach, beforeEach, expect, test } from "bun:test"; +import { spawnSync } from "node:child_process"; +import { mkdirSync, mkdtempSync, readdirSync, readFileSync, rmSync, statSync, writeFileSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join, relative } from "node:path"; + +const script = join(import.meta.dir, "private.ts"); +let scratch: string; +let identityFile: string; + +beforeEach(() => { + scratch = mkdtempSync(join(tmpdir(), "lore-private-test-")); + identityFile = join(scratch, "identity.txt"); + const keygen = spawnSync("age-keygen", ["-o", identityFile], { encoding: "utf8" }); + if (keygen.status !== 0) throw new Error(`age-keygen failed: ${keygen.stderr}`); +}); + +afterEach(() => { + rmSync(scratch, { recursive: true, force: true }); +}); + +function privateCli(root: string, ...args: string[]) { + return spawnSync("bun", [script, ...args], { + encoding: "utf8", + env: { ...process.env, LORE_PRIVATE_ROOT: root, LORE_PRIVATE_IDENTITY_FILE: identityFile }, + }); +} + +function makeRoot(name: string): string { + const root = join(scratch, name); + mkdirSync(join(root, "private"), { recursive: true }); + return root; +} + +function snapshot(dir: string): Record { + const files: Record = {}; + const walk = (current: string) => { + for (const entry of readdirSync(current)) { + const path = join(current, entry); + if (statSync(path).isDirectory()) walk(path); + else files[relative(dir, path)] = readFileSync(path, "utf8"); + } + }; + walk(dir); + return files; +} + +test("lock then unlock into a fresh root restores the tree and skips .DS_Store and node_modules", () => { + const source = makeRoot("source"); + const dev = join(source, "private", "dev"); + mkdirSync(join(dev, "notes", "deep"), { recursive: true }); + mkdirSync(join(dev, "node_modules", "pkg"), { recursive: true }); + writeFileSync(join(dev, "top.md"), "top\n"); + writeFileSync(join(dev, "notes", "deep", "a.json"), "{\"a\":1}\n"); + writeFileSync(join(dev, ".DS_Store"), "junk"); + writeFileSync(join(dev, "node_modules", "pkg", "index.js"), "junk"); + + const locked = privateCli(source, "lock"); + expect(locked.stderr).toBe(""); + expect(locked.status).toBe(0); + expect(locked.stdout).toContain("KiB"); + + const target = makeRoot("target"); + writeFileSync(join(target, "private", "dev.tar.age"), readFileSync(join(source, "private", "dev.tar.age"))); + const unlocked = privateCli(target, "unlock"); + expect(unlocked.stderr).toBe(""); + expect(unlocked.status).toBe(0); + + expect(snapshot(join(target, "private", "dev"))).toEqual({ + "top.md": "top\n", + "notes/deep/a.json": "{\"a\":1}\n", + }); +}); + +test("lock refuses an empty dev folder", () => { + const root = makeRoot("empty"); + mkdirSync(join(root, "private", "dev")); + const result = privateCli(root, "lock"); + expect(result.status).toBe(1); + expect(result.stderr).toContain("nothing to lock"); +}); + +test("unlock refuses a non-empty dev folder unless --force", () => { + const root = makeRoot("busy"); + const dev = join(root, "private", "dev"); + mkdirSync(dev); + writeFileSync(join(dev, "kept.md"), "original\n"); + expect(privateCli(root, "lock").status).toBe(0); + writeFileSync(join(dev, "kept.md"), "edited\n"); + + const refused = privateCli(root, "unlock"); + expect(refused.status).toBe(1); + expect(refused.stderr).toContain("pass --force"); + expect(readFileSync(join(dev, "kept.md"), "utf8")).toBe("edited\n"); + + const forced = privateCli(root, "unlock", "--force"); + expect(forced.status).toBe(0); + expect(readFileSync(join(dev, "kept.md"), "utf8")).toBe("original\n"); +}); + +test("unlock fails with one line when there is no archive", () => { + const root = makeRoot("bare"); + const result = privateCli(root, "unlock"); + expect(result.status).toBe(1); + expect(result.stderr.trim().split("\n")).toHaveLength(1); + expect(result.stderr).toContain("no archive"); +}); diff --git a/scripts/private.ts b/scripts/private.ts new file mode 100644 index 0000000..733783b --- /dev/null +++ b/scripts/private.ts @@ -0,0 +1,98 @@ +import { spawnSync } from "node:child_process"; +import { chmodSync, existsSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; + +const root = process.env.LORE_PRIVATE_ROOT ?? join(import.meta.dir, ".."); +const devDir = join(root, "private", "dev"); +const archive = join(root, "private", "dev.tar.age"); + +class Failure extends Error {} + +function run(command: string, args: string[], options: { input?: string; env?: NodeJS.ProcessEnv } = {}): string { + const result = spawnSync(command, args, { + input: options.input, + env: options.env ?? process.env, + encoding: "utf8", + maxBuffer: 64 * 1024 * 1024, + }); + if (result.error) { + if ((result.error as NodeJS.ErrnoException).code === "ENOENT") throw new Failure(`${command} is not installed or not on PATH`); + throw new Failure(`${command} failed: ${result.error.message}`); + } + if (result.status !== 0) { + const reason = result.stderr.trim().split("\n")[0] || `exit ${result.status}`; + throw new Failure(`${command} failed: ${reason}`); + } + return result.stdout; +} + +function readIdentity(): string { + const file = process.env.LORE_PRIVATE_IDENTITY_FILE; + if (file) { + if (!existsSync(file)) throw new Failure(`identity file not found: ${file}`); + return readFileSync(file, "utf8"); + } + const result = spawnSync("security", ["find-generic-password", "-a", "mattstack", "-s", "mattstack-age-key", "-w"], { encoding: "utf8" }); + if (result.error || result.status !== 0 || result.stdout.trim() === "") { + throw new Failure("keychain item mattstack-age-key (account mattstack) not found"); + } + return result.stdout.trim() + "\n"; +} + +function isEmptyDir(path: string): boolean { + return !existsSync(path) || (statSync(path).isDirectory() && readdirSync(path).length === 0); +} + +function withScratch(body: (scratch: string) => T): T { + const scratch = mkdtempSync(join(tmpdir(), "lore-private-")); + try { + return body(scratch); + } finally { + rmSync(scratch, { recursive: true, force: true }); + } +} + +function lock(): void { + if (isEmptyDir(devDir)) throw new Failure(`nothing to lock: ${devDir} is missing or empty`); + const recipient = run("age-keygen", ["-y"], { input: readIdentity() }).trim(); + withScratch((scratch) => { + const tarball = join(scratch, "dev.tar.gz"); + run("tar", ["-czf", tarball, "--exclude", ".DS_Store", "--exclude", "node_modules", "-C", devDir, "."], { + env: { ...process.env, COPYFILE_DISABLE: "1" }, + }); + const pending = `${archive}.partial`; + run("age", ["-r", recipient, "-o", pending, tarball]); + renameSync(pending, archive); + }); + const kib = (statSync(archive).size / 1024).toFixed(1); + console.log(`Locked ${devDir} into ${archive} (${kib} KiB).`); +} + +function unlock(force: boolean): void { + if (!existsSync(archive)) throw new Failure(`no archive at ${archive}`); + if (!isEmptyDir(devDir) && !force) throw new Failure(`${devDir} is not empty; pass --force to overwrite it`); + const identity = readIdentity(); + withScratch((scratch) => { + const identityFile = join(scratch, "identity"); + writeFileSync(identityFile, identity, { mode: 0o600 }); + chmodSync(identityFile, 0o600); + const tarball = join(scratch, "dev.tar.gz"); + run("age", ["-d", "-i", identityFile, "-o", tarball, archive]); + rmSync(identityFile, { force: true }); + mkdirSync(devDir, { recursive: true }); + run("tar", ["-xzf", tarball, "-C", devDir]); + }); + console.log(`Unlocked ${archive} into ${devDir}.`); +} + +const [command, ...flags] = process.argv.slice(2); +try { + if (command === "lock") lock(); + else if (command === "unlock") unlock(flags.includes("--force")); + else throw new Failure("usage: bun scripts/private.ts lock|unlock [--force]"); +} catch (error) { + const reason = error instanceof Failure ? error.message : String(error); + console.error(`private: ${reason}`); + process.exit(1); +} From 82e585d4e838fcd79b1f092e3af0b3b24723c75a Mon Sep 17 00:00:00 2001 From: Matthew Goodwin Date: Thu, 29 Oct 2026 22:33:47 -0500 Subject: [PATCH 2/3] private: add encrypted dev archive Co-Authored-By: Claude Opus 5.5 --- private/dev.tar.age | Bin 0 -> 67138 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 private/dev.tar.age diff --git a/private/dev.tar.age b/private/dev.tar.age new file mode 100644 index 0000000000000000000000000000000000000000..192a488bdeb47678093c22cadf215ed4de13d976 GIT binary patch literal 67138 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 literal 0 HcmV?d00001 From f235258c7648e9fb6802f2d14a5af75cb7bd0edd Mon Sep 17 00:00:00 2001 From: Matthew Goodwin Date: Fri, 30 Oct 2026 10:03:20 -0500 Subject: [PATCH 3/3] private: refuse a lock that would archive nothing; install age in CI Co-Authored-By: Claude Fable 5.1 --- .github/workflows/ci.yml | 1 + scripts/private.test.ts | 20 ++++++++++++++++++++ scripts/private.ts | 4 ++++ 3 files changed, 25 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 738b388..630cd99 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,6 +26,7 @@ jobs: run: git diff --exit-code -- packages/tree-sitter-lore/src test/fixtures - run: bun run build - run: bunx tsc --noEmit + - run: sudo apt-get install -y --no-install-recommends age - run: bun test - uses: actions/setup-node@v4 with: diff --git a/scripts/private.test.ts b/scripts/private.test.ts index 08358df..5e2ede4 100644 --- a/scripts/private.test.ts +++ b/scripts/private.test.ts @@ -80,6 +80,26 @@ test("lock refuses an empty dev folder", () => { expect(result.stderr).toContain("nothing to lock"); }); +test("lock refuses a dev folder that holds only excluded entries and keeps the old archive", () => { + const root = makeRoot("junk"); + const dev = join(root, "private", "dev"); + mkdirSync(dev); + writeFileSync(join(dev, "real.md"), "real\n"); + expect(privateCli(root, "lock").status).toBe(0); + const before = readFileSync(join(root, "private", "dev.tar.age")); + + rmSync(join(dev, "real.md")); + mkdirSync(join(dev, "node_modules", "pkg"), { recursive: true }); + writeFileSync(join(dev, ".DS_Store"), "junk"); + writeFileSync(join(dev, "node_modules", "pkg", "index.js"), "junk"); + + const result = privateCli(root, "lock"); + expect(result.status).toBe(1); + expect(result.stderr).toContain("nothing to lock"); + expect(readFileSync(join(root, "private", "dev.tar.age")).equals(before)).toBe(true); + expect(readdirSync(join(root, "private")).sort()).toEqual(["dev", "dev.tar.age"]); +}); + test("unlock refuses a non-empty dev folder unless --force", () => { const root = makeRoot("busy"); const dev = join(root, "private", "dev"); diff --git a/scripts/private.ts b/scripts/private.ts index 733783b..0d1d324 100644 --- a/scripts/private.ts +++ b/scripts/private.ts @@ -61,6 +61,10 @@ function lock(): void { run("tar", ["-czf", tarball, "--exclude", ".DS_Store", "--exclude", "node_modules", "-C", devDir, "."], { env: { ...process.env, COPYFILE_DISABLE: "1" }, }); + const entries = run("tar", ["-tzf", tarball]).split("\n"); + if (!entries.some((entry) => entry !== "" && !entry.endsWith("/"))) { + throw new Failure(`nothing to lock: ${devDir} holds only excluded entries`); + } const pending = `${archive}.partial`; run("age", ["-r", recipient, "-o", pending, tarball]); renameSync(pending, archive);