@vaubaan/harness 1.3.2 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/cli/index.js +1275 -1152
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.js +763 -659
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +29 -6
- package/dist/init.js +1113 -471
- package/dist/init.js.map +1 -1
- package/dist/render.d.ts +1 -1
- package/package.json +1 -1
- package/dist/{render-B9_kNtQc.d.ts → render-Cu2XrkkY.d.ts} +3 -3
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/index.ts","../../src/linters/util.ts","../../src/linters/adr-no-tracks.ts","../../src/linters/cardinal-files.ts","../../src/linters/config.ts","../../src/linters/cross-links.ts","../../src/linters/decision-schema.ts","../../src/linters/doc-layout.ts","../../src/linters/frontmatter-tracks.ts","../../src/linters/gitignore-harness.ts","../../src/linters/orphan-decisions.ts","../../src/linters/quality-schema.ts","../../src/linters/readme-presence.ts","../../src/linters/readme-sections.ts","../../src/linters/spec-has-content.ts","../../src/linters/spec-tech-agnostic.ts","../../src/linters/tracks-drift.ts","../../src/linters/index.ts","../../src/version.ts","../../src/cli/check.ts","../../src/cli/init.ts","../../src/loader.ts","../../src/parser/common.ts","../../src/parser/schemas.ts","../../src/types.ts","../../src/parser/agent.ts","../../src/parser/cmd.ts","../../src/parser/skill.ts","../../src/util/yaml.ts","../../src/mcp.ts","../../src/renderers/common.ts","../../src/renderers/claude-code.ts","../../src/renderers/codex-cli.ts","../../src/renderers/opencode.ts","../../src/renderers/index.ts","../../src/render.ts","../../src/cli/managed-paths.ts","../../src/cli/manifest.ts","../../src/cli/opencode-config.ts","../../src/cli/update-config.ts","../../src/cli/uninstall.ts","../../src/cli/render.ts","../../src/cli/stop-hook.ts","../../src/stop-hook/adapters/claude.ts","../../src/stop-hook/adapters/codex.ts","../../src/stop-hook/adapters/opencode.ts","../../src/stop-hook/adapters/index.ts","../../src/stop-hook/core.ts","../../src/stop-hook/state.ts","../../src/stop-hook/types.ts","../../src/cli/update.ts","../../src/cli/update-manifest.ts","../../src/cli/update-transaction.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { Command } from \"commander\";\nimport { formatReportText, runLinters } from \"../linters/index.js\";\nimport { VERSION } from \"../version.js\";\nimport { checkCommand } from \"./check.js\";\nimport { initCommand } from \"./init.js\";\nimport { renderCommand } from \"./render.js\";\nimport { stopHookCommandFromStdin } from \"./stop-hook.js\";\nimport { uninstallCommand } from \"./uninstall.js\";\nimport { updateCommand } from \"./update.js\";\n\nfunction resolvePackageDir(): string {\n // CLI lives at <contentRoot>/cli/index.{ts,js}.\n // In dev <contentRoot> = src/ ; in prod (after tsup + copy) = dist/.\n // Both contain agents/, skills/, commands/, templates/ as siblings of cli/.\n const here = dirname(fileURLToPath(import.meta.url));\n return resolve(here, \"..\");\n}\n\nconst program = new Command();\n\nprogram\n .name(\"vaubaan-harness\")\n .description(\n \"Vaubaan harness — render skills, commands, and all agent personas into a target directory\",\n )\n .version(VERSION);\n\nprogram\n .command(\"init\")\n .description(\n \"Render the harness (all agents, skills, commands) into a target directory. Defaults to all engines.\",\n )\n .argument(\"<target-dir>\", \"directory to render harness into\")\n .option(\n \"--engines <list>\",\n \"comma-separated subset of engines (claude-code, codex-cli, opencode) — defaults to all 3\",\n )\n .option(\"--overrides-dir <dir>\", \"directory containing .harness-overrides/\")\n .option(\"--package-dir <dir>\", \"override harness package directory (for dev/test)\")\n .option(\n \"--with-mcp <list>\",\n \"comma-separated MCP servers to render config for (context7) — opt-in\",\n )\n .option(\n \"--no-stop-hook\",\n \"skip rendering the Stop-hook configs that run lint at end of each agent turn\",\n )\n .action((targetDir: string, opts: Record<string, string | boolean | undefined>) => {\n const packageDir = (opts.packageDir as string | undefined) ?? resolvePackageDir();\n const enginesRaw = opts.engines as string | undefined;\n const engines = enginesRaw ? enginesRaw.split(\",\").map((s) => s.trim()) : undefined;\n const withMcpRaw = opts.withMcp as string | undefined;\n const mcpServers = withMcpRaw ? withMcpRaw.split(\",\").map((s) => s.trim()) : undefined;\n const result = initCommand({\n targetDir,\n engines,\n overridesDir: opts.overridesDir as string | undefined,\n packageDir,\n mcpServers,\n withStopHook: opts.stopHook !== false,\n });\n process.stdout.write(`rendered ${result.filesWritten.length} files to ${targetDir}\\n`);\n if (result.staleFilesRemoved.length > 0) {\n process.stdout.write(\n `removed ${result.staleFilesRemoved.length} stale files from a previous render\\n`,\n );\n }\n if (result.stopHookInstalled) {\n process.stdout.write(\"stop-hook installed (runs lint at end-of-turn)\\n\");\n if (result.filesWritten.includes(\".codex/hooks.json\")) {\n process.stdout.write(\n \"codex: the hook runs once you trust this project and approve the hook (startup review or /hooks)\\n\",\n );\n }\n }\n for (const w of result.warnings) process.stderr.write(`warning: ${w}\\n`);\n });\n\nprogram\n .command(\"update\")\n .description(\n \"Migrate an existing harness installation, retaining its engines and project settings\",\n )\n .argument(\"[target-dir]\", \"project directory\", \".\")\n .option(\"--dry-run\", \"preview changes without writing files or backups\")\n .option(\"--json\", \"print the migration summary as JSON\")\n .option(\"--backup-dir <dir>\", \"new backup directory outside the project\")\n .option(\"--overrides-dir <dir>\", \"directory containing .harness-overrides/\")\n .option(\"--preserve <paths>\", \"comma-separated generated files to leave under user ownership\")\n .action((targetDir: string, opts: Record<string, string | boolean | undefined>) => {\n const result = updateCommand({\n targetDir,\n packageDir: resolvePackageDir(),\n dryRun: opts.dryRun === true,\n backupDir: opts.backupDir as string | undefined,\n overridesDir: opts.overridesDir as string | undefined,\n preserveFiles: (opts.preserve as string | undefined)?.split(\",\").map((path) => path.trim()),\n });\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n return;\n }\n if (result.upToDate) process.stdout.write(`harness ${VERSION}: already up to date\\n`);\n else\n process.stdout.write(\n `${result.dryRun ? \"preview\" : \"updated\"}: ${result.filesToWrite.length} writes, ${result.filesToRemove.length} removals (harness ${VERSION})\\n`,\n );\n if (result.backupDir) process.stdout.write(`backup: ${result.backupDir}\\n`);\n for (const warning of result.warnings) process.stderr.write(`warning: ${warning}\\n`);\n });\n\nprogram\n .command(\"uninstall\")\n .description(\"Remove all files previously written by `init` into a target directory\")\n .argument(\"<target-dir>\", \"directory to uninstall harness from\")\n .action((targetDir: string) => {\n const result = uninstallCommand({ targetDir });\n process.stdout.write(\n `removed ${result.filesRemoved.length} files and ${result.dirsPruned.length} empty dirs from ${targetDir}\\n`,\n );\n for (const w of result.warnings) process.stderr.write(`warning: ${w}\\n`);\n });\n\nprogram\n .command(\"check\")\n .description(\"Verify repo layout: 6 pillars present and .gitignore correct\")\n .argument(\"<repo>\", \"path to repo to check\")\n .action((repo: string) => {\n const result = checkCommand(repo);\n if (result.pass) {\n process.stdout.write(\"✔ layout OK\\n\");\n process.exit(0);\n }\n for (const issue of result.issues) process.stdout.write(`✘ ${issue}\\n`);\n process.exit(1);\n });\n\nprogram\n .command(\"lint\")\n .description(\"Run all mechanical linters and exit non-zero on errors\")\n .option(\n \"--pillar <pillar>\",\n \"filter by pillar (spec, decisions, handbook, tests, workflow, quality)\",\n )\n .option(\"--format <fmt>\", \"text | json\", \"text\")\n .option(\"--cwd <dir>\", \"repo root\", \".\")\n .action((opts: Record<string, string | undefined>) => {\n const repoRoot = resolve(opts.cwd ?? \".\");\n const lintOpts = opts.pillar ? { pillar: opts.pillar } : {};\n const report = runLinters(repoRoot, lintOpts);\n if (opts.format === \"json\") {\n process.stdout.write(`${JSON.stringify(report, null, 2)}\\n`);\n } else {\n process.stdout.write(`${formatReportText(report)}\\n`);\n }\n process.exit(report.summary.pass ? 0 : 1);\n });\n\nprogram\n .command(\"render\")\n .description(\"Render harness for preview (no overrides applied). Defaults to all engines.\")\n .option(\n \"--engines <list>\",\n \"comma-separated subset of engines (claude-code, codex-cli, opencode) — defaults to all 3\",\n )\n .requiredOption(\"--out <dir>\", \"output directory\")\n .option(\"--package-dir <dir>\", \"override harness package directory\")\n .option(\n \"--with-mcp <list>\",\n \"comma-separated MCP servers to render config for (context7) — opt-in\",\n )\n .option(\"--no-stop-hook\", \"skip rendering the Stop-hook configs\")\n .action((opts: Record<string, string | boolean | undefined>) => {\n const packageDir = (opts.packageDir as string | undefined) ?? resolvePackageDir();\n const enginesRaw = opts.engines as string | undefined;\n const engines = enginesRaw ? enginesRaw.split(\",\").map((s) => s.trim()) : undefined;\n const withMcpRaw = opts.withMcp as string | undefined;\n const mcpServers = withMcpRaw ? withMcpRaw.split(\",\").map((s) => s.trim()) : undefined;\n const result = renderCommand({\n engines,\n outDir: opts.out as string,\n packageDir,\n mcpServers,\n withStopHook: opts.stopHook !== false,\n });\n process.stdout.write(`rendered ${result.filesWritten.length} files to ${opts.out}\\n`);\n for (const w of result.warnings) process.stderr.write(`warning: ${w}\\n`);\n });\n\nprogram\n .command(\"stop-hook\")\n .description(\n \"Stop-hook entrypoint invoked by each engine's hook config — runs lint and decides whether to inject the report into the running session, terminate, or passthrough\",\n )\n .requiredOption(\"--engine <engine>\", \"claude | codex | opencode\")\n .option(\"--cwd <dir>\", \"repo root\", \".\")\n .action((opts: Record<string, string | undefined>) => {\n const result = stopHookCommandFromStdin({\n engine: opts.engine as string,\n cwd: opts.cwd,\n });\n if (result.stdout) process.stdout.write(result.stdout);\n if (result.stderr) process.stderr.write(result.stderr);\n process.exit(result.exitCode);\n });\n\nprogram.parseAsync(process.argv).catch((err) => {\n process.stderr.write(`error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n});\n","import { execFileSync } from \"node:child_process\";\nimport { existsSync, readFileSync, statSync } from \"node:fs\";\nimport { join, relative } from \"node:path\";\nimport fg from \"fast-glob\";\nimport matter from \"gray-matter\";\n\nexport function fileExists(repoRoot: string, relativePath: string): boolean {\n return existsSync(join(repoRoot, relativePath));\n}\n\nexport function readText(repoRoot: string, relativePath: string): string {\n return readFileSync(join(repoRoot, relativePath), \"utf8\");\n}\n\nexport function listMarkdown(repoRoot: string, dir: string): string[] {\n const cwd = join(repoRoot, dir);\n if (!existsSync(cwd)) return [];\n return fg\n .sync(\"**/*.md\", { cwd, absolute: false, ignore: [\"**/node_modules/**\", \"**/dist/**\"] })\n .filter((f) => !f.endsWith(\"README.md\"))\n .map((f) => join(dir, f));\n}\n\nexport function listAllMarkdown(repoRoot: string, dir: string): string[] {\n const cwd = join(repoRoot, dir);\n if (!existsSync(cwd)) return [];\n return fg\n .sync(\"**/*.md\", { cwd, absolute: false, ignore: [\"**/node_modules/**\", \"**/dist/**\"] })\n .map((f) => join(dir, f));\n}\n\nexport function dirExists(repoRoot: string, relativePath: string): boolean {\n const full = join(repoRoot, relativePath);\n if (!existsSync(full)) return false;\n return statSync(full).isDirectory();\n}\n\nexport function parseFrontmatter(text: string): { data: Record<string, unknown>; body: string } {\n const m = matter(text);\n return { data: m.data, body: m.content };\n}\n\nexport interface GitLogEntry {\n hash: string;\n timestamp: number;\n}\n\nexport function gitLastCommitForPath(\n repoRoot: string,\n relativePath: string,\n): GitLogEntry | undefined {\n try {\n const out = execFileSync(\"git\", [\"log\", \"-1\", \"--format=%H:%ct\", \"--\", relativePath], {\n cwd: repoRoot,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n if (!out) return undefined;\n const idx = out.indexOf(\":\");\n if (idx < 0) return undefined;\n const hash = out.slice(0, idx);\n const ts = Number.parseInt(out.slice(idx + 1), 10);\n return { hash, timestamp: ts };\n } catch {\n return undefined;\n }\n}\n\nexport function gitCommitsSince(\n repoRoot: string,\n relativePath: string,\n sinceCommit: string,\n): number {\n try {\n const out = execFileSync(\n \"git\",\n [\"log\", `${sinceCommit}..HEAD`, \"--format=%H\", \"--\", relativePath],\n {\n cwd: repoRoot,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n },\n ).trim();\n if (!out) return 0;\n return out.split(\"\\n\").filter(Boolean).length;\n } catch {\n return 0;\n }\n}\n\nexport function relPath(repoRoot: string, abs: string): string {\n return relative(repoRoot, abs);\n}\n\nexport function findLineNumber(text: string, needle: string | RegExp): number | undefined {\n const lines = text.split(\"\\n\");\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? \"\";\n if (typeof needle === \"string\" ? line.includes(needle) : needle.test(line)) {\n return i + 1;\n }\n }\n return undefined;\n}\n","import type { LintIssue, Linter } from \"./types.js\";\nimport { listMarkdown, parseFrontmatter, readText } from \"./util.js\";\n\nconst ADR_DIR = \"docs/decisions\";\n\nexport const adrNoTracks: Linter = {\n id: \"lint:adr-no-tracks\",\n pillars: [\"decisions\"],\n defaultSeverity: \"error\",\n suggestedSkills: [\"/decision\"],\n run(repoRoot: string): LintIssue[] {\n const issues: LintIssue[] = [];\n const files = listMarkdown(repoRoot, ADR_DIR);\n for (const f of files) {\n const text = readText(repoRoot, f);\n const { data } = parseFrontmatter(text);\n if (!(\"tracks\" in data)) continue;\n const value = data.tracks;\n if (Array.isArray(value) && value.length === 0) continue;\n issues.push({\n linter: this.id,\n severity: \"error\",\n file: f,\n message:\n \"ADRs must not declare `tracks:` (or must set it to []). ADRs document a decision frozen in time, not the current state of code — use status: superseded to mark them obsolete instead.\",\n });\n }\n return issues;\n },\n};\n","import type { LintIssue, Linter } from \"./types.js\";\nimport { fileExists } from \"./util.js\";\n\nconst REQUIRED_FILES = [\n \"docs/tests/integration-tests.md\",\n \"docs/tests/e2e-tests.md\",\n \"docs/workflow/coding-workflow.md\",\n];\n\nexport const cardinalFiles: Linter = {\n id: \"lint:cardinal-files\",\n pillars: [\"tests\", \"workflow\"],\n defaultSeverity: \"error\",\n suggestedSkills: [\"/test-plan\", \"/workflow\"],\n run(repoRoot: string): LintIssue[] {\n const issues: LintIssue[] = [];\n for (const f of REQUIRED_FILES) {\n if (!fileExists(repoRoot, f)) {\n issues.push({\n linter: this.id,\n severity: \"error\",\n file: f,\n message: `missing required cardinal file: ${f}`,\n });\n }\n }\n return issues;\n },\n};\n","import { cosmiconfigSync } from \"cosmiconfig\";\n\nexport interface HarnessLintConfig {\n ignore: ReadonlyArray<string>;\n}\n\nconst DEFAULT_CONFIG: HarnessLintConfig = { ignore: [] };\n\nexport function loadLintConfig(repoRoot: string): HarnessLintConfig {\n const explorer = cosmiconfigSync(\"harness\", {\n searchPlaces: [\n \"package.json\",\n \".harnessrc\",\n \".harnessrc.json\",\n \".harnessrc.yaml\",\n \".harnessrc.yml\",\n \"harness.config.js\",\n \"harness.config.cjs\",\n ],\n });\n const result = explorer.search(repoRoot);\n if (!result || result.isEmpty) return DEFAULT_CONFIG;\n\n const raw = result.config as Record<string, unknown> | undefined;\n if (!raw) return DEFAULT_CONFIG;\n\n const lint = raw.lint as Record<string, unknown> | undefined;\n if (!lint) return DEFAULT_CONFIG;\n\n const ignore = lint.ignore;\n if (!Array.isArray(ignore)) return DEFAULT_CONFIG;\n\n return { ignore: ignore.filter((x): x is string => typeof x === \"string\") };\n}\n","import { existsSync } from \"node:fs\";\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\nimport fg from \"fast-glob\";\nimport type { LintContext, LintIssue, Linter } from \"./types.js\";\nimport { readText } from \"./util.js\";\n\nconst LINK_REGEX = /\\[([^\\]]+)\\]\\(([^)]+)\\)/g;\n\nfunction maskCodeSpans(text: string): string {\n return text\n .replace(/```[\\s\\S]*?```/g, (m) => m.replace(/[^\\n]/g, \" \"))\n .replace(/`[^`\\n]*`/g, (m) => \" \".repeat(m.length));\n}\n\nfunction isExternalOrAnchor(url: string): boolean {\n if (url.startsWith(\"http://\") || url.startsWith(\"https://\")) return true;\n if (url.startsWith(\"mailto:\")) return true;\n if (url.startsWith(\"#\")) return true;\n return false;\n}\n\nfunction stripFragment(url: string): string {\n const i = url.indexOf(\"#\");\n return i < 0 ? url : url.slice(0, i);\n}\n\nfunction resolveLink(repoRoot: string, sourceFile: string, link: string): string {\n const noFrag = stripFragment(link);\n if (isAbsolute(noFrag)) return join(repoRoot, noFrag);\n return resolve(dirname(join(repoRoot, sourceFile)), noFrag);\n}\n\nexport const crossLinks: Linter = {\n id: \"lint:cross-links\",\n pillars: [\"all\"],\n defaultSeverity: \"error\",\n run(repoRoot: string, ctx?: LintContext): LintIssue[] {\n const extra = ctx?.config.ignore ?? [];\n const issues: LintIssue[] = [];\n const allDocs = fg.sync(\"**/*.md\", {\n cwd: repoRoot,\n absolute: false,\n ignore: [\n \"**/node_modules/**\",\n \"**/dist/**\",\n \".harness-overrides/**\",\n \"skills/**\",\n \"agents/**\",\n \"commands/**\",\n \"templates/**\",\n \"**/*.skill.md\",\n \"**/*.cmd.md\",\n \"**/*.agent.md\",\n ...extra,\n ],\n });\n for (const f of allDocs) {\n const text = maskCodeSpans(readText(repoRoot, f));\n const lines = text.split(\"\\n\");\n for (let lineNo = 0; lineNo < lines.length; lineNo++) {\n const line = lines[lineNo] ?? \"\";\n LINK_REGEX.lastIndex = 0;\n let match: RegExpExecArray | null;\n match = LINK_REGEX.exec(line);\n while (match !== null) {\n const url = match[2];\n if (url && !isExternalOrAnchor(url)) {\n const noFrag = stripFragment(url);\n if (noFrag !== \"\" && !noFrag.startsWith(\"data:\")) {\n const target = resolveLink(repoRoot, f, url);\n if (!existsSync(target)) {\n issues.push({\n linter: this.id,\n severity: \"error\",\n file: f,\n line: lineNo + 1,\n message: `broken link: ${url}`,\n });\n }\n }\n }\n match = LINK_REGEX.exec(line);\n }\n }\n }\n return issues;\n },\n};\n","import type { LintIssue, Linter } from \"./types.js\";\nimport { listMarkdown, readText } from \"./util.js\";\n\n// English headings are canonical; the French ones are still accepted so\n// projects written before the switch to English keep passing.\nconst REQUIRED_SECTIONS: Array<{ label: string; pattern: RegExp }> = [\n { label: \"Context\", pattern: /^##\\s+(Context|Contexte)\\b/m },\n { label: \"Decision\", pattern: /^##\\s+(Decision|D[ée]cision)\\b/m },\n { label: \"Consequences\", pattern: /^##\\s+(Consequences|Cons[ée]quences)\\b/m },\n {\n label: \"Rejected alternatives\",\n pattern: /^##\\s+(Rejected\\s+alternatives|Alternatives(\\s+rejet[ée]es)?)\\b/im,\n },\n];\n\nexport const decisionSchema: Linter = {\n id: \"lint:decision-schema\",\n pillars: [\"decisions\"],\n defaultSeverity: \"error\",\n suggestedSkills: [\"/decision\"],\n run(repoRoot: string): LintIssue[] {\n const issues: LintIssue[] = [];\n const files = listMarkdown(repoRoot, \"docs/decisions\");\n for (const f of files) {\n const text = readText(repoRoot, f);\n for (const { label, pattern } of REQUIRED_SECTIONS) {\n if (!pattern.test(text)) {\n issues.push({\n linter: this.id,\n severity: \"error\",\n file: f,\n message: `missing required section: \"${label}\"`,\n });\n }\n }\n }\n return issues;\n },\n};\n","import type { LintIssue, Linter } from \"./types.js\";\nimport { dirExists } from \"./util.js\";\n\nconst REQUIRED_DIRS = [\n \"docs/spec\",\n \"docs/decisions\",\n \"docs/handbook\",\n \"docs/tests\",\n \"docs/workflow\",\n];\n\nexport const docLayout: Linter = {\n id: \"lint:doc-layout\",\n pillars: [\"all\"],\n defaultSeverity: \"error\",\n run(repoRoot: string): LintIssue[] {\n const issues: LintIssue[] = [];\n for (const dir of REQUIRED_DIRS) {\n if (!dirExists(repoRoot, dir)) {\n issues.push({\n linter: this.id,\n severity: \"error\",\n file: dir,\n message: `missing required directory: ${dir}/`,\n });\n }\n }\n return issues;\n },\n};\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport fg from \"fast-glob\";\nimport type { LintIssue, Linter } from \"./types.js\";\nimport { listMarkdown, parseFrontmatter, readText } from \"./util.js\";\n\nconst TRACKED_DIRS = [\"docs/handbook\", \"docs/tests\", \"docs/workflow\"];\n\nfunction trackedPathExists(repoRoot: string, pattern: string): boolean {\n if (pattern.includes(\"*\")) {\n return fg.sync(pattern, { cwd: repoRoot, absolute: false }).length > 0;\n }\n return existsSync(join(repoRoot, pattern));\n}\n\nexport const frontmatterTracks: Linter = {\n id: \"lint:frontmatter-tracks\",\n pillars: [\"handbook\", \"tests\", \"workflow\"],\n defaultSeverity: \"error\",\n suggestedSkills: [\"/handbook\", \"/test-plan\", \"/workflow\"],\n run(repoRoot: string): LintIssue[] {\n const issues: LintIssue[] = [];\n for (const dir of TRACKED_DIRS) {\n const files = listMarkdown(repoRoot, dir);\n for (const f of files) {\n const text = readText(repoRoot, f);\n const { data } = parseFrontmatter(text);\n if (!Array.isArray(data.tracks)) {\n issues.push({\n linter: this.id,\n severity: \"error\",\n file: f,\n message: \"missing frontmatter `tracks:` array\",\n });\n continue;\n }\n for (const tracked of data.tracks as unknown[]) {\n if (typeof tracked !== \"string\") {\n issues.push({\n linter: this.id,\n severity: \"error\",\n file: f,\n message: \"`tracks` entries must be strings\",\n });\n continue;\n }\n if (!trackedPathExists(repoRoot, tracked)) {\n issues.push({\n linter: this.id,\n severity: \"error\",\n file: f,\n message: `tracked path does not exist: ${tracked}`,\n });\n }\n }\n }\n }\n return issues;\n },\n};\n","import type { LintIssue, Linter } from \"./types.js\";\nimport { fileExists, readText } from \"./util.js\";\n\n/** Paths the harness generates or writes at runtime; none belongs in Git. */\nexport const REQUIRED_GITIGNORE_ENTRIES: ReadonlyArray<string> = [\n \".harness-overrides/\",\n \".harness-manifest.json\",\n \".harness/\",\n \".claude/\",\n \".codex/\",\n \".opencode/\",\n \".agents/\",\n \".vaubaan/\",\n \"AGENTS.md\",\n \"CLAUDE.md\",\n \".mcp.json\",\n];\n\nexport const gitignoreHarness: Linter = {\n id: \"lint:gitignore-harness\",\n pillars: [\"repo-root\"],\n defaultSeverity: \"error\",\n run(repoRoot: string): LintIssue[] {\n const issues: LintIssue[] = [];\n if (!fileExists(repoRoot, \".gitignore\")) {\n issues.push({\n linter: this.id,\n severity: \"error\",\n file: \".gitignore\",\n message: \".gitignore is missing at repo root\",\n });\n return issues;\n }\n const text = readText(repoRoot, \".gitignore\");\n const lines = new Set(\n text\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter(Boolean),\n );\n for (const entry of REQUIRED_GITIGNORE_ENTRIES) {\n const variants = [entry, entry.replace(/\\/$/, \"\")];\n if (!variants.some((v) => lines.has(v))) {\n issues.push({\n linter: this.id,\n severity: \"error\",\n file: \".gitignore\",\n message: `.gitignore must contain \"${entry}\"`,\n });\n }\n }\n return issues;\n },\n};\n","import { basename } from \"node:path\";\nimport fg from \"fast-glob\";\nimport type { LintContext, LintIssue, Linter } from \"./types.js\";\nimport { listMarkdown, readText } from \"./util.js\";\n\nexport const orphanDecisions: Linter = {\n id: \"lint:orphan-decisions\",\n pillars: [\"decisions\"],\n defaultSeverity: \"warning\",\n suggestedSkills: [\"/handbook\"],\n run(repoRoot: string, ctx?: LintContext): LintIssue[] {\n const extra = ctx?.config.ignore ?? [];\n const issues: LintIssue[] = [];\n const adrs = listMarkdown(repoRoot, \"docs/decisions\");\n if (adrs.length === 0) return issues;\n\n const otherDocs = fg.sync(\"**/*.md\", {\n cwd: repoRoot,\n absolute: false,\n ignore: [\n \"**/node_modules/**\",\n \"**/dist/**\",\n \".harness-overrides/**\",\n \"docs/decisions/**\",\n \"skills/**\",\n \"agents/**\",\n \"commands/**\",\n \"templates/**\",\n ...extra,\n ],\n });\n\n const referenceCorpus = otherDocs.map((f) => readText(repoRoot, f)).join(\"\\n\");\n\n for (const adr of adrs) {\n const filename = basename(adr);\n const stem = filename.replace(/\\.md$/, \"\");\n const referenced = referenceCorpus.includes(filename) || referenceCorpus.includes(stem);\n if (!referenced) {\n issues.push({\n linter: this.id,\n severity: \"warning\",\n file: adr,\n message: \"ADR is not referenced by any other doc file (orphan)\",\n });\n }\n }\n return issues;\n },\n};\n","import type { LintIssue, Linter } from \"./types.js\";\nimport { dirExists, fileExists, readText } from \"./util.js\";\n\nconst QUALITY_DIR = \"docs/quality\";\nconst CARDINAL_FILE = `${QUALITY_DIR}/code-quality.md`;\n\n// English headings are canonical; the French ones are still accepted so\n// projects written before the switch to English keep passing.\nconst REQUIRED_SECTIONS: ReadonlyArray<{ label: string; pattern: RegExp }> = [\n {\n label: \"Mechanical checks\",\n pattern: /^##\\s+(Mechanical\\s+checks|V[ée]rifications\\s+m[ée]caniques)\\s*$/im,\n },\n { label: \"Project rules\", pattern: /^##\\s+(Project\\s+rules|R[èe]gles\\s+du\\s+projet)\\s*$/im },\n {\n label: \"Accepted deviations\",\n pattern: /^##\\s+(Accepted\\s+deviations|[ÉE]carts\\s+assum[ée]s)\\s*$/im,\n },\n];\n\n/**\n * `docs/quality/` is an optional pillar: absent directory = nothing to\n * report. Once the directory exists, its cardinal file and sections are\n * required.\n */\nexport const qualitySchema: Linter = {\n id: \"lint:quality-schema\",\n pillars: [\"quality\"],\n defaultSeverity: \"error\",\n run(repoRoot: string): LintIssue[] {\n if (!dirExists(repoRoot, QUALITY_DIR)) return [];\n if (!fileExists(repoRoot, CARDINAL_FILE)) {\n return [\n {\n linter: this.id,\n severity: \"error\",\n file: CARDINAL_FILE,\n message: `missing required cardinal file: ${CARDINAL_FILE}`,\n },\n ];\n }\n const text = readText(repoRoot, CARDINAL_FILE);\n return REQUIRED_SECTIONS.filter(({ pattern }) => !pattern.test(text)).map(({ label }) => ({\n linter: this.id,\n severity: \"error\" as const,\n file: CARDINAL_FILE,\n message: `missing required section: \"${label}\"`,\n }));\n },\n};\n","import type { LintIssue, Linter } from \"./types.js\";\nimport { fileExists } from \"./util.js\";\n\nexport const readmePresence: Linter = {\n id: \"lint:readme-presence\",\n pillars: [\"readme\"],\n defaultSeverity: \"error\",\n suggestedSkills: [\"/readme\"],\n run(repoRoot: string): LintIssue[] {\n if (fileExists(repoRoot, \"README.md\")) return [];\n return [\n {\n linter: this.id,\n severity: \"error\",\n file: \"README.md\",\n message: \"README.md is missing at repo root\",\n },\n ];\n },\n};\n","import type { LintIssue, Linter } from \"./types.js\";\nimport { fileExists, readText } from \"./util.js\";\n\nconst REQUIRED_SECTIONS = [\n /^#\\s+\\S/m,\n /^##?\\s+(What is this|Quick start)/im,\n /^##?\\s+(Quick start|Install|Getting started)/im,\n];\n\nconst REQUIRED_LABELS = [\"title (# H1)\", \"What is this / intro\", \"Quick start / Install\"];\n\nexport const readmeSections: Linter = {\n id: \"lint:readme-sections\",\n pillars: [\"readme\"],\n defaultSeverity: \"error\",\n suggestedSkills: [\"/readme\"],\n run(repoRoot: string): LintIssue[] {\n if (!fileExists(repoRoot, \"README.md\")) return [];\n const text = readText(repoRoot, \"README.md\");\n const issues: LintIssue[] = [];\n for (let i = 0; i < REQUIRED_SECTIONS.length; i++) {\n const pattern = REQUIRED_SECTIONS[i];\n const label = REQUIRED_LABELS[i];\n if (pattern && !pattern.test(text)) {\n issues.push({\n linter: this.id,\n severity: \"error\",\n file: \"README.md\",\n message: `missing required section: ${label}`,\n });\n }\n }\n return issues;\n },\n};\n","import type { LintIssue, Linter } from \"./types.js\";\nimport { dirExists, listMarkdown } from \"./util.js\";\n\nexport const specHasContent: Linter = {\n id: \"lint:spec-has-content\",\n pillars: [\"spec\"],\n defaultSeverity: \"warning\",\n suggestedSkills: [\"/spec\"],\n run(repoRoot: string): LintIssue[] {\n if (!dirExists(repoRoot, \"docs/spec\")) return [];\n const files = listMarkdown(repoRoot, \"docs/spec\");\n if (files.length > 0) return [];\n return [\n {\n linter: this.id,\n severity: \"warning\",\n file: \"docs/spec\",\n message: \"docs/spec/ has no markdown files — write at least one spec document\",\n },\n ];\n },\n};\n","import type { LintIssue, Linter } from \"./types.js\";\nimport { findLineNumber, listMarkdown, readText } from \"./util.js\";\n\nfunction maskFencedBlocks(text: string): string {\n return text.replace(/```[\\s\\S]*?```/g, (m) => m.replace(/[^\\n]/g, \" \"));\n}\n\nconst TECH_BLOCKLIST: Array<{ pattern: RegExp; keyword: string }> = [\n { pattern: /\\bNext\\.?js\\b/i, keyword: \"Next.js\" },\n { pattern: /\\bSupabase\\b/i, keyword: \"Supabase\" },\n { pattern: /\\bVercel\\b/i, keyword: \"Vercel\" },\n { pattern: /\\bReact\\b/, keyword: \"React\" },\n { pattern: /\\bTypeScript\\b/, keyword: \"TypeScript\" },\n { pattern: /\\bDocker\\b/, keyword: \"Docker\" },\n { pattern: /\\bKubernetes\\b/i, keyword: \"Kubernetes\" },\n { pattern: /\\bPostgres(QL)?\\b/i, keyword: \"Postgres\" },\n { pattern: /\\bMySQL\\b/i, keyword: \"MySQL\" },\n { pattern: /\\bRedis\\b/i, keyword: \"Redis\" },\n { pattern: /\\bnpm\\b/, keyword: \"npm\" },\n { pattern: /\\bpnpm\\b/, keyword: \"pnpm\" },\n { pattern: /\\byarn\\b/, keyword: \"yarn\" },\n];\n\nexport const specTechAgnostic: Linter = {\n id: \"lint:spec-tech-agnostic\",\n pillars: [\"spec\"],\n defaultSeverity: \"error\",\n suggestedSkills: [\"/spec\"],\n run(repoRoot: string): LintIssue[] {\n const issues: LintIssue[] = [];\n const files = listMarkdown(repoRoot, \"docs/spec\");\n for (const f of files) {\n const text = maskFencedBlocks(readText(repoRoot, f));\n for (const { pattern, keyword } of TECH_BLOCKLIST) {\n if (pattern.test(text)) {\n const issue: LintIssue = {\n linter: this.id,\n severity: \"error\",\n file: f,\n message: `forbidden tech keyword \"${keyword}\" — should be in handbook/ or decisions/`,\n };\n const line = findLineNumber(text, pattern);\n if (line !== undefined) issue.line = line;\n issues.push(issue);\n }\n }\n }\n return issues;\n },\n};\n","import fg from \"fast-glob\";\nimport type { LintIssue, Linter } from \"./types.js\";\nimport {\n gitCommitsSince,\n gitLastCommitForPath,\n listMarkdown,\n parseFrontmatter,\n readText,\n} from \"./util.js\";\n\nconst TRACKED_DIRS = [\"docs/handbook\", \"docs/tests\", \"docs/workflow\"];\nconst DEFAULT_DRIFT_THRESHOLD = 10;\n\nfunction expandGlob(repoRoot: string, pattern: string): string[] {\n if (pattern.includes(\"*\")) {\n return fg.sync(pattern, { cwd: repoRoot, absolute: false });\n }\n return [pattern];\n}\n\nexport const tracksDrift: Linter = {\n id: \"lint:tracks-drift\",\n pillars: [\"handbook\", \"tests\", \"workflow\"],\n defaultSeverity: \"warning\",\n suggestedSkills: [\"/drift\", \"/handbook\"],\n run(repoRoot: string): LintIssue[] {\n const issues: LintIssue[] = [];\n for (const dir of TRACKED_DIRS) {\n const files = listMarkdown(repoRoot, dir);\n for (const f of files) {\n const text = readText(repoRoot, f);\n const { data } = parseFrontmatter(text);\n if (!Array.isArray(data.tracks)) continue;\n const docCommit = gitLastCommitForPath(repoRoot, f);\n if (!docCommit) continue;\n const threshold =\n typeof data.driftThreshold === \"number\" && data.driftThreshold > 0\n ? data.driftThreshold\n : DEFAULT_DRIFT_THRESHOLD;\n let driftCount = 0;\n for (const tracked of data.tracks) {\n if (typeof tracked !== \"string\") continue;\n const targets = expandGlob(repoRoot, tracked);\n for (const t of targets.length > 0 ? targets : [tracked]) {\n driftCount += gitCommitsSince(repoRoot, t, docCommit.hash);\n }\n }\n if (driftCount > threshold) {\n issues.push({\n linter: this.id,\n severity: \"warning\",\n file: f,\n message: `tracked files changed in ${driftCount} commits since doc last edit (threshold ${threshold})`,\n });\n }\n }\n }\n return issues;\n },\n};\n","import { adrNoTracks } from \"./adr-no-tracks.js\";\nimport { cardinalFiles } from \"./cardinal-files.js\";\nimport { loadLintConfig } from \"./config.js\";\nimport { crossLinks } from \"./cross-links.js\";\nimport { decisionSchema } from \"./decision-schema.js\";\nimport { docLayout } from \"./doc-layout.js\";\nimport { frontmatterTracks } from \"./frontmatter-tracks.js\";\nimport { gitignoreHarness } from \"./gitignore-harness.js\";\nimport { orphanDecisions } from \"./orphan-decisions.js\";\nimport { qualitySchema } from \"./quality-schema.js\";\nimport { readmePresence } from \"./readme-presence.js\";\nimport { readmeSections } from \"./readme-sections.js\";\nimport { specHasContent } from \"./spec-has-content.js\";\nimport { specTechAgnostic } from \"./spec-tech-agnostic.js\";\nimport { tracksDrift } from \"./tracks-drift.js\";\nimport type { LintContext, LintIssue, LintReport, Linter } from \"./types.js\";\n\nexport const ALL_LINTERS: ReadonlyArray<Linter> = [\n readmePresence,\n readmeSections,\n docLayout,\n cardinalFiles,\n decisionSchema,\n adrNoTracks,\n frontmatterTracks,\n tracksDrift,\n specTechAgnostic,\n specHasContent,\n crossLinks,\n orphanDecisions,\n gitignoreHarness,\n qualitySchema,\n];\n\nexport interface RunOptions {\n pillar?: string;\n only?: ReadonlyArray<string>;\n}\n\nexport function runLinters(repoRoot: string, opts: RunOptions = {}): LintReport {\n const config = loadLintConfig(repoRoot);\n const ctx: LintContext = { repoRoot, config };\n const filtered = ALL_LINTERS.filter((l) => {\n if (opts.only && !opts.only.includes(l.id)) return false;\n if (opts.pillar && !l.pillars.includes(opts.pillar) && !l.pillars.includes(\"all\")) return false;\n return true;\n });\n const issues: LintIssue[] = [];\n for (const linter of filtered) {\n try {\n issues.push(...linter.run(repoRoot, ctx));\n } catch (err) {\n issues.push({\n linter: linter.id,\n severity: \"error\",\n file: \"<internal>\",\n message: `linter crashed: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n }\n const errors = issues.filter((i) => i.severity === \"error\").length;\n const warnings = issues.filter((i) => i.severity === \"warning\").length;\n return {\n version: 1,\n summary: { errors, warnings, pass: errors === 0 },\n issues,\n };\n}\n\nfunction suggestedSkillsFor(linterId: string): ReadonlyArray<string> {\n const linter = ALL_LINTERS.find((l) => l.id === linterId);\n return linter?.suggestedSkills ?? [];\n}\n\nexport function formatReportText(report: LintReport): string {\n const lines: string[] = [];\n for (const issue of report.issues) {\n const location = issue.line !== undefined ? `:${issue.line}` : \"\";\n lines.push(`${issue.file}${location}: ${issue.severity}[${issue.linter}]\\n ${issue.message}`);\n const hints = suggestedSkillsFor(issue.linter);\n if (hints.length > 0) {\n lines.push(` → Try: ${hints.join(\", \")}`);\n }\n }\n const { errors, warnings, pass } = report.summary;\n lines.push(\"\");\n lines.push(\n `${errors} ${errors === 1 ? \"error\" : \"errors\"}, ${warnings} ${warnings === 1 ? \"warning\" : \"warnings\"}. ${pass ? \"✔ CI passes.\" : \"✘ CI fails.\"}`,\n );\n return lines.join(\"\\n\");\n}\n\nexport type { HarnessLintConfig } from \"./config.js\";\nexport { loadLintConfig } from \"./config.js\";\nexport type { LintContext, Linter, LintIssue, LintReport, Severity } from \"./types.js\";\n","export const VERSION = \"1.3.2\";\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { REQUIRED_GITIGNORE_ENTRIES } from \"../linters/gitignore-harness.js\";\n\nexport interface CheckResult {\n pass: boolean;\n issues: string[];\n}\n\nconst REQUIRED_DIRS = [\n \"docs/spec\",\n \"docs/decisions\",\n \"docs/handbook\",\n \"docs/tests\",\n \"docs/workflow\",\n];\n\nexport function checkCommand(repoRoot: string): CheckResult {\n const issues: string[] = [];\n\n if (!existsSync(join(repoRoot, \"README.md\"))) {\n issues.push(\"README.md missing at repo root\");\n }\n\n for (const d of REQUIRED_DIRS) {\n if (!existsSync(join(repoRoot, d))) {\n issues.push(`missing directory: ${d}/`);\n }\n }\n\n const gitignorePath = join(repoRoot, \".gitignore\");\n if (!existsSync(gitignorePath)) {\n issues.push(\".gitignore missing at repo root\");\n } else {\n const text = readFileSync(gitignorePath, \"utf8\");\n const lines = new Set(\n text\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter(Boolean),\n );\n for (const entry of REQUIRED_GITIGNORE_ENTRIES) {\n const variants = [entry, entry.replace(/\\/$/, \"\")];\n if (!variants.some((v) => lines.has(v))) {\n issues.push(`.gitignore missing entry: ${entry}`);\n }\n }\n }\n\n return { pass: issues.length === 0, issues };\n}\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { loadHarness, loadOverrides, loadProjectSkills } from \"../loader.js\";\nimport { resolveMcpIds } from \"../mcp.js\";\nimport { type RenderOutput, render } from \"../render.js\";\nimport { ENGINES, type Engine, type RenderedFile } from \"../types.js\";\nimport { assertManagedPaths } from \"./managed-paths.js\";\nimport { MANIFEST_FILENAME, readManifest, writeManifest } from \"./manifest.js\";\nimport { OPENCODE_CONFIG_PATH, planOpenCodeConfig } from \"./opencode-config.js\";\nimport { removeRenderedFiles } from \"./uninstall.js\";\n\n/** Cardinal file of the optional `docs/quality/` pillar. */\nconst QUALITY_DOC_PATH = \"docs/quality/code-quality.md\";\n\nexport interface InitArgs {\n targetDir: string;\n engines?: ReadonlyArray<string>;\n overridesDir?: string;\n /**\n * Directory containing the harness content (agents/, skills/, commands/,\n * templates/). Defaults to the harness package's own `dist/` (resolved\n * via `import.meta.url`), so programmatic callers usually omit it.\n */\n packageDir?: string;\n mcpServers?: ReadonlyArray<string>;\n /**\n * Stop-hook installation. Default `true`. When enabled, each engine\n * receives a hook config that calls `vaubaan-harness stop-hook\n * --engine <engine>` and injects the lint report (with skill\n * suggestions) into the running session whenever the worktree is\n * dirty and lint fails at end-of-turn. Pass `false` to skip the\n * hook configs entirely (runtime kill-switch remains available via\n * `HARNESS_LINT_DISABLE=1`).\n */\n withStopHook?: boolean;\n}\n\nexport interface InitResult {\n filesWritten: string[];\n /** Files a previous `init` rendered that this one no longer does (layout change, engine dropped). */\n staleFilesRemoved: string[];\n warnings: string[];\n stopHookInstalled: boolean;\n}\n\nfunction resolveEngineList(requested: ReadonlyArray<string> | undefined): Engine[] {\n if (!requested || requested.length === 0) return [...ENGINES];\n return requested.map((e) => {\n if (!ENGINES.includes(e as Engine)) {\n throw new Error(`unknown engine: ${e} (expected one of ${ENGINES.join(\", \")})`);\n }\n return e as Engine;\n });\n}\n\n/**\n * Resolves the harness package's bundled content directory. The harness\n * tsup config emits this module to both `dist/init.js` (programmatic\n * `./init` export) and inlines it into `dist/cli/index.js` (CLI use). The\n * content (`agents/`, `skills/`, `commands/`, `templates/`) always sits\n * at `dist/` — same dir as `dist/init.js`, parent of `dist/cli/index.js`.\n * In dev (`src/cli/init.ts`) the content also sits at `src/`. We\n * disambiguate by checking which ancestor contains `agents/`.\n */\nfunction defaultPackageDir(): string {\n const here = dirname(fileURLToPath(import.meta.url));\n if (existsSync(join(here, \"agents\"))) return here;\n return resolve(here, \"..\");\n}\n\nexport function planInit(args: InitArgs): {\n engines: Engine[];\n output: RenderOutput;\n stopHookInstalled: boolean;\n} {\n const engines = resolveEngineList(args.engines);\n const packageDir = args.packageDir ?? defaultPackageDir();\n const harness = loadHarness(packageDir);\n const overrides = args.overridesDir ? loadOverrides(args.overridesDir) : undefined;\n const projectSkills = loadProjectSkills(args.targetDir);\n const hasQualityDoc = existsSync(join(args.targetDir, QUALITY_DOC_PATH));\n const mcpServers = args.mcpServers ? resolveMcpIds(args.mcpServers) : undefined;\n const stopHookInstalled = args.withStopHook !== false;\n const output = render({\n harness,\n engines,\n overrides,\n projectSkills,\n hasQualityDoc,\n mcpServers,\n withStopHook: stopHookInstalled,\n });\n return { engines, output, stopHookInstalled };\n}\n\nexport function writeFilesToTarget(\n files: ReadonlyArray<RenderedFile>,\n targetDir: string,\n): string[] {\n assertManagedPaths(\n targetDir,\n files.map((file) => file.path),\n );\n const written: string[] = [];\n for (const f of files) {\n const full = join(targetDir, f.path);\n mkdirSync(dirname(full), { recursive: true });\n writeFileSync(full, f.content);\n written.push(f.path);\n }\n return written;\n}\n\nexport function initCommand(args: InitArgs): InitResult {\n const { engines, output, stopHookInstalled } = planInit(args);\n const previous = readManifest(args.targetDir);\n assertManagedPaths(args.targetDir, [\n MANIFEST_FILENAME,\n ...(previous?.files ?? []),\n ...output.files.map((file) => file.path),\n ...(previous?.opencodeConfig ? [OPENCODE_CONFIG_PATH] : []),\n ]);\n const desiredConfig = output.files.find((file) => file.path === OPENCODE_CONFIG_PATH);\n const config = planOpenCodeConfig(args.targetDir, desiredConfig, previous?.opencodeConfig);\n const next = new Set(output.files.map((f) => f.path));\n const stale = (previous?.files ?? []).filter((f) => !next.has(f) && f !== OPENCODE_CONFIG_PATH);\n if (config.remove) stale.push(OPENCODE_CONFIG_PATH);\n const staleFilesRemoved = removeRenderedFiles(resolve(args.targetDir), stale).filesRemoved;\n const ownedFiles = output.files.filter((file) => file.path !== OPENCODE_CONFIG_PATH);\n const filesWritten = writeFilesToTarget(ownedFiles, args.targetDir);\n if (config.write) writeFilesToTarget([config.write], args.targetDir);\n writeManifest(args.targetDir, engines, filesWritten, {\n stopHookInstalled,\n stopHookEngines: stopHookInstalled ? engines : undefined,\n opencodeConfig: config.ownership,\n overridesDir: args.overridesDir\n ? resolve(args.overridesDir) === resolve(args.targetDir)\n ? \".\"\n : resolve(args.overridesDir)\n : undefined,\n });\n if (config.write) filesWritten.push(OPENCODE_CONFIG_PATH);\n const warnings = [...output.warnings, ...config.warnings];\n if (previous?.files.includes(OPENCODE_CONFIG_PATH) && !previous.opencodeConfig) {\n warnings.push(`preserved legacy shared configuration: ${OPENCODE_CONFIG_PATH}`);\n }\n return { filesWritten, staleFilesRemoved, warnings, stopHookInstalled };\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport fg from \"fast-glob\";\nimport { z } from \"zod\";\nimport { parseAgent } from \"./parser/agent.js\";\nimport { parseCmd } from \"./parser/cmd.js\";\nimport { type Skill, parseSkill } from \"./parser/skill.js\";\nimport type { Harness, HarnessOverrides } from \"./render.js\";\nimport { parseYAML } from \"./util/yaml.js\";\n\nexport const DisableYamlSchema = z\n .object({ disable: z.array(z.string()).optional() })\n .passthrough();\n\nexport interface LoadOptions {\n agentsDir?: string;\n skillsDir?: string;\n commandsDir?: string;\n}\n\nexport function loadHarness(packageDir: string, opts: LoadOptions = {}): Harness {\n const agentsDir = opts.agentsDir ?? join(packageDir, \"agents\");\n const skillsDir = opts.skillsDir ?? join(packageDir, \"skills\");\n const commandsDir = opts.commandsDir ?? join(packageDir, \"commands\");\n\n const agentFiles = fg.sync(\"*.agent.md\", { cwd: agentsDir, absolute: true });\n const skillFiles = fg.sync(\"*.skill.md\", { cwd: skillsDir, absolute: true });\n const cmdFiles = fg.sync(\"*.cmd.md\", { cwd: commandsDir, absolute: true });\n\n return {\n agents: agentFiles.map((f) => parseAgent(f, readFileSync(f, \"utf8\"))),\n skills: skillFiles.map((f) => parseSkill(f, readFileSync(f, \"utf8\"))),\n cmds: cmdFiles.map((f) => parseCmd(f, readFileSync(f, \"utf8\"))),\n };\n}\n\nexport function loadProjectSkills(targetDir: string): Skill[] {\n const skillsDir = join(targetDir, \"docs\", \"skills\");\n if (!existsSync(skillsDir)) return [];\n const skillFiles = fg.sync(\"*.skill.md\", { cwd: skillsDir, absolute: true });\n return skillFiles.map((f) => parseSkill(f, readFileSync(f, \"utf8\")));\n}\n\nexport function loadOverrides(worktreeDir: string): HarnessOverrides | undefined {\n const overridesDir = join(worktreeDir, \".harness-overrides\");\n if (!existsSync(overridesDir)) return undefined;\n\n const added = loadHarness(overridesDir, {\n agentsDir: join(overridesDir, \"agents\"),\n skillsDir: join(overridesDir, \"skills\"),\n commandsDir: join(overridesDir, \"commands\"),\n });\n\n const disablePath = join(overridesDir, \"disable.yaml\");\n let disable: string[] = [];\n if (existsSync(disablePath)) {\n try {\n const parsed = DisableYamlSchema.safeParse(parseYAML(readFileSync(disablePath, \"utf8\")));\n if (parsed.success && parsed.data.disable) {\n disable = parsed.data.disable;\n }\n } catch {\n // corrupt YAML — leave disable as []\n }\n }\n\n return { add: added, disable };\n}\n","import { readFileSync } from \"node:fs\";\nimport matter from \"gray-matter\";\nimport type { z } from \"zod\";\nimport { ParseError } from \"./schemas.js\";\n\nexport interface ParsedFile<T> {\n meta: T;\n body: string;\n sourcePath: string;\n}\n\nexport function parseWithSchema<T extends z.ZodTypeAny>(\n filePath: string,\n source: string,\n schema: T,\n): ParsedFile<z.infer<T>> {\n const parsed = matter(source);\n const result = schema.safeParse(parsed.data);\n if (!result.success) {\n throw new ParseError(filePath, result.error.issues);\n }\n return {\n meta: result.data,\n body: parsed.content.trim(),\n sourcePath: filePath,\n };\n}\n\nexport function parseFileWithSchema<T extends z.ZodTypeAny>(\n filePath: string,\n schema: T,\n): ParsedFile<z.infer<T>> {\n const source = readFileSync(filePath, \"utf8\");\n return parseWithSchema(filePath, source, schema);\n}\n","import { z } from \"zod\";\nimport { AGENT_IDS, CAPABILITIES, ENGINES } from \"../types.js\";\n\nconst IdSchema = z\n .string()\n .min(1)\n .regex(/^[a-z][a-z0-9-]*$/, \"id must be kebab-case (lowercase + digits + hyphens)\");\n\nconst SkillFrontmatterSchema = z\n .object({\n id: IdSchema,\n description: z.string().min(1),\n engines: z.array(z.enum(ENGINES)).min(1).optional(),\n requires: z.array(z.enum(CAPABILITIES)).optional(),\n tags: z.array(z.string()).optional(),\n })\n .strict();\n\nexport type SkillFrontmatter = z.infer<typeof SkillFrontmatterSchema>;\n\nconst CmdArgEnumSchema = z\n .object({\n name: z.string().min(1),\n type: z.literal(\"enum\"),\n values: z.array(z.string()).min(1),\n default: z.string().optional(),\n })\n .strict();\n\nconst CmdArgStringSchema = z\n .object({\n name: z.string().min(1),\n type: z.literal(\"string\"),\n default: z.string().optional(),\n })\n .strict();\n\nconst CmdArgSchema = z.discriminatedUnion(\"type\", [CmdArgEnumSchema, CmdArgStringSchema]);\n\nexport type CmdArg = z.infer<typeof CmdArgSchema>;\n\nconst CmdFrontmatterSchema = z\n .object({\n id: IdSchema,\n trigger: z.string().regex(/^\\/[a-z][a-z0-9-]*$/, \"trigger must be /kebab-case\"),\n invokes_skill: IdSchema,\n args: z.array(CmdArgSchema).optional(),\n description: z.string().min(1),\n })\n .strict();\n\nexport type CmdFrontmatter = z.infer<typeof CmdFrontmatterSchema>;\n\nconst AgentFrontmatterSchema = z\n .object({\n id: z.enum(AGENT_IDS),\n description: z.string().min(1),\n })\n .strict();\n\nexport type AgentFrontmatter = z.infer<typeof AgentFrontmatterSchema>;\n\nexport const Schemas = {\n Skill: SkillFrontmatterSchema,\n Cmd: CmdFrontmatterSchema,\n Agent: AgentFrontmatterSchema,\n} as const;\n\nexport class ParseError extends Error {\n constructor(\n public readonly file: string,\n public readonly issues: z.ZodIssue[],\n ) {\n const messages = issues\n .map((i) => ` - ${i.path.join(\".\") || \"<root>\"}: ${i.message}`)\n .join(\"\\n\");\n super(`Frontmatter validation failed for ${file}:\\n${messages}`);\n this.name = \"ParseError\";\n }\n}\n","export const AGENT_IDS = [\"coding\", \"review\", \"merge\", \"planning\"] as const;\nexport type AgentId = (typeof AGENT_IDS)[number];\n\nexport const ENGINES = [\"claude-code\", \"codex-cli\", \"opencode\"] as const;\nexport type Engine = (typeof ENGINES)[number];\n\nexport const ENGINE_ROOT_DIR: Record<Engine, string> = {\n \"claude-code\": \".claude\",\n \"codex-cli\": \".codex\",\n opencode: \".opencode\",\n};\n\nexport const CAPABILITIES = [\"multi-step\", \"slash-command\", \"inline-exec\"] as const;\nexport type Capability = (typeof CAPABILITIES)[number];\n\nexport interface RenderedFile {\n path: string;\n content: string;\n}\n\nexport interface CapabilitiesMatrix {\n [engine: string]: ReadonlyArray<Capability>;\n}\n\nexport const CAPABILITIES_MATRIX: Record<Engine, ReadonlyArray<Capability>> = {\n \"claude-code\": [\"multi-step\", \"slash-command\", \"inline-exec\"],\n \"codex-cli\": [\"multi-step\", \"slash-command\", \"inline-exec\"],\n opencode: [\"multi-step\", \"slash-command\", \"inline-exec\"],\n};\n\nexport const DEGRADED_CAPABILITIES: Partial<Record<Engine, ReadonlyArray<Capability>>> = {\n \"codex-cli\": [\"multi-step\"],\n};\n\nexport function engineSupports(engine: Engine, capability: Capability): boolean {\n return CAPABILITIES_MATRIX[engine].includes(capability);\n}\n","import { parseFileWithSchema, parseWithSchema } from \"./common.js\";\nimport type { ParsedFile } from \"./common.js\";\nimport { type AgentFrontmatter, Schemas } from \"./schemas.js\";\n\nexport type Agent = ParsedFile<AgentFrontmatter>;\n\nexport function parseAgent(filePath: string, source: string): Agent {\n return parseWithSchema(filePath, source, Schemas.Agent);\n}\n\nexport function parseAgentFile(filePath: string): Agent {\n return parseFileWithSchema(filePath, Schemas.Agent);\n}\n","import { parseFileWithSchema, parseWithSchema } from \"./common.js\";\nimport type { ParsedFile } from \"./common.js\";\nimport { type CmdFrontmatter, Schemas } from \"./schemas.js\";\n\nexport type Cmd = ParsedFile<CmdFrontmatter>;\n\nexport function parseCmd(filePath: string, source: string): Cmd {\n return parseWithSchema(filePath, source, Schemas.Cmd);\n}\n\nexport function parseCmdFile(filePath: string): Cmd {\n return parseFileWithSchema(filePath, Schemas.Cmd);\n}\n","import { parseFileWithSchema, parseWithSchema } from \"./common.js\";\nimport type { ParsedFile } from \"./common.js\";\nimport { Schemas, type SkillFrontmatter } from \"./schemas.js\";\n\nexport type Skill = ParsedFile<SkillFrontmatter>;\n\nexport function parseSkill(filePath: string, source: string): Skill {\n return parseWithSchema(filePath, source, Schemas.Skill);\n}\n\nexport function parseSkillFile(filePath: string): Skill {\n return parseFileWithSchema(filePath, Schemas.Skill);\n}\n","import { parse as yamlParse } from \"yaml\";\n\nexport function parseYAML(source: string): unknown {\n return yamlParse(source);\n}\n","export const MCP_SERVER_IDS = [\"context7\"] as const;\nexport type McpServerId = (typeof MCP_SERVER_IDS)[number];\n\nexport interface McpServerSpec {\n id: McpServerId;\n description: string;\n command: string;\n args: ReadonlyArray<string>;\n env?: Record<string, string>;\n}\n\nexport const MCP_SERVERS: Record<McpServerId, McpServerSpec> = {\n context7: {\n id: \"context7\",\n description:\n \"Upstash Context7 — fetches up-to-date library docs via resolve-library-id + get-library-docs.\",\n command: \"npx\",\n args: [\"-y\", \"@upstash/context7-mcp\"],\n },\n};\n\nexport function resolveMcpIds(requested: ReadonlyArray<string>): McpServerId[] {\n return requested.map((id) => {\n if (!(MCP_SERVER_IDS as ReadonlyArray<string>).includes(id)) {\n throw new Error(`unknown MCP server: ${id} (expected one of ${MCP_SERVER_IDS.join(\", \")})`);\n }\n return id as McpServerId;\n });\n}\n","import { stringify as yamlStringify } from \"yaml\";\nimport type { McpServerSpec } from \"../mcp.js\";\nimport type { Agent } from \"../parser/agent.js\";\nimport type { Cmd } from \"../parser/cmd.js\";\nimport type { Skill } from \"../parser/skill.js\";\nimport {\n CAPABILITIES_MATRIX,\n type Capability,\n DEGRADED_CAPABILITIES,\n type Engine,\n type RenderedFile,\n} from \"../types.js\";\n\nexport interface UmbrellaExtras {\n availableSkills: ReadonlyArray<Skill>;\n availableCommands: ReadonlyArray<Cmd>;\n hasProjectSkills?: boolean;\n hasQualityDoc?: boolean;\n}\n\nexport interface RenderResult {\n files: RenderedFile[];\n warnings: string[];\n}\n\nexport interface Renderer {\n readonly engine: Engine;\n renderSkill(skill: Skill): RenderResult;\n renderCmd(cmd: Cmd): RenderResult;\n renderAgents(agents: ReadonlyArray<Agent>): RenderResult;\n renderMcp(servers: ReadonlyArray<McpServerSpec>): RenderResult;\n renderStopHook(): RenderResult;\n}\n\nexport const STOP_HOOK_PACKAGE = \"@vaubaan/harness\";\n\nexport interface CapabilityCheck {\n blockingWarnings: string[];\n degradedWarnings: string[];\n}\n\nexport function checkSkillCapabilities(skill: Skill, engine: Engine): CapabilityCheck {\n const blockingWarnings: string[] = [];\n const degradedWarnings: string[] = [];\n const supported = CAPABILITIES_MATRIX[engine];\n const degraded = DEGRADED_CAPABILITIES[engine] ?? [];\n if (!skill.meta.requires) return { blockingWarnings, degradedWarnings };\n for (const cap of skill.meta.requires) {\n if (!supported.includes(cap as Capability)) {\n blockingWarnings.push(\n `skill \"${skill.meta.id}\" requires \"${cap}\" not supported by \"${engine}\" — skipped`,\n );\n } else if (degraded.includes(cap as Capability)) {\n degradedWarnings.push(\n `skill \"${skill.meta.id}\" requires \"${cap}\" — supported by \"${engine}\" with degradation`,\n );\n }\n }\n return { blockingWarnings, degradedWarnings };\n}\n\nexport function isSkillEngineAllowed(skill: Skill, engine: Engine): boolean {\n if (!skill.meta.engines) return true;\n return skill.meta.engines.includes(engine);\n}\n\nexport function yamlFrontmatter(data: Record<string, unknown>): string {\n const rendered = yamlStringify(data, { lineWidth: 0 }).trimEnd();\n return `---\\n${rendered}\\n---\\n`;\n}\n\nconst SCALAR_NEEDS_QUOTE = /[^a-zA-Z0-9_./-]/;\n\nfunction tomlEscapeString(s: string): string {\n return `\"${s.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\")}\"`;\n}\n\nfunction tomlValue(v: unknown): string {\n if (Array.isArray(v)) {\n return `[${v.map((x) => tomlValue(x)).join(\", \")}]`;\n }\n if (typeof v === \"string\") {\n if (v.includes(\"\\n\")) return tomlEscapeString(v);\n return SCALAR_NEEDS_QUOTE.test(v) ? tomlEscapeString(v) : `\"${v}\"`;\n }\n if (typeof v === \"boolean\" || typeof v === \"number\") {\n return String(v);\n }\n return tomlEscapeString(String(v));\n}\n\n/** TOML multi-line basic string (`\"\"\"…\"\"\"`), used for Codex `developer_instructions`. */\nexport function tomlMultilineString(s: string): string {\n const escaped = s.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"\"\"/g, '\"\"\\\\\"');\n return `\"\"\"\\n${escaped}\\n\"\"\"`;\n}\n\nexport function tomlQuoteString(s: string): string {\n return tomlValue(s);\n}\n\nexport function tomlInlineArray(items: ReadonlyArray<unknown>): string {\n return tomlValue([...items]);\n}\n\nexport function tomlInlineTable(table: Record<string, string>): string {\n const entries = Object.entries(table).map(([k, v]) => `${k} = ${tomlValue(v)}`);\n return `{ ${entries.join(\", \")} }`;\n}\n\nexport function frontmatterDataForSkill(skill: Skill): Record<string, unknown> {\n // Agent Skills spec (agentskills.io): `name` must match the directory name.\n const data: Record<string, unknown> = {\n name: skill.meta.id,\n description: skill.meta.description,\n };\n if (skill.meta.tags && skill.meta.tags.length > 0) data.tags = skill.meta.tags;\n return data;\n}\n\nexport function frontmatterDataForCmd(cmd: Cmd): Record<string, unknown> {\n const data: Record<string, unknown> = {\n id: cmd.meta.id,\n trigger: cmd.meta.trigger,\n description: cmd.meta.description,\n };\n if (cmd.meta.args && cmd.meta.args.length > 0) {\n data.args = cmd.meta.args.map((a) => {\n if (a.type === \"enum\") {\n return a.default !== undefined\n ? { name: a.name, type: a.type, values: a.values, default: a.default }\n : { name: a.name, type: a.type, values: a.values };\n }\n return a.default !== undefined\n ? { name: a.name, type: a.type, default: a.default }\n : { name: a.name, type: a.type };\n });\n }\n return data;\n}\n\n/**\n * Personas carry their role contract only: engines discover skills and\n * commands natively, so listing them per persona is pure context cost.\n */\nexport function buildAgentBody(agent: Agent): string {\n return `${agent.body.trim()}\\n`;\n}\n\nexport function buildUmbrellaBody(_agents: ReadonlyArray<Agent>, extras: UmbrellaExtras): string {\n const triggerBySkill = new Map(\n extras.availableCommands.map((c) => [c.meta.invokes_skill, c.meta.trigger]),\n );\n const skillLines = extras.availableSkills.map((s) => {\n const trigger = triggerBySkill.get(s.meta.id);\n const label = trigger ? `\\`${s.meta.id}\\` (\\`${trigger}\\`)` : `\\`${s.meta.id}\\``;\n return `- ${label} — ${s.meta.description.split(\"\\n\")[0]}`;\n });\n const sections: string[] = [\n \"# How we work\",\n \"\",\n \"This file describes **how to work in this project**. The **business context** (what the project does, how to run it, which subsystems it contains) lives in `README.md` and `docs/`. Read them first.\",\n \"\",\n \"## Project map\",\n \"\",\n \"- `README.md` — pitch, quick start, scripts. Entry point.\",\n \"- `docs/spec/<subsystem>.md` — *what* and *why* (tech-agnostic).\",\n \"- `docs/handbook/<feature>.md` — *how it actually works* today.\",\n \"- `docs/decisions/<slug>.md` — ADRs: structural choices and rejected alternatives.\",\n \"- `docs/tests/integration-tests.md` & `e2e-tests.md` — core scenarios.\",\n \"- `docs/workflow/coding-workflow.md` — CI, branches, PR, release.\",\n ...(extras.hasProjectSkills\n ? [\"- `docs/skills/*.skill.md` — the project's domain skills.\"]\n : []),\n ...(extras.hasQualityDoc\n ? [\n \"- `docs/quality/code-quality.md` — the project's code-quality rules: mechanical checks, judgment rules, accepted deviations. Read it before writing or auditing code.\",\n ]\n : []),\n \"\",\n \"## Doc-first\",\n \"\",\n \"The order is: **understand the docs → fill the gaps → code → update the docs → commit**. If the docs are silent or stale on something you change, fill the gap upfront with the doc-skill writers — not downstream, not after the fact.\",\n \"\",\n \"- Missing spec for a subsystem you touch → **do not code**, report the gap.\",\n \"- Implicit structural decision in your changes → an ADR (`/decision`).\",\n \"- Changed feature behavior → update the matching handbook (`/handbook`).\",\n \"- Suspected code ↔ doc drift → `/drift` before moving on.\",\n ];\n if (skillLines.length > 0) {\n sections.push(\"\", \"## Doc-skills\", \"\", skillLines.join(\"\\n\"));\n }\n return `${sections.join(\"\\n\")}\\n`;\n}\n","import type { McpServerSpec } from \"../mcp.js\";\nimport type { Agent } from \"../parser/agent.js\";\nimport type { Cmd } from \"../parser/cmd.js\";\nimport type { Skill } from \"../parser/skill.js\";\nimport type { Engine } from \"../types.js\";\nimport {\n type RenderResult,\n type Renderer,\n STOP_HOOK_PACKAGE,\n buildAgentBody,\n checkSkillCapabilities,\n frontmatterDataForCmd,\n frontmatterDataForSkill,\n isSkillEngineAllowed,\n yamlFrontmatter,\n} from \"./common.js\";\n\nconst ENGINE: Engine = \"claude-code\";\nconst BASE = \".claude\";\n\nexport const claudeCodeRenderer: Renderer = {\n engine: ENGINE,\n renderSkill(skill: Skill): RenderResult {\n if (!isSkillEngineAllowed(skill, ENGINE)) {\n return {\n files: [],\n warnings: [`skill \"${skill.meta.id}\" excluded from engine \"${ENGINE}\"`],\n };\n }\n const check = checkSkillCapabilities(skill, ENGINE);\n if (check.blockingWarnings.length > 0) {\n return { files: [], warnings: check.blockingWarnings };\n }\n const content = `${yamlFrontmatter(frontmatterDataForSkill(skill))}\\n${skill.body}\\n`;\n return {\n files: [{ path: `${BASE}/skills/${skill.meta.id}/SKILL.md`, content }],\n warnings: check.degradedWarnings,\n };\n },\n renderCmd(cmd: Cmd): RenderResult {\n const content = `${yamlFrontmatter(frontmatterDataForCmd(cmd))}\\n${cmd.body}\\n`;\n return {\n files: [{ path: `${BASE}/commands/${cmd.meta.id}.md`, content }],\n warnings: [],\n };\n },\n renderAgents(agents: ReadonlyArray<Agent>): RenderResult {\n const files = [];\n for (const agent of agents) {\n const subagentFrontmatter = yamlFrontmatter({\n name: agent.meta.id,\n description: agent.meta.description,\n });\n const body = buildAgentBody(agent);\n const content = `${subagentFrontmatter}\\n${body}`;\n files.push({ path: `${BASE}/agents/${agent.meta.id}.md`, content });\n }\n return { files, warnings: [] };\n },\n renderMcp(servers: ReadonlyArray<McpServerSpec>): RenderResult {\n if (servers.length === 0) return { files: [], warnings: [] };\n const mcpServers: Record<string, Record<string, unknown>> = {};\n for (const s of servers) {\n const entry: Record<string, unknown> = { command: s.command, args: [...s.args] };\n if (s.env) entry.env = s.env;\n mcpServers[s.id] = entry;\n }\n const content = `${JSON.stringify({ mcpServers }, null, 2)}\\n`;\n return { files: [{ path: \".mcp.json\", content }], warnings: [] };\n },\n renderStopHook(): RenderResult {\n const settings = {\n hooks: {\n Stop: [\n {\n matcher: \"\",\n hooks: [\n {\n type: \"command\",\n command: `npx -y ${STOP_HOOK_PACKAGE} stop-hook --engine claude`,\n },\n ],\n },\n ],\n },\n };\n return {\n files: [{ path: `${BASE}/settings.json`, content: `${JSON.stringify(settings, null, 2)}\\n` }],\n warnings: [],\n };\n },\n};\n","import type { McpServerSpec } from \"../mcp.js\";\nimport type { Agent } from \"../parser/agent.js\";\nimport type { Cmd } from \"../parser/cmd.js\";\nimport type { Skill } from \"../parser/skill.js\";\nimport type { Engine } from \"../types.js\";\nimport {\n type RenderResult,\n type Renderer,\n STOP_HOOK_PACKAGE,\n buildAgentBody,\n checkSkillCapabilities,\n frontmatterDataForSkill,\n isSkillEngineAllowed,\n tomlInlineArray,\n tomlInlineTable,\n tomlMultilineString,\n tomlQuoteString,\n yamlFrontmatter,\n} from \"./common.js\";\n\nconst ENGINE: Engine = \"codex-cli\";\nconst BASE = \".codex\";\n// Codex discovers repo skills under `.agents/skills/` only — `.codex/skills/` is not scanned.\nconst SKILLS_BASE = \".agents/skills\";\n\nexport const codexCliRenderer: Renderer = {\n engine: ENGINE,\n renderSkill(skill: Skill): RenderResult {\n if (!isSkillEngineAllowed(skill, ENGINE)) {\n return {\n files: [],\n warnings: [`skill \"${skill.meta.id}\" excluded from engine \"${ENGINE}\"`],\n };\n }\n const check = checkSkillCapabilities(skill, ENGINE);\n if (check.blockingWarnings.length > 0) {\n return { files: [], warnings: check.blockingWarnings };\n }\n const content = `${yamlFrontmatter(frontmatterDataForSkill(skill))}\\n${skill.body}\\n`;\n return {\n files: [{ path: `${SKILLS_BASE}/${skill.meta.id}/SKILL.md`, content }],\n warnings: check.degradedWarnings,\n };\n },\n // Codex custom prompts are deprecated in favour of skills: nothing to render.\n renderCmd(_cmd: Cmd): RenderResult {\n return { files: [], warnings: [] };\n },\n renderAgents(agents: ReadonlyArray<Agent>): RenderResult {\n const files = [];\n for (const agent of agents) {\n const content = [\n `name = ${tomlQuoteString(agent.meta.id)}`,\n `description = ${tomlQuoteString(agent.meta.description)}`,\n `developer_instructions = ${tomlMultilineString(buildAgentBody(agent).trimEnd())}`,\n \"\",\n ].join(\"\\n\");\n files.push({ path: `${BASE}/agents/${agent.meta.id}.toml`, content });\n }\n return { files, warnings: [] };\n },\n renderMcp(servers: ReadonlyArray<McpServerSpec>): RenderResult {\n if (servers.length === 0) return { files: [], warnings: [] };\n const blocks: string[] = [];\n for (const s of servers) {\n const lines = [\n `[mcp_servers.${s.id}]`,\n `command = ${tomlQuoteString(s.command)}`,\n `args = ${tomlInlineArray([...s.args])}`,\n ];\n if (s.env) lines.push(`env = ${tomlInlineTable(s.env)}`);\n blocks.push(lines.join(\"\\n\"));\n }\n const content = `${blocks.join(\"\\n\\n\")}\\n`;\n return { files: [{ path: `${BASE}/config.toml`, content }], warnings: [] };\n },\n renderStopHook(): RenderResult {\n const hooks = {\n hooks: {\n Stop: [\n {\n hooks: [\n {\n type: \"command\",\n command: `npx -y ${STOP_HOOK_PACKAGE} stop-hook --engine codex`,\n },\n ],\n },\n ],\n },\n };\n return {\n files: [{ path: `${BASE}/hooks.json`, content: `${JSON.stringify(hooks, null, 2)}\\n` }],\n warnings: [],\n };\n },\n};\n","import type { McpServerSpec } from \"../mcp.js\";\nimport type { Agent } from \"../parser/agent.js\";\nimport type { Cmd } from \"../parser/cmd.js\";\nimport type { Skill } from \"../parser/skill.js\";\nimport type { Engine } from \"../types.js\";\nimport {\n type RenderResult,\n type Renderer,\n STOP_HOOK_PACKAGE,\n buildAgentBody,\n checkSkillCapabilities,\n frontmatterDataForSkill,\n isSkillEngineAllowed,\n yamlFrontmatter,\n} from \"./common.js\";\n\nconst ENGINE: Engine = \"opencode\";\nconst BASE = \".opencode\";\n\nexport const opencodeRenderer: Renderer = {\n engine: ENGINE,\n renderSkill(skill: Skill): RenderResult {\n if (!isSkillEngineAllowed(skill, ENGINE)) {\n return {\n files: [],\n warnings: [`skill \"${skill.meta.id}\" excluded from engine \"${ENGINE}\"`],\n };\n }\n const check = checkSkillCapabilities(skill, ENGINE);\n if (check.blockingWarnings.length > 0) {\n return { files: [], warnings: check.blockingWarnings };\n }\n const content = `${yamlFrontmatter(frontmatterDataForSkill(skill))}\\n${skill.body}\\n`;\n return {\n files: [{ path: `${BASE}/skills/${skill.meta.id}/SKILL.md`, content }],\n warnings: check.degradedWarnings,\n };\n },\n renderCmd(cmd: Cmd): RenderResult {\n // OpenCode names the command after the file; only `description` is a known key.\n const content = `${yamlFrontmatter({ description: cmd.meta.description })}\\n${cmd.body}\\n`;\n return {\n files: [{ path: `${BASE}/commands/${cmd.meta.id}.md`, content }],\n warnings: [],\n };\n },\n renderAgents(agents: ReadonlyArray<Agent>): RenderResult {\n const files = [];\n for (const agent of agents) {\n // The file name is the agent name. `mode: all` keeps each persona usable\n // both as a session's primary agent and as a subagent.\n const fm = yamlFrontmatter({\n description: agent.meta.description,\n mode: \"all\",\n });\n const body = buildAgentBody(agent);\n files.push({ path: `${BASE}/agents/${agent.meta.id}.md`, content: `${fm}\\n${body}` });\n }\n return { files, warnings: [] };\n },\n renderMcp(servers: ReadonlyArray<McpServerSpec>): RenderResult {\n if (servers.length === 0) return { files: [], warnings: [] };\n const mcp: Record<string, Record<string, unknown>> = {};\n for (const s of servers) {\n const entry: Record<string, unknown> = {\n type: \"local\",\n command: [s.command, ...s.args],\n enabled: true,\n };\n if (s.env) entry.environment = s.env;\n mcp[s.id] = entry;\n }\n const config = { $schema: \"https://opencode.ai/config.json\", mcp };\n const content = `${JSON.stringify(config, null, 2)}\\n`;\n return { files: [{ path: `${BASE}/opencode.json`, content }], warnings: [] };\n },\n renderStopHook(): RenderResult {\n const content = `import { spawnSync } from \"node:child_process\";\n\n// Runs the harness lint and returns the report to inject, or \"\" when the\n// turn may end.\nconst lintReport = (directory, sessionID) => {\n const r = spawnSync(\n \"npx\",\n [\"-y\", \"${STOP_HOOK_PACKAGE}\", \"stop-hook\", \"--engine\", \"opencode\", \"--cwd\", directory],\n { input: JSON.stringify({ sessionID }), encoding: \"utf-8\" },\n );\n const report = (r.stderr ?? \"\").trim();\n return r.status === 2 ? report : \"\";\n};\n\n// OpenCode 1.x entry point, exposed as server() below.\nconst HarnessStopHook = async ({ client, directory }) => ({\n event: async ({ event }) => {\n if (event.type !== \"session.idle\") return;\n const sessionID = event.properties?.sessionID;\n if (!sessionID) return;\n const report = lintReport(directory, sessionID);\n if (report === \"\") return;\n // OpenCode defaults to its build agent when a prompt omits agent.\n // Preserve the last conversation persona, excluding compaction summaries.\n const history = await client.session.messages({ path: { id: sessionID } }).catch(() => undefined);\n if (history?.error || !Array.isArray(history?.data)) return;\n const current = history.data.findLast(({ info }) =>\n (info.role === \"user\" || (info.role === \"assistant\" && !info.summary)) &&\n typeof info.agent === \"string\" && info.agent.trim() !== \"\",\n );\n if (!current) return;\n await client.session.prompt({\n path: { id: sessionID },\n body: { agent: current.info.agent, parts: [{ type: \"text\", text: report }] },\n });\n },\n});\n\n// One default export for both majors: OpenCode 1.x calls server(),\n// OpenCode 2.x calls setup(). A V2 session keeps its agent, so the report\n// is sent without naming the persona.\nexport default {\n id: \"vaubaan-harness-stop-hook\",\n server: HarnessStopHook,\n setup(context) {\n const directory = context.location.directory;\n const controller = new AbortController();\n const listen = async () => {\n for await (const event of context.event.subscribe({ signal: controller.signal })) {\n if (event.type !== \"session.idle\") continue;\n if (event.location?.directory && event.location.directory !== directory) continue;\n const sessionID = event.data?.sessionID;\n if (!sessionID) continue;\n const report = lintReport(directory, sessionID);\n if (report === \"\") continue;\n await context.session.prompt({ sessionID, text: report }).catch(() => undefined);\n }\n };\n listen().catch(() => undefined);\n return () => controller.abort();\n },\n};\n`;\n return {\n files: [{ path: `${BASE}/plugins/harness-stop-hook.ts`, content }],\n warnings: [],\n };\n },\n};\n","import type { Engine } from \"../types.js\";\nimport { claudeCodeRenderer } from \"./claude-code.js\";\nimport { codexCliRenderer } from \"./codex-cli.js\";\nimport type { Renderer } from \"./common.js\";\nimport { opencodeRenderer } from \"./opencode.js\";\n\nexport const RENDERERS: Record<Engine, Renderer> = {\n \"claude-code\": claudeCodeRenderer,\n \"codex-cli\": codexCliRenderer,\n opencode: opencodeRenderer,\n};\n\nexport function getRenderer(engine: Engine): Renderer {\n return RENDERERS[engine];\n}\n\nexport type { Renderer, RenderResult } from \"./common.js\";\n","import { MCP_SERVERS, type McpServerId } from \"./mcp.js\";\nimport type { Agent } from \"./parser/agent.js\";\nimport type { Cmd } from \"./parser/cmd.js\";\nimport type { Skill } from \"./parser/skill.js\";\nimport { buildUmbrellaBody } from \"./renderers/common.js\";\nimport { getRenderer } from \"./renderers/index.js\";\nimport type { Engine, RenderedFile } from \"./types.js\";\n\nexport interface Harness {\n agents: ReadonlyArray<Agent>;\n skills: ReadonlyArray<Skill>;\n cmds: ReadonlyArray<Cmd>;\n}\n\nexport interface HarnessOverrides {\n add?: Partial<Harness>;\n disable?: ReadonlyArray<string>;\n}\n\nexport interface RenderInput {\n harness: Harness;\n engines: ReadonlyArray<Engine>;\n overrides?: HarnessOverrides;\n projectSkills?: ReadonlyArray<Skill>;\n /** True when the target project ships `docs/quality/code-quality.md` (optional pillar). */\n hasQualityDoc?: boolean;\n mcpServers?: ReadonlyArray<McpServerId>;\n /**\n * When true (default), each engine's renderer emits a Stop-hook config\n * that calls `vaubaan-harness stop-hook --engine <engine>` and injects\n * the lint report (with skill suggestions) into the running session\n * whenever the worktree is dirty and lint fails. Pass `false` to skip\n * the hook configs entirely (kill-switch at install time; runtime\n * kill-switch is `HARNESS_LINT_DISABLE=1`).\n */\n withStopHook?: boolean;\n}\n\nexport interface RenderOutput {\n files: RenderedFile[];\n warnings: string[];\n}\n\nexport class RenderError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"RenderError\";\n }\n}\n\nfunction mergeById<T extends { meta: { id: string } }>(\n stock: ReadonlyArray<T>,\n added: ReadonlyArray<T> | undefined,\n): T[] {\n const result = new Map<string, T>();\n for (const item of stock) result.set(item.meta.id, item);\n if (added) {\n for (const item of added) result.set(item.meta.id, item);\n }\n return Array.from(result.values());\n}\n\nfunction removeByIds<T extends { meta: { id: string } }>(\n items: ReadonlyArray<T>,\n disabled: ReadonlyArray<string>,\n): T[] {\n if (disabled.length === 0) return [...items];\n const disabledSet = new Set(disabled);\n return items.filter((item) => !disabledSet.has(item.meta.id));\n}\n\nexport function applyOverrides(harness: Harness, overrides: HarnessOverrides | undefined): Harness {\n const disabled = overrides?.disable ?? [];\n return {\n agents: removeByIds(mergeById(harness.agents, overrides?.add?.agents), disabled),\n skills: removeByIds(mergeById(harness.skills, overrides?.add?.skills), disabled),\n cmds: removeByIds(mergeById(harness.cmds, overrides?.add?.cmds), disabled),\n };\n}\n\n// `@AGENTS.md` is Claude Code's import syntax: the umbrella is really loaded,\n// on every version and provider, and never read twice alongside native\n// AGENTS.md support (cf. ADR engine-native-layouts-1-0).\nconst CLAUDE_MD_STUB = \"@AGENTS.md\\n\";\n\n// OpenCode also scans `.claude/skills/` and `.agents/skills/`. It goes last so\n// its own copy of a skill is dropped when another rendered engine exposes it.\nfunction opencodeLast(engines: ReadonlyArray<Engine>): Engine[] {\n return [...engines].sort((a, b) => Number(a === \"opencode\") - Number(b === \"opencode\"));\n}\n\nexport function render(input: RenderInput): RenderOutput {\n const { engines } = input;\n if (engines.length === 0) {\n throw new RenderError(\"at least one engine must be selected\");\n }\n const base: Harness = input.projectSkills?.length\n ? { ...input.harness, skills: mergeById(input.harness.skills, input.projectSkills) }\n : input.harness;\n const harness = applyOverrides(base, input.overrides);\n if (harness.agents.length === 0) {\n throw new RenderError(\"No agents found in harness\");\n }\n\n const files: RenderedFile[] = [];\n const warnings: string[] = [];\n\n // Track skills + commands successfully exposed on at least one engine,\n // for the engine-neutral umbrella's \"Available skills/commands\" sections.\n const exposedSkills = new Map<string, Skill>();\n const exposedCmds = new Map<string, Cmd>();\n\n for (const engine of opencodeLast(engines)) {\n const renderer = getRenderer(engine);\n\n const renderedSkills: Skill[] = [];\n for (const skill of harness.skills) {\n const result = renderer.renderSkill(skill);\n warnings.push(...result.warnings);\n if (result.files.length > 0) {\n const alreadyVisible = engine === \"opencode\" && exposedSkills.has(skill.meta.id);\n if (!alreadyVisible) files.push(...result.files);\n renderedSkills.push(skill);\n exposedSkills.set(skill.meta.id, skill);\n }\n }\n\n const renderedSkillIds = new Set(renderedSkills.map((s) => s.meta.id));\n const renderedCmds: Cmd[] = [];\n for (const cmd of harness.cmds) {\n if (!renderedSkillIds.has(cmd.meta.invokes_skill)) continue;\n const result = renderer.renderCmd(cmd);\n warnings.push(...result.warnings);\n if (result.files.length > 0) {\n files.push(...result.files);\n renderedCmds.push(cmd);\n exposedCmds.set(cmd.meta.id, cmd);\n }\n }\n\n const agentsResult = renderer.renderAgents(harness.agents);\n warnings.push(...agentsResult.warnings);\n files.push(...agentsResult.files);\n\n if (input.mcpServers && input.mcpServers.length > 0) {\n const specs = input.mcpServers.map((id) => MCP_SERVERS[id]);\n const mcpResult = renderer.renderMcp(specs);\n warnings.push(...mcpResult.warnings);\n files.push(...mcpResult.files);\n }\n\n if (input.withStopHook !== false) {\n const hookResult = renderer.renderStopHook();\n warnings.push(...hookResult.warnings);\n files.push(...hookResult.files);\n }\n }\n\n // Engine-neutral umbrella at the root\n const hasProjectSkills = (input.projectSkills?.length ?? 0) > 0;\n const umbrellaContent = buildUmbrellaBody(harness.agents, {\n availableSkills: Array.from(exposedSkills.values()),\n availableCommands: Array.from(exposedCmds.values()),\n hasProjectSkills,\n hasQualityDoc: input.hasQualityDoc === true,\n });\n files.push({ path: \"AGENTS.md\", content: umbrellaContent });\n\n // CLAUDE.md stub only if claude-code is enabled (Claude Code reads it historically)\n if (engines.includes(\"claude-code\")) {\n files.push({ path: \"CLAUDE.md\", content: CLAUDE_MD_STUB });\n }\n\n return { files, warnings };\n}\n","import { lstatSync, realpathSync, statSync } from \"node:fs\";\nimport { basename, dirname, isAbsolute, join, resolve, win32 } from \"node:path\";\n\nconst MANAGED_FILES = new Set([\n \"AGENTS.md\",\n \"CLAUDE.md\",\n \".mcp.json\",\n \".harness-manifest.json\",\n \".claude/settings.json\",\n \".codex/config.toml\",\n \".codex/hooks.json\",\n \".opencode/opencode.json\",\n \".opencode/mcp.json\",\n]);\n\n// Includes legacy layouts so upgrades can remove their generated artifacts.\nconst MANAGED_DIRECTORIES = [\n \".claude/agents/\",\n \".claude/commands/\",\n \".claude/skills/\",\n \".codex/agents/\",\n \".codex/commands/\",\n \".codex/skills/\",\n \".agents/skills/\",\n \".opencode/agents/\",\n \".opencode/commands/\",\n \".opencode/skills/\",\n \".opencode/plugins/\",\n];\n\nfunction canonicalTargetRoot(root: string): string {\n let ancestor = resolve(root);\n const missing: string[] = [];\n while (!lstatSync(ancestor, { throwIfNoEntry: false })) {\n missing.unshift(basename(ancestor));\n ancestor = dirname(ancestor);\n }\n const canonical = realpathSync(ancestor);\n if (!statSync(canonical).isDirectory()) {\n throw new Error(`harness target is not a directory: ${root}`);\n }\n return join(canonical, ...missing);\n}\n\nfunction assertManagedLocation(path: string): void {\n const invalidSegment = path\n .split(\"/\")\n .some((part) => part === \"\" || part === \".\" || part === \"..\");\n if (\n isAbsolute(path) ||\n win32.isAbsolute(path) ||\n path.includes(\"\\\\\") ||\n path.includes(\"\\0\") ||\n invalidSegment\n ) {\n throw new Error(`unsafe harness path: ${path}`);\n }\n if (!MANAGED_FILES.has(path) && !MANAGED_DIRECTORIES.some((prefix) => path.startsWith(prefix))) {\n throw new Error(`path is outside harness-managed locations: ${path}`);\n }\n}\n\nfunction assertNoSymbolicComponents(root: string, path: string): void {\n const parts = path.split(\"/\");\n let current = root;\n for (const [index, part] of parts.entries()) {\n current = join(current, part);\n const info = lstatSync(current, { throwIfNoEntry: false });\n if (!info) return;\n if (info.isSymbolicLink()) {\n throw new Error(`symbolic link in harness path: ${path}`);\n }\n const isLeaf = index === parts.length - 1;\n if (isLeaf ? !info.isFile() : !info.isDirectory()) {\n throw new Error(`unexpected file type in harness path: ${path}`);\n }\n }\n}\n\n/**\n * Preflight the complete list before callers mutate any artifact. The target\n * itself may resolve through a symlink; every component below it, including\n * leaf files and the manifest, must be a regular file or directory, never a\n * symlink (even one pointing inside the target). Missing targets are allowed.\n * This checks the current filesystem, not concurrent changes by other processes.\n */\nexport function assertManagedPaths(root: string, files: ReadonlyArray<string>): void {\n for (const path of files) assertManagedLocation(path);\n const canonicalRoot = canonicalTargetRoot(root);\n for (const path of files) assertNoSymbolicComponents(canonicalRoot, path);\n}\n","import { createHash } from \"node:crypto\";\nimport { chmodSync, existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { z } from \"zod\";\nimport type { Engine } from \"../types.js\";\nimport { VERSION } from \"../version.js\";\nimport { assertManagedPaths } from \"./managed-paths.js\";\nimport { type OpenCodeConfigOwnership, OpenCodeConfigOwnershipSchema } from \"./opencode-config.js\";\nimport { type HookConfigsOwnership, HookConfigsOwnershipSchema } from \"./update-config.js\";\n\nexport const MANIFEST_FILENAME = \".harness-manifest.json\";\nexport const MANIFEST_VERSION = \"6\";\n\nconst ManifestSchema = z.object({\n version: z.enum([\"4\", \"5\", MANIFEST_VERSION]),\n engines: z.array(z.string()),\n renderedAt: z.string(),\n files: z.array(z.string()),\n stopHookInstalled: z.boolean().optional(),\n stopHookEngines: z.array(z.string()).optional(),\n opencodeConfig: OpenCodeConfigOwnershipSchema.optional(),\n hookConfigs: HookConfigsOwnershipSchema.optional(),\n harnessVersion: z.string().optional(),\n overridesDir: z.string().optional(),\n fileHashes: z.record(z.string().regex(/^[a-f0-9]{64}$/)).optional(),\n preservedFiles: z.array(z.string()).optional(),\n});\n\nexport type Manifest = z.infer<typeof ManifestSchema>;\n\nexport interface WriteManifestExtras {\n stopHookInstalled?: boolean;\n stopHookEngines?: ReadonlyArray<Engine>;\n opencodeConfig?: OpenCodeConfigOwnership;\n hookConfigs?: HookConfigsOwnership;\n overridesDir?: string;\n preservedFiles?: string[];\n}\n\nexport function manifestPath(targetDir: string): string {\n return join(targetDir, MANIFEST_FILENAME);\n}\n\nexport function writeManifest(\n targetDir: string,\n engines: ReadonlyArray<Engine>,\n files: string[],\n extras: WriteManifestExtras = {},\n): void {\n assertManagedPaths(targetDir, [MANIFEST_FILENAME]);\n const manifest: Manifest = {\n version: MANIFEST_VERSION,\n harnessVersion: VERSION,\n engines: [...engines].sort(),\n renderedAt: new Date().toISOString(),\n files: [...files].sort(),\n fileHashes: Object.fromEntries(\n files\n .filter((file) => existsSync(join(targetDir, file)))\n .sort()\n .map((file) => [file, hashContent(readFileSync(join(targetDir, file)))]),\n ),\n ...(extras.overridesDir ? { overridesDir: extras.overridesDir } : {}),\n ...(extras.preservedFiles ? { preservedFiles: extras.preservedFiles } : {}),\n ...(extras.hookConfigs ? { hookConfigs: extras.hookConfigs } : {}),\n ...(extras.opencodeConfig ? { opencodeConfig: extras.opencodeConfig } : {}),\n ...(extras.stopHookInstalled !== undefined\n ? { stopHookInstalled: extras.stopHookInstalled }\n : {}),\n ...(extras.stopHookEngines !== undefined\n ? { stopHookEngines: [...extras.stopHookEngines].sort() }\n : {}),\n };\n const path = manifestPath(targetDir);\n if (existsSync(path)) chmodSync(path, 0o600);\n writeFileSync(path, `${JSON.stringify(manifest, null, 2)}\\n`, { mode: 0o600 });\n}\n\nexport function hashContent(content: string | Buffer): string {\n return createHash(\"sha256\").update(content).digest(\"hex\");\n}\n\nexport function readManifest(targetDir: string): Manifest | null {\n assertManagedPaths(targetDir, [MANIFEST_FILENAME]);\n const path = manifestPath(targetDir);\n if (!existsSync(path)) return null;\n const raw = JSON.parse(readFileSync(path, \"utf8\"));\n return ManifestSchema.parse(raw);\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { isDeepStrictEqual } from \"node:util\";\nimport { z } from \"zod\";\nimport type { RenderedFile } from \"../types.js\";\n\nexport const OPENCODE_CONFIG_PATH = \".opencode/opencode.json\";\nconst OPENCODE_SCHEMA = \"https://opencode.ai/config.json\";\nconst ObjectSchema = z.record(z.unknown());\n\nexport const OpenCodeConfigOwnershipSchema = z.object({\n createdFile: z.boolean(),\n addedMcp: z.boolean(),\n addedSchema: z.boolean(),\n entries: z.record(ObjectSchema),\n});\n\nexport type OpenCodeConfigOwnership = z.infer<typeof OpenCodeConfigOwnershipSchema>;\n\nexport interface OpenCodeConfigPlan {\n write?: RenderedFile;\n remove: boolean;\n ownership?: OpenCodeConfigOwnership;\n warnings: string[];\n}\n\nfunction parseConfig(content: string): Record<string, unknown> {\n try {\n const config = ObjectSchema.parse(JSON.parse(content));\n if (Object.hasOwn(config, \"mcp\")) ObjectSchema.parse(config.mcp);\n return config;\n } catch {\n throw new Error(`invalid ${OPENCODE_CONFIG_PATH}: expected a JSON object with an MCP object`);\n }\n}\n\nfunction removeOwnedEntries(\n config: Record<string, unknown>,\n ownership: OpenCodeConfigOwnership,\n warnings: string[],\n): void {\n if (Object.hasOwn(config, \"mcp\")) {\n const mcp = ObjectSchema.parse(config.mcp);\n for (const [id, installed] of Object.entries(ownership.entries)) {\n if (!Object.hasOwn(mcp, id)) continue;\n if (isDeepStrictEqual(mcp[id], installed)) delete mcp[id];\n else warnings.push(`preserved modified OpenCode MCP server: ${id}`);\n }\n config.mcp = mcp;\n if (ownership.addedMcp && Object.keys(mcp).length === 0) Reflect.deleteProperty(config, \"mcp\");\n }\n if (ownership.addedSchema && config.$schema === OPENCODE_SCHEMA)\n Reflect.deleteProperty(config, \"$schema\");\n}\n\nfunction addMissingEntries(\n config: Record<string, unknown>,\n desired: RenderedFile,\n createdFile: boolean,\n warnings: string[],\n): OpenCodeConfigOwnership | undefined {\n const requested = ObjectSchema.parse(parseConfig(desired.content).mcp);\n const mcp = ObjectSchema.parse(config.mcp ?? {});\n const entries: Record<string, Record<string, unknown>> = {};\n for (const [id, entry] of Object.entries(requested)) {\n if (Object.hasOwn(mcp, id)) {\n if (!isDeepStrictEqual(mcp[id], entry)) {\n warnings.push(`preserved existing OpenCode MCP server instead of replacing it: ${id}`);\n }\n continue;\n }\n entries[id] = ObjectSchema.parse(entry);\n mcp[id] = entry;\n }\n if (Object.keys(entries).length === 0) return undefined;\n const ownership = {\n createdFile,\n addedMcp: !Object.hasOwn(config, \"mcp\"),\n addedSchema: !Object.hasOwn(config, \"$schema\"),\n entries,\n };\n config.mcp = mcp;\n if (ownership.addedSchema) config.$schema = OPENCODE_SCHEMA;\n return ownership;\n}\n\n/** Plans shared configuration edits before init/uninstall mutate any project files. */\nexport function planOpenCodeConfig(\n root: string,\n desired: RenderedFile | undefined,\n previous: OpenCodeConfigOwnership | undefined,\n): OpenCodeConfigPlan {\n const warnings: string[] = [];\n if (!desired && !previous) return { remove: false, warnings };\n const path = join(root, OPENCODE_CONFIG_PATH);\n const existed = existsSync(path);\n if (!existed && !desired) return { remove: false, warnings };\n const original = existed ? readFileSync(path, \"utf8\") : undefined;\n const config = original === undefined ? {} : parseConfig(original);\n const before = structuredClone(config);\n if (previous) removeOwnedEntries(config, previous, warnings);\n const createdFile = !existed || previous?.createdFile === true;\n const ownership = desired ? addMissingEntries(config, desired, createdFile, warnings) : undefined;\n if (!ownership && createdFile && Object.keys(config).length === 0) {\n return { remove: existed, warnings };\n }\n return {\n remove: false,\n ownership,\n warnings,\n ...(!existed || !isDeepStrictEqual(before, config)\n ? { write: { path: OPENCODE_CONFIG_PATH, content: `${JSON.stringify(config, null, 2)}\\n` } }\n : {}),\n };\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { isDeepStrictEqual } from \"node:util\";\nimport { z } from \"zod\";\nimport { getRenderer } from \"../renderers/index.js\";\nimport type { Engine, RenderedFile } from \"../types.js\";\nimport { assertManagedPaths } from \"./managed-paths.js\";\nimport {\n OPENCODE_CONFIG_PATH,\n type OpenCodeConfigOwnership,\n planOpenCodeConfig,\n} from \"./opencode-config.js\";\n\nconst LEGACY_OPENCODE_CONFIG = \".opencode/mcp.json\";\nexport const SHARED_CONFIG_PATHS: ReadonlyArray<string> = [\n \".mcp.json\",\n \".codex/config.toml\",\n OPENCODE_CONFIG_PATH,\n LEGACY_OPENCODE_CONFIG,\n \".claude/settings.json\",\n \".codex/hooks.json\",\n];\n\nconst ObjectSchema = z.record(z.unknown());\nconst HookEntrySchema = z.object({ group: ObjectSchema, hook: ObjectSchema });\nconst HookConfigOwnershipSchema = z.object({\n createdFile: z.boolean(),\n addedHooks: z.boolean(),\n addedStop: z.boolean(),\n entries: z.array(HookEntrySchema),\n});\nexport const HookConfigsOwnershipSchema = z\n .object({\n \".claude/settings.json\": HookConfigOwnershipSchema.optional(),\n \".codex/hooks.json\": HookConfigOwnershipSchema.optional(),\n })\n .strict();\nexport type HookConfigsOwnership = z.infer<typeof HookConfigsOwnershipSchema>;\ntype HookConfigOwnership = z.infer<typeof HookConfigOwnershipSchema>;\ntype HookEntry = z.infer<typeof HookEntrySchema>;\ntype HookPath = keyof HookConfigsOwnership;\n\nconst HOOK_ENGINES: Record<HookPath, Engine> = {\n \".claude/settings.json\": \"claude-code\",\n \".codex/hooks.json\": \"codex-cli\",\n};\n\nexport interface ConfigMutations {\n writes: RenderedFile[];\n removals: string[];\n warnings: string[];\n}\n\nexport interface UpdateConfigPrevious {\n files: ReadonlyArray<string>;\n opencodeConfig?: OpenCodeConfigOwnership;\n hookConfigs?: HookConfigsOwnership;\n}\n\nexport interface UpdateConfigPlan extends ConfigMutations {\n ownedFiles: string[];\n opencodeConfig?: OpenCodeConfigOwnership;\n hookConfigs?: HookConfigsOwnership;\n}\n\nfunction parseObject(content: string, path: string): Record<string, unknown> {\n try {\n return ObjectSchema.parse(JSON.parse(content));\n } catch {\n throw new Error(`invalid shared configuration ${path}: expected a JSON object`);\n }\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n const parsed = ObjectSchema.safeParse(value);\n return parsed.success ? parsed.data : undefined;\n}\n\nfunction stopHooks(config: Record<string, unknown>, path: string): unknown[] {\n if (!Object.hasOwn(config, \"hooks\")) return [];\n const hooks = asObject(config.hooks);\n if (!hooks || (Object.hasOwn(hooks, \"Stop\") && !Array.isArray(hooks.Stop))) {\n throw new Error(`invalid shared configuration ${path}: expected hooks.Stop to be an array`);\n }\n return Array.isArray(hooks.Stop) ? hooks.Stop : [];\n}\n\nfunction groupMetadata(group: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(Object.entries(group).filter(([key]) => key !== \"hooks\"));\n}\n\nfunction sameEntry(left: HookEntry, right: HookEntry): boolean {\n return isDeepStrictEqual(left.group, right.group) && isDeepStrictEqual(left.hook, right.hook);\n}\n\nfunction appendEntry(entries: HookEntry[], entry: HookEntry): void {\n if (!entries.some((existing) => sameEntry(existing, entry))) entries.push(entry);\n}\n\nfunction defaultStopGroup(engine: Engine): Record<string, unknown> {\n const file = getRenderer(engine).renderStopHook().files[0];\n if (!file) throw new Error(`missing Stop hook renderer for ${engine}`);\n const group = asObject(stopHooks(parseObject(file.content, file.path), file.path)[0]);\n if (!group || !Array.isArray(group.hooks) || !asObject(group.hooks[0])) {\n throw new Error(`invalid Stop hook renderer for ${engine}`);\n }\n return group;\n}\n\nfunction normalizeHarnessHooks(\n groups: unknown[],\n expected: Record<string, unknown>,\n previous: HookConfigOwnership | undefined,\n claimExisting: boolean,\n warnings: string[],\n path: HookPath,\n): { groups: unknown[]; entries: HookEntry[] } {\n const defaultHook = ObjectSchema.parse((expected.hooks as unknown[])[0]);\n const entries = [...(previous?.entries ?? [])];\n let found = false;\n const normalized = groups.map((value) => {\n const group = asObject(value);\n if (!group) return value;\n const flat = group.type === \"command\" && group.command === defaultHook.command;\n const hooks = flat ? [group] : Array.isArray(group.hooks) ? group.hooks : [];\n const metadata = flat ? groupMetadata(expected) : groupMetadata(group);\n for (const value of hooks) {\n const hook = asObject(value);\n if (!hook || hook.type !== \"command\" || hook.command !== defaultHook.command) continue;\n found = true;\n const entry = { group: metadata, hook };\n if (!claimExisting) continue;\n if (previous && !previous.entries.some((old) => sameEntry(old, entry))) {\n warnings.push(`preserved modified harness Stop hook: ${path}`);\n } else {\n appendEntry(entries, entry);\n }\n }\n return flat && claimExisting ? { ...metadata, hooks: [group] } : value;\n });\n if (!found && !previous?.entries.length) {\n normalized.push(expected);\n appendEntry(entries, { group: groupMetadata(expected), hook: defaultHook });\n } else if (!found) {\n warnings.push(`preserved removed or modified harness Stop hook: ${path}`);\n }\n return { groups: normalized, entries };\n}\n\nfunction removeOwnedHooks(\n config: Record<string, unknown>,\n ownership: HookConfigOwnership,\n path: HookPath,\n warnings: string[],\n): void {\n const groups = stopHooks(config, path);\n const remaining: unknown[] = [];\n const matched = new Set<HookEntry>();\n for (const value of groups) {\n const group = asObject(value);\n if (!group || !Array.isArray(group.hooks)) {\n remaining.push(value);\n continue;\n }\n const metadata = groupMetadata(group);\n const hooks = group.hooks.filter((value) => {\n const hook = asObject(value);\n const entry =\n hook && ownership.entries.find((old) => sameEntry(old, { group: metadata, hook }));\n if (entry) matched.add(entry);\n return !entry;\n });\n if (hooks.length > 0 || hooks.length === group.hooks.length) {\n remaining.push({ ...group, hooks });\n }\n }\n if (matched.size < ownership.entries.length) {\n warnings.push(`preserved removed or modified harness Stop hook: ${path}`);\n }\n const hooks = asObject(config.hooks);\n if (!hooks) return;\n if (ownership.addedStop && remaining.length === 0) Reflect.deleteProperty(hooks, \"Stop\");\n else if (Object.hasOwn(hooks, \"Stop\")) hooks.Stop = remaining;\n if (ownership.addedHooks && Object.keys(hooks).length === 0)\n Reflect.deleteProperty(config, \"hooks\");\n else config.hooks = hooks;\n}\n\nfunction recordMutation(\n plan: ConfigMutations,\n path: string,\n before: Record<string, unknown> | undefined,\n after: Record<string, unknown>,\n createdFile: boolean,\n): void {\n if (createdFile && Object.keys(after).length === 0) {\n if (before) plan.removals.push(path);\n } else if (!isDeepStrictEqual(before, after)) {\n plan.writes.push({ path, content: `${JSON.stringify(after, null, 2)}\\n` });\n }\n}\n\nexport function planHookConfigCleanup(\n root: string,\n ownership: HookConfigsOwnership | undefined,\n): ConfigMutations {\n const plan: ConfigMutations = { writes: [], removals: [], warnings: [] };\n if (!ownership) return plan;\n const validated = HookConfigsOwnershipSchema.parse(ownership);\n assertManagedPaths(root, Object.keys(validated));\n for (const path of Object.keys(HOOK_ENGINES) as HookPath[]) {\n const owned = validated[path];\n if (!owned || !existsSync(join(root, path))) continue;\n const before = parseObject(readFileSync(join(root, path), \"utf8\"), path);\n const config = structuredClone(before);\n removeOwnedHooks(config, owned, path, plan.warnings);\n recordMutation(plan, path, before, config, owned.createdFile);\n }\n return plan;\n}\n\nfunction planActiveHook(\n root: string,\n path: HookPath,\n previous: HookConfigOwnership | undefined,\n claimExisting: boolean,\n plan: UpdateConfigPlan,\n): HookConfigOwnership | undefined {\n assertManagedPaths(root, [path]);\n const existed = existsSync(join(root, path));\n if (!existed && previous?.entries.length) {\n plan.warnings.push(`preserved removed harness Stop hook configuration: ${path}`);\n return previous;\n }\n const before = existed ? parseObject(readFileSync(join(root, path), \"utf8\"), path) : undefined;\n const config = structuredClone(before ?? {});\n const groups = stopHooks(config, path);\n const hooks = asObject(config.hooks) ?? {};\n const normalized = normalizeHarnessHooks(\n groups,\n defaultStopGroup(HOOK_ENGINES[path]),\n previous,\n claimExisting,\n plan.warnings,\n path,\n );\n const ownership = {\n createdFile: !existed || previous?.createdFile === true,\n addedHooks: previous?.addedHooks ?? !Object.hasOwn(config, \"hooks\"),\n addedStop: previous?.addedStop ?? !Object.hasOwn(hooks, \"Stop\"),\n entries: normalized.entries,\n };\n if (!isDeepStrictEqual(groups, normalized.groups)) {\n config.hooks = { ...hooks, Stop: normalized.groups };\n }\n recordMutation(plan, path, before, config, ownership.createdFile);\n return ownership.entries.length > 0 ? ownership : undefined;\n}\n\nfunction planLegacyOpenCode(\n root: string,\n previous: UpdateConfigPrevious,\n plan: UpdateConfigPlan,\n): void {\n if (!previous.files.includes(LEGACY_OPENCODE_CONFIG)) return;\n const legacyPath = join(root, LEGACY_OPENCODE_CONFIG);\n if (!existsSync(legacyPath)) return;\n assertManagedPaths(root, [LEGACY_OPENCODE_CONFIG, OPENCODE_CONFIG_PATH]);\n const legacy = parseObject(readFileSync(legacyPath, \"utf8\"), LEGACY_OPENCODE_CONFIG);\n if (!asObject(legacy.mcp)) {\n throw new Error(\n `invalid shared configuration ${LEGACY_OPENCODE_CONFIG}: expected an MCP object`,\n );\n }\n const merged = planOpenCodeConfig(\n root,\n { path: OPENCODE_CONFIG_PATH, content: JSON.stringify(legacy) },\n undefined,\n );\n if (merged.write) plan.writes.push(merged.write);\n plan.warnings.push(...merged.warnings);\n if (merged.ownership) {\n const old = previous.opencodeConfig;\n plan.opencodeConfig = {\n createdFile: merged.ownership.createdFile || old?.createdFile === true,\n addedMcp: merged.ownership.addedMcp || old?.addedMcp === true,\n addedSchema: merged.ownership.addedSchema || old?.addedSchema === true,\n entries: { ...old?.entries, ...merged.ownership.entries },\n };\n }\n plan.removals.push(LEGACY_OPENCODE_CONFIG);\n}\n\n/** Preserve existing MCP settings and plan only shared hook/legacy-layout changes. */\nexport function planUpdateConfigs(\n root: string,\n previous: UpdateConfigPrevious,\n hookEngines: ReadonlyArray<Engine>,\n): UpdateConfigPlan {\n const plan: UpdateConfigPlan = {\n writes: [],\n removals: [],\n ownedFiles: [],\n warnings: [],\n ...(previous.opencodeConfig ? { opencodeConfig: previous.opencodeConfig } : {}),\n };\n planLegacyOpenCode(root, previous, plan);\n const hookConfigs: HookConfigsOwnership = {};\n for (const path of Object.keys(HOOK_ENGINES) as HookPath[]) {\n const owned = previous.hookConfigs?.[path];\n if (hookEngines.includes(HOOK_ENGINES[path])) {\n hookConfigs[path] = planActiveHook(\n root,\n path,\n owned,\n previous.files.includes(path) || Boolean(owned),\n plan,\n );\n } else if (owned) {\n const cleanup = planHookConfigCleanup(root, { [path]: owned });\n plan.writes.push(...cleanup.writes);\n plan.removals.push(...cleanup.removals);\n plan.warnings.push(...cleanup.warnings);\n }\n }\n if (Object.values(hookConfigs).some(Boolean)) plan.hookConfigs = hookConfigs;\n if (hookEngines.includes(\"opencode\")) {\n const plugin = getRenderer(\"opencode\").renderStopHook();\n plan.writes.push(...plugin.files);\n plan.ownedFiles.push(...plugin.files.map((file) => file.path));\n plan.warnings.push(...plugin.warnings);\n }\n return plan;\n}\n","import { existsSync, readdirSync, rmdirSync, unlinkSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, relative, resolve } from \"node:path\";\nimport { assertManagedPaths } from \"./managed-paths.js\";\nimport { MANIFEST_FILENAME, manifestPath, readManifest } from \"./manifest.js\";\nimport { OPENCODE_CONFIG_PATH, planOpenCodeConfig } from \"./opencode-config.js\";\nimport { planHookConfigCleanup } from \"./update-config.js\";\n\nexport interface UninstallArgs {\n targetDir: string;\n}\n\nexport interface UninstallResult {\n filesRemoved: string[];\n dirsPruned: string[];\n warnings: string[];\n}\n\nexport function uninstallCommand(args: UninstallArgs): UninstallResult {\n const root = resolve(args.targetDir);\n const warnings: string[] = [];\n assertManagedPaths(root, [MANIFEST_FILENAME]);\n const manifest = readManifest(root);\n if (!manifest) {\n warnings.push(`no manifest found at ${manifestPath(root)} — nothing to uninstall`);\n return { filesRemoved: [], dirsPruned: [], warnings };\n }\n\n assertManagedPaths(root, [\n ...manifest.files,\n ...(manifest.opencodeConfig ? [OPENCODE_CONFIG_PATH] : []),\n ...Object.keys(manifest.hookConfigs ?? {}),\n ]);\n const config = planOpenCodeConfig(root, undefined, manifest.opencodeConfig);\n const hooks = planHookConfigCleanup(root, manifest.hookConfigs);\n const sharedHooks = new Set(Object.keys(manifest.hookConfigs ?? {}));\n const ownedFiles = manifest.files.filter(\n (file) => file !== OPENCODE_CONFIG_PATH && !sharedHooks.has(file),\n );\n if (config.remove) ownedFiles.push(OPENCODE_CONFIG_PATH);\n ownedFiles.push(...hooks.removals);\n const { filesRemoved, dirsPruned, missing } = removeRenderedFiles(root, ownedFiles);\n if (config.write) writeFileSync(join(root, config.write.path), config.write.content);\n for (const file of hooks.writes) writeFileSync(join(root, file.path), file.content);\n warnings.push(...config.warnings, ...hooks.warnings);\n if (manifest.files.includes(OPENCODE_CONFIG_PATH) && !manifest.opencodeConfig) {\n warnings.push(`preserved legacy shared configuration: ${OPENCODE_CONFIG_PATH}`);\n }\n for (const rel of missing) warnings.push(`file in manifest is already missing: ${rel}`);\n\n unlinkSync(manifestPath(root));\n return { filesRemoved, dirsPruned, warnings };\n}\n\nexport function removeRenderedFiles(\n root: string,\n files: ReadonlyArray<string>,\n): { filesRemoved: string[]; dirsPruned: string[]; missing: string[] } {\n assertManagedPaths(root, files);\n const filesRemoved: string[] = [];\n const missing: string[] = [];\n const dirsToConsider = new Set<string>();\n for (const rel of files) {\n const full = join(root, rel);\n if (existsSync(full)) {\n unlinkSync(full);\n filesRemoved.push(rel);\n dirsToConsider.add(dirname(full));\n } else {\n missing.push(rel);\n }\n }\n return { filesRemoved, dirsPruned: pruneEmptyDirs(root, dirsToConsider), missing };\n}\n\nfunction pruneEmptyDirs(root: string, leaves: Set<string>): string[] {\n const candidates = new Set<string>();\n for (const leaf of leaves) {\n let cur = leaf;\n while (cur !== root && cur.startsWith(`${root}/`)) {\n candidates.add(cur);\n cur = dirname(cur);\n }\n }\n const pruned: string[] = [];\n const sorted = [...candidates].sort((a, b) => b.length - a.length);\n for (const dir of sorted) {\n if (!existsSync(dir)) continue;\n if (readdirSync(dir).length > 0) continue;\n rmdirSync(dir);\n pruned.push(relative(root, dir));\n }\n return pruned;\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { loadHarness } from \"../loader.js\";\nimport { resolveMcpIds } from \"../mcp.js\";\nimport { render as renderHarness } from \"../render.js\";\nimport { ENGINES, type Engine } from \"../types.js\";\n\nexport interface RenderArgs {\n engines?: ReadonlyArray<string>;\n outDir: string;\n packageDir: string;\n mcpServers?: ReadonlyArray<string>;\n withStopHook?: boolean;\n}\n\nexport interface RenderCommandResult {\n filesWritten: string[];\n warnings: string[];\n}\n\nexport function renderCommand(args: RenderArgs): RenderCommandResult {\n const engineList: Engine[] =\n args.engines && args.engines.length > 0\n ? args.engines.map((e) => {\n if (!ENGINES.includes(e as Engine)) {\n throw new Error(`unknown engine: ${e}`);\n }\n return e as Engine;\n })\n : [...ENGINES];\n const harness = loadHarness(args.packageDir);\n const mcpServers = args.mcpServers ? resolveMcpIds(args.mcpServers) : undefined;\n const output = renderHarness({\n harness,\n engines: engineList,\n mcpServers,\n withStopHook: args.withStopHook !== false,\n });\n const filesWritten: string[] = [];\n for (const f of output.files) {\n const full = join(args.outDir, f.path);\n mkdirSync(dirname(full), { recursive: true });\n writeFileSync(full, f.content);\n filesWritten.push(f.path);\n }\n return { filesWritten, warnings: output.warnings };\n}\n","import { readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { getAdapter } from \"../stop-hook/adapters/index.js\";\nimport { decide, defaultGitStatus, defaultRunLint } from \"../stop-hook/core.js\";\nimport { STOP_HOOK_ENGINES, type StopHookEngine } from \"../stop-hook/types.js\";\n\nexport interface StopHookArgs {\n engine: string;\n cwd?: string;\n}\n\nexport interface StopHookResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\nfunction readStdinSync(): string {\n try {\n return readFileSync(0, \"utf8\");\n } catch {\n return \"\";\n }\n}\n\nfunction assertEngine(engine: string): StopHookEngine {\n if (!(STOP_HOOK_ENGINES as ReadonlyArray<string>).includes(engine)) {\n throw new Error(`unknown engine: ${engine} (expected one of ${STOP_HOOK_ENGINES.join(\", \")})`);\n }\n return engine as StopHookEngine;\n}\n\nexport function stopHookCommand(args: StopHookArgs, stdin: string): StopHookResult {\n const engine = assertEngine(args.engine);\n const cwd = resolve(args.cwd ?? \".\");\n const adapter = getAdapter(engine);\n const payload = adapter.parseInput(stdin, process.env);\n const decision = decide(payload, {\n cwd,\n env: process.env,\n gitStatus: defaultGitStatus,\n runLint: defaultRunLint,\n });\n return adapter.respond(decision);\n}\n\nexport function stopHookCommandFromStdin(args: StopHookArgs): StopHookResult {\n return stopHookCommand(args, readStdinSync());\n}\n","import type { StopHookAdapter } from \"../types.js\";\n\n/**\n * Claude Code Stop hook protocol:\n *\n * in ← JSON on stdin with `session_id` and `stop_hook_active`\n * out → JSON on stdout with `{decision: \"block\", reason}` to force\n * continuation, or `{}` to let the session truly stop.\n *\n * See https://docs.claude.com/en/docs/claude-code/hooks\n */\nexport const claudeAdapter: StopHookAdapter = {\n parseInput(stdin) {\n const parsed = stdin.trim() === \"\" ? {} : (JSON.parse(stdin) as Record<string, unknown>);\n return {\n sessionId: typeof parsed.session_id === \"string\" ? parsed.session_id : \"default\",\n stopHookActive: parsed.stop_hook_active === true,\n };\n },\n respond(decision) {\n if (decision.kind === \"inject\") {\n return {\n stdout: `${JSON.stringify({ decision: \"block\", reason: decision.reason ?? \"\" })}\\n`,\n stderr: \"\",\n exitCode: 0,\n };\n }\n if (decision.kind === \"terminate\") {\n return {\n stdout: \"\",\n stderr: `${decision.reason ?? \"\"}\\n`,\n exitCode: 0,\n };\n }\n return { stdout: \"\", stderr: \"\", exitCode: 0 };\n },\n};\n","import type { StopHookAdapter } from \"../types.js\";\n\n/**\n * Codex CLI Stop hook protocol mirrors Claude Code's: same input\n * shape (`session_id`, `stop_hook_active`) and same output contract\n * (`{decision: \"block\", reason}` to continue, `{}` to stop).\n *\n * See https://developers.openai.com/codex/hooks\n */\nexport const codexAdapter: StopHookAdapter = {\n parseInput(stdin) {\n const parsed = stdin.trim() === \"\" ? {} : (JSON.parse(stdin) as Record<string, unknown>);\n return {\n sessionId: typeof parsed.session_id === \"string\" ? parsed.session_id : \"default\",\n stopHookActive: parsed.stop_hook_active === true,\n };\n },\n respond(decision) {\n if (decision.kind === \"inject\") {\n return {\n stdout: `${JSON.stringify({ decision: \"block\", reason: decision.reason ?? \"\" })}\\n`,\n stderr: \"\",\n exitCode: 0,\n };\n }\n if (decision.kind === \"terminate\") {\n return {\n stdout: \"\",\n stderr: `${decision.reason ?? \"\"}\\n`,\n exitCode: 0,\n };\n }\n return { stdout: \"\", stderr: \"\", exitCode: 0 };\n },\n};\n","import type { StopHookAdapter } from \"../types.js\";\n\n/**\n * opencode plugin Stop hook protocol (proxied by the rendered TS plugin):\n *\n * in ← JSON on stdin with `sessionID` (mapped from opencode's session\n * context object the plugin received).\n * out → exit code 2 + a prompt string on stderr to inject a continuation;\n * exit 0 + empty output to let the session stop.\n *\n * opencode does NOT expose a `stop_hook_active`-equivalent flag, so the\n * core anti-loop layers (dirty-gate + counter + no-progress) carry the\n * full defense weight here.\n *\n * See https://opencode.ai/docs/plugins/\n */\nexport const opencodeAdapter: StopHookAdapter = {\n parseInput(stdin) {\n const parsed = stdin.trim() === \"\" ? {} : (JSON.parse(stdin) as Record<string, unknown>);\n const sessionId =\n typeof parsed.sessionID === \"string\"\n ? parsed.sessionID\n : typeof parsed.session_id === \"string\"\n ? parsed.session_id\n : \"default\";\n return { sessionId, stopHookActive: false };\n },\n respond(decision) {\n if (decision.kind === \"inject\") {\n return { stdout: \"\", stderr: `${decision.reason ?? \"\"}\\n`, exitCode: 2 };\n }\n if (decision.kind === \"terminate\") {\n return { stdout: \"\", stderr: `${decision.reason ?? \"\"}\\n`, exitCode: 0 };\n }\n return { stdout: \"\", stderr: \"\", exitCode: 0 };\n },\n};\n","import type { StopHookAdapter, StopHookEngine } from \"../types.js\";\nimport { claudeAdapter } from \"./claude.js\";\nimport { codexAdapter } from \"./codex.js\";\nimport { opencodeAdapter } from \"./opencode.js\";\n\nexport const ADAPTERS: Record<StopHookEngine, StopHookAdapter> = {\n claude: claudeAdapter,\n codex: codexAdapter,\n opencode: opencodeAdapter,\n};\n\nexport function getAdapter(engine: StopHookEngine): StopHookAdapter {\n return ADAPTERS[engine];\n}\n","import { execFileSync } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { formatReportText, runLinters } from \"../linters/index.js\";\nimport { readState, resetState, writeState } from \"./state.js\";\nimport {\n type CoreEnv,\n DEFAULT_MAX_ATTEMPTS,\n type Decision,\n type LintRunResult,\n type NormalizedPayload,\n} from \"./types.js\";\n\nfunction exhaustedReason(attempts: number, lintOutput: string): string {\n return `Harness lint: still failing after ${attempts} attempts.\\n\\n${lintOutput}`;\n}\n\nfunction noProgressReason(lintOutput: string): string {\n return `Harness lint: no progress between attempts.\\n\\n${lintOutput}`;\n}\n\nfunction hash(s: string): string {\n return createHash(\"sha256\").update(s).digest(\"hex\").slice(0, 16);\n}\n\nfunction maxAttempts(env: NodeJS.ProcessEnv): number {\n const raw = env.HARNESS_LINT_MAX_ATTEMPTS;\n if (!raw) return DEFAULT_MAX_ATTEMPTS;\n const n = Number.parseInt(raw, 10);\n return Number.isFinite(n) && n > 0 ? n : DEFAULT_MAX_ATTEMPTS;\n}\n\nexport function defaultGitStatus(cwd: string): string {\n try {\n return execFileSync(\"git\", [\"status\", \"--porcelain\"], {\n cwd,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n } catch {\n return \"\";\n }\n}\n\nexport function defaultRunLint(cwd: string): LintRunResult {\n const report = runLinters(cwd);\n return { pass: report.summary.pass, output: formatReportText(report) };\n}\n\n/**\n * Pure decision function for the Stop-hook lint loop. Inputs are the\n * normalized payload from the engine adapter and a {@link CoreEnv}\n * abstracting filesystem-touching operations (git status, lint runner,\n * env vars, cwd) so tests can drive each branch without hitting disk\n * or invoking the actual linters.\n *\n * Branches (in order):\n * 1. kill switch HARNESS_LINT_DISABLE=1 → passthrough\n * 2. engine flag stopHookActive === true → passthrough\n * 3. git clean (no dirty files) → reset + passthrough\n * 4. lint pass → reset + passthrough\n * 5. lint fail, same output as previous attempt → reset + terminate (no progress)\n * 6. lint fail, attempts+1 > MAX_ATTEMPTS → reset + terminate (exhausted)\n * 7. lint fail, otherwise → persist + inject lint output\n */\nexport function decide(payload: NormalizedPayload, coreEnv: CoreEnv): Decision {\n if (coreEnv.env.HARNESS_LINT_DISABLE === \"1\") {\n return { kind: \"passthrough\" };\n }\n if (payload.stopHookActive) {\n return { kind: \"passthrough\" };\n }\n\n const dirty = coreEnv.gitStatus(coreEnv.cwd);\n if (dirty.trim() === \"\") {\n resetState(coreEnv.cwd, payload.sessionId);\n return { kind: \"passthrough\" };\n }\n\n const lintResult = coreEnv.runLint(coreEnv.cwd);\n if (lintResult.pass) {\n resetState(coreEnv.cwd, payload.sessionId);\n return { kind: \"passthrough\" };\n }\n\n const lintHash = hash(lintResult.output);\n const prev = readState(coreEnv.cwd, payload.sessionId);\n\n if (prev && prev.attempts > 0 && prev.lastLintHash === lintHash) {\n resetState(coreEnv.cwd, payload.sessionId);\n return { kind: \"terminate\", reason: noProgressReason(lintResult.output) };\n }\n\n const nextAttempts = (prev?.attempts ?? 0) + 1;\n const limit = maxAttempts(coreEnv.env);\n if (nextAttempts > limit) {\n resetState(coreEnv.cwd, payload.sessionId);\n return { kind: \"terminate\", reason: exhaustedReason(limit, lintResult.output) };\n }\n\n writeState(coreEnv.cwd, payload.sessionId, {\n attempts: nextAttempts,\n lastLintHash: lintHash,\n updatedAt: new Date().toISOString(),\n });\n return { kind: \"inject\", reason: lintResult.output };\n}\n","import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { z } from \"zod\";\nimport type { LintState } from \"./types.js\";\n\nconst LintStateSchema = z.object({\n attempts: z.number().int().nonnegative(),\n lastLintHash: z.string(),\n updatedAt: z.string(),\n});\n\nexport const STATE_DIR = \".harness/state\";\n\nfunction safeSessionId(sessionId: string): string {\n return sessionId.replace(/[^A-Za-z0-9_-]/g, \"_\").slice(0, 80) || \"default\";\n}\n\nexport function statePath(cwd: string, sessionId: string): string {\n return join(cwd, STATE_DIR, `lint-${safeSessionId(sessionId)}.json`);\n}\n\nexport function readState(cwd: string, sessionId: string): LintState | null {\n const path = statePath(cwd, sessionId);\n if (!existsSync(path)) return null;\n try {\n const raw = JSON.parse(readFileSync(path, \"utf8\"));\n return LintStateSchema.parse(raw);\n } catch {\n return null;\n }\n}\n\nexport function writeState(cwd: string, sessionId: string, state: LintState): void {\n const path = statePath(cwd, sessionId);\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, `${JSON.stringify(state, null, 2)}\\n`);\n}\n\nexport function resetState(cwd: string, sessionId: string): void {\n const path = statePath(cwd, sessionId);\n if (existsSync(path)) rmSync(path, { force: true });\n}\n","export const STOP_HOOK_ENGINES = [\"claude\", \"codex\", \"opencode\"] as const;\nexport type StopHookEngine = (typeof STOP_HOOK_ENGINES)[number];\n\nexport interface NormalizedPayload {\n sessionId: string;\n stopHookActive: boolean;\n}\n\nexport interface EngineResponse {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\nexport type DecisionKind = \"passthrough\" | \"inject\" | \"terminate\";\n\nexport interface Decision {\n kind: DecisionKind;\n /**\n * For `inject`: the lint report that the engine will hand back to the\n * agent as the next user-prompt.\n * For `terminate`: a short explanation surfaced via stderr.\n * For `passthrough`: unused.\n */\n reason?: string;\n}\n\nexport interface StopHookAdapter {\n parseInput(stdin: string, env: NodeJS.ProcessEnv): NormalizedPayload;\n respond(decision: Decision): EngineResponse;\n}\n\nexport interface LintState {\n attempts: number;\n lastLintHash: string;\n updatedAt: string;\n}\n\nexport interface LintRunResult {\n pass: boolean;\n output: string;\n}\n\nexport interface CoreEnv {\n cwd: string;\n env: NodeJS.ProcessEnv;\n gitStatus: (cwd: string) => string;\n runLint: (cwd: string) => LintRunResult;\n}\n\nexport const DEFAULT_MAX_ATTEMPTS = 3;\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { isDeepStrictEqual } from \"node:util\";\nimport { DisableYamlSchema } from \"../loader.js\";\nimport type { RenderedFile } from \"../types.js\";\nimport { parseYAML } from \"../util/yaml.js\";\nimport { VERSION } from \"../version.js\";\nimport { planInit } from \"./init.js\";\nimport { assertManagedPaths } from \"./managed-paths.js\";\nimport { MANIFEST_FILENAME, MANIFEST_VERSION, type Manifest, hashContent } from \"./manifest.js\";\nimport { SHARED_CONFIG_PATHS, planUpdateConfigs } from \"./update-config.js\";\nimport { readUpdateInstallation } from \"./update-manifest.js\";\nimport { applyUpdateTransaction } from \"./update-transaction.js\";\n\nexport interface UpdateArgs {\n targetDir: string;\n packageDir?: string;\n overridesDir?: string;\n preserveFiles?: ReadonlyArray<string>;\n dryRun?: boolean;\n /** Exact new backup directory, outside the project. Defaults to private user state. */\n backupDir?: string;\n}\n\nexport interface UpdateResult {\n version: string;\n fromManifestVersion: string;\n dryRun: boolean;\n upToDate: boolean;\n filesToWrite: string[];\n filesToRemove: string[];\n warnings: string[];\n backupDir?: string;\n}\n\nexport interface UpdatePlan {\n writes: RenderedFile[];\n removals: string[];\n result: UpdateResult;\n}\n\nfunction currentContent(root: string, path: string): string | undefined {\n return existsSync(join(root, path)) ? readFileSync(join(root, path), \"utf8\") : undefined;\n}\n\nfunction checkArtifactConflicts(\n root: string,\n previous: Manifest,\n writes: ReadonlyArray<RenderedFile>,\n removals: ReadonlyArray<string>,\n): void {\n const desired = new Map(writes.map((file) => [file.path, file.content]));\n for (const path of [...desired.keys(), ...removals]) {\n if (SHARED_CONFIG_PATHS.includes(path)) continue;\n const content = currentContent(root, path);\n if (content === undefined) continue;\n if (!previous.files.includes(path)) {\n throw new Error(\n `existing file outside harness manifest: ${path}; use overrides or --preserve`,\n );\n }\n const hash = previous.fileHashes?.[path];\n if (hash && hash !== hashContent(content) && content !== desired.get(path)) {\n throw new Error(`modified harness file: ${path}; move edits to overrides or use --preserve`);\n }\n }\n}\n\n/** All reads and validation precede backup creation and project mutations. */\nexport function planUpdate(args: UpdateArgs): UpdatePlan {\n const root = resolve(args.targetDir);\n const { manifest: previous, sourceVersion, engines, hookEngines } = readUpdateInstallation(root);\n const preserved = [\n ...new Set([...(previous.preservedFiles ?? []), ...(args.preserveFiles ?? [])]),\n ].sort();\n if (preserved.includes(MANIFEST_FILENAME))\n throw new Error(\"cannot preserve the harness manifest\");\n if (preserved.some((path) => SHARED_CONFIG_PATHS.includes(path))) {\n throw new Error(\n \"--preserve applies to generated artifacts; shared configurations use entry-level preservation\",\n );\n }\n assertManagedPaths(root, [...previous.files, ...preserved, ...SHARED_CONFIG_PATHS]);\n const requestedOverrides = args.overridesDir ?? previous.overridesDir;\n const overridesDir = args.overridesDir\n ? resolve(args.overridesDir)\n : previous.overridesDir\n ? resolve(root, previous.overridesDir)\n : root;\n if (requestedOverrides && !existsSync(join(overridesDir, \".harness-overrides\"))) {\n throw new Error(`recorded overrides are missing: ${overridesDir}/.harness-overrides`);\n }\n const hasOverrides = existsSync(join(overridesDir, \".harness-overrides\"));\n const disablePath = join(overridesDir, \".harness-overrides\", \"disable.yaml\");\n if (existsSync(disablePath)) {\n try {\n DisableYamlSchema.parse(parseYAML(readFileSync(disablePath, \"utf8\")));\n } catch {\n throw new Error(`invalid override selection: ${disablePath}`);\n }\n }\n const rendered = planInit({\n targetDir: root,\n packageDir: args.packageDir,\n engines,\n overridesDir: hasOverrides ? overridesDir : undefined,\n withStopHook: false,\n });\n const config = planUpdateConfigs(root, previous, hookEngines);\n const output = [...rendered.output.files, ...config.writes].filter(\n (file) => !preserved.includes(file.path),\n );\n const owned = [\n ...new Set([...rendered.output.files.map((file) => file.path), ...config.ownedFiles]),\n ]\n .filter((file) => !preserved.includes(file))\n .sort();\n const removals = [\n ...new Set([\n ...previous.files.filter(\n (file) => !owned.includes(file) && !SHARED_CONFIG_PATHS.includes(file),\n ),\n ...config.removals,\n ]),\n ].filter((file) => !preserved.includes(file));\n assertManagedPaths(root, [...output.map((file) => file.path), ...removals]);\n checkArtifactConflicts(root, previous, output, removals);\n const hashes = Object.fromEntries(\n owned.map((path) => {\n const content =\n output.find((file) => file.path === path)?.content ?? currentContent(root, path);\n if (content === undefined) throw new Error(`missing planned harness file: ${path}`);\n return [path, hashContent(content)];\n }),\n );\n const manifest: Manifest = {\n version: MANIFEST_VERSION,\n harnessVersion: VERSION,\n engines: [...engines].sort(),\n renderedAt: previous.renderedAt,\n files: owned,\n fileHashes: hashes,\n stopHookInstalled: hookEngines.length > 0,\n stopHookEngines: [...hookEngines].sort(),\n ...(hasOverrides ? { overridesDir: overridesDir === root ? \".\" : overridesDir } : {}),\n ...(preserved.length ? { preservedFiles: preserved } : {}),\n ...(config.opencodeConfig ? { opencodeConfig: config.opencodeConfig } : {}),\n ...(config.hookConfigs ? { hookConfigs: config.hookConfigs } : {}),\n };\n const writes = output.filter((file) => currentContent(root, file.path) !== file.content);\n const existingRemovals = removals.filter((path) => existsSync(join(root, path)));\n if (writes.length || existingRemovals.length || !isDeepStrictEqual(previous, manifest)) {\n manifest.renderedAt = new Date().toISOString();\n writes.push({ path: MANIFEST_FILENAME, content: `${JSON.stringify(manifest, null, 2)}\\n` });\n }\n const warnings = [...rendered.output.warnings, ...config.warnings];\n if (!previous.fileHashes) {\n warnings.push(\n \"legacy manifest has no file fingerprints: managed artifacts will be regenerated; backup preserves their previous contents\",\n );\n }\n if (preserved.length) warnings.push(`preserved user-owned artifacts: ${preserved.join(\", \")}`);\n if (engines.includes(\"codex-cli\"))\n warnings.push(\"ensure .agents/ is ignored by Git (run harness check)\");\n return {\n writes,\n removals: existingRemovals,\n result: {\n version: VERSION,\n fromManifestVersion: sourceVersion,\n dryRun: args.dryRun === true,\n upToDate: writes.length === 0 && existingRemovals.length === 0,\n filesToWrite: writes.map((file) => file.path),\n filesToRemove: existingRemovals,\n warnings,\n },\n };\n}\n\nexport function updateCommand(args: UpdateArgs): UpdateResult {\n const plan = planUpdate(args);\n if (args.dryRun || plan.result.upToDate) return plan.result;\n const { backupDir } = applyUpdateTransaction(\n resolve(args.targetDir),\n plan.writes,\n plan.removals,\n args.backupDir,\n );\n return { ...plan.result, backupDir };\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { z } from \"zod\";\nimport { ENGINES, type Engine } from \"../types.js\";\nimport { assertManagedPaths } from \"./managed-paths.js\";\nimport { MANIFEST_FILENAME, type Manifest, readManifest } from \"./manifest.js\";\n\nconst EngineSchema = z.enum(ENGINES);\nconst LegacySchema = z.object({\n version: z.enum([\"1\", \"2\", \"3\"]),\n engine: EngineSchema.optional(),\n engines: z.array(EngineSchema).nonempty().optional(),\n renderedAt: z.string(),\n files: z.array(z.string()),\n});\n\nexport interface UpdateInstallation {\n manifest: Manifest;\n sourceVersion: string;\n engines: Engine[];\n hookEngines: Engine[];\n}\n\nconst HOOK_PATHS: Record<Engine, string[]> = {\n \"claude-code\": [\".claude/settings.json\"],\n \"codex-cli\": [\".codex/hooks.json\"],\n opencode: [\n \".opencode/plugins/harness-stop-hook/index.ts\",\n \".opencode/plugins/harness-stop-hook.ts\",\n ],\n};\n\n/** Historical schemas are accepted only by the explicit migration command. */\nexport function readUpdateInstallation(root: string): UpdateInstallation {\n assertManagedPaths(root, [MANIFEST_FILENAME]);\n if (!existsSync(join(root, MANIFEST_FILENAME))) {\n throw new Error(\"no harness manifest found; use init for a new installation\");\n }\n const raw = JSON.parse(readFileSync(join(root, MANIFEST_FILENAME), \"utf8\"));\n const sourceVersion = String(raw?.version);\n let manifest: Manifest;\n if ([\"1\", \"2\", \"3\"].includes(sourceVersion)) {\n const legacy = LegacySchema.parse(raw);\n const engines = legacy.version === \"1\" ? [EngineSchema.parse(legacy.engine)] : legacy.engines;\n manifest = {\n version: \"4\",\n engines: z.array(EngineSchema).nonempty().parse(engines),\n files: legacy.files,\n renderedAt: legacy.renderedAt,\n };\n } else {\n const current = readManifest(root);\n if (!current) throw new Error(\"harness manifest disappeared during planning\");\n manifest = current;\n }\n const engines = [...new Set(z.array(EngineSchema).nonempty().parse(manifest.engines))];\n const hookEngines =\n manifest.stopHookInstalled === false\n ? []\n : manifest.stopHookEngines !== undefined\n ? z.array(EngineSchema).parse(manifest.stopHookEngines)\n : manifest.stopHookInstalled === true\n ? engines\n : engines.filter((engine) =>\n HOOK_PATHS[engine].some((path) => manifest.files.includes(path)),\n );\n if (hookEngines.some((engine) => !engines.includes(engine))) {\n throw new Error(\"manifest stopHookEngines must be a subset of installed engines\");\n }\n return { manifest, sourceVersion, engines, hookEngines: [...new Set(hookEngines)] };\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport {\n chmodSync,\n closeSync,\n fsyncSync,\n lstatSync,\n mkdirSync,\n openSync,\n readFileSync,\n readdirSync,\n realpathSync,\n rmdirSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { basename, dirname, isAbsolute, join, relative, resolve, sep } from \"node:path\";\nimport type { RenderedFile } from \"../types.js\";\nimport { assertManagedPaths } from \"./managed-paths.js\";\n\nconst MANIFEST_PATH = \".harness-manifest.json\";\nconst PRIVATE_FILES = new Set([\n MANIFEST_PATH,\n \".mcp.json\",\n \".codex/config.toml\",\n \".codex/hooks.json\",\n \".claude/settings.json\",\n \".opencode/opencode.json\",\n \".opencode/mcp.json\",\n]);\n\ntype SnapshotEntry =\n | { path: string; exists: false }\n | { path: string; exists: true; mode: number; sha256: string };\n\nfunction canonicalRoot(root: string): string {\n let ancestor = resolve(root);\n const missing: string[] = [];\n while (!lstatSync(ancestor, { throwIfNoEntry: false })) {\n missing.unshift(basename(ancestor));\n ancestor = dirname(ancestor);\n }\n return join(realpathSync(ancestor), ...missing);\n}\n\nfunction contains(parent: string, child: string): boolean {\n const path = relative(parent, child);\n return path === \"\" || (!isAbsolute(path) && path !== \"..\" && !path.startsWith(`..${sep}`));\n}\n\nfunction assertBackupLocation(root: string, backup: string): void {\n if (contains(root, backup) || contains(backup, root)) {\n throw new Error(`update backup must be outside the target project: ${backup}`);\n }\n const ancestors: string[] = [];\n for (let path = backup; ; path = dirname(path)) {\n ancestors.unshift(path);\n if (dirname(path) === path) break;\n }\n for (const path of ancestors) {\n const info = lstatSync(path, { throwIfNoEntry: false });\n if (!info) continue;\n if (info.isSymbolicLink() || !info.isDirectory()) {\n throw new Error(`unsafe update backup directory: ${path}`);\n }\n }\n if (lstatSync(backup, { throwIfNoEntry: false })) {\n throw new Error(`update backup directory already exists: ${backup}`);\n }\n}\n\nfunction createDirectories(path: string, created: string[], mode = 0o777): void {\n const missing: string[] = [];\n for (\n let current = path;\n !lstatSync(current, { throwIfNoEntry: false });\n current = dirname(current)\n ) {\n missing.unshift(current);\n }\n for (const directory of missing) {\n mkdirSync(directory, { mode });\n created.push(directory);\n }\n}\n\nfunction writeBackupFile(path: string, content: string | Buffer): void {\n createDirectories(dirname(path), [], 0o700);\n const fd = openSync(path, \"wx\", 0o600);\n try {\n writeFileSync(fd, content);\n fsyncSync(fd);\n } finally {\n closeSync(fd);\n }\n}\n\nfunction saveSnapshot(root: string, paths: string[], backup: string): SnapshotEntry[] {\n const entries: SnapshotEntry[] = [];\n createDirectories(dirname(backup), [], 0o700);\n mkdirSync(backup, { mode: 0o700 });\n for (const path of paths) {\n const full = join(root, path);\n const info = lstatSync(full, { throwIfNoEntry: false });\n if (!info) {\n entries.push({ path, exists: false });\n continue;\n }\n const content = readFileSync(full);\n writeBackupFile(join(backup, \"files\", path), content);\n entries.push({\n path,\n exists: true,\n mode: info.mode & 0o7777,\n sha256: createHash(\"sha256\").update(content).digest(\"hex\"),\n });\n }\n writeBackupFile(\n join(backup, \"snapshot.json\"),\n `${JSON.stringify({ version: 1, root, createdAt: new Date().toISOString(), entries }, null, 2)}\\n`,\n );\n return entries;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction rollback(\n root: string,\n backup: string,\n entries: ReadonlyMap<string, SnapshotEntry>,\n touched: Set<string>,\n createdDirectories: string[],\n): string[] {\n const errors: string[] = [];\n for (const path of [...touched].reverse()) {\n try {\n assertManagedPaths(root, [path]);\n const entry = entries.get(path);\n const full = join(root, path);\n const current = lstatSync(full, { throwIfNoEntry: false });\n if (!entry?.exists) {\n if (current) unlinkSync(full);\n continue;\n }\n const original = readFileSync(join(backup, \"files\", path));\n if (!current || !readFileSync(full).equals(original)) {\n // Recreate the file to restore even an original read-only mode.\n if (current) unlinkSync(full);\n writeFileSync(full, original, { mode: 0o600 });\n }\n chmodSync(full, entry.mode);\n } catch (error) {\n errors.push(`${path}: ${errorMessage(error)}`);\n }\n }\n for (const directory of [...createdDirectories].reverse()) {\n try {\n if (readdirSync(directory).length === 0) rmdirSync(directory);\n } catch (error) {\n errors.push(`${directory}: ${errorMessage(error)}`);\n }\n }\n return errors;\n}\n\n/**\n * Apply an already planned update, preserving the caller's write order (the\n * manifest belongs last). Backups are new, private directories outside the\n * project. The complete batch is validated before backup or project mutation.\n */\nexport function applyUpdateTransaction(\n root: string,\n writes: ReadonlyArray<RenderedFile>,\n removals: ReadonlyArray<string>,\n backupDir?: string,\n): { backupDir: string } {\n const paths = [...new Set([...removals, ...writes.map((file) => file.path)])];\n assertManagedPaths(root, paths);\n const target = canonicalRoot(root);\n const backup = resolve(\n backupDir ?? join(homedir(), \".local\", \"state\", \"vaubaan-harness\", \"backups\", randomUUID()),\n );\n assertBackupLocation(target, backup);\n let snapshot: SnapshotEntry[];\n try {\n snapshot = saveSnapshot(target, paths, backup);\n } catch (error) {\n throw new Error(\n `could not prepare update backup at ${backup}; project unchanged: ${errorMessage(error)}`,\n { cause: error },\n );\n }\n const entries = new Map(snapshot.map((entry) => [entry.path, entry]));\n const touched = new Set<string>();\n const createdDirectories: string[] = [];\n try {\n assertManagedPaths(target, paths);\n for (const path of removals) {\n if (!lstatSync(join(target, path), { throwIfNoEntry: false })) continue;\n touched.add(path);\n unlinkSync(join(target, path));\n }\n for (const file of writes) {\n const full = join(target, file.path);\n createDirectories(dirname(full), createdDirectories);\n touched.add(file.path);\n const entry = entries.get(file.path);\n const mode =\n file.path === MANIFEST_PATH\n ? 0o600\n : entry?.exists\n ? entry.mode\n : PRIVATE_FILES.has(file.path)\n ? 0o600\n : 0o644;\n // Ownership snapshots may include private settings. Restrict an existing\n // manifest before writing those bytes, and restore its old mode on failure.\n if (entry?.exists && file.path === MANIFEST_PATH) chmodSync(full, mode);\n writeFileSync(full, file.content, { mode });\n if (entry?.exists) chmodSync(full, mode);\n }\n } catch (error) {\n const failures = rollback(target, backup, entries, touched, createdDirectories);\n const restoration =\n failures.length > 0 ? `rollback errors: ${failures.join(\"; \")}` : \"rollback completed\";\n throw new Error(`update failed; backup: ${backup}; ${restoration}: ${errorMessage(error)}`, {\n cause: error,\n });\n }\n return { backupDir: backup };\n}\n"],"mappings":"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","names":["dirname","resolve","fileURLToPath","hash","existsSync","join","fg","join","fg","existsSync","existsSync","join","fg","fg","existsSync","join","fg","fg","REQUIRED_SECTIONS","REQUIRED_SECTIONS","fg","TRACKED_DIRS","fg","existsSync","readFileSync","join","REQUIRED_DIRS","existsSync","join","readFileSync","existsSync","writeFileSync","dirname","join","resolve","existsSync","readFileSync","join","fg","z","readFileSync","matter","matter","z","join","fg","readFileSync","existsSync","ENGINE","BASE","ENGINE","BASE","statSync","basename","dirname","isAbsolute","join","resolve","canonicalRoot","existsSync","readFileSync","join","z","existsSync","readFileSync","join","z","existsSync","readFileSync","join","isDeepStrictEqual","z","ObjectSchema","z","isDeepStrictEqual","value","hooks","existsSync","join","readFileSync","z","join","existsSync","readFileSync","existsSync","writeFileSync","dirname","join","relative","resolve","resolve","writeFileSync","join","existsSync","dirname","relative","dirname","existsSync","join","resolve","writeFileSync","mkdirSync","writeFileSync","dirname","join","join","mkdirSync","dirname","writeFileSync","readFileSync","resolve","execFileSync","createHash","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","join","z","createHash","execFileSync","readFileSync","resolve","existsSync","readFileSync","join","resolve","isDeepStrictEqual","existsSync","readFileSync","join","z","z","existsSync","join","readFileSync","engines","createHash","chmodSync","lstatSync","mkdirSync","readFileSync","readdirSync","realpathSync","rmdirSync","unlinkSync","writeFileSync","basename","dirname","isAbsolute","join","relative","resolve","resolve","lstatSync","basename","dirname","join","realpathSync","relative","isAbsolute","mkdirSync","writeFileSync","readFileSync","createHash","unlinkSync","chmodSync","readdirSync","rmdirSync","existsSync","join","readFileSync","hash","resolve","isDeepStrictEqual","dirname","fileURLToPath","resolve"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/index.ts","../../src/linters/util.ts","../../src/linters/adr-no-tracks.ts","../../src/linters/cardinal-files.ts","../../src/linters/config.ts","../../src/linters/cross-links.ts","../../src/linters/decision-schema.ts","../../src/linters/doc-layout.ts","../../src/linters/frontmatter-tracks.ts","../../src/linters/gitignore-harness.ts","../../src/linters/orphan-decisions.ts","../../src/linters/quality-schema.ts","../../src/linters/readme-presence.ts","../../src/linters/readme-sections.ts","../../src/linters/spec-has-content.ts","../../src/linters/spec-tech-agnostic.ts","../../src/linters/tracks-drift.ts","../../src/linters/index.ts","../../src/version.ts","../../src/cli/check.ts","../../src/cli/init.ts","../../src/cli/managed-paths.ts","../../src/cli/manifest.ts","../../src/cli/opencode-config.ts","../../src/cli/update-config.ts","../../src/renderers/common.ts","../../src/types.ts","../../src/renderers/claude-code.ts","../../src/renderers/codex-cli.ts","../../src/renderers/opencode.ts","../../src/renderers/index.ts","../../src/cli/plan-render.ts","../../src/loader.ts","../../src/parser/common.ts","../../src/parser/schemas.ts","../../src/parser/agent.ts","../../src/parser/cmd.ts","../../src/parser/skill.ts","../../src/util/yaml.ts","../../src/mcp.ts","../../src/render.ts","../../src/cli/uninstall.ts","../../src/cli/update-transaction.ts","../../src/cli/update.ts","../../src/cli/update-manifest.ts","../../src/cli/render.ts","../../src/cli/stop-hook.ts","../../src/stop-hook/adapters/claude.ts","../../src/stop-hook/adapters/codex.ts","../../src/stop-hook/adapters/opencode.ts","../../src/stop-hook/adapters/index.ts","../../src/stop-hook/core.ts","../../src/stop-hook/state.ts","../../src/stop-hook/types.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { Command } from \"commander\";\nimport { formatReportText, runLinters } from \"../linters/index.js\";\nimport { VERSION } from \"../version.js\";\nimport { checkCommand } from \"./check.js\";\nimport { initCommand } from \"./init.js\";\nimport { renderCommand } from \"./render.js\";\nimport { stopHookCommandFromStdin } from \"./stop-hook.js\";\nimport { uninstallCommand } from \"./uninstall.js\";\nimport { updateCommand } from \"./update.js\";\n\nfunction resolvePackageDir(): string {\n // CLI lives at <contentRoot>/cli/index.{ts,js}.\n // In dev <contentRoot> = src/ ; in prod (after tsup + copy) = dist/.\n // Both contain agents/, skills/, commands/, templates/ as siblings of cli/.\n const here = dirname(fileURLToPath(import.meta.url));\n return resolve(here, \"..\");\n}\n\n/** Comma-separated option value; an option given empty yields an empty list. */\nfunction parseList(raw: string | undefined): string[] | undefined {\n if (raw === undefined) return undefined;\n return raw\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nconst program = new Command();\n\nprogram\n .name(\"vaubaan-harness\")\n .description(\n \"Vaubaan harness — render skills, commands, and all agent personas into a target directory\",\n )\n .version(VERSION);\n\nprogram\n .command(\"init\")\n .description(\n \"Render the harness (all agents, skills, commands) into a target directory. Defaults to all engines.\",\n )\n .argument(\"<target-dir>\", \"directory to render harness into\")\n .option(\n \"--engines <list>\",\n \"comma-separated subset of engines (claude-code, codex-cli, opencode) — defaults to all 3\",\n )\n .option(\"--overrides-dir <dir>\", \"directory containing .harness-overrides/\")\n .option(\"--package-dir <dir>\", \"override harness package directory (for dev/test)\")\n .option(\n \"--with-mcp <list>\",\n \"comma-separated MCP servers to render config for (context7) — opt-in\",\n )\n .option(\n \"--no-stop-hook\",\n \"skip rendering the Stop-hook configs that run lint at end of each agent turn\",\n )\n .option(\"--preserve <paths>\", \"comma-separated generated files to leave under user ownership\")\n .option(\"--backup-dir <dir>\", \"new backup directory outside the project\")\n .action((targetDir: string, opts: Record<string, string | boolean | undefined>) => {\n const packageDir = (opts.packageDir as string | undefined) ?? resolvePackageDir();\n const engines = parseList(opts.engines as string | undefined);\n const withMcpRaw = opts.withMcp as string | undefined;\n const mcpServers = withMcpRaw ? withMcpRaw.split(\",\").map((s) => s.trim()) : undefined;\n const result = initCommand({\n targetDir,\n engines,\n overridesDir: opts.overridesDir as string | undefined,\n packageDir,\n mcpServers,\n withStopHook: opts.stopHook !== false,\n preserveFiles: parseList(opts.preserve as string | undefined),\n backupDir: opts.backupDir as string | undefined,\n });\n process.stdout.write(`rendered ${result.filesWritten.length} files to ${targetDir}\\n`);\n if (result.staleFilesRemoved.length > 0) {\n process.stdout.write(\n `removed ${result.staleFilesRemoved.length} stale files from a previous render\\n`,\n );\n }\n if (result.stopHookInstalled) {\n process.stdout.write(\"stop-hook installed (runs lint at end-of-turn)\\n\");\n if (result.engines.includes(\"codex-cli\")) {\n process.stdout.write(\n \"codex: the hook runs once you trust this project and approve the hook (startup review or /hooks)\\n\",\n );\n }\n }\n if (result.backupDir) process.stdout.write(`backup: ${result.backupDir}\\n`);\n for (const w of result.warnings) process.stderr.write(`warning: ${w}\\n`);\n });\n\nprogram\n .command(\"update\")\n .description(\n \"Migrate an existing harness installation, retaining its engines and project settings\",\n )\n .argument(\"[target-dir]\", \"project directory\", \".\")\n .option(\"--dry-run\", \"preview changes without writing files or backups\")\n .option(\"--json\", \"print the migration summary as JSON\")\n .option(\"--backup-dir <dir>\", \"new backup directory outside the project\")\n .option(\"--overrides-dir <dir>\", \"directory containing .harness-overrides/\")\n .option(\"--preserve <paths>\", \"comma-separated generated files to leave under user ownership\")\n .action((targetDir: string, opts: Record<string, string | boolean | undefined>) => {\n const result = updateCommand({\n targetDir,\n packageDir: resolvePackageDir(),\n dryRun: opts.dryRun === true,\n backupDir: opts.backupDir as string | undefined,\n overridesDir: opts.overridesDir as string | undefined,\n preserveFiles: (opts.preserve as string | undefined)?.split(\",\").map((path) => path.trim()),\n });\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n return;\n }\n if (result.upToDate) process.stdout.write(`harness ${VERSION}: already up to date\\n`);\n else\n process.stdout.write(\n `${result.dryRun ? \"preview\" : \"updated\"}: ${result.filesToWrite.length} writes, ${result.filesToRemove.length} removals (harness ${VERSION})\\n`,\n );\n if (result.backupDir) process.stdout.write(`backup: ${result.backupDir}\\n`);\n for (const warning of result.warnings) process.stderr.write(`warning: ${warning}\\n`);\n });\n\nprogram\n .command(\"uninstall\")\n .description(\"Remove all files previously written by `init` into a target directory\")\n .argument(\"<target-dir>\", \"directory to uninstall harness from\")\n .action((targetDir: string) => {\n const result = uninstallCommand({ targetDir });\n process.stdout.write(\n `removed ${result.filesRemoved.length} files and ${result.dirsPruned.length} empty dirs from ${targetDir}\\n`,\n );\n for (const w of result.warnings) process.stderr.write(`warning: ${w}\\n`);\n });\n\nprogram\n .command(\"check\")\n .description(\"Verify repo layout: 6 pillars present and .gitignore correct\")\n .argument(\"<repo>\", \"path to repo to check\")\n .action((repo: string) => {\n const result = checkCommand(repo);\n if (result.pass) {\n process.stdout.write(\"✔ layout OK\\n\");\n process.exit(0);\n }\n for (const issue of result.issues) process.stdout.write(`✘ ${issue}\\n`);\n process.exit(1);\n });\n\nprogram\n .command(\"lint\")\n .description(\"Run all mechanical linters and exit non-zero on errors\")\n .option(\n \"--pillar <pillar>\",\n \"filter by pillar (spec, decisions, handbook, tests, workflow, quality)\",\n )\n .option(\"--format <fmt>\", \"text | json\", \"text\")\n .option(\"--cwd <dir>\", \"repo root\", \".\")\n .action((opts: Record<string, string | undefined>) => {\n const repoRoot = resolve(opts.cwd ?? \".\");\n const lintOpts = opts.pillar ? { pillar: opts.pillar } : {};\n const report = runLinters(repoRoot, lintOpts);\n if (opts.format === \"json\") {\n process.stdout.write(`${JSON.stringify(report, null, 2)}\\n`);\n } else {\n process.stdout.write(`${formatReportText(report)}\\n`);\n }\n process.exit(report.summary.pass ? 0 : 1);\n });\n\nprogram\n .command(\"render\")\n .description(\"Render harness for preview (no overrides applied). Defaults to all engines.\")\n .option(\n \"--engines <list>\",\n \"comma-separated subset of engines (claude-code, codex-cli, opencode) — defaults to all 3\",\n )\n .requiredOption(\"--out <dir>\", \"output directory\")\n .option(\"--package-dir <dir>\", \"override harness package directory\")\n .option(\n \"--with-mcp <list>\",\n \"comma-separated MCP servers to render config for (context7) — opt-in\",\n )\n .option(\"--no-stop-hook\", \"skip rendering the Stop-hook configs\")\n .action((opts: Record<string, string | boolean | undefined>) => {\n const packageDir = (opts.packageDir as string | undefined) ?? resolvePackageDir();\n const engines = parseList(opts.engines as string | undefined);\n const withMcpRaw = opts.withMcp as string | undefined;\n const mcpServers = withMcpRaw ? withMcpRaw.split(\",\").map((s) => s.trim()) : undefined;\n const result = renderCommand({\n engines,\n outDir: opts.out as string,\n packageDir,\n mcpServers,\n withStopHook: opts.stopHook !== false,\n });\n process.stdout.write(`rendered ${result.filesWritten.length} files to ${opts.out}\\n`);\n for (const w of result.warnings) process.stderr.write(`warning: ${w}\\n`);\n });\n\nprogram\n .command(\"stop-hook\")\n .description(\n \"Stop-hook entrypoint invoked by each engine's hook config — runs lint and decides whether to inject the report into the running session, terminate, or passthrough\",\n )\n .requiredOption(\"--engine <engine>\", \"claude | codex | opencode\")\n .option(\"--cwd <dir>\", \"repo root\", \".\")\n .action((opts: Record<string, string | undefined>) => {\n const result = stopHookCommandFromStdin({\n engine: opts.engine as string,\n cwd: opts.cwd,\n });\n if (result.stdout) process.stdout.write(result.stdout);\n if (result.stderr) process.stderr.write(result.stderr);\n process.exit(result.exitCode);\n });\n\nprogram.parseAsync(process.argv).catch((err) => {\n process.stderr.write(`error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n});\n","import { execFileSync } from \"node:child_process\";\nimport { existsSync, readFileSync, statSync } from \"node:fs\";\nimport { join, relative } from \"node:path\";\nimport fg from \"fast-glob\";\nimport matter from \"gray-matter\";\n\nexport function fileExists(repoRoot: string, relativePath: string): boolean {\n return existsSync(join(repoRoot, relativePath));\n}\n\nexport function readText(repoRoot: string, relativePath: string): string {\n return readFileSync(join(repoRoot, relativePath), \"utf8\");\n}\n\nexport function listMarkdown(repoRoot: string, dir: string): string[] {\n const cwd = join(repoRoot, dir);\n if (!existsSync(cwd)) return [];\n return fg\n .sync(\"**/*.md\", { cwd, absolute: false, ignore: [\"**/node_modules/**\", \"**/dist/**\"] })\n .filter((f) => !f.endsWith(\"README.md\"))\n .map((f) => join(dir, f));\n}\n\nexport function listAllMarkdown(repoRoot: string, dir: string): string[] {\n const cwd = join(repoRoot, dir);\n if (!existsSync(cwd)) return [];\n return fg\n .sync(\"**/*.md\", { cwd, absolute: false, ignore: [\"**/node_modules/**\", \"**/dist/**\"] })\n .map((f) => join(dir, f));\n}\n\nexport function dirExists(repoRoot: string, relativePath: string): boolean {\n const full = join(repoRoot, relativePath);\n if (!existsSync(full)) return false;\n return statSync(full).isDirectory();\n}\n\nexport function parseFrontmatter(text: string): { data: Record<string, unknown>; body: string } {\n const m = matter(text);\n return { data: m.data, body: m.content };\n}\n\nexport interface GitLogEntry {\n hash: string;\n timestamp: number;\n}\n\nexport function gitLastCommitForPath(\n repoRoot: string,\n relativePath: string,\n): GitLogEntry | undefined {\n try {\n const out = execFileSync(\"git\", [\"log\", \"-1\", \"--format=%H:%ct\", \"--\", relativePath], {\n cwd: repoRoot,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n if (!out) return undefined;\n const idx = out.indexOf(\":\");\n if (idx < 0) return undefined;\n const hash = out.slice(0, idx);\n const ts = Number.parseInt(out.slice(idx + 1), 10);\n return { hash, timestamp: ts };\n } catch {\n return undefined;\n }\n}\n\nexport function gitCommitsSince(\n repoRoot: string,\n relativePath: string,\n sinceCommit: string,\n): number {\n try {\n const out = execFileSync(\n \"git\",\n [\"log\", `${sinceCommit}..HEAD`, \"--format=%H\", \"--\", relativePath],\n {\n cwd: repoRoot,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n },\n ).trim();\n if (!out) return 0;\n return out.split(\"\\n\").filter(Boolean).length;\n } catch {\n return 0;\n }\n}\n\nexport function relPath(repoRoot: string, abs: string): string {\n return relative(repoRoot, abs);\n}\n\nexport function findLineNumber(text: string, needle: string | RegExp): number | undefined {\n const lines = text.split(\"\\n\");\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? \"\";\n if (typeof needle === \"string\" ? line.includes(needle) : needle.test(line)) {\n return i + 1;\n }\n }\n return undefined;\n}\n","import type { LintIssue, Linter } from \"./types.js\";\nimport { listMarkdown, parseFrontmatter, readText } from \"./util.js\";\n\nconst ADR_DIR = \"docs/decisions\";\n\nexport const adrNoTracks: Linter = {\n id: \"lint:adr-no-tracks\",\n pillars: [\"decisions\"],\n defaultSeverity: \"error\",\n suggestedSkills: [\"/decision\"],\n run(repoRoot: string): LintIssue[] {\n const issues: LintIssue[] = [];\n const files = listMarkdown(repoRoot, ADR_DIR);\n for (const f of files) {\n const text = readText(repoRoot, f);\n const { data } = parseFrontmatter(text);\n if (!(\"tracks\" in data)) continue;\n const value = data.tracks;\n if (Array.isArray(value) && value.length === 0) continue;\n issues.push({\n linter: this.id,\n severity: \"error\",\n file: f,\n message:\n \"ADRs must not declare `tracks:` (or must set it to []). ADRs document a decision frozen in time, not the current state of code — use status: superseded to mark them obsolete instead.\",\n });\n }\n return issues;\n },\n};\n","import type { LintIssue, Linter } from \"./types.js\";\nimport { fileExists } from \"./util.js\";\n\nconst REQUIRED_FILES = [\n \"docs/tests/integration-tests.md\",\n \"docs/tests/e2e-tests.md\",\n \"docs/workflow/coding-workflow.md\",\n];\n\nexport const cardinalFiles: Linter = {\n id: \"lint:cardinal-files\",\n pillars: [\"tests\", \"workflow\"],\n defaultSeverity: \"error\",\n suggestedSkills: [\"/test-plan\", \"/workflow\"],\n run(repoRoot: string): LintIssue[] {\n const issues: LintIssue[] = [];\n for (const f of REQUIRED_FILES) {\n if (!fileExists(repoRoot, f)) {\n issues.push({\n linter: this.id,\n severity: \"error\",\n file: f,\n message: `missing required cardinal file: ${f}`,\n });\n }\n }\n return issues;\n },\n};\n","import { cosmiconfigSync } from \"cosmiconfig\";\n\nexport interface HarnessLintConfig {\n ignore: ReadonlyArray<string>;\n}\n\nconst DEFAULT_CONFIG: HarnessLintConfig = { ignore: [] };\n\nexport function loadLintConfig(repoRoot: string): HarnessLintConfig {\n const explorer = cosmiconfigSync(\"harness\", {\n searchPlaces: [\n \"package.json\",\n \".harnessrc\",\n \".harnessrc.json\",\n \".harnessrc.yaml\",\n \".harnessrc.yml\",\n \"harness.config.js\",\n \"harness.config.cjs\",\n ],\n });\n const result = explorer.search(repoRoot);\n if (!result || result.isEmpty) return DEFAULT_CONFIG;\n\n const raw = result.config as Record<string, unknown> | undefined;\n if (!raw) return DEFAULT_CONFIG;\n\n const lint = raw.lint as Record<string, unknown> | undefined;\n if (!lint) return DEFAULT_CONFIG;\n\n const ignore = lint.ignore;\n if (!Array.isArray(ignore)) return DEFAULT_CONFIG;\n\n return { ignore: ignore.filter((x): x is string => typeof x === \"string\") };\n}\n","import { existsSync } from \"node:fs\";\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\nimport fg from \"fast-glob\";\nimport type { LintContext, LintIssue, Linter } from \"./types.js\";\nimport { readText } from \"./util.js\";\n\nconst LINK_REGEX = /\\[([^\\]]+)\\]\\(([^)]+)\\)/g;\n\nfunction maskCodeSpans(text: string): string {\n return text\n .replace(/```[\\s\\S]*?```/g, (m) => m.replace(/[^\\n]/g, \" \"))\n .replace(/`[^`\\n]*`/g, (m) => \" \".repeat(m.length));\n}\n\nfunction isExternalOrAnchor(url: string): boolean {\n if (url.startsWith(\"http://\") || url.startsWith(\"https://\")) return true;\n if (url.startsWith(\"mailto:\")) return true;\n if (url.startsWith(\"#\")) return true;\n return false;\n}\n\nfunction stripFragment(url: string): string {\n const i = url.indexOf(\"#\");\n return i < 0 ? url : url.slice(0, i);\n}\n\nfunction resolveLink(repoRoot: string, sourceFile: string, link: string): string {\n const noFrag = stripFragment(link);\n if (isAbsolute(noFrag)) return join(repoRoot, noFrag);\n return resolve(dirname(join(repoRoot, sourceFile)), noFrag);\n}\n\nexport const crossLinks: Linter = {\n id: \"lint:cross-links\",\n pillars: [\"all\"],\n defaultSeverity: \"error\",\n run(repoRoot: string, ctx?: LintContext): LintIssue[] {\n const extra = ctx?.config.ignore ?? [];\n const issues: LintIssue[] = [];\n const allDocs = fg.sync(\"**/*.md\", {\n cwd: repoRoot,\n absolute: false,\n ignore: [\n \"**/node_modules/**\",\n \"**/dist/**\",\n \".harness-overrides/**\",\n \"skills/**\",\n \"agents/**\",\n \"commands/**\",\n \"templates/**\",\n \"**/*.skill.md\",\n \"**/*.cmd.md\",\n \"**/*.agent.md\",\n ...extra,\n ],\n });\n for (const f of allDocs) {\n const text = maskCodeSpans(readText(repoRoot, f));\n const lines = text.split(\"\\n\");\n for (let lineNo = 0; lineNo < lines.length; lineNo++) {\n const line = lines[lineNo] ?? \"\";\n LINK_REGEX.lastIndex = 0;\n let match: RegExpExecArray | null;\n match = LINK_REGEX.exec(line);\n while (match !== null) {\n const url = match[2];\n if (url && !isExternalOrAnchor(url)) {\n const noFrag = stripFragment(url);\n if (noFrag !== \"\" && !noFrag.startsWith(\"data:\")) {\n const target = resolveLink(repoRoot, f, url);\n if (!existsSync(target)) {\n issues.push({\n linter: this.id,\n severity: \"error\",\n file: f,\n line: lineNo + 1,\n message: `broken link: ${url}`,\n });\n }\n }\n }\n match = LINK_REGEX.exec(line);\n }\n }\n }\n return issues;\n },\n};\n","import type { LintIssue, Linter } from \"./types.js\";\nimport { listMarkdown, readText } from \"./util.js\";\n\n// English headings are canonical; the French ones are still accepted so\n// projects written before the switch to English keep passing.\nconst REQUIRED_SECTIONS: Array<{ label: string; pattern: RegExp }> = [\n { label: \"Context\", pattern: /^##\\s+(Context|Contexte)\\b/m },\n { label: \"Decision\", pattern: /^##\\s+(Decision|D[ée]cision)\\b/m },\n { label: \"Consequences\", pattern: /^##\\s+(Consequences|Cons[ée]quences)\\b/m },\n {\n label: \"Rejected alternatives\",\n pattern: /^##\\s+(Rejected\\s+alternatives|Alternatives(\\s+rejet[ée]es)?)\\b/im,\n },\n];\n\nexport const decisionSchema: Linter = {\n id: \"lint:decision-schema\",\n pillars: [\"decisions\"],\n defaultSeverity: \"error\",\n suggestedSkills: [\"/decision\"],\n run(repoRoot: string): LintIssue[] {\n const issues: LintIssue[] = [];\n const files = listMarkdown(repoRoot, \"docs/decisions\");\n for (const f of files) {\n const text = readText(repoRoot, f);\n for (const { label, pattern } of REQUIRED_SECTIONS) {\n if (!pattern.test(text)) {\n issues.push({\n linter: this.id,\n severity: \"error\",\n file: f,\n message: `missing required section: \"${label}\"`,\n });\n }\n }\n }\n return issues;\n },\n};\n","import type { LintIssue, Linter } from \"./types.js\";\nimport { dirExists } from \"./util.js\";\n\nconst REQUIRED_DIRS = [\n \"docs/spec\",\n \"docs/decisions\",\n \"docs/handbook\",\n \"docs/tests\",\n \"docs/workflow\",\n];\n\nexport const docLayout: Linter = {\n id: \"lint:doc-layout\",\n pillars: [\"all\"],\n defaultSeverity: \"error\",\n run(repoRoot: string): LintIssue[] {\n const issues: LintIssue[] = [];\n for (const dir of REQUIRED_DIRS) {\n if (!dirExists(repoRoot, dir)) {\n issues.push({\n linter: this.id,\n severity: \"error\",\n file: dir,\n message: `missing required directory: ${dir}/`,\n });\n }\n }\n return issues;\n },\n};\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport fg from \"fast-glob\";\nimport type { LintIssue, Linter } from \"./types.js\";\nimport { listMarkdown, parseFrontmatter, readText } from \"./util.js\";\n\nconst TRACKED_DIRS = [\"docs/handbook\", \"docs/tests\", \"docs/workflow\"];\n\nfunction trackedPathExists(repoRoot: string, pattern: string): boolean {\n if (pattern.includes(\"*\")) {\n return fg.sync(pattern, { cwd: repoRoot, absolute: false }).length > 0;\n }\n return existsSync(join(repoRoot, pattern));\n}\n\nexport const frontmatterTracks: Linter = {\n id: \"lint:frontmatter-tracks\",\n pillars: [\"handbook\", \"tests\", \"workflow\"],\n defaultSeverity: \"error\",\n suggestedSkills: [\"/handbook\", \"/test-plan\", \"/workflow\"],\n run(repoRoot: string): LintIssue[] {\n const issues: LintIssue[] = [];\n for (const dir of TRACKED_DIRS) {\n const files = listMarkdown(repoRoot, dir);\n for (const f of files) {\n const text = readText(repoRoot, f);\n const { data } = parseFrontmatter(text);\n if (!Array.isArray(data.tracks)) {\n issues.push({\n linter: this.id,\n severity: \"error\",\n file: f,\n message: \"missing frontmatter `tracks:` array\",\n });\n continue;\n }\n for (const tracked of data.tracks as unknown[]) {\n if (typeof tracked !== \"string\") {\n issues.push({\n linter: this.id,\n severity: \"error\",\n file: f,\n message: \"`tracks` entries must be strings\",\n });\n continue;\n }\n if (!trackedPathExists(repoRoot, tracked)) {\n issues.push({\n linter: this.id,\n severity: \"error\",\n file: f,\n message: `tracked path does not exist: ${tracked}`,\n });\n }\n }\n }\n }\n return issues;\n },\n};\n","import type { LintIssue, Linter } from \"./types.js\";\nimport { fileExists, readText } from \"./util.js\";\n\n/** Paths the harness generates or writes at runtime; none belongs in Git. */\nexport const REQUIRED_GITIGNORE_ENTRIES: ReadonlyArray<string> = [\n \".harness-overrides/\",\n \".harness-manifest.json\",\n \".harness/\",\n \".claude/\",\n \".codex/\",\n \".opencode/\",\n \".agents/\",\n \".vaubaan/\",\n \"AGENTS.md\",\n \"CLAUDE.md\",\n \".mcp.json\",\n];\n\nexport const gitignoreHarness: Linter = {\n id: \"lint:gitignore-harness\",\n pillars: [\"repo-root\"],\n defaultSeverity: \"error\",\n run(repoRoot: string): LintIssue[] {\n const issues: LintIssue[] = [];\n if (!fileExists(repoRoot, \".gitignore\")) {\n issues.push({\n linter: this.id,\n severity: \"error\",\n file: \".gitignore\",\n message: \".gitignore is missing at repo root\",\n });\n return issues;\n }\n const text = readText(repoRoot, \".gitignore\");\n const lines = new Set(\n text\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter(Boolean),\n );\n for (const entry of REQUIRED_GITIGNORE_ENTRIES) {\n const variants = [entry, entry.replace(/\\/$/, \"\")];\n if (!variants.some((v) => lines.has(v))) {\n issues.push({\n linter: this.id,\n severity: \"error\",\n file: \".gitignore\",\n message: `.gitignore must contain \"${entry}\"`,\n });\n }\n }\n return issues;\n },\n};\n","import { basename } from \"node:path\";\nimport fg from \"fast-glob\";\nimport type { LintContext, LintIssue, Linter } from \"./types.js\";\nimport { listMarkdown, readText } from \"./util.js\";\n\nexport const orphanDecisions: Linter = {\n id: \"lint:orphan-decisions\",\n pillars: [\"decisions\"],\n defaultSeverity: \"warning\",\n suggestedSkills: [\"/handbook\"],\n run(repoRoot: string, ctx?: LintContext): LintIssue[] {\n const extra = ctx?.config.ignore ?? [];\n const issues: LintIssue[] = [];\n const adrs = listMarkdown(repoRoot, \"docs/decisions\");\n if (adrs.length === 0) return issues;\n\n const otherDocs = fg.sync(\"**/*.md\", {\n cwd: repoRoot,\n absolute: false,\n ignore: [\n \"**/node_modules/**\",\n \"**/dist/**\",\n \".harness-overrides/**\",\n \"docs/decisions/**\",\n \"skills/**\",\n \"agents/**\",\n \"commands/**\",\n \"templates/**\",\n ...extra,\n ],\n });\n\n const referenceCorpus = otherDocs.map((f) => readText(repoRoot, f)).join(\"\\n\");\n\n for (const adr of adrs) {\n const filename = basename(adr);\n const stem = filename.replace(/\\.md$/, \"\");\n const referenced = referenceCorpus.includes(filename) || referenceCorpus.includes(stem);\n if (!referenced) {\n issues.push({\n linter: this.id,\n severity: \"warning\",\n file: adr,\n message: \"ADR is not referenced by any other doc file (orphan)\",\n });\n }\n }\n return issues;\n },\n};\n","import type { LintIssue, Linter } from \"./types.js\";\nimport { dirExists, fileExists, readText } from \"./util.js\";\n\nconst QUALITY_DIR = \"docs/quality\";\nconst CARDINAL_FILE = `${QUALITY_DIR}/code-quality.md`;\n\n// English headings are canonical; the French ones are still accepted so\n// projects written before the switch to English keep passing.\nconst REQUIRED_SECTIONS: ReadonlyArray<{ label: string; pattern: RegExp }> = [\n {\n label: \"Mechanical checks\",\n pattern: /^##\\s+(Mechanical\\s+checks|V[ée]rifications\\s+m[ée]caniques)\\s*$/im,\n },\n { label: \"Project rules\", pattern: /^##\\s+(Project\\s+rules|R[èe]gles\\s+du\\s+projet)\\s*$/im },\n {\n label: \"Accepted deviations\",\n pattern: /^##\\s+(Accepted\\s+deviations|[ÉE]carts\\s+assum[ée]s)\\s*$/im,\n },\n];\n\n/**\n * `docs/quality/` is an optional pillar: absent directory = nothing to\n * report. Once the directory exists, its cardinal file and sections are\n * required.\n */\nexport const qualitySchema: Linter = {\n id: \"lint:quality-schema\",\n pillars: [\"quality\"],\n defaultSeverity: \"error\",\n run(repoRoot: string): LintIssue[] {\n if (!dirExists(repoRoot, QUALITY_DIR)) return [];\n if (!fileExists(repoRoot, CARDINAL_FILE)) {\n return [\n {\n linter: this.id,\n severity: \"error\",\n file: CARDINAL_FILE,\n message: `missing required cardinal file: ${CARDINAL_FILE}`,\n },\n ];\n }\n const text = readText(repoRoot, CARDINAL_FILE);\n return REQUIRED_SECTIONS.filter(({ pattern }) => !pattern.test(text)).map(({ label }) => ({\n linter: this.id,\n severity: \"error\" as const,\n file: CARDINAL_FILE,\n message: `missing required section: \"${label}\"`,\n }));\n },\n};\n","import type { LintIssue, Linter } from \"./types.js\";\nimport { fileExists } from \"./util.js\";\n\nexport const readmePresence: Linter = {\n id: \"lint:readme-presence\",\n pillars: [\"readme\"],\n defaultSeverity: \"error\",\n suggestedSkills: [\"/readme\"],\n run(repoRoot: string): LintIssue[] {\n if (fileExists(repoRoot, \"README.md\")) return [];\n return [\n {\n linter: this.id,\n severity: \"error\",\n file: \"README.md\",\n message: \"README.md is missing at repo root\",\n },\n ];\n },\n};\n","import type { LintIssue, Linter } from \"./types.js\";\nimport { fileExists, readText } from \"./util.js\";\n\nconst REQUIRED_SECTIONS = [\n /^#\\s+\\S/m,\n /^##?\\s+(What is this|Quick start)/im,\n /^##?\\s+(Quick start|Install|Getting started)/im,\n];\n\nconst REQUIRED_LABELS = [\"title (# H1)\", \"What is this / intro\", \"Quick start / Install\"];\n\nexport const readmeSections: Linter = {\n id: \"lint:readme-sections\",\n pillars: [\"readme\"],\n defaultSeverity: \"error\",\n suggestedSkills: [\"/readme\"],\n run(repoRoot: string): LintIssue[] {\n if (!fileExists(repoRoot, \"README.md\")) return [];\n const text = readText(repoRoot, \"README.md\");\n const issues: LintIssue[] = [];\n for (let i = 0; i < REQUIRED_SECTIONS.length; i++) {\n const pattern = REQUIRED_SECTIONS[i];\n const label = REQUIRED_LABELS[i];\n if (pattern && !pattern.test(text)) {\n issues.push({\n linter: this.id,\n severity: \"error\",\n file: \"README.md\",\n message: `missing required section: ${label}`,\n });\n }\n }\n return issues;\n },\n};\n","import type { LintIssue, Linter } from \"./types.js\";\nimport { dirExists, listMarkdown } from \"./util.js\";\n\nexport const specHasContent: Linter = {\n id: \"lint:spec-has-content\",\n pillars: [\"spec\"],\n defaultSeverity: \"warning\",\n suggestedSkills: [\"/spec\"],\n run(repoRoot: string): LintIssue[] {\n if (!dirExists(repoRoot, \"docs/spec\")) return [];\n const files = listMarkdown(repoRoot, \"docs/spec\");\n if (files.length > 0) return [];\n return [\n {\n linter: this.id,\n severity: \"warning\",\n file: \"docs/spec\",\n message: \"docs/spec/ has no markdown files — write at least one spec document\",\n },\n ];\n },\n};\n","import type { LintIssue, Linter } from \"./types.js\";\nimport { findLineNumber, listMarkdown, readText } from \"./util.js\";\n\nfunction maskFencedBlocks(text: string): string {\n return text.replace(/```[\\s\\S]*?```/g, (m) => m.replace(/[^\\n]/g, \" \"));\n}\n\nconst TECH_BLOCKLIST: Array<{ pattern: RegExp; keyword: string }> = [\n { pattern: /\\bNext\\.?js\\b/i, keyword: \"Next.js\" },\n { pattern: /\\bSupabase\\b/i, keyword: \"Supabase\" },\n { pattern: /\\bVercel\\b/i, keyword: \"Vercel\" },\n { pattern: /\\bReact\\b/, keyword: \"React\" },\n { pattern: /\\bTypeScript\\b/, keyword: \"TypeScript\" },\n { pattern: /\\bDocker\\b/, keyword: \"Docker\" },\n { pattern: /\\bKubernetes\\b/i, keyword: \"Kubernetes\" },\n { pattern: /\\bPostgres(QL)?\\b/i, keyword: \"Postgres\" },\n { pattern: /\\bMySQL\\b/i, keyword: \"MySQL\" },\n { pattern: /\\bRedis\\b/i, keyword: \"Redis\" },\n { pattern: /\\bnpm\\b/, keyword: \"npm\" },\n { pattern: /\\bpnpm\\b/, keyword: \"pnpm\" },\n { pattern: /\\byarn\\b/, keyword: \"yarn\" },\n];\n\nexport const specTechAgnostic: Linter = {\n id: \"lint:spec-tech-agnostic\",\n pillars: [\"spec\"],\n defaultSeverity: \"error\",\n suggestedSkills: [\"/spec\"],\n run(repoRoot: string): LintIssue[] {\n const issues: LintIssue[] = [];\n const files = listMarkdown(repoRoot, \"docs/spec\");\n for (const f of files) {\n const text = maskFencedBlocks(readText(repoRoot, f));\n for (const { pattern, keyword } of TECH_BLOCKLIST) {\n if (pattern.test(text)) {\n const issue: LintIssue = {\n linter: this.id,\n severity: \"error\",\n file: f,\n message: `forbidden tech keyword \"${keyword}\" — should be in handbook/ or decisions/`,\n };\n const line = findLineNumber(text, pattern);\n if (line !== undefined) issue.line = line;\n issues.push(issue);\n }\n }\n }\n return issues;\n },\n};\n","import fg from \"fast-glob\";\nimport type { LintIssue, Linter } from \"./types.js\";\nimport {\n gitCommitsSince,\n gitLastCommitForPath,\n listMarkdown,\n parseFrontmatter,\n readText,\n} from \"./util.js\";\n\nconst TRACKED_DIRS = [\"docs/handbook\", \"docs/tests\", \"docs/workflow\"];\nconst DEFAULT_DRIFT_THRESHOLD = 10;\n\nfunction expandGlob(repoRoot: string, pattern: string): string[] {\n if (pattern.includes(\"*\")) {\n return fg.sync(pattern, { cwd: repoRoot, absolute: false });\n }\n return [pattern];\n}\n\nexport const tracksDrift: Linter = {\n id: \"lint:tracks-drift\",\n pillars: [\"handbook\", \"tests\", \"workflow\"],\n defaultSeverity: \"warning\",\n suggestedSkills: [\"/drift\", \"/handbook\"],\n run(repoRoot: string): LintIssue[] {\n const issues: LintIssue[] = [];\n for (const dir of TRACKED_DIRS) {\n const files = listMarkdown(repoRoot, dir);\n for (const f of files) {\n const text = readText(repoRoot, f);\n const { data } = parseFrontmatter(text);\n if (!Array.isArray(data.tracks)) continue;\n const docCommit = gitLastCommitForPath(repoRoot, f);\n if (!docCommit) continue;\n const threshold =\n typeof data.driftThreshold === \"number\" && data.driftThreshold > 0\n ? data.driftThreshold\n : DEFAULT_DRIFT_THRESHOLD;\n let driftCount = 0;\n for (const tracked of data.tracks) {\n if (typeof tracked !== \"string\") continue;\n const targets = expandGlob(repoRoot, tracked);\n for (const t of targets.length > 0 ? targets : [tracked]) {\n driftCount += gitCommitsSince(repoRoot, t, docCommit.hash);\n }\n }\n if (driftCount > threshold) {\n issues.push({\n linter: this.id,\n severity: \"warning\",\n file: f,\n message: `tracked files changed in ${driftCount} commits since doc last edit (threshold ${threshold})`,\n });\n }\n }\n }\n return issues;\n },\n};\n","import { adrNoTracks } from \"./adr-no-tracks.js\";\nimport { cardinalFiles } from \"./cardinal-files.js\";\nimport { loadLintConfig } from \"./config.js\";\nimport { crossLinks } from \"./cross-links.js\";\nimport { decisionSchema } from \"./decision-schema.js\";\nimport { docLayout } from \"./doc-layout.js\";\nimport { frontmatterTracks } from \"./frontmatter-tracks.js\";\nimport { gitignoreHarness } from \"./gitignore-harness.js\";\nimport { orphanDecisions } from \"./orphan-decisions.js\";\nimport { qualitySchema } from \"./quality-schema.js\";\nimport { readmePresence } from \"./readme-presence.js\";\nimport { readmeSections } from \"./readme-sections.js\";\nimport { specHasContent } from \"./spec-has-content.js\";\nimport { specTechAgnostic } from \"./spec-tech-agnostic.js\";\nimport { tracksDrift } from \"./tracks-drift.js\";\nimport type { LintContext, LintIssue, LintReport, Linter } from \"./types.js\";\n\nexport const ALL_LINTERS: ReadonlyArray<Linter> = [\n readmePresence,\n readmeSections,\n docLayout,\n cardinalFiles,\n decisionSchema,\n adrNoTracks,\n frontmatterTracks,\n tracksDrift,\n specTechAgnostic,\n specHasContent,\n crossLinks,\n orphanDecisions,\n gitignoreHarness,\n qualitySchema,\n];\n\nexport interface RunOptions {\n pillar?: string;\n only?: ReadonlyArray<string>;\n}\n\nexport function runLinters(repoRoot: string, opts: RunOptions = {}): LintReport {\n const config = loadLintConfig(repoRoot);\n const ctx: LintContext = { repoRoot, config };\n const filtered = ALL_LINTERS.filter((l) => {\n if (opts.only && !opts.only.includes(l.id)) return false;\n if (opts.pillar && !l.pillars.includes(opts.pillar) && !l.pillars.includes(\"all\")) return false;\n return true;\n });\n const issues: LintIssue[] = [];\n for (const linter of filtered) {\n try {\n issues.push(...linter.run(repoRoot, ctx));\n } catch (err) {\n issues.push({\n linter: linter.id,\n severity: \"error\",\n file: \"<internal>\",\n message: `linter crashed: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n }\n const errors = issues.filter((i) => i.severity === \"error\").length;\n const warnings = issues.filter((i) => i.severity === \"warning\").length;\n return {\n version: 1,\n summary: { errors, warnings, pass: errors === 0 },\n issues,\n };\n}\n\nfunction suggestedSkillsFor(linterId: string): ReadonlyArray<string> {\n const linter = ALL_LINTERS.find((l) => l.id === linterId);\n return linter?.suggestedSkills ?? [];\n}\n\nexport function formatReportText(report: LintReport): string {\n const lines: string[] = [];\n for (const issue of report.issues) {\n const location = issue.line !== undefined ? `:${issue.line}` : \"\";\n lines.push(`${issue.file}${location}: ${issue.severity}[${issue.linter}]\\n ${issue.message}`);\n const hints = suggestedSkillsFor(issue.linter);\n if (hints.length > 0) {\n lines.push(` → Try: ${hints.join(\", \")}`);\n }\n }\n const { errors, warnings, pass } = report.summary;\n lines.push(\"\");\n lines.push(\n `${errors} ${errors === 1 ? \"error\" : \"errors\"}, ${warnings} ${warnings === 1 ? \"warning\" : \"warnings\"}. ${pass ? \"✔ CI passes.\" : \"✘ CI fails.\"}`,\n );\n return lines.join(\"\\n\");\n}\n\nexport type { HarnessLintConfig } from \"./config.js\";\nexport { loadLintConfig } from \"./config.js\";\nexport type { LintContext, Linter, LintIssue, LintReport, Severity } from \"./types.js\";\n","export const VERSION = \"1.4.0\";\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { REQUIRED_GITIGNORE_ENTRIES } from \"../linters/gitignore-harness.js\";\n\nexport interface CheckResult {\n pass: boolean;\n issues: string[];\n}\n\nconst REQUIRED_DIRS = [\n \"docs/spec\",\n \"docs/decisions\",\n \"docs/handbook\",\n \"docs/tests\",\n \"docs/workflow\",\n];\n\nexport function checkCommand(repoRoot: string): CheckResult {\n const issues: string[] = [];\n\n if (!existsSync(join(repoRoot, \"README.md\"))) {\n issues.push(\"README.md missing at repo root\");\n }\n\n for (const d of REQUIRED_DIRS) {\n if (!existsSync(join(repoRoot, d))) {\n issues.push(`missing directory: ${d}/`);\n }\n }\n\n const gitignorePath = join(repoRoot, \".gitignore\");\n if (!existsSync(gitignorePath)) {\n issues.push(\".gitignore missing at repo root\");\n } else {\n const text = readFileSync(gitignorePath, \"utf8\");\n const lines = new Set(\n text\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter(Boolean),\n );\n for (const entry of REQUIRED_GITIGNORE_ENTRIES) {\n const variants = [entry, entry.replace(/\\/$/, \"\")];\n if (!variants.some((v) => lines.has(v))) {\n issues.push(`.gitignore missing entry: ${entry}`);\n }\n }\n }\n\n return { pass: issues.length === 0, issues };\n}\n","import { existsSync, mkdirSync, rmSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport type { Engine, RenderedFile } from \"../types.js\";\nimport { assertManagedPaths } from \"./managed-paths.js\";\nimport { MANIFEST_FILENAME, MANIFEST_VERSION, type Manifest, readManifest } from \"./manifest.js\";\nimport { planInit, resolveEngineList } from \"./plan-render.js\";\nimport { pruneEmptyDirs } from \"./uninstall.js\";\nimport { SHARED_CONFIG_PATHS } from \"./update-config.js\";\nimport { applyUpdateTransaction } from \"./update-transaction.js\";\nimport { planInstallation } from \"./update.js\";\n\nexport { planInit };\n\nexport interface InitArgs {\n targetDir: string;\n engines?: ReadonlyArray<string>;\n overridesDir?: string;\n /**\n * Directory containing the harness content (agents/, skills/, commands/,\n * templates/). Defaults to the harness package's own `dist/` (resolved\n * via `import.meta.url`), so programmatic callers usually omit it.\n */\n packageDir?: string;\n mcpServers?: ReadonlyArray<string>;\n /**\n * Stop-hook installation. Default `true`. When enabled, each engine\n * receives a hook config that calls `vaubaan-harness stop-hook\n * --engine <engine>` and injects the lint report (with skill\n * suggestions) into the running session whenever the worktree is\n * dirty and lint fails at end-of-turn. Pass `false` to skip the\n * hook configs entirely (runtime kill-switch remains available via\n * `HARNESS_LINT_DISABLE=1`).\n */\n withStopHook?: boolean;\n /** Generated files to leave to the project instead of rendering them. */\n preserveFiles?: ReadonlyArray<string>;\n /** Exact new backup directory, outside the project. Defaults to private user state. */\n backupDir?: string;\n}\n\nexport interface InitResult {\n /** Generated files the harness owns after this run, plus shared configurations it edited. */\n filesWritten: string[];\n /** Files a previous `init` rendered that this one no longer does (layout change, engine dropped). */\n staleFilesRemoved: string[];\n warnings: string[];\n stopHookInstalled: boolean;\n engines: Engine[];\n /** Set when existing project files were changed; holds their previous contents. */\n backupDir?: string;\n}\n\nexport function writeFilesToTarget(\n files: ReadonlyArray<RenderedFile>,\n targetDir: string,\n): string[] {\n assertManagedPaths(\n targetDir,\n files.map((file) => file.path),\n );\n const written: string[] = [];\n for (const f of files) {\n const full = join(targetDir, f.path);\n mkdirSync(dirname(full), { recursive: true });\n writeFileSync(full, f.content);\n written.push(f.path);\n }\n return written;\n}\n\nfunction emptyManifest(engines: ReadonlyArray<Engine>): Manifest {\n return { version: MANIFEST_VERSION, engines: [...engines], renderedAt: \"\", files: [] };\n}\n\n/**\n * Installs or re-renders the harness. Shares the planner of `update`: files\n * the harness does not own are never overwritten or deleted, shared\n * configurations are merged entry by entry, and changes are applied in one\n * transaction (see docs/decisions/safe-init.md).\n */\nexport function initCommand(args: InitArgs): InitResult {\n const root = resolve(args.targetDir);\n const engines = resolveEngineList(args.engines);\n const stopHookInstalled = args.withStopHook !== false;\n const previous = readManifest(root) ?? emptyManifest(engines);\n const plan = planInstallation(\n {\n targetDir: root,\n packageDir: args.packageDir,\n overridesDir: args.overridesDir,\n preserveFiles: args.preserveFiles,\n },\n {\n previous,\n sourceVersion: previous.version,\n engines,\n hookEngines: stopHookInstalled ? engines : [],\n mcpServers: args.mcpServers ?? [],\n },\n );\n const touchedExisting = [...plan.writes.map((file) => file.path), ...plan.removals].some(\n (path) => path !== MANIFEST_FILENAME && existsSync(join(root, path)),\n );\n let backupDir: string | undefined;\n if (plan.writes.length || plan.removals.length) {\n backupDir = applyUpdateTransaction(root, plan.writes, plan.removals, args.backupDir).backupDir;\n if (!touchedExisting && !args.backupDir) {\n rmSync(backupDir, { recursive: true, force: true });\n backupDir = undefined;\n }\n // Dropping an engine leaves its folders empty; remove them like uninstall does.\n pruneEmptyDirs(root, new Set(plan.removals.map((path) => dirname(join(root, path)))));\n }\n const sharedWritten = plan.writes\n .map((file) => file.path)\n .filter((path) => SHARED_CONFIG_PATHS.includes(path) && !plan.owned.includes(path));\n return {\n filesWritten: [...plan.owned, ...sharedWritten],\n staleFilesRemoved: plan.removals,\n warnings: plan.warnings,\n stopHookInstalled,\n engines,\n ...(backupDir ? { backupDir } : {}),\n };\n}\n","import { lstatSync, realpathSync, statSync } from \"node:fs\";\nimport { basename, dirname, isAbsolute, join, resolve, win32 } from \"node:path\";\n\nconst MANAGED_FILES = new Set([\n \"AGENTS.md\",\n \"CLAUDE.md\",\n \".mcp.json\",\n \".harness-manifest.json\",\n \".claude/settings.json\",\n \".codex/config.toml\",\n \".codex/hooks.json\",\n \".opencode/opencode.json\",\n \".opencode/mcp.json\",\n]);\n\n// Includes legacy layouts so upgrades can remove their generated artifacts.\nconst MANAGED_DIRECTORIES = [\n \".claude/agents/\",\n \".claude/commands/\",\n \".claude/skills/\",\n \".codex/agents/\",\n \".codex/commands/\",\n \".codex/skills/\",\n \".agents/skills/\",\n \".opencode/agents/\",\n \".opencode/commands/\",\n \".opencode/skills/\",\n \".opencode/plugins/\",\n];\n\nfunction canonicalTargetRoot(root: string): string {\n let ancestor = resolve(root);\n const missing: string[] = [];\n while (!lstatSync(ancestor, { throwIfNoEntry: false })) {\n missing.unshift(basename(ancestor));\n ancestor = dirname(ancestor);\n }\n const canonical = realpathSync(ancestor);\n if (!statSync(canonical).isDirectory()) {\n throw new Error(`harness target is not a directory: ${root}`);\n }\n return join(canonical, ...missing);\n}\n\nfunction assertManagedLocation(path: string): void {\n const invalidSegment = path\n .split(\"/\")\n .some((part) => part === \"\" || part === \".\" || part === \"..\");\n if (\n isAbsolute(path) ||\n win32.isAbsolute(path) ||\n path.includes(\"\\\\\") ||\n path.includes(\"\\0\") ||\n invalidSegment\n ) {\n throw new Error(`unsafe harness path: ${path}`);\n }\n if (!MANAGED_FILES.has(path) && !MANAGED_DIRECTORIES.some((prefix) => path.startsWith(prefix))) {\n throw new Error(`path is outside harness-managed locations: ${path}`);\n }\n}\n\nfunction assertNoSymbolicComponents(root: string, path: string): void {\n const parts = path.split(\"/\");\n let current = root;\n for (const [index, part] of parts.entries()) {\n current = join(current, part);\n const info = lstatSync(current, { throwIfNoEntry: false });\n if (!info) return;\n if (info.isSymbolicLink()) {\n throw new Error(`symbolic link in harness path: ${path}`);\n }\n const isLeaf = index === parts.length - 1;\n if (isLeaf ? !info.isFile() : !info.isDirectory()) {\n throw new Error(`unexpected file type in harness path: ${path}`);\n }\n }\n}\n\n/**\n * Preflight the complete list before callers mutate any artifact. The target\n * itself may resolve through a symlink; every component below it, including\n * leaf files and the manifest, must be a regular file or directory, never a\n * symlink (even one pointing inside the target). Missing targets are allowed.\n * This checks the current filesystem, not concurrent changes by other processes.\n */\nexport function assertManagedPaths(root: string, files: ReadonlyArray<string>): void {\n for (const path of files) assertManagedLocation(path);\n const canonicalRoot = canonicalTargetRoot(root);\n for (const path of files) assertNoSymbolicComponents(canonicalRoot, path);\n}\n","import { createHash } from \"node:crypto\";\nimport { chmodSync, existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { z } from \"zod\";\nimport type { Engine } from \"../types.js\";\nimport { VERSION } from \"../version.js\";\nimport { assertManagedPaths } from \"./managed-paths.js\";\nimport { type OpenCodeConfigOwnership, OpenCodeConfigOwnershipSchema } from \"./opencode-config.js\";\nimport { type HookConfigsOwnership, HookConfigsOwnershipSchema } from \"./update-config.js\";\n\nexport const MANIFEST_FILENAME = \".harness-manifest.json\";\nexport const MANIFEST_VERSION = \"6\";\n\nconst ManifestSchema = z.object({\n version: z.enum([\"4\", \"5\", MANIFEST_VERSION]),\n engines: z.array(z.string()),\n renderedAt: z.string(),\n files: z.array(z.string()),\n stopHookInstalled: z.boolean().optional(),\n stopHookEngines: z.array(z.string()).optional(),\n opencodeConfig: OpenCodeConfigOwnershipSchema.optional(),\n /** Entries the harness added to `.mcp.json` (Claude Code). */\n mcpConfig: OpenCodeConfigOwnershipSchema.optional(),\n hookConfigs: HookConfigsOwnershipSchema.optional(),\n harnessVersion: z.string().optional(),\n overridesDir: z.string().optional(),\n fileHashes: z.record(z.string().regex(/^[a-f0-9]{64}$/)).optional(),\n preservedFiles: z.array(z.string()).optional(),\n});\n\nexport type Manifest = z.infer<typeof ManifestSchema>;\n\nexport interface WriteManifestExtras {\n stopHookInstalled?: boolean;\n stopHookEngines?: ReadonlyArray<Engine>;\n opencodeConfig?: OpenCodeConfigOwnership;\n hookConfigs?: HookConfigsOwnership;\n overridesDir?: string;\n preservedFiles?: string[];\n}\n\nexport function manifestPath(targetDir: string): string {\n return join(targetDir, MANIFEST_FILENAME);\n}\n\nexport function writeManifest(\n targetDir: string,\n engines: ReadonlyArray<Engine>,\n files: string[],\n extras: WriteManifestExtras = {},\n): void {\n assertManagedPaths(targetDir, [MANIFEST_FILENAME]);\n const manifest: Manifest = {\n version: MANIFEST_VERSION,\n harnessVersion: VERSION,\n engines: [...engines].sort(),\n renderedAt: new Date().toISOString(),\n files: [...files].sort(),\n fileHashes: Object.fromEntries(\n files\n .filter((file) => existsSync(join(targetDir, file)))\n .sort()\n .map((file) => [file, hashContent(readFileSync(join(targetDir, file)))]),\n ),\n ...(extras.overridesDir ? { overridesDir: extras.overridesDir } : {}),\n ...(extras.preservedFiles ? { preservedFiles: extras.preservedFiles } : {}),\n ...(extras.hookConfigs ? { hookConfigs: extras.hookConfigs } : {}),\n ...(extras.opencodeConfig ? { opencodeConfig: extras.opencodeConfig } : {}),\n ...(extras.stopHookInstalled !== undefined\n ? { stopHookInstalled: extras.stopHookInstalled }\n : {}),\n ...(extras.stopHookEngines !== undefined\n ? { stopHookEngines: [...extras.stopHookEngines].sort() }\n : {}),\n };\n const path = manifestPath(targetDir);\n if (existsSync(path)) chmodSync(path, 0o600);\n writeFileSync(path, `${JSON.stringify(manifest, null, 2)}\\n`, { mode: 0o600 });\n}\n\nexport function hashContent(content: string | Buffer): string {\n return createHash(\"sha256\").update(content).digest(\"hex\");\n}\n\nexport function readManifest(targetDir: string): Manifest | null {\n assertManagedPaths(targetDir, [MANIFEST_FILENAME]);\n const path = manifestPath(targetDir);\n if (!existsSync(path)) return null;\n const raw = JSON.parse(readFileSync(path, \"utf8\"));\n return ManifestSchema.parse(raw);\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { isDeepStrictEqual } from \"node:util\";\nimport { z } from \"zod\";\nimport type { RenderedFile } from \"../types.js\";\n\nexport const OPENCODE_CONFIG_PATH = \".opencode/opencode.json\";\nexport const CLAUDE_MCP_PATH = \".mcp.json\";\nconst OPENCODE_SCHEMA = \"https://opencode.ai/config.json\";\nconst ObjectSchema = z.record(z.unknown());\n\n/** A JSON file holding MCP servers under one key, shared with the user. */\ninterface McpJsonTarget {\n path: string;\n key: string;\n label: string;\n schema?: string;\n}\n\nconst OPENCODE_TARGET: McpJsonTarget = {\n path: OPENCODE_CONFIG_PATH,\n key: \"mcp\",\n label: \"OpenCode\",\n schema: OPENCODE_SCHEMA,\n};\nconst CLAUDE_TARGET: McpJsonTarget = {\n path: CLAUDE_MCP_PATH,\n key: \"mcpServers\",\n label: \"Claude Code\",\n};\n\nexport const OpenCodeConfigOwnershipSchema = z.object({\n createdFile: z.boolean(),\n addedMcp: z.boolean(),\n addedSchema: z.boolean(),\n entries: z.record(ObjectSchema),\n});\n\nexport type OpenCodeConfigOwnership = z.infer<typeof OpenCodeConfigOwnershipSchema>;\n\nexport interface OpenCodeConfigPlan {\n write?: RenderedFile;\n remove: boolean;\n ownership?: OpenCodeConfigOwnership;\n warnings: string[];\n}\n\nfunction parseConfig(target: McpJsonTarget, content: string): Record<string, unknown> {\n try {\n const config = ObjectSchema.parse(JSON.parse(content));\n if (Object.hasOwn(config, target.key)) ObjectSchema.parse(config[target.key]);\n return config;\n } catch {\n throw new Error(`invalid ${target.path}: expected a JSON object with an MCP object`);\n }\n}\n\nfunction removeOwnedEntries(\n target: McpJsonTarget,\n config: Record<string, unknown>,\n ownership: OpenCodeConfigOwnership,\n warnings: string[],\n): void {\n if (Object.hasOwn(config, target.key)) {\n const mcp = ObjectSchema.parse(config[target.key]);\n for (const [id, installed] of Object.entries(ownership.entries)) {\n if (!Object.hasOwn(mcp, id)) continue;\n if (isDeepStrictEqual(mcp[id], installed)) delete mcp[id];\n else warnings.push(`preserved modified ${target.label} MCP server: ${id}`);\n }\n config[target.key] = mcp;\n if (ownership.addedMcp && Object.keys(mcp).length === 0)\n Reflect.deleteProperty(config, target.key);\n }\n if (target.schema && ownership.addedSchema && config.$schema === target.schema)\n Reflect.deleteProperty(config, \"$schema\");\n}\n\nfunction addMissingEntries(\n target: McpJsonTarget,\n config: Record<string, unknown>,\n desired: RenderedFile,\n createdFile: boolean,\n warnings: string[],\n): OpenCodeConfigOwnership | undefined {\n const requested = ObjectSchema.parse(parseConfig(target, desired.content)[target.key]);\n const mcp = ObjectSchema.parse(config[target.key] ?? {});\n const entries: Record<string, Record<string, unknown>> = {};\n for (const [id, entry] of Object.entries(requested)) {\n if (Object.hasOwn(mcp, id)) {\n if (!isDeepStrictEqual(mcp[id], entry)) {\n warnings.push(\n `preserved existing ${target.label} MCP server instead of replacing it: ${id}`,\n );\n }\n continue;\n }\n entries[id] = ObjectSchema.parse(entry);\n mcp[id] = entry;\n }\n if (Object.keys(entries).length === 0) return undefined;\n const ownership = {\n createdFile,\n addedMcp: !Object.hasOwn(config, target.key),\n addedSchema: target.schema !== undefined && !Object.hasOwn(config, \"$schema\"),\n entries,\n };\n config[target.key] = mcp;\n if (target.schema && ownership.addedSchema) config.$schema = target.schema;\n return ownership;\n}\n\nfunction planMcpJson(\n target: McpJsonTarget,\n root: string,\n desired: RenderedFile | undefined,\n previous: OpenCodeConfigOwnership | undefined,\n): OpenCodeConfigPlan {\n const warnings: string[] = [];\n if (!desired && !previous) return { remove: false, warnings };\n const path = join(root, target.path);\n const existed = existsSync(path);\n if (!existed && !desired) return { remove: false, warnings };\n const original = existed ? readFileSync(path, \"utf8\") : undefined;\n const config = original === undefined ? {} : parseConfig(target, original);\n const before = structuredClone(config);\n if (previous) removeOwnedEntries(target, config, previous, warnings);\n const createdFile = !existed || previous?.createdFile === true;\n const ownership = desired\n ? addMissingEntries(target, config, desired, createdFile, warnings)\n : undefined;\n if (!ownership && createdFile && Object.keys(config).length === 0) {\n return { remove: existed, warnings };\n }\n return {\n remove: false,\n ownership,\n warnings,\n ...(!existed || !isDeepStrictEqual(before, config)\n ? { write: { path: target.path, content: `${JSON.stringify(config, null, 2)}\\n` } }\n : {}),\n };\n}\n\n/** Plans shared configuration edits before init/uninstall mutate any project files. */\nexport function planOpenCodeConfig(\n root: string,\n desired: RenderedFile | undefined,\n previous: OpenCodeConfigOwnership | undefined,\n): OpenCodeConfigPlan {\n return planMcpJson(OPENCODE_TARGET, root, desired, previous);\n}\n\n/** Same entry-level ownership for Claude Code's `.mcp.json` (`mcpServers`). */\nexport function planClaudeMcpConfig(\n root: string,\n desired: RenderedFile | undefined,\n previous: OpenCodeConfigOwnership | undefined,\n): OpenCodeConfigPlan {\n return planMcpJson(CLAUDE_TARGET, root, desired, previous);\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { isDeepStrictEqual } from \"node:util\";\nimport { z } from \"zod\";\nimport { getRenderer } from \"../renderers/index.js\";\nimport type { Engine, RenderedFile } from \"../types.js\";\nimport { assertManagedPaths } from \"./managed-paths.js\";\nimport {\n OPENCODE_CONFIG_PATH,\n type OpenCodeConfigOwnership,\n planOpenCodeConfig,\n} from \"./opencode-config.js\";\n\nconst LEGACY_OPENCODE_CONFIG = \".opencode/mcp.json\";\nexport const SHARED_CONFIG_PATHS: ReadonlyArray<string> = [\n \".mcp.json\",\n \".codex/config.toml\",\n OPENCODE_CONFIG_PATH,\n LEGACY_OPENCODE_CONFIG,\n \".claude/settings.json\",\n \".codex/hooks.json\",\n];\n\nconst ObjectSchema = z.record(z.unknown());\nconst HookEntrySchema = z.object({ group: ObjectSchema, hook: ObjectSchema });\nconst HookConfigOwnershipSchema = z.object({\n createdFile: z.boolean(),\n addedHooks: z.boolean(),\n addedStop: z.boolean(),\n entries: z.array(HookEntrySchema),\n});\nexport const HookConfigsOwnershipSchema = z\n .object({\n \".claude/settings.json\": HookConfigOwnershipSchema.optional(),\n \".codex/hooks.json\": HookConfigOwnershipSchema.optional(),\n })\n .strict();\nexport type HookConfigsOwnership = z.infer<typeof HookConfigsOwnershipSchema>;\ntype HookConfigOwnership = z.infer<typeof HookConfigOwnershipSchema>;\ntype HookEntry = z.infer<typeof HookEntrySchema>;\ntype HookPath = keyof HookConfigsOwnership;\n\nconst HOOK_ENGINES: Record<HookPath, Engine> = {\n \".claude/settings.json\": \"claude-code\",\n \".codex/hooks.json\": \"codex-cli\",\n};\n\nexport interface ConfigMutations {\n writes: RenderedFile[];\n removals: string[];\n warnings: string[];\n}\n\nexport interface UpdateConfigPrevious {\n files: ReadonlyArray<string>;\n opencodeConfig?: OpenCodeConfigOwnership;\n hookConfigs?: HookConfigsOwnership;\n}\n\nexport interface UpdateConfigPlan extends ConfigMutations {\n ownedFiles: string[];\n opencodeConfig?: OpenCodeConfigOwnership;\n hookConfigs?: HookConfigsOwnership;\n}\n\nfunction parseObject(content: string, path: string): Record<string, unknown> {\n try {\n return ObjectSchema.parse(JSON.parse(content));\n } catch {\n throw new Error(`invalid shared configuration ${path}: expected a JSON object`);\n }\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n const parsed = ObjectSchema.safeParse(value);\n return parsed.success ? parsed.data : undefined;\n}\n\nfunction stopHooks(config: Record<string, unknown>, path: string): unknown[] {\n if (!Object.hasOwn(config, \"hooks\")) return [];\n const hooks = asObject(config.hooks);\n if (!hooks || (Object.hasOwn(hooks, \"Stop\") && !Array.isArray(hooks.Stop))) {\n throw new Error(`invalid shared configuration ${path}: expected hooks.Stop to be an array`);\n }\n return Array.isArray(hooks.Stop) ? hooks.Stop : [];\n}\n\nfunction groupMetadata(group: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(Object.entries(group).filter(([key]) => key !== \"hooks\"));\n}\n\nfunction sameEntry(left: HookEntry, right: HookEntry): boolean {\n return isDeepStrictEqual(left.group, right.group) && isDeepStrictEqual(left.hook, right.hook);\n}\n\nfunction appendEntry(entries: HookEntry[], entry: HookEntry): void {\n if (!entries.some((existing) => sameEntry(existing, entry))) entries.push(entry);\n}\n\nfunction defaultStopGroup(engine: Engine): Record<string, unknown> {\n const file = getRenderer(engine).renderStopHook().files[0];\n if (!file) throw new Error(`missing Stop hook renderer for ${engine}`);\n const group = asObject(stopHooks(parseObject(file.content, file.path), file.path)[0]);\n if (!group || !Array.isArray(group.hooks) || !asObject(group.hooks[0])) {\n throw new Error(`invalid Stop hook renderer for ${engine}`);\n }\n return group;\n}\n\nfunction normalizeHarnessHooks(\n groups: unknown[],\n expected: Record<string, unknown>,\n previous: HookConfigOwnership | undefined,\n claimExisting: boolean,\n warnings: string[],\n path: HookPath,\n): { groups: unknown[]; entries: HookEntry[] } {\n const defaultHook = ObjectSchema.parse((expected.hooks as unknown[])[0]);\n const entries = [...(previous?.entries ?? [])];\n let found = false;\n const normalized = groups.map((value) => {\n const group = asObject(value);\n if (!group) return value;\n const flat = group.type === \"command\" && group.command === defaultHook.command;\n const hooks = flat ? [group] : Array.isArray(group.hooks) ? group.hooks : [];\n const metadata = flat ? groupMetadata(expected) : groupMetadata(group);\n for (const value of hooks) {\n const hook = asObject(value);\n if (!hook || hook.type !== \"command\" || hook.command !== defaultHook.command) continue;\n found = true;\n const entry = { group: metadata, hook };\n if (!claimExisting) continue;\n if (previous && !previous.entries.some((old) => sameEntry(old, entry))) {\n warnings.push(`preserved modified harness Stop hook: ${path}`);\n } else {\n appendEntry(entries, entry);\n }\n }\n return flat && claimExisting ? { ...metadata, hooks: [group] } : value;\n });\n if (!found && !previous?.entries.length) {\n normalized.push(expected);\n appendEntry(entries, { group: groupMetadata(expected), hook: defaultHook });\n } else if (!found) {\n warnings.push(`preserved removed or modified harness Stop hook: ${path}`);\n }\n return { groups: normalized, entries };\n}\n\nfunction removeOwnedHooks(\n config: Record<string, unknown>,\n ownership: HookConfigOwnership,\n path: HookPath,\n warnings: string[],\n): void {\n const groups = stopHooks(config, path);\n const remaining: unknown[] = [];\n const matched = new Set<HookEntry>();\n for (const value of groups) {\n const group = asObject(value);\n if (!group || !Array.isArray(group.hooks)) {\n remaining.push(value);\n continue;\n }\n const metadata = groupMetadata(group);\n const hooks = group.hooks.filter((value) => {\n const hook = asObject(value);\n const entry =\n hook && ownership.entries.find((old) => sameEntry(old, { group: metadata, hook }));\n if (entry) matched.add(entry);\n return !entry;\n });\n if (hooks.length > 0 || hooks.length === group.hooks.length) {\n remaining.push({ ...group, hooks });\n }\n }\n if (matched.size < ownership.entries.length) {\n warnings.push(`preserved removed or modified harness Stop hook: ${path}`);\n }\n const hooks = asObject(config.hooks);\n if (!hooks) return;\n if (ownership.addedStop && remaining.length === 0) Reflect.deleteProperty(hooks, \"Stop\");\n else if (Object.hasOwn(hooks, \"Stop\")) hooks.Stop = remaining;\n if (ownership.addedHooks && Object.keys(hooks).length === 0)\n Reflect.deleteProperty(config, \"hooks\");\n else config.hooks = hooks;\n}\n\nfunction recordMutation(\n plan: ConfigMutations,\n path: string,\n before: Record<string, unknown> | undefined,\n after: Record<string, unknown>,\n createdFile: boolean,\n): void {\n if (createdFile && Object.keys(after).length === 0) {\n if (before) plan.removals.push(path);\n } else if (!isDeepStrictEqual(before, after)) {\n plan.writes.push({ path, content: `${JSON.stringify(after, null, 2)}\\n` });\n }\n}\n\nexport function planHookConfigCleanup(\n root: string,\n ownership: HookConfigsOwnership | undefined,\n): ConfigMutations {\n const plan: ConfigMutations = { writes: [], removals: [], warnings: [] };\n if (!ownership) return plan;\n const validated = HookConfigsOwnershipSchema.parse(ownership);\n assertManagedPaths(root, Object.keys(validated));\n for (const path of Object.keys(HOOK_ENGINES) as HookPath[]) {\n const owned = validated[path];\n if (!owned || !existsSync(join(root, path))) continue;\n const before = parseObject(readFileSync(join(root, path), \"utf8\"), path);\n const config = structuredClone(before);\n removeOwnedHooks(config, owned, path, plan.warnings);\n recordMutation(plan, path, before, config, owned.createdFile);\n }\n return plan;\n}\n\nfunction planActiveHook(\n root: string,\n path: HookPath,\n previous: HookConfigOwnership | undefined,\n claimExisting: boolean,\n plan: UpdateConfigPlan,\n): HookConfigOwnership | undefined {\n assertManagedPaths(root, [path]);\n const existed = existsSync(join(root, path));\n if (!existed && previous?.entries.length) {\n plan.warnings.push(`preserved removed harness Stop hook configuration: ${path}`);\n return previous;\n }\n const before = existed ? parseObject(readFileSync(join(root, path), \"utf8\"), path) : undefined;\n const config = structuredClone(before ?? {});\n const groups = stopHooks(config, path);\n const hooks = asObject(config.hooks) ?? {};\n const normalized = normalizeHarnessHooks(\n groups,\n defaultStopGroup(HOOK_ENGINES[path]),\n previous,\n claimExisting,\n plan.warnings,\n path,\n );\n // Before 1.4.0, init wrote this file whole and listed it in the manifest:\n // the harness created it, along with its hooks and Stop containers.\n const legacyWholeFile = !previous && claimExisting && existed;\n const ownership = {\n createdFile: !existed || previous?.createdFile === true || legacyWholeFile,\n addedHooks: previous?.addedHooks ?? (legacyWholeFile || !Object.hasOwn(config, \"hooks\")),\n addedStop: previous?.addedStop ?? (legacyWholeFile || !Object.hasOwn(hooks, \"Stop\")),\n entries: normalized.entries,\n };\n if (!isDeepStrictEqual(groups, normalized.groups)) {\n config.hooks = { ...hooks, Stop: normalized.groups };\n }\n recordMutation(plan, path, before, config, ownership.createdFile);\n return ownership.entries.length > 0 ? ownership : undefined;\n}\n\nfunction planLegacyOpenCode(\n root: string,\n previous: UpdateConfigPrevious,\n plan: UpdateConfigPlan,\n): void {\n if (!previous.files.includes(LEGACY_OPENCODE_CONFIG)) return;\n const legacyPath = join(root, LEGACY_OPENCODE_CONFIG);\n if (!existsSync(legacyPath)) return;\n assertManagedPaths(root, [LEGACY_OPENCODE_CONFIG, OPENCODE_CONFIG_PATH]);\n const legacy = parseObject(readFileSync(legacyPath, \"utf8\"), LEGACY_OPENCODE_CONFIG);\n if (!asObject(legacy.mcp)) {\n throw new Error(\n `invalid shared configuration ${LEGACY_OPENCODE_CONFIG}: expected an MCP object`,\n );\n }\n const merged = planOpenCodeConfig(\n root,\n { path: OPENCODE_CONFIG_PATH, content: JSON.stringify(legacy) },\n undefined,\n );\n if (merged.write) plan.writes.push(merged.write);\n plan.warnings.push(...merged.warnings);\n if (merged.ownership) {\n const old = previous.opencodeConfig;\n plan.opencodeConfig = {\n createdFile: merged.ownership.createdFile || old?.createdFile === true,\n addedMcp: merged.ownership.addedMcp || old?.addedMcp === true,\n addedSchema: merged.ownership.addedSchema || old?.addedSchema === true,\n entries: { ...old?.entries, ...merged.ownership.entries },\n };\n }\n plan.removals.push(LEGACY_OPENCODE_CONFIG);\n}\n\n/** Preserve existing MCP settings and plan only shared hook/legacy-layout changes. */\nexport function planUpdateConfigs(\n root: string,\n previous: UpdateConfigPrevious,\n hookEngines: ReadonlyArray<Engine>,\n): UpdateConfigPlan {\n const plan: UpdateConfigPlan = {\n writes: [],\n removals: [],\n ownedFiles: [],\n warnings: [],\n ...(previous.opencodeConfig ? { opencodeConfig: previous.opencodeConfig } : {}),\n };\n planLegacyOpenCode(root, previous, plan);\n const hookConfigs: HookConfigsOwnership = {};\n for (const path of Object.keys(HOOK_ENGINES) as HookPath[]) {\n const owned = previous.hookConfigs?.[path];\n if (hookEngines.includes(HOOK_ENGINES[path])) {\n hookConfigs[path] = planActiveHook(\n root,\n path,\n owned,\n previous.files.includes(path) || Boolean(owned),\n plan,\n );\n } else if (owned) {\n const cleanup = planHookConfigCleanup(root, { [path]: owned });\n plan.writes.push(...cleanup.writes);\n plan.removals.push(...cleanup.removals);\n plan.warnings.push(...cleanup.warnings);\n }\n }\n if (Object.values(hookConfigs).some(Boolean)) plan.hookConfigs = hookConfigs;\n if (hookEngines.includes(\"opencode\")) {\n const plugin = getRenderer(\"opencode\").renderStopHook();\n plan.writes.push(...plugin.files);\n plan.ownedFiles.push(...plugin.files.map((file) => file.path));\n plan.warnings.push(...plugin.warnings);\n }\n return plan;\n}\n","import { stringify as yamlStringify } from \"yaml\";\nimport type { McpServerSpec } from \"../mcp.js\";\nimport type { Agent } from \"../parser/agent.js\";\nimport type { Cmd } from \"../parser/cmd.js\";\nimport type { Skill } from \"../parser/skill.js\";\nimport {\n CAPABILITIES_MATRIX,\n type Capability,\n DEGRADED_CAPABILITIES,\n type Engine,\n type RenderedFile,\n} from \"../types.js\";\n\nexport interface UmbrellaExtras {\n availableSkills: ReadonlyArray<Skill>;\n availableCommands: ReadonlyArray<Cmd>;\n hasProjectSkills?: boolean;\n hasQualityDoc?: boolean;\n}\n\nexport interface RenderResult {\n files: RenderedFile[];\n warnings: string[];\n}\n\nexport interface Renderer {\n readonly engine: Engine;\n renderSkill(skill: Skill): RenderResult;\n renderCmd(cmd: Cmd): RenderResult;\n renderAgents(agents: ReadonlyArray<Agent>): RenderResult;\n renderMcp(servers: ReadonlyArray<McpServerSpec>): RenderResult;\n renderStopHook(): RenderResult;\n}\n\nexport const STOP_HOOK_PACKAGE = \"@vaubaan/harness\";\n\nexport interface CapabilityCheck {\n blockingWarnings: string[];\n degradedWarnings: string[];\n}\n\nexport function checkSkillCapabilities(skill: Skill, engine: Engine): CapabilityCheck {\n const blockingWarnings: string[] = [];\n const degradedWarnings: string[] = [];\n const supported = CAPABILITIES_MATRIX[engine];\n const degraded = DEGRADED_CAPABILITIES[engine] ?? [];\n if (!skill.meta.requires) return { blockingWarnings, degradedWarnings };\n for (const cap of skill.meta.requires) {\n if (!supported.includes(cap as Capability)) {\n blockingWarnings.push(\n `skill \"${skill.meta.id}\" requires \"${cap}\" not supported by \"${engine}\" — skipped`,\n );\n } else if (degraded.includes(cap as Capability)) {\n degradedWarnings.push(\n `skill \"${skill.meta.id}\" requires \"${cap}\" — supported by \"${engine}\" with degradation`,\n );\n }\n }\n return { blockingWarnings, degradedWarnings };\n}\n\nexport function isSkillEngineAllowed(skill: Skill, engine: Engine): boolean {\n if (!skill.meta.engines) return true;\n return skill.meta.engines.includes(engine);\n}\n\nexport function yamlFrontmatter(data: Record<string, unknown>): string {\n const rendered = yamlStringify(data, { lineWidth: 0 }).trimEnd();\n return `---\\n${rendered}\\n---\\n`;\n}\n\nconst SCALAR_NEEDS_QUOTE = /[^a-zA-Z0-9_./-]/;\n\nfunction tomlEscapeString(s: string): string {\n return `\"${s.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\")}\"`;\n}\n\nfunction tomlValue(v: unknown): string {\n if (Array.isArray(v)) {\n return `[${v.map((x) => tomlValue(x)).join(\", \")}]`;\n }\n if (typeof v === \"string\") {\n if (v.includes(\"\\n\")) return tomlEscapeString(v);\n return SCALAR_NEEDS_QUOTE.test(v) ? tomlEscapeString(v) : `\"${v}\"`;\n }\n if (typeof v === \"boolean\" || typeof v === \"number\") {\n return String(v);\n }\n return tomlEscapeString(String(v));\n}\n\n/** TOML multi-line basic string (`\"\"\"…\"\"\"`), used for Codex `developer_instructions`. */\nexport function tomlMultilineString(s: string): string {\n const escaped = s.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"\"\"/g, '\"\"\\\\\"');\n return `\"\"\"\\n${escaped}\\n\"\"\"`;\n}\n\nexport function tomlQuoteString(s: string): string {\n return tomlValue(s);\n}\n\nexport function tomlInlineArray(items: ReadonlyArray<unknown>): string {\n return tomlValue([...items]);\n}\n\nexport function tomlInlineTable(table: Record<string, string>): string {\n const entries = Object.entries(table).map(([k, v]) => `${k} = ${tomlValue(v)}`);\n return `{ ${entries.join(\", \")} }`;\n}\n\nexport function frontmatterDataForSkill(skill: Skill): Record<string, unknown> {\n // Agent Skills spec (agentskills.io): `name` must match the directory name.\n const data: Record<string, unknown> = {\n name: skill.meta.id,\n description: skill.meta.description,\n };\n if (skill.meta.tags && skill.meta.tags.length > 0) data.tags = skill.meta.tags;\n return data;\n}\n\nexport function frontmatterDataForCmd(cmd: Cmd): Record<string, unknown> {\n const data: Record<string, unknown> = {\n id: cmd.meta.id,\n trigger: cmd.meta.trigger,\n description: cmd.meta.description,\n };\n if (cmd.meta.args && cmd.meta.args.length > 0) {\n data.args = cmd.meta.args.map((a) => {\n if (a.type === \"enum\") {\n return a.default !== undefined\n ? { name: a.name, type: a.type, values: a.values, default: a.default }\n : { name: a.name, type: a.type, values: a.values };\n }\n return a.default !== undefined\n ? { name: a.name, type: a.type, default: a.default }\n : { name: a.name, type: a.type };\n });\n }\n return data;\n}\n\n/**\n * Personas carry their role contract only: engines discover skills and\n * commands natively, so listing them per persona is pure context cost.\n */\nexport function buildAgentBody(agent: Agent): string {\n return `${agent.body.trim()}\\n`;\n}\n\nexport function buildUmbrellaBody(_agents: ReadonlyArray<Agent>, extras: UmbrellaExtras): string {\n const triggerBySkill = new Map(\n extras.availableCommands.map((c) => [c.meta.invokes_skill, c.meta.trigger]),\n );\n const skillLines = extras.availableSkills.map((s) => {\n const trigger = triggerBySkill.get(s.meta.id);\n const label = trigger ? `\\`${s.meta.id}\\` (\\`${trigger}\\`)` : `\\`${s.meta.id}\\``;\n return `- ${label} — ${s.meta.description.split(\"\\n\")[0]}`;\n });\n const sections: string[] = [\n \"# How we work\",\n \"\",\n \"This file describes **how to work in this project**. The **business context** (what the project does, how to run it, which subsystems it contains) lives in `README.md` and `docs/`. Read them first.\",\n \"\",\n \"## Project map\",\n \"\",\n \"- `README.md` — pitch, quick start, scripts. Entry point.\",\n \"- `docs/spec/<subsystem>.md` — *what* and *why* (tech-agnostic).\",\n \"- `docs/handbook/<feature>.md` — *how it actually works* today.\",\n \"- `docs/decisions/<slug>.md` — ADRs: structural choices and rejected alternatives.\",\n \"- `docs/tests/integration-tests.md` & `e2e-tests.md` — core scenarios.\",\n \"- `docs/workflow/coding-workflow.md` — CI, branches, PR, release.\",\n ...(extras.hasProjectSkills\n ? [\"- `docs/skills/*.skill.md` — the project's domain skills.\"]\n : []),\n ...(extras.hasQualityDoc\n ? [\n \"- `docs/quality/code-quality.md` — the project's code-quality rules: mechanical checks, judgment rules, accepted deviations. Read it before writing or auditing code.\",\n ]\n : []),\n \"\",\n \"## Doc-first\",\n \"\",\n \"The order is: **understand the docs → fill the gaps → code → update the docs → commit**. If the docs are silent or stale on something you change, fill the gap upfront with the doc-skill writers — not downstream, not after the fact.\",\n \"\",\n \"- Missing spec for a subsystem you touch → **do not code**, report the gap.\",\n \"- Implicit structural decision in your changes → an ADR (`/decision`).\",\n \"- Changed feature behavior → update the matching handbook (`/handbook`).\",\n \"- Suspected code ↔ doc drift → `/drift` before moving on.\",\n ];\n if (skillLines.length > 0) {\n sections.push(\"\", \"## Doc-skills\", \"\", skillLines.join(\"\\n\"));\n }\n return `${sections.join(\"\\n\")}\\n`;\n}\n","export const AGENT_IDS = [\"coding\", \"review\", \"merge\", \"planning\"] as const;\nexport type AgentId = (typeof AGENT_IDS)[number];\n\nexport const ENGINES = [\"claude-code\", \"codex-cli\", \"opencode\"] as const;\nexport type Engine = (typeof ENGINES)[number];\n\nexport const ENGINE_ROOT_DIR: Record<Engine, string> = {\n \"claude-code\": \".claude\",\n \"codex-cli\": \".codex\",\n opencode: \".opencode\",\n};\n\nexport const CAPABILITIES = [\"multi-step\", \"slash-command\", \"inline-exec\"] as const;\nexport type Capability = (typeof CAPABILITIES)[number];\n\nexport interface RenderedFile {\n path: string;\n content: string;\n}\n\nexport interface CapabilitiesMatrix {\n [engine: string]: ReadonlyArray<Capability>;\n}\n\nexport const CAPABILITIES_MATRIX: Record<Engine, ReadonlyArray<Capability>> = {\n \"claude-code\": [\"multi-step\", \"slash-command\", \"inline-exec\"],\n \"codex-cli\": [\"multi-step\", \"slash-command\", \"inline-exec\"],\n opencode: [\"multi-step\", \"slash-command\", \"inline-exec\"],\n};\n\nexport const DEGRADED_CAPABILITIES: Partial<Record<Engine, ReadonlyArray<Capability>>> = {\n \"codex-cli\": [\"multi-step\"],\n};\n\nexport function engineSupports(engine: Engine, capability: Capability): boolean {\n return CAPABILITIES_MATRIX[engine].includes(capability);\n}\n","import type { McpServerSpec } from \"../mcp.js\";\nimport type { Agent } from \"../parser/agent.js\";\nimport type { Cmd } from \"../parser/cmd.js\";\nimport type { Skill } from \"../parser/skill.js\";\nimport type { Engine } from \"../types.js\";\nimport {\n type RenderResult,\n type Renderer,\n STOP_HOOK_PACKAGE,\n buildAgentBody,\n checkSkillCapabilities,\n frontmatterDataForCmd,\n frontmatterDataForSkill,\n isSkillEngineAllowed,\n yamlFrontmatter,\n} from \"./common.js\";\n\nconst ENGINE: Engine = \"claude-code\";\nconst BASE = \".claude\";\n\nexport const claudeCodeRenderer: Renderer = {\n engine: ENGINE,\n renderSkill(skill: Skill): RenderResult {\n if (!isSkillEngineAllowed(skill, ENGINE)) {\n return {\n files: [],\n warnings: [`skill \"${skill.meta.id}\" excluded from engine \"${ENGINE}\"`],\n };\n }\n const check = checkSkillCapabilities(skill, ENGINE);\n if (check.blockingWarnings.length > 0) {\n return { files: [], warnings: check.blockingWarnings };\n }\n const content = `${yamlFrontmatter(frontmatterDataForSkill(skill))}\\n${skill.body}\\n`;\n return {\n files: [{ path: `${BASE}/skills/${skill.meta.id}/SKILL.md`, content }],\n warnings: check.degradedWarnings,\n };\n },\n renderCmd(cmd: Cmd): RenderResult {\n const content = `${yamlFrontmatter(frontmatterDataForCmd(cmd))}\\n${cmd.body}\\n`;\n return {\n files: [{ path: `${BASE}/commands/${cmd.meta.id}.md`, content }],\n warnings: [],\n };\n },\n renderAgents(agents: ReadonlyArray<Agent>): RenderResult {\n const files = [];\n for (const agent of agents) {\n const subagentFrontmatter = yamlFrontmatter({\n name: agent.meta.id,\n description: agent.meta.description,\n });\n const body = buildAgentBody(agent);\n const content = `${subagentFrontmatter}\\n${body}`;\n files.push({ path: `${BASE}/agents/${agent.meta.id}.md`, content });\n }\n return { files, warnings: [] };\n },\n renderMcp(servers: ReadonlyArray<McpServerSpec>): RenderResult {\n if (servers.length === 0) return { files: [], warnings: [] };\n const mcpServers: Record<string, Record<string, unknown>> = {};\n for (const s of servers) {\n const entry: Record<string, unknown> = { command: s.command, args: [...s.args] };\n if (s.env) entry.env = s.env;\n mcpServers[s.id] = entry;\n }\n const content = `${JSON.stringify({ mcpServers }, null, 2)}\\n`;\n return { files: [{ path: \".mcp.json\", content }], warnings: [] };\n },\n renderStopHook(): RenderResult {\n const settings = {\n hooks: {\n Stop: [\n {\n matcher: \"\",\n hooks: [\n {\n type: \"command\",\n command: `npx -y ${STOP_HOOK_PACKAGE} stop-hook --engine claude`,\n },\n ],\n },\n ],\n },\n };\n return {\n files: [{ path: `${BASE}/settings.json`, content: `${JSON.stringify(settings, null, 2)}\\n` }],\n warnings: [],\n };\n },\n};\n","import type { McpServerSpec } from \"../mcp.js\";\nimport type { Agent } from \"../parser/agent.js\";\nimport type { Cmd } from \"../parser/cmd.js\";\nimport type { Skill } from \"../parser/skill.js\";\nimport type { Engine } from \"../types.js\";\nimport {\n type RenderResult,\n type Renderer,\n STOP_HOOK_PACKAGE,\n buildAgentBody,\n checkSkillCapabilities,\n frontmatterDataForSkill,\n isSkillEngineAllowed,\n tomlInlineArray,\n tomlInlineTable,\n tomlMultilineString,\n tomlQuoteString,\n yamlFrontmatter,\n} from \"./common.js\";\n\nconst ENGINE: Engine = \"codex-cli\";\nconst BASE = \".codex\";\n// Codex discovers repo skills under `.agents/skills/` only — `.codex/skills/` is not scanned.\nconst SKILLS_BASE = \".agents/skills\";\n\nexport const codexCliRenderer: Renderer = {\n engine: ENGINE,\n renderSkill(skill: Skill): RenderResult {\n if (!isSkillEngineAllowed(skill, ENGINE)) {\n return {\n files: [],\n warnings: [`skill \"${skill.meta.id}\" excluded from engine \"${ENGINE}\"`],\n };\n }\n const check = checkSkillCapabilities(skill, ENGINE);\n if (check.blockingWarnings.length > 0) {\n return { files: [], warnings: check.blockingWarnings };\n }\n const content = `${yamlFrontmatter(frontmatterDataForSkill(skill))}\\n${skill.body}\\n`;\n return {\n files: [{ path: `${SKILLS_BASE}/${skill.meta.id}/SKILL.md`, content }],\n warnings: check.degradedWarnings,\n };\n },\n // Codex custom prompts are deprecated in favour of skills: nothing to render.\n renderCmd(_cmd: Cmd): RenderResult {\n return { files: [], warnings: [] };\n },\n renderAgents(agents: ReadonlyArray<Agent>): RenderResult {\n const files = [];\n for (const agent of agents) {\n const content = [\n `name = ${tomlQuoteString(agent.meta.id)}`,\n `description = ${tomlQuoteString(agent.meta.description)}`,\n `developer_instructions = ${tomlMultilineString(buildAgentBody(agent).trimEnd())}`,\n \"\",\n ].join(\"\\n\");\n files.push({ path: `${BASE}/agents/${agent.meta.id}.toml`, content });\n }\n return { files, warnings: [] };\n },\n renderMcp(servers: ReadonlyArray<McpServerSpec>): RenderResult {\n if (servers.length === 0) return { files: [], warnings: [] };\n const blocks: string[] = [];\n for (const s of servers) {\n const lines = [\n `[mcp_servers.${s.id}]`,\n `command = ${tomlQuoteString(s.command)}`,\n `args = ${tomlInlineArray([...s.args])}`,\n ];\n if (s.env) lines.push(`env = ${tomlInlineTable(s.env)}`);\n blocks.push(lines.join(\"\\n\"));\n }\n const content = `${blocks.join(\"\\n\\n\")}\\n`;\n return { files: [{ path: `${BASE}/config.toml`, content }], warnings: [] };\n },\n renderStopHook(): RenderResult {\n const hooks = {\n hooks: {\n Stop: [\n {\n hooks: [\n {\n type: \"command\",\n command: `npx -y ${STOP_HOOK_PACKAGE} stop-hook --engine codex`,\n },\n ],\n },\n ],\n },\n };\n return {\n files: [{ path: `${BASE}/hooks.json`, content: `${JSON.stringify(hooks, null, 2)}\\n` }],\n warnings: [],\n };\n },\n};\n","import type { McpServerSpec } from \"../mcp.js\";\nimport type { Agent } from \"../parser/agent.js\";\nimport type { Cmd } from \"../parser/cmd.js\";\nimport type { Skill } from \"../parser/skill.js\";\nimport type { Engine } from \"../types.js\";\nimport {\n type RenderResult,\n type Renderer,\n STOP_HOOK_PACKAGE,\n buildAgentBody,\n checkSkillCapabilities,\n frontmatterDataForSkill,\n isSkillEngineAllowed,\n yamlFrontmatter,\n} from \"./common.js\";\n\nconst ENGINE: Engine = \"opencode\";\nconst BASE = \".opencode\";\n\nexport const opencodeRenderer: Renderer = {\n engine: ENGINE,\n renderSkill(skill: Skill): RenderResult {\n if (!isSkillEngineAllowed(skill, ENGINE)) {\n return {\n files: [],\n warnings: [`skill \"${skill.meta.id}\" excluded from engine \"${ENGINE}\"`],\n };\n }\n const check = checkSkillCapabilities(skill, ENGINE);\n if (check.blockingWarnings.length > 0) {\n return { files: [], warnings: check.blockingWarnings };\n }\n const content = `${yamlFrontmatter(frontmatterDataForSkill(skill))}\\n${skill.body}\\n`;\n return {\n files: [{ path: `${BASE}/skills/${skill.meta.id}/SKILL.md`, content }],\n warnings: check.degradedWarnings,\n };\n },\n renderCmd(cmd: Cmd): RenderResult {\n // OpenCode names the command after the file; only `description` is a known key.\n const content = `${yamlFrontmatter({ description: cmd.meta.description })}\\n${cmd.body}\\n`;\n return {\n files: [{ path: `${BASE}/commands/${cmd.meta.id}.md`, content }],\n warnings: [],\n };\n },\n renderAgents(agents: ReadonlyArray<Agent>): RenderResult {\n const files = [];\n for (const agent of agents) {\n // The file name is the agent name. `mode: all` keeps each persona usable\n // both as a session's primary agent and as a subagent.\n const fm = yamlFrontmatter({\n description: agent.meta.description,\n mode: \"all\",\n });\n const body = buildAgentBody(agent);\n files.push({ path: `${BASE}/agents/${agent.meta.id}.md`, content: `${fm}\\n${body}` });\n }\n return { files, warnings: [] };\n },\n renderMcp(servers: ReadonlyArray<McpServerSpec>): RenderResult {\n if (servers.length === 0) return { files: [], warnings: [] };\n const mcp: Record<string, Record<string, unknown>> = {};\n for (const s of servers) {\n const entry: Record<string, unknown> = {\n type: \"local\",\n command: [s.command, ...s.args],\n enabled: true,\n };\n if (s.env) entry.environment = s.env;\n mcp[s.id] = entry;\n }\n const config = { $schema: \"https://opencode.ai/config.json\", mcp };\n const content = `${JSON.stringify(config, null, 2)}\\n`;\n return { files: [{ path: `${BASE}/opencode.json`, content }], warnings: [] };\n },\n renderStopHook(): RenderResult {\n const content = `import { spawnSync } from \"node:child_process\";\n\n// Runs the harness lint and returns the report to inject, or \"\" when the\n// turn may end.\nconst lintReport = (directory, sessionID) => {\n const r = spawnSync(\n \"npx\",\n [\"-y\", \"${STOP_HOOK_PACKAGE}\", \"stop-hook\", \"--engine\", \"opencode\", \"--cwd\", directory],\n { input: JSON.stringify({ sessionID }), encoding: \"utf-8\" },\n );\n const report = (r.stderr ?? \"\").trim();\n return r.status === 2 ? report : \"\";\n};\n\n// OpenCode 1.x entry point, exposed as server() below.\nconst HarnessStopHook = async ({ client, directory }) => ({\n event: async ({ event }) => {\n if (event.type !== \"session.idle\") return;\n const sessionID = event.properties?.sessionID;\n if (!sessionID) return;\n const report = lintReport(directory, sessionID);\n if (report === \"\") return;\n // OpenCode defaults to its build agent when a prompt omits agent.\n // Preserve the last conversation persona, excluding compaction summaries.\n const history = await client.session.messages({ path: { id: sessionID } }).catch(() => undefined);\n if (history?.error || !Array.isArray(history?.data)) return;\n const current = history.data.findLast(({ info }) =>\n (info.role === \"user\" || (info.role === \"assistant\" && !info.summary)) &&\n typeof info.agent === \"string\" && info.agent.trim() !== \"\",\n );\n if (!current) return;\n await client.session.prompt({\n path: { id: sessionID },\n body: { agent: current.info.agent, parts: [{ type: \"text\", text: report }] },\n });\n },\n});\n\n// One default export for both majors: OpenCode 1.x calls server(),\n// OpenCode 2.x calls setup(). A V2 session keeps its agent, so the report\n// is sent without naming the persona.\nexport default {\n id: \"vaubaan-harness-stop-hook\",\n server: HarnessStopHook,\n setup(context) {\n const directory = context.location.directory;\n const controller = new AbortController();\n const listen = async () => {\n for await (const event of context.event.subscribe({ signal: controller.signal })) {\n if (event.type !== \"session.idle\") continue;\n if (event.location?.directory && event.location.directory !== directory) continue;\n const sessionID = event.data?.sessionID;\n if (!sessionID) continue;\n const report = lintReport(directory, sessionID);\n if (report === \"\") continue;\n await context.session.prompt({ sessionID, text: report }).catch(() => undefined);\n }\n };\n listen().catch(() => undefined);\n return () => controller.abort();\n },\n};\n`;\n return {\n files: [{ path: `${BASE}/plugins/harness-stop-hook.ts`, content }],\n warnings: [],\n };\n },\n};\n","import type { Engine } from \"../types.js\";\nimport { claudeCodeRenderer } from \"./claude-code.js\";\nimport { codexCliRenderer } from \"./codex-cli.js\";\nimport type { Renderer } from \"./common.js\";\nimport { opencodeRenderer } from \"./opencode.js\";\n\nexport const RENDERERS: Record<Engine, Renderer> = {\n \"claude-code\": claudeCodeRenderer,\n \"codex-cli\": codexCliRenderer,\n opencode: opencodeRenderer,\n};\n\nexport function getRenderer(engine: Engine): Renderer {\n return RENDERERS[engine];\n}\n\nexport type { Renderer, RenderResult } from \"./common.js\";\n","import { existsSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { loadHarness, loadOverrides, loadProjectSkills } from \"../loader.js\";\nimport { resolveMcpIds } from \"../mcp.js\";\nimport { type RenderOutput, render } from \"../render.js\";\nimport { ENGINES, type Engine } from \"../types.js\";\n\n/** Cardinal file of the optional `docs/quality/` pillar. */\nconst QUALITY_DOC_PATH = \"docs/quality/code-quality.md\";\n\nexport interface RenderPlanArgs {\n targetDir: string;\n engines?: ReadonlyArray<string>;\n overridesDir?: string;\n packageDir?: string;\n mcpServers?: ReadonlyArray<string>;\n withStopHook?: boolean;\n}\n\nexport function resolveEngineList(requested: ReadonlyArray<string> | undefined): Engine[] {\n if (!requested) return [...ENGINES];\n if (requested.length === 0) throw new Error(\"no engine selected\");\n const engines = requested.map((e) => {\n if (!ENGINES.includes(e as Engine)) {\n throw new Error(`unknown engine: ${e} (expected one of ${ENGINES.join(\", \")})`);\n }\n return e as Engine;\n });\n return [...new Set(engines)];\n}\n\n/**\n * Resolves the harness package's bundled content directory. The harness\n * tsup config emits this module to both `dist/init.js` (programmatic\n * `./init` export) and inlines it into `dist/cli/index.js` (CLI use). The\n * content (`agents/`, `skills/`, `commands/`, `templates/`) always sits\n * at `dist/` — same dir as `dist/init.js`, parent of `dist/cli/index.js`.\n * In dev (`src/cli/init.ts`) the content also sits at `src/`. We\n * disambiguate by checking which ancestor contains `agents/`.\n */\nfunction defaultPackageDir(): string {\n const here = dirname(fileURLToPath(import.meta.url));\n if (existsSync(join(here, \"agents\"))) return here;\n return resolve(here, \"..\");\n}\n\nexport function planInit(args: RenderPlanArgs): {\n engines: Engine[];\n output: RenderOutput;\n stopHookInstalled: boolean;\n} {\n const engines = resolveEngineList(args.engines);\n const packageDir = args.packageDir ?? defaultPackageDir();\n const harness = loadHarness(packageDir);\n const overrides = args.overridesDir ? loadOverrides(args.overridesDir) : undefined;\n const projectSkills = loadProjectSkills(args.targetDir);\n const hasQualityDoc = existsSync(join(args.targetDir, QUALITY_DOC_PATH));\n const mcpServers = args.mcpServers ? resolveMcpIds(args.mcpServers) : undefined;\n const stopHookInstalled = args.withStopHook !== false;\n const output = render({\n harness,\n engines,\n overrides,\n projectSkills,\n hasQualityDoc,\n mcpServers,\n withStopHook: stopHookInstalled,\n });\n return { engines, output, stopHookInstalled };\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport fg from \"fast-glob\";\nimport { z } from \"zod\";\nimport { parseAgent } from \"./parser/agent.js\";\nimport { parseCmd } from \"./parser/cmd.js\";\nimport { type Skill, parseSkill } from \"./parser/skill.js\";\nimport type { Harness, HarnessOverrides } from \"./render.js\";\nimport { parseYAML } from \"./util/yaml.js\";\n\nexport const DisableYamlSchema = z\n .object({ disable: z.array(z.string()).optional() })\n .passthrough();\n\nexport interface LoadOptions {\n agentsDir?: string;\n skillsDir?: string;\n commandsDir?: string;\n}\n\nexport function loadHarness(packageDir: string, opts: LoadOptions = {}): Harness {\n const agentsDir = opts.agentsDir ?? join(packageDir, \"agents\");\n const skillsDir = opts.skillsDir ?? join(packageDir, \"skills\");\n const commandsDir = opts.commandsDir ?? join(packageDir, \"commands\");\n\n const agentFiles = fg.sync(\"*.agent.md\", { cwd: agentsDir, absolute: true });\n const skillFiles = fg.sync(\"*.skill.md\", { cwd: skillsDir, absolute: true });\n const cmdFiles = fg.sync(\"*.cmd.md\", { cwd: commandsDir, absolute: true });\n\n return {\n agents: agentFiles.map((f) => parseAgent(f, readFileSync(f, \"utf8\"))),\n skills: skillFiles.map((f) => parseSkill(f, readFileSync(f, \"utf8\"))),\n cmds: cmdFiles.map((f) => parseCmd(f, readFileSync(f, \"utf8\"))),\n };\n}\n\nexport function loadProjectSkills(targetDir: string): Skill[] {\n const skillsDir = join(targetDir, \"docs\", \"skills\");\n if (!existsSync(skillsDir)) return [];\n const skillFiles = fg.sync(\"*.skill.md\", { cwd: skillsDir, absolute: true });\n return skillFiles.map((f) => parseSkill(f, readFileSync(f, \"utf8\")));\n}\n\nexport function loadOverrides(worktreeDir: string): HarnessOverrides | undefined {\n const overridesDir = join(worktreeDir, \".harness-overrides\");\n if (!existsSync(overridesDir)) return undefined;\n\n const added = loadHarness(overridesDir, {\n agentsDir: join(overridesDir, \"agents\"),\n skillsDir: join(overridesDir, \"skills\"),\n commandsDir: join(overridesDir, \"commands\"),\n });\n\n const disablePath = join(overridesDir, \"disable.yaml\");\n let disable: string[] = [];\n if (existsSync(disablePath)) {\n try {\n const parsed = DisableYamlSchema.safeParse(parseYAML(readFileSync(disablePath, \"utf8\")));\n if (parsed.success && parsed.data.disable) {\n disable = parsed.data.disable;\n }\n } catch {\n // corrupt YAML — leave disable as []\n }\n }\n\n return { add: added, disable };\n}\n","import { readFileSync } from \"node:fs\";\nimport matter from \"gray-matter\";\nimport type { z } from \"zod\";\nimport { ParseError } from \"./schemas.js\";\n\nexport interface ParsedFile<T> {\n meta: T;\n body: string;\n sourcePath: string;\n}\n\nexport function parseWithSchema<T extends z.ZodTypeAny>(\n filePath: string,\n source: string,\n schema: T,\n): ParsedFile<z.infer<T>> {\n const parsed = matter(source);\n const result = schema.safeParse(parsed.data);\n if (!result.success) {\n throw new ParseError(filePath, result.error.issues);\n }\n return {\n meta: result.data,\n body: parsed.content.trim(),\n sourcePath: filePath,\n };\n}\n\nexport function parseFileWithSchema<T extends z.ZodTypeAny>(\n filePath: string,\n schema: T,\n): ParsedFile<z.infer<T>> {\n const source = readFileSync(filePath, \"utf8\");\n return parseWithSchema(filePath, source, schema);\n}\n","import { z } from \"zod\";\nimport { AGENT_IDS, CAPABILITIES, ENGINES } from \"../types.js\";\n\nconst IdSchema = z\n .string()\n .min(1)\n .regex(/^[a-z][a-z0-9-]*$/, \"id must be kebab-case (lowercase + digits + hyphens)\");\n\nconst SkillFrontmatterSchema = z\n .object({\n id: IdSchema,\n description: z.string().min(1),\n engines: z.array(z.enum(ENGINES)).min(1).optional(),\n requires: z.array(z.enum(CAPABILITIES)).optional(),\n tags: z.array(z.string()).optional(),\n })\n .strict();\n\nexport type SkillFrontmatter = z.infer<typeof SkillFrontmatterSchema>;\n\nconst CmdArgEnumSchema = z\n .object({\n name: z.string().min(1),\n type: z.literal(\"enum\"),\n values: z.array(z.string()).min(1),\n default: z.string().optional(),\n })\n .strict();\n\nconst CmdArgStringSchema = z\n .object({\n name: z.string().min(1),\n type: z.literal(\"string\"),\n default: z.string().optional(),\n })\n .strict();\n\nconst CmdArgSchema = z.discriminatedUnion(\"type\", [CmdArgEnumSchema, CmdArgStringSchema]);\n\nexport type CmdArg = z.infer<typeof CmdArgSchema>;\n\nconst CmdFrontmatterSchema = z\n .object({\n id: IdSchema,\n trigger: z.string().regex(/^\\/[a-z][a-z0-9-]*$/, \"trigger must be /kebab-case\"),\n invokes_skill: IdSchema,\n args: z.array(CmdArgSchema).optional(),\n description: z.string().min(1),\n })\n .strict();\n\nexport type CmdFrontmatter = z.infer<typeof CmdFrontmatterSchema>;\n\nconst AgentFrontmatterSchema = z\n .object({\n id: z.enum(AGENT_IDS),\n description: z.string().min(1),\n })\n .strict();\n\nexport type AgentFrontmatter = z.infer<typeof AgentFrontmatterSchema>;\n\nexport const Schemas = {\n Skill: SkillFrontmatterSchema,\n Cmd: CmdFrontmatterSchema,\n Agent: AgentFrontmatterSchema,\n} as const;\n\nexport class ParseError extends Error {\n constructor(\n public readonly file: string,\n public readonly issues: z.ZodIssue[],\n ) {\n const messages = issues\n .map((i) => ` - ${i.path.join(\".\") || \"<root>\"}: ${i.message}`)\n .join(\"\\n\");\n super(`Frontmatter validation failed for ${file}:\\n${messages}`);\n this.name = \"ParseError\";\n }\n}\n","import { parseFileWithSchema, parseWithSchema } from \"./common.js\";\nimport type { ParsedFile } from \"./common.js\";\nimport { type AgentFrontmatter, Schemas } from \"./schemas.js\";\n\nexport type Agent = ParsedFile<AgentFrontmatter>;\n\nexport function parseAgent(filePath: string, source: string): Agent {\n return parseWithSchema(filePath, source, Schemas.Agent);\n}\n\nexport function parseAgentFile(filePath: string): Agent {\n return parseFileWithSchema(filePath, Schemas.Agent);\n}\n","import { parseFileWithSchema, parseWithSchema } from \"./common.js\";\nimport type { ParsedFile } from \"./common.js\";\nimport { type CmdFrontmatter, Schemas } from \"./schemas.js\";\n\nexport type Cmd = ParsedFile<CmdFrontmatter>;\n\nexport function parseCmd(filePath: string, source: string): Cmd {\n return parseWithSchema(filePath, source, Schemas.Cmd);\n}\n\nexport function parseCmdFile(filePath: string): Cmd {\n return parseFileWithSchema(filePath, Schemas.Cmd);\n}\n","import { parseFileWithSchema, parseWithSchema } from \"./common.js\";\nimport type { ParsedFile } from \"./common.js\";\nimport { Schemas, type SkillFrontmatter } from \"./schemas.js\";\n\nexport type Skill = ParsedFile<SkillFrontmatter>;\n\nexport function parseSkill(filePath: string, source: string): Skill {\n return parseWithSchema(filePath, source, Schemas.Skill);\n}\n\nexport function parseSkillFile(filePath: string): Skill {\n return parseFileWithSchema(filePath, Schemas.Skill);\n}\n","import { parse as yamlParse } from \"yaml\";\n\nexport function parseYAML(source: string): unknown {\n return yamlParse(source);\n}\n","export const MCP_SERVER_IDS = [\"context7\"] as const;\nexport type McpServerId = (typeof MCP_SERVER_IDS)[number];\n\nexport interface McpServerSpec {\n id: McpServerId;\n description: string;\n command: string;\n args: ReadonlyArray<string>;\n env?: Record<string, string>;\n}\n\nexport const MCP_SERVERS: Record<McpServerId, McpServerSpec> = {\n context7: {\n id: \"context7\",\n description:\n \"Upstash Context7 — fetches up-to-date library docs via resolve-library-id + get-library-docs.\",\n command: \"npx\",\n args: [\"-y\", \"@upstash/context7-mcp\"],\n },\n};\n\nexport function resolveMcpIds(requested: ReadonlyArray<string>): McpServerId[] {\n return requested.map((id) => {\n if (!(MCP_SERVER_IDS as ReadonlyArray<string>).includes(id)) {\n throw new Error(`unknown MCP server: ${id} (expected one of ${MCP_SERVER_IDS.join(\", \")})`);\n }\n return id as McpServerId;\n });\n}\n","import { MCP_SERVERS, type McpServerId } from \"./mcp.js\";\nimport type { Agent } from \"./parser/agent.js\";\nimport type { Cmd } from \"./parser/cmd.js\";\nimport type { Skill } from \"./parser/skill.js\";\nimport { buildUmbrellaBody } from \"./renderers/common.js\";\nimport { getRenderer } from \"./renderers/index.js\";\nimport type { Engine, RenderedFile } from \"./types.js\";\n\nexport interface Harness {\n agents: ReadonlyArray<Agent>;\n skills: ReadonlyArray<Skill>;\n cmds: ReadonlyArray<Cmd>;\n}\n\nexport interface HarnessOverrides {\n add?: Partial<Harness>;\n disable?: ReadonlyArray<string>;\n}\n\nexport interface RenderInput {\n harness: Harness;\n engines: ReadonlyArray<Engine>;\n overrides?: HarnessOverrides;\n projectSkills?: ReadonlyArray<Skill>;\n /** True when the target project ships `docs/quality/code-quality.md` (optional pillar). */\n hasQualityDoc?: boolean;\n mcpServers?: ReadonlyArray<McpServerId>;\n /**\n * When true (default), each engine's renderer emits a Stop-hook config\n * that calls `vaubaan-harness stop-hook --engine <engine>` and injects\n * the lint report (with skill suggestions) into the running session\n * whenever the worktree is dirty and lint fails. Pass `false` to skip\n * the hook configs entirely (kill-switch at install time; runtime\n * kill-switch is `HARNESS_LINT_DISABLE=1`).\n */\n withStopHook?: boolean;\n}\n\nexport interface RenderOutput {\n files: RenderedFile[];\n warnings: string[];\n}\n\nexport class RenderError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"RenderError\";\n }\n}\n\nfunction mergeById<T extends { meta: { id: string } }>(\n stock: ReadonlyArray<T>,\n added: ReadonlyArray<T> | undefined,\n): T[] {\n const result = new Map<string, T>();\n for (const item of stock) result.set(item.meta.id, item);\n if (added) {\n for (const item of added) result.set(item.meta.id, item);\n }\n return Array.from(result.values());\n}\n\nfunction removeByIds<T extends { meta: { id: string } }>(\n items: ReadonlyArray<T>,\n disabled: ReadonlyArray<string>,\n): T[] {\n if (disabled.length === 0) return [...items];\n const disabledSet = new Set(disabled);\n return items.filter((item) => !disabledSet.has(item.meta.id));\n}\n\nexport function applyOverrides(harness: Harness, overrides: HarnessOverrides | undefined): Harness {\n const disabled = overrides?.disable ?? [];\n return {\n agents: removeByIds(mergeById(harness.agents, overrides?.add?.agents), disabled),\n skills: removeByIds(mergeById(harness.skills, overrides?.add?.skills), disabled),\n cmds: removeByIds(mergeById(harness.cmds, overrides?.add?.cmds), disabled),\n };\n}\n\n// `@AGENTS.md` is Claude Code's import syntax: the umbrella is really loaded,\n// on every version and provider, and never read twice alongside native\n// AGENTS.md support (cf. ADR engine-native-layouts-1-0).\nconst CLAUDE_MD_STUB = \"@AGENTS.md\\n\";\n\n// OpenCode also scans `.claude/skills/` and `.agents/skills/`. It goes last so\n// its own copy of a skill is dropped when another rendered engine exposes it.\nfunction opencodeLast(engines: ReadonlyArray<Engine>): Engine[] {\n return [...engines].sort((a, b) => Number(a === \"opencode\") - Number(b === \"opencode\"));\n}\n\nexport function render(input: RenderInput): RenderOutput {\n const { engines } = input;\n if (engines.length === 0) {\n throw new RenderError(\"at least one engine must be selected\");\n }\n const base: Harness = input.projectSkills?.length\n ? { ...input.harness, skills: mergeById(input.harness.skills, input.projectSkills) }\n : input.harness;\n const harness = applyOverrides(base, input.overrides);\n if (harness.agents.length === 0) {\n throw new RenderError(\"No agents found in harness\");\n }\n\n const files: RenderedFile[] = [];\n const warnings: string[] = [];\n\n // Track skills + commands successfully exposed on at least one engine,\n // for the engine-neutral umbrella's \"Available skills/commands\" sections.\n const exposedSkills = new Map<string, Skill>();\n const exposedCmds = new Map<string, Cmd>();\n\n for (const engine of opencodeLast(engines)) {\n const renderer = getRenderer(engine);\n\n const renderedSkills: Skill[] = [];\n for (const skill of harness.skills) {\n const result = renderer.renderSkill(skill);\n warnings.push(...result.warnings);\n if (result.files.length > 0) {\n const alreadyVisible = engine === \"opencode\" && exposedSkills.has(skill.meta.id);\n if (!alreadyVisible) files.push(...result.files);\n renderedSkills.push(skill);\n exposedSkills.set(skill.meta.id, skill);\n }\n }\n\n const renderedSkillIds = new Set(renderedSkills.map((s) => s.meta.id));\n const renderedCmds: Cmd[] = [];\n for (const cmd of harness.cmds) {\n if (!renderedSkillIds.has(cmd.meta.invokes_skill)) continue;\n const result = renderer.renderCmd(cmd);\n warnings.push(...result.warnings);\n if (result.files.length > 0) {\n files.push(...result.files);\n renderedCmds.push(cmd);\n exposedCmds.set(cmd.meta.id, cmd);\n }\n }\n\n const agentsResult = renderer.renderAgents(harness.agents);\n warnings.push(...agentsResult.warnings);\n files.push(...agentsResult.files);\n\n if (input.mcpServers && input.mcpServers.length > 0) {\n const specs = input.mcpServers.map((id) => MCP_SERVERS[id]);\n const mcpResult = renderer.renderMcp(specs);\n warnings.push(...mcpResult.warnings);\n files.push(...mcpResult.files);\n }\n\n if (input.withStopHook !== false) {\n const hookResult = renderer.renderStopHook();\n warnings.push(...hookResult.warnings);\n files.push(...hookResult.files);\n }\n }\n\n // Engine-neutral umbrella at the root\n const hasProjectSkills = (input.projectSkills?.length ?? 0) > 0;\n const umbrellaContent = buildUmbrellaBody(harness.agents, {\n availableSkills: Array.from(exposedSkills.values()),\n availableCommands: Array.from(exposedCmds.values()),\n hasProjectSkills,\n hasQualityDoc: input.hasQualityDoc === true,\n });\n files.push({ path: \"AGENTS.md\", content: umbrellaContent });\n\n // CLAUDE.md stub only if claude-code is enabled (Claude Code reads it historically)\n if (engines.includes(\"claude-code\")) {\n files.push({ path: \"CLAUDE.md\", content: CLAUDE_MD_STUB });\n }\n\n return { files, warnings };\n}\n","import {\n existsSync,\n readFileSync,\n readdirSync,\n rmdirSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { dirname, join, relative, resolve } from \"node:path\";\nimport { assertManagedPaths } from \"./managed-paths.js\";\nimport { MANIFEST_FILENAME, hashContent, manifestPath, readManifest } from \"./manifest.js\";\nimport {\n CLAUDE_MCP_PATH,\n OPENCODE_CONFIG_PATH,\n planClaudeMcpConfig,\n planOpenCodeConfig,\n} from \"./opencode-config.js\";\nimport { planHookConfigCleanup } from \"./update-config.js\";\n\nexport interface UninstallArgs {\n targetDir: string;\n}\n\nexport interface UninstallResult {\n filesRemoved: string[];\n dirsPruned: string[];\n warnings: string[];\n}\n\nexport function uninstallCommand(args: UninstallArgs): UninstallResult {\n const root = resolve(args.targetDir);\n const warnings: string[] = [];\n assertManagedPaths(root, [MANIFEST_FILENAME]);\n const manifest = readManifest(root);\n if (!manifest) {\n warnings.push(`no manifest found at ${manifestPath(root)} — nothing to uninstall`);\n return { filesRemoved: [], dirsPruned: [], warnings };\n }\n\n assertManagedPaths(root, [\n ...manifest.files,\n ...(manifest.opencodeConfig ? [OPENCODE_CONFIG_PATH] : []),\n ...(manifest.mcpConfig ? [CLAUDE_MCP_PATH] : []),\n ...Object.keys(manifest.hookConfigs ?? {}),\n ]);\n const config = planOpenCodeConfig(root, undefined, manifest.opencodeConfig);\n const mcp = planClaudeMcpConfig(root, undefined, manifest.mcpConfig);\n const hooks = planHookConfigCleanup(root, manifest.hookConfigs);\n const sharedHooks = new Set(Object.keys(manifest.hookConfigs ?? {}));\n // A generated file edited since the harness wrote it now belongs to the user.\n const modified = manifest.files.filter((file) => {\n const hash = manifest.fileHashes?.[file];\n const full = join(root, file);\n return hash !== undefined && existsSync(full) && hashContent(readFileSync(full)) !== hash;\n });\n const ownedFiles = manifest.files.filter(\n (file) =>\n file !== OPENCODE_CONFIG_PATH &&\n !(manifest.mcpConfig && file === CLAUDE_MCP_PATH) &&\n !sharedHooks.has(file) &&\n !modified.includes(file),\n );\n if (config.remove) ownedFiles.push(OPENCODE_CONFIG_PATH);\n if (mcp.remove) ownedFiles.push(CLAUDE_MCP_PATH);\n ownedFiles.push(...hooks.removals);\n const { filesRemoved, dirsPruned, missing } = removeRenderedFiles(root, ownedFiles);\n for (const file of [config.write, mcp.write, ...hooks.writes]) {\n if (file) writeFileSync(join(root, file.path), file.content);\n }\n warnings.push(...config.warnings, ...mcp.warnings, ...hooks.warnings);\n for (const file of modified) warnings.push(`kept modified harness file: ${file}`);\n if (manifest.files.includes(OPENCODE_CONFIG_PATH) && !manifest.opencodeConfig) {\n warnings.push(`preserved legacy shared configuration: ${OPENCODE_CONFIG_PATH}`);\n }\n for (const rel of missing) warnings.push(`file in manifest is already missing: ${rel}`);\n\n unlinkSync(manifestPath(root));\n return { filesRemoved, dirsPruned, warnings };\n}\n\nexport function removeRenderedFiles(\n root: string,\n files: ReadonlyArray<string>,\n): { filesRemoved: string[]; dirsPruned: string[]; missing: string[] } {\n assertManagedPaths(root, files);\n const filesRemoved: string[] = [];\n const missing: string[] = [];\n const dirsToConsider = new Set<string>();\n for (const rel of files) {\n const full = join(root, rel);\n if (existsSync(full)) {\n unlinkSync(full);\n filesRemoved.push(rel);\n dirsToConsider.add(dirname(full));\n } else {\n missing.push(rel);\n }\n }\n return { filesRemoved, dirsPruned: pruneEmptyDirs(root, dirsToConsider), missing };\n}\n\nexport function pruneEmptyDirs(root: string, leaves: Set<string>): string[] {\n const candidates = new Set<string>();\n for (const leaf of leaves) {\n let cur = leaf;\n while (cur !== root && cur.startsWith(`${root}/`)) {\n candidates.add(cur);\n cur = dirname(cur);\n }\n }\n const pruned: string[] = [];\n const sorted = [...candidates].sort((a, b) => b.length - a.length);\n for (const dir of sorted) {\n if (!existsSync(dir)) continue;\n if (readdirSync(dir).length > 0) continue;\n rmdirSync(dir);\n pruned.push(relative(root, dir));\n }\n return pruned;\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport {\n chmodSync,\n closeSync,\n fsyncSync,\n lstatSync,\n mkdirSync,\n openSync,\n readFileSync,\n readdirSync,\n realpathSync,\n rmdirSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { basename, dirname, isAbsolute, join, relative, resolve, sep } from \"node:path\";\nimport type { RenderedFile } from \"../types.js\";\nimport { assertManagedPaths } from \"./managed-paths.js\";\n\nconst MANIFEST_PATH = \".harness-manifest.json\";\nconst PRIVATE_FILES = new Set([\n MANIFEST_PATH,\n \".mcp.json\",\n \".codex/config.toml\",\n \".codex/hooks.json\",\n \".claude/settings.json\",\n \".opencode/opencode.json\",\n \".opencode/mcp.json\",\n]);\n\ntype SnapshotEntry =\n | { path: string; exists: false }\n | { path: string; exists: true; mode: number; sha256: string };\n\nfunction canonicalRoot(root: string): string {\n let ancestor = resolve(root);\n const missing: string[] = [];\n while (!lstatSync(ancestor, { throwIfNoEntry: false })) {\n missing.unshift(basename(ancestor));\n ancestor = dirname(ancestor);\n }\n return join(realpathSync(ancestor), ...missing);\n}\n\nfunction contains(parent: string, child: string): boolean {\n const path = relative(parent, child);\n return path === \"\" || (!isAbsolute(path) && path !== \"..\" && !path.startsWith(`..${sep}`));\n}\n\nfunction assertBackupLocation(root: string, backup: string): void {\n if (contains(root, backup) || contains(backup, root)) {\n throw new Error(`update backup must be outside the target project: ${backup}`);\n }\n const ancestors: string[] = [];\n for (let path = backup; ; path = dirname(path)) {\n ancestors.unshift(path);\n if (dirname(path) === path) break;\n }\n for (const path of ancestors) {\n const info = lstatSync(path, { throwIfNoEntry: false });\n if (!info) continue;\n if (info.isSymbolicLink() || !info.isDirectory()) {\n throw new Error(`unsafe update backup directory: ${path}`);\n }\n }\n if (lstatSync(backup, { throwIfNoEntry: false })) {\n throw new Error(`update backup directory already exists: ${backup}`);\n }\n}\n\nfunction createDirectories(path: string, created: string[], mode = 0o777): void {\n const missing: string[] = [];\n for (\n let current = path;\n !lstatSync(current, { throwIfNoEntry: false });\n current = dirname(current)\n ) {\n missing.unshift(current);\n }\n for (const directory of missing) {\n mkdirSync(directory, { mode });\n created.push(directory);\n }\n}\n\nfunction writeBackupFile(path: string, content: string | Buffer): void {\n createDirectories(dirname(path), [], 0o700);\n const fd = openSync(path, \"wx\", 0o600);\n try {\n writeFileSync(fd, content);\n fsyncSync(fd);\n } finally {\n closeSync(fd);\n }\n}\n\nfunction saveSnapshot(root: string, paths: string[], backup: string): SnapshotEntry[] {\n const entries: SnapshotEntry[] = [];\n createDirectories(dirname(backup), [], 0o700);\n mkdirSync(backup, { mode: 0o700 });\n for (const path of paths) {\n const full = join(root, path);\n const info = lstatSync(full, { throwIfNoEntry: false });\n if (!info) {\n entries.push({ path, exists: false });\n continue;\n }\n const content = readFileSync(full);\n writeBackupFile(join(backup, \"files\", path), content);\n entries.push({\n path,\n exists: true,\n mode: info.mode & 0o7777,\n sha256: createHash(\"sha256\").update(content).digest(\"hex\"),\n });\n }\n writeBackupFile(\n join(backup, \"snapshot.json\"),\n `${JSON.stringify({ version: 1, root, createdAt: new Date().toISOString(), entries }, null, 2)}\\n`,\n );\n return entries;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction rollback(\n root: string,\n backup: string,\n entries: ReadonlyMap<string, SnapshotEntry>,\n touched: Set<string>,\n createdDirectories: string[],\n): string[] {\n const errors: string[] = [];\n for (const path of [...touched].reverse()) {\n try {\n assertManagedPaths(root, [path]);\n const entry = entries.get(path);\n const full = join(root, path);\n const current = lstatSync(full, { throwIfNoEntry: false });\n if (!entry?.exists) {\n if (current) unlinkSync(full);\n continue;\n }\n const original = readFileSync(join(backup, \"files\", path));\n if (!current || !readFileSync(full).equals(original)) {\n // Recreate the file to restore even an original read-only mode.\n if (current) unlinkSync(full);\n writeFileSync(full, original, { mode: 0o600 });\n }\n chmodSync(full, entry.mode);\n } catch (error) {\n errors.push(`${path}: ${errorMessage(error)}`);\n }\n }\n for (const directory of [...createdDirectories].reverse()) {\n try {\n if (readdirSync(directory).length === 0) rmdirSync(directory);\n } catch (error) {\n errors.push(`${directory}: ${errorMessage(error)}`);\n }\n }\n return errors;\n}\n\n/**\n * Apply an already planned update, preserving the caller's write order (the\n * manifest belongs last). Backups are new, private directories outside the\n * project. The complete batch is validated before backup or project mutation.\n */\nexport function applyUpdateTransaction(\n root: string,\n writes: ReadonlyArray<RenderedFile>,\n removals: ReadonlyArray<string>,\n backupDir?: string,\n): { backupDir: string } {\n const paths = [...new Set([...removals, ...writes.map((file) => file.path)])];\n assertManagedPaths(root, paths);\n const target = canonicalRoot(root);\n const backup = resolve(\n backupDir ?? join(homedir(), \".local\", \"state\", \"vaubaan-harness\", \"backups\", randomUUID()),\n );\n assertBackupLocation(target, backup);\n let snapshot: SnapshotEntry[];\n try {\n snapshot = saveSnapshot(target, paths, backup);\n } catch (error) {\n throw new Error(\n `could not prepare update backup at ${backup}; project unchanged: ${errorMessage(error)}`,\n { cause: error },\n );\n }\n const entries = new Map(snapshot.map((entry) => [entry.path, entry]));\n const touched = new Set<string>();\n const createdDirectories: string[] = [];\n try {\n assertManagedPaths(target, paths);\n for (const path of removals) {\n if (!lstatSync(join(target, path), { throwIfNoEntry: false })) continue;\n touched.add(path);\n unlinkSync(join(target, path));\n }\n for (const file of writes) {\n const full = join(target, file.path);\n createDirectories(dirname(full), createdDirectories);\n touched.add(file.path);\n const entry = entries.get(file.path);\n const mode =\n file.path === MANIFEST_PATH\n ? 0o600\n : entry?.exists\n ? entry.mode\n : PRIVATE_FILES.has(file.path)\n ? 0o600\n : 0o644;\n // Ownership snapshots may include private settings. Restrict an existing\n // manifest before writing those bytes, and restore its old mode on failure.\n if (entry?.exists && file.path === MANIFEST_PATH) chmodSync(full, mode);\n writeFileSync(full, file.content, { mode });\n if (entry?.exists) chmodSync(full, mode);\n }\n } catch (error) {\n const failures = rollback(target, backup, entries, touched, createdDirectories);\n const restoration =\n failures.length > 0 ? `rollback errors: ${failures.join(\"; \")}` : \"rollback completed\";\n throw new Error(`update failed; backup: ${backup}; ${restoration}: ${errorMessage(error)}`, {\n cause: error,\n });\n }\n return { backupDir: backup };\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { isDeepStrictEqual } from \"node:util\";\nimport { DisableYamlSchema } from \"../loader.js\";\nimport type { Engine, RenderedFile } from \"../types.js\";\nimport { parseYAML } from \"../util/yaml.js\";\nimport { VERSION } from \"../version.js\";\nimport { assertManagedPaths } from \"./managed-paths.js\";\nimport { MANIFEST_FILENAME, MANIFEST_VERSION, type Manifest, hashContent } from \"./manifest.js\";\nimport {\n CLAUDE_MCP_PATH,\n OPENCODE_CONFIG_PATH,\n type OpenCodeConfigOwnership,\n planClaudeMcpConfig,\n planOpenCodeConfig,\n} from \"./opencode-config.js\";\nimport { planInit } from \"./plan-render.js\";\nimport { SHARED_CONFIG_PATHS, planUpdateConfigs } from \"./update-config.js\";\nimport { readUpdateInstallation } from \"./update-manifest.js\";\nimport { applyUpdateTransaction } from \"./update-transaction.js\";\n\nconst CODEX_CONFIG_PATH = \".codex/config.toml\";\n\nexport interface UpdateArgs {\n targetDir: string;\n packageDir?: string;\n overridesDir?: string;\n preserveFiles?: ReadonlyArray<string>;\n dryRun?: boolean;\n /** Exact new backup directory, outside the project. Defaults to private user state. */\n backupDir?: string;\n}\n\nexport interface UpdateResult {\n version: string;\n fromManifestVersion: string;\n dryRun: boolean;\n upToDate: boolean;\n filesToWrite: string[];\n filesToRemove: string[];\n warnings: string[];\n backupDir?: string;\n}\n\nexport interface UpdatePlan {\n writes: RenderedFile[];\n removals: string[];\n /** Generated files the harness owns after this plan, as recorded in the manifest. */\n owned: string[];\n result: UpdateResult;\n}\n\n/** What to install: `update` reads it from the manifest, `init` from its options. */\nexport interface InstallationSettings {\n previous: Manifest;\n sourceVersion: string;\n engines: Engine[];\n hookEngines: Engine[];\n /** MCP servers to install. Undefined keeps the MCP state recorded by a previous run. */\n mcpServers?: ReadonlyArray<string>;\n}\n\ninterface McpPlan {\n writes: RenderedFile[];\n removals: string[];\n owned: string[];\n /** False when the OpenCode file was left to the legacy migration of this run. */\n plannedOpenCode: boolean;\n opencodeConfig?: OpenCodeConfigOwnership;\n mcpConfig?: OpenCodeConfigOwnership;\n warnings: string[];\n}\n\nfunction currentContent(root: string, path: string): string | undefined {\n return existsSync(join(root, path)) ? readFileSync(join(root, path), \"utf8\") : undefined;\n}\n\n/** True when the manifest lists `path` and the file still has the content the harness wrote. */\nfunction ownedUnchanged(root: string, previous: Manifest, path: string): boolean {\n const content = currentContent(root, path);\n if (content === undefined || !previous.files.includes(path)) return false;\n const hash = previous.fileHashes?.[path];\n return hash === undefined || hash === hashContent(content);\n}\n\n/** Collects every conflict before failing, so one run lists all files to resolve. */\nfunction checkArtifactConflicts(\n root: string,\n previous: Manifest,\n writes: ReadonlyArray<RenderedFile>,\n removals: ReadonlyArray<string>,\n): void {\n const desired = new Map(writes.map((file) => [file.path, file.content]));\n const conflicts: string[] = [];\n for (const path of [...desired.keys(), ...removals]) {\n if (SHARED_CONFIG_PATHS.includes(path)) continue;\n const content = currentContent(root, path);\n if (content === undefined || content === desired.get(path)) continue;\n if (!previous.files.includes(path)) {\n conflicts.push(`existing file outside harness manifest: ${path}`);\n continue;\n }\n const hash = previous.fileHashes?.[path];\n if (hash && hash !== hashContent(content)) conflicts.push(`modified harness file: ${path}`);\n }\n if (conflicts.length) {\n throw new Error(\n `${conflicts.join(\"\\n\")}\\nmove their content to docs/ or .harness-overrides/, or keep them as yours with --preserve <path>`,\n );\n }\n}\n\n/** Before 1.4.0, `init` recorded `.mcp.json` as a whole harness file. */\nfunction legacyMcpOwnership(root: string, previous: Manifest): OpenCodeConfigOwnership | undefined {\n if (!ownedUnchanged(root, previous, CLAUDE_MCP_PATH)) return undefined;\n try {\n const servers = JSON.parse(currentContent(root, CLAUDE_MCP_PATH) ?? \"\").mcpServers;\n if (!servers || typeof servers !== \"object\" || Array.isArray(servers)) return undefined;\n return { createdFile: true, addedMcp: true, addedSchema: false, entries: servers };\n } catch {\n return undefined;\n }\n}\n\nfunction planMcp(\n root: string,\n settings: InstallationSettings,\n rendered: ReadonlyArray<RenderedFile>,\n pendingWrites: ReadonlyArray<RenderedFile>,\n): McpPlan {\n const { previous } = settings;\n const plan: McpPlan = {\n writes: [],\n removals: [],\n owned: [],\n plannedOpenCode: false,\n warnings: [],\n };\n const claudeOwnership = previous.mcpConfig ?? legacyMcpOwnership(root, previous);\n const codexOwned = ownedUnchanged(root, previous, CODEX_CONFIG_PATH);\n if (settings.mcpServers === undefined) {\n // update keeps the MCP servers recorded by the last init.\n if (codexOwned) plan.owned.push(CODEX_CONFIG_PATH);\n plan.mcpConfig = claudeOwnership;\n return plan;\n }\n const desired = (path: string) => rendered.find((file) => file.path === path);\n // A legacy `.opencode/mcp.json` migrated in this run already wrote the file.\n if (!pendingWrites.some((file) => file.path === OPENCODE_CONFIG_PATH)) {\n plan.plannedOpenCode = true;\n if (previous.files.includes(OPENCODE_CONFIG_PATH) && !previous.opencodeConfig) {\n plan.warnings.push(`preserved legacy shared configuration: ${OPENCODE_CONFIG_PATH}`);\n }\n const opencode = planOpenCodeConfig(\n root,\n desired(OPENCODE_CONFIG_PATH),\n previous.opencodeConfig,\n );\n if (opencode.write) plan.writes.push(opencode.write);\n if (opencode.remove) plan.removals.push(OPENCODE_CONFIG_PATH);\n plan.opencodeConfig = opencode.ownership;\n plan.warnings.push(...opencode.warnings);\n }\n const claude = planClaudeMcpConfig(root, desired(CLAUDE_MCP_PATH), claudeOwnership);\n if (claude.write) plan.writes.push(claude.write);\n if (claude.remove) plan.removals.push(CLAUDE_MCP_PATH);\n plan.mcpConfig = claude.ownership;\n plan.warnings.push(...claude.warnings);\n const codex = desired(CODEX_CONFIG_PATH);\n const codexExists = existsSync(join(root, CODEX_CONFIG_PATH));\n if (codex && (!codexExists || codexOwned)) {\n plan.writes.push(codex);\n plan.owned.push(CODEX_CONFIG_PATH);\n } else if (codex) {\n plan.warnings.push(\n `left ${CODEX_CONFIG_PATH} unchanged; add this block to it to enable MCP in Codex:\\n${codex.content.trimEnd()}`,\n );\n } else if (codexOwned) {\n plan.removals.push(CODEX_CONFIG_PATH);\n }\n return plan;\n}\n\n/** All reads and validation precede backup creation and project mutations. */\nexport function planInstallation(\n args: Omit<UpdateArgs, \"dryRun\" | \"backupDir\">,\n settings: InstallationSettings,\n): Omit<UpdatePlan, \"result\"> & { manifest: Manifest; warnings: string[] } {\n const root = resolve(args.targetDir);\n const { previous, engines, hookEngines } = settings;\n const preserved = [\n ...new Set([...(previous.preservedFiles ?? []), ...(args.preserveFiles ?? [])]),\n ].sort();\n if (preserved.includes(MANIFEST_FILENAME))\n throw new Error(\"cannot preserve the harness manifest\");\n if (preserved.some((path) => SHARED_CONFIG_PATHS.includes(path))) {\n throw new Error(\n \"--preserve applies to generated artifacts; shared configurations use entry-level preservation\",\n );\n }\n assertManagedPaths(root, [...previous.files, ...preserved, ...SHARED_CONFIG_PATHS]);\n const requestedOverrides = args.overridesDir ?? previous.overridesDir;\n const overridesDir = args.overridesDir\n ? resolve(args.overridesDir)\n : previous.overridesDir\n ? resolve(root, previous.overridesDir)\n : root;\n if (requestedOverrides && !existsSync(join(overridesDir, \".harness-overrides\"))) {\n throw new Error(`recorded overrides are missing: ${overridesDir}/.harness-overrides`);\n }\n const hasOverrides = existsSync(join(overridesDir, \".harness-overrides\"));\n const disablePath = join(overridesDir, \".harness-overrides\", \"disable.yaml\");\n if (existsSync(disablePath)) {\n try {\n DisableYamlSchema.parse(parseYAML(readFileSync(disablePath, \"utf8\")));\n } catch {\n throw new Error(`invalid override selection: ${disablePath}`);\n }\n }\n const rendered = planInit({\n targetDir: root,\n packageDir: args.packageDir,\n engines,\n overridesDir: hasOverrides ? overridesDir : undefined,\n mcpServers: settings.mcpServers,\n withStopHook: false,\n });\n const generated = rendered.output.files.filter(\n (file) => !SHARED_CONFIG_PATHS.includes(file.path),\n );\n const config = planUpdateConfigs(root, previous, hookEngines);\n const mcp = planMcp(root, settings, rendered.output.files, config.writes);\n const output = [...generated, ...config.writes, ...mcp.writes].filter(\n (file) => !preserved.includes(file.path),\n );\n const owned = [\n ...new Set([...generated.map((file) => file.path), ...config.ownedFiles, ...mcp.owned]),\n ]\n .filter((file) => !preserved.includes(file))\n .sort();\n const removals = [\n ...new Set([\n ...previous.files.filter(\n (file) => !owned.includes(file) && !SHARED_CONFIG_PATHS.includes(file),\n ),\n ...config.removals,\n ...mcp.removals,\n ]),\n ].filter((file) => !preserved.includes(file));\n assertManagedPaths(root, [...output.map((file) => file.path), ...removals]);\n checkArtifactConflicts(root, previous, output, removals);\n const hashes = Object.fromEntries(\n owned.map((path) => {\n const content =\n output.find((file) => file.path === path)?.content ?? currentContent(root, path);\n if (content === undefined) throw new Error(`missing planned harness file: ${path}`);\n return [path, hashContent(content)];\n }),\n );\n const opencodeConfig = mcp.plannedOpenCode ? mcp.opencodeConfig : config.opencodeConfig;\n const manifest: Manifest = {\n version: MANIFEST_VERSION,\n harnessVersion: VERSION,\n engines: [...engines].sort(),\n renderedAt: previous.renderedAt,\n files: owned,\n fileHashes: hashes,\n stopHookInstalled: hookEngines.length > 0,\n stopHookEngines: [...hookEngines].sort(),\n ...(hasOverrides ? { overridesDir: overridesDir === root ? \".\" : overridesDir } : {}),\n ...(preserved.length ? { preservedFiles: preserved } : {}),\n ...(opencodeConfig ? { opencodeConfig } : {}),\n ...(mcp.mcpConfig ? { mcpConfig: mcp.mcpConfig } : {}),\n ...(config.hookConfigs ? { hookConfigs: config.hookConfigs } : {}),\n };\n const writes = output.filter((file) => currentContent(root, file.path) !== file.content);\n const existingRemovals = removals.filter((path) => existsSync(join(root, path)));\n if (writes.length || existingRemovals.length || !isDeepStrictEqual(previous, manifest)) {\n manifest.renderedAt = new Date().toISOString();\n writes.push({ path: MANIFEST_FILENAME, content: `${JSON.stringify(manifest, null, 2)}\\n` });\n }\n const warnings = [...rendered.output.warnings, ...config.warnings, ...mcp.warnings];\n if (preserved.length) warnings.push(`preserved user-owned artifacts: ${preserved.join(\", \")}`);\n return { writes, removals: existingRemovals, owned, manifest, warnings };\n}\n\n/** All reads and validation precede backup creation and project mutations. */\nexport function planUpdate(args: UpdateArgs): UpdatePlan {\n const root = resolve(args.targetDir);\n const { manifest: previous, sourceVersion, engines, hookEngines } = readUpdateInstallation(root);\n const plan = planInstallation(args, { previous, sourceVersion, engines, hookEngines });\n const warnings = [...plan.warnings];\n if (!previous.fileHashes) {\n warnings.push(\n \"legacy manifest has no file fingerprints: managed artifacts will be regenerated; backup preserves their previous contents\",\n );\n }\n if (engines.includes(\"codex-cli\"))\n warnings.push(\"ensure .agents/ is ignored by Git (run harness check)\");\n return {\n writes: plan.writes,\n removals: plan.removals,\n owned: plan.owned,\n result: {\n version: VERSION,\n fromManifestVersion: sourceVersion,\n dryRun: args.dryRun === true,\n upToDate: plan.writes.length === 0 && plan.removals.length === 0,\n filesToWrite: plan.writes.map((file) => file.path),\n filesToRemove: plan.removals,\n warnings,\n },\n };\n}\n\nexport function updateCommand(args: UpdateArgs): UpdateResult {\n const plan = planUpdate(args);\n if (args.dryRun || plan.result.upToDate) return plan.result;\n const { backupDir } = applyUpdateTransaction(\n resolve(args.targetDir),\n plan.writes,\n plan.removals,\n args.backupDir,\n );\n return { ...plan.result, backupDir };\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { z } from \"zod\";\nimport { ENGINES, type Engine } from \"../types.js\";\nimport { assertManagedPaths } from \"./managed-paths.js\";\nimport { MANIFEST_FILENAME, type Manifest, readManifest } from \"./manifest.js\";\n\nconst EngineSchema = z.enum(ENGINES);\nconst LegacySchema = z.object({\n version: z.enum([\"1\", \"2\", \"3\"]),\n engine: EngineSchema.optional(),\n engines: z.array(EngineSchema).nonempty().optional(),\n renderedAt: z.string(),\n files: z.array(z.string()),\n});\n\nexport interface UpdateInstallation {\n manifest: Manifest;\n sourceVersion: string;\n engines: Engine[];\n hookEngines: Engine[];\n}\n\nconst HOOK_PATHS: Record<Engine, string[]> = {\n \"claude-code\": [\".claude/settings.json\"],\n \"codex-cli\": [\".codex/hooks.json\"],\n opencode: [\n \".opencode/plugins/harness-stop-hook/index.ts\",\n \".opencode/plugins/harness-stop-hook.ts\",\n ],\n};\n\n/** Historical schemas are accepted only by the explicit migration command. */\nexport function readUpdateInstallation(root: string): UpdateInstallation {\n assertManagedPaths(root, [MANIFEST_FILENAME]);\n if (!existsSync(join(root, MANIFEST_FILENAME))) {\n throw new Error(\"no harness manifest found; use init for a new installation\");\n }\n const raw = JSON.parse(readFileSync(join(root, MANIFEST_FILENAME), \"utf8\"));\n const sourceVersion = String(raw?.version);\n let manifest: Manifest;\n if ([\"1\", \"2\", \"3\"].includes(sourceVersion)) {\n const legacy = LegacySchema.parse(raw);\n const engines = legacy.version === \"1\" ? [EngineSchema.parse(legacy.engine)] : legacy.engines;\n manifest = {\n version: \"4\",\n engines: z.array(EngineSchema).nonempty().parse(engines),\n files: legacy.files,\n renderedAt: legacy.renderedAt,\n };\n } else {\n const current = readManifest(root);\n if (!current) throw new Error(\"harness manifest disappeared during planning\");\n manifest = current;\n }\n const engines = [...new Set(z.array(EngineSchema).nonempty().parse(manifest.engines))];\n const hookEngines =\n manifest.stopHookInstalled === false\n ? []\n : manifest.stopHookEngines !== undefined\n ? z.array(EngineSchema).parse(manifest.stopHookEngines)\n : manifest.stopHookInstalled === true\n ? engines\n : engines.filter((engine) =>\n HOOK_PATHS[engine].some((path) => manifest.files.includes(path)),\n );\n if (hookEngines.some((engine) => !engines.includes(engine))) {\n throw new Error(\"manifest stopHookEngines must be a subset of installed engines\");\n }\n return { manifest, sourceVersion, engines, hookEngines: [...new Set(hookEngines)] };\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { loadHarness } from \"../loader.js\";\nimport { resolveMcpIds } from \"../mcp.js\";\nimport { render as renderHarness } from \"../render.js\";\nimport { ENGINES, type Engine } from \"../types.js\";\n\nexport interface RenderArgs {\n engines?: ReadonlyArray<string>;\n outDir: string;\n packageDir: string;\n mcpServers?: ReadonlyArray<string>;\n withStopHook?: boolean;\n}\n\nexport interface RenderCommandResult {\n filesWritten: string[];\n warnings: string[];\n}\n\nexport function renderCommand(args: RenderArgs): RenderCommandResult {\n const engineList: Engine[] =\n args.engines && args.engines.length > 0\n ? args.engines.map((e) => {\n if (!ENGINES.includes(e as Engine)) {\n throw new Error(`unknown engine: ${e}`);\n }\n return e as Engine;\n })\n : [...ENGINES];\n const harness = loadHarness(args.packageDir);\n const mcpServers = args.mcpServers ? resolveMcpIds(args.mcpServers) : undefined;\n const output = renderHarness({\n harness,\n engines: engineList,\n mcpServers,\n withStopHook: args.withStopHook !== false,\n });\n const filesWritten: string[] = [];\n for (const f of output.files) {\n const full = join(args.outDir, f.path);\n mkdirSync(dirname(full), { recursive: true });\n writeFileSync(full, f.content);\n filesWritten.push(f.path);\n }\n return { filesWritten, warnings: output.warnings };\n}\n","import { readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { getAdapter } from \"../stop-hook/adapters/index.js\";\nimport { decide, defaultGitStatus, defaultRunLint } from \"../stop-hook/core.js\";\nimport { STOP_HOOK_ENGINES, type StopHookEngine } from \"../stop-hook/types.js\";\n\nexport interface StopHookArgs {\n engine: string;\n cwd?: string;\n}\n\nexport interface StopHookResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\nfunction readStdinSync(): string {\n try {\n return readFileSync(0, \"utf8\");\n } catch {\n return \"\";\n }\n}\n\nfunction assertEngine(engine: string): StopHookEngine {\n if (!(STOP_HOOK_ENGINES as ReadonlyArray<string>).includes(engine)) {\n throw new Error(`unknown engine: ${engine} (expected one of ${STOP_HOOK_ENGINES.join(\", \")})`);\n }\n return engine as StopHookEngine;\n}\n\nexport function stopHookCommand(args: StopHookArgs, stdin: string): StopHookResult {\n const engine = assertEngine(args.engine);\n const cwd = resolve(args.cwd ?? \".\");\n const adapter = getAdapter(engine);\n const payload = adapter.parseInput(stdin, process.env);\n const decision = decide(payload, {\n cwd,\n env: process.env,\n gitStatus: defaultGitStatus,\n runLint: defaultRunLint,\n });\n return adapter.respond(decision);\n}\n\nexport function stopHookCommandFromStdin(args: StopHookArgs): StopHookResult {\n return stopHookCommand(args, readStdinSync());\n}\n","import type { StopHookAdapter } from \"../types.js\";\n\n/**\n * Claude Code Stop hook protocol:\n *\n * in ← JSON on stdin with `session_id` and `stop_hook_active`\n * out → JSON on stdout with `{decision: \"block\", reason}` to force\n * continuation, or `{}` to let the session truly stop.\n *\n * See https://docs.claude.com/en/docs/claude-code/hooks\n */\nexport const claudeAdapter: StopHookAdapter = {\n parseInput(stdin) {\n const parsed = stdin.trim() === \"\" ? {} : (JSON.parse(stdin) as Record<string, unknown>);\n return {\n sessionId: typeof parsed.session_id === \"string\" ? parsed.session_id : \"default\",\n stopHookActive: parsed.stop_hook_active === true,\n };\n },\n respond(decision) {\n if (decision.kind === \"inject\") {\n return {\n stdout: `${JSON.stringify({ decision: \"block\", reason: decision.reason ?? \"\" })}\\n`,\n stderr: \"\",\n exitCode: 0,\n };\n }\n if (decision.kind === \"terminate\") {\n return {\n stdout: \"\",\n stderr: `${decision.reason ?? \"\"}\\n`,\n exitCode: 0,\n };\n }\n return { stdout: \"\", stderr: \"\", exitCode: 0 };\n },\n};\n","import type { StopHookAdapter } from \"../types.js\";\n\n/**\n * Codex CLI Stop hook protocol mirrors Claude Code's: same input\n * shape (`session_id`, `stop_hook_active`) and same output contract\n * (`{decision: \"block\", reason}` to continue, `{}` to stop).\n *\n * See https://developers.openai.com/codex/hooks\n */\nexport const codexAdapter: StopHookAdapter = {\n parseInput(stdin) {\n const parsed = stdin.trim() === \"\" ? {} : (JSON.parse(stdin) as Record<string, unknown>);\n return {\n sessionId: typeof parsed.session_id === \"string\" ? parsed.session_id : \"default\",\n stopHookActive: parsed.stop_hook_active === true,\n };\n },\n respond(decision) {\n if (decision.kind === \"inject\") {\n return {\n stdout: `${JSON.stringify({ decision: \"block\", reason: decision.reason ?? \"\" })}\\n`,\n stderr: \"\",\n exitCode: 0,\n };\n }\n if (decision.kind === \"terminate\") {\n return {\n stdout: \"\",\n stderr: `${decision.reason ?? \"\"}\\n`,\n exitCode: 0,\n };\n }\n return { stdout: \"\", stderr: \"\", exitCode: 0 };\n },\n};\n","import type { StopHookAdapter } from \"../types.js\";\n\n/**\n * opencode plugin Stop hook protocol (proxied by the rendered TS plugin):\n *\n * in ← JSON on stdin with `sessionID` (mapped from opencode's session\n * context object the plugin received).\n * out → exit code 2 + a prompt string on stderr to inject a continuation;\n * exit 0 + empty output to let the session stop.\n *\n * opencode does NOT expose a `stop_hook_active`-equivalent flag, so the\n * core anti-loop layers (dirty-gate + counter + no-progress) carry the\n * full defense weight here.\n *\n * See https://opencode.ai/docs/plugins/\n */\nexport const opencodeAdapter: StopHookAdapter = {\n parseInput(stdin) {\n const parsed = stdin.trim() === \"\" ? {} : (JSON.parse(stdin) as Record<string, unknown>);\n const sessionId =\n typeof parsed.sessionID === \"string\"\n ? parsed.sessionID\n : typeof parsed.session_id === \"string\"\n ? parsed.session_id\n : \"default\";\n return { sessionId, stopHookActive: false };\n },\n respond(decision) {\n if (decision.kind === \"inject\") {\n return { stdout: \"\", stderr: `${decision.reason ?? \"\"}\\n`, exitCode: 2 };\n }\n if (decision.kind === \"terminate\") {\n return { stdout: \"\", stderr: `${decision.reason ?? \"\"}\\n`, exitCode: 0 };\n }\n return { stdout: \"\", stderr: \"\", exitCode: 0 };\n },\n};\n","import type { StopHookAdapter, StopHookEngine } from \"../types.js\";\nimport { claudeAdapter } from \"./claude.js\";\nimport { codexAdapter } from \"./codex.js\";\nimport { opencodeAdapter } from \"./opencode.js\";\n\nexport const ADAPTERS: Record<StopHookEngine, StopHookAdapter> = {\n claude: claudeAdapter,\n codex: codexAdapter,\n opencode: opencodeAdapter,\n};\n\nexport function getAdapter(engine: StopHookEngine): StopHookAdapter {\n return ADAPTERS[engine];\n}\n","import { execFileSync } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { formatReportText, runLinters } from \"../linters/index.js\";\nimport { readState, resetState, writeState } from \"./state.js\";\nimport {\n type CoreEnv,\n DEFAULT_MAX_ATTEMPTS,\n type Decision,\n type LintRunResult,\n type NormalizedPayload,\n} from \"./types.js\";\n\nfunction exhaustedReason(attempts: number, lintOutput: string): string {\n return `Harness lint: still failing after ${attempts} attempts.\\n\\n${lintOutput}`;\n}\n\nfunction noProgressReason(lintOutput: string): string {\n return `Harness lint: no progress between attempts.\\n\\n${lintOutput}`;\n}\n\nfunction hash(s: string): string {\n return createHash(\"sha256\").update(s).digest(\"hex\").slice(0, 16);\n}\n\nfunction maxAttempts(env: NodeJS.ProcessEnv): number {\n const raw = env.HARNESS_LINT_MAX_ATTEMPTS;\n if (!raw) return DEFAULT_MAX_ATTEMPTS;\n const n = Number.parseInt(raw, 10);\n return Number.isFinite(n) && n > 0 ? n : DEFAULT_MAX_ATTEMPTS;\n}\n\nexport function defaultGitStatus(cwd: string): string {\n try {\n return execFileSync(\"git\", [\"status\", \"--porcelain\"], {\n cwd,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n } catch {\n return \"\";\n }\n}\n\nexport function defaultRunLint(cwd: string): LintRunResult {\n const report = runLinters(cwd);\n return { pass: report.summary.pass, output: formatReportText(report) };\n}\n\n/**\n * Pure decision function for the Stop-hook lint loop. Inputs are the\n * normalized payload from the engine adapter and a {@link CoreEnv}\n * abstracting filesystem-touching operations (git status, lint runner,\n * env vars, cwd) so tests can drive each branch without hitting disk\n * or invoking the actual linters.\n *\n * Branches (in order):\n * 1. kill switch HARNESS_LINT_DISABLE=1 → passthrough\n * 2. engine flag stopHookActive === true → passthrough\n * 3. git clean (no dirty files) → reset + passthrough\n * 4. lint pass → reset + passthrough\n * 5. lint fail, same output as previous attempt → reset + terminate (no progress)\n * 6. lint fail, attempts+1 > MAX_ATTEMPTS → reset + terminate (exhausted)\n * 7. lint fail, otherwise → persist + inject lint output\n */\nexport function decide(payload: NormalizedPayload, coreEnv: CoreEnv): Decision {\n if (coreEnv.env.HARNESS_LINT_DISABLE === \"1\") {\n return { kind: \"passthrough\" };\n }\n if (payload.stopHookActive) {\n return { kind: \"passthrough\" };\n }\n\n const dirty = coreEnv.gitStatus(coreEnv.cwd);\n if (dirty.trim() === \"\") {\n resetState(coreEnv.cwd, payload.sessionId);\n return { kind: \"passthrough\" };\n }\n\n const lintResult = coreEnv.runLint(coreEnv.cwd);\n if (lintResult.pass) {\n resetState(coreEnv.cwd, payload.sessionId);\n return { kind: \"passthrough\" };\n }\n\n const lintHash = hash(lintResult.output);\n const prev = readState(coreEnv.cwd, payload.sessionId);\n\n if (prev && prev.attempts > 0 && prev.lastLintHash === lintHash) {\n resetState(coreEnv.cwd, payload.sessionId);\n return { kind: \"terminate\", reason: noProgressReason(lintResult.output) };\n }\n\n const nextAttempts = (prev?.attempts ?? 0) + 1;\n const limit = maxAttempts(coreEnv.env);\n if (nextAttempts > limit) {\n resetState(coreEnv.cwd, payload.sessionId);\n return { kind: \"terminate\", reason: exhaustedReason(limit, lintResult.output) };\n }\n\n writeState(coreEnv.cwd, payload.sessionId, {\n attempts: nextAttempts,\n lastLintHash: lintHash,\n updatedAt: new Date().toISOString(),\n });\n return { kind: \"inject\", reason: lintResult.output };\n}\n","import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { z } from \"zod\";\nimport type { LintState } from \"./types.js\";\n\nconst LintStateSchema = z.object({\n attempts: z.number().int().nonnegative(),\n lastLintHash: z.string(),\n updatedAt: z.string(),\n});\n\nexport const STATE_DIR = \".harness/state\";\n\nfunction safeSessionId(sessionId: string): string {\n return sessionId.replace(/[^A-Za-z0-9_-]/g, \"_\").slice(0, 80) || \"default\";\n}\n\nexport function statePath(cwd: string, sessionId: string): string {\n return join(cwd, STATE_DIR, `lint-${safeSessionId(sessionId)}.json`);\n}\n\nexport function readState(cwd: string, sessionId: string): LintState | null {\n const path = statePath(cwd, sessionId);\n if (!existsSync(path)) return null;\n try {\n const raw = JSON.parse(readFileSync(path, \"utf8\"));\n return LintStateSchema.parse(raw);\n } catch {\n return null;\n }\n}\n\nexport function writeState(cwd: string, sessionId: string, state: LintState): void {\n const path = statePath(cwd, sessionId);\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, `${JSON.stringify(state, null, 2)}\\n`);\n}\n\nexport function resetState(cwd: string, sessionId: string): void {\n const path = statePath(cwd, sessionId);\n if (existsSync(path)) rmSync(path, { force: true });\n}\n","export const STOP_HOOK_ENGINES = [\"claude\", \"codex\", \"opencode\"] as const;\nexport type StopHookEngine = (typeof STOP_HOOK_ENGINES)[number];\n\nexport interface NormalizedPayload {\n sessionId: string;\n stopHookActive: boolean;\n}\n\nexport interface EngineResponse {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\nexport type DecisionKind = \"passthrough\" | \"inject\" | \"terminate\";\n\nexport interface Decision {\n kind: DecisionKind;\n /**\n * For `inject`: the lint report that the engine will hand back to the\n * agent as the next user-prompt.\n * For `terminate`: a short explanation surfaced via stderr.\n * For `passthrough`: unused.\n */\n reason?: string;\n}\n\nexport interface StopHookAdapter {\n parseInput(stdin: string, env: NodeJS.ProcessEnv): NormalizedPayload;\n respond(decision: Decision): EngineResponse;\n}\n\nexport interface LintState {\n attempts: number;\n lastLintHash: string;\n updatedAt: string;\n}\n\nexport interface LintRunResult {\n pass: boolean;\n output: string;\n}\n\nexport interface CoreEnv {\n cwd: string;\n env: NodeJS.ProcessEnv;\n gitStatus: (cwd: string) => string;\n runLint: (cwd: string) => LintRunResult;\n}\n\nexport const DEFAULT_MAX_ATTEMPTS = 3;\n"],"mappings":"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","names":["dirname","resolve","fileURLToPath","hash","existsSync","join","fg","join","fg","existsSync","existsSync","join","fg","fg","existsSync","join","fg","fg","REQUIRED_SECTIONS","REQUIRED_SECTIONS","fg","TRACKED_DIRS","fg","existsSync","readFileSync","join","REQUIRED_DIRS","existsSync","join","readFileSync","existsSync","mkdirSync","writeFileSync","dirname","join","resolve","statSync","basename","dirname","isAbsolute","join","resolve","canonicalRoot","existsSync","readFileSync","join","z","existsSync","readFileSync","join","existsSync","readFileSync","join","isDeepStrictEqual","z","ENGINE","BASE","ENGINE","BASE","ObjectSchema","z","isDeepStrictEqual","value","hooks","existsSync","join","readFileSync","z","join","existsSync","readFileSync","existsSync","dirname","join","resolve","existsSync","readFileSync","join","fg","z","readFileSync","matter","z","z","matter","z","join","fg","readFileSync","existsSync","dirname","existsSync","join","resolve","existsSync","readFileSync","writeFileSync","dirname","join","relative","resolve","resolve","hash","join","existsSync","readFileSync","writeFileSync","dirname","relative","createHash","chmodSync","lstatSync","readFileSync","readdirSync","realpathSync","rmdirSync","unlinkSync","writeFileSync","basename","dirname","isAbsolute","join","relative","resolve","resolve","lstatSync","basename","dirname","join","realpathSync","relative","isAbsolute","writeFileSync","readFileSync","createHash","unlinkSync","chmodSync","readdirSync","rmdirSync","existsSync","readFileSync","join","resolve","isDeepStrictEqual","existsSync","readFileSync","join","z","z","existsSync","join","readFileSync","engines","existsSync","join","readFileSync","hash","resolve","isDeepStrictEqual","resolve","existsSync","join","dirname","mkdirSync","writeFileSync","dirname","join","join","mkdirSync","dirname","writeFileSync","readFileSync","resolve","execFileSync","createHash","existsSync","mkdirSync","readFileSync","rmSync","writeFileSync","dirname","join","z","createHash","execFileSync","readFileSync","resolve","dirname","fileURLToPath","resolve"]}
|