edsger 0.84.0 → 0.85.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/audit.ts","../src/core/assets.ts","../src/core/logger.ts","../src/util/yaml.ts","../src/core/config.ts","../src/core/agent.ts","../src/core/dashboard.ts","../src/core/git.ts","../src/core/open.ts","../src/core/viewer-server.ts","../src/core/audit-report.ts","../src/core/schema.ts","../src/commands/benchmark.ts","../src/core/report.ts","../src/commands/pr-review.ts","../src/core/gh.ts","../src/commands/pr-resolve.ts","../src/commands/serve.ts","../src/commands/report.ts","../src/commands/diagram.ts","../src/core/diagrams.ts","../src/commands/mindmap.ts","../src/core/mindmap.ts","../src/commands/skills.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { Command, Option } from \"commander\";\nimport pc from \"picocolors\";\nimport { runAudit, runAuditReport, runAuditServe } from \"./commands/audit.js\";\nimport { runBenchmark } from \"./commands/benchmark.js\";\nimport { runPrReview } from \"./commands/pr-review.js\";\nimport { runPrResolve } from \"./commands/pr-resolve.js\";\nimport { runServe } from \"./commands/serve.js\";\nimport { runReport } from \"./commands/report.js\";\nimport { runDiagramGenerate, runDiagramReport, runDiagramServe } from \"./commands/diagram.js\";\nimport { runMindmapGenerate, runMindmapReport, runMindmapServe } from \"./commands/mindmap.js\";\nimport { runSkillsInstall, runSkillsList, runSkillsUninstall } from \"./commands/skills.js\";\nimport { log, setVerbose } from \"./core/logger.js\";\nimport type { GlobalOptions } from \"./types.js\";\n\n// Single source of truth: read the version from package.json at runtime.\n// dist/index.js sits one level below the package root, alongside which package.json ships.\nconst pkg = JSON.parse(readFileSync(new URL(\"../package.json\", import.meta.url), \"utf8\")) as {\n version: string;\n};\nconst VERSION = pkg.version;\nconst DEFAULT_MODEL = \"claude-sonnet-4-6\";\n\ninterface RawGlobal {\n cwd?: string;\n model?: string;\n standard?: string;\n assets?: string;\n lang?: string;\n json?: boolean;\n verbose?: boolean;\n dryRun?: boolean;\n maxTurns?: string;\n timeout?: string;\n}\n\nfunction toGlobal(raw: RawGlobal): GlobalOptions {\n setVerbose(Boolean(raw.verbose));\n return {\n cwd: resolve(raw.cwd ?? process.cwd()),\n model: raw.model ?? process.env.EDSGER_MODEL ?? DEFAULT_MODEL,\n standardPath: raw.standard,\n assetsPath: raw.assets,\n lang: raw.lang,\n json: Boolean(raw.json),\n verbose: Boolean(raw.verbose),\n dryRun: Boolean(raw.dryRun),\n // Unlimited by default — only cap turns / wall-clock when explicitly asked.\n maxTurns: raw.maxTurns ? Number.parseInt(raw.maxTurns, 10) : undefined,\n timeoutMs: raw.timeout ? Number.parseFloat(raw.timeout) * 60_000 : undefined\n };\n}\n\nfunction addGlobalOptions(cmd: Command): Command {\n return cmd\n .option(\"-C, --cwd <dir>\", \"directory of the repository to operate on\")\n .addOption(new Option(\"-m, --model <model>\", \"model id for the agent\").default(undefined))\n .option(\"--standard <path>\", \"path to a custom standards dir or file (overrides bundled)\")\n .option(\"--assets <path>\", \"override the entire assets root\")\n .option(\"--lang <id>\", \"force a language id, skipping detection\")\n .option(\"--max-turns <n>\", \"cap on agentic turns (default: unlimited)\")\n .option(\"--timeout <minutes>\", \"hard wall-clock limit per agent run (default: no limit)\")\n .option(\"--json\", \"print machine-readable JSON to stdout\")\n .option(\"-v, --verbose\", \"verbose logging\")\n .option(\"--dry-run\", \"run the agent but make no persistent/external changes\");\n}\n\nasync function guard(fn: () => Promise<number>): Promise<void> {\n try {\n const code = await fn();\n process.exitCode = code;\n } catch (err) {\n log.error(err instanceof Error ? err.message : String(err));\n if (process.env.EDSGER_DEBUG && err instanceof Error)\n process.stderr.write((err.stack ?? \"\") + \"\\n\");\n process.exitCode = 1;\n }\n}\n\nconst program = new Command();\nprogram\n .name(\"edsger\")\n .description(\n \"Agentic CLI to benchmark and audit repositories and review/resolve pull requests\\n\" +\n \"against industrial-grade standards (from edsger-assets, fully overridable).\"\n )\n .version(VERSION, \"-V, --version\");\n\naddGlobalOptions(\n program\n .command(\"benchmark\")\n .description(\"Score a repository against a benchmark rubric and write a report\")\n .option(\"--out <dir>\", \"report output directory (relative to repo)\", \".edsger/benchmark\")\n .option(\"--no-write\", \"do not write report files into the repo\")\n .option(\"--serve\", \"open the dashboard after benchmarking\")\n).action(async (opts: RawGlobal & { out: string; write: boolean; serve?: boolean }) => {\n await guard(async () => {\n const g = toGlobal(opts);\n const code = await runBenchmark({ ...g, out: opts.out, noWrite: opts.write === false });\n if (code === 0 && opts.serve) {\n return runServe({ cwd: g.cwd, dir: opts.out, port: 4577, host: \"127.0.0.1\", open: true });\n }\n return code;\n });\n});\n\n// \"info\" is deliberately absent: failing on it would mean \"fail on any finding\".\nconst FAIL_ON_SEVERITIES = [\"critical\", \"high\", \"medium\", \"low\"] as const;\n\n// `edsger audit ...` — hunt for unprofessional/outdated implementations repo-wide.\nconst audit = program\n .command(\"audit\")\n .alias(\"review\")\n .description(\n \"Audit the whole repository: hunt for unprofessional, outdated, or fragile \" +\n \"implementations across every dimension and write an organised issue report\"\n );\n\naddGlobalOptions(\n audit\n .command(\"generate\", { isDefault: true })\n .description(\"Audit the repository and write the findings report\")\n .option(\"--out <dir>\", \"report output directory (relative to repo)\", \".edsger/audit\")\n .option(\"--no-write\", \"do not write report files into the repo\")\n .option(\"--only <ids>\", \"comma-separated dimension ids to audit (default: all)\")\n .option(\"--focus <text>\", \"area or concern the audit should concentrate on\")\n .addOption(\n new Option(\n \"--fail-on <severity>\",\n \"exit with code 2 if findings exist at or above this severity (CI gate)\"\n ).choices(FAIL_ON_SEVERITIES)\n )\n .option(\"--serve\", \"open the findings dashboard after auditing\")\n).action(\n async (\n opts: RawGlobal & {\n out: string;\n write: boolean;\n only?: string;\n focus?: string;\n failOn?: (typeof FAIL_ON_SEVERITIES)[number];\n serve?: boolean;\n }\n ) => {\n await guard(async () => {\n const g = toGlobal(opts);\n const code = await runAudit({\n ...g,\n out: opts.out,\n noWrite: opts.write === false,\n only: opts.only\n ? opts.only\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean)\n : undefined,\n focus: opts.focus,\n failOn: opts.failOn\n });\n // Findings above --fail-on (code 2) still produced a report worth browsing.\n if (code !== 1 && opts.serve) {\n const serveCode = await runAuditServe({\n cwd: g.cwd,\n dir: opts.out,\n port: 4580,\n host: \"127.0.0.1\",\n open: true\n });\n return code || serveCode;\n }\n return code;\n });\n }\n);\n\naudit\n .command(\"serve\")\n .description(\"Serve the audit findings dashboard locally\")\n .option(\"-C, --cwd <dir>\", \"repository directory\")\n .option(\"--dir <dir>\", \"audit output directory (relative to repo)\", \".edsger/audit\")\n .option(\"--port <n>\", \"port to listen on\", \"4580\")\n .option(\"--host <host>\", \"host to bind\", \"127.0.0.1\")\n .option(\"--no-open\", \"do not open the browser automatically\")\n .action(\n async (opts: { cwd?: string; dir: string; port: string; host: string; open: boolean }) => {\n await guard(() =>\n runAuditServe({\n cwd: resolve(opts.cwd ?? process.cwd()),\n dir: opts.dir,\n port: Number.parseInt(opts.port, 10) || 4580,\n host: opts.host,\n open: opts.open !== false\n })\n );\n }\n );\n\naudit\n .command(\"report\")\n .description(\"Export a self-contained HTML findings viewer (data inlined) for sharing\")\n .option(\"-C, --cwd <dir>\", \"repository directory\")\n .option(\"--dir <dir>\", \"audit output directory (relative to repo)\", \".edsger/audit\")\n .option(\"--html <path>\", \"output HTML file path\", \"edsger-audit.html\")\n .option(\"--open\", \"open the exported file after writing\")\n .action(async (opts: { cwd?: string; dir: string; html: string; open?: boolean }) => {\n await guard(() =>\n runAuditReport({\n cwd: resolve(opts.cwd ?? process.cwd()),\n dir: opts.dir,\n html: opts.html,\n open: Boolean(opts.open)\n })\n );\n });\n\nprogram\n .command(\"serve\")\n .description(\"Serve the benchmark dashboard (current, history, trends) locally\")\n .option(\"-C, --cwd <dir>\", \"repository directory\")\n .option(\"--dir <dir>\", \"benchmark output directory (relative to repo)\", \".edsger/benchmark\")\n .option(\"--port <n>\", \"port to listen on\", \"4577\")\n .option(\"--host <host>\", \"host to bind\", \"127.0.0.1\")\n .option(\"--no-open\", \"do not open the browser automatically\")\n .action(\n async (opts: { cwd?: string; dir: string; port: string; host: string; open: boolean }) => {\n await guard(() =>\n runServe({\n cwd: resolve(opts.cwd ?? process.cwd()),\n dir: opts.dir,\n port: Number.parseInt(opts.port, 10) || 4577,\n host: opts.host,\n open: opts.open !== false\n })\n );\n }\n );\n\nprogram\n .command(\"report\")\n .description(\"Export a self-contained HTML dashboard (data inlined) for sharing\")\n .option(\"-C, --cwd <dir>\", \"repository directory\")\n .option(\"--dir <dir>\", \"benchmark output directory (relative to repo)\", \".edsger/benchmark\")\n .option(\"--html <path>\", \"output HTML file path\", \"edsger-report.html\")\n .option(\"--open\", \"open the exported file after writing\")\n .action(async (opts: { cwd?: string; dir: string; html: string; open?: boolean }) => {\n await guard(() =>\n runReport({\n cwd: resolve(opts.cwd ?? process.cwd()),\n dir: opts.dir,\n html: opts.html,\n open: Boolean(opts.open)\n })\n );\n });\n\n// `edsger diagram ...` — generate & view repo diagrams (architecture, ER, sequence, flow…).\nconst diagram = program\n .command(\"diagram\")\n .description(\"Generate & view diagrams (architecture, ER, sequence, flow) for a repository\");\n\naddGlobalOptions(\n diagram\n .command(\"generate\", { isDefault: true })\n .description(\"Analyze the repository and generate diagrams as Mermaid\")\n .option(\"--out <dir>\", \"diagram output directory (relative to repo)\", \".edsger/diagrams\")\n .option(\"--no-write\", \"do not write diagram files into the repo\")\n .option(\"--only <ids>\", \"comma-separated catalog diagram ids to generate\")\n .option(\"--serve\", \"open the diagram dashboard after generating\")\n).action(\n async (opts: RawGlobal & { out: string; write: boolean; only?: string; serve?: boolean }) => {\n await guard(async () => {\n const g = toGlobal(opts);\n const only = opts.only\n ? opts.only\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean)\n : undefined;\n const code = await runDiagramGenerate({\n ...g,\n out: opts.out,\n noWrite: opts.write === false,\n only\n });\n if (code === 0 && opts.serve) {\n return runDiagramServe({\n cwd: g.cwd,\n dir: opts.out,\n port: 4578,\n host: \"127.0.0.1\",\n open: true\n });\n }\n return code;\n });\n }\n);\n\ndiagram\n .command(\"serve\")\n .description(\"Serve the diagram dashboard locally\")\n .option(\"-C, --cwd <dir>\", \"repository directory\")\n .option(\"--dir <dir>\", \"diagram output directory (relative to repo)\", \".edsger/diagrams\")\n .option(\"--port <n>\", \"port to listen on\", \"4578\")\n .option(\"--host <host>\", \"host to bind\", \"127.0.0.1\")\n .option(\"--no-open\", \"do not open the browser automatically\")\n .action(\n async (opts: { cwd?: string; dir: string; port: string; host: string; open: boolean }) => {\n await guard(() =>\n runDiagramServe({\n cwd: resolve(opts.cwd ?? process.cwd()),\n dir: opts.dir,\n port: Number.parseInt(opts.port, 10) || 4578,\n host: opts.host,\n open: opts.open !== false\n })\n );\n }\n );\n\ndiagram\n .command(\"report\")\n .description(\"Export a self-contained HTML diagram viewer (data inlined) for sharing\")\n .option(\"-C, --cwd <dir>\", \"repository directory\")\n .option(\"--dir <dir>\", \"diagram output directory (relative to repo)\", \".edsger/diagrams\")\n .option(\"--html <path>\", \"output HTML file path\", \"edsger-diagrams.html\")\n .option(\"--open\", \"open the exported file after writing\")\n .action(async (opts: { cwd?: string; dir: string; html: string; open?: boolean }) => {\n await guard(() =>\n runDiagramReport({\n cwd: resolve(opts.cwd ?? process.cwd()),\n dir: opts.dir,\n html: opts.html,\n open: Boolean(opts.open)\n })\n );\n });\n\n// `edsger mindmap ...` — generate & browse an implementation mind map of the repo.\nconst mindmap = program\n .command(\"mindmap\")\n .description(\"Generate & browse an implementation mind map (Workflowy-style outline) of a repo\");\n\naddGlobalOptions(\n mindmap\n .command(\"generate\", { isDefault: true })\n .description(\"Analyze the repository and generate the implementation mind map\")\n .option(\"--out <dir>\", \"mind-map output directory (relative to repo)\", \".edsger/mindmap\")\n .option(\"--no-write\", \"do not write mind-map files into the repo\")\n .option(\"--focus <text>\", \"area or topic the map should concentrate its depth on\")\n .option(\"--serve\", \"open the mind-map viewer after generating\")\n).action(\n async (opts: RawGlobal & { out: string; write: boolean; focus?: string; serve?: boolean }) => {\n await guard(async () => {\n const g = toGlobal(opts);\n const code = await runMindmapGenerate({\n ...g,\n out: opts.out,\n noWrite: opts.write === false,\n focus: opts.focus\n });\n if (code === 0 && opts.serve) {\n return runMindmapServe({\n cwd: g.cwd,\n dir: opts.out,\n port: 4579,\n host: \"127.0.0.1\",\n open: true\n });\n }\n return code;\n });\n }\n);\n\nmindmap\n .command(\"serve\")\n .description(\"Serve the mind-map viewer locally\")\n .option(\"-C, --cwd <dir>\", \"repository directory\")\n .option(\"--dir <dir>\", \"mind-map output directory (relative to repo)\", \".edsger/mindmap\")\n .option(\"--port <n>\", \"port to listen on\", \"4579\")\n .option(\"--host <host>\", \"host to bind\", \"127.0.0.1\")\n .option(\"--no-open\", \"do not open the browser automatically\")\n .action(\n async (opts: { cwd?: string; dir: string; port: string; host: string; open: boolean }) => {\n await guard(() =>\n runMindmapServe({\n cwd: resolve(opts.cwd ?? process.cwd()),\n dir: opts.dir,\n port: Number.parseInt(opts.port, 10) || 4579,\n host: opts.host,\n open: opts.open !== false\n })\n );\n }\n );\n\nmindmap\n .command(\"report\")\n .description(\"Export a self-contained HTML mind-map viewer (data inlined) for sharing\")\n .option(\"-C, --cwd <dir>\", \"repository directory\")\n .option(\"--dir <dir>\", \"mind-map output directory (relative to repo)\", \".edsger/mindmap\")\n .option(\"--html <path>\", \"output HTML file path\", \"edsger-mindmap.html\")\n .option(\"--open\", \"open the exported file after writing\")\n .action(async (opts: { cwd?: string; dir: string; html: string; open?: boolean }) => {\n await guard(() =>\n runMindmapReport({\n cwd: resolve(opts.cwd ?? process.cwd()),\n dir: opts.dir,\n html: opts.html,\n open: Boolean(opts.open)\n })\n );\n });\n\naddGlobalOptions(\n program\n .command(\"pr-review\")\n .description(\"Review a pull request against the review standard (requires gh)\")\n .argument(\"<pr>\", \"PR number, URL, or branch\")\n .option(\"--repo <owner/repo>\", \"target repository (defaults to current)\")\n .option(\"--post\", \"submit the review to GitHub (otherwise preview only)\")\n).action(async (pr: string, opts: RawGlobal & { repo?: string; post?: boolean }) => {\n await guard(() =>\n runPrReview({ ...toGlobal(opts), pr, repo: opts.repo, post: Boolean(opts.post) })\n );\n});\n\naddGlobalOptions(\n program\n .command(\"pr-resolve\")\n .description(\"Resolve review feedback / fix a pull request (requires gh)\")\n .argument(\"<pr>\", \"PR number, URL, or branch\")\n .option(\"--repo <owner/repo>\", \"target repository (defaults to current)\")\n .option(\"--instruction <text>\", \"what to do (defaults to addressing review comments)\")\n .option(\"--no-checkout\", \"do not check out the PR branch first\")\n .option(\"--push\", \"commit and push the changes when done\")\n).action(\n async (\n pr: string,\n opts: RawGlobal & { repo?: string; instruction?: string; checkout: boolean; push?: boolean }\n ) => {\n await guard(() =>\n runPrResolve({\n ...toGlobal(opts),\n pr,\n repo: opts.repo,\n instruction: opts.instruction,\n checkout: opts.checkout !== false,\n push: Boolean(opts.push)\n })\n );\n }\n);\n\n// `edsger skills ...` — install the skills into Claude Code with no paths needed.\nconst skills = program\n .command(\"skills\")\n .description(\n \"install edsger as Claude Code skills (/benchmark, /audit, /pr-review, /pr-resolve)\"\n );\n\nskills\n .command(\"install\")\n .description(\"install the skills into Claude Code\")\n .option(\"--global\", \"install for the current user (~/.claude/skills) [default]\")\n .option(\"--project\", \"install into ./.claude/skills instead\")\n .option(\"-C, --cwd <dir>\", \"project directory (with --project)\")\n .option(\"--force\", \"overwrite existing skills\")\n .action(async (opts: { global?: boolean; project?: boolean; cwd?: string; force?: boolean }) => {\n await guard(() =>\n runSkillsInstall({\n cwd: resolve(opts.cwd ?? process.cwd()),\n global: opts.project ? false : true,\n force: Boolean(opts.force)\n })\n );\n });\n\nskills\n .command(\"uninstall\")\n .description(\"remove the edsger skills from Claude Code\")\n .option(\"--global\", \"remove from the user scope (~/.claude/skills) [default]\")\n .option(\"--project\", \"remove from ./.claude/skills instead\")\n .option(\"-C, --cwd <dir>\", \"project directory (with --project)\")\n .action(async (opts: { global?: boolean; project?: boolean; cwd?: string }) => {\n await guard(() =>\n runSkillsUninstall({\n cwd: resolve(opts.cwd ?? process.cwd()),\n global: opts.project ? false : true\n })\n );\n });\n\nskills\n .command(\"list\")\n .description(\"show which edsger skills are installed\")\n .option(\"-C, --cwd <dir>\", \"project directory\")\n .action(async (opts: { cwd?: string }) => {\n await guard(() => runSkillsList({ cwd: resolve(opts.cwd ?? process.cwd()), global: true }));\n });\n\nprogram.addHelpText(\n \"after\",\n `\\nExamples:\\n` +\n ` ${pc.dim(\"$\")} edsger benchmark\\n` +\n ` ${pc.dim(\"$\")} edsger benchmark -C ./my-repo --json\\n` +\n ` ${pc.dim(\"$\")} edsger audit ${pc.dim(\"# nitpick the whole repo, report issues\")}\\n` +\n ` ${pc.dim(\"$\")} edsger audit --fail-on high ${pc.dim(\"# CI gate: fail on high/critical findings\")}\\n` +\n ` ${pc.dim(\"$\")} edsger diagram ${pc.dim(\"# generate diagrams for the current repo\")}\\n` +\n ` ${pc.dim(\"$\")} edsger diagram --serve ${pc.dim(\"# …and open them in the browser\")}\\n` +\n ` ${pc.dim(\"$\")} edsger diagram report --html diagrams.html\\n` +\n ` ${pc.dim(\"$\")} edsger mindmap ${pc.dim(\"# implementation mind map of the repo\")}\\n` +\n ` ${pc.dim(\"$\")} edsger mindmap --serve ${pc.dim(\"# …browse it Workflowy-style\")}\\n` +\n ` ${pc.dim(\"$\")} edsger pr-review 123 --post\\n` +\n ` ${pc.dim(\"$\")} edsger pr-resolve 123 --instruction \"fix the failing test\" --push\\n` +\n ` ${pc.dim(\"$\")} edsger skills install ${pc.dim(\"# enable /benchmark etc. in Claude Code\")}\\n` +\n `\\nAuth: the agent uses your Claude Code login (run \\`claude\\` once to sign in); ` +\n `run \\`gh auth login\\` for PR commands.\\n`\n);\n\nprogram.parseAsync(process.argv);\n","import { appendFileSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { basename, dirname, isAbsolute, join } from \"node:path\";\nimport pc from \"picocolors\";\nimport { resolveStandard } from \"../core/assets.js\";\nimport { loadConfig } from \"../core/config.js\";\nimport { runAgent } from \"../core/agent.js\";\nimport {\n assembleAuditData,\n findAuditViewerDir,\n hasData,\n readAuditViewerSingleTemplate,\n renderAuditSingleFile\n} from \"../core/dashboard.js\";\nimport { gitInfo } from \"../core/git.js\";\nimport { log } from \"../core/logger.js\";\nimport { openInBrowser } from \"../core/open.js\";\nimport { startViewerServer } from \"../core/viewer-server.js\";\nimport {\n DEFAULT_MAX_FINDINGS,\n SEVERITY_ORDER,\n hasFindingsAtOrAbove,\n organizeAudit,\n renderAuditMarkdown,\n type OrganizedAudit\n} from \"../core/audit-report.js\";\nimport { AuditResultSchema } from \"../core/schema.js\";\nimport type { AuditStandard, GlobalOptions, Severity } from \"../types.js\";\n\nexport interface AuditOptions extends GlobalOptions {\n /** Directory to write the report into (relative to repo). */\n out: string;\n /** Skip writing files into the repo. */\n noWrite: boolean;\n /** Restrict the audit to these dimension ids. */\n only?: string[];\n /** Free-text area or concern the audit should concentrate on. */\n focus?: string;\n /** Exit non-zero when findings exist at or above this severity (CI gate). */\n failOn?: Severity;\n}\n\n/** Injectable dependencies, so tests can stub out the agentic run. */\nexport interface AuditDeps {\n agent: typeof runAgent;\n}\n\nexport async function runAudit(\n opts: AuditOptions,\n deps: AuditDeps = { agent: runAgent }\n): Promise<number> {\n const { config, path: configPath } = loadConfig(opts.cwd);\n const configDir = configPath ? join(configPath, \"..\") : opts.cwd;\n const resolved = resolveStandard(\"audit\", opts, config, configDir);\n const standard = narrowDimensions(resolved.standard as AuditStandard, opts.only);\n\n log.info(\n `Auditing ${pc.bold(basename(opts.cwd))} against ${pc.bold(standard.name)} ` +\n `(languages: ${resolved.languages.join(\", \") || \"generic\"})`\n );\n log.debug(`standard layers: ${resolved.layers.join(\" → \")}`);\n\n const { result, costUsd, numTurns } = await deps.agent({\n prompt: buildPrompt(standard, opts.cwd, opts.focus),\n cwd: opts.cwd,\n model: opts.model,\n maxTurns: opts.maxTurns,\n timeoutMs: opts.timeoutMs,\n allowWrite: false,\n verbose: opts.verbose,\n resultShape: AuditResultSchema.shape,\n systemPromptAppend:\n \"You are Edsger, an exacting staff-level engineer performing a professionalism audit \" +\n \"of an existing repository. Your job is to find what is unprofessional, outdated, \" +\n \"fragile, or sloppy — and to prove it. Every finding must cite real evidence (file, \" +\n \"and line where possible) you actually inspected. Be demanding but fair: no invented \" +\n \"problems, no vague generalities. Do not modify any files.\"\n });\n\n if (!result) {\n log.error(\n \"The agent did not produce a result. Try increasing --max-turns or check credentials.\"\n );\n return 1;\n }\n\n const organized = organizeAudit(standard, result);\n const generatedAt = new Date().toISOString();\n // Filesystem-safe UTC run id (e.g. 20260701T034500Z): lexicographic order == chronological.\n const runId = generatedAt.replace(/[-:]/g, \"\").replace(/\\.\\d+Z$/, \"Z\");\n // Correlate the findings with the code state they were found in.\n const git = gitInfo(opts.cwd);\n const md = renderAuditMarkdown(organized, {\n repo: basename(opts.cwd),\n languages: resolved.languages,\n layers: resolved.layers,\n generatedAt,\n model: opts.model\n });\n\n const jsonReport = {\n schema: \"edsger.audit/1\",\n runId,\n generatedAt,\n model: opts.model,\n repo: basename(opts.cwd),\n git,\n languages: resolved.languages,\n standard: { name: standard.name, version: standard.version, layers: resolved.layers },\n // Dimension titles in standard order, so viewers can label groups properly.\n dimensions: standard.dimensions.map((d) => ({ id: d.id, title: d.title })),\n summary: organized.summary,\n counts: organized.counts,\n total: organized.total,\n omitted: organized.omitted,\n findings: organized.findings,\n positives: organized.positives,\n costUsd\n };\n\n // Compact, append-only trend index: one line per run, cheap to read for charts.\n const historyRecord = {\n runId,\n generatedAt,\n commit: git.commit,\n branch: git.branch,\n dirty: git.dirty,\n model: opts.model,\n standardVersion: standard.version,\n total: organized.total,\n counts: organized.counts,\n costUsd\n };\n\n if (!opts.noWrite && !opts.dryRun) {\n const baseDir = join(opts.cwd, opts.out);\n const mdOut = md + \"\\n\";\n const jsonOut = JSON.stringify(jsonReport, null, 2) + \"\\n\";\n\n // Archive this run under runs/<timestamp>/ so history from repeated runs is preserved.\n const runDir = join(baseDir, \"runs\", runId);\n mkdirSync(runDir, { recursive: true });\n writeFileSync(join(runDir, \"report.md\"), mdOut, \"utf8\");\n writeFileSync(join(runDir, \"report.json\"), jsonOut, \"utf8\");\n\n // Always refresh the canonical top-level report as the stable \"latest\" pointer.\n writeFileSync(join(baseDir, \"report.md\"), mdOut, \"utf8\");\n writeFileSync(join(baseDir, \"report.json\"), jsonOut, \"utf8\");\n\n // Append one compact line to the trend index (source of truth for history).\n appendFileSync(join(baseDir, \"history.jsonl\"), JSON.stringify(historyRecord) + \"\\n\", \"utf8\");\n\n log.success(\n `Report written to ${pc.bold(join(opts.out, \"report.md\"))} ` +\n `${pc.dim(`(run archived at ${join(opts.out, \"runs\", runId)})`)}`\n );\n }\n\n printSummary(organized, numTurns, costUsd);\n if (opts.json) process.stdout.write(JSON.stringify(jsonReport, null, 2) + \"\\n\");\n\n if (opts.failOn && hasFindingsAtOrAbove(organized, opts.failOn)) {\n log.warn(`Findings at or above ${pc.bold(opts.failOn)} present — failing (--fail-on).`);\n return 2;\n }\n return 0;\n}\n\n// --- serve -------------------------------------------------------------------\n\nexport interface AuditServeOptions {\n cwd: string;\n /** Audit output dir relative to cwd (default .edsger/audit). */\n dir: string;\n port: number;\n host: string;\n open: boolean;\n}\n\nexport async function runAuditServe(opts: AuditServeOptions): Promise<number> {\n const auditDir = join(opts.cwd, opts.dir);\n const viewerDir = findAuditViewerDir();\n\n return startViewerServer({\n viewerDir,\n indexFile: \"audit.html\",\n dataRoute: \"/edsger-audit.json\",\n getData: () => assembleAuditData(auditDir),\n port: opts.port,\n host: opts.host,\n open: opts.open,\n emptyHint: hasData(assembleAuditData(auditDir))\n ? undefined\n : `No audit data in ${opts.dir} yet — run \\`edsger audit\\` first.`\n });\n}\n\n// --- report ------------------------------------------------------------------\n\nexport interface AuditReportOptions {\n cwd: string;\n /** Audit output dir relative to cwd (default .edsger/audit). */\n dir: string;\n /** Output path for the self-contained HTML (relative to cwd unless absolute). */\n html: string;\n open: boolean;\n}\n\n/** Export a self-contained, shareable HTML audit viewer (data inlined). */\nexport async function runAuditReport(opts: AuditReportOptions): Promise<number> {\n const auditDir = join(opts.cwd, opts.dir);\n const data = assembleAuditData(auditDir);\n if (!hasData(data)) {\n log.error(`No audit data in ${opts.dir}. Run \\`edsger audit\\` first.`);\n return 1;\n }\n\n const html = renderAuditSingleFile(readAuditViewerSingleTemplate(), data);\n const out = isAbsolute(opts.html) ? opts.html : join(opts.cwd, opts.html);\n mkdirSync(dirname(out), { recursive: true });\n writeFileSync(out, html, \"utf8\");\n\n log.success(\n `Wrote self-contained audit viewer to ${pc.bold(opts.html)} ` +\n `${pc.dim(`(${Math.round(html.length / 1024)} kB, open in any browser)`)}`\n );\n if (opts.open) openInBrowser(out);\n return 0;\n}\n\n/** Restrict a standard to the requested dimension ids (unknown ids are an error). */\nfunction narrowDimensions(standard: AuditStandard, only?: string[]): AuditStandard {\n if (!only || only.length === 0) return standard;\n const valid = new Set(standard.dimensions.map((d) => d.id));\n const unknown = only.filter((id) => !valid.has(id));\n if (unknown.length) {\n throw new Error(\n `Unknown dimension id(s): ${unknown.join(\", \")}. ` + `Available: ${[...valid].join(\", \")}`\n );\n }\n const keep = new Set(only);\n return { ...standard, dimensions: standard.dimensions.filter((d) => keep.has(d.id)) };\n}\n\nfunction printSummary(organized: OrganizedAudit, numTurns: number, costUsd: number): void {\n log.heading(`Findings: ${organized.total}`);\n for (const s of SEVERITY_ORDER) {\n if (organized.counts[s]) {\n process.stderr.write(` ${sevColor(s)(s.padEnd(8))} ${organized.counts[s]}\\n`);\n }\n }\n if (organized.omitted > 0) {\n log.warn(`${organized.omitted} lower-severity finding(s) omitted (maxFindings policy)`);\n }\n if (organized.quickWins.length) {\n log.step(`${organized.quickWins.length} quick win(s) — see the report's \"Quick wins\" section`);\n }\n log.step(`${numTurns} turns · ~$${costUsd.toFixed(3)}`);\n}\n\nfunction sevColor(s: Severity): (t: string) => string {\n if (s === \"critical\" || s === \"high\") return pc.red;\n if (s === \"medium\") return pc.yellow;\n return pc.dim;\n}\n\nfunction buildPrompt(standard: AuditStandard, cwd: string, focus?: string): string {\n const maxFindings = Math.max(1, standard.policy?.maxFindings ?? DEFAULT_MAX_FINDINGS);\n const dims = standard.dimensions\n .map((d) => {\n const checklist = (d.checklist ?? []).map((c) => ` - ${c}`).join(\"\\n\");\n return (\n `- id: ${d.id} (${d.title}, default severity ${d.defaultSeverity ?? \"medium\"})\\n` +\n ` guidance: ${d.guidance.trim()}` +\n (checklist ? `\\n checklist:\\n${checklist}` : \"\")\n );\n })\n .join(\"\\n\");\n\n return [\n `Audit the repository located at: ${cwd}`,\n ``,\n `This is a deliberate fault-finding pass over the WHOLE repository (not a diff): surface`,\n `everything that keeps it from being truly professional — sloppy or amateurish`,\n `implementations, outdated or deprecated patterns, fragility, and neglected hygiene.`,\n ...(standard.guidance ? [``, `Overall guidance: ${standard.guidance.trim()}`] : []),\n ...(focus ? [``, `Extra focus requested by the user: ${truncate(focus.trim(), 2000)}`] : []),\n ``,\n `Method:`,\n ...numbered([\n `Explore the repository thoroughly: structure, source, configuration, dependencies,\\n` +\n `CI, tests, and docs. Use Read/Grep/Glob and read-only Bash (ls, cat, git log).\\n` +\n `Do NOT modify anything.`,\n `For EVERY dimension below, actively hunt for violations of its guidance and\\n` +\n `checklist. Only report findings backed by evidence you actually inspected; cite the\\n` +\n `repo-relative file path and, where it applies, the 1-based line number.`,\n `For each finding choose a severity (critical/high/medium/low/info; start from the\\n` +\n `dimension's default and adjust for impact), explain why it matters, give a concrete\\n` +\n `fix, and estimate the effort (quick/moderate/involved).`,\n `When the SAME issue recurs across many files, consolidate it into ONE finding and\\n` +\n `list the other affected locations in its detail — do not repeat it per file.\\n` +\n `Report at most ${maxFindings} findings: keep the most severe, fold or drop the rest.`,\n `Also record what the repo genuinely does well (positives) — the critique must stay fair.`,\n `When finished, call submit_result exactly once with the summary, all findings, and\\n` +\n `the positives.`\n ]),\n ``,\n `Dimensions:`,\n dims\n ].join(\"\\n\");\n}\n\n/** Format prose steps as an indented, numbered list. */\nfunction numbered(steps: string[]): string[] {\n return steps.map((s, i) => {\n const [first = \"\", ...rest] = s.split(\"\\n\");\n return [`${i + 1}. ${first}`, ...rest.map((l) => ` ${l}`)].join(\"\\n\");\n });\n}\n\nfunction truncate(s: string, max: number): string {\n return s.length > max ? s.slice(0, max) + \" … [truncated]\" : s;\n}\n","import { execFileSync } from \"node:child_process\";\nimport { existsSync, readdirSync, statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type {\n AuditDimension,\n AuditStandard,\n BenchmarkStandard,\n Category,\n Criterion,\n DiagramCatalog,\n DiagramGroup,\n DiagramSpec,\n FocusArea,\n GlobalOptions,\n MindmapAspect,\n MindmapStandard,\n ResolvedStandard,\n ReviewStandard,\n Standard,\n StandardKind\n} from \"../types.js\";\nimport { log } from \"./logger.js\";\nimport { loadStructured } from \"../util/yaml.js\";\nimport type { EdsgerConfig } from \"./config.js\";\n\nconst moduleDir = dirname(fileURLToPath(import.meta.url));\n\n/** Walk upward from the running module to find the bundled `assets/` dir. */\nexport function findBundledAssetsDir(): string {\n if (process.env.EDSGER_ASSETS_DIR && existsSync(process.env.EDSGER_ASSETS_DIR)) {\n return process.env.EDSGER_ASSETS_DIR;\n }\n let dir = moduleDir;\n for (let i = 0; i < 8; i++) {\n const candidate = join(dir, \"assets\");\n if (existsSync(join(candidate, \"manifest.yaml\"))) return candidate;\n // Also allow running directly against an edsger-assets checkout layout.\n if (existsSync(join(dir, \"manifest.yaml\")) && existsSync(join(dir, \"benchmark\"))) {\n return dir;\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n throw new Error(\"Could not locate bundled assets. Reinstall edsger or set EDSGER_ASSETS_DIR.\");\n}\n\ninterface LanguageDetector {\n id: string;\n markers: string[];\n extensions: string[];\n}\n\ninterface LanguagesConfig {\n minScore: number;\n maxExtensionMatches: number;\n languages: LanguageDetector[];\n}\n\nfunction loadLangConfig(assetsRoot: string): LanguagesConfig | null {\n const cfgPath = join(assetsRoot, \"languages.yaml\");\n if (!existsSync(cfgPath)) return null;\n return loadStructured<LanguagesConfig>(cfgPath);\n}\n\n/** Score languages from a set of file/dir names against the detector config. */\nfunction scoreLanguages(names: string[], cfg: LanguagesConfig, minScore: number): string[] {\n const exts = new Set(names.map(extOf));\n const scored: { id: string; score: number }[] = [];\n for (const lang of cfg.languages) {\n let score = 0;\n for (const m of lang.markers) {\n if (m.includes(\"*\")) {\n const re = globToRegExp(m);\n if (names.some((f) => re.test(f))) score += 3;\n } else if (names.includes(m)) {\n score += 3;\n }\n }\n let extHits = 0;\n for (const e of lang.extensions) if (exts.has(e)) extHits++;\n score += Math.min(extHits, cfg.maxExtensionMatches);\n if (score >= minScore) scored.push({ id: lang.id, score });\n }\n return scored.sort((a, b) => b.score - a.score).map((s) => s.id);\n}\n\n/** Detect which languages a repository uses, ordered by confidence. */\nexport function detectLanguages(cwd: string, assetsRoot: string): string[] {\n const cfg = loadLangConfig(assetsRoot);\n if (!cfg) return [];\n const names = readShallowTree(cwd, 3).map((e) => e.name);\n return scoreLanguages(names, cfg, cfg.minScore);\n}\n\n/**\n * Infer languages from a list of file paths (e.g. a PR's changed files) when a\n * working-directory scan is unavailable or empty. Uses a low threshold since\n * this is a best-effort hint.\n */\nexport function inferLanguagesFromFiles(\n paths: string[],\n assetsRoot: string,\n minScore = 1\n): string[] {\n const cfg = loadLangConfig(assetsRoot);\n if (!cfg) return [];\n const names = paths.flatMap((p) => [p, p.split(\"/\").pop() ?? p]);\n return scoreLanguages(names, cfg, minScore);\n}\n\n/** Resolve the effective standard for a kind via the full override chain. */\nexport function resolveStandard(\n kind: StandardKind,\n opts: GlobalOptions,\n config: EdsgerConfig,\n configDir: string,\n /** Fallback languages used only when a working-dir scan finds nothing. */\n forcedLanguages?: string[]\n): ResolvedStandard {\n const bundled = opts.assetsPath\n ? resolveRootPath(opts.assetsPath, opts.cwd)\n : findBundledAssetsDir();\n\n const languages = opts.lang\n ? [normaliseLang(opts.lang)]\n : config.language\n ? [normaliseLang(config.language)]\n : pickDetected(detectLanguages(opts.cwd, bundled), forcedLanguages);\n\n // Ordered roots: bundled first (lowest precedence), then configured overrides.\n const roots: { path: string; label: string }[] = [\n { path: bundled, label: opts.assetsPath ? `assets:${opts.assetsPath}` : \"bundled\" }\n ];\n const perKind =\n kind === \"benchmark\"\n ? config.benchmark?.standards\n : kind === \"diagrams\"\n ? config.diagrams?.standards\n : kind === \"mindmap\"\n ? config.mindmap?.standards\n : kind === \"audit\"\n ? config.audit?.standards\n : config.review?.standards;\n const overrideSpec = perKind ?? config.standards;\n if (overrideSpec && !opts.assetsPath) {\n roots.push({ path: resolveRootPath(overrideSpec, configDir), label: `config:${overrideSpec}` });\n }\n\n const layers: { data: Partial<Standard>; label: string }[] = [];\n\n // 1. base + language overlays from each root.\n for (const root of roots) {\n pushIfExists(layers, join(root.path, kind, \"base.yaml\"), `${root.label}/base`);\n for (const lang of languages) {\n pushIfExists(layers, join(root.path, kind, `${lang}.yaml`), `${root.label}/${lang}`);\n }\n }\n\n // 2. repo-local .edsger/<kind>/ overlays (highest-but-one precedence).\n const repoLocal = join(opts.cwd, \".edsger\", kind);\n if (existsSync(repoLocal)) {\n pushIfExists(layers, join(repoLocal, \"base.yaml\"), `repo:.edsger/${kind}/base`);\n for (const lang of languages) {\n pushIfExists(layers, join(repoLocal, `${lang}.yaml`), `repo:.edsger/${kind}/${lang}`);\n }\n }\n\n // 3. explicit --standard path (highest precedence).\n if (opts.standardPath) {\n const p = resolveRootPath(opts.standardPath, opts.cwd);\n if (existsSync(p) && statSync(p).isDirectory()) {\n pushIfExists(layers, join(p, kind, \"base.yaml\"), `--standard/base`);\n for (const lang of languages) {\n pushIfExists(layers, join(p, kind, `${lang}.yaml`), `--standard/${lang}`);\n }\n pushIfExists(layers, join(p, \"base.yaml\"), `--standard/base`);\n } else if (existsSync(p)) {\n pushIfExists(layers, p, `--standard:${opts.standardPath}`);\n } else {\n throw new Error(`--standard path not found: ${p}`);\n }\n }\n\n if (layers.length === 0) {\n throw new Error(`No ${kind} standard found in any source.`);\n }\n\n const merged = mergeLayers(\n kind,\n layers.map((l) => l.data)\n );\n return { standard: merged, layers: layers.map((l) => l.label), languages };\n}\n\n// --- merging -----------------------------------------------------------------\n\nfunction mergeLayers(kind: StandardKind, layers: Partial<Standard>[]): Standard {\n if (kind === \"benchmark\") {\n return layers.reduce(\n (acc, layer) =>\n mergeBenchmark(acc as Partial<BenchmarkStandard>, layer as Partial<BenchmarkStandard>),\n {} as Partial<BenchmarkStandard>\n ) as BenchmarkStandard;\n }\n if (kind === \"diagrams\") {\n return layers.reduce(\n (acc, layer) =>\n mergeDiagrams(acc as Partial<DiagramCatalog>, layer as Partial<DiagramCatalog>),\n {} as Partial<DiagramCatalog>\n ) as DiagramCatalog;\n }\n if (kind === \"mindmap\") {\n return layers.reduce(\n (acc, layer) =>\n mergeMindmap(acc as Partial<MindmapStandard>, layer as Partial<MindmapStandard>),\n {} as Partial<MindmapStandard>\n ) as MindmapStandard;\n }\n if (kind === \"audit\") {\n return layers.reduce(\n (acc, layer) => mergeAudit(acc as Partial<AuditStandard>, layer as Partial<AuditStandard>),\n {} as Partial<AuditStandard>\n ) as AuditStandard;\n }\n return layers.reduce(\n (acc, layer) => mergeReview(acc as Partial<ReviewStandard>, layer as Partial<ReviewStandard>),\n {} as Partial<ReviewStandard>\n ) as ReviewStandard;\n}\n\nfunction mergeDiagrams(\n base: Partial<DiagramCatalog>,\n overlay: Partial<DiagramCatalog>\n): Partial<DiagramCatalog> {\n const groups = mergeById<DiagramGroup>(base.groups ?? [], overlay.groups ?? [], (b, o) => ({\n ...b,\n ...o,\n // Diagrams with the same id are overridden; new ids are appended.\n diagrams: mergeById<DiagramSpec>(b.diagrams ?? [], o.diagrams ?? [], (bd, od) => ({\n ...bd,\n ...od\n }))\n }));\n return {\n ...base,\n ...overlay,\n // Preserve the base layer's identity rather than the last overlay's.\n id: base.id ?? overlay.id,\n name: base.name ?? overlay.name,\n version: base.version ?? overlay.version,\n kind: \"diagrams\",\n groups\n };\n}\n\nfunction mergeMindmap(\n base: Partial<MindmapStandard>,\n overlay: Partial<MindmapStandard>\n): Partial<MindmapStandard> {\n // Aspects with the same id are overridden; new ids are appended.\n const aspects = mergeById<MindmapAspect>(base.aspects ?? [], overlay.aspects ?? [], (b, o) => ({\n ...b,\n ...o\n }));\n return {\n ...base,\n ...overlay,\n // Preserve the base layer's identity rather than the last overlay's.\n id: base.id ?? overlay.id,\n name: base.name ?? overlay.name,\n version: base.version ?? overlay.version,\n kind: \"mindmap\",\n guidance: overlay.guidance ?? base.guidance,\n maxDepth: overlay.maxDepth ?? base.maxDepth,\n aspects\n };\n}\n\nfunction mergeBenchmark(\n base: Partial<BenchmarkStandard>,\n overlay: Partial<BenchmarkStandard>\n): Partial<BenchmarkStandard> {\n const categories = mergeById<Category>(\n base.categories ?? [],\n overlay.categories ?? [],\n (b, o) => ({\n ...b,\n ...o,\n criteria: mergeById<Criterion>(b.criteria ?? [], o.criteria ?? [], (bc, oc) => ({\n ...bc,\n ...oc\n }))\n })\n );\n return {\n ...base,\n ...overlay,\n // Preserve the base layer's identity rather than the last overlay's.\n id: base.id ?? overlay.id,\n name: base.name ?? overlay.name,\n version: base.version ?? overlay.version,\n kind: \"benchmark\",\n scoreScale: overlay.scoreScale ?? base.scoreScale ?? 4,\n categories\n };\n}\n\nfunction mergeAudit(\n base: Partial<AuditStandard>,\n overlay: Partial<AuditStandard>\n): Partial<AuditStandard> {\n // Dimensions with the same id are overridden; new ids are appended.\n const dimensions = mergeById<AuditDimension>(\n base.dimensions ?? [],\n overlay.dimensions ?? [],\n (b, o) => ({ ...b, ...o })\n );\n return {\n ...base,\n ...overlay,\n // Preserve the base layer's identity rather than the last overlay's.\n id: base.id ?? overlay.id,\n name: base.name ?? overlay.name,\n version: base.version ?? overlay.version,\n kind: \"audit\",\n guidance: overlay.guidance ?? base.guidance,\n policy: { ...(base.policy ?? {}), ...(overlay.policy ?? {}) },\n dimensions\n };\n}\n\nfunction mergeReview(\n base: Partial<ReviewStandard>,\n overlay: Partial<ReviewStandard>\n): Partial<ReviewStandard> {\n const focusAreas = mergeById<FocusArea>(\n base.focusAreas ?? [],\n overlay.focusAreas ?? [],\n (b, o) => ({\n ...b,\n ...o\n })\n );\n return {\n ...base,\n ...overlay,\n id: base.id ?? overlay.id,\n name: base.name ?? overlay.name,\n version: base.version ?? overlay.version,\n kind: \"review\",\n policy: { ...(base.policy ?? {}), ...(overlay.policy ?? {}) } as ReviewStandard[\"policy\"],\n focusAreas\n };\n}\n\nfunction mergeById<T extends { id: string }>(\n base: T[],\n overlay: T[],\n merge: (b: T, o: T) => T\n): T[] {\n const out: T[] = base.map((x) => ({ ...x }));\n const index = new Map(out.map((x, i) => [x.id, i]));\n for (const item of overlay) {\n const at = index.get(item.id);\n if (at === undefined) {\n index.set(item.id, out.length);\n out.push({ ...item });\n } else {\n out[at] = merge(out[at] as T, item);\n }\n }\n return out;\n}\n\n// --- helpers -----------------------------------------------------------------\n\nfunction pushIfExists(\n layers: { data: Partial<Standard>; label: string }[],\n path: string,\n label: string\n): void {\n if (existsSync(path)) {\n layers.push({ data: loadStructured<Partial<Standard>>(path), label });\n log.debug(`standard layer: ${label} (${path})`);\n }\n}\n\nfunction resolveRootPath(spec: string, baseDir: string): string {\n if (spec.startsWith(\"git+\") || /^(https?|git|ssh):\\/\\//.test(spec)) {\n return cloneToCache(spec.replace(/^git\\+/, \"\"));\n }\n return isAbsolute(spec) ? spec : resolve(baseDir, spec);\n}\n\n/** Clone (or reuse a cached clone of) a git standards repo. */\nfunction cloneToCache(url: string): string {\n const [repo, ref] = url.split(\"#\") as [string, string | undefined];\n const safe = repo.replace(/[^a-zA-Z0-9._-]/g, \"_\");\n const dest = join(homedir(), \".cache\", \"edsger\", \"standards\", safe);\n if (!existsSync(dest)) {\n log.step(`cloning standards repo ${repo}`);\n execFileSync(\"git\", [\"clone\", \"--depth\", \"1\", ...(ref ? [\"--branch\", ref] : []), repo, dest], {\n stdio: \"ignore\"\n });\n }\n return dest;\n}\n\ninterface Entry {\n name: string;\n}\n\n/** Read top file/dir names up to `depth` levels, skipping noise dirs. */\nfunction readShallowTree(root: string, depth: number): Entry[] {\n const skip = new Set([\n \"node_modules\",\n \".git\",\n \"dist\",\n \"build\",\n \"out\",\n \"target\",\n \"vendor\",\n \".venv\",\n \"venv\",\n \"__pycache__\",\n \".dart_tool\"\n ]);\n const out: Entry[] = [];\n const walk = (dir: string, level: number): void => {\n let items: string[];\n try {\n items = readdirSync(dir);\n } catch {\n return;\n }\n for (const name of items) {\n if (skip.has(name)) continue;\n out.push({ name });\n if (level < depth) {\n const full = join(dir, name);\n try {\n if (statSync(full).isDirectory()) walk(full, level + 1);\n } catch {\n /* ignore unreadable entries */\n }\n }\n }\n };\n walk(root, 1);\n return out;\n}\n\nfunction extOf(name: string): string {\n const i = name.lastIndexOf(\".\");\n return i < 0 ? \"\" : name.slice(i);\n}\n\nfunction globToRegExp(glob: string): RegExp {\n const escaped = glob.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\");\n return new RegExp(`^${escaped}$`);\n}\n\nfunction pickDetected(detected: string[], fallback?: string[]): string[] {\n return detected.length ? detected : (fallback ?? []);\n}\n\n/** Map a user-supplied language alias to a canonical id (best effort). */\nfunction normaliseLang(input: string): string {\n const v = input.trim().toLowerCase();\n const aliases: Record<string, string> = {\n ts: \"typescript\",\n js: \"typescript\",\n javascript: \"typescript\",\n node: \"typescript\",\n nodejs: \"typescript\",\n py: \"python\",\n golang: \"go\",\n cs: \"csharp\",\n \"c#\": \"csharp\",\n dotnet: \"csharp\",\n jvm: \"java\",\n kotlin: \"java\",\n flutter: \"dart\"\n };\n return aliases[v] ?? v;\n}\n","import pc from \"picocolors\";\n\nlet verbose = false;\n\nexport function setVerbose(v: boolean): void {\n verbose = v;\n}\n\nexport const log = {\n info(msg: string): void {\n process.stderr.write(`${pc.cyan(\"•\")} ${msg}\\n`);\n },\n success(msg: string): void {\n process.stderr.write(`${pc.green(\"✓\")} ${msg}\\n`);\n },\n warn(msg: string): void {\n process.stderr.write(`${pc.yellow(\"!\")} ${msg}\\n`);\n },\n error(msg: string): void {\n process.stderr.write(`${pc.red(\"✗\")} ${msg}\\n`);\n },\n step(msg: string): void {\n process.stderr.write(`${pc.dim(\" →\")} ${pc.dim(msg)}\\n`);\n },\n debug(msg: string): void {\n if (verbose) process.stderr.write(`${pc.dim(` ${msg}`)}\\n`);\n },\n /** Print a heading to stderr so structured stdout stays clean. */\n heading(msg: string): void {\n process.stderr.write(`\\n${pc.bold(msg)}\\n`);\n }\n};\n","import { readFileSync } from \"node:fs\";\nimport yaml from \"js-yaml\";\n\n/** Parse a YAML or JSON file into a plain object. */\nexport function loadStructured<T = unknown>(path: string): T {\n const raw = readFileSync(path, \"utf8\");\n return yaml.load(raw) as T;\n}\n\n/** Parse a YAML or JSON string. */\nexport function parseStructured<T = unknown>(raw: string): T {\n return yaml.load(raw) as T;\n}\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { loadStructured } from \"../util/yaml.js\";\n\n/**\n * User configuration, discovered from the target repository or home dir.\n * Everything is optional — zero config falls back to bundled assets.\n */\nexport interface EdsgerConfig {\n /** Default model for agent runs. */\n model?: string;\n /**\n * Override the standards source. Either:\n * - a local path (absolute, or relative to the config file), or\n * - a git URL (clone + cache) — supported via the `git+` prefix.\n */\n standards?: string;\n /** Force a language id, skipping auto-detection. */\n language?: string;\n /** Per-kind overrides, e.g. { benchmark: \"./team-standards\" }. */\n benchmark?: { standards?: string };\n review?: { standards?: string };\n audit?: { standards?: string };\n diagrams?: { standards?: string };\n mindmap?: { standards?: string };\n}\n\nconst CONFIG_FILENAMES = [\n \"edsger.config.yaml\",\n \"edsger.config.yml\",\n \"edsger.config.json\",\n \".edsgerrc.yaml\",\n \".edsgerrc.yml\",\n \".edsgerrc.json\",\n \".edsgerrc\"\n];\n\n/** Find and load an edsger config file from `cwd`, then `.edsger/`. */\nexport function loadConfig(cwd: string): { config: EdsgerConfig; path?: string } {\n const searchDirs = [cwd, join(cwd, \".edsger\")];\n for (const dir of searchDirs) {\n for (const name of CONFIG_FILENAMES) {\n const p = join(dir, name);\n if (existsSync(p)) {\n try {\n const config = loadStructured<EdsgerConfig>(p) ?? {};\n return { config, path: p };\n } catch {\n // Malformed config should not crash discovery; ignore and continue.\n }\n }\n }\n }\n return { config: {} };\n}\n","import {\n createSdkMcpServer,\n query,\n tool,\n type McpServerConfig\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport type { ZodRawShape } from \"zod\";\nimport { z } from \"zod\";\nimport pc from \"picocolors\";\nimport { log } from \"./logger.js\";\n\nexport interface AgentRunOptions<Shape extends ZodRawShape> {\n /** The instruction given to the agent. */\n prompt: string;\n /** Working directory the agent operates in. */\n cwd: string;\n model: string;\n /** Cap on agentic turns; undefined = unlimited. */\n maxTurns?: number;\n /** Whether the agent may modify files (Edit/Write) and run mutating commands. */\n allowWrite: boolean;\n /** Appended to the Claude Code system prompt preset. */\n systemPromptAppend: string;\n /**\n * Zod shape describing the structured result. The agent is required to call a\n * `submit_result` tool with this shape exactly once; its validated args are\n * returned. This is the reliable way to get machine-readable output.\n */\n resultShape: Shape;\n /** Extra MCP servers (e.g. github) to expose to the agent. */\n extraMcpServers?: Record<string, McpServerConfig>;\n /** Extra tool names to allow (e.g. \"mcp__github__*\"). */\n extraAllowedTools?: string[];\n /** Hard wall-clock limit; the run is aborted if it exceeds this. */\n timeoutMs?: number;\n verbose: boolean;\n}\n\nexport interface AgentRunResult<T> {\n result: T | undefined;\n costUsd: number;\n numTurns: number;\n}\n\nconst READ_ONLY_DISALLOWED = [\"Edit\", \"Write\", \"NotebookEdit\"];\n\n/**\n * Run an agentic loop with the Claude Agent SDK and collect a structured\n * result. Read-only runs have edit tools removed from the agent's context.\n */\nexport async function runAgent<Shape extends ZodRawShape>(\n opts: AgentRunOptions<Shape>\n): Promise<AgentRunResult<z.infer<z.ZodObject<Shape>>>> {\n type Result = z.infer<z.ZodObject<Shape>>;\n let captured: Result | undefined;\n\n const submitTool = tool(\n \"submit_result\",\n \"Submit the final structured result. Call this exactly once when done.\",\n opts.resultShape,\n async (args) => {\n captured = args as Result;\n return { content: [{ type: \"text\", text: \"Result recorded. You may stop now.\" }] };\n }\n );\n\n const outServer = createSdkMcpServer({\n name: \"edsger_out\",\n version: \"1.0.0\",\n tools: [submitTool]\n });\n\n const allowedTools = [\n \"Read\",\n \"Grep\",\n \"Glob\",\n \"Bash\",\n \"mcp__edsger_out__submit_result\",\n ...(opts.allowWrite ? [\"Edit\", \"Write\", \"MultiEdit\"] : []),\n ...(opts.extraAllowedTools ?? [])\n ];\n\n const mcpServers: Record<string, McpServerConfig> = {\n edsger_out: outServer,\n ...(opts.extraMcpServers ?? {})\n };\n\n let costUsd = 0;\n let numTurns = 0;\n\n // Enforce a wall-clock limit so a stuck run cannot hang a CI job.\n const controller = new AbortController();\n const timer = opts.timeoutMs ? setTimeout(() => controller.abort(), opts.timeoutMs) : undefined;\n\n const stream = query({\n prompt: opts.prompt,\n options: {\n model: opts.model,\n cwd: opts.cwd,\n // Only impose a turn cap when the user explicitly set one; otherwise let the\n // agent run to completion (no max-turns stop).\n ...(opts.maxTurns ? { maxTurns: opts.maxTurns } : {}),\n // Reproducible runs: do not load the target repo's settings/CLAUDE.md.\n settingSources: [],\n systemPrompt: {\n type: \"preset\",\n preset: \"claude_code\",\n append: opts.systemPromptAppend\n },\n // The user explicitly invoked an agent to inspect/modify their own repo.\n // Capability is shaped by allowedTools/disallowedTools rather than prompts:\n // read-only runs have edit tools removed from context entirely (below).\n permissionMode: \"bypassPermissions\",\n allowedTools,\n disallowedTools: opts.allowWrite ? [] : READ_ONLY_DISALLOWED,\n mcpServers,\n abortController: controller\n }\n });\n\n let turn = 0;\n try {\n for await (const message of stream as AsyncIterable<AnyMessage>) {\n if (message.type === \"assistant\") {\n turn += 1;\n for (const block of message.message?.content ?? []) {\n if (block.type === \"tool_use\") {\n // Visible by default so a long run shows live progress, not a frozen screen.\n const counter = opts.maxTurns ? `${turn}/${opts.maxTurns}` : `${turn}`;\n log.step(`[${counter}] ${summarizeTool(block.name, block.input)}`);\n } else if (block.type === \"text\" && opts.verbose && block.text?.trim()) {\n // The agent's reasoning — only in verbose mode, and only the first few lines.\n for (const line of block.text.trim().split(\"\\n\").slice(0, 4)) {\n if (line.trim()) log.debug(line.trim());\n }\n }\n }\n } else if (message.type === \"result\") {\n costUsd = message.total_cost_usd ?? 0;\n numTurns = message.num_turns ?? 0;\n if (message.subtype && message.subtype !== \"success\") {\n log.warn(`agent ended with: ${message.subtype}`);\n }\n }\n }\n } catch (err) {\n if (controller.signal.aborted) {\n throw new Error(`Agent run timed out after ${Math.round((opts.timeoutMs ?? 0) / 1000)}s.`);\n }\n throw err;\n } finally {\n if (timer) clearTimeout(timer);\n }\n\n return { result: captured, costUsd, numTurns };\n}\n\n// Minimal structural typing over the SDK message union so we are resilient to\n// version drift in exported type names.\ninterface AnyMessage {\n type: string;\n subtype?: string;\n total_cost_usd?: number;\n num_turns?: number;\n message?: {\n content?: Array<{\n type: string;\n name?: string;\n text?: string;\n input?: Record<string, unknown>;\n }>;\n };\n}\n\n/** One-line, human-readable summary of a tool call for progress output. */\nfunction summarizeTool(name = \"tool\", input: Record<string, unknown> = {}): string {\n const str = (v: unknown): string => (typeof v === \"string\" ? v : \"\");\n const oneLine = (v: string, max = 80): string => {\n const s = v.replace(/\\s+/g, \" \").trim();\n return s.length > max ? s.slice(0, max - 1) + \"…\" : s;\n };\n const base = (p: string): string => p.split(\"/\").filter(Boolean).pop() ?? p;\n\n switch (name) {\n case \"Read\":\n case \"Edit\":\n case \"Write\":\n case \"MultiEdit\":\n case \"NotebookEdit\":\n return `${name} ${base(str(input.file_path))}`;\n case \"Bash\": {\n const cmd = oneLine(str(input.command));\n return `Bash ${cmd ? pc.dim(`$ ${cmd}`) : \"\"}`.trimEnd();\n }\n case \"Grep\": {\n const where = str(input.path) || str(input.glob);\n return `Grep /${oneLine(str(input.pattern), 40)}/${where ? ` in ${base(where)}` : \"\"}`;\n }\n case \"Glob\":\n return `Glob ${oneLine(str(input.pattern), 60)}`;\n case \"mcp__edsger_out__submit_result\":\n return \"recording result\";\n default:\n return name;\n }\n}\n","import { existsSync, readFileSync, readdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { findBundledAssetsDir } from \"./assets.js\";\n\nexport interface EdsgerData {\n repo?: string;\n latest: unknown | null;\n history: unknown[];\n runs: Record<string, unknown>;\n}\n\n/**\n * Assemble a dashboard data object from an output directory: the latest report,\n * the compact history index, and the full per-run reports for drill-down. The\n * `latestFile` differs per kind (benchmark → report.json, diagrams → diagrams.json).\n */\nexport function assembleFrom(dir: string, latestFile: string): EdsgerData {\n const latest = readJson(join(dir, latestFile));\n const history = readJsonl(join(dir, \"history.jsonl\"));\n\n const runs: Record<string, unknown> = {};\n const runsDir = join(dir, \"runs\");\n if (existsSync(runsDir)) {\n for (const entry of readdirSync(runsDir)) {\n const report = readJson(join(runsDir, entry, latestFile));\n if (report) runs[entry] = report;\n }\n }\n\n const repo =\n latest && typeof latest === \"object\" && \"repo\" in latest\n ? (latest as { repo?: string }).repo\n : undefined;\n\n return { repo, latest, history, runs };\n}\n\n/** Assemble the benchmark dashboard data object from a benchmark output directory. */\nexport function assembleData(benchmarkDir: string): EdsgerData {\n return assembleFrom(benchmarkDir, \"report.json\");\n}\n\n/** Assemble the diagram dashboard data object from a diagrams output directory. */\nexport function assembleDiagramData(diagramsDir: string): EdsgerData {\n return assembleFrom(diagramsDir, \"diagrams.json\");\n}\n\n/** Assemble the mind-map viewer data object from a mindmap output directory. */\nexport function assembleMindmapData(mindmapDir: string): EdsgerData {\n return assembleFrom(mindmapDir, \"mindmap.json\");\n}\n\n/** Assemble the audit viewer data object from an audit output directory. */\nexport function assembleAuditData(auditDir: string): EdsgerData {\n return assembleFrom(auditDir, \"report.json\");\n}\n\n/** True when the directory holds at least a latest report or some history. */\nexport function hasData(data: EdsgerData): boolean {\n return Boolean(data.latest) || data.history.length > 0;\n}\n\n/**\n * Locate a bundled multi-file viewer directory (e.g. assets/viewer). `subdir`\n * selects which viewer, and `index` its entry html filename.\n */\nexport function findViewerDir(subdir = \"viewer\", index = \"index.html\"): string {\n const dir = join(findBundledAssetsDir(), subdir);\n if (!existsSync(join(dir, index))) {\n throw new Error(\n `Dashboard viewer assets not found (${subdir}/${index}). Reinstall edsger, or run ` +\n \"`npm run sync-viewer` in a dev checkout.\"\n );\n }\n return dir;\n}\n\n/** Locate the bundled diagram viewer directory (assets/diagrams-viewer). */\nexport function findDiagramViewerDir(): string {\n return findViewerDir(\"diagrams-viewer\", \"diagrams.html\");\n}\n\n/** Locate the bundled mind-map viewer directory (assets/mindmap-viewer). */\nexport function findMindmapViewerDir(): string {\n return findViewerDir(\"mindmap-viewer\", \"mindmap.html\");\n}\n\n/** Locate the bundled audit viewer directory (assets/audit-viewer). */\nexport function findAuditViewerDir(): string {\n return findViewerDir(\"audit-viewer\", \"audit.html\");\n}\n\n/** Read a single-file viewer template bundled under assets/. */\nexport function readSingleTemplate(file: string): string {\n const path = join(findBundledAssetsDir(), file);\n if (!existsSync(path)) {\n throw new Error(\n `Single-file viewer template not found (${file}). Reinstall edsger, or run \\`npm run sync-viewer\\`.`\n );\n }\n return readFileSync(path, \"utf8\");\n}\n\n/** Read the benchmark single-file viewer template (assets/viewer-single.html). */\nexport function readViewerSingleTemplate(): string {\n return readSingleTemplate(\"viewer-single.html\");\n}\n\n/** Read the diagram single-file viewer template (assets/diagrams-viewer-single.html). */\nexport function readDiagramViewerSingleTemplate(): string {\n return readSingleTemplate(\"diagrams-viewer-single.html\");\n}\n\n/** Read the mind-map single-file viewer template (assets/mindmap-viewer-single.html). */\nexport function readMindmapViewerSingleTemplate(): string {\n return readSingleTemplate(\"mindmap-viewer-single.html\");\n}\n\n/** Read the audit single-file viewer template (assets/audit-viewer-single.html). */\nexport function readAuditViewerSingleTemplate(): string {\n return readSingleTemplate(\"audit-viewer-single.html\");\n}\n\n/** Inject a data object into a single-file template under the given global name. */\nexport function renderSingleFileWith(\n template: string,\n data: EdsgerData,\n globalName: string\n): string {\n // JSON is embedded in a script tag; escape \"</\" so a \"</script>\" in any string cannot break out.\n const json = JSON.stringify(data).replace(/<\\//g, \"<\\\\/\");\n const tag = `<script>window.${globalName}=${json}</script>`;\n\n // Prefer the explicit placeholder comment in the template — it names the global\n // and is collision-proof. A naive replace of \"</head>\"/\"<body>\" is unsafe: the\n // inlined bundle (e.g. mermaid) can contain those exact strings, so the first\n // match may land inside JS and break the file. A function replacer also avoids\n // String.replace's special \"$\" patterns firing on arbitrary data.\n const placeholder = new RegExp(`<!--[^>]*${globalName}[^>]*-->`);\n if (placeholder.test(template)) return template.replace(placeholder, () => tag);\n\n // Fallback: inject just before the first <script> so the global is set first.\n const scriptIdx = template.indexOf(\"<script\");\n if (scriptIdx !== -1) return template.slice(0, scriptIdx) + tag + template.slice(scriptIdx);\n\n // Last resort.\n const headIdx = template.lastIndexOf(\"</head>\");\n if (headIdx !== -1) return template.slice(0, headIdx) + tag + template.slice(headIdx);\n return tag + template;\n}\n\n/** Inject the benchmark data as window.__EDSGER_DATA__. */\nexport function renderSingleFile(template: string, data: EdsgerData): string {\n return renderSingleFileWith(template, data, \"__EDSGER_DATA__\");\n}\n\n/** Inject the diagram data as window.__EDSGER_DIAGRAMS__. */\nexport function renderDiagramsSingleFile(template: string, data: EdsgerData): string {\n return renderSingleFileWith(template, data, \"__EDSGER_DIAGRAMS__\");\n}\n\n/** Inject the mind-map data as window.__EDSGER_MINDMAP__. */\nexport function renderMindmapSingleFile(template: string, data: EdsgerData): string {\n return renderSingleFileWith(template, data, \"__EDSGER_MINDMAP__\");\n}\n\n/** Inject the audit data as window.__EDSGER_AUDIT__. */\nexport function renderAuditSingleFile(template: string, data: EdsgerData): string {\n return renderSingleFileWith(template, data, \"__EDSGER_AUDIT__\");\n}\n\nfunction readJson(path: string): unknown | null {\n try {\n return JSON.parse(readFileSync(path, \"utf8\"));\n } catch {\n return null;\n }\n}\n\nfunction readJsonl(path: string): unknown[] {\n if (!existsSync(path)) return [];\n const out: unknown[] = [];\n for (const line of readFileSync(path, \"utf8\").split(\"\\n\")) {\n const t = line.trim();\n if (!t) continue;\n try {\n out.push(JSON.parse(t));\n } catch {\n // skip malformed lines\n }\n }\n return out;\n}\n","import { execFileSync } from \"node:child_process\";\n\nexport interface GitInfo {\n /** Short commit SHA of HEAD, or null when not a git repo. */\n commit: string | null;\n /** Current branch name, or null when detached/unavailable. */\n branch: string | null;\n /** True when the working tree has uncommitted changes. */\n dirty: boolean;\n}\n\nfunction tryGit(args: string[], cwd: string): string | null {\n try {\n return execFileSync(\"git\", args, {\n cwd,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"]\n }).trim();\n } catch {\n return null;\n }\n}\n\n/** Best-effort git metadata for the repo at `cwd`; never throws. */\nexport function gitInfo(cwd: string): GitInfo {\n const commit = tryGit([\"rev-parse\", \"--short\", \"HEAD\"], cwd);\n const branch = tryGit([\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], cwd);\n const status = tryGit([\"status\", \"--porcelain\"], cwd);\n return {\n commit,\n branch: branch && branch !== \"HEAD\" ? branch : null,\n dirty: Boolean(status && status.length > 0)\n };\n}\n","import { spawn } from \"node:child_process\";\n\n/** Open a URL or file path in the OS default browser; best-effort, never throws. */\nexport function openInBrowser(target: string): void {\n const platform = process.platform;\n const cmd = platform === \"darwin\" ? \"open\" : platform === \"win32\" ? \"cmd\" : \"xdg-open\";\n const args = platform === \"win32\" ? [\"/c\", \"start\", \"\", target] : [target];\n try {\n spawn(cmd, args, { stdio: \"ignore\", detached: true }).unref();\n } catch {\n // ignore — the URL is printed for the user to open manually\n }\n}\n","import { createReadStream, existsSync, statSync } from \"node:fs\";\nimport { createServer } from \"node:http\";\nimport { extname, join, normalize } from \"node:path\";\nimport pc from \"picocolors\";\nimport { openInBrowser } from \"./open.js\";\nimport { log } from \"./logger.js\";\nimport type { EdsgerData } from \"./dashboard.js\";\n\nconst MIME: Record<string, string> = {\n \".html\": \"text/html; charset=utf-8\",\n \".js\": \"text/javascript; charset=utf-8\",\n \".css\": \"text/css; charset=utf-8\",\n \".json\": \"application/json; charset=utf-8\",\n \".svg\": \"image/svg+xml\",\n \".map\": \"application/json\",\n \".ico\": \"image/x-icon\",\n \".woff2\": \"font/woff2\",\n \".woff\": \"font/woff\"\n};\n\nexport interface ViewerServerOptions {\n /** Directory holding the built viewer (index + assets). */\n viewerDir: string;\n /** Entry html filename served for `/` and as the SPA fallback. */\n indexFile: string;\n /** URL path that returns the freshly-assembled data JSON. */\n dataRoute: string;\n /** Assemble the data object; called per request so re-runs show on refresh. */\n getData: () => EdsgerData;\n port: number;\n host: string;\n open: boolean;\n /** Shown in the \"no data yet\" hint, e.g. \".edsger/diagrams\" + a command. */\n emptyHint?: string;\n}\n\n/**\n * Serve a bundled single-page viewer, assembling its data fresh on each request.\n * Shared by `edsger serve` (benchmark) and `edsger diagram serve`.\n */\nexport async function startViewerServer(opts: ViewerServerOptions): Promise<number> {\n const server = createServer((req, res) => {\n const url = (req.url ?? \"/\").split(\"?\")[0] ?? \"/\";\n\n if (url === opts.dataRoute) {\n res.writeHead(200, {\n \"content-type\": \"application/json; charset=utf-8\",\n \"cache-control\": \"no-store\"\n });\n res.end(JSON.stringify(opts.getData()));\n return;\n }\n\n const rel = url === \"/\" ? opts.indexFile : decodeURIComponent(url.replace(/^\\/+/, \"\"));\n const safe = normalize(rel).replace(/^(\\.\\.(?:[/\\\\]|$))+/, \"\");\n let file = join(opts.viewerDir, safe);\n if (!file.startsWith(opts.viewerDir)) {\n res.writeHead(403);\n res.end(\"forbidden\");\n return;\n }\n // SPA fallback: unknown paths serve the entry html.\n if (!existsSync(file) || statSync(file).isDirectory())\n file = join(opts.viewerDir, opts.indexFile);\n res.writeHead(200, { \"content-type\": MIME[extname(file)] ?? \"application/octet-stream\" });\n createReadStream(file).pipe(res);\n });\n\n return new Promise<number>((resolve, reject) => {\n server.on(\"error\", reject);\n server.listen(opts.port, opts.host, () => {\n const addr = server.address();\n const port = typeof addr === \"object\" && addr ? addr.port : opts.port;\n const shownHost = opts.host === \"0.0.0.0\" ? \"localhost\" : opts.host;\n const url = `http://${shownHost}:${port}/`;\n\n if (opts.emptyHint) log.warn(opts.emptyHint);\n log.success(`Dashboard at ${pc.bold(pc.cyan(url))} ${pc.dim(\"(Ctrl-C to stop)\")}`);\n if (opts.open) openInBrowser(url);\n });\n\n const shutdown = (): void => {\n server.close(() => resolve(0));\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n });\n}\n","import type { AuditStandard, Severity } from \"../types.js\";\nimport type { AuditFinding, AuditResult } from \"./schema.js\";\n\nexport const SEVERITY_ORDER: Severity[] = [\"critical\", \"high\", \"medium\", \"low\", \"info\"];\n\n/** Fallback cap when the standard's policy does not set one. */\nexport const DEFAULT_MAX_FINDINGS = 60;\n\nconst SEVERITY_RANK: Record<Severity, number> = {\n critical: 4,\n high: 3,\n medium: 2,\n low: 1,\n info: 0\n};\n\n/** A finding after organisation; duplicates are folded into `moreLocations`. */\nexport interface OrganizedFinding extends AuditFinding {\n /** Extra \"file:line\" locations merged from findings with the same title. */\n moreLocations: string[];\n}\n\nexport interface AuditGroup {\n id: string;\n title: string;\n findings: OrganizedFinding[];\n}\n\nexport interface OrganizedAudit {\n standardName: string;\n standardVersion: string;\n summary: string;\n positives: string[];\n /** Reported findings, most severe first (deduplicated and capped). */\n findings: OrganizedFinding[];\n /** Findings grouped by dimension, in the standard's dimension order. */\n groups: AuditGroup[];\n counts: Record<Severity, number>;\n total: number;\n /** Findings dropped by the policy cap (lowest severity first). */\n omitted: number;\n /** Low-effort findings worth fixing first, most severe first. */\n quickWins: OrganizedFinding[];\n}\n\n/**\n * Deterministically organise the agent's findings: fold duplicates (same\n * dimension + title) into one finding with extra locations, severity-sort,\n * apply the policy's findings cap, group by the standard's dimensions\n * (unknown dimension ids fall into \"other\"), and surface quick wins.\n */\nexport function organizeAudit(standard: AuditStandard, result: AuditResult): OrganizedAudit {\n const merged = mergeDuplicates(result.findings ?? []);\n merged.sort((a, b) => SEVERITY_RANK[b.severity] - SEVERITY_RANK[a.severity]);\n\n // Keep reports readable: drop the lowest-severity tail beyond the cap.\n const cap = Math.max(1, standard.policy?.maxFindings ?? DEFAULT_MAX_FINDINGS);\n const omitted = Math.max(0, merged.length - cap);\n const findings = merged.slice(0, cap);\n\n const known = new Map(standard.dimensions.map((d) => [d.id, d.title]));\n const groups: AuditGroup[] = standard.dimensions.map((d) => ({\n id: d.id,\n title: d.title,\n findings: []\n }));\n const other: AuditGroup = { id: \"other\", title: \"Other\", findings: [] };\n const byId = new Map(groups.map((g) => [g.id, g]));\n for (const f of findings) {\n (known.has(f.dimension) ? byId.get(f.dimension)! : other).findings.push(f);\n }\n if (other.findings.length) groups.push(other);\n\n const counts: Record<Severity, number> = { critical: 0, high: 0, medium: 0, low: 0, info: 0 };\n for (const f of findings) counts[f.severity]++;\n\n const quickWins = findings.filter((f) => f.effort === \"quick\" && f.severity !== \"info\");\n\n return {\n standardName: standard.name,\n standardVersion: standard.version,\n summary: result.summary,\n positives: result.positives ?? [],\n findings,\n groups: groups.filter((g) => g.findings.length > 0),\n counts,\n total: findings.length,\n omitted,\n quickWins\n };\n}\n\n/**\n * Fold findings that share a dimension and (case-insensitive) title into one:\n * the most severe instance wins; the others contribute their locations.\n */\nfunction mergeDuplicates(findings: AuditFinding[]): OrganizedFinding[] {\n const byKey = new Map<string, OrganizedFinding>();\n const out: OrganizedFinding[] = [];\n for (const f of findings) {\n const key = `${f.dimension}\u0000${f.title.trim().toLowerCase()}`;\n const seen = byKey.get(key);\n if (!seen) {\n const first: OrganizedFinding = { ...f, moreLocations: [] };\n byKey.set(key, first);\n out.push(first);\n continue;\n }\n // Keep the most severe instance as the primary; fold the other's location in.\n const [primary, extra] =\n SEVERITY_RANK[f.severity] > SEVERITY_RANK[seen.severity]\n ? [{ ...f, moreLocations: seen.moreLocations }, seen]\n : [seen, f];\n const loc = locationKey(extra);\n const primaryLoc = locationKey(primary);\n if (loc && loc !== primaryLoc && !primary.moreLocations.includes(loc)) {\n primary.moreLocations.push(loc);\n }\n if (primary !== seen) {\n out[out.indexOf(seen)] = primary;\n byKey.set(key, primary);\n }\n }\n return out;\n}\n\n/** True when any finding is at or above the given severity threshold. */\nexport function hasFindingsAtOrAbove(organized: OrganizedAudit, threshold: Severity): boolean {\n return organized.findings.some((f) => SEVERITY_RANK[f.severity] >= SEVERITY_RANK[threshold]);\n}\n\n/** Render the audit as a human-readable Markdown report. */\nexport function renderAuditMarkdown(\n organized: OrganizedAudit,\n meta: { repo: string; languages: string[]; layers: string[]; generatedAt: string; model: string }\n): string {\n const lines: string[] = [];\n lines.push(`# Edsger Audit Report`);\n lines.push(\"\");\n lines.push(`> ${organized.summary}`);\n lines.push(\"\");\n lines.push(`| Field | Value |`);\n lines.push(`| --- | --- |`);\n lines.push(`| Repository | \\`${meta.repo}\\` |`);\n lines.push(`| Languages | ${meta.languages.join(\", \") || \"n/a\"} |`);\n lines.push(`| Standard | ${organized.standardName} v${organized.standardVersion} |`);\n lines.push(`| Sources | ${meta.layers.join(\" → \")} |`);\n lines.push(`| Model | ${meta.model} |`);\n lines.push(`| Generated | ${meta.generatedAt} |`);\n lines.push(\"\");\n\n lines.push(`## Findings by severity`);\n lines.push(\"\");\n lines.push(`| Severity | Count |`);\n lines.push(`| --- | ---: |`);\n for (const s of SEVERITY_ORDER) {\n if (organized.counts[s]) lines.push(`| ${s} | ${organized.counts[s]} |`);\n }\n lines.push(`| **total** | **${organized.total}** |`);\n lines.push(\"\");\n if (organized.omitted > 0) {\n lines.push(\n `_${organized.omitted} lower-severity finding(s) omitted by the standard's ` +\n `maxFindings policy._`\n );\n lines.push(\"\");\n }\n\n if (organized.quickWins.length) {\n lines.push(`## Quick wins`);\n lines.push(\"\");\n for (const f of organized.quickWins) {\n lines.push(`- **[${f.severity}] ${f.title}** — ${location(f)}`);\n }\n lines.push(\"\");\n }\n\n lines.push(`## Findings by dimension`);\n lines.push(\"\");\n for (const g of organized.groups) {\n lines.push(`### ${g.title} (${g.findings.length})`);\n lines.push(\"\");\n for (const f of g.findings) {\n lines.push(`- **[${f.severity}] ${f.title}** — ${location(f)} _(effort: ${f.effort})_`);\n lines.push(` - ${f.detail}`);\n if (f.moreLocations.length) {\n lines.push(` - _Also in:_ ${f.moreLocations.map((l) => `\\`${l}\\``).join(\", \")}`);\n }\n if (f.suggestion) lines.push(` - _Fix:_ ${f.suggestion}`);\n }\n lines.push(\"\");\n }\n\n if (organized.positives.length) {\n lines.push(`## What the repo does well`);\n lines.push(\"\");\n for (const p of organized.positives) lines.push(`- ${p}`);\n lines.push(\"\");\n }\n\n lines.push(`---`);\n lines.push(`<sub>Generated by [edsger](https://www.npmjs.com/package/edsger).</sub>`);\n return lines.join(\"\\n\");\n}\n\nfunction location(f: OrganizedFinding): string {\n const primary = locationKey(f);\n const more = f.moreLocations.length ? ` (+${f.moreLocations.length} more)` : \"\";\n return primary ? `\\`${primary}\\`${more}` : `repo-wide${more}`;\n}\n\n/** \"file:line\" (or \"file\") for a finding, or \"\" when it is repo-wide. */\nfunction locationKey(f: AuditFinding): string {\n if (!f.file || f.file === \"-\") return \"\";\n return f.line ? `${f.file}:${f.line}` : f.file;\n}\n","import { z } from \"zod\";\n\n/** Per-criterion score the agent must produce for a benchmark. */\nexport const CriterionScoreSchema = z.object({\n id: z.string().describe(\"Criterion id from the rubric\"),\n score: z.number().describe(\"Score for this criterion, 0..scoreScale\"),\n justification: z.string().describe(\"Why this score, in one or two sentences\"),\n evidence: z.array(z.string()).default([]).describe(\"File paths / snippets supporting the score\")\n});\n\nexport const CategoryScoreSchema = z.object({\n id: z.string().describe(\"Category id from the rubric\"),\n criteria: z.array(CriterionScoreSchema)\n});\n\nexport const BenchmarkResultSchema = z.object({\n categories: z.array(CategoryScoreSchema),\n summary: z.string().describe(\"2-4 sentence overall assessment\"),\n strengths: z.array(z.string()).default([]),\n weaknesses: z.array(z.string()).default([]),\n recommendations: z\n .array(\n z.object({\n priority: z.enum([\"high\", \"medium\", \"low\"]),\n title: z.string(),\n detail: z.string()\n })\n )\n .default([])\n});\nexport type BenchmarkResult = z.infer<typeof BenchmarkResultSchema>;\n\nconst SeveritySchema = z.enum([\"critical\", \"high\", \"medium\", \"low\", \"info\"]);\n\nexport const ReviewFindingSchema = z.object({\n focusArea: z.string().describe(\"Focus area id this finding relates to\"),\n severity: SeveritySchema,\n file: z.string().describe(\"Repo-relative file path, or '-' if general\"),\n line: z.number().nullable().default(null).describe(\"1-based line in the new file, if applicable\"),\n title: z.string(),\n detail: z.string().describe(\"What is wrong and why it matters\"),\n suggestion: z.string().nullable().default(null).describe(\"Concrete suggested fix\")\n});\n\nexport const ReviewResultSchema = z.object({\n summary: z.string().describe(\"Overall summary of the change and review\"),\n verdict: z.enum([\"approve\", \"request_changes\", \"comment\"]),\n findings: z.array(ReviewFindingSchema).default([])\n});\nexport type ReviewResult = z.infer<typeof ReviewResultSchema>;\nexport type ReviewFinding = z.infer<typeof ReviewFindingSchema>;\n\n/** A single issue found by a repository-wide audit. */\nexport const AuditFindingSchema = z.object({\n dimension: z.string().describe(\"Dimension id from the audit standard this finding relates to\"),\n severity: SeveritySchema,\n file: z.string().describe(\"Repo-relative file path, or '-' if repo-wide\"),\n line: z.number().nullable().default(null).describe(\"1-based line number, if applicable\"),\n title: z.string().describe(\"Short, specific statement of the problem\"),\n detail: z.string().describe(\"What is wrong and why it is unprofessional, outdated, or risky\"),\n suggestion: z.string().nullable().default(null).describe(\"Concrete fix or modern replacement\"),\n effort: z\n .enum([\"quick\", \"moderate\", \"involved\"])\n .default(\"moderate\")\n .describe(\"Rough effort to fix: quick (<1h), moderate (a day), involved (multi-day)\")\n});\n\nexport const AuditResultSchema = z.object({\n summary: z.string().describe(\"3-5 sentence honest overall assessment of the repository\"),\n findings: z.array(AuditFindingSchema).default([]),\n positives: z\n .array(z.string())\n .default([])\n .describe(\"Things the repository genuinely does well (keeps the critique fair)\")\n});\nexport type AuditResult = z.infer<typeof AuditResultSchema>;\nexport type AuditFinding = z.infer<typeof AuditFindingSchema>;\n\nexport const ResolveResultSchema = z.object({\n summary: z.string().describe(\"What was changed and why\"),\n changes: z.array(z.object({ file: z.string(), description: z.string() })).default([]),\n testsRun: z.string().nullable().default(null).describe(\"Command used to verify, and its outcome\"),\n remaining: z.array(z.string()).default([]).describe(\"Anything still unresolved\")\n});\nexport type ResolveResult = z.infer<typeof ResolveResultSchema>;\n\n/** A single diagram the agent produced for a repository. */\nexport const GeneratedDiagramSchema = z.object({\n id: z.string().describe(\"Diagram id from the catalog, or a descriptive slug if bespoke\"),\n groupId: z.string().describe(\"Catalog group id this diagram belongs to (e.g. architecture)\"),\n title: z.string().describe(\"Human-readable diagram title\"),\n type: z\n .string()\n .describe(\n \"Mermaid diagram type used, e.g. flowchart, erDiagram, sequenceDiagram, classDiagram\"\n ),\n mermaid: z.string().describe(\"Valid Mermaid source for the diagram (renders in HTML/Markdown)\"),\n description: z\n .string()\n .describe(\"One or two sentences: what the diagram shows and why it applies to this repo\"),\n evidence: z.array(z.string()).default([]).describe(\"Repo files this diagram was derived from\")\n});\n\nexport const DiagramsResultSchema = z.object({\n profile: z\n .object({\n summary: z.string().describe(\"2-4 sentence characterisation of the project\"),\n kinds: z\n .array(z.string())\n .default([])\n .describe(\"Project kind tags, e.g. cli, rest-api, spa, library, data-pipeline, monorepo\"),\n characteristics: z\n .array(z.string())\n .default([])\n .describe(\n \"Notable traits that drove diagram selection (owns a Postgres DB, deploys to k8s, …)\"\n )\n })\n .describe(\"The project profile that justifies which diagrams were chosen\"),\n diagrams: z\n .array(GeneratedDiagramSchema)\n .describe(\"The diagrams selected for and generated from this repository\"),\n notes: z\n .string()\n .nullable()\n .default(null)\n .describe(\"Optional notes, e.g. diagrams intentionally skipped and why\")\n});\nexport type DiagramsResult = z.infer<typeof DiagramsResultSchema>;\nexport type GeneratedDiagram = z.infer<typeof GeneratedDiagramSchema>;\n\n/**\n * One node of the implementation mind map. The agent returns the tree as a\n * FLAT list (parent references by id) because a flat shape is far more robust\n * for structured output than a recursive schema; the CLI assembles the tree.\n */\nexport const MindmapNodeSchema = z.object({\n id: z.string().describe(\"Unique kebab-case node id, e.g. 'core-flows' or 'http-api'\"),\n parentId: z\n .string()\n .nullable()\n .default(null)\n .describe(\"id of the parent node; null ONLY for the single root node\"),\n title: z.string().describe(\"Short outline-bullet title, 2-6 words\"),\n summary: z.string().describe(\"One or two sentences that are true and specific to this codebase\"),\n kind: z\n .string()\n .default(\"topic\")\n .describe(\"Tag: area, module, component, flow, step, data, external, config, or topic\"),\n files: z\n .array(z.string())\n .default([])\n .describe(\"Repo-relative files this node is grounded in (expected for leaf nodes)\")\n});\n\nexport const MindmapResultSchema = z.object({\n profile: z\n .object({\n summary: z.string().describe(\"2-4 sentence characterisation of the project\"),\n kinds: z\n .array(z.string())\n .default([])\n .describe(\"Project kind tags, e.g. cli, rest-api, spa, library, data-pipeline, monorepo\"),\n characteristics: z\n .array(z.string())\n .default([])\n .describe(\"Notable traits that shaped the map (owns a Postgres DB, monorepo, …)\")\n })\n .describe(\"The project profile behind the map's shape\"),\n nodes: z\n .array(MindmapNodeSchema)\n .describe(\n \"The whole mind map as a flat node list: exactly one root (parentId=null), \" +\n \"children listed in reading order after their parent\"\n ),\n notes: z\n .string()\n .nullable()\n .default(null)\n .describe(\"Optional notes, e.g. areas intentionally left out and why\")\n});\nexport type MindmapResult = z.infer<typeof MindmapResultSchema>;\nexport type MindmapFlatNode = z.infer<typeof MindmapNodeSchema>;\n","import { appendFileSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { basename, join } from \"node:path\";\nimport pc from \"picocolors\";\nimport { resolveStandard } from \"../core/assets.js\";\nimport { loadConfig } from \"../core/config.js\";\nimport { runAgent } from \"../core/agent.js\";\nimport { gitInfo } from \"../core/git.js\";\nimport { log } from \"../core/logger.js\";\nimport { renderBenchmarkMarkdown, scoreBenchmark, type ScoredBenchmark } from \"../core/report.js\";\nimport { BenchmarkResultSchema } from \"../core/schema.js\";\nimport type { BenchmarkStandard, GlobalOptions } from \"../types.js\";\n\nexport interface BenchmarkOptions extends GlobalOptions {\n /** Directory to write the report into (relative to repo). */\n out: string;\n /** Skip writing files into the repo. */\n noWrite: boolean;\n}\n\nexport async function runBenchmark(opts: BenchmarkOptions): Promise<number> {\n const { config, path: configPath } = loadConfig(opts.cwd);\n const configDir = configPath ? join(configPath, \"..\") : opts.cwd;\n const resolved = resolveStandard(\"benchmark\", opts, config, configDir);\n const standard = resolved.standard as BenchmarkStandard;\n\n log.info(\n `Benchmarking ${pc.bold(basename(opts.cwd))} against ${pc.bold(standard.name)} ` +\n `(languages: ${resolved.languages.join(\", \") || \"generic\"})`\n );\n log.debug(`standard layers: ${resolved.layers.join(\" → \")}`);\n\n const prompt = buildPrompt(standard, opts.cwd);\n const { result, costUsd, numTurns } = await runAgent({\n prompt,\n cwd: opts.cwd,\n model: opts.model,\n maxTurns: opts.maxTurns,\n timeoutMs: opts.timeoutMs,\n allowWrite: false,\n verbose: opts.verbose,\n resultShape: BenchmarkResultSchema.shape,\n systemPromptAppend:\n \"You are Edsger, a meticulous staff-level engineer performing an objective \" +\n \"repository assessment. Inspect the actual code and configuration before scoring. \" +\n \"Be evidence-driven and fair; cite concrete files. Do not modify any files.\"\n });\n\n if (!result) {\n log.error(\n \"The agent did not produce a result. Try increasing --max-turns or check credentials.\"\n );\n return 1;\n }\n\n const scored = scoreBenchmark(standard, result);\n const generatedAt = new Date().toISOString();\n // Filesystem-safe UTC run id (e.g. 20260701T034500Z): lexicographic order == chronological.\n const runId = generatedAt.replace(/[-:]/g, \"\").replace(/\\.\\d+Z$/, \"Z\");\n // Correlate each score with the code state it was measured against.\n const git = gitInfo(opts.cwd);\n const md = renderBenchmarkMarkdown(scored, {\n repo: basename(opts.cwd),\n languages: resolved.languages,\n layers: resolved.layers,\n generatedAt,\n model: opts.model\n });\n\n const jsonReport = {\n schema: \"edsger.benchmark/1\",\n runId,\n generatedAt,\n model: opts.model,\n repo: basename(opts.cwd),\n git,\n languages: resolved.languages,\n standard: { name: standard.name, version: standard.version, layers: resolved.layers },\n overall: scored.overall,\n grade: scored.grade,\n categories: scored.categories,\n summary: scored.summary,\n strengths: scored.strengths,\n weaknesses: scored.weaknesses,\n recommendations: scored.recommendations,\n costUsd\n };\n\n // Compact, append-only trend index: one line per run, cheap to read for charts.\n const historyRecord = {\n runId,\n generatedAt,\n commit: git.commit,\n branch: git.branch,\n dirty: git.dirty,\n model: opts.model,\n standardVersion: standard.version,\n overall: scored.overall,\n grade: scored.grade,\n categories: Object.fromEntries(scored.categories.map((c) => [c.id, c.fraction])),\n costUsd\n };\n\n if (!opts.noWrite && !opts.dryRun) {\n const baseDir = join(opts.cwd, opts.out);\n const mdOut = md + \"\\n\";\n const jsonOut = JSON.stringify(jsonReport, null, 2) + \"\\n\";\n\n // Archive this run under runs/<timestamp>/ so history from repeated runs is preserved.\n const runDir = join(baseDir, \"runs\", runId);\n mkdirSync(runDir, { recursive: true });\n writeFileSync(join(runDir, \"report.md\"), mdOut, \"utf8\");\n writeFileSync(join(runDir, \"report.json\"), jsonOut, \"utf8\");\n\n // Always refresh the canonical top-level report as the stable \"latest\" pointer\n // (unchanged path, so CI / diffs keep working).\n writeFileSync(join(baseDir, \"report.md\"), mdOut, \"utf8\");\n writeFileSync(join(baseDir, \"report.json\"), jsonOut, \"utf8\");\n\n // Append one compact line to the trend index (source of truth for charts/history).\n appendFileSync(join(baseDir, \"history.jsonl\"), JSON.stringify(historyRecord) + \"\\n\", \"utf8\");\n\n log.success(\n `Report written to ${pc.bold(join(opts.out, \"report.md\"))} ` +\n `${pc.dim(`(run archived at ${join(opts.out, \"runs\", runId)})`)}`\n );\n }\n\n printSummary(scored, numTurns, costUsd);\n if (opts.json) process.stdout.write(JSON.stringify(jsonReport, null, 2) + \"\\n\");\n return 0;\n}\n\nfunction printSummary(scored: ScoredBenchmark, numTurns: number, costUsd: number): void {\n log.heading(`Score: ${scored.overall}/100 (Grade ${scored.grade})`);\n for (const c of scored.categories) {\n const pct = Math.round(c.fraction * 100);\n process.stderr.write(` ${bar(pct)} ${String(pct).padStart(3)}% ${c.name}\\n`);\n }\n log.step(`${numTurns} turns · ~$${costUsd.toFixed(3)}`);\n}\n\nfunction bar(pct: number): string {\n const width = 20;\n const filled = Math.round((pct / 100) * width);\n const color = pct >= 80 ? pc.green : pct >= 60 ? pc.yellow : pc.red;\n return color(\"█\".repeat(filled)) + pc.dim(\"░\".repeat(width - filled));\n}\n\nfunction buildPrompt(standard: BenchmarkStandard, cwd: string): string {\n const rubric = standard.categories\n .map((cat) => {\n const crits = cat.criteria\n .map((cr) => {\n const anchors = cr.rubric\n ? Object.entries(cr.rubric)\n .map(([k, v]) => ` - ${k}: ${v}`)\n .join(\"\\n\")\n : \"\";\n return (\n ` - id: ${cr.id}\\n` +\n ` title: ${cr.title}\\n` +\n ` guidance: ${cr.guidance.trim()}` +\n (anchors ? `\\n anchors:\\n${anchors}` : \"\")\n );\n })\n .join(\"\\n\");\n return `- category: ${cat.id} (${cat.name}, weight ${cat.weight})\\n${crits}`;\n })\n .join(\"\\n\");\n\n return [\n `Assess the repository located at: ${cwd}`,\n ``,\n `Score it against the rubric below. Each criterion is scored from 0 to ${standard.scoreScale}`,\n `(0 = absent/harmful, ${standard.scoreScale} = exemplary), using the level anchors as a guide.`,\n ``,\n `Method:`,\n `1. Explore the repository structure, key source files, configuration, CI, tests, and docs.`,\n ` Use Read/Grep/Glob and read-only Bash (e.g. ls, cat, git log). Do NOT modify anything.`,\n `2. For each criterion, gather concrete evidence (file paths) before deciding a score.`,\n `3. Be objective and consistent. Absence of evidence for a practice means a low score.`,\n `4. When finished, call submit_result exactly once with a score for EVERY criterion id below,`,\n ` grouped by category. Include a short justification and evidence paths for each.`,\n ``,\n `Rubric:`,\n rubric\n ].join(\"\\n\");\n}\n","import type { BenchmarkStandard, Category, Criterion } from \"../types.js\";\nimport type { BenchmarkResult } from \"./schema.js\";\nimport { log } from \"./logger.js\";\n\nexport interface ScoredCriterion {\n id: string;\n title: string;\n weight: number;\n rawScore: number;\n maxScore: number;\n fraction: number;\n justification: string;\n evidence: string[];\n}\n\nexport interface ScoredCategory {\n id: string;\n name: string;\n weight: number; // normalised to sum 100 across categories\n fraction: number; // 0..1\n points: number; // weight * fraction\n criteria: ScoredCriterion[];\n}\n\nexport interface ScoredBenchmark {\n standardName: string;\n standardVersion: string;\n overall: number; // 0..100\n grade: string;\n categories: ScoredCategory[];\n summary: string;\n strengths: string[];\n weaknesses: string[];\n recommendations: BenchmarkResult[\"recommendations\"];\n}\n\n/** Deterministically aggregate the agent's per-criterion scores. */\nexport function scoreBenchmark(\n standard: BenchmarkStandard,\n result: BenchmarkResult\n): ScoredBenchmark {\n const scale = standard.scoreScale || 4;\n const totalWeight = standard.categories.reduce((s, c) => s + c.weight, 0) || 1;\n\n // The agent may echo ids bare (\"no-hardcoded-secrets\") or category-prefixed\n // (\"security/no-hardcoded-secrets\"); normalise to the last path segment so a\n // lookup matches regardless of which form it returned.\n const tail = (id: string): string => id.slice(id.lastIndexOf(\"/\") + 1);\n\n interface Meta {\n score: number;\n justification: string;\n evidence: string[];\n }\n const byKey = new Map<string, Meta>();\n const byCrit = new Map<string, Meta>();\n for (const cat of result.categories) {\n for (const cr of cat.criteria) {\n const meta: Meta = {\n score: cr.score,\n justification: cr.justification,\n evidence: cr.evidence ?? []\n };\n byKey.set(`${tail(cat.id)}/${tail(cr.id)}`, meta);\n byCrit.set(tail(cr.id), meta); // fallback when the category id differs\n }\n }\n\n let matched = 0;\n const categories: ScoredCategory[] = standard.categories.map((cat: Category) => {\n const critWeightTotal = cat.criteria.reduce((s, c) => s + (c.weight ?? 1), 0) || 1;\n const scored: ScoredCriterion[] = cat.criteria.map((cr: Criterion) => {\n const meta = byKey.get(`${tail(cat.id)}/${tail(cr.id)}`) ?? byCrit.get(tail(cr.id));\n if (meta) matched += 1;\n const raw = clamp(meta?.score ?? 0, 0, scale);\n return {\n id: cr.id,\n title: cr.title,\n weight: cr.weight ?? 1,\n rawScore: raw,\n maxScore: scale,\n fraction: raw / scale,\n justification: meta?.justification ?? \"Not assessed.\",\n evidence: meta?.evidence ?? []\n };\n });\n const fraction = scored.reduce((s, c) => s + c.fraction * c.weight, 0) / critWeightTotal;\n const normWeight = (cat.weight / totalWeight) * 100;\n return {\n id: cat.id,\n name: cat.name,\n weight: round(normWeight, 1),\n fraction,\n points: round(normWeight * fraction, 1),\n criteria: scored\n };\n });\n\n const totalCriteria = standard.categories.reduce((s, c) => s + c.criteria.length, 0);\n if (result.categories.length > 0 && matched === 0) {\n log.warn(\n \"The agent returned scores but none matched the rubric's criterion ids — \" +\n \"reporting 0. This is a scoring bug, not a real result.\"\n );\n } else if (matched < totalCriteria) {\n log.warn(`Only ${matched}/${totalCriteria} criteria were scored; the rest default to 0.`);\n }\n\n const overall = round(\n categories.reduce((s, c) => s + c.points, 0),\n 1\n );\n\n return {\n standardName: standard.name,\n standardVersion: standard.version,\n overall,\n grade: gradeFor(overall),\n categories,\n summary: result.summary,\n strengths: result.strengths ?? [],\n weaknesses: result.weaknesses ?? [],\n recommendations: result.recommendations ?? []\n };\n}\n\nexport function gradeFor(score: number): string {\n if (score >= 90) return \"A\";\n if (score >= 80) return \"B\";\n if (score >= 70) return \"C\";\n if (score >= 60) return \"D\";\n return \"F\";\n}\n\n/** Render a human-readable Markdown report. */\nexport function renderBenchmarkMarkdown(\n scored: ScoredBenchmark,\n meta: { repo: string; languages: string[]; layers: string[]; generatedAt: string; model: string }\n): string {\n const lines: string[] = [];\n lines.push(`# Edsger Benchmark Report`);\n lines.push(\"\");\n lines.push(`**Score: ${scored.overall} / 100 (Grade ${scored.grade})**`);\n lines.push(\"\");\n lines.push(`> ${scored.summary}`);\n lines.push(\"\");\n lines.push(`| Field | Value |`);\n lines.push(`| --- | --- |`);\n lines.push(`| Repository | \\`${meta.repo}\\` |`);\n lines.push(`| Languages | ${meta.languages.join(\", \") || \"n/a\"} |`);\n lines.push(`| Standard | ${scored.standardName} v${scored.standardVersion} |`);\n lines.push(`| Sources | ${meta.layers.join(\" → \")} |`);\n lines.push(`| Model | ${meta.model} |`);\n lines.push(`| Generated | ${meta.generatedAt} |`);\n lines.push(\"\");\n\n lines.push(`## Category scores`);\n lines.push(\"\");\n lines.push(`| Category | Weight | Score | Weighted |`);\n lines.push(`| --- | ---: | ---: | ---: |`);\n for (const c of scored.categories) {\n lines.push(`| ${c.name} | ${c.weight}% | ${Math.round(c.fraction * 100)}% | ${c.points} |`);\n }\n lines.push(`| **Overall** | **100%** | | **${scored.overall}** |`);\n lines.push(\"\");\n\n if (scored.strengths.length) {\n lines.push(`## Strengths`);\n lines.push(\"\");\n for (const s of scored.strengths) lines.push(`- ${s}`);\n lines.push(\"\");\n }\n if (scored.weaknesses.length) {\n lines.push(`## Weaknesses`);\n lines.push(\"\");\n for (const w of scored.weaknesses) lines.push(`- ${w}`);\n lines.push(\"\");\n }\n if (scored.recommendations.length) {\n lines.push(`## Recommendations`);\n lines.push(\"\");\n for (const r of scored.recommendations) {\n lines.push(`- **[${r.priority}] ${r.title}** — ${r.detail}`);\n }\n lines.push(\"\");\n }\n\n lines.push(`## Detailed findings`);\n lines.push(\"\");\n for (const c of scored.categories) {\n lines.push(`### ${c.name} — ${Math.round(c.fraction * 100)}%`);\n lines.push(\"\");\n for (const cr of c.criteria) {\n lines.push(`- **${cr.title}** (${cr.rawScore}/${cr.maxScore}) — ${cr.justification}`);\n for (const e of cr.evidence) lines.push(` - \\`${e}\\``);\n }\n lines.push(\"\");\n }\n\n lines.push(`---`);\n lines.push(`<sub>Generated by [edsger](https://www.npmjs.com/package/edsger).</sub>`);\n return lines.join(\"\\n\");\n}\n\nfunction clamp(n: number, lo: number, hi: number): number {\n return Math.max(lo, Math.min(hi, n));\n}\nfunction round(n: number, dp: number): number {\n const f = 10 ** dp;\n return Math.round(n * f) / f;\n}\n","import pc from \"picocolors\";\nimport { findBundledAssetsDir, inferLanguagesFromFiles, resolveStandard } from \"../core/assets.js\";\nimport { loadConfig } from \"../core/config.js\";\nimport { runAgent } from \"../core/agent.js\";\nimport {\n ensureGhReady,\n getPrContext,\n postReview,\n type InlineComment,\n type PrContext,\n type ReviewEvent\n} from \"../core/gh.js\";\nimport { log } from \"../core/logger.js\";\nimport { ReviewResultSchema, type ReviewFinding, type ReviewResult } from \"../core/schema.js\";\nimport type { GlobalOptions, ReviewStandard, Severity } from \"../types.js\";\n\nexport interface PrReviewOptions extends GlobalOptions {\n pr: string;\n repo?: string;\n /** Actually submit the review to GitHub (otherwise preview only). */\n post: boolean;\n}\n\nconst SEVERITY_RANK: Record<Severity, number> = {\n critical: 4,\n high: 3,\n medium: 2,\n low: 1,\n info: 0\n};\n\nexport async function runPrReview(opts: PrReviewOptions): Promise<number> {\n await ensureGhReady();\n log.info(`Fetching PR ${pc.bold(opts.pr)}${opts.repo ? ` from ${opts.repo}` : \"\"}`);\n const ctx = await getPrContext(opts.pr, opts.repo, opts.cwd);\n\n const { config, path: configPath } = loadConfig(opts.cwd);\n const configDir = configPath ? `${configPath}/..` : opts.cwd;\n // If the working dir doesn't reveal the language (e.g. reviewing a PR without\n // checking it out), fall back to the PR's changed file types.\n const fileHint = inferLanguagesFromFiles(\n ctx.files.map((f) => f.path),\n findBundledAssetsDir()\n );\n const resolved = resolveStandard(\"review\", opts, config, configDir, fileHint);\n const standard = resolved.standard as ReviewStandard;\n\n log.info(\n `Reviewing \"${pc.bold(ctx.title)}\" (#${ctx.number}, ${ctx.files.length} files) ` +\n `against ${pc.bold(standard.name)}`\n );\n\n const { result, costUsd, numTurns } = await runAgent({\n prompt: buildPrompt(standard, ctx),\n cwd: opts.cwd,\n model: opts.model,\n maxTurns: opts.maxTurns,\n timeoutMs: opts.timeoutMs,\n allowWrite: false,\n verbose: opts.verbose,\n resultShape: ReviewResultSchema.shape,\n systemPromptAppend:\n \"You are Edsger, a senior code reviewer. Review only what the diff changes, but read \" +\n \"surrounding code for context. Be specific, kind, and actionable; prefer high-signal \" +\n \"findings over nitpicks. Do not modify any files.\"\n });\n\n if (!result) {\n log.error(\"The agent did not produce a review.\");\n return 1;\n }\n\n const event = decideEvent(result, standard);\n const body = renderBody(result, ctx, standard, resolved.layers);\n const inline = buildInlineComments(result, ctx, standard);\n\n printPreview(result, event, numTurns, costUsd);\n\n if (opts.json) {\n process.stdout.write(\n JSON.stringify(\n { verdict: result.verdict, event, findings: result.findings, summary: result.summary },\n null,\n 2\n ) + \"\\n\"\n );\n }\n\n if (opts.post && !opts.dryRun) {\n await postReview(ctx, opts.repo, event, body, inline, opts.cwd);\n log.success(`Posted review (${event}) to ${ctx.url}`);\n } else {\n log.warn(`Preview only. Re-run with ${pc.bold(\"--post\")} to submit this review to GitHub.`);\n process.stderr.write(\"\\n\" + body + \"\\n\");\n }\n return 0;\n}\n\nfunction decideEvent(result: ReviewResult, standard: ReviewStandard): ReviewEvent {\n const blocking = new Set(standard.policy.blockingSeverities);\n const hasBlocking = result.findings.some((f) => blocking.has(f.severity));\n if (hasBlocking) return \"REQUEST_CHANGES\";\n if (result.verdict === \"approve\") return \"APPROVE\";\n if (result.verdict === \"request_changes\") return \"REQUEST_CHANGES\";\n return \"COMMENT\";\n}\n\nfunction buildInlineComments(\n result: ReviewResult,\n ctx: PrContext,\n standard: ReviewStandard\n): InlineComment[] {\n const changed = new Set(ctx.files.map((f) => f.path));\n const sorted = [...result.findings].sort(\n (a, b) => SEVERITY_RANK[b.severity] - SEVERITY_RANK[a.severity]\n );\n const out: InlineComment[] = [];\n for (const f of sorted) {\n if (out.length >= standard.policy.maxComments) break;\n if (f.line && f.file && f.file !== \"-\" && changed.has(f.file)) {\n out.push({ path: f.file, line: f.line, body: renderFinding(f) });\n }\n }\n return out;\n}\n\nfunction renderFinding(f: ReviewFinding): string {\n const head = `**[${f.severity}] ${f.title}**`;\n const fix = f.suggestion ? `\\n\\n_Suggestion:_ ${f.suggestion}` : \"\";\n return `${head}\\n\\n${f.detail}${fix}`;\n}\n\nfunction renderBody(\n result: ReviewResult,\n ctx: PrContext,\n standard: ReviewStandard,\n layers: string[]\n): string {\n const counts = countBySeverity(result.findings);\n const lines: string[] = [];\n lines.push(`## Edsger review — ${verdictLabel(result.verdict)}`);\n lines.push(\"\");\n lines.push(result.summary);\n lines.push(\"\");\n lines.push(\n `**Findings:** ` +\n ([\"critical\", \"high\", \"medium\", \"low\", \"info\"] as Severity[])\n .filter((s) => counts[s])\n .map((s) => `${counts[s]} ${s}`)\n .join(\", \") || \"no blocking issues\"\n );\n lines.push(\"\");\n const general = result.findings.filter((f) => !f.line || f.file === \"-\");\n if (general.length) {\n lines.push(`### General comments`);\n lines.push(\"\");\n for (const f of general) lines.push(`- ${renderFinding(f).replace(/\\n+/g, \" \")}`);\n lines.push(\"\");\n }\n lines.push(\"---\");\n lines.push(\n `<sub>Reviewed against ${standard.name} v${standard.version} ` +\n `(${layers.join(\" → \")}) by [edsger](https://www.npmjs.com/package/edsger).</sub>`\n );\n void ctx;\n return lines.join(\"\\n\");\n}\n\nfunction printPreview(\n result: ReviewResult,\n event: ReviewEvent,\n numTurns: number,\n costUsd: number\n): void {\n log.heading(`Verdict: ${event}`);\n const counts = countBySeverity(result.findings);\n for (const s of [\"critical\", \"high\", \"medium\", \"low\", \"info\"] as Severity[]) {\n if (counts[s]) process.stderr.write(` ${sevColor(s)(s.padEnd(8))} ${counts[s]}\\n`);\n }\n log.step(`${numTurns} turns · ~$${costUsd.toFixed(3)}`);\n}\n\nfunction countBySeverity(findings: ReviewFinding[]): Record<Severity, number> {\n const c: Record<Severity, number> = { critical: 0, high: 0, medium: 0, low: 0, info: 0 };\n for (const f of findings) c[f.severity]++;\n return c;\n}\n\nfunction sevColor(s: Severity): (t: string) => string {\n if (s === \"critical\" || s === \"high\") return pc.red;\n if (s === \"medium\") return pc.yellow;\n return pc.dim;\n}\n\nfunction verdictLabel(v: ReviewResult[\"verdict\"]): string {\n return v === \"approve\" ? \"Approve\" : v === \"request_changes\" ? \"Request changes\" : \"Comment\";\n}\n\nfunction buildPrompt(standard: ReviewStandard, ctx: PrContext): string {\n const focus = standard.focusAreas\n .map((fa) => {\n const checklist = (fa.checklist ?? []).map((c) => ` - ${c}`).join(\"\\n\");\n return (\n `- id: ${fa.id} (${fa.title}, default severity ${fa.defaultSeverity ?? \"medium\"})\\n` +\n ` guidance: ${fa.guidance.trim()}` +\n (checklist ? `\\n checklist:\\n${checklist}` : \"\")\n );\n })\n .join(\"\\n\");\n\n return [\n `Review the following pull request.`,\n ``,\n `Title: ${ctx.title}`,\n `Author: ${ctx.author}`,\n `Base: ${ctx.baseRefName} Head: ${ctx.headRefName}`,\n `Description:`,\n ctx.body ? indent(ctx.body) : \" (no description)\",\n ``,\n `Changed files: ${ctx.files.map((f) => f.path).join(\", \")}`,\n ``,\n `Method:`,\n `1. Read the diff below. Use Read/Grep/Glob to inspect surrounding code in the working`,\n ` directory for context when needed. Do NOT modify files.`,\n `2. Evaluate the change against the focus areas. Assign each finding a severity`,\n ` (critical/high/medium/low/info) and, where it maps to a changed line, the file path`,\n ` and the 1-based line number in the NEW version of the file.`,\n `3. Verify the change does what its description claims; flag missing tests for new logic.`,\n `4. Choose a verdict: approve, request_changes, or comment. Then call submit_result once.`,\n ``,\n `Focus areas:`,\n focus,\n ``,\n `Unified diff:`,\n \"```diff\",\n truncate(ctx.diff, 180000),\n \"```\"\n ].join(\"\\n\");\n}\n\nfunction indent(s: string): string {\n return s\n .split(\"\\n\")\n .map((l) => ` ${l}`)\n .join(\"\\n\");\n}\nfunction truncate(s: string, max: number): string {\n return s.length > max ? s.slice(0, max) + \"\\n... [diff truncated] ...\" : s;\n}\n","import { execFile } from \"node:child_process\";\nimport { mkdtempSync, rmSync, writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\n\nconst exec = promisify(execFile);\n\nexport interface PrContext {\n number: number;\n title: string;\n body: string;\n author: string;\n baseRefName: string;\n headRefName: string;\n state: string;\n url: string;\n /** True when the PR head lives in a fork (cannot push to origin directly). */\n isCrossRepository: boolean;\n files: { path: string; additions: number; deletions: number }[];\n diff: string;\n}\n\nexport interface InlineComment {\n path: string;\n line: number;\n body: string;\n}\n\nasync function gh(args: string[], cwd?: string): Promise<string> {\n const { stdout } = await exec(\"gh\", args, {\n cwd,\n maxBuffer: 64 * 1024 * 1024,\n env: process.env\n });\n return stdout;\n}\n\n/** Throw a friendly error if gh is missing or not authenticated. */\nexport async function ensureGhReady(): Promise<void> {\n try {\n await exec(\"gh\", [\"--version\"]);\n } catch {\n throw new Error(\n \"GitHub CLI (gh) not found. Install it from https://cli.github.com and run `gh auth login`.\"\n );\n }\n try {\n await exec(\"gh\", [\"auth\", \"status\"]);\n } catch {\n throw new Error(\"Not authenticated with GitHub. Run `gh auth login` first.\");\n }\n}\n\n/** Fetch PR metadata, changed files, and the unified diff. */\nexport async function getPrContext(\n ref: string,\n repo: string | undefined,\n cwd: string\n): Promise<PrContext> {\n const repoArgs = repo ? [\"--repo\", repo] : [];\n const fields =\n \"number,title,body,author,baseRefName,headRefName,state,url,isCrossRepository,files\";\n const metaRaw = await gh([\"pr\", \"view\", ref, ...repoArgs, \"--json\", fields], cwd);\n const meta = JSON.parse(metaRaw) as {\n number: number;\n title: string;\n body: string | null;\n author: { login: string };\n baseRefName: string;\n headRefName: string;\n state: string;\n url: string;\n isCrossRepository: boolean;\n files: { path: string; additions: number; deletions: number }[];\n };\n const diff = await gh([\"pr\", \"diff\", ref, ...repoArgs], cwd);\n return {\n number: meta.number,\n title: meta.title,\n body: meta.body ?? \"\",\n author: meta.author?.login ?? \"unknown\",\n baseRefName: meta.baseRefName,\n headRefName: meta.headRefName,\n state: meta.state,\n url: meta.url,\n isCrossRepository: Boolean(meta.isCrossRepository),\n files: meta.files ?? [],\n diff\n };\n}\n\n/** Check out a PR branch locally (for pr-resolve). */\nexport async function checkoutPr(\n ref: string,\n repo: string | undefined,\n cwd: string\n): Promise<void> {\n const repoArgs = repo ? [\"--repo\", repo] : [];\n await gh([\"pr\", \"checkout\", ref, ...repoArgs], cwd);\n}\n\nexport type ReviewEvent = \"APPROVE\" | \"REQUEST_CHANGES\" | \"COMMENT\";\n\n/**\n * Post a review. Inline comments are submitted via the REST API so they attach\n * to specific lines; the summary body is included in the same review.\n */\nexport async function postReview(\n ctx: PrContext,\n repo: string | undefined,\n event: ReviewEvent,\n body: string,\n inline: InlineComment[],\n cwd: string\n): Promise<void> {\n const target = repo ?? (await currentRepoSlug(cwd));\n if (inline.length === 0) {\n const flag =\n event === \"APPROVE\"\n ? \"--approve\"\n : event === \"REQUEST_CHANGES\"\n ? \"--request-changes\"\n : \"--comment\";\n await gh([\"pr\", \"review\", String(ctx.number), \"--repo\", target, flag, \"--body\", body], cwd);\n return;\n }\n const payload = {\n body,\n event,\n comments: inline.map((c) => ({ path: c.path, line: c.line, side: \"RIGHT\", body: c.body }))\n };\n const dir = mkdtempSync(join(tmpdir(), \"edsger-review-\"));\n const file = join(dir, \"review.json\");\n writeFileSync(file, JSON.stringify(payload), \"utf8\");\n try {\n await gh(\n [\"api\", \"--method\", \"POST\", `repos/${target}/pulls/${ctx.number}/reviews`, \"--input\", file],\n cwd\n );\n } catch {\n // Fall back to a plain summary review if inline submission fails (e.g. a\n // comment targets a line outside the diff).\n const flag =\n event === \"APPROVE\"\n ? \"--approve\"\n : event === \"REQUEST_CHANGES\"\n ? \"--request-changes\"\n : \"--comment\";\n await gh([\"pr\", \"review\", String(ctx.number), \"--repo\", target, flag, \"--body\", body], cwd);\n } finally {\n rmSync(dir, { recursive: true, force: true });\n }\n}\n\n/** Resolve \"owner/repo\" for the current checkout. */\nexport async function currentRepoSlug(cwd: string): Promise<string> {\n const raw = await gh([\"repo\", \"view\", \"--json\", \"nameWithOwner\"], cwd);\n return (JSON.parse(raw) as { nameWithOwner: string }).nameWithOwner;\n}\n\nexport interface PrFeedback {\n reviewComments: { author: string; path: string; line: number | null; body: string }[];\n issueComments: { author: string; body: string }[];\n}\n\n/** Fetch inline review comments and conversation comments on a PR. */\nexport async function getPrFeedback(\n ctx: PrContext,\n repo: string | undefined,\n cwd: string\n): Promise<PrFeedback> {\n const target = repo ?? (await currentRepoSlug(cwd));\n const reviewRaw = await gh(\n [\"api\", `repos/${target}/pulls/${ctx.number}/comments`, \"--paginate\"],\n cwd\n ).catch(() => \"[]\");\n const issueRaw = await gh(\n [\"api\", `repos/${target}/issues/${ctx.number}/comments`, \"--paginate\"],\n cwd\n ).catch(() => \"[]\");\n const review = JSON.parse(reviewRaw) as Array<{\n user: { login: string };\n path: string;\n line: number | null;\n body: string;\n }>;\n const issue = JSON.parse(issueRaw) as Array<{ user: { login: string }; body: string }>;\n return {\n reviewComments: review.map((c) => ({\n author: c.user?.login ?? \"unknown\",\n path: c.path,\n line: c.line,\n body: c.body\n })),\n issueComments: issue.map((c) => ({ author: c.user?.login ?? \"unknown\", body: c.body }))\n };\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport pc from \"picocolors\";\nimport { runAgent } from \"../core/agent.js\";\nimport {\n checkoutPr,\n ensureGhReady,\n getPrContext,\n getPrFeedback,\n type PrContext,\n type PrFeedback\n} from \"../core/gh.js\";\nimport { log } from \"../core/logger.js\";\nimport { ResolveResultSchema, type ResolveResult } from \"../core/schema.js\";\nimport type { GlobalOptions } from \"../types.js\";\n\nconst exec = promisify(execFile);\n\nexport interface PrResolveOptions extends GlobalOptions {\n pr: string;\n repo?: string;\n /** Free-form instruction, e.g. \"address review comments and fix the failing test\". */\n instruction?: string;\n /** Check out the PR branch locally before editing. */\n checkout: boolean;\n /** Commit and push the changes when done. */\n push: boolean;\n}\n\nexport async function runPrResolve(opts: PrResolveOptions): Promise<number> {\n await ensureGhReady();\n log.info(`Fetching PR ${pc.bold(opts.pr)}${opts.repo ? ` from ${opts.repo}` : \"\"}`);\n const ctx = await getPrContext(opts.pr, opts.repo, opts.cwd);\n const feedback = await getPrFeedback(ctx, opts.repo, opts.cwd).catch(() => ({\n reviewComments: [],\n issueComments: []\n }));\n\n if (opts.checkout && !opts.dryRun) {\n log.step(`checking out PR branch ${ctx.headRefName}`);\n await checkoutPr(opts.pr, opts.repo, opts.cwd);\n }\n\n log.info(\n `Resolving \"${pc.bold(ctx.title)}\" (#${ctx.number}) — ` +\n `${feedback.reviewComments.length} review comments`\n );\n\n const { result, costUsd, numTurns } = await runAgent({\n prompt: buildPrompt(ctx, feedback, opts.instruction),\n cwd: opts.cwd,\n model: opts.model,\n maxTurns: opts.maxTurns,\n timeoutMs: opts.timeoutMs,\n allowWrite: true,\n verbose: opts.verbose,\n resultShape: ResolveResultSchema.shape,\n systemPromptAppend:\n \"You are Edsger, a careful senior engineer fixing a pull request. Make the smallest \" +\n \"correct change that addresses the feedback. Match the existing code style. After \" +\n \"editing, run the project's tests/linters to verify. Never weaken tests to make them \" +\n \"pass, and never commit secrets.\"\n });\n\n if (!result) {\n log.error(\"The agent did not produce a result.\");\n return 1;\n }\n\n printSummary(result, numTurns, costUsd);\n if (opts.json) process.stdout.write(JSON.stringify(result, null, 2) + \"\\n\");\n\n if (opts.push && !opts.dryRun) {\n const pushed = await commitAndPush(ctx, result, opts.cwd, opts.checkout);\n if (pushed) log.success(`Committed and pushed to ${ctx.headRefName}`);\n else log.warn(\"Nothing to commit — working tree is clean.\");\n } else {\n log.warn(\n `Changes left in the working tree. Review them, then commit/push (or re-run with ${pc.bold(\"--push\")}).`\n );\n }\n return 0;\n}\n\nasync function commitAndPush(\n ctx: PrContext,\n result: ResolveResult,\n cwd: string,\n checkedOut: boolean\n): Promise<boolean> {\n const status = await exec(\"git\", [\"status\", \"--porcelain\"], { cwd });\n if (!status.stdout.trim()) return false;\n await exec(\"git\", [\"add\", \"-A\"], { cwd });\n const message = `fix: address review feedback on #${ctx.number}\\n\\n${result.summary}`;\n await exec(\"git\", [\"commit\", \"-m\", message], { cwd });\n\n // `gh pr checkout` configures the local branch to push back to the right\n // remote (including a fork), so prefer a plain push when we checked out.\n if (checkedOut) {\n try {\n await exec(\"git\", [\"push\"], { cwd });\n return true;\n } catch (err) {\n if (ctx.isCrossRepository) {\n throw new Error(\n `Could not push to the fork's branch automatically: ${errText(err)}\\n` +\n \"Push manually, or ensure the PR branch was checked out with gh.\"\n );\n }\n // Same-repo: fall through to an explicit origin push.\n }\n }\n if (ctx.isCrossRepository) {\n throw new Error(\n \"This PR is from a fork. Re-run without --no-checkout so gh can configure \" +\n \"the push target, or commit and push to the fork manually.\"\n );\n }\n await exec(\"git\", [\"push\", \"origin\", `HEAD:${ctx.headRefName}`], { cwd });\n return true;\n}\n\nfunction errText(err: unknown): string {\n return err instanceof Error ? (err.message.split(\"\\n\")[0] ?? \"\") : String(err);\n}\n\nfunction printSummary(result: ResolveResult, numTurns: number, costUsd: number): void {\n log.heading(\"Resolution summary\");\n process.stderr.write(` ${result.summary}\\n\\n`);\n if (result.changes.length) {\n for (const c of result.changes)\n process.stderr.write(` ${pc.green(\"~\")} ${c.file} — ${c.description}\\n`);\n }\n if (result.testsRun) log.step(`verification: ${result.testsRun}`);\n if (result.remaining.length) {\n log.warn(\"Remaining items:\");\n for (const r of result.remaining) process.stderr.write(` - ${r}\\n`);\n }\n log.step(`${numTurns} turns · ~$${costUsd.toFixed(3)}`);\n}\n\nfunction buildPrompt(ctx: PrContext, feedback: PrFeedback, instruction?: string): string {\n const reviewComments = feedback.reviewComments.length\n ? feedback.reviewComments\n .map((c) => ` - ${c.path}${c.line ? `:${c.line}` : \"\"} (${c.author}): ${c.body}`)\n .join(\"\\n\")\n : \" (none)\";\n const issueComments = feedback.issueComments.length\n ? feedback.issueComments.map((c) => ` - ${c.author}: ${c.body}`).join(\"\\n\")\n : \" (none)\";\n\n return [\n `Resolve the open items on this pull request by editing the code in the working directory.`,\n ``,\n `PR #${ctx.number}: ${ctx.title}`,\n `Base: ${ctx.baseRefName} Head: ${ctx.headRefName}`,\n ``,\n instruction\n ? `Primary instruction: ${instruction}`\n : `Primary goal: address the reviewer feedback below.`,\n ``,\n `Inline review comments:`,\n reviewComments,\n ``,\n `Conversation comments:`,\n issueComments,\n ``,\n `Method:`,\n `1. Understand each requested change. Use Read/Grep/Glob to locate the relevant code.`,\n `2. Make the minimal, correct edits with Edit/Write. Match existing conventions.`,\n `3. Run the project's tests and linters (via Bash) to verify your changes pass.`,\n `4. Do not weaken or delete tests to make them pass; do not introduce secrets.`,\n `5. Call submit_result once with a summary, the list of files changed, how you verified,`,\n ` and anything you could not resolve.`\n ].join(\"\\n\");\n}\n","import { join } from \"node:path\";\nimport { assembleData, findViewerDir, hasData } from \"../core/dashboard.js\";\nimport { startViewerServer } from \"../core/viewer-server.js\";\n\nexport interface ServeOptions {\n cwd: string;\n /** Benchmark output dir relative to cwd (default .edsger/benchmark). */\n dir: string;\n port: number;\n host: string;\n open: boolean;\n}\n\nexport async function runServe(opts: ServeOptions): Promise<number> {\n const benchmarkDir = join(opts.cwd, opts.dir);\n const viewerDir = findViewerDir();\n\n return startViewerServer({\n viewerDir,\n indexFile: \"index.html\",\n dataRoute: \"/edsger-data.json\",\n getData: () => assembleData(benchmarkDir),\n port: opts.port,\n host: opts.host,\n open: opts.open,\n emptyHint: hasData(assembleData(benchmarkDir))\n ? undefined\n : `No benchmark data in ${opts.dir} yet — run \\`edsger benchmark\\` first.`\n });\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, isAbsolute, join } from \"node:path\";\nimport pc from \"picocolors\";\nimport {\n assembleData,\n hasData,\n readViewerSingleTemplate,\n renderSingleFile\n} from \"../core/dashboard.js\";\nimport { openInBrowser } from \"../core/open.js\";\nimport { log } from \"../core/logger.js\";\n\nexport interface ReportOptions {\n cwd: string;\n /** Benchmark output dir relative to cwd (default .edsger/benchmark). */\n dir: string;\n /** Output path for the self-contained HTML (relative to cwd unless absolute). */\n html: string;\n open: boolean;\n}\n\n/** Export a self-contained, shareable HTML dashboard (data inlined). */\nexport async function runReport(opts: ReportOptions): Promise<number> {\n const benchmarkDir = join(opts.cwd, opts.dir);\n const data = assembleData(benchmarkDir);\n if (!hasData(data)) {\n log.error(`No benchmark data in ${opts.dir}. Run \\`edsger benchmark\\` first.`);\n return 1;\n }\n\n const html = renderSingleFile(readViewerSingleTemplate(), data);\n const out = isAbsolute(opts.html) ? opts.html : join(opts.cwd, opts.html);\n mkdirSync(dirname(out), { recursive: true });\n writeFileSync(out, html, \"utf8\");\n\n log.success(\n `Wrote self-contained report to ${pc.bold(opts.html)} ` +\n `${pc.dim(`(${Math.round(html.length / 1024)} kB, open in any browser)`)}`\n );\n if (opts.open) openInBrowser(out);\n return 0;\n}\n","import { appendFileSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { basename, dirname, isAbsolute, join } from \"node:path\";\nimport pc from \"picocolors\";\nimport { resolveStandard } from \"../core/assets.js\";\nimport { loadConfig } from \"../core/config.js\";\nimport { runAgent } from \"../core/agent.js\";\nimport {\n assembleDiagramData,\n findDiagramViewerDir,\n hasData,\n readDiagramViewerSingleTemplate,\n renderDiagramsSingleFile\n} from \"../core/dashboard.js\";\nimport {\n buildDiagramsPrompt,\n prepareDiagrams,\n renderDiagramsMarkdown,\n type PreparedDiagrams\n} from \"../core/diagrams.js\";\nimport { gitInfo } from \"../core/git.js\";\nimport { log } from \"../core/logger.js\";\nimport { openInBrowser } from \"../core/open.js\";\nimport { DiagramsResultSchema } from \"../core/schema.js\";\nimport { startViewerServer } from \"../core/viewer-server.js\";\nimport type { DiagramCatalog, GlobalOptions } from \"../types.js\";\n\nexport interface DiagramGenerateOptions extends GlobalOptions {\n /** Directory to write the diagrams into (relative to repo). */\n out: string;\n /** Skip writing files into the repo. */\n noWrite: boolean;\n /** Restrict generation to these catalog diagram ids. */\n only?: string[];\n}\n\nexport async function runDiagramGenerate(opts: DiagramGenerateOptions): Promise<number> {\n const { config, path: configPath } = loadConfig(opts.cwd);\n const configDir = configPath ? join(configPath, \"..\") : opts.cwd;\n const resolved = resolveStandard(\"diagrams\", opts, config, configDir);\n const catalog = resolved.standard as DiagramCatalog;\n\n log.info(\n `Diagramming ${pc.bold(basename(opts.cwd))} with ${pc.bold(catalog.name)} ` +\n `(languages: ${resolved.languages.join(\", \") || \"generic\"})`\n );\n log.debug(`catalog layers: ${resolved.layers.join(\" → \")}`);\n\n const prompt = buildDiagramsPrompt(catalog, opts.cwd, opts.only);\n const { result, costUsd, numTurns } = await runAgent({\n prompt,\n cwd: opts.cwd,\n model: opts.model,\n maxTurns: opts.maxTurns,\n timeoutMs: opts.timeoutMs,\n allowWrite: false,\n verbose: opts.verbose,\n resultShape: DiagramsResultSchema.shape,\n systemPromptAppend:\n \"You are Edsger, a staff-level software architect. You produce accurate, \" +\n \"legible diagrams of a codebase as valid Mermaid, grounded strictly in the \" +\n \"code you inspect. Never invent components, tables, or flows that are not in \" +\n \"the repository. Do not modify any files.\"\n });\n\n if (!result) {\n log.error(\n \"The agent did not produce a result. Try increasing --max-turns or check credentials.\"\n );\n return 1;\n }\n\n const prepared = prepareDiagrams(catalog, result);\n const generatedAt = new Date().toISOString();\n // Filesystem-safe UTC run id (e.g. 20260701T034500Z): lexicographic == chronological.\n const runId = generatedAt.replace(/[-:]/g, \"\").replace(/\\.\\d+Z$/, \"Z\");\n const git = gitInfo(opts.cwd);\n const md = renderDiagramsMarkdown(prepared, {\n repo: basename(opts.cwd),\n languages: resolved.languages,\n layers: resolved.layers,\n generatedAt,\n model: opts.model\n });\n\n const jsonReport = {\n schema: \"edsger.diagrams/1\",\n runId,\n generatedAt,\n model: opts.model,\n repo: basename(opts.cwd),\n git,\n languages: resolved.languages,\n catalog: { name: catalog.name, version: catalog.version, layers: resolved.layers },\n profile: prepared.profile,\n diagrams: prepared.diagrams,\n notes: prepared.notes,\n costUsd\n };\n\n const groupCounts: Record<string, number> = {};\n for (const d of prepared.diagrams) groupCounts[d.groupId] = (groupCounts[d.groupId] ?? 0) + 1;\n\n // Compact, append-only trend index: one line per run, cheap to read for history.\n const historyRecord = {\n runId,\n generatedAt,\n commit: git.commit,\n branch: git.branch,\n dirty: git.dirty,\n model: opts.model,\n catalogVersion: catalog.version,\n diagramCount: prepared.diagrams.length,\n groups: groupCounts,\n costUsd\n };\n\n if (!opts.noWrite && !opts.dryRun) {\n const baseDir = join(opts.cwd, opts.out);\n const mdOut = md + \"\\n\";\n const jsonOut = JSON.stringify(jsonReport, null, 2) + \"\\n\";\n\n // Archive this run under runs/<timestamp>/ so previous diagram sets are preserved.\n const runDir = join(baseDir, \"runs\", runId);\n mkdirSync(runDir, { recursive: true });\n writeFileSync(join(runDir, \"diagrams.json\"), jsonOut, \"utf8\");\n writeFileSync(join(runDir, \"diagrams.md\"), mdOut, \"utf8\");\n\n // Refresh the canonical top-level files as the stable \"latest\" pointer.\n writeFileSync(join(baseDir, \"diagrams.json\"), jsonOut, \"utf8\");\n writeFileSync(join(baseDir, \"diagrams.md\"), mdOut, \"utf8\");\n\n appendFileSync(join(baseDir, \"history.jsonl\"), JSON.stringify(historyRecord) + \"\\n\", \"utf8\");\n\n log.success(\n `Diagrams written to ${pc.bold(join(opts.out, \"diagrams.md\"))} ` +\n `${pc.dim(`(run archived at ${join(opts.out, \"runs\", runId)})`)}`\n );\n }\n\n printSummary(prepared, numTurns, costUsd);\n if (opts.json) process.stdout.write(JSON.stringify(jsonReport, null, 2) + \"\\n\");\n return 0;\n}\n\nfunction printSummary(prepared: PreparedDiagrams, numTurns: number, costUsd: number): void {\n log.heading(`${prepared.diagrams.length} diagram(s)`);\n let currentGroup: string | null = null;\n for (const d of prepared.diagrams) {\n if (d.groupName !== currentGroup) {\n currentGroup = d.groupName;\n process.stderr.write(` ${pc.bold(currentGroup)}\\n`);\n }\n const warn = d.warnings.length ? ` ${pc.yellow(\"⚠\")}` : \"\";\n process.stderr.write(` ${pc.cyan(\"◆\")} ${d.title} ${pc.dim(`(${d.type})`)}${warn}\\n`);\n }\n log.step(`${numTurns} turns · ~$${costUsd.toFixed(3)}`);\n}\n\n// --- serve -------------------------------------------------------------------\n\nexport interface DiagramServeOptions {\n cwd: string;\n /** Diagrams output dir relative to cwd (default .edsger/diagrams). */\n dir: string;\n port: number;\n host: string;\n open: boolean;\n}\n\nexport async function runDiagramServe(opts: DiagramServeOptions): Promise<number> {\n const diagramsDir = join(opts.cwd, opts.dir);\n const viewerDir = findDiagramViewerDir();\n\n return startViewerServer({\n viewerDir,\n indexFile: \"diagrams.html\",\n dataRoute: \"/edsger-diagrams.json\",\n getData: () => assembleDiagramData(diagramsDir),\n port: opts.port,\n host: opts.host,\n open: opts.open,\n emptyHint: hasData(assembleDiagramData(diagramsDir))\n ? undefined\n : `No diagram data in ${opts.dir} yet — run \\`edsger diagram\\` first.`\n });\n}\n\n// --- report ------------------------------------------------------------------\n\nexport interface DiagramReportOptions {\n cwd: string;\n /** Diagrams output dir relative to cwd (default .edsger/diagrams). */\n dir: string;\n /** Output path for the self-contained HTML (relative to cwd unless absolute). */\n html: string;\n open: boolean;\n}\n\n/** Export a self-contained, shareable HTML diagram viewer (data inlined). */\nexport async function runDiagramReport(opts: DiagramReportOptions): Promise<number> {\n const diagramsDir = join(opts.cwd, opts.dir);\n const data = assembleDiagramData(diagramsDir);\n if (!hasData(data)) {\n log.error(`No diagram data in ${opts.dir}. Run \\`edsger diagram\\` first.`);\n return 1;\n }\n\n const html = renderDiagramsSingleFile(readDiagramViewerSingleTemplate(), data);\n const out = isAbsolute(opts.html) ? opts.html : join(opts.cwd, opts.html);\n mkdirSync(dirname(out), { recursive: true });\n writeFileSync(out, html, \"utf8\");\n\n log.success(\n `Wrote self-contained diagram viewer to ${pc.bold(opts.html)} ` +\n `${pc.dim(`(${Math.round(html.length / 1024)} kB, open in any browser)`)}`\n );\n if (opts.open) openInBrowser(out);\n return 0;\n}\n","import type { DiagramCatalog } from \"../types.js\";\nimport type { DiagramsResult, GeneratedDiagram } from \"./schema.js\";\nimport { log } from \"./logger.js\";\n\n/** A diagram enriched with its (display) group name, ready to persist/render. */\nexport interface PreparedDiagram extends GeneratedDiagram {\n groupName: string;\n /** Non-fatal issues found by a static Mermaid sanity check (may be empty). */\n warnings: string[];\n}\n\nexport interface PreparedDiagrams {\n profile: DiagramsResult[\"profile\"];\n diagrams: PreparedDiagram[];\n notes: string | null;\n}\n\n/** Build the agent prompt that turns a catalog into a repo-specific diagram set. */\nexport function buildDiagramsPrompt(catalog: DiagramCatalog, cwd: string, only?: string[]): string {\n const onlySet = only && only.length ? new Set(only.map((s) => s.trim())) : null;\n\n const catalogText = catalog.groups\n .map((group) => {\n const diagrams = group.diagrams\n .filter((d) => !onlySet || onlySet.has(d.id))\n .map((d) => {\n const detect = d.detect?.length ? `\\n detect: ${d.detect.join(\", \")}` : \"\";\n return (\n ` - id: ${d.id}\\n` +\n ` title: ${d.title}\\n` +\n ` mermaidType: ${d.type}\\n` +\n ` appliesWhen: ${d.appliesWhen.trim()}` +\n detect +\n `\\n guidance: ${d.guidance.trim()}`\n );\n })\n .join(\"\\n\");\n if (!diagrams) return \"\";\n return `- group: ${group.id} (${group.name})\\n${diagrams}`;\n })\n .filter(Boolean)\n .join(\"\\n\");\n\n return [\n `Produce a set of professional software diagrams for the repository at: ${cwd}`,\n ``,\n `You have a catalog of candidate diagrams below. Your job is to pick the ones`,\n `that genuinely fit THIS project and generate each as valid Mermaid.`,\n ``,\n `Method:`,\n `1. Explore the repository (Read/Grep/Glob and read-only Bash like ls, cat, git log).`,\n ` Characterise the project: what kind is it (service, library, CLI, SPA, data`,\n ` pipeline, monorepo, …), what does it integrate with, does it own a database,`,\n ` how is it deployed?`,\n `2. For each catalog diagram, use its appliesWhen/detect to decide whether it adds`,\n ` value for this repo. Only include diagrams the evidence supports. A library`,\n ` needs different diagrams than a microservice. Do NOT invent structure that is`,\n ` not in the code. Aim for the ${onlySet ? \"requested\" : \"5-9 most valuable\"} diagrams.`,\n `3. For each selected diagram, follow its guidance and emit VALID Mermaid of the`,\n ` given mermaidType, grounded in real files. Rules for the mermaid field:`,\n ` - Put ONLY the Mermaid source (starting with the diagram keyword, e.g.`,\n ` \"flowchart TD\" or \"erDiagram\"). Do NOT wrap it in \\`\\`\\`mermaid fences and`,\n ` do NOT add any prose/markdown outside the diagram.`,\n ` - It MUST parse as-is. Use simple alphanumeric node/participant ids and put`,\n ` human text in quoted labels, e.g. A[\"Order Service\"] not A[Order Service].`,\n ` Quote any label containing spaces, punctuation, parentheses or slashes.`,\n ` - Avoid Mermaid reserved words as bare node ids (especially \"end\" in`,\n ` flowcharts — write End or \"end\" instead).`,\n ` - Set \"type\" to the exact keyword the source starts with.`,\n ` - Keep each diagram to roughly one screen and legible.`,\n ` - Prefer faithful over exhaustive; record the files you used as evidence.`,\n `4. When finished, call submit_result exactly once with the project profile and`,\n ` the diagrams (each with id, groupId, title, type, mermaid, description, evidence).`,\n ``,\n `Diagram catalog:`,\n catalogText\n ].join(\"\\n\");\n}\n\n/** Strip accidental ```mermaid fences and surrounding blank lines from source. */\nfunction sanitizeMermaid(src: string): string {\n let s = src.trim();\n const fence = s.match(/^```(?:mermaid)?\\s*\\n([\\s\\S]*?)\\n```$/);\n if (fence && fence[1] !== undefined) s = fence[1].trim();\n return s;\n}\n\n/** Mermaid diagram keywords we know how to render (aligned with the catalog schema). */\nconst KNOWN_MERMAID_TYPES = new Set([\n \"flowchart\",\n \"graph\",\n \"sequenceDiagram\",\n \"classDiagram\",\n \"stateDiagram\",\n \"stateDiagram-v2\",\n \"erDiagram\",\n \"journey\",\n \"gantt\",\n \"gitGraph\",\n \"mindmap\",\n \"timeline\",\n \"requirementDiagram\",\n \"quadrantChart\",\n \"pie\",\n \"sankey-beta\",\n \"xychart-beta\",\n \"block-beta\",\n \"packet-beta\",\n \"kanban\",\n \"zenuml\",\n \"C4Context\",\n \"C4Container\",\n \"C4Component\",\n \"C4Deployment\",\n \"C4Dynamic\",\n \"architecture-beta\"\n]);\n\n/** The first meaningful token of a Mermaid source: its diagram-type keyword. */\nfunction firstKeyword(mermaid: string): string {\n for (const raw of mermaid.split(\"\\n\")) {\n const line = raw.trim();\n if (!line || line.startsWith(\"%%\")) continue;\n return line.split(/[\\s({]/)[0] ?? line;\n }\n return \"\";\n}\n\n/** Normalise interchangeable keywords so type comparisons don't false-positive. */\nfunction normaliseType(keyword: string): string {\n const k = keyword.trim();\n if (k === \"graph\") return \"flowchart\";\n if (k === \"stateDiagram\") return \"stateDiagram-v2\";\n return k;\n}\n\n/** Best-effort mermaid diagram-type keyword, used when the agent omits `type`. */\nfunction inferType(mermaid: string): string {\n return firstKeyword(mermaid) || \"flowchart\";\n}\n\n/**\n * A conservative, dependency-free sanity check on agent-produced Mermaid. It is\n * intentionally high-precision (only flags near-certain problems) so warnings\n * stay trustworthy; a full parse would need a browser/DOM the CLI can't assume.\n */\nexport function validateMermaid(declaredType: string, mermaid: string): string[] {\n const warnings: string[] = [];\n if (mermaid.includes(\"```\")) warnings.push(\"source still contains a ``` fence\");\n\n const keyword = firstKeyword(mermaid);\n if (!keyword) {\n warnings.push(\"no diagram content\");\n return warnings;\n }\n if (!KNOWN_MERMAID_TYPES.has(keyword)) {\n warnings.push(`unrecognised diagram keyword \"${keyword}\"`);\n }\n\n const body = mermaid.split(\"\\n\").filter((l) => {\n const t = l.trim();\n return t && !t.startsWith(\"%%\");\n });\n if (body.length < 2) warnings.push(\"header only — the diagram has no body\");\n\n // Flag a declared type that disagrees with the source's actual keyword (only\n // when the source keyword is one we recognise, to avoid noise).\n if (declaredType && KNOWN_MERMAID_TYPES.has(keyword)) {\n if (normaliseType(declaredType) !== normaliseType(keyword)) {\n warnings.push(`declared type \"${declaredType}\" but source starts with \"${keyword}\"`);\n }\n }\n return warnings;\n}\n\n/**\n * Validate + normalise the agent's raw result into a persistable shape: attach\n * each diagram's group name, sanitise mermaid, drop empties, and order by the\n * catalog's group order for stable, readable output.\n */\nexport function prepareDiagrams(catalog: DiagramCatalog, result: DiagramsResult): PreparedDiagrams {\n const groupName = new Map(catalog.groups.map((g) => [g.id, g.name]));\n const groupOrder = new Map(catalog.groups.map((g, i) => [g.id, i]));\n\n const prepared: PreparedDiagram[] = [];\n const seenIds = new Map<string, number>();\n for (const d of result.diagrams) {\n const mermaid = sanitizeMermaid(d.mermaid ?? \"\");\n if (!mermaid) {\n log.warn(`Skipping diagram \"${d.id}\" — it had no mermaid source.`);\n continue;\n }\n // Disambiguate duplicate ids so viewer keys and Markdown anchors stay unique.\n const baseId = d.id || inferType(mermaid);\n const count = seenIds.get(baseId) ?? 0;\n seenIds.set(baseId, count + 1);\n const id = count === 0 ? baseId : `${baseId}-${count + 1}`;\n\n const type = d.type?.trim() || inferType(mermaid);\n prepared.push({\n ...d,\n id,\n mermaid,\n type,\n evidence: d.evidence ?? [],\n groupName: groupName.get(d.groupId) ?? \"Other\",\n warnings: validateMermaid(type, mermaid)\n });\n }\n\n // Stable sort by catalog group order, keeping within-group order as returned.\n prepared.sort((a, b) => {\n const oa = groupOrder.get(a.groupId) ?? Number.MAX_SAFE_INTEGER;\n const ob = groupOrder.get(b.groupId) ?? Number.MAX_SAFE_INTEGER;\n return oa - ob;\n });\n\n if (prepared.length === 0) {\n log.warn(\"The agent returned no usable diagrams.\");\n } else {\n const flagged = prepared.filter((d) => d.warnings.length);\n if (flagged.length) {\n log.warn(\n `${flagged.length}/${prepared.length} diagram(s) have Mermaid warnings — they will still ` +\n `render if valid, but check: ${flagged.map((d) => d.id).join(\", \")}`\n );\n }\n }\n\n return { profile: result.profile, diagrams: prepared, notes: result.notes ?? null };\n}\n\n/** Render a human-readable Markdown document embedding renderable mermaid blocks. */\nexport function renderDiagramsMarkdown(\n prepared: PreparedDiagrams,\n meta: { repo: string; languages: string[]; layers: string[]; generatedAt: string; model: string }\n): string {\n const lines: string[] = [];\n lines.push(`# Edsger Diagrams`);\n lines.push(\"\");\n lines.push(`> ${prepared.profile.summary}`);\n lines.push(\"\");\n lines.push(`| Field | Value |`);\n lines.push(`| --- | --- |`);\n lines.push(`| Repository | \\`${meta.repo}\\` |`);\n lines.push(`| Languages | ${meta.languages.join(\", \") || \"n/a\"} |`);\n lines.push(`| Project kinds | ${prepared.profile.kinds.join(\", \") || \"n/a\"} |`);\n lines.push(`| Catalog sources | ${meta.layers.join(\" → \")} |`);\n lines.push(`| Model | ${meta.model} |`);\n lines.push(`| Generated | ${meta.generatedAt} |`);\n lines.push(\"\");\n\n if (prepared.profile.characteristics.length) {\n lines.push(`**Characteristics:** ${prepared.profile.characteristics.join(\" · \")}`);\n lines.push(\"\");\n }\n\n // Group the diagrams by their group name, preserving the prepared order.\n let currentGroup: string | null = null;\n for (const d of prepared.diagrams) {\n if (d.groupName !== currentGroup) {\n currentGroup = d.groupName;\n lines.push(`## ${currentGroup}`);\n lines.push(\"\");\n }\n lines.push(`### ${d.title}`);\n lines.push(\"\");\n lines.push(`${d.description} _(${d.type})_`);\n lines.push(\"\");\n if (d.warnings.length) {\n lines.push(`> ⚠️ ${d.warnings.join(\"; \")}`);\n lines.push(\"\");\n }\n lines.push(\"```mermaid\");\n lines.push(d.mermaid);\n lines.push(\"```\");\n lines.push(\"\");\n if (d.evidence.length) {\n lines.push(`<sub>Evidence: ${d.evidence.map((e) => `\\`${e}\\``).join(\", \")}</sub>`);\n lines.push(\"\");\n }\n }\n\n if (prepared.notes) {\n lines.push(`## Notes`);\n lines.push(\"\");\n lines.push(prepared.notes);\n lines.push(\"\");\n }\n\n lines.push(`---`);\n lines.push(`<sub>Generated by [edsger](https://www.npmjs.com/package/edsger).</sub>`);\n return lines.join(\"\\n\");\n}\n","import { appendFileSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { basename, dirname, isAbsolute, join } from \"node:path\";\nimport pc from \"picocolors\";\nimport { resolveStandard } from \"../core/assets.js\";\nimport { loadConfig } from \"../core/config.js\";\nimport { runAgent } from \"../core/agent.js\";\nimport {\n assembleMindmapData,\n findMindmapViewerDir,\n hasData,\n readMindmapViewerSingleTemplate,\n renderMindmapSingleFile\n} from \"../core/dashboard.js\";\nimport {\n buildMindmapPrompt,\n prepareMindmap,\n renderMindmapMarkdown,\n type MindmapTreeNode,\n type PreparedMindmap\n} from \"../core/mindmap.js\";\nimport { gitInfo } from \"../core/git.js\";\nimport { log } from \"../core/logger.js\";\nimport { openInBrowser } from \"../core/open.js\";\nimport { MindmapResultSchema } from \"../core/schema.js\";\nimport { startViewerServer } from \"../core/viewer-server.js\";\nimport type { GlobalOptions, MindmapStandard } from \"../types.js\";\n\nexport interface MindmapGenerateOptions extends GlobalOptions {\n /** Directory to write the mind map into (relative to repo). */\n out: string;\n /** Skip writing files into the repo. */\n noWrite: boolean;\n /** Optional area/topic the map should concentrate its depth on. */\n focus?: string;\n}\n\nexport async function runMindmapGenerate(opts: MindmapGenerateOptions): Promise<number> {\n const { config, path: configPath } = loadConfig(opts.cwd);\n const configDir = configPath ? join(configPath, \"..\") : opts.cwd;\n const resolved = resolveStandard(\"mindmap\", opts, config, configDir);\n const standard = resolved.standard as MindmapStandard;\n\n log.info(\n `Mind-mapping ${pc.bold(basename(opts.cwd))} with ${pc.bold(standard.name)} ` +\n `(languages: ${resolved.languages.join(\", \") || \"generic\"})`\n );\n log.debug(`standard layers: ${resolved.layers.join(\" → \")}`);\n\n const prompt = buildMindmapPrompt(standard, opts.cwd, opts.focus);\n const { result, costUsd, numTurns } = await runAgent({\n prompt,\n cwd: opts.cwd,\n model: opts.model,\n maxTurns: opts.maxTurns,\n timeoutMs: opts.timeoutMs,\n allowWrite: false,\n verbose: opts.verbose,\n resultShape: MindmapResultSchema.shape,\n systemPromptAppend:\n \"You are Edsger, a staff-level engineer explaining a codebase to a newcomer. \" +\n \"You produce a faithful implementation mind map grounded strictly in the code \" +\n \"you inspect: every node true and specific, every leaf citing real files. \" +\n \"Never invent modules, flows, or files that are not in the repository. \" +\n \"Do not modify any files.\"\n });\n\n if (!result) {\n log.error(\n \"The agent did not produce a result. Try increasing --max-turns or check credentials.\"\n );\n return 1;\n }\n\n const prepared = prepareMindmap(result, { repo: basename(opts.cwd) });\n const generatedAt = new Date().toISOString();\n // Filesystem-safe UTC run id (e.g. 20260701T034500Z): lexicographic == chronological.\n const runId = generatedAt.replace(/[-:]/g, \"\").replace(/\\.\\d+Z$/, \"Z\");\n const git = gitInfo(opts.cwd);\n const md = renderMindmapMarkdown(prepared, {\n repo: basename(opts.cwd),\n languages: resolved.languages,\n layers: resolved.layers,\n generatedAt,\n model: opts.model\n });\n\n const jsonReport = {\n schema: \"edsger.mindmap/1\",\n runId,\n generatedAt,\n model: opts.model,\n repo: basename(opts.cwd),\n git,\n languages: resolved.languages,\n standard: { name: standard.name, version: standard.version, layers: resolved.layers },\n profile: prepared.profile,\n root: prepared.root,\n nodeCount: prepared.nodeCount,\n depth: prepared.depth,\n focus: opts.focus ?? null,\n notes: prepared.notes,\n costUsd\n };\n\n // Compact, append-only trend index: one line per run, cheap to read for history.\n const historyRecord = {\n runId,\n generatedAt,\n commit: git.commit,\n branch: git.branch,\n dirty: git.dirty,\n model: opts.model,\n standardVersion: standard.version,\n nodeCount: prepared.nodeCount,\n depth: prepared.depth,\n costUsd\n };\n\n if (!opts.noWrite && !opts.dryRun) {\n const baseDir = join(opts.cwd, opts.out);\n const mdOut = md + \"\\n\";\n const jsonOut = JSON.stringify(jsonReport, null, 2) + \"\\n\";\n\n // Archive this run under runs/<timestamp>/ so previous maps are preserved.\n const runDir = join(baseDir, \"runs\", runId);\n mkdirSync(runDir, { recursive: true });\n writeFileSync(join(runDir, \"mindmap.json\"), jsonOut, \"utf8\");\n writeFileSync(join(runDir, \"mindmap.md\"), mdOut, \"utf8\");\n\n // Refresh the canonical top-level files as the stable \"latest\" pointer.\n writeFileSync(join(baseDir, \"mindmap.json\"), jsonOut, \"utf8\");\n writeFileSync(join(baseDir, \"mindmap.md\"), mdOut, \"utf8\");\n\n appendFileSync(join(baseDir, \"history.jsonl\"), JSON.stringify(historyRecord) + \"\\n\", \"utf8\");\n\n log.success(\n `Mind map written to ${pc.bold(join(opts.out, \"mindmap.md\"))} ` +\n `${pc.dim(`(run archived at ${join(opts.out, \"runs\", runId)})`)}`\n );\n }\n\n printSummary(prepared, numTurns, costUsd);\n if (opts.json) process.stdout.write(JSON.stringify(jsonReport, null, 2) + \"\\n\");\n return 0;\n}\n\n/** Show the root and the first two outline levels, Workflowy-style. */\nfunction printSummary(prepared: PreparedMindmap, numTurns: number, costUsd: number): void {\n log.heading(`${prepared.root.title} — ${prepared.nodeCount} nodes, depth ${prepared.depth}`);\n const line = (node: MindmapTreeNode, indent: string): void => {\n const kids = node.children.length ? pc.dim(` (${countNodes(node) - 1})`) : \"\";\n process.stderr.write(`${indent}${pc.cyan(\"•\")} ${node.title}${kids}\\n`);\n };\n for (const branch of prepared.root.children) {\n line(branch, \" \");\n for (const child of branch.children) line(child, \" \");\n }\n log.step(`${numTurns} turns · ~$${costUsd.toFixed(3)}`);\n}\n\nfunction countNodes(node: MindmapTreeNode): number {\n return 1 + node.children.reduce((acc, c) => acc + countNodes(c), 0);\n}\n\n// --- serve -------------------------------------------------------------------\n\nexport interface MindmapServeOptions {\n cwd: string;\n /** Mind-map output dir relative to cwd (default .edsger/mindmap). */\n dir: string;\n port: number;\n host: string;\n open: boolean;\n}\n\nexport async function runMindmapServe(opts: MindmapServeOptions): Promise<number> {\n const mindmapDir = join(opts.cwd, opts.dir);\n const viewerDir = findMindmapViewerDir();\n\n return startViewerServer({\n viewerDir,\n indexFile: \"mindmap.html\",\n dataRoute: \"/edsger-mindmap.json\",\n getData: () => assembleMindmapData(mindmapDir),\n port: opts.port,\n host: opts.host,\n open: opts.open,\n emptyHint: hasData(assembleMindmapData(mindmapDir))\n ? undefined\n : `No mind-map data in ${opts.dir} yet — run \\`edsger mindmap\\` first.`\n });\n}\n\n// --- report ------------------------------------------------------------------\n\nexport interface MindmapReportOptions {\n cwd: string;\n /** Mind-map output dir relative to cwd (default .edsger/mindmap). */\n dir: string;\n /** Output path for the self-contained HTML (relative to cwd unless absolute). */\n html: string;\n open: boolean;\n}\n\n/** Export a self-contained, shareable HTML mind-map viewer (data inlined). */\nexport async function runMindmapReport(opts: MindmapReportOptions): Promise<number> {\n const mindmapDir = join(opts.cwd, opts.dir);\n const data = assembleMindmapData(mindmapDir);\n if (!hasData(data)) {\n log.error(`No mind-map data in ${opts.dir}. Run \\`edsger mindmap\\` first.`);\n return 1;\n }\n\n const html = renderMindmapSingleFile(readMindmapViewerSingleTemplate(), data);\n const out = isAbsolute(opts.html) ? opts.html : join(opts.cwd, opts.html);\n mkdirSync(dirname(out), { recursive: true });\n writeFileSync(out, html, \"utf8\");\n\n log.success(\n `Wrote self-contained mind-map viewer to ${pc.bold(opts.html)} ` +\n `${pc.dim(`(${Math.round(html.length / 1024)} kB, open in any browser)`)}`\n );\n if (opts.open) openInBrowser(out);\n return 0;\n}\n","import type { MindmapStandard } from \"../types.js\";\nimport type { MindmapFlatNode, MindmapResult } from \"./schema.js\";\nimport { log } from \"./logger.js\";\n\n/** A node of the assembled mind-map tree (the persisted/rendered shape). */\nexport interface MindmapTreeNode {\n id: string;\n title: string;\n summary: string;\n kind: string;\n files: string[];\n children: MindmapTreeNode[];\n}\n\nexport interface PreparedMindmap {\n profile: MindmapResult[\"profile\"];\n root: MindmapTreeNode;\n nodeCount: number;\n /** Depth of the tree, root inclusive. */\n depth: number;\n /** Non-fatal issues found while assembling the tree (may be empty). */\n warnings: string[];\n notes: string | null;\n}\n\n/** Build the agent prompt that turns the standard into a repo-specific mind map. */\nexport function buildMindmapPrompt(standard: MindmapStandard, cwd: string, focus?: string): string {\n const maxDepth = standard.maxDepth ?? 5;\n const aspectsText = standard.aspects\n .map((a) => {\n const detect = a.detect?.length ? `\\n detect: ${a.detect.join(\", \")}` : \"\";\n return (\n ` - id: ${a.id}\\n` +\n ` name: ${a.name}\\n` +\n ` appliesWhen: ${a.appliesWhen.trim()}` +\n detect +\n `\\n guidance: ${a.guidance.trim()}`\n );\n })\n .join(\"\\n\");\n\n return [\n `Build an implementation mind map of the repository at: ${cwd}`,\n ``,\n `The mind map is an outline tree (like Workflowy): the root is the project,`,\n `and the branches explain how the code is actually implemented, deep enough`,\n `that leaves point at concrete files.`,\n ...(focus\n ? [\n ``,\n `FOCUS: the user asked the map to concentrate on: \"${focus}\". Give that`,\n `area most of the depth; keep other branches to a shallow orientation level.`\n ]\n : []),\n ``,\n `Method:`,\n `1. Explore the repository (Read/Grep/Glob and read-only Bash like ls, cat,`,\n ` git log). Characterise the project: what kind is it (service, library, CLI,`,\n ` SPA, data pipeline, monorepo, …) and how the source is organised.`,\n `2. You have a list of candidate top-level branches (\"aspects\") below. Keep only`,\n ` the ones THIS project's code supports (use appliesWhen/detect), rename them`,\n ` to the project's own vocabulary where that is clearer, and grow each into a`,\n ` subtree by following its guidance. Aim for 3-7 first-level branches.`,\n `3. Tree rules:`,\n ` - Root node: the project — its name as the title, a one-line summary of`,\n ` what it does. Exactly ONE root.`,\n ` - Every node: a short title (2-6 words, like an outline bullet) and a one-`,\n ` or-two-sentence summary that says something true and specific about THIS`,\n ` codebase — no generic filler.`,\n ` - Interior nodes group; leaf nodes land on concrete implementation and MUST`,\n ` cite the repo-relative file(s) they describe in \"files\".`,\n ` - Maximum depth ${maxDepth} (root inclusive). Prefer depth where the code is`,\n ` interesting, brevity where it is boilerplate. Do NOT invent structure that`,\n ` is not in the code, and do not just mirror the file listing — explain it.`,\n `4. Encode the tree as a FLAT node list: each node has a unique kebab-case \"id\"`,\n ` and a \"parentId\" referencing its parent's id (null only for the root). List`,\n ` children in reading order right after their parent. Tag each node with a`,\n ` \"kind\": area, module, component, flow, step, data, external, config, or topic.`,\n `5. When finished, call submit_result exactly once with the project profile,`,\n ` the flat node list, and optional notes.`,\n ``,\n ...(standard.guidance ? [`Overall guidance: ${standard.guidance.trim()}`, ``] : []),\n `Candidate top-level branches:`,\n aspectsText\n ].join(\"\\n\");\n}\n\n/** Slug fallback for nodes the agent left without a usable id. */\nfunction slugify(text: string): string {\n return (\n text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 60) || \"node\"\n );\n}\n\n/**\n * Assemble the agent's flat node list into a single-rooted tree, defensively:\n * duplicate ids are renamed, orphans (missing parent) are attached to the root,\n * cycles are broken, and multiple roots are gathered under a synthetic project\n * root. Every anomaly is recorded as a warning rather than a failure.\n */\nexport function prepareMindmap(result: MindmapResult, fallback: { repo: string }): PreparedMindmap {\n const warnings: string[] = [];\n\n // 1. Normalise nodes and de-duplicate ids (first occurrence keeps the id).\n const byId = new Map<string, MindmapFlatNode>();\n for (const raw of result.nodes) {\n const node = { ...raw, id: raw.id?.trim() || slugify(raw.title) };\n if (!node.title?.trim()) {\n warnings.push(`dropped a node with no title (id \"${node.id}\")`);\n continue;\n }\n let id = node.id;\n for (let n = 2; byId.has(id); n++) id = `${node.id}-${n}`;\n if (id !== node.id) warnings.push(`renamed duplicate node id \"${node.id}\" to \"${id}\"`);\n byId.set(id, { ...node, id });\n }\n\n // 2. Resolve each node's effective parent; break self-references and cycles.\n const parentOf = new Map<string, string | null>();\n for (const node of byId.values()) {\n const p = node.parentId && node.parentId !== node.id ? node.parentId : null;\n parentOf.set(node.id, p && byId.has(p) ? p : null);\n if (node.parentId && !byId.has(node.parentId)) {\n warnings.push(`node \"${node.id}\" referenced missing parent \"${node.parentId}\"`);\n }\n }\n for (const id of parentOf.keys()) {\n const seen = new Set<string>([id]);\n let cur = parentOf.get(id) ?? null;\n while (cur) {\n if (seen.has(cur)) {\n warnings.push(`broke a parent cycle at node \"${cur}\"`);\n parentOf.set(cur, null);\n break;\n }\n seen.add(cur);\n cur = parentOf.get(cur) ?? null;\n }\n }\n\n // 3. Build the forest, preserving the agent's node order within siblings.\n const treeOf = new Map<string, MindmapTreeNode>();\n for (const node of byId.values()) {\n treeOf.set(node.id, {\n id: node.id,\n title: node.title.trim(),\n summary: node.summary?.trim() ?? \"\",\n kind: node.kind?.trim() || \"topic\",\n files: node.files ?? [],\n children: []\n });\n }\n const roots: MindmapTreeNode[] = [];\n for (const node of byId.values()) {\n const tree = treeOf.get(node.id)!;\n const parent = parentOf.get(node.id);\n if (parent) treeOf.get(parent)!.children.push(tree);\n else roots.push(tree);\n }\n\n // 4. Ensure a single project root.\n let root: MindmapTreeNode;\n if (roots.length === 1 && roots[0]) {\n root = roots[0];\n } else {\n if (roots.length > 1) warnings.push(`${roots.length} root nodes — gathered under the project`);\n let rootId = \"root\";\n for (let n = 2; treeOf.has(rootId); n++) rootId = `root-${n}`;\n root = {\n id: rootId,\n title: fallback.repo,\n summary: result.profile.summary,\n kind: \"area\",\n files: [],\n children: roots\n };\n }\n\n const nodeCount = countNodes(root);\n const depth = treeDepth(root);\n if (nodeCount <= 1) log.warn(\"The agent returned an (almost) empty mind map.\");\n for (const w of warnings) log.warn(`mindmap: ${w}`);\n\n return { profile: result.profile, root, nodeCount, depth, warnings, notes: result.notes ?? null };\n}\n\nfunction countNodes(node: MindmapTreeNode): number {\n return 1 + node.children.reduce((acc, c) => acc + countNodes(c), 0);\n}\n\nfunction treeDepth(node: MindmapTreeNode): number {\n return 1 + node.children.reduce((acc, c) => Math.max(acc, treeDepth(c)), 0);\n}\n\n/** Render the mind map as a nested Markdown outline (readable + committable). */\nexport function renderMindmapMarkdown(\n prepared: PreparedMindmap,\n meta: { repo: string; languages: string[]; layers: string[]; generatedAt: string; model: string }\n): string {\n const lines: string[] = [];\n lines.push(`# Edsger Mind Map`);\n lines.push(\"\");\n lines.push(`> ${prepared.profile.summary}`);\n lines.push(\"\");\n lines.push(`| Field | Value |`);\n lines.push(`| --- | --- |`);\n lines.push(`| Repository | \\`${meta.repo}\\` |`);\n lines.push(`| Languages | ${meta.languages.join(\", \") || \"n/a\"} |`);\n lines.push(`| Project kinds | ${prepared.profile.kinds.join(\", \") || \"n/a\"} |`);\n lines.push(`| Nodes | ${prepared.nodeCount} (depth ${prepared.depth}) |`);\n lines.push(`| Standard sources | ${meta.layers.join(\" → \")} |`);\n lines.push(`| Model | ${meta.model} |`);\n lines.push(`| Generated | ${meta.generatedAt} |`);\n lines.push(\"\");\n\n lines.push(`## ${prepared.root.title}`);\n if (prepared.root.summary && prepared.root.summary !== prepared.profile.summary) {\n lines.push(\"\");\n lines.push(prepared.root.summary);\n }\n lines.push(\"\");\n for (const child of prepared.root.children) renderNode(lines, child, 0);\n\n if (prepared.notes) {\n lines.push(\"\");\n lines.push(`## Notes`);\n lines.push(\"\");\n lines.push(prepared.notes);\n }\n\n lines.push(\"\");\n lines.push(`---`);\n lines.push(`<sub>Generated by [edsger](https://www.npmjs.com/package/edsger).</sub>`);\n return lines.join(\"\\n\");\n}\n\nfunction renderNode(lines: string[], node: MindmapTreeNode, indent: number): void {\n const pad = \" \".repeat(indent);\n const files = node.files.length ? ` ${node.files.map((f) => `\\`${f}\\``).join(\" \")}` : \"\";\n const summary = node.summary ? ` — ${node.summary}` : \"\";\n lines.push(`${pad}- **${node.title}**${summary}${files}`);\n for (const child of node.children) renderNode(lines, child, indent + 1);\n}\n","import {\n cpSync,\n existsSync,\n mkdirSync,\n readFileSync,\n readdirSync,\n rmSync,\n statSync,\n writeFileSync\n} from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport pc from \"picocolors\";\nimport { findBundledAssetsDir } from \"../core/assets.js\";\nimport { log } from \"../core/logger.js\";\n\nexport interface SkillsScope {\n cwd: string;\n /** Install for the whole user (~/.claude) instead of the current project. */\n global: boolean;\n}\n\nexport interface SkillsInstallOptions extends SkillsScope {\n force: boolean;\n}\n\n/** The skills this CLI manages (must match dir names under assets/skills). */\nconst MANAGED = [\"benchmark\", \"audit\", \"pr-review\", \"pr-resolve\"];\n\nfunction targetSkillsDir(scope: SkillsScope): string {\n return scope.global ? join(homedir(), \".claude\", \"skills\") : join(scope.cwd, \".claude\", \"skills\");\n}\n\nfunction sourceSkillsDir(): string {\n return join(findBundledAssetsDir(), \"skills\");\n}\n\n/**\n * Install the edsger skills into Claude Code so `/benchmark`, `/pr-review` and\n * `/pr-resolve` work — no plugin marketplace or paths required. The skill's\n * `${CLAUDE_PLUGIN_ROOT}` references are rewritten to the bundled assets dir.\n */\nexport async function runSkillsInstall(opts: SkillsInstallOptions): Promise<number> {\n const assetsDir = findBundledAssetsDir();\n const src = sourceSkillsDir();\n if (!existsSync(src)) {\n log.error(`Bundled skills not found at ${src}. Reinstall edsger.`);\n return 1;\n }\n const dest = targetSkillsDir(opts);\n mkdirSync(dest, { recursive: true });\n\n const available = readdirSync(src).filter((n) => existsSync(join(src, n, \"SKILL.md\")));\n let installed = 0;\n for (const name of available) {\n const outDir = join(dest, name);\n if (existsSync(outDir) && !opts.force) {\n log.warn(`skill \"${name}\" already exists — use --force to overwrite`);\n continue;\n }\n // Copy the whole skill dir (in case it grows auxiliary files), then rewrite\n // the SKILL.md plugin-root token to the absolute bundled assets path.\n rmSync(outDir, { recursive: true, force: true });\n cpSync(join(src, name), outDir, { recursive: true });\n const skillFile = join(outDir, \"SKILL.md\");\n const rewritten = readFileSync(skillFile, \"utf8\")\n .split(\"${CLAUDE_PLUGIN_ROOT}\")\n .join(assetsDir);\n writeFileSync(skillFile, rewritten, \"utf8\");\n installed++;\n log.success(`installed /${name}`);\n }\n\n if (installed === 0) {\n log.info(\"Nothing installed.\");\n return 0;\n }\n log.heading(`Installed ${installed} skill(s) into ${pc.bold(dest)}`);\n log.step(`scope: ${opts.global ? \"user (all projects)\" : \"this project\"}`);\n log.step(`standards: ${assetsDir}`);\n log.step(\"Open Claude Code and run /benchmark, /audit, /pr-review, or /pr-resolve.\");\n return 0;\n}\n\nexport async function runSkillsUninstall(opts: SkillsScope): Promise<number> {\n const dest = targetSkillsDir(opts);\n let removed = 0;\n for (const name of MANAGED) {\n const dir = join(dest, name);\n if (existsSync(dir)) {\n rmSync(dir, { recursive: true, force: true });\n removed++;\n log.success(`removed /${name}`);\n }\n }\n log.info(removed ? `Removed ${removed} skill(s) from ${dest}` : \"No edsger skills found.\");\n return 0;\n}\n\nexport async function runSkillsList(opts: SkillsScope): Promise<number> {\n for (const [label, scope] of [\n [\"user\", { ...opts, global: true }],\n [\"project\", { ...opts, global: false }]\n ] as const) {\n const dir = targetSkillsDir(scope);\n const present = MANAGED.filter((n) => {\n const p = join(dir, n, \"SKILL.md\");\n return existsSync(p) && statSync(p).isFile();\n });\n log.heading(`${label}: ${dir}`);\n if (present.length) for (const n of present) process.stderr.write(` ${pc.green(\"✓\")} /${n}\\n`);\n else process.stderr.write(` ${pc.dim(\"(none installed)\")}\\n`);\n }\n return 0;\n}\n"],"mappings":"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","names":["readFileSync","resolve","pc","dirname","isAbsolute","join","pc","existsSync","join","join","existsSync","pc","pc","existsSync","readFileSync","readdirSync","join","join","existsSync","readdirSync","readFileSync","execFileSync","existsSync","statSync","join","pc","join","existsSync","statSync","resolve","pc","join","pc","isAbsolute","dirname","appendFileSync","mkdirSync","writeFileSync","basename","join","pc","join","pc","basename","buildPrompt","mkdirSync","writeFileSync","appendFileSync","printSummary","pc","writeFileSync","join","SEVERITY_RANK","pc","buildPrompt","sevColor","truncate","execFile","promisify","pc","exec","promisify","execFile","pc","buildPrompt","printSummary","join","join","mkdirSync","writeFileSync","dirname","isAbsolute","join","pc","join","isAbsolute","mkdirSync","dirname","writeFileSync","pc","appendFileSync","mkdirSync","writeFileSync","basename","dirname","isAbsolute","join","pc","join","pc","basename","mkdirSync","writeFileSync","appendFileSync","printSummary","isAbsolute","dirname","appendFileSync","mkdirSync","writeFileSync","basename","dirname","isAbsolute","join","pc","indent","join","pc","basename","mkdirSync","writeFileSync","appendFileSync","printSummary","indent","countNodes","isAbsolute","dirname","existsSync","mkdirSync","readFileSync","readdirSync","rmSync","statSync","writeFileSync","homedir","join","pc","join","homedir","existsSync","mkdirSync","readdirSync","rmSync","readFileSync","writeFileSync","pc","statSync","readFileSync","resolve","pc"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/audit.ts","../src/core/assets.ts","../src/core/logger.ts","../src/util/yaml.ts","../src/core/config.ts","../src/core/agent.ts","../src/core/dashboard.ts","../src/core/git.ts","../src/core/open.ts","../src/core/viewer-server.ts","../src/core/audit-report.ts","../src/core/schema.ts","../src/commands/benchmark.ts","../src/core/report.ts","../src/commands/pr-review.ts","../src/core/gh.ts","../src/commands/pr-resolve.ts","../src/commands/serve.ts","../src/commands/report.ts","../src/commands/diagram.ts","../src/core/diagrams.ts","../src/commands/mindmap.ts","../src/core/mindmap.ts","../src/commands/testcases.ts","../src/core/testcases.ts","../src/commands/skills.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { Command, Option } from \"commander\";\nimport pc from \"picocolors\";\nimport { runAudit, runAuditReport, runAuditServe } from \"./commands/audit.js\";\nimport { runBenchmark } from \"./commands/benchmark.js\";\nimport { runPrReview } from \"./commands/pr-review.js\";\nimport { runPrResolve } from \"./commands/pr-resolve.js\";\nimport { runServe } from \"./commands/serve.js\";\nimport { runReport } from \"./commands/report.js\";\nimport { runDiagramGenerate, runDiagramReport, runDiagramServe } from \"./commands/diagram.js\";\nimport { runMindmapGenerate, runMindmapReport, runMindmapServe } from \"./commands/mindmap.js\";\nimport {\n runTestcasesGenerate,\n runTestcasesReport,\n runTestcasesServe\n} from \"./commands/testcases.js\";\nimport { runSkillsInstall, runSkillsList, runSkillsUninstall } from \"./commands/skills.js\";\nimport { log, setVerbose } from \"./core/logger.js\";\nimport type { GlobalOptions } from \"./types.js\";\n\n// Single source of truth: read the version from package.json at runtime.\n// dist/index.js sits one level below the package root, alongside which package.json ships.\nconst pkg = JSON.parse(readFileSync(new URL(\"../package.json\", import.meta.url), \"utf8\")) as {\n version: string;\n};\nconst VERSION = pkg.version;\nconst DEFAULT_MODEL = \"claude-sonnet-4-6\";\n\ninterface RawGlobal {\n cwd?: string;\n model?: string;\n standard?: string;\n assets?: string;\n lang?: string;\n json?: boolean;\n verbose?: boolean;\n dryRun?: boolean;\n maxTurns?: string;\n timeout?: string;\n}\n\nfunction toGlobal(raw: RawGlobal): GlobalOptions {\n setVerbose(Boolean(raw.verbose));\n return {\n cwd: resolve(raw.cwd ?? process.cwd()),\n model: raw.model ?? process.env.EDSGER_MODEL ?? DEFAULT_MODEL,\n standardPath: raw.standard,\n assetsPath: raw.assets,\n lang: raw.lang,\n json: Boolean(raw.json),\n verbose: Boolean(raw.verbose),\n dryRun: Boolean(raw.dryRun),\n // Unlimited by default — only cap turns / wall-clock when explicitly asked.\n maxTurns: raw.maxTurns ? Number.parseInt(raw.maxTurns, 10) : undefined,\n timeoutMs: raw.timeout ? Number.parseFloat(raw.timeout) * 60_000 : undefined\n };\n}\n\nfunction addGlobalOptions(cmd: Command): Command {\n return cmd\n .option(\"-C, --cwd <dir>\", \"directory of the repository to operate on\")\n .addOption(new Option(\"-m, --model <model>\", \"model id for the agent\").default(undefined))\n .option(\"--standard <path>\", \"path to a custom standards dir or file (overrides bundled)\")\n .option(\"--assets <path>\", \"override the entire assets root\")\n .option(\"--lang <id>\", \"force a language id, skipping detection\")\n .option(\"--max-turns <n>\", \"cap on agentic turns (default: unlimited)\")\n .option(\"--timeout <minutes>\", \"hard wall-clock limit per agent run (default: no limit)\")\n .option(\"--json\", \"print machine-readable JSON to stdout\")\n .option(\"-v, --verbose\", \"verbose logging\")\n .option(\"--dry-run\", \"run the agent but make no persistent/external changes\");\n}\n\nasync function guard(fn: () => Promise<number>): Promise<void> {\n try {\n const code = await fn();\n process.exitCode = code;\n } catch (err) {\n log.error(err instanceof Error ? err.message : String(err));\n if (process.env.EDSGER_DEBUG && err instanceof Error)\n process.stderr.write((err.stack ?? \"\") + \"\\n\");\n process.exitCode = 1;\n }\n}\n\nconst program = new Command();\nprogram\n .name(\"edsger\")\n .description(\n \"Agentic CLI to benchmark and audit repositories and review/resolve pull requests\\n\" +\n \"against industrial-grade standards (from edsger-assets, fully overridable).\"\n )\n .version(VERSION, \"-V, --version\");\n\naddGlobalOptions(\n program\n .command(\"benchmark\")\n .description(\"Score a repository against a benchmark rubric and write a report\")\n .option(\"--out <dir>\", \"report output directory (relative to repo)\", \".edsger/benchmark\")\n .option(\"--no-write\", \"do not write report files into the repo\")\n .option(\"--serve\", \"open the dashboard after benchmarking\")\n).action(async (opts: RawGlobal & { out: string; write: boolean; serve?: boolean }) => {\n await guard(async () => {\n const g = toGlobal(opts);\n const code = await runBenchmark({ ...g, out: opts.out, noWrite: opts.write === false });\n if (code === 0 && opts.serve) {\n return runServe({ cwd: g.cwd, dir: opts.out, port: 4577, host: \"127.0.0.1\", open: true });\n }\n return code;\n });\n});\n\n// \"info\" is deliberately absent: failing on it would mean \"fail on any finding\".\nconst FAIL_ON_SEVERITIES = [\"critical\", \"high\", \"medium\", \"low\"] as const;\n\n// `edsger audit ...` — hunt for unprofessional/outdated implementations repo-wide.\nconst audit = program\n .command(\"audit\")\n .alias(\"review\")\n .description(\n \"Audit the whole repository: hunt for unprofessional, outdated, or fragile \" +\n \"implementations across every dimension and write an organised issue report\"\n );\n\naddGlobalOptions(\n audit\n .command(\"generate\", { isDefault: true })\n .description(\"Audit the repository and write the findings report\")\n .option(\"--out <dir>\", \"report output directory (relative to repo)\", \".edsger/audit\")\n .option(\"--no-write\", \"do not write report files into the repo\")\n .option(\"--only <ids>\", \"comma-separated dimension ids to audit (default: all)\")\n .option(\"--focus <text>\", \"area or concern the audit should concentrate on\")\n .addOption(\n new Option(\n \"--fail-on <severity>\",\n \"exit with code 2 if findings exist at or above this severity (CI gate)\"\n ).choices(FAIL_ON_SEVERITIES)\n )\n .option(\"--serve\", \"open the findings dashboard after auditing\")\n).action(\n async (\n opts: RawGlobal & {\n out: string;\n write: boolean;\n only?: string;\n focus?: string;\n failOn?: (typeof FAIL_ON_SEVERITIES)[number];\n serve?: boolean;\n }\n ) => {\n await guard(async () => {\n const g = toGlobal(opts);\n const code = await runAudit({\n ...g,\n out: opts.out,\n noWrite: opts.write === false,\n only: opts.only\n ? opts.only\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean)\n : undefined,\n focus: opts.focus,\n failOn: opts.failOn\n });\n // Findings above --fail-on (code 2) still produced a report worth browsing.\n if (code !== 1 && opts.serve) {\n const serveCode = await runAuditServe({\n cwd: g.cwd,\n dir: opts.out,\n port: 4580,\n host: \"127.0.0.1\",\n open: true\n });\n return code || serveCode;\n }\n return code;\n });\n }\n);\n\naudit\n .command(\"serve\")\n .description(\"Serve the audit findings dashboard locally\")\n .option(\"-C, --cwd <dir>\", \"repository directory\")\n .option(\"--dir <dir>\", \"audit output directory (relative to repo)\", \".edsger/audit\")\n .option(\"--port <n>\", \"port to listen on\", \"4580\")\n .option(\"--host <host>\", \"host to bind\", \"127.0.0.1\")\n .option(\"--no-open\", \"do not open the browser automatically\")\n .action(\n async (opts: { cwd?: string; dir: string; port: string; host: string; open: boolean }) => {\n await guard(() =>\n runAuditServe({\n cwd: resolve(opts.cwd ?? process.cwd()),\n dir: opts.dir,\n port: Number.parseInt(opts.port, 10) || 4580,\n host: opts.host,\n open: opts.open !== false\n })\n );\n }\n );\n\naudit\n .command(\"report\")\n .description(\"Export a self-contained HTML findings viewer (data inlined) for sharing\")\n .option(\"-C, --cwd <dir>\", \"repository directory\")\n .option(\"--dir <dir>\", \"audit output directory (relative to repo)\", \".edsger/audit\")\n .option(\"--html <path>\", \"output HTML file path\", \"edsger-audit.html\")\n .option(\"--open\", \"open the exported file after writing\")\n .action(async (opts: { cwd?: string; dir: string; html: string; open?: boolean }) => {\n await guard(() =>\n runAuditReport({\n cwd: resolve(opts.cwd ?? process.cwd()),\n dir: opts.dir,\n html: opts.html,\n open: Boolean(opts.open)\n })\n );\n });\n\nprogram\n .command(\"serve\")\n .description(\"Serve the benchmark dashboard (current, history, trends) locally\")\n .option(\"-C, --cwd <dir>\", \"repository directory\")\n .option(\"--dir <dir>\", \"benchmark output directory (relative to repo)\", \".edsger/benchmark\")\n .option(\"--port <n>\", \"port to listen on\", \"4577\")\n .option(\"--host <host>\", \"host to bind\", \"127.0.0.1\")\n .option(\"--no-open\", \"do not open the browser automatically\")\n .action(\n async (opts: { cwd?: string; dir: string; port: string; host: string; open: boolean }) => {\n await guard(() =>\n runServe({\n cwd: resolve(opts.cwd ?? process.cwd()),\n dir: opts.dir,\n port: Number.parseInt(opts.port, 10) || 4577,\n host: opts.host,\n open: opts.open !== false\n })\n );\n }\n );\n\nprogram\n .command(\"report\")\n .description(\"Export a self-contained HTML dashboard (data inlined) for sharing\")\n .option(\"-C, --cwd <dir>\", \"repository directory\")\n .option(\"--dir <dir>\", \"benchmark output directory (relative to repo)\", \".edsger/benchmark\")\n .option(\"--html <path>\", \"output HTML file path\", \"edsger-report.html\")\n .option(\"--open\", \"open the exported file after writing\")\n .action(async (opts: { cwd?: string; dir: string; html: string; open?: boolean }) => {\n await guard(() =>\n runReport({\n cwd: resolve(opts.cwd ?? process.cwd()),\n dir: opts.dir,\n html: opts.html,\n open: Boolean(opts.open)\n })\n );\n });\n\n// `edsger diagram ...` — generate & view repo diagrams (architecture, ER, sequence, flow…).\nconst diagram = program\n .command(\"diagram\")\n .description(\"Generate & view diagrams (architecture, ER, sequence, flow) for a repository\");\n\naddGlobalOptions(\n diagram\n .command(\"generate\", { isDefault: true })\n .description(\"Analyze the repository and generate diagrams as Mermaid\")\n .option(\"--out <dir>\", \"diagram output directory (relative to repo)\", \".edsger/diagrams\")\n .option(\"--no-write\", \"do not write diagram files into the repo\")\n .option(\"--only <ids>\", \"comma-separated catalog diagram ids to generate\")\n .option(\"--serve\", \"open the diagram dashboard after generating\")\n).action(\n async (opts: RawGlobal & { out: string; write: boolean; only?: string; serve?: boolean }) => {\n await guard(async () => {\n const g = toGlobal(opts);\n const only = opts.only\n ? opts.only\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean)\n : undefined;\n const code = await runDiagramGenerate({\n ...g,\n out: opts.out,\n noWrite: opts.write === false,\n only\n });\n if (code === 0 && opts.serve) {\n return runDiagramServe({\n cwd: g.cwd,\n dir: opts.out,\n port: 4578,\n host: \"127.0.0.1\",\n open: true\n });\n }\n return code;\n });\n }\n);\n\ndiagram\n .command(\"serve\")\n .description(\"Serve the diagram dashboard locally\")\n .option(\"-C, --cwd <dir>\", \"repository directory\")\n .option(\"--dir <dir>\", \"diagram output directory (relative to repo)\", \".edsger/diagrams\")\n .option(\"--port <n>\", \"port to listen on\", \"4578\")\n .option(\"--host <host>\", \"host to bind\", \"127.0.0.1\")\n .option(\"--no-open\", \"do not open the browser automatically\")\n .action(\n async (opts: { cwd?: string; dir: string; port: string; host: string; open: boolean }) => {\n await guard(() =>\n runDiagramServe({\n cwd: resolve(opts.cwd ?? process.cwd()),\n dir: opts.dir,\n port: Number.parseInt(opts.port, 10) || 4578,\n host: opts.host,\n open: opts.open !== false\n })\n );\n }\n );\n\ndiagram\n .command(\"report\")\n .description(\"Export a self-contained HTML diagram viewer (data inlined) for sharing\")\n .option(\"-C, --cwd <dir>\", \"repository directory\")\n .option(\"--dir <dir>\", \"diagram output directory (relative to repo)\", \".edsger/diagrams\")\n .option(\"--html <path>\", \"output HTML file path\", \"edsger-diagrams.html\")\n .option(\"--open\", \"open the exported file after writing\")\n .action(async (opts: { cwd?: string; dir: string; html: string; open?: boolean }) => {\n await guard(() =>\n runDiagramReport({\n cwd: resolve(opts.cwd ?? process.cwd()),\n dir: opts.dir,\n html: opts.html,\n open: Boolean(opts.open)\n })\n );\n });\n\n// `edsger mindmap ...` — generate & browse an implementation mind map of the repo.\nconst mindmap = program\n .command(\"mindmap\")\n .description(\"Generate & browse an implementation mind map (Workflowy-style outline) of a repo\");\n\naddGlobalOptions(\n mindmap\n .command(\"generate\", { isDefault: true })\n .description(\"Analyze the repository and generate the implementation mind map\")\n .option(\"--out <dir>\", \"mind-map output directory (relative to repo)\", \".edsger/mindmap\")\n .option(\"--no-write\", \"do not write mind-map files into the repo\")\n .option(\"--focus <text>\", \"area or topic the map should concentrate its depth on\")\n .option(\"--serve\", \"open the mind-map viewer after generating\")\n).action(\n async (opts: RawGlobal & { out: string; write: boolean; focus?: string; serve?: boolean }) => {\n await guard(async () => {\n const g = toGlobal(opts);\n const code = await runMindmapGenerate({\n ...g,\n out: opts.out,\n noWrite: opts.write === false,\n focus: opts.focus\n });\n if (code === 0 && opts.serve) {\n return runMindmapServe({\n cwd: g.cwd,\n dir: opts.out,\n port: 4579,\n host: \"127.0.0.1\",\n open: true\n });\n }\n return code;\n });\n }\n);\n\nmindmap\n .command(\"serve\")\n .description(\"Serve the mind-map viewer locally\")\n .option(\"-C, --cwd <dir>\", \"repository directory\")\n .option(\"--dir <dir>\", \"mind-map output directory (relative to repo)\", \".edsger/mindmap\")\n .option(\"--port <n>\", \"port to listen on\", \"4579\")\n .option(\"--host <host>\", \"host to bind\", \"127.0.0.1\")\n .option(\"--no-open\", \"do not open the browser automatically\")\n .action(\n async (opts: { cwd?: string; dir: string; port: string; host: string; open: boolean }) => {\n await guard(() =>\n runMindmapServe({\n cwd: resolve(opts.cwd ?? process.cwd()),\n dir: opts.dir,\n port: Number.parseInt(opts.port, 10) || 4579,\n host: opts.host,\n open: opts.open !== false\n })\n );\n }\n );\n\nmindmap\n .command(\"report\")\n .description(\"Export a self-contained HTML mind-map viewer (data inlined) for sharing\")\n .option(\"-C, --cwd <dir>\", \"repository directory\")\n .option(\"--dir <dir>\", \"mind-map output directory (relative to repo)\", \".edsger/mindmap\")\n .option(\"--html <path>\", \"output HTML file path\", \"edsger-mindmap.html\")\n .option(\"--open\", \"open the exported file after writing\")\n .action(async (opts: { cwd?: string; dir: string; html: string; open?: boolean }) => {\n await guard(() =>\n runMindmapReport({\n cwd: resolve(opts.cwd ?? process.cwd()),\n dir: opts.dir,\n html: opts.html,\n open: Boolean(opts.open)\n })\n );\n });\n\n// `edsger testcases ...` — derive & browse a manual test-case plan for the repo.\nconst testcases = program\n .command(\"testcases\")\n .alias(\"test-cases\")\n .description(\n \"Derive & browse a manual test-case plan (Workflowy-style outline) for a repo — \" +\n \"how a human should test it, not automated code tests\"\n );\n\naddGlobalOptions(\n testcases\n .command(\"generate\", { isDefault: true })\n .description(\"Analyze the repository and derive the manual test-case plan\")\n .option(\"--out <dir>\", \"test-plan output directory (relative to repo)\", \".edsger/testcases\")\n .option(\"--no-write\", \"do not write test-plan files into the repo\")\n .option(\"--focus <text>\", \"area or feature the plan should concentrate its depth on\")\n .option(\"--serve\", \"open the test-case viewer after generating\")\n).action(\n async (opts: RawGlobal & { out: string; write: boolean; focus?: string; serve?: boolean }) => {\n await guard(async () => {\n const g = toGlobal(opts);\n const code = await runTestcasesGenerate({\n ...g,\n out: opts.out,\n noWrite: opts.write === false,\n focus: opts.focus\n });\n if (code === 0 && opts.serve) {\n return runTestcasesServe({\n cwd: g.cwd,\n dir: opts.out,\n port: 4581,\n host: \"127.0.0.1\",\n open: true\n });\n }\n return code;\n });\n }\n);\n\ntestcases\n .command(\"serve\")\n .description(\"Serve the test-case viewer locally\")\n .option(\"-C, --cwd <dir>\", \"repository directory\")\n .option(\"--dir <dir>\", \"test-plan output directory (relative to repo)\", \".edsger/testcases\")\n .option(\"--port <n>\", \"port to listen on\", \"4581\")\n .option(\"--host <host>\", \"host to bind\", \"127.0.0.1\")\n .option(\"--no-open\", \"do not open the browser automatically\")\n .action(\n async (opts: { cwd?: string; dir: string; port: string; host: string; open: boolean }) => {\n await guard(() =>\n runTestcasesServe({\n cwd: resolve(opts.cwd ?? process.cwd()),\n dir: opts.dir,\n port: Number.parseInt(opts.port, 10) || 4581,\n host: opts.host,\n open: opts.open !== false\n })\n );\n }\n );\n\ntestcases\n .command(\"report\")\n .description(\"Export a self-contained HTML test-case viewer (data inlined) for sharing\")\n .option(\"-C, --cwd <dir>\", \"repository directory\")\n .option(\"--dir <dir>\", \"test-plan output directory (relative to repo)\", \".edsger/testcases\")\n .option(\"--html <path>\", \"output HTML file path\", \"edsger-testcases.html\")\n .option(\"--open\", \"open the exported file after writing\")\n .action(async (opts: { cwd?: string; dir: string; html: string; open?: boolean }) => {\n await guard(() =>\n runTestcasesReport({\n cwd: resolve(opts.cwd ?? process.cwd()),\n dir: opts.dir,\n html: opts.html,\n open: Boolean(opts.open)\n })\n );\n });\n\naddGlobalOptions(\n program\n .command(\"pr-review\")\n .description(\"Review a pull request against the review standard (requires gh)\")\n .argument(\"<pr>\", \"PR number, URL, or branch\")\n .option(\"--repo <owner/repo>\", \"target repository (defaults to current)\")\n .option(\"--post\", \"submit the review to GitHub (otherwise preview only)\")\n).action(async (pr: string, opts: RawGlobal & { repo?: string; post?: boolean }) => {\n await guard(() =>\n runPrReview({ ...toGlobal(opts), pr, repo: opts.repo, post: Boolean(opts.post) })\n );\n});\n\naddGlobalOptions(\n program\n .command(\"pr-resolve\")\n .description(\"Resolve review feedback / fix a pull request (requires gh)\")\n .argument(\"<pr>\", \"PR number, URL, or branch\")\n .option(\"--repo <owner/repo>\", \"target repository (defaults to current)\")\n .option(\"--instruction <text>\", \"what to do (defaults to addressing review comments)\")\n .option(\"--no-checkout\", \"do not check out the PR branch first\")\n .option(\"--push\", \"commit and push the changes when done\")\n).action(\n async (\n pr: string,\n opts: RawGlobal & { repo?: string; instruction?: string; checkout: boolean; push?: boolean }\n ) => {\n await guard(() =>\n runPrResolve({\n ...toGlobal(opts),\n pr,\n repo: opts.repo,\n instruction: opts.instruction,\n checkout: opts.checkout !== false,\n push: Boolean(opts.push)\n })\n );\n }\n);\n\n// `edsger skills ...` — install the skills into Claude Code with no paths needed.\nconst skills = program\n .command(\"skills\")\n .description(\n \"install edsger as Claude Code skills (/benchmark, /audit, /pr-review, /pr-resolve)\"\n );\n\nskills\n .command(\"install\")\n .description(\"install the skills into Claude Code\")\n .option(\"--global\", \"install for the current user (~/.claude/skills) [default]\")\n .option(\"--project\", \"install into ./.claude/skills instead\")\n .option(\"-C, --cwd <dir>\", \"project directory (with --project)\")\n .option(\"--force\", \"overwrite existing skills\")\n .action(async (opts: { global?: boolean; project?: boolean; cwd?: string; force?: boolean }) => {\n await guard(() =>\n runSkillsInstall({\n cwd: resolve(opts.cwd ?? process.cwd()),\n global: opts.project ? false : true,\n force: Boolean(opts.force)\n })\n );\n });\n\nskills\n .command(\"uninstall\")\n .description(\"remove the edsger skills from Claude Code\")\n .option(\"--global\", \"remove from the user scope (~/.claude/skills) [default]\")\n .option(\"--project\", \"remove from ./.claude/skills instead\")\n .option(\"-C, --cwd <dir>\", \"project directory (with --project)\")\n .action(async (opts: { global?: boolean; project?: boolean; cwd?: string }) => {\n await guard(() =>\n runSkillsUninstall({\n cwd: resolve(opts.cwd ?? process.cwd()),\n global: opts.project ? false : true\n })\n );\n });\n\nskills\n .command(\"list\")\n .description(\"show which edsger skills are installed\")\n .option(\"-C, --cwd <dir>\", \"project directory\")\n .action(async (opts: { cwd?: string }) => {\n await guard(() => runSkillsList({ cwd: resolve(opts.cwd ?? process.cwd()), global: true }));\n });\n\nprogram.addHelpText(\n \"after\",\n `\\nExamples:\\n` +\n ` ${pc.dim(\"$\")} edsger benchmark\\n` +\n ` ${pc.dim(\"$\")} edsger benchmark -C ./my-repo --json\\n` +\n ` ${pc.dim(\"$\")} edsger audit ${pc.dim(\"# nitpick the whole repo, report issues\")}\\n` +\n ` ${pc.dim(\"$\")} edsger audit --fail-on high ${pc.dim(\"# CI gate: fail on high/critical findings\")}\\n` +\n ` ${pc.dim(\"$\")} edsger diagram ${pc.dim(\"# generate diagrams for the current repo\")}\\n` +\n ` ${pc.dim(\"$\")} edsger diagram --serve ${pc.dim(\"# …and open them in the browser\")}\\n` +\n ` ${pc.dim(\"$\")} edsger diagram report --html diagrams.html\\n` +\n ` ${pc.dim(\"$\")} edsger mindmap ${pc.dim(\"# implementation mind map of the repo\")}\\n` +\n ` ${pc.dim(\"$\")} edsger mindmap --serve ${pc.dim(\"# …browse it Workflowy-style\")}\\n` +\n ` ${pc.dim(\"$\")} edsger testcases ${pc.dim(\"# manual test-case plan for the repo\")}\\n` +\n ` ${pc.dim(\"$\")} edsger testcases --serve ${pc.dim(\"# …browse the plan Workflowy-style\")}\\n` +\n ` ${pc.dim(\"$\")} edsger pr-review 123 --post\\n` +\n ` ${pc.dim(\"$\")} edsger pr-resolve 123 --instruction \"fix the failing test\" --push\\n` +\n ` ${pc.dim(\"$\")} edsger skills install ${pc.dim(\"# enable /benchmark etc. in Claude Code\")}\\n` +\n `\\nAuth: the agent uses your Claude Code login (run \\`claude\\` once to sign in); ` +\n `run \\`gh auth login\\` for PR commands.\\n`\n);\n\nprogram.parseAsync(process.argv);\n","import { appendFileSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { basename, dirname, isAbsolute, join } from \"node:path\";\nimport pc from \"picocolors\";\nimport { resolveStandard } from \"../core/assets.js\";\nimport { loadConfig } from \"../core/config.js\";\nimport { runAgent } from \"../core/agent.js\";\nimport {\n assembleAuditData,\n findAuditViewerDir,\n hasData,\n readAuditViewerSingleTemplate,\n renderAuditSingleFile\n} from \"../core/dashboard.js\";\nimport { gitInfo } from \"../core/git.js\";\nimport { log } from \"../core/logger.js\";\nimport { openInBrowser } from \"../core/open.js\";\nimport { startViewerServer } from \"../core/viewer-server.js\";\nimport {\n DEFAULT_MAX_FINDINGS,\n SEVERITY_ORDER,\n hasFindingsAtOrAbove,\n organizeAudit,\n renderAuditMarkdown,\n type OrganizedAudit\n} from \"../core/audit-report.js\";\nimport { AuditResultSchema } from \"../core/schema.js\";\nimport type { AuditStandard, GlobalOptions, Severity } from \"../types.js\";\n\nexport interface AuditOptions extends GlobalOptions {\n /** Directory to write the report into (relative to repo). */\n out: string;\n /** Skip writing files into the repo. */\n noWrite: boolean;\n /** Restrict the audit to these dimension ids. */\n only?: string[];\n /** Free-text area or concern the audit should concentrate on. */\n focus?: string;\n /** Exit non-zero when findings exist at or above this severity (CI gate). */\n failOn?: Severity;\n}\n\n/** Injectable dependencies, so tests can stub out the agentic run. */\nexport interface AuditDeps {\n agent: typeof runAgent;\n}\n\nexport async function runAudit(\n opts: AuditOptions,\n deps: AuditDeps = { agent: runAgent }\n): Promise<number> {\n const { config, path: configPath } = loadConfig(opts.cwd);\n const configDir = configPath ? join(configPath, \"..\") : opts.cwd;\n const resolved = resolveStandard(\"audit\", opts, config, configDir);\n const standard = narrowDimensions(resolved.standard as AuditStandard, opts.only);\n\n log.info(\n `Auditing ${pc.bold(basename(opts.cwd))} against ${pc.bold(standard.name)} ` +\n `(languages: ${resolved.languages.join(\", \") || \"generic\"})`\n );\n log.debug(`standard layers: ${resolved.layers.join(\" → \")}`);\n\n const { result, costUsd, numTurns } = await deps.agent({\n prompt: buildPrompt(standard, opts.cwd, opts.focus),\n cwd: opts.cwd,\n model: opts.model,\n maxTurns: opts.maxTurns,\n timeoutMs: opts.timeoutMs,\n allowWrite: false,\n verbose: opts.verbose,\n resultShape: AuditResultSchema.shape,\n systemPromptAppend:\n \"You are Edsger, an exacting staff-level engineer performing a professionalism audit \" +\n \"of an existing repository. Your job is to find what is unprofessional, outdated, \" +\n \"fragile, or sloppy — and to prove it. Every finding must cite real evidence (file, \" +\n \"and line where possible) you actually inspected. Be demanding but fair: no invented \" +\n \"problems, no vague generalities. Do not modify any files.\"\n });\n\n if (!result) {\n log.error(\n \"The agent did not produce a result. Try increasing --max-turns or check credentials.\"\n );\n return 1;\n }\n\n const organized = organizeAudit(standard, result);\n const generatedAt = new Date().toISOString();\n // Filesystem-safe UTC run id (e.g. 20260701T034500Z): lexicographic order == chronological.\n const runId = generatedAt.replace(/[-:]/g, \"\").replace(/\\.\\d+Z$/, \"Z\");\n // Correlate the findings with the code state they were found in.\n const git = gitInfo(opts.cwd);\n const md = renderAuditMarkdown(organized, {\n repo: basename(opts.cwd),\n languages: resolved.languages,\n layers: resolved.layers,\n generatedAt,\n model: opts.model\n });\n\n const jsonReport = {\n schema: \"edsger.audit/1\",\n runId,\n generatedAt,\n model: opts.model,\n repo: basename(opts.cwd),\n git,\n languages: resolved.languages,\n standard: { name: standard.name, version: standard.version, layers: resolved.layers },\n // Dimension titles in standard order, so viewers can label groups properly.\n dimensions: standard.dimensions.map((d) => ({ id: d.id, title: d.title })),\n summary: organized.summary,\n counts: organized.counts,\n total: organized.total,\n omitted: organized.omitted,\n findings: organized.findings,\n positives: organized.positives,\n costUsd\n };\n\n // Compact, append-only trend index: one line per run, cheap to read for charts.\n const historyRecord = {\n runId,\n generatedAt,\n commit: git.commit,\n branch: git.branch,\n dirty: git.dirty,\n model: opts.model,\n standardVersion: standard.version,\n total: organized.total,\n counts: organized.counts,\n costUsd\n };\n\n if (!opts.noWrite && !opts.dryRun) {\n const baseDir = join(opts.cwd, opts.out);\n const mdOut = md + \"\\n\";\n const jsonOut = JSON.stringify(jsonReport, null, 2) + \"\\n\";\n\n // Archive this run under runs/<timestamp>/ so history from repeated runs is preserved.\n const runDir = join(baseDir, \"runs\", runId);\n mkdirSync(runDir, { recursive: true });\n writeFileSync(join(runDir, \"report.md\"), mdOut, \"utf8\");\n writeFileSync(join(runDir, \"report.json\"), jsonOut, \"utf8\");\n\n // Always refresh the canonical top-level report as the stable \"latest\" pointer.\n writeFileSync(join(baseDir, \"report.md\"), mdOut, \"utf8\");\n writeFileSync(join(baseDir, \"report.json\"), jsonOut, \"utf8\");\n\n // Append one compact line to the trend index (source of truth for history).\n appendFileSync(join(baseDir, \"history.jsonl\"), JSON.stringify(historyRecord) + \"\\n\", \"utf8\");\n\n log.success(\n `Report written to ${pc.bold(join(opts.out, \"report.md\"))} ` +\n `${pc.dim(`(run archived at ${join(opts.out, \"runs\", runId)})`)}`\n );\n }\n\n printSummary(organized, numTurns, costUsd);\n if (opts.json) process.stdout.write(JSON.stringify(jsonReport, null, 2) + \"\\n\");\n\n if (opts.failOn && hasFindingsAtOrAbove(organized, opts.failOn)) {\n log.warn(`Findings at or above ${pc.bold(opts.failOn)} present — failing (--fail-on).`);\n return 2;\n }\n return 0;\n}\n\n// --- serve -------------------------------------------------------------------\n\nexport interface AuditServeOptions {\n cwd: string;\n /** Audit output dir relative to cwd (default .edsger/audit). */\n dir: string;\n port: number;\n host: string;\n open: boolean;\n}\n\nexport async function runAuditServe(opts: AuditServeOptions): Promise<number> {\n const auditDir = join(opts.cwd, opts.dir);\n const viewerDir = findAuditViewerDir();\n\n return startViewerServer({\n viewerDir,\n indexFile: \"audit.html\",\n dataRoute: \"/edsger-audit.json\",\n getData: () => assembleAuditData(auditDir),\n port: opts.port,\n host: opts.host,\n open: opts.open,\n emptyHint: hasData(assembleAuditData(auditDir))\n ? undefined\n : `No audit data in ${opts.dir} yet — run \\`edsger audit\\` first.`\n });\n}\n\n// --- report ------------------------------------------------------------------\n\nexport interface AuditReportOptions {\n cwd: string;\n /** Audit output dir relative to cwd (default .edsger/audit). */\n dir: string;\n /** Output path for the self-contained HTML (relative to cwd unless absolute). */\n html: string;\n open: boolean;\n}\n\n/** Export a self-contained, shareable HTML audit viewer (data inlined). */\nexport async function runAuditReport(opts: AuditReportOptions): Promise<number> {\n const auditDir = join(opts.cwd, opts.dir);\n const data = assembleAuditData(auditDir);\n if (!hasData(data)) {\n log.error(`No audit data in ${opts.dir}. Run \\`edsger audit\\` first.`);\n return 1;\n }\n\n const html = renderAuditSingleFile(readAuditViewerSingleTemplate(), data);\n const out = isAbsolute(opts.html) ? opts.html : join(opts.cwd, opts.html);\n mkdirSync(dirname(out), { recursive: true });\n writeFileSync(out, html, \"utf8\");\n\n log.success(\n `Wrote self-contained audit viewer to ${pc.bold(opts.html)} ` +\n `${pc.dim(`(${Math.round(html.length / 1024)} kB, open in any browser)`)}`\n );\n if (opts.open) openInBrowser(out);\n return 0;\n}\n\n/** Restrict a standard to the requested dimension ids (unknown ids are an error). */\nfunction narrowDimensions(standard: AuditStandard, only?: string[]): AuditStandard {\n if (!only || only.length === 0) return standard;\n const valid = new Set(standard.dimensions.map((d) => d.id));\n const unknown = only.filter((id) => !valid.has(id));\n if (unknown.length) {\n throw new Error(\n `Unknown dimension id(s): ${unknown.join(\", \")}. ` + `Available: ${[...valid].join(\", \")}`\n );\n }\n const keep = new Set(only);\n return { ...standard, dimensions: standard.dimensions.filter((d) => keep.has(d.id)) };\n}\n\nfunction printSummary(organized: OrganizedAudit, numTurns: number, costUsd: number): void {\n log.heading(`Findings: ${organized.total}`);\n for (const s of SEVERITY_ORDER) {\n if (organized.counts[s]) {\n process.stderr.write(` ${sevColor(s)(s.padEnd(8))} ${organized.counts[s]}\\n`);\n }\n }\n if (organized.omitted > 0) {\n log.warn(`${organized.omitted} lower-severity finding(s) omitted (maxFindings policy)`);\n }\n if (organized.quickWins.length) {\n log.step(`${organized.quickWins.length} quick win(s) — see the report's \"Quick wins\" section`);\n }\n log.step(`${numTurns} turns · ~$${costUsd.toFixed(3)}`);\n}\n\nfunction sevColor(s: Severity): (t: string) => string {\n if (s === \"critical\" || s === \"high\") return pc.red;\n if (s === \"medium\") return pc.yellow;\n return pc.dim;\n}\n\nfunction buildPrompt(standard: AuditStandard, cwd: string, focus?: string): string {\n const maxFindings = Math.max(1, standard.policy?.maxFindings ?? DEFAULT_MAX_FINDINGS);\n const dims = standard.dimensions\n .map((d) => {\n const checklist = (d.checklist ?? []).map((c) => ` - ${c}`).join(\"\\n\");\n return (\n `- id: ${d.id} (${d.title}, default severity ${d.defaultSeverity ?? \"medium\"})\\n` +\n ` guidance: ${d.guidance.trim()}` +\n (checklist ? `\\n checklist:\\n${checklist}` : \"\")\n );\n })\n .join(\"\\n\");\n\n return [\n `Audit the repository located at: ${cwd}`,\n ``,\n `This is a deliberate fault-finding pass over the WHOLE repository (not a diff): surface`,\n `everything that keeps it from being truly professional — sloppy or amateurish`,\n `implementations, outdated or deprecated patterns, fragility, and neglected hygiene.`,\n ...(standard.guidance ? [``, `Overall guidance: ${standard.guidance.trim()}`] : []),\n ...(focus ? [``, `Extra focus requested by the user: ${truncate(focus.trim(), 2000)}`] : []),\n ``,\n `Method:`,\n ...numbered([\n `Explore the repository thoroughly: structure, source, configuration, dependencies,\\n` +\n `CI, tests, and docs. Use Read/Grep/Glob and read-only Bash (ls, cat, git log).\\n` +\n `Do NOT modify anything.`,\n `For EVERY dimension below, actively hunt for violations of its guidance and\\n` +\n `checklist. Only report findings backed by evidence you actually inspected; cite the\\n` +\n `repo-relative file path and, where it applies, the 1-based line number.`,\n `For each finding choose a severity (critical/high/medium/low/info; start from the\\n` +\n `dimension's default and adjust for impact), explain why it matters, give a concrete\\n` +\n `fix, and estimate the effort (quick/moderate/involved).`,\n `When the SAME issue recurs across many files, consolidate it into ONE finding and\\n` +\n `list the other affected locations in its detail — do not repeat it per file.\\n` +\n `Report at most ${maxFindings} findings: keep the most severe, fold or drop the rest.`,\n `Also record what the repo genuinely does well (positives) — the critique must stay fair.`,\n `When finished, call submit_result exactly once with the summary, all findings, and\\n` +\n `the positives.`\n ]),\n ``,\n `Dimensions:`,\n dims\n ].join(\"\\n\");\n}\n\n/** Format prose steps as an indented, numbered list. */\nfunction numbered(steps: string[]): string[] {\n return steps.map((s, i) => {\n const [first = \"\", ...rest] = s.split(\"\\n\");\n return [`${i + 1}. ${first}`, ...rest.map((l) => ` ${l}`)].join(\"\\n\");\n });\n}\n\nfunction truncate(s: string, max: number): string {\n return s.length > max ? s.slice(0, max) + \" … [truncated]\" : s;\n}\n","import { execFileSync } from \"node:child_process\";\nimport { existsSync, readdirSync, statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type {\n AuditDimension,\n AuditStandard,\n BenchmarkStandard,\n Category,\n Criterion,\n DiagramCatalog,\n DiagramGroup,\n DiagramSpec,\n FocusArea,\n GlobalOptions,\n MindmapAspect,\n MindmapStandard,\n ResolvedStandard,\n ReviewStandard,\n Standard,\n StandardKind,\n TestcaseAspect,\n TestcasesStandard\n} from \"../types.js\";\nimport { log } from \"./logger.js\";\nimport { loadStructured } from \"../util/yaml.js\";\nimport type { EdsgerConfig } from \"./config.js\";\n\nconst moduleDir = dirname(fileURLToPath(import.meta.url));\n\n/** Walk upward from the running module to find the bundled `assets/` dir. */\nexport function findBundledAssetsDir(): string {\n if (process.env.EDSGER_ASSETS_DIR && existsSync(process.env.EDSGER_ASSETS_DIR)) {\n return process.env.EDSGER_ASSETS_DIR;\n }\n let dir = moduleDir;\n for (let i = 0; i < 8; i++) {\n const candidate = join(dir, \"assets\");\n if (existsSync(join(candidate, \"manifest.yaml\"))) return candidate;\n // Also allow running directly against an edsger-assets checkout layout.\n if (existsSync(join(dir, \"manifest.yaml\")) && existsSync(join(dir, \"benchmark\"))) {\n return dir;\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n throw new Error(\"Could not locate bundled assets. Reinstall edsger or set EDSGER_ASSETS_DIR.\");\n}\n\ninterface LanguageDetector {\n id: string;\n markers: string[];\n extensions: string[];\n}\n\ninterface LanguagesConfig {\n minScore: number;\n maxExtensionMatches: number;\n languages: LanguageDetector[];\n}\n\nfunction loadLangConfig(assetsRoot: string): LanguagesConfig | null {\n const cfgPath = join(assetsRoot, \"languages.yaml\");\n if (!existsSync(cfgPath)) return null;\n return loadStructured<LanguagesConfig>(cfgPath);\n}\n\n/** Score languages from a set of file/dir names against the detector config. */\nfunction scoreLanguages(names: string[], cfg: LanguagesConfig, minScore: number): string[] {\n const exts = new Set(names.map(extOf));\n const scored: { id: string; score: number }[] = [];\n for (const lang of cfg.languages) {\n let score = 0;\n for (const m of lang.markers) {\n if (m.includes(\"*\")) {\n const re = globToRegExp(m);\n if (names.some((f) => re.test(f))) score += 3;\n } else if (names.includes(m)) {\n score += 3;\n }\n }\n let extHits = 0;\n for (const e of lang.extensions) if (exts.has(e)) extHits++;\n score += Math.min(extHits, cfg.maxExtensionMatches);\n if (score >= minScore) scored.push({ id: lang.id, score });\n }\n return scored.sort((a, b) => b.score - a.score).map((s) => s.id);\n}\n\n/** Detect which languages a repository uses, ordered by confidence. */\nexport function detectLanguages(cwd: string, assetsRoot: string): string[] {\n const cfg = loadLangConfig(assetsRoot);\n if (!cfg) return [];\n const names = readShallowTree(cwd, 3).map((e) => e.name);\n return scoreLanguages(names, cfg, cfg.minScore);\n}\n\n/**\n * Infer languages from a list of file paths (e.g. a PR's changed files) when a\n * working-directory scan is unavailable or empty. Uses a low threshold since\n * this is a best-effort hint.\n */\nexport function inferLanguagesFromFiles(\n paths: string[],\n assetsRoot: string,\n minScore = 1\n): string[] {\n const cfg = loadLangConfig(assetsRoot);\n if (!cfg) return [];\n const names = paths.flatMap((p) => [p, p.split(\"/\").pop() ?? p]);\n return scoreLanguages(names, cfg, minScore);\n}\n\n/** Resolve the effective standard for a kind via the full override chain. */\nexport function resolveStandard(\n kind: StandardKind,\n opts: GlobalOptions,\n config: EdsgerConfig,\n configDir: string,\n /** Fallback languages used only when a working-dir scan finds nothing. */\n forcedLanguages?: string[]\n): ResolvedStandard {\n const bundled = opts.assetsPath\n ? resolveRootPath(opts.assetsPath, opts.cwd)\n : findBundledAssetsDir();\n\n const languages = opts.lang\n ? [normaliseLang(opts.lang)]\n : config.language\n ? [normaliseLang(config.language)]\n : pickDetected(detectLanguages(opts.cwd, bundled), forcedLanguages);\n\n // Ordered roots: bundled first (lowest precedence), then configured overrides.\n const roots: { path: string; label: string }[] = [\n { path: bundled, label: opts.assetsPath ? `assets:${opts.assetsPath}` : \"bundled\" }\n ];\n const perKind =\n kind === \"benchmark\"\n ? config.benchmark?.standards\n : kind === \"diagrams\"\n ? config.diagrams?.standards\n : kind === \"mindmap\"\n ? config.mindmap?.standards\n : kind === \"testcases\"\n ? config.testcases?.standards\n : kind === \"audit\"\n ? config.audit?.standards\n : config.review?.standards;\n const overrideSpec = perKind ?? config.standards;\n if (overrideSpec && !opts.assetsPath) {\n roots.push({ path: resolveRootPath(overrideSpec, configDir), label: `config:${overrideSpec}` });\n }\n\n const layers: { data: Partial<Standard>; label: string }[] = [];\n\n // 1. base + language overlays from each root.\n for (const root of roots) {\n pushIfExists(layers, join(root.path, kind, \"base.yaml\"), `${root.label}/base`);\n for (const lang of languages) {\n pushIfExists(layers, join(root.path, kind, `${lang}.yaml`), `${root.label}/${lang}`);\n }\n }\n\n // 2. repo-local .edsger/<kind>/ overlays (highest-but-one precedence).\n const repoLocal = join(opts.cwd, \".edsger\", kind);\n if (existsSync(repoLocal)) {\n pushIfExists(layers, join(repoLocal, \"base.yaml\"), `repo:.edsger/${kind}/base`);\n for (const lang of languages) {\n pushIfExists(layers, join(repoLocal, `${lang}.yaml`), `repo:.edsger/${kind}/${lang}`);\n }\n }\n\n // 3. explicit --standard path (highest precedence).\n if (opts.standardPath) {\n const p = resolveRootPath(opts.standardPath, opts.cwd);\n if (existsSync(p) && statSync(p).isDirectory()) {\n pushIfExists(layers, join(p, kind, \"base.yaml\"), `--standard/base`);\n for (const lang of languages) {\n pushIfExists(layers, join(p, kind, `${lang}.yaml`), `--standard/${lang}`);\n }\n pushIfExists(layers, join(p, \"base.yaml\"), `--standard/base`);\n } else if (existsSync(p)) {\n pushIfExists(layers, p, `--standard:${opts.standardPath}`);\n } else {\n throw new Error(`--standard path not found: ${p}`);\n }\n }\n\n if (layers.length === 0) {\n throw new Error(`No ${kind} standard found in any source.`);\n }\n\n const merged = mergeLayers(\n kind,\n layers.map((l) => l.data)\n );\n return { standard: merged, layers: layers.map((l) => l.label), languages };\n}\n\n// --- merging -----------------------------------------------------------------\n\nfunction mergeLayers(kind: StandardKind, layers: Partial<Standard>[]): Standard {\n if (kind === \"benchmark\") {\n return layers.reduce(\n (acc, layer) =>\n mergeBenchmark(acc as Partial<BenchmarkStandard>, layer as Partial<BenchmarkStandard>),\n {} as Partial<BenchmarkStandard>\n ) as BenchmarkStandard;\n }\n if (kind === \"diagrams\") {\n return layers.reduce(\n (acc, layer) =>\n mergeDiagrams(acc as Partial<DiagramCatalog>, layer as Partial<DiagramCatalog>),\n {} as Partial<DiagramCatalog>\n ) as DiagramCatalog;\n }\n if (kind === \"mindmap\") {\n return layers.reduce(\n (acc, layer) =>\n mergeMindmap(acc as Partial<MindmapStandard>, layer as Partial<MindmapStandard>),\n {} as Partial<MindmapStandard>\n ) as MindmapStandard;\n }\n if (kind === \"testcases\") {\n return layers.reduce(\n (acc, layer) =>\n mergeTestcases(acc as Partial<TestcasesStandard>, layer as Partial<TestcasesStandard>),\n {} as Partial<TestcasesStandard>\n ) as TestcasesStandard;\n }\n if (kind === \"audit\") {\n return layers.reduce(\n (acc, layer) => mergeAudit(acc as Partial<AuditStandard>, layer as Partial<AuditStandard>),\n {} as Partial<AuditStandard>\n ) as AuditStandard;\n }\n return layers.reduce(\n (acc, layer) => mergeReview(acc as Partial<ReviewStandard>, layer as Partial<ReviewStandard>),\n {} as Partial<ReviewStandard>\n ) as ReviewStandard;\n}\n\nfunction mergeDiagrams(\n base: Partial<DiagramCatalog>,\n overlay: Partial<DiagramCatalog>\n): Partial<DiagramCatalog> {\n const groups = mergeById<DiagramGroup>(base.groups ?? [], overlay.groups ?? [], (b, o) => ({\n ...b,\n ...o,\n // Diagrams with the same id are overridden; new ids are appended.\n diagrams: mergeById<DiagramSpec>(b.diagrams ?? [], o.diagrams ?? [], (bd, od) => ({\n ...bd,\n ...od\n }))\n }));\n return {\n ...base,\n ...overlay,\n // Preserve the base layer's identity rather than the last overlay's.\n id: base.id ?? overlay.id,\n name: base.name ?? overlay.name,\n version: base.version ?? overlay.version,\n kind: \"diagrams\",\n groups\n };\n}\n\nfunction mergeMindmap(\n base: Partial<MindmapStandard>,\n overlay: Partial<MindmapStandard>\n): Partial<MindmapStandard> {\n // Aspects with the same id are overridden; new ids are appended.\n const aspects = mergeById<MindmapAspect>(base.aspects ?? [], overlay.aspects ?? [], (b, o) => ({\n ...b,\n ...o\n }));\n return {\n ...base,\n ...overlay,\n // Preserve the base layer's identity rather than the last overlay's.\n id: base.id ?? overlay.id,\n name: base.name ?? overlay.name,\n version: base.version ?? overlay.version,\n kind: \"mindmap\",\n guidance: overlay.guidance ?? base.guidance,\n maxDepth: overlay.maxDepth ?? base.maxDepth,\n aspects\n };\n}\n\nfunction mergeTestcases(\n base: Partial<TestcasesStandard>,\n overlay: Partial<TestcasesStandard>\n): Partial<TestcasesStandard> {\n // Aspects with the same id are overridden; new ids are appended.\n const aspects = mergeById<TestcaseAspect>(base.aspects ?? [], overlay.aspects ?? [], (b, o) => ({\n ...b,\n ...o\n }));\n return {\n ...base,\n ...overlay,\n // Preserve the base layer's identity rather than the last overlay's.\n id: base.id ?? overlay.id,\n name: base.name ?? overlay.name,\n version: base.version ?? overlay.version,\n kind: \"testcases\",\n guidance: overlay.guidance ?? base.guidance,\n maxDepth: overlay.maxDepth ?? base.maxDepth,\n aspects\n };\n}\n\nfunction mergeBenchmark(\n base: Partial<BenchmarkStandard>,\n overlay: Partial<BenchmarkStandard>\n): Partial<BenchmarkStandard> {\n const categories = mergeById<Category>(\n base.categories ?? [],\n overlay.categories ?? [],\n (b, o) => ({\n ...b,\n ...o,\n criteria: mergeById<Criterion>(b.criteria ?? [], o.criteria ?? [], (bc, oc) => ({\n ...bc,\n ...oc\n }))\n })\n );\n return {\n ...base,\n ...overlay,\n // Preserve the base layer's identity rather than the last overlay's.\n id: base.id ?? overlay.id,\n name: base.name ?? overlay.name,\n version: base.version ?? overlay.version,\n kind: \"benchmark\",\n scoreScale: overlay.scoreScale ?? base.scoreScale ?? 4,\n categories\n };\n}\n\nfunction mergeAudit(\n base: Partial<AuditStandard>,\n overlay: Partial<AuditStandard>\n): Partial<AuditStandard> {\n // Dimensions with the same id are overridden; new ids are appended.\n const dimensions = mergeById<AuditDimension>(\n base.dimensions ?? [],\n overlay.dimensions ?? [],\n (b, o) => ({ ...b, ...o })\n );\n return {\n ...base,\n ...overlay,\n // Preserve the base layer's identity rather than the last overlay's.\n id: base.id ?? overlay.id,\n name: base.name ?? overlay.name,\n version: base.version ?? overlay.version,\n kind: \"audit\",\n guidance: overlay.guidance ?? base.guidance,\n policy: { ...(base.policy ?? {}), ...(overlay.policy ?? {}) },\n dimensions\n };\n}\n\nfunction mergeReview(\n base: Partial<ReviewStandard>,\n overlay: Partial<ReviewStandard>\n): Partial<ReviewStandard> {\n const focusAreas = mergeById<FocusArea>(\n base.focusAreas ?? [],\n overlay.focusAreas ?? [],\n (b, o) => ({\n ...b,\n ...o\n })\n );\n return {\n ...base,\n ...overlay,\n id: base.id ?? overlay.id,\n name: base.name ?? overlay.name,\n version: base.version ?? overlay.version,\n kind: \"review\",\n policy: { ...(base.policy ?? {}), ...(overlay.policy ?? {}) } as ReviewStandard[\"policy\"],\n focusAreas\n };\n}\n\nfunction mergeById<T extends { id: string }>(\n base: T[],\n overlay: T[],\n merge: (b: T, o: T) => T\n): T[] {\n const out: T[] = base.map((x) => ({ ...x }));\n const index = new Map(out.map((x, i) => [x.id, i]));\n for (const item of overlay) {\n const at = index.get(item.id);\n if (at === undefined) {\n index.set(item.id, out.length);\n out.push({ ...item });\n } else {\n out[at] = merge(out[at] as T, item);\n }\n }\n return out;\n}\n\n// --- helpers -----------------------------------------------------------------\n\nfunction pushIfExists(\n layers: { data: Partial<Standard>; label: string }[],\n path: string,\n label: string\n): void {\n if (existsSync(path)) {\n layers.push({ data: loadStructured<Partial<Standard>>(path), label });\n log.debug(`standard layer: ${label} (${path})`);\n }\n}\n\nfunction resolveRootPath(spec: string, baseDir: string): string {\n if (spec.startsWith(\"git+\") || /^(https?|git|ssh):\\/\\//.test(spec)) {\n return cloneToCache(spec.replace(/^git\\+/, \"\"));\n }\n return isAbsolute(spec) ? spec : resolve(baseDir, spec);\n}\n\n/** Clone (or reuse a cached clone of) a git standards repo. */\nfunction cloneToCache(url: string): string {\n const [repo, ref] = url.split(\"#\") as [string, string | undefined];\n const safe = repo.replace(/[^a-zA-Z0-9._-]/g, \"_\");\n const dest = join(homedir(), \".cache\", \"edsger\", \"standards\", safe);\n if (!existsSync(dest)) {\n log.step(`cloning standards repo ${repo}`);\n execFileSync(\"git\", [\"clone\", \"--depth\", \"1\", ...(ref ? [\"--branch\", ref] : []), repo, dest], {\n stdio: \"ignore\"\n });\n }\n return dest;\n}\n\ninterface Entry {\n name: string;\n}\n\n/** Read top file/dir names up to `depth` levels, skipping noise dirs. */\nfunction readShallowTree(root: string, depth: number): Entry[] {\n const skip = new Set([\n \"node_modules\",\n \".git\",\n \"dist\",\n \"build\",\n \"out\",\n \"target\",\n \"vendor\",\n \".venv\",\n \"venv\",\n \"__pycache__\",\n \".dart_tool\"\n ]);\n const out: Entry[] = [];\n const walk = (dir: string, level: number): void => {\n let items: string[];\n try {\n items = readdirSync(dir);\n } catch {\n return;\n }\n for (const name of items) {\n if (skip.has(name)) continue;\n out.push({ name });\n if (level < depth) {\n const full = join(dir, name);\n try {\n if (statSync(full).isDirectory()) walk(full, level + 1);\n } catch {\n /* ignore unreadable entries */\n }\n }\n }\n };\n walk(root, 1);\n return out;\n}\n\nfunction extOf(name: string): string {\n const i = name.lastIndexOf(\".\");\n return i < 0 ? \"\" : name.slice(i);\n}\n\nfunction globToRegExp(glob: string): RegExp {\n const escaped = glob.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\");\n return new RegExp(`^${escaped}$`);\n}\n\nfunction pickDetected(detected: string[], fallback?: string[]): string[] {\n return detected.length ? detected : (fallback ?? []);\n}\n\n/** Map a user-supplied language alias to a canonical id (best effort). */\nfunction normaliseLang(input: string): string {\n const v = input.trim().toLowerCase();\n const aliases: Record<string, string> = {\n ts: \"typescript\",\n js: \"typescript\",\n javascript: \"typescript\",\n node: \"typescript\",\n nodejs: \"typescript\",\n py: \"python\",\n golang: \"go\",\n cs: \"csharp\",\n \"c#\": \"csharp\",\n dotnet: \"csharp\",\n jvm: \"java\",\n kotlin: \"java\",\n flutter: \"dart\"\n };\n return aliases[v] ?? v;\n}\n","import pc from \"picocolors\";\n\nlet verbose = false;\n\nexport function setVerbose(v: boolean): void {\n verbose = v;\n}\n\nexport const log = {\n info(msg: string): void {\n process.stderr.write(`${pc.cyan(\"•\")} ${msg}\\n`);\n },\n success(msg: string): void {\n process.stderr.write(`${pc.green(\"✓\")} ${msg}\\n`);\n },\n warn(msg: string): void {\n process.stderr.write(`${pc.yellow(\"!\")} ${msg}\\n`);\n },\n error(msg: string): void {\n process.stderr.write(`${pc.red(\"✗\")} ${msg}\\n`);\n },\n step(msg: string): void {\n process.stderr.write(`${pc.dim(\" →\")} ${pc.dim(msg)}\\n`);\n },\n debug(msg: string): void {\n if (verbose) process.stderr.write(`${pc.dim(` ${msg}`)}\\n`);\n },\n /** Print a heading to stderr so structured stdout stays clean. */\n heading(msg: string): void {\n process.stderr.write(`\\n${pc.bold(msg)}\\n`);\n }\n};\n","import { readFileSync } from \"node:fs\";\nimport yaml from \"js-yaml\";\n\n/** Parse a YAML or JSON file into a plain object. */\nexport function loadStructured<T = unknown>(path: string): T {\n const raw = readFileSync(path, \"utf8\");\n return yaml.load(raw) as T;\n}\n\n/** Parse a YAML or JSON string. */\nexport function parseStructured<T = unknown>(raw: string): T {\n return yaml.load(raw) as T;\n}\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { loadStructured } from \"../util/yaml.js\";\n\n/**\n * User configuration, discovered from the target repository or home dir.\n * Everything is optional — zero config falls back to bundled assets.\n */\nexport interface EdsgerConfig {\n /** Default model for agent runs. */\n model?: string;\n /**\n * Override the standards source. Either:\n * - a local path (absolute, or relative to the config file), or\n * - a git URL (clone + cache) — supported via the `git+` prefix.\n */\n standards?: string;\n /** Force a language id, skipping auto-detection. */\n language?: string;\n /** Per-kind overrides, e.g. { benchmark: \"./team-standards\" }. */\n benchmark?: { standards?: string };\n review?: { standards?: string };\n audit?: { standards?: string };\n diagrams?: { standards?: string };\n mindmap?: { standards?: string };\n testcases?: { standards?: string };\n}\n\nconst CONFIG_FILENAMES = [\n \"edsger.config.yaml\",\n \"edsger.config.yml\",\n \"edsger.config.json\",\n \".edsgerrc.yaml\",\n \".edsgerrc.yml\",\n \".edsgerrc.json\",\n \".edsgerrc\"\n];\n\n/** Find and load an edsger config file from `cwd`, then `.edsger/`. */\nexport function loadConfig(cwd: string): { config: EdsgerConfig; path?: string } {\n const searchDirs = [cwd, join(cwd, \".edsger\")];\n for (const dir of searchDirs) {\n for (const name of CONFIG_FILENAMES) {\n const p = join(dir, name);\n if (existsSync(p)) {\n try {\n const config = loadStructured<EdsgerConfig>(p) ?? {};\n return { config, path: p };\n } catch {\n // Malformed config should not crash discovery; ignore and continue.\n }\n }\n }\n }\n return { config: {} };\n}\n","import {\n createSdkMcpServer,\n query,\n tool,\n type McpServerConfig\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport type { ZodRawShape } from \"zod\";\nimport { z } from \"zod\";\nimport pc from \"picocolors\";\nimport { log } from \"./logger.js\";\n\nexport interface AgentRunOptions<Shape extends ZodRawShape> {\n /** The instruction given to the agent. */\n prompt: string;\n /** Working directory the agent operates in. */\n cwd: string;\n model: string;\n /** Cap on agentic turns; undefined = unlimited. */\n maxTurns?: number;\n /** Whether the agent may modify files (Edit/Write) and run mutating commands. */\n allowWrite: boolean;\n /** Appended to the Claude Code system prompt preset. */\n systemPromptAppend: string;\n /**\n * Zod shape describing the structured result. The agent is required to call a\n * `submit_result` tool with this shape exactly once; its validated args are\n * returned. This is the reliable way to get machine-readable output.\n */\n resultShape: Shape;\n /** Extra MCP servers (e.g. github) to expose to the agent. */\n extraMcpServers?: Record<string, McpServerConfig>;\n /** Extra tool names to allow (e.g. \"mcp__github__*\"). */\n extraAllowedTools?: string[];\n /** Hard wall-clock limit; the run is aborted if it exceeds this. */\n timeoutMs?: number;\n verbose: boolean;\n}\n\nexport interface AgentRunResult<T> {\n result: T | undefined;\n costUsd: number;\n numTurns: number;\n}\n\nconst READ_ONLY_DISALLOWED = [\"Edit\", \"Write\", \"NotebookEdit\"];\n\n/**\n * Run an agentic loop with the Claude Agent SDK and collect a structured\n * result. Read-only runs have edit tools removed from the agent's context.\n */\nexport async function runAgent<Shape extends ZodRawShape>(\n opts: AgentRunOptions<Shape>\n): Promise<AgentRunResult<z.infer<z.ZodObject<Shape>>>> {\n type Result = z.infer<z.ZodObject<Shape>>;\n let captured: Result | undefined;\n\n const submitTool = tool(\n \"submit_result\",\n \"Submit the final structured result. Call this exactly once when done.\",\n opts.resultShape,\n async (args) => {\n captured = args as Result;\n return { content: [{ type: \"text\", text: \"Result recorded. You may stop now.\" }] };\n }\n );\n\n const outServer = createSdkMcpServer({\n name: \"edsger_out\",\n version: \"1.0.0\",\n tools: [submitTool]\n });\n\n const allowedTools = [\n \"Read\",\n \"Grep\",\n \"Glob\",\n \"Bash\",\n \"mcp__edsger_out__submit_result\",\n ...(opts.allowWrite ? [\"Edit\", \"Write\", \"MultiEdit\"] : []),\n ...(opts.extraAllowedTools ?? [])\n ];\n\n const mcpServers: Record<string, McpServerConfig> = {\n edsger_out: outServer,\n ...(opts.extraMcpServers ?? {})\n };\n\n let costUsd = 0;\n let numTurns = 0;\n\n // Enforce a wall-clock limit so a stuck run cannot hang a CI job.\n const controller = new AbortController();\n const timer = opts.timeoutMs ? setTimeout(() => controller.abort(), opts.timeoutMs) : undefined;\n\n const stream = query({\n prompt: opts.prompt,\n options: {\n model: opts.model,\n cwd: opts.cwd,\n // Only impose a turn cap when the user explicitly set one; otherwise let the\n // agent run to completion (no max-turns stop).\n ...(opts.maxTurns ? { maxTurns: opts.maxTurns } : {}),\n // Reproducible runs: do not load the target repo's settings/CLAUDE.md.\n settingSources: [],\n systemPrompt: {\n type: \"preset\",\n preset: \"claude_code\",\n append: opts.systemPromptAppend\n },\n // The user explicitly invoked an agent to inspect/modify their own repo.\n // Capability is shaped by allowedTools/disallowedTools rather than prompts:\n // read-only runs have edit tools removed from context entirely (below).\n permissionMode: \"bypassPermissions\",\n allowedTools,\n disallowedTools: opts.allowWrite ? [] : READ_ONLY_DISALLOWED,\n mcpServers,\n abortController: controller\n }\n });\n\n let turn = 0;\n try {\n for await (const message of stream as AsyncIterable<AnyMessage>) {\n if (message.type === \"assistant\") {\n turn += 1;\n for (const block of message.message?.content ?? []) {\n if (block.type === \"tool_use\") {\n // Visible by default so a long run shows live progress, not a frozen screen.\n const counter = opts.maxTurns ? `${turn}/${opts.maxTurns}` : `${turn}`;\n log.step(`[${counter}] ${summarizeTool(block.name, block.input)}`);\n } else if (block.type === \"text\" && opts.verbose && block.text?.trim()) {\n // The agent's reasoning — only in verbose mode, and only the first few lines.\n for (const line of block.text.trim().split(\"\\n\").slice(0, 4)) {\n if (line.trim()) log.debug(line.trim());\n }\n }\n }\n } else if (message.type === \"result\") {\n costUsd = message.total_cost_usd ?? 0;\n numTurns = message.num_turns ?? 0;\n if (message.subtype && message.subtype !== \"success\") {\n log.warn(`agent ended with: ${message.subtype}`);\n }\n }\n }\n } catch (err) {\n if (controller.signal.aborted) {\n throw new Error(`Agent run timed out after ${Math.round((opts.timeoutMs ?? 0) / 1000)}s.`);\n }\n throw err;\n } finally {\n if (timer) clearTimeout(timer);\n }\n\n return { result: captured, costUsd, numTurns };\n}\n\n// Minimal structural typing over the SDK message union so we are resilient to\n// version drift in exported type names.\ninterface AnyMessage {\n type: string;\n subtype?: string;\n total_cost_usd?: number;\n num_turns?: number;\n message?: {\n content?: Array<{\n type: string;\n name?: string;\n text?: string;\n input?: Record<string, unknown>;\n }>;\n };\n}\n\n/** One-line, human-readable summary of a tool call for progress output. */\nfunction summarizeTool(name = \"tool\", input: Record<string, unknown> = {}): string {\n const str = (v: unknown): string => (typeof v === \"string\" ? v : \"\");\n const oneLine = (v: string, max = 80): string => {\n const s = v.replace(/\\s+/g, \" \").trim();\n return s.length > max ? s.slice(0, max - 1) + \"…\" : s;\n };\n const base = (p: string): string => p.split(\"/\").filter(Boolean).pop() ?? p;\n\n switch (name) {\n case \"Read\":\n case \"Edit\":\n case \"Write\":\n case \"MultiEdit\":\n case \"NotebookEdit\":\n return `${name} ${base(str(input.file_path))}`;\n case \"Bash\": {\n const cmd = oneLine(str(input.command));\n return `Bash ${cmd ? pc.dim(`$ ${cmd}`) : \"\"}`.trimEnd();\n }\n case \"Grep\": {\n const where = str(input.path) || str(input.glob);\n return `Grep /${oneLine(str(input.pattern), 40)}/${where ? ` in ${base(where)}` : \"\"}`;\n }\n case \"Glob\":\n return `Glob ${oneLine(str(input.pattern), 60)}`;\n case \"mcp__edsger_out__submit_result\":\n return \"recording result\";\n default:\n return name;\n }\n}\n","import { existsSync, readFileSync, readdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { findBundledAssetsDir } from \"./assets.js\";\n\nexport interface EdsgerData {\n repo?: string;\n latest: unknown | null;\n history: unknown[];\n runs: Record<string, unknown>;\n}\n\n/**\n * Assemble a dashboard data object from an output directory: the latest report,\n * the compact history index, and the full per-run reports for drill-down. The\n * `latestFile` differs per kind (benchmark → report.json, diagrams → diagrams.json).\n */\nexport function assembleFrom(dir: string, latestFile: string): EdsgerData {\n const latest = readJson(join(dir, latestFile));\n const history = readJsonl(join(dir, \"history.jsonl\"));\n\n const runs: Record<string, unknown> = {};\n const runsDir = join(dir, \"runs\");\n if (existsSync(runsDir)) {\n for (const entry of readdirSync(runsDir)) {\n const report = readJson(join(runsDir, entry, latestFile));\n if (report) runs[entry] = report;\n }\n }\n\n const repo =\n latest && typeof latest === \"object\" && \"repo\" in latest\n ? (latest as { repo?: string }).repo\n : undefined;\n\n return { repo, latest, history, runs };\n}\n\n/** Assemble the benchmark dashboard data object from a benchmark output directory. */\nexport function assembleData(benchmarkDir: string): EdsgerData {\n return assembleFrom(benchmarkDir, \"report.json\");\n}\n\n/** Assemble the diagram dashboard data object from a diagrams output directory. */\nexport function assembleDiagramData(diagramsDir: string): EdsgerData {\n return assembleFrom(diagramsDir, \"diagrams.json\");\n}\n\n/** Assemble the mind-map viewer data object from a mindmap output directory. */\nexport function assembleMindmapData(mindmapDir: string): EdsgerData {\n return assembleFrom(mindmapDir, \"mindmap.json\");\n}\n\n/** Assemble the test-case viewer data object from a testcases output directory. */\nexport function assembleTestcasesData(testcasesDir: string): EdsgerData {\n return assembleFrom(testcasesDir, \"testcases.json\");\n}\n\n/** Assemble the audit viewer data object from an audit output directory. */\nexport function assembleAuditData(auditDir: string): EdsgerData {\n return assembleFrom(auditDir, \"report.json\");\n}\n\n/** True when the directory holds at least a latest report or some history. */\nexport function hasData(data: EdsgerData): boolean {\n return Boolean(data.latest) || data.history.length > 0;\n}\n\n/**\n * Locate a bundled multi-file viewer directory (e.g. assets/viewer). `subdir`\n * selects which viewer, and `index` its entry html filename.\n */\nexport function findViewerDir(subdir = \"viewer\", index = \"index.html\"): string {\n const dir = join(findBundledAssetsDir(), subdir);\n if (!existsSync(join(dir, index))) {\n throw new Error(\n `Dashboard viewer assets not found (${subdir}/${index}). Reinstall edsger, or run ` +\n \"`npm run sync-viewer` in a dev checkout.\"\n );\n }\n return dir;\n}\n\n/** Locate the bundled diagram viewer directory (assets/diagrams-viewer). */\nexport function findDiagramViewerDir(): string {\n return findViewerDir(\"diagrams-viewer\", \"diagrams.html\");\n}\n\n/** Locate the bundled mind-map viewer directory (assets/mindmap-viewer). */\nexport function findMindmapViewerDir(): string {\n return findViewerDir(\"mindmap-viewer\", \"mindmap.html\");\n}\n\n/** Locate the bundled test-case viewer directory (assets/testcases-viewer). */\nexport function findTestcasesViewerDir(): string {\n return findViewerDir(\"testcases-viewer\", \"testcases.html\");\n}\n\n/** Locate the bundled audit viewer directory (assets/audit-viewer). */\nexport function findAuditViewerDir(): string {\n return findViewerDir(\"audit-viewer\", \"audit.html\");\n}\n\n/** Read a single-file viewer template bundled under assets/. */\nexport function readSingleTemplate(file: string): string {\n const path = join(findBundledAssetsDir(), file);\n if (!existsSync(path)) {\n throw new Error(\n `Single-file viewer template not found (${file}). Reinstall edsger, or run \\`npm run sync-viewer\\`.`\n );\n }\n return readFileSync(path, \"utf8\");\n}\n\n/** Read the benchmark single-file viewer template (assets/viewer-single.html). */\nexport function readViewerSingleTemplate(): string {\n return readSingleTemplate(\"viewer-single.html\");\n}\n\n/** Read the diagram single-file viewer template (assets/diagrams-viewer-single.html). */\nexport function readDiagramViewerSingleTemplate(): string {\n return readSingleTemplate(\"diagrams-viewer-single.html\");\n}\n\n/** Read the mind-map single-file viewer template (assets/mindmap-viewer-single.html). */\nexport function readMindmapViewerSingleTemplate(): string {\n return readSingleTemplate(\"mindmap-viewer-single.html\");\n}\n\n/** Read the test-case single-file viewer template (assets/testcases-viewer-single.html). */\nexport function readTestcasesViewerSingleTemplate(): string {\n return readSingleTemplate(\"testcases-viewer-single.html\");\n}\n\n/** Read the audit single-file viewer template (assets/audit-viewer-single.html). */\nexport function readAuditViewerSingleTemplate(): string {\n return readSingleTemplate(\"audit-viewer-single.html\");\n}\n\n/** Inject a data object into a single-file template under the given global name. */\nexport function renderSingleFileWith(\n template: string,\n data: EdsgerData,\n globalName: string\n): string {\n // JSON is embedded in a script tag; escape \"</\" so a \"</script>\" in any string cannot break out.\n const json = JSON.stringify(data).replace(/<\\//g, \"<\\\\/\");\n const tag = `<script>window.${globalName}=${json}</script>`;\n\n // Prefer the explicit placeholder comment in the template — it names the global\n // and is collision-proof. A naive replace of \"</head>\"/\"<body>\" is unsafe: the\n // inlined bundle (e.g. mermaid) can contain those exact strings, so the first\n // match may land inside JS and break the file. A function replacer also avoids\n // String.replace's special \"$\" patterns firing on arbitrary data.\n const placeholder = new RegExp(`<!--[^>]*${globalName}[^>]*-->`);\n if (placeholder.test(template)) return template.replace(placeholder, () => tag);\n\n // Fallback: inject just before the first <script> so the global is set first.\n const scriptIdx = template.indexOf(\"<script\");\n if (scriptIdx !== -1) return template.slice(0, scriptIdx) + tag + template.slice(scriptIdx);\n\n // Last resort.\n const headIdx = template.lastIndexOf(\"</head>\");\n if (headIdx !== -1) return template.slice(0, headIdx) + tag + template.slice(headIdx);\n return tag + template;\n}\n\n/** Inject the benchmark data as window.__EDSGER_DATA__. */\nexport function renderSingleFile(template: string, data: EdsgerData): string {\n return renderSingleFileWith(template, data, \"__EDSGER_DATA__\");\n}\n\n/** Inject the diagram data as window.__EDSGER_DIAGRAMS__. */\nexport function renderDiagramsSingleFile(template: string, data: EdsgerData): string {\n return renderSingleFileWith(template, data, \"__EDSGER_DIAGRAMS__\");\n}\n\n/** Inject the mind-map data as window.__EDSGER_MINDMAP__. */\nexport function renderMindmapSingleFile(template: string, data: EdsgerData): string {\n return renderSingleFileWith(template, data, \"__EDSGER_MINDMAP__\");\n}\n\n/** Inject the test-case data as window.__EDSGER_TESTCASES__. */\nexport function renderTestcasesSingleFile(template: string, data: EdsgerData): string {\n return renderSingleFileWith(template, data, \"__EDSGER_TESTCASES__\");\n}\n\n/** Inject the audit data as window.__EDSGER_AUDIT__. */\nexport function renderAuditSingleFile(template: string, data: EdsgerData): string {\n return renderSingleFileWith(template, data, \"__EDSGER_AUDIT__\");\n}\n\nfunction readJson(path: string): unknown | null {\n try {\n return JSON.parse(readFileSync(path, \"utf8\"));\n } catch {\n return null;\n }\n}\n\nfunction readJsonl(path: string): unknown[] {\n if (!existsSync(path)) return [];\n const out: unknown[] = [];\n for (const line of readFileSync(path, \"utf8\").split(\"\\n\")) {\n const t = line.trim();\n if (!t) continue;\n try {\n out.push(JSON.parse(t));\n } catch {\n // skip malformed lines\n }\n }\n return out;\n}\n","import { execFileSync } from \"node:child_process\";\n\nexport interface GitInfo {\n /** Short commit SHA of HEAD, or null when not a git repo. */\n commit: string | null;\n /** Current branch name, or null when detached/unavailable. */\n branch: string | null;\n /** True when the working tree has uncommitted changes. */\n dirty: boolean;\n}\n\nfunction tryGit(args: string[], cwd: string): string | null {\n try {\n return execFileSync(\"git\", args, {\n cwd,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"]\n }).trim();\n } catch {\n return null;\n }\n}\n\n/** Best-effort git metadata for the repo at `cwd`; never throws. */\nexport function gitInfo(cwd: string): GitInfo {\n const commit = tryGit([\"rev-parse\", \"--short\", \"HEAD\"], cwd);\n const branch = tryGit([\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], cwd);\n const status = tryGit([\"status\", \"--porcelain\"], cwd);\n return {\n commit,\n branch: branch && branch !== \"HEAD\" ? branch : null,\n dirty: Boolean(status && status.length > 0)\n };\n}\n","import { spawn } from \"node:child_process\";\n\n/** Open a URL or file path in the OS default browser; best-effort, never throws. */\nexport function openInBrowser(target: string): void {\n const platform = process.platform;\n const cmd = platform === \"darwin\" ? \"open\" : platform === \"win32\" ? \"cmd\" : \"xdg-open\";\n const args = platform === \"win32\" ? [\"/c\", \"start\", \"\", target] : [target];\n try {\n spawn(cmd, args, { stdio: \"ignore\", detached: true }).unref();\n } catch {\n // ignore — the URL is printed for the user to open manually\n }\n}\n","import { createReadStream, existsSync, statSync } from \"node:fs\";\nimport { createServer } from \"node:http\";\nimport { extname, join, normalize } from \"node:path\";\nimport pc from \"picocolors\";\nimport { openInBrowser } from \"./open.js\";\nimport { log } from \"./logger.js\";\nimport type { EdsgerData } from \"./dashboard.js\";\n\nconst MIME: Record<string, string> = {\n \".html\": \"text/html; charset=utf-8\",\n \".js\": \"text/javascript; charset=utf-8\",\n \".css\": \"text/css; charset=utf-8\",\n \".json\": \"application/json; charset=utf-8\",\n \".svg\": \"image/svg+xml\",\n \".map\": \"application/json\",\n \".ico\": \"image/x-icon\",\n \".woff2\": \"font/woff2\",\n \".woff\": \"font/woff\"\n};\n\nexport interface ViewerServerOptions {\n /** Directory holding the built viewer (index + assets). */\n viewerDir: string;\n /** Entry html filename served for `/` and as the SPA fallback. */\n indexFile: string;\n /** URL path that returns the freshly-assembled data JSON. */\n dataRoute: string;\n /** Assemble the data object; called per request so re-runs show on refresh. */\n getData: () => EdsgerData;\n port: number;\n host: string;\n open: boolean;\n /** Shown in the \"no data yet\" hint, e.g. \".edsger/diagrams\" + a command. */\n emptyHint?: string;\n}\n\n/**\n * Serve a bundled single-page viewer, assembling its data fresh on each request.\n * Shared by `edsger serve` (benchmark) and `edsger diagram serve`.\n */\nexport async function startViewerServer(opts: ViewerServerOptions): Promise<number> {\n const server = createServer((req, res) => {\n const url = (req.url ?? \"/\").split(\"?\")[0] ?? \"/\";\n\n if (url === opts.dataRoute) {\n res.writeHead(200, {\n \"content-type\": \"application/json; charset=utf-8\",\n \"cache-control\": \"no-store\"\n });\n res.end(JSON.stringify(opts.getData()));\n return;\n }\n\n const rel = url === \"/\" ? opts.indexFile : decodeURIComponent(url.replace(/^\\/+/, \"\"));\n const safe = normalize(rel).replace(/^(\\.\\.(?:[/\\\\]|$))+/, \"\");\n let file = join(opts.viewerDir, safe);\n if (!file.startsWith(opts.viewerDir)) {\n res.writeHead(403);\n res.end(\"forbidden\");\n return;\n }\n // SPA fallback: unknown paths serve the entry html.\n if (!existsSync(file) || statSync(file).isDirectory())\n file = join(opts.viewerDir, opts.indexFile);\n res.writeHead(200, { \"content-type\": MIME[extname(file)] ?? \"application/octet-stream\" });\n createReadStream(file).pipe(res);\n });\n\n return new Promise<number>((resolve, reject) => {\n server.on(\"error\", reject);\n server.listen(opts.port, opts.host, () => {\n const addr = server.address();\n const port = typeof addr === \"object\" && addr ? addr.port : opts.port;\n const shownHost = opts.host === \"0.0.0.0\" ? \"localhost\" : opts.host;\n const url = `http://${shownHost}:${port}/`;\n\n if (opts.emptyHint) log.warn(opts.emptyHint);\n log.success(`Dashboard at ${pc.bold(pc.cyan(url))} ${pc.dim(\"(Ctrl-C to stop)\")}`);\n if (opts.open) openInBrowser(url);\n });\n\n const shutdown = (): void => {\n server.close(() => resolve(0));\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n });\n}\n","import type { AuditStandard, Severity } from \"../types.js\";\nimport type { AuditFinding, AuditResult } from \"./schema.js\";\n\nexport const SEVERITY_ORDER: Severity[] = [\"critical\", \"high\", \"medium\", \"low\", \"info\"];\n\n/** Fallback cap when the standard's policy does not set one. */\nexport const DEFAULT_MAX_FINDINGS = 60;\n\nconst SEVERITY_RANK: Record<Severity, number> = {\n critical: 4,\n high: 3,\n medium: 2,\n low: 1,\n info: 0\n};\n\n/** A finding after organisation; duplicates are folded into `moreLocations`. */\nexport interface OrganizedFinding extends AuditFinding {\n /** Extra \"file:line\" locations merged from findings with the same title. */\n moreLocations: string[];\n}\n\nexport interface AuditGroup {\n id: string;\n title: string;\n findings: OrganizedFinding[];\n}\n\nexport interface OrganizedAudit {\n standardName: string;\n standardVersion: string;\n summary: string;\n positives: string[];\n /** Reported findings, most severe first (deduplicated and capped). */\n findings: OrganizedFinding[];\n /** Findings grouped by dimension, in the standard's dimension order. */\n groups: AuditGroup[];\n counts: Record<Severity, number>;\n total: number;\n /** Findings dropped by the policy cap (lowest severity first). */\n omitted: number;\n /** Low-effort findings worth fixing first, most severe first. */\n quickWins: OrganizedFinding[];\n}\n\n/**\n * Deterministically organise the agent's findings: fold duplicates (same\n * dimension + title) into one finding with extra locations, severity-sort,\n * apply the policy's findings cap, group by the standard's dimensions\n * (unknown dimension ids fall into \"other\"), and surface quick wins.\n */\nexport function organizeAudit(standard: AuditStandard, result: AuditResult): OrganizedAudit {\n const merged = mergeDuplicates(result.findings ?? []);\n merged.sort((a, b) => SEVERITY_RANK[b.severity] - SEVERITY_RANK[a.severity]);\n\n // Keep reports readable: drop the lowest-severity tail beyond the cap.\n const cap = Math.max(1, standard.policy?.maxFindings ?? DEFAULT_MAX_FINDINGS);\n const omitted = Math.max(0, merged.length - cap);\n const findings = merged.slice(0, cap);\n\n const known = new Map(standard.dimensions.map((d) => [d.id, d.title]));\n const groups: AuditGroup[] = standard.dimensions.map((d) => ({\n id: d.id,\n title: d.title,\n findings: []\n }));\n const other: AuditGroup = { id: \"other\", title: \"Other\", findings: [] };\n const byId = new Map(groups.map((g) => [g.id, g]));\n for (const f of findings) {\n (known.has(f.dimension) ? byId.get(f.dimension)! : other).findings.push(f);\n }\n if (other.findings.length) groups.push(other);\n\n const counts: Record<Severity, number> = { critical: 0, high: 0, medium: 0, low: 0, info: 0 };\n for (const f of findings) counts[f.severity]++;\n\n const quickWins = findings.filter((f) => f.effort === \"quick\" && f.severity !== \"info\");\n\n return {\n standardName: standard.name,\n standardVersion: standard.version,\n summary: result.summary,\n positives: result.positives ?? [],\n findings,\n groups: groups.filter((g) => g.findings.length > 0),\n counts,\n total: findings.length,\n omitted,\n quickWins\n };\n}\n\n/**\n * Fold findings that share a dimension and (case-insensitive) title into one:\n * the most severe instance wins; the others contribute their locations.\n */\nfunction mergeDuplicates(findings: AuditFinding[]): OrganizedFinding[] {\n const byKey = new Map<string, OrganizedFinding>();\n const out: OrganizedFinding[] = [];\n for (const f of findings) {\n const key = `${f.dimension}\u0000${f.title.trim().toLowerCase()}`;\n const seen = byKey.get(key);\n if (!seen) {\n const first: OrganizedFinding = { ...f, moreLocations: [] };\n byKey.set(key, first);\n out.push(first);\n continue;\n }\n // Keep the most severe instance as the primary; fold the other's location in.\n const [primary, extra] =\n SEVERITY_RANK[f.severity] > SEVERITY_RANK[seen.severity]\n ? [{ ...f, moreLocations: seen.moreLocations }, seen]\n : [seen, f];\n const loc = locationKey(extra);\n const primaryLoc = locationKey(primary);\n if (loc && loc !== primaryLoc && !primary.moreLocations.includes(loc)) {\n primary.moreLocations.push(loc);\n }\n if (primary !== seen) {\n out[out.indexOf(seen)] = primary;\n byKey.set(key, primary);\n }\n }\n return out;\n}\n\n/** True when any finding is at or above the given severity threshold. */\nexport function hasFindingsAtOrAbove(organized: OrganizedAudit, threshold: Severity): boolean {\n return organized.findings.some((f) => SEVERITY_RANK[f.severity] >= SEVERITY_RANK[threshold]);\n}\n\n/** Render the audit as a human-readable Markdown report. */\nexport function renderAuditMarkdown(\n organized: OrganizedAudit,\n meta: { repo: string; languages: string[]; layers: string[]; generatedAt: string; model: string }\n): string {\n const lines: string[] = [];\n lines.push(`# Edsger Audit Report`);\n lines.push(\"\");\n lines.push(`> ${organized.summary}`);\n lines.push(\"\");\n lines.push(`| Field | Value |`);\n lines.push(`| --- | --- |`);\n lines.push(`| Repository | \\`${meta.repo}\\` |`);\n lines.push(`| Languages | ${meta.languages.join(\", \") || \"n/a\"} |`);\n lines.push(`| Standard | ${organized.standardName} v${organized.standardVersion} |`);\n lines.push(`| Sources | ${meta.layers.join(\" → \")} |`);\n lines.push(`| Model | ${meta.model} |`);\n lines.push(`| Generated | ${meta.generatedAt} |`);\n lines.push(\"\");\n\n lines.push(`## Findings by severity`);\n lines.push(\"\");\n lines.push(`| Severity | Count |`);\n lines.push(`| --- | ---: |`);\n for (const s of SEVERITY_ORDER) {\n if (organized.counts[s]) lines.push(`| ${s} | ${organized.counts[s]} |`);\n }\n lines.push(`| **total** | **${organized.total}** |`);\n lines.push(\"\");\n if (organized.omitted > 0) {\n lines.push(\n `_${organized.omitted} lower-severity finding(s) omitted by the standard's ` +\n `maxFindings policy._`\n );\n lines.push(\"\");\n }\n\n if (organized.quickWins.length) {\n lines.push(`## Quick wins`);\n lines.push(\"\");\n for (const f of organized.quickWins) {\n lines.push(`- **[${f.severity}] ${f.title}** — ${location(f)}`);\n }\n lines.push(\"\");\n }\n\n lines.push(`## Findings by dimension`);\n lines.push(\"\");\n for (const g of organized.groups) {\n lines.push(`### ${g.title} (${g.findings.length})`);\n lines.push(\"\");\n for (const f of g.findings) {\n lines.push(`- **[${f.severity}] ${f.title}** — ${location(f)} _(effort: ${f.effort})_`);\n lines.push(` - ${f.detail}`);\n if (f.moreLocations.length) {\n lines.push(` - _Also in:_ ${f.moreLocations.map((l) => `\\`${l}\\``).join(\", \")}`);\n }\n if (f.suggestion) lines.push(` - _Fix:_ ${f.suggestion}`);\n }\n lines.push(\"\");\n }\n\n if (organized.positives.length) {\n lines.push(`## What the repo does well`);\n lines.push(\"\");\n for (const p of organized.positives) lines.push(`- ${p}`);\n lines.push(\"\");\n }\n\n lines.push(`---`);\n lines.push(`<sub>Generated by [edsger](https://www.npmjs.com/package/edsger).</sub>`);\n return lines.join(\"\\n\");\n}\n\nfunction location(f: OrganizedFinding): string {\n const primary = locationKey(f);\n const more = f.moreLocations.length ? ` (+${f.moreLocations.length} more)` : \"\";\n return primary ? `\\`${primary}\\`${more}` : `repo-wide${more}`;\n}\n\n/** \"file:line\" (or \"file\") for a finding, or \"\" when it is repo-wide. */\nfunction locationKey(f: AuditFinding): string {\n if (!f.file || f.file === \"-\") return \"\";\n return f.line ? `${f.file}:${f.line}` : f.file;\n}\n","import { z } from \"zod\";\n\n/** Per-criterion score the agent must produce for a benchmark. */\nexport const CriterionScoreSchema = z.object({\n id: z.string().describe(\"Criterion id from the rubric\"),\n score: z.number().describe(\"Score for this criterion, 0..scoreScale\"),\n justification: z.string().describe(\"Why this score, in one or two sentences\"),\n evidence: z.array(z.string()).default([]).describe(\"File paths / snippets supporting the score\")\n});\n\nexport const CategoryScoreSchema = z.object({\n id: z.string().describe(\"Category id from the rubric\"),\n criteria: z.array(CriterionScoreSchema)\n});\n\nexport const BenchmarkResultSchema = z.object({\n categories: z.array(CategoryScoreSchema),\n summary: z.string().describe(\"2-4 sentence overall assessment\"),\n strengths: z.array(z.string()).default([]),\n weaknesses: z.array(z.string()).default([]),\n recommendations: z\n .array(\n z.object({\n priority: z.enum([\"high\", \"medium\", \"low\"]),\n title: z.string(),\n detail: z.string()\n })\n )\n .default([])\n});\nexport type BenchmarkResult = z.infer<typeof BenchmarkResultSchema>;\n\nconst SeveritySchema = z.enum([\"critical\", \"high\", \"medium\", \"low\", \"info\"]);\n\nexport const ReviewFindingSchema = z.object({\n focusArea: z.string().describe(\"Focus area id this finding relates to\"),\n severity: SeveritySchema,\n file: z.string().describe(\"Repo-relative file path, or '-' if general\"),\n line: z.number().nullable().default(null).describe(\"1-based line in the new file, if applicable\"),\n title: z.string(),\n detail: z.string().describe(\"What is wrong and why it matters\"),\n suggestion: z.string().nullable().default(null).describe(\"Concrete suggested fix\")\n});\n\nexport const ReviewResultSchema = z.object({\n summary: z.string().describe(\"Overall summary of the change and review\"),\n verdict: z.enum([\"approve\", \"request_changes\", \"comment\"]),\n findings: z.array(ReviewFindingSchema).default([])\n});\nexport type ReviewResult = z.infer<typeof ReviewResultSchema>;\nexport type ReviewFinding = z.infer<typeof ReviewFindingSchema>;\n\n/** A single issue found by a repository-wide audit. */\nexport const AuditFindingSchema = z.object({\n dimension: z.string().describe(\"Dimension id from the audit standard this finding relates to\"),\n severity: SeveritySchema,\n file: z.string().describe(\"Repo-relative file path, or '-' if repo-wide\"),\n line: z.number().nullable().default(null).describe(\"1-based line number, if applicable\"),\n title: z.string().describe(\"Short, specific statement of the problem\"),\n detail: z.string().describe(\"What is wrong and why it is unprofessional, outdated, or risky\"),\n suggestion: z.string().nullable().default(null).describe(\"Concrete fix or modern replacement\"),\n effort: z\n .enum([\"quick\", \"moderate\", \"involved\"])\n .default(\"moderate\")\n .describe(\"Rough effort to fix: quick (<1h), moderate (a day), involved (multi-day)\")\n});\n\nexport const AuditResultSchema = z.object({\n summary: z.string().describe(\"3-5 sentence honest overall assessment of the repository\"),\n findings: z.array(AuditFindingSchema).default([]),\n positives: z\n .array(z.string())\n .default([])\n .describe(\"Things the repository genuinely does well (keeps the critique fair)\")\n});\nexport type AuditResult = z.infer<typeof AuditResultSchema>;\nexport type AuditFinding = z.infer<typeof AuditFindingSchema>;\n\nexport const ResolveResultSchema = z.object({\n summary: z.string().describe(\"What was changed and why\"),\n changes: z.array(z.object({ file: z.string(), description: z.string() })).default([]),\n testsRun: z.string().nullable().default(null).describe(\"Command used to verify, and its outcome\"),\n remaining: z.array(z.string()).default([]).describe(\"Anything still unresolved\")\n});\nexport type ResolveResult = z.infer<typeof ResolveResultSchema>;\n\n/** A single diagram the agent produced for a repository. */\nexport const GeneratedDiagramSchema = z.object({\n id: z.string().describe(\"Diagram id from the catalog, or a descriptive slug if bespoke\"),\n groupId: z.string().describe(\"Catalog group id this diagram belongs to (e.g. architecture)\"),\n title: z.string().describe(\"Human-readable diagram title\"),\n type: z\n .string()\n .describe(\n \"Mermaid diagram type used, e.g. flowchart, erDiagram, sequenceDiagram, classDiagram\"\n ),\n mermaid: z.string().describe(\"Valid Mermaid source for the diagram (renders in HTML/Markdown)\"),\n description: z\n .string()\n .describe(\"One or two sentences: what the diagram shows and why it applies to this repo\"),\n evidence: z.array(z.string()).default([]).describe(\"Repo files this diagram was derived from\")\n});\n\nexport const DiagramsResultSchema = z.object({\n profile: z\n .object({\n summary: z.string().describe(\"2-4 sentence characterisation of the project\"),\n kinds: z\n .array(z.string())\n .default([])\n .describe(\"Project kind tags, e.g. cli, rest-api, spa, library, data-pipeline, monorepo\"),\n characteristics: z\n .array(z.string())\n .default([])\n .describe(\n \"Notable traits that drove diagram selection (owns a Postgres DB, deploys to k8s, …)\"\n )\n })\n .describe(\"The project profile that justifies which diagrams were chosen\"),\n diagrams: z\n .array(GeneratedDiagramSchema)\n .describe(\"The diagrams selected for and generated from this repository\"),\n notes: z\n .string()\n .nullable()\n .default(null)\n .describe(\"Optional notes, e.g. diagrams intentionally skipped and why\")\n});\nexport type DiagramsResult = z.infer<typeof DiagramsResultSchema>;\nexport type GeneratedDiagram = z.infer<typeof GeneratedDiagramSchema>;\n\n/**\n * One node of the implementation mind map. The agent returns the tree as a\n * FLAT list (parent references by id) because a flat shape is far more robust\n * for structured output than a recursive schema; the CLI assembles the tree.\n */\nexport const MindmapNodeSchema = z.object({\n id: z.string().describe(\"Unique kebab-case node id, e.g. 'core-flows' or 'http-api'\"),\n parentId: z\n .string()\n .nullable()\n .default(null)\n .describe(\"id of the parent node; null ONLY for the single root node\"),\n title: z.string().describe(\"Short outline-bullet title, 2-6 words\"),\n summary: z.string().describe(\"One or two sentences that are true and specific to this codebase\"),\n kind: z\n .string()\n .default(\"topic\")\n .describe(\"Tag: area, module, component, flow, step, data, external, config, or topic\"),\n files: z\n .array(z.string())\n .default([])\n .describe(\"Repo-relative files this node is grounded in (expected for leaf nodes)\")\n});\n\nexport const MindmapResultSchema = z.object({\n profile: z\n .object({\n summary: z.string().describe(\"2-4 sentence characterisation of the project\"),\n kinds: z\n .array(z.string())\n .default([])\n .describe(\"Project kind tags, e.g. cli, rest-api, spa, library, data-pipeline, monorepo\"),\n characteristics: z\n .array(z.string())\n .default([])\n .describe(\"Notable traits that shaped the map (owns a Postgres DB, monorepo, …)\")\n })\n .describe(\"The project profile behind the map's shape\"),\n nodes: z\n .array(MindmapNodeSchema)\n .describe(\n \"The whole mind map as a flat node list: exactly one root (parentId=null), \" +\n \"children listed in reading order after their parent\"\n ),\n notes: z\n .string()\n .nullable()\n .default(null)\n .describe(\"Optional notes, e.g. areas intentionally left out and why\")\n});\nexport type MindmapResult = z.infer<typeof MindmapResultSchema>;\nexport type MindmapFlatNode = z.infer<typeof MindmapNodeSchema>;\n\n/** Priority of a manual test case: how bad it is if this behaviour is broken. */\nexport const TestcasePrioritySchema = z.enum([\"critical\", \"high\", \"medium\", \"low\"]);\n\n/**\n * One node of the manual test-case plan. Like the mind map, the agent returns\n * the tree as a FLAT list (parent references by id) because a flat shape is far\n * more robust for structured output than a recursive schema; the CLI assembles\n * the tree. Interior nodes group test areas/features; leaf nodes are single\n * executable test cases carrying steps and an expected result.\n */\nexport const TestcaseNodeSchema = z.object({\n id: z.string().describe(\"Unique kebab-case node id, e.g. 'core-flows' or 'login-empty-password'\"),\n parentId: z\n .string()\n .nullable()\n .default(null)\n .describe(\"id of the parent node; null ONLY for the single root node\"),\n title: z.string().describe(\"Short outline-bullet title, 2-8 words\"),\n summary: z\n .string()\n .describe(\"One or two sentences: what this area covers, or what this case verifies\"),\n kind: z\n .string()\n .default(\"topic\")\n .describe(\"Tag: area, feature, flow, scenario, case, or topic ('case' = executable leaf)\"),\n priority: TestcasePrioritySchema.nullable()\n .default(null)\n .describe(\"Case priority (critical/high/medium/low); null for grouping nodes\"),\n preconditions: z\n .array(z.string())\n .default([])\n .describe(\"State a tester must prepare before the steps (cases only)\"),\n steps: z\n .array(z.string())\n .default([])\n .describe(\"Exact, observable manual actions, in order (cases only)\"),\n expected: z\n .string()\n .nullable()\n .default(null)\n .describe(\"The single expected outcome the tester verifies (cases only)\"),\n files: z\n .array(z.string())\n .default([])\n .describe(\"Repo-relative files implementing the behaviour under test\")\n});\n\nexport const TestcasesResultSchema = z.object({\n profile: z\n .object({\n summary: z.string().describe(\"2-4 sentence characterisation of the project\"),\n kinds: z\n .array(z.string())\n .default([])\n .describe(\"Project kind tags, e.g. cli, rest-api, spa, library, data-pipeline, monorepo\"),\n characteristics: z\n .array(z.string())\n .default([])\n .describe(\"Notable traits that shaped the plan (owns a Postgres DB, monorepo, …)\")\n })\n .describe(\"The project profile behind the plan's shape\"),\n nodes: z\n .array(TestcaseNodeSchema)\n .describe(\n \"The whole test plan as a flat node list: exactly one root (parentId=null), \" +\n \"children listed in reading order after their parent, leaves as concrete cases\"\n ),\n notes: z\n .string()\n .nullable()\n .default(null)\n .describe(\"Optional notes, e.g. areas intentionally left untested and why\")\n});\nexport type TestcasesResult = z.infer<typeof TestcasesResultSchema>;\nexport type TestcaseFlatNode = z.infer<typeof TestcaseNodeSchema>;\nexport type TestcasePriority = z.infer<typeof TestcasePrioritySchema>;\n","import { appendFileSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { basename, join } from \"node:path\";\nimport pc from \"picocolors\";\nimport { resolveStandard } from \"../core/assets.js\";\nimport { loadConfig } from \"../core/config.js\";\nimport { runAgent } from \"../core/agent.js\";\nimport { gitInfo } from \"../core/git.js\";\nimport { log } from \"../core/logger.js\";\nimport { renderBenchmarkMarkdown, scoreBenchmark, type ScoredBenchmark } from \"../core/report.js\";\nimport { BenchmarkResultSchema } from \"../core/schema.js\";\nimport type { BenchmarkStandard, GlobalOptions } from \"../types.js\";\n\nexport interface BenchmarkOptions extends GlobalOptions {\n /** Directory to write the report into (relative to repo). */\n out: string;\n /** Skip writing files into the repo. */\n noWrite: boolean;\n}\n\nexport async function runBenchmark(opts: BenchmarkOptions): Promise<number> {\n const { config, path: configPath } = loadConfig(opts.cwd);\n const configDir = configPath ? join(configPath, \"..\") : opts.cwd;\n const resolved = resolveStandard(\"benchmark\", opts, config, configDir);\n const standard = resolved.standard as BenchmarkStandard;\n\n log.info(\n `Benchmarking ${pc.bold(basename(opts.cwd))} against ${pc.bold(standard.name)} ` +\n `(languages: ${resolved.languages.join(\", \") || \"generic\"})`\n );\n log.debug(`standard layers: ${resolved.layers.join(\" → \")}`);\n\n const prompt = buildPrompt(standard, opts.cwd);\n const { result, costUsd, numTurns } = await runAgent({\n prompt,\n cwd: opts.cwd,\n model: opts.model,\n maxTurns: opts.maxTurns,\n timeoutMs: opts.timeoutMs,\n allowWrite: false,\n verbose: opts.verbose,\n resultShape: BenchmarkResultSchema.shape,\n systemPromptAppend:\n \"You are Edsger, a meticulous staff-level engineer performing an objective \" +\n \"repository assessment. Inspect the actual code and configuration before scoring. \" +\n \"Be evidence-driven and fair; cite concrete files. Do not modify any files.\"\n });\n\n if (!result) {\n log.error(\n \"The agent did not produce a result. Try increasing --max-turns or check credentials.\"\n );\n return 1;\n }\n\n const scored = scoreBenchmark(standard, result);\n const generatedAt = new Date().toISOString();\n // Filesystem-safe UTC run id (e.g. 20260701T034500Z): lexicographic order == chronological.\n const runId = generatedAt.replace(/[-:]/g, \"\").replace(/\\.\\d+Z$/, \"Z\");\n // Correlate each score with the code state it was measured against.\n const git = gitInfo(opts.cwd);\n const md = renderBenchmarkMarkdown(scored, {\n repo: basename(opts.cwd),\n languages: resolved.languages,\n layers: resolved.layers,\n generatedAt,\n model: opts.model\n });\n\n const jsonReport = {\n schema: \"edsger.benchmark/1\",\n runId,\n generatedAt,\n model: opts.model,\n repo: basename(opts.cwd),\n git,\n languages: resolved.languages,\n standard: { name: standard.name, version: standard.version, layers: resolved.layers },\n overall: scored.overall,\n grade: scored.grade,\n categories: scored.categories,\n summary: scored.summary,\n strengths: scored.strengths,\n weaknesses: scored.weaknesses,\n recommendations: scored.recommendations,\n costUsd\n };\n\n // Compact, append-only trend index: one line per run, cheap to read for charts.\n const historyRecord = {\n runId,\n generatedAt,\n commit: git.commit,\n branch: git.branch,\n dirty: git.dirty,\n model: opts.model,\n standardVersion: standard.version,\n overall: scored.overall,\n grade: scored.grade,\n categories: Object.fromEntries(scored.categories.map((c) => [c.id, c.fraction])),\n costUsd\n };\n\n if (!opts.noWrite && !opts.dryRun) {\n const baseDir = join(opts.cwd, opts.out);\n const mdOut = md + \"\\n\";\n const jsonOut = JSON.stringify(jsonReport, null, 2) + \"\\n\";\n\n // Archive this run under runs/<timestamp>/ so history from repeated runs is preserved.\n const runDir = join(baseDir, \"runs\", runId);\n mkdirSync(runDir, { recursive: true });\n writeFileSync(join(runDir, \"report.md\"), mdOut, \"utf8\");\n writeFileSync(join(runDir, \"report.json\"), jsonOut, \"utf8\");\n\n // Always refresh the canonical top-level report as the stable \"latest\" pointer\n // (unchanged path, so CI / diffs keep working).\n writeFileSync(join(baseDir, \"report.md\"), mdOut, \"utf8\");\n writeFileSync(join(baseDir, \"report.json\"), jsonOut, \"utf8\");\n\n // Append one compact line to the trend index (source of truth for charts/history).\n appendFileSync(join(baseDir, \"history.jsonl\"), JSON.stringify(historyRecord) + \"\\n\", \"utf8\");\n\n log.success(\n `Report written to ${pc.bold(join(opts.out, \"report.md\"))} ` +\n `${pc.dim(`(run archived at ${join(opts.out, \"runs\", runId)})`)}`\n );\n }\n\n printSummary(scored, numTurns, costUsd);\n if (opts.json) process.stdout.write(JSON.stringify(jsonReport, null, 2) + \"\\n\");\n return 0;\n}\n\nfunction printSummary(scored: ScoredBenchmark, numTurns: number, costUsd: number): void {\n log.heading(`Score: ${scored.overall}/100 (Grade ${scored.grade})`);\n for (const c of scored.categories) {\n const pct = Math.round(c.fraction * 100);\n process.stderr.write(` ${bar(pct)} ${String(pct).padStart(3)}% ${c.name}\\n`);\n }\n log.step(`${numTurns} turns · ~$${costUsd.toFixed(3)}`);\n}\n\nfunction bar(pct: number): string {\n const width = 20;\n const filled = Math.round((pct / 100) * width);\n const color = pct >= 80 ? pc.green : pct >= 60 ? pc.yellow : pc.red;\n return color(\"█\".repeat(filled)) + pc.dim(\"░\".repeat(width - filled));\n}\n\nfunction buildPrompt(standard: BenchmarkStandard, cwd: string): string {\n const rubric = standard.categories\n .map((cat) => {\n const crits = cat.criteria\n .map((cr) => {\n const anchors = cr.rubric\n ? Object.entries(cr.rubric)\n .map(([k, v]) => ` - ${k}: ${v}`)\n .join(\"\\n\")\n : \"\";\n return (\n ` - id: ${cr.id}\\n` +\n ` title: ${cr.title}\\n` +\n ` guidance: ${cr.guidance.trim()}` +\n (anchors ? `\\n anchors:\\n${anchors}` : \"\")\n );\n })\n .join(\"\\n\");\n return `- category: ${cat.id} (${cat.name}, weight ${cat.weight})\\n${crits}`;\n })\n .join(\"\\n\");\n\n return [\n `Assess the repository located at: ${cwd}`,\n ``,\n `Score it against the rubric below. Each criterion is scored from 0 to ${standard.scoreScale}`,\n `(0 = absent/harmful, ${standard.scoreScale} = exemplary), using the level anchors as a guide.`,\n ``,\n `Method:`,\n `1. Explore the repository structure, key source files, configuration, CI, tests, and docs.`,\n ` Use Read/Grep/Glob and read-only Bash (e.g. ls, cat, git log). Do NOT modify anything.`,\n `2. For each criterion, gather concrete evidence (file paths) before deciding a score.`,\n `3. Be objective and consistent. Absence of evidence for a practice means a low score.`,\n `4. When finished, call submit_result exactly once with a score for EVERY criterion id below,`,\n ` grouped by category. Include a short justification and evidence paths for each.`,\n ``,\n `Rubric:`,\n rubric\n ].join(\"\\n\");\n}\n","import type { BenchmarkStandard, Category, Criterion } from \"../types.js\";\nimport type { BenchmarkResult } from \"./schema.js\";\nimport { log } from \"./logger.js\";\n\nexport interface ScoredCriterion {\n id: string;\n title: string;\n weight: number;\n rawScore: number;\n maxScore: number;\n fraction: number;\n justification: string;\n evidence: string[];\n}\n\nexport interface ScoredCategory {\n id: string;\n name: string;\n weight: number; // normalised to sum 100 across categories\n fraction: number; // 0..1\n points: number; // weight * fraction\n criteria: ScoredCriterion[];\n}\n\nexport interface ScoredBenchmark {\n standardName: string;\n standardVersion: string;\n overall: number; // 0..100\n grade: string;\n categories: ScoredCategory[];\n summary: string;\n strengths: string[];\n weaknesses: string[];\n recommendations: BenchmarkResult[\"recommendations\"];\n}\n\n/** Deterministically aggregate the agent's per-criterion scores. */\nexport function scoreBenchmark(\n standard: BenchmarkStandard,\n result: BenchmarkResult\n): ScoredBenchmark {\n const scale = standard.scoreScale || 4;\n const totalWeight = standard.categories.reduce((s, c) => s + c.weight, 0) || 1;\n\n // The agent may echo ids bare (\"no-hardcoded-secrets\") or category-prefixed\n // (\"security/no-hardcoded-secrets\"); normalise to the last path segment so a\n // lookup matches regardless of which form it returned.\n const tail = (id: string): string => id.slice(id.lastIndexOf(\"/\") + 1);\n\n interface Meta {\n score: number;\n justification: string;\n evidence: string[];\n }\n const byKey = new Map<string, Meta>();\n const byCrit = new Map<string, Meta>();\n for (const cat of result.categories) {\n for (const cr of cat.criteria) {\n const meta: Meta = {\n score: cr.score,\n justification: cr.justification,\n evidence: cr.evidence ?? []\n };\n byKey.set(`${tail(cat.id)}/${tail(cr.id)}`, meta);\n byCrit.set(tail(cr.id), meta); // fallback when the category id differs\n }\n }\n\n let matched = 0;\n const categories: ScoredCategory[] = standard.categories.map((cat: Category) => {\n const critWeightTotal = cat.criteria.reduce((s, c) => s + (c.weight ?? 1), 0) || 1;\n const scored: ScoredCriterion[] = cat.criteria.map((cr: Criterion) => {\n const meta = byKey.get(`${tail(cat.id)}/${tail(cr.id)}`) ?? byCrit.get(tail(cr.id));\n if (meta) matched += 1;\n const raw = clamp(meta?.score ?? 0, 0, scale);\n return {\n id: cr.id,\n title: cr.title,\n weight: cr.weight ?? 1,\n rawScore: raw,\n maxScore: scale,\n fraction: raw / scale,\n justification: meta?.justification ?? \"Not assessed.\",\n evidence: meta?.evidence ?? []\n };\n });\n const fraction = scored.reduce((s, c) => s + c.fraction * c.weight, 0) / critWeightTotal;\n const normWeight = (cat.weight / totalWeight) * 100;\n return {\n id: cat.id,\n name: cat.name,\n weight: round(normWeight, 1),\n fraction,\n points: round(normWeight * fraction, 1),\n criteria: scored\n };\n });\n\n const totalCriteria = standard.categories.reduce((s, c) => s + c.criteria.length, 0);\n if (result.categories.length > 0 && matched === 0) {\n log.warn(\n \"The agent returned scores but none matched the rubric's criterion ids — \" +\n \"reporting 0. This is a scoring bug, not a real result.\"\n );\n } else if (matched < totalCriteria) {\n log.warn(`Only ${matched}/${totalCriteria} criteria were scored; the rest default to 0.`);\n }\n\n const overall = round(\n categories.reduce((s, c) => s + c.points, 0),\n 1\n );\n\n return {\n standardName: standard.name,\n standardVersion: standard.version,\n overall,\n grade: gradeFor(overall),\n categories,\n summary: result.summary,\n strengths: result.strengths ?? [],\n weaknesses: result.weaknesses ?? [],\n recommendations: result.recommendations ?? []\n };\n}\n\nexport function gradeFor(score: number): string {\n if (score >= 90) return \"A\";\n if (score >= 80) return \"B\";\n if (score >= 70) return \"C\";\n if (score >= 60) return \"D\";\n return \"F\";\n}\n\n/** Render a human-readable Markdown report. */\nexport function renderBenchmarkMarkdown(\n scored: ScoredBenchmark,\n meta: { repo: string; languages: string[]; layers: string[]; generatedAt: string; model: string }\n): string {\n const lines: string[] = [];\n lines.push(`# Edsger Benchmark Report`);\n lines.push(\"\");\n lines.push(`**Score: ${scored.overall} / 100 (Grade ${scored.grade})**`);\n lines.push(\"\");\n lines.push(`> ${scored.summary}`);\n lines.push(\"\");\n lines.push(`| Field | Value |`);\n lines.push(`| --- | --- |`);\n lines.push(`| Repository | \\`${meta.repo}\\` |`);\n lines.push(`| Languages | ${meta.languages.join(\", \") || \"n/a\"} |`);\n lines.push(`| Standard | ${scored.standardName} v${scored.standardVersion} |`);\n lines.push(`| Sources | ${meta.layers.join(\" → \")} |`);\n lines.push(`| Model | ${meta.model} |`);\n lines.push(`| Generated | ${meta.generatedAt} |`);\n lines.push(\"\");\n\n lines.push(`## Category scores`);\n lines.push(\"\");\n lines.push(`| Category | Weight | Score | Weighted |`);\n lines.push(`| --- | ---: | ---: | ---: |`);\n for (const c of scored.categories) {\n lines.push(`| ${c.name} | ${c.weight}% | ${Math.round(c.fraction * 100)}% | ${c.points} |`);\n }\n lines.push(`| **Overall** | **100%** | | **${scored.overall}** |`);\n lines.push(\"\");\n\n if (scored.strengths.length) {\n lines.push(`## Strengths`);\n lines.push(\"\");\n for (const s of scored.strengths) lines.push(`- ${s}`);\n lines.push(\"\");\n }\n if (scored.weaknesses.length) {\n lines.push(`## Weaknesses`);\n lines.push(\"\");\n for (const w of scored.weaknesses) lines.push(`- ${w}`);\n lines.push(\"\");\n }\n if (scored.recommendations.length) {\n lines.push(`## Recommendations`);\n lines.push(\"\");\n for (const r of scored.recommendations) {\n lines.push(`- **[${r.priority}] ${r.title}** — ${r.detail}`);\n }\n lines.push(\"\");\n }\n\n lines.push(`## Detailed findings`);\n lines.push(\"\");\n for (const c of scored.categories) {\n lines.push(`### ${c.name} — ${Math.round(c.fraction * 100)}%`);\n lines.push(\"\");\n for (const cr of c.criteria) {\n lines.push(`- **${cr.title}** (${cr.rawScore}/${cr.maxScore}) — ${cr.justification}`);\n for (const e of cr.evidence) lines.push(` - \\`${e}\\``);\n }\n lines.push(\"\");\n }\n\n lines.push(`---`);\n lines.push(`<sub>Generated by [edsger](https://www.npmjs.com/package/edsger).</sub>`);\n return lines.join(\"\\n\");\n}\n\nfunction clamp(n: number, lo: number, hi: number): number {\n return Math.max(lo, Math.min(hi, n));\n}\nfunction round(n: number, dp: number): number {\n const f = 10 ** dp;\n return Math.round(n * f) / f;\n}\n","import pc from \"picocolors\";\nimport { findBundledAssetsDir, inferLanguagesFromFiles, resolveStandard } from \"../core/assets.js\";\nimport { loadConfig } from \"../core/config.js\";\nimport { runAgent } from \"../core/agent.js\";\nimport {\n ensureGhReady,\n getPrContext,\n postReview,\n type InlineComment,\n type PrContext,\n type ReviewEvent\n} from \"../core/gh.js\";\nimport { log } from \"../core/logger.js\";\nimport { ReviewResultSchema, type ReviewFinding, type ReviewResult } from \"../core/schema.js\";\nimport type { GlobalOptions, ReviewStandard, Severity } from \"../types.js\";\n\nexport interface PrReviewOptions extends GlobalOptions {\n pr: string;\n repo?: string;\n /** Actually submit the review to GitHub (otherwise preview only). */\n post: boolean;\n}\n\nconst SEVERITY_RANK: Record<Severity, number> = {\n critical: 4,\n high: 3,\n medium: 2,\n low: 1,\n info: 0\n};\n\nexport async function runPrReview(opts: PrReviewOptions): Promise<number> {\n await ensureGhReady();\n log.info(`Fetching PR ${pc.bold(opts.pr)}${opts.repo ? ` from ${opts.repo}` : \"\"}`);\n const ctx = await getPrContext(opts.pr, opts.repo, opts.cwd);\n\n const { config, path: configPath } = loadConfig(opts.cwd);\n const configDir = configPath ? `${configPath}/..` : opts.cwd;\n // If the working dir doesn't reveal the language (e.g. reviewing a PR without\n // checking it out), fall back to the PR's changed file types.\n const fileHint = inferLanguagesFromFiles(\n ctx.files.map((f) => f.path),\n findBundledAssetsDir()\n );\n const resolved = resolveStandard(\"review\", opts, config, configDir, fileHint);\n const standard = resolved.standard as ReviewStandard;\n\n log.info(\n `Reviewing \"${pc.bold(ctx.title)}\" (#${ctx.number}, ${ctx.files.length} files) ` +\n `against ${pc.bold(standard.name)}`\n );\n\n const { result, costUsd, numTurns } = await runAgent({\n prompt: buildPrompt(standard, ctx),\n cwd: opts.cwd,\n model: opts.model,\n maxTurns: opts.maxTurns,\n timeoutMs: opts.timeoutMs,\n allowWrite: false,\n verbose: opts.verbose,\n resultShape: ReviewResultSchema.shape,\n systemPromptAppend:\n \"You are Edsger, a senior code reviewer. Review only what the diff changes, but read \" +\n \"surrounding code for context. Be specific, kind, and actionable; prefer high-signal \" +\n \"findings over nitpicks. Do not modify any files.\"\n });\n\n if (!result) {\n log.error(\"The agent did not produce a review.\");\n return 1;\n }\n\n const event = decideEvent(result, standard);\n const body = renderBody(result, ctx, standard, resolved.layers);\n const inline = buildInlineComments(result, ctx, standard);\n\n printPreview(result, event, numTurns, costUsd);\n\n if (opts.json) {\n process.stdout.write(\n JSON.stringify(\n { verdict: result.verdict, event, findings: result.findings, summary: result.summary },\n null,\n 2\n ) + \"\\n\"\n );\n }\n\n if (opts.post && !opts.dryRun) {\n await postReview(ctx, opts.repo, event, body, inline, opts.cwd);\n log.success(`Posted review (${event}) to ${ctx.url}`);\n } else {\n log.warn(`Preview only. Re-run with ${pc.bold(\"--post\")} to submit this review to GitHub.`);\n process.stderr.write(\"\\n\" + body + \"\\n\");\n }\n return 0;\n}\n\nfunction decideEvent(result: ReviewResult, standard: ReviewStandard): ReviewEvent {\n const blocking = new Set(standard.policy.blockingSeverities);\n const hasBlocking = result.findings.some((f) => blocking.has(f.severity));\n if (hasBlocking) return \"REQUEST_CHANGES\";\n if (result.verdict === \"approve\") return \"APPROVE\";\n if (result.verdict === \"request_changes\") return \"REQUEST_CHANGES\";\n return \"COMMENT\";\n}\n\nfunction buildInlineComments(\n result: ReviewResult,\n ctx: PrContext,\n standard: ReviewStandard\n): InlineComment[] {\n const changed = new Set(ctx.files.map((f) => f.path));\n const sorted = [...result.findings].sort(\n (a, b) => SEVERITY_RANK[b.severity] - SEVERITY_RANK[a.severity]\n );\n const out: InlineComment[] = [];\n for (const f of sorted) {\n if (out.length >= standard.policy.maxComments) break;\n if (f.line && f.file && f.file !== \"-\" && changed.has(f.file)) {\n out.push({ path: f.file, line: f.line, body: renderFinding(f) });\n }\n }\n return out;\n}\n\nfunction renderFinding(f: ReviewFinding): string {\n const head = `**[${f.severity}] ${f.title}**`;\n const fix = f.suggestion ? `\\n\\n_Suggestion:_ ${f.suggestion}` : \"\";\n return `${head}\\n\\n${f.detail}${fix}`;\n}\n\nfunction renderBody(\n result: ReviewResult,\n ctx: PrContext,\n standard: ReviewStandard,\n layers: string[]\n): string {\n const counts = countBySeverity(result.findings);\n const lines: string[] = [];\n lines.push(`## Edsger review — ${verdictLabel(result.verdict)}`);\n lines.push(\"\");\n lines.push(result.summary);\n lines.push(\"\");\n lines.push(\n `**Findings:** ` +\n ([\"critical\", \"high\", \"medium\", \"low\", \"info\"] as Severity[])\n .filter((s) => counts[s])\n .map((s) => `${counts[s]} ${s}`)\n .join(\", \") || \"no blocking issues\"\n );\n lines.push(\"\");\n const general = result.findings.filter((f) => !f.line || f.file === \"-\");\n if (general.length) {\n lines.push(`### General comments`);\n lines.push(\"\");\n for (const f of general) lines.push(`- ${renderFinding(f).replace(/\\n+/g, \" \")}`);\n lines.push(\"\");\n }\n lines.push(\"---\");\n lines.push(\n `<sub>Reviewed against ${standard.name} v${standard.version} ` +\n `(${layers.join(\" → \")}) by [edsger](https://www.npmjs.com/package/edsger).</sub>`\n );\n void ctx;\n return lines.join(\"\\n\");\n}\n\nfunction printPreview(\n result: ReviewResult,\n event: ReviewEvent,\n numTurns: number,\n costUsd: number\n): void {\n log.heading(`Verdict: ${event}`);\n const counts = countBySeverity(result.findings);\n for (const s of [\"critical\", \"high\", \"medium\", \"low\", \"info\"] as Severity[]) {\n if (counts[s]) process.stderr.write(` ${sevColor(s)(s.padEnd(8))} ${counts[s]}\\n`);\n }\n log.step(`${numTurns} turns · ~$${costUsd.toFixed(3)}`);\n}\n\nfunction countBySeverity(findings: ReviewFinding[]): Record<Severity, number> {\n const c: Record<Severity, number> = { critical: 0, high: 0, medium: 0, low: 0, info: 0 };\n for (const f of findings) c[f.severity]++;\n return c;\n}\n\nfunction sevColor(s: Severity): (t: string) => string {\n if (s === \"critical\" || s === \"high\") return pc.red;\n if (s === \"medium\") return pc.yellow;\n return pc.dim;\n}\n\nfunction verdictLabel(v: ReviewResult[\"verdict\"]): string {\n return v === \"approve\" ? \"Approve\" : v === \"request_changes\" ? \"Request changes\" : \"Comment\";\n}\n\nfunction buildPrompt(standard: ReviewStandard, ctx: PrContext): string {\n const focus = standard.focusAreas\n .map((fa) => {\n const checklist = (fa.checklist ?? []).map((c) => ` - ${c}`).join(\"\\n\");\n return (\n `- id: ${fa.id} (${fa.title}, default severity ${fa.defaultSeverity ?? \"medium\"})\\n` +\n ` guidance: ${fa.guidance.trim()}` +\n (checklist ? `\\n checklist:\\n${checklist}` : \"\")\n );\n })\n .join(\"\\n\");\n\n return [\n `Review the following pull request.`,\n ``,\n `Title: ${ctx.title}`,\n `Author: ${ctx.author}`,\n `Base: ${ctx.baseRefName} Head: ${ctx.headRefName}`,\n `Description:`,\n ctx.body ? indent(ctx.body) : \" (no description)\",\n ``,\n `Changed files: ${ctx.files.map((f) => f.path).join(\", \")}`,\n ``,\n `Method:`,\n `1. Read the diff below. Use Read/Grep/Glob to inspect surrounding code in the working`,\n ` directory for context when needed. Do NOT modify files.`,\n `2. Evaluate the change against the focus areas. Assign each finding a severity`,\n ` (critical/high/medium/low/info) and, where it maps to a changed line, the file path`,\n ` and the 1-based line number in the NEW version of the file.`,\n `3. Verify the change does what its description claims; flag missing tests for new logic.`,\n `4. Choose a verdict: approve, request_changes, or comment. Then call submit_result once.`,\n ``,\n `Focus areas:`,\n focus,\n ``,\n `Unified diff:`,\n \"```diff\",\n truncate(ctx.diff, 180000),\n \"```\"\n ].join(\"\\n\");\n}\n\nfunction indent(s: string): string {\n return s\n .split(\"\\n\")\n .map((l) => ` ${l}`)\n .join(\"\\n\");\n}\nfunction truncate(s: string, max: number): string {\n return s.length > max ? s.slice(0, max) + \"\\n... [diff truncated] ...\" : s;\n}\n","import { execFile } from \"node:child_process\";\nimport { mkdtempSync, rmSync, writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\n\nconst exec = promisify(execFile);\n\nexport interface PrContext {\n number: number;\n title: string;\n body: string;\n author: string;\n baseRefName: string;\n headRefName: string;\n state: string;\n url: string;\n /** True when the PR head lives in a fork (cannot push to origin directly). */\n isCrossRepository: boolean;\n files: { path: string; additions: number; deletions: number }[];\n diff: string;\n}\n\nexport interface InlineComment {\n path: string;\n line: number;\n body: string;\n}\n\nasync function gh(args: string[], cwd?: string): Promise<string> {\n const { stdout } = await exec(\"gh\", args, {\n cwd,\n maxBuffer: 64 * 1024 * 1024,\n env: process.env\n });\n return stdout;\n}\n\n/** Throw a friendly error if gh is missing or not authenticated. */\nexport async function ensureGhReady(): Promise<void> {\n try {\n await exec(\"gh\", [\"--version\"]);\n } catch {\n throw new Error(\n \"GitHub CLI (gh) not found. Install it from https://cli.github.com and run `gh auth login`.\"\n );\n }\n try {\n await exec(\"gh\", [\"auth\", \"status\"]);\n } catch {\n throw new Error(\"Not authenticated with GitHub. Run `gh auth login` first.\");\n }\n}\n\n/** Fetch PR metadata, changed files, and the unified diff. */\nexport async function getPrContext(\n ref: string,\n repo: string | undefined,\n cwd: string\n): Promise<PrContext> {\n const repoArgs = repo ? [\"--repo\", repo] : [];\n const fields =\n \"number,title,body,author,baseRefName,headRefName,state,url,isCrossRepository,files\";\n const metaRaw = await gh([\"pr\", \"view\", ref, ...repoArgs, \"--json\", fields], cwd);\n const meta = JSON.parse(metaRaw) as {\n number: number;\n title: string;\n body: string | null;\n author: { login: string };\n baseRefName: string;\n headRefName: string;\n state: string;\n url: string;\n isCrossRepository: boolean;\n files: { path: string; additions: number; deletions: number }[];\n };\n const diff = await gh([\"pr\", \"diff\", ref, ...repoArgs], cwd);\n return {\n number: meta.number,\n title: meta.title,\n body: meta.body ?? \"\",\n author: meta.author?.login ?? \"unknown\",\n baseRefName: meta.baseRefName,\n headRefName: meta.headRefName,\n state: meta.state,\n url: meta.url,\n isCrossRepository: Boolean(meta.isCrossRepository),\n files: meta.files ?? [],\n diff\n };\n}\n\n/** Check out a PR branch locally (for pr-resolve). */\nexport async function checkoutPr(\n ref: string,\n repo: string | undefined,\n cwd: string\n): Promise<void> {\n const repoArgs = repo ? [\"--repo\", repo] : [];\n await gh([\"pr\", \"checkout\", ref, ...repoArgs], cwd);\n}\n\nexport type ReviewEvent = \"APPROVE\" | \"REQUEST_CHANGES\" | \"COMMENT\";\n\n/**\n * Post a review. Inline comments are submitted via the REST API so they attach\n * to specific lines; the summary body is included in the same review.\n */\nexport async function postReview(\n ctx: PrContext,\n repo: string | undefined,\n event: ReviewEvent,\n body: string,\n inline: InlineComment[],\n cwd: string\n): Promise<void> {\n const target = repo ?? (await currentRepoSlug(cwd));\n if (inline.length === 0) {\n const flag =\n event === \"APPROVE\"\n ? \"--approve\"\n : event === \"REQUEST_CHANGES\"\n ? \"--request-changes\"\n : \"--comment\";\n await gh([\"pr\", \"review\", String(ctx.number), \"--repo\", target, flag, \"--body\", body], cwd);\n return;\n }\n const payload = {\n body,\n event,\n comments: inline.map((c) => ({ path: c.path, line: c.line, side: \"RIGHT\", body: c.body }))\n };\n const dir = mkdtempSync(join(tmpdir(), \"edsger-review-\"));\n const file = join(dir, \"review.json\");\n writeFileSync(file, JSON.stringify(payload), \"utf8\");\n try {\n await gh(\n [\"api\", \"--method\", \"POST\", `repos/${target}/pulls/${ctx.number}/reviews`, \"--input\", file],\n cwd\n );\n } catch {\n // Fall back to a plain summary review if inline submission fails (e.g. a\n // comment targets a line outside the diff).\n const flag =\n event === \"APPROVE\"\n ? \"--approve\"\n : event === \"REQUEST_CHANGES\"\n ? \"--request-changes\"\n : \"--comment\";\n await gh([\"pr\", \"review\", String(ctx.number), \"--repo\", target, flag, \"--body\", body], cwd);\n } finally {\n rmSync(dir, { recursive: true, force: true });\n }\n}\n\n/** Resolve \"owner/repo\" for the current checkout. */\nexport async function currentRepoSlug(cwd: string): Promise<string> {\n const raw = await gh([\"repo\", \"view\", \"--json\", \"nameWithOwner\"], cwd);\n return (JSON.parse(raw) as { nameWithOwner: string }).nameWithOwner;\n}\n\nexport interface PrFeedback {\n reviewComments: { author: string; path: string; line: number | null; body: string }[];\n issueComments: { author: string; body: string }[];\n}\n\n/** Fetch inline review comments and conversation comments on a PR. */\nexport async function getPrFeedback(\n ctx: PrContext,\n repo: string | undefined,\n cwd: string\n): Promise<PrFeedback> {\n const target = repo ?? (await currentRepoSlug(cwd));\n const reviewRaw = await gh(\n [\"api\", `repos/${target}/pulls/${ctx.number}/comments`, \"--paginate\"],\n cwd\n ).catch(() => \"[]\");\n const issueRaw = await gh(\n [\"api\", `repos/${target}/issues/${ctx.number}/comments`, \"--paginate\"],\n cwd\n ).catch(() => \"[]\");\n const review = JSON.parse(reviewRaw) as Array<{\n user: { login: string };\n path: string;\n line: number | null;\n body: string;\n }>;\n const issue = JSON.parse(issueRaw) as Array<{ user: { login: string }; body: string }>;\n return {\n reviewComments: review.map((c) => ({\n author: c.user?.login ?? \"unknown\",\n path: c.path,\n line: c.line,\n body: c.body\n })),\n issueComments: issue.map((c) => ({ author: c.user?.login ?? \"unknown\", body: c.body }))\n };\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport pc from \"picocolors\";\nimport { runAgent } from \"../core/agent.js\";\nimport {\n checkoutPr,\n ensureGhReady,\n getPrContext,\n getPrFeedback,\n type PrContext,\n type PrFeedback\n} from \"../core/gh.js\";\nimport { log } from \"../core/logger.js\";\nimport { ResolveResultSchema, type ResolveResult } from \"../core/schema.js\";\nimport type { GlobalOptions } from \"../types.js\";\n\nconst exec = promisify(execFile);\n\nexport interface PrResolveOptions extends GlobalOptions {\n pr: string;\n repo?: string;\n /** Free-form instruction, e.g. \"address review comments and fix the failing test\". */\n instruction?: string;\n /** Check out the PR branch locally before editing. */\n checkout: boolean;\n /** Commit and push the changes when done. */\n push: boolean;\n}\n\nexport async function runPrResolve(opts: PrResolveOptions): Promise<number> {\n await ensureGhReady();\n log.info(`Fetching PR ${pc.bold(opts.pr)}${opts.repo ? ` from ${opts.repo}` : \"\"}`);\n const ctx = await getPrContext(opts.pr, opts.repo, opts.cwd);\n const feedback = await getPrFeedback(ctx, opts.repo, opts.cwd).catch(() => ({\n reviewComments: [],\n issueComments: []\n }));\n\n if (opts.checkout && !opts.dryRun) {\n log.step(`checking out PR branch ${ctx.headRefName}`);\n await checkoutPr(opts.pr, opts.repo, opts.cwd);\n }\n\n log.info(\n `Resolving \"${pc.bold(ctx.title)}\" (#${ctx.number}) — ` +\n `${feedback.reviewComments.length} review comments`\n );\n\n const { result, costUsd, numTurns } = await runAgent({\n prompt: buildPrompt(ctx, feedback, opts.instruction),\n cwd: opts.cwd,\n model: opts.model,\n maxTurns: opts.maxTurns,\n timeoutMs: opts.timeoutMs,\n allowWrite: true,\n verbose: opts.verbose,\n resultShape: ResolveResultSchema.shape,\n systemPromptAppend:\n \"You are Edsger, a careful senior engineer fixing a pull request. Make the smallest \" +\n \"correct change that addresses the feedback. Match the existing code style. After \" +\n \"editing, run the project's tests/linters to verify. Never weaken tests to make them \" +\n \"pass, and never commit secrets.\"\n });\n\n if (!result) {\n log.error(\"The agent did not produce a result.\");\n return 1;\n }\n\n printSummary(result, numTurns, costUsd);\n if (opts.json) process.stdout.write(JSON.stringify(result, null, 2) + \"\\n\");\n\n if (opts.push && !opts.dryRun) {\n const pushed = await commitAndPush(ctx, result, opts.cwd, opts.checkout);\n if (pushed) log.success(`Committed and pushed to ${ctx.headRefName}`);\n else log.warn(\"Nothing to commit — working tree is clean.\");\n } else {\n log.warn(\n `Changes left in the working tree. Review them, then commit/push (or re-run with ${pc.bold(\"--push\")}).`\n );\n }\n return 0;\n}\n\nasync function commitAndPush(\n ctx: PrContext,\n result: ResolveResult,\n cwd: string,\n checkedOut: boolean\n): Promise<boolean> {\n const status = await exec(\"git\", [\"status\", \"--porcelain\"], { cwd });\n if (!status.stdout.trim()) return false;\n await exec(\"git\", [\"add\", \"-A\"], { cwd });\n const message = `fix: address review feedback on #${ctx.number}\\n\\n${result.summary}`;\n await exec(\"git\", [\"commit\", \"-m\", message], { cwd });\n\n // `gh pr checkout` configures the local branch to push back to the right\n // remote (including a fork), so prefer a plain push when we checked out.\n if (checkedOut) {\n try {\n await exec(\"git\", [\"push\"], { cwd });\n return true;\n } catch (err) {\n if (ctx.isCrossRepository) {\n throw new Error(\n `Could not push to the fork's branch automatically: ${errText(err)}\\n` +\n \"Push manually, or ensure the PR branch was checked out with gh.\"\n );\n }\n // Same-repo: fall through to an explicit origin push.\n }\n }\n if (ctx.isCrossRepository) {\n throw new Error(\n \"This PR is from a fork. Re-run without --no-checkout so gh can configure \" +\n \"the push target, or commit and push to the fork manually.\"\n );\n }\n await exec(\"git\", [\"push\", \"origin\", `HEAD:${ctx.headRefName}`], { cwd });\n return true;\n}\n\nfunction errText(err: unknown): string {\n return err instanceof Error ? (err.message.split(\"\\n\")[0] ?? \"\") : String(err);\n}\n\nfunction printSummary(result: ResolveResult, numTurns: number, costUsd: number): void {\n log.heading(\"Resolution summary\");\n process.stderr.write(` ${result.summary}\\n\\n`);\n if (result.changes.length) {\n for (const c of result.changes)\n process.stderr.write(` ${pc.green(\"~\")} ${c.file} — ${c.description}\\n`);\n }\n if (result.testsRun) log.step(`verification: ${result.testsRun}`);\n if (result.remaining.length) {\n log.warn(\"Remaining items:\");\n for (const r of result.remaining) process.stderr.write(` - ${r}\\n`);\n }\n log.step(`${numTurns} turns · ~$${costUsd.toFixed(3)}`);\n}\n\nfunction buildPrompt(ctx: PrContext, feedback: PrFeedback, instruction?: string): string {\n const reviewComments = feedback.reviewComments.length\n ? feedback.reviewComments\n .map((c) => ` - ${c.path}${c.line ? `:${c.line}` : \"\"} (${c.author}): ${c.body}`)\n .join(\"\\n\")\n : \" (none)\";\n const issueComments = feedback.issueComments.length\n ? feedback.issueComments.map((c) => ` - ${c.author}: ${c.body}`).join(\"\\n\")\n : \" (none)\";\n\n return [\n `Resolve the open items on this pull request by editing the code in the working directory.`,\n ``,\n `PR #${ctx.number}: ${ctx.title}`,\n `Base: ${ctx.baseRefName} Head: ${ctx.headRefName}`,\n ``,\n instruction\n ? `Primary instruction: ${instruction}`\n : `Primary goal: address the reviewer feedback below.`,\n ``,\n `Inline review comments:`,\n reviewComments,\n ``,\n `Conversation comments:`,\n issueComments,\n ``,\n `Method:`,\n `1. Understand each requested change. Use Read/Grep/Glob to locate the relevant code.`,\n `2. Make the minimal, correct edits with Edit/Write. Match existing conventions.`,\n `3. Run the project's tests and linters (via Bash) to verify your changes pass.`,\n `4. Do not weaken or delete tests to make them pass; do not introduce secrets.`,\n `5. Call submit_result once with a summary, the list of files changed, how you verified,`,\n ` and anything you could not resolve.`\n ].join(\"\\n\");\n}\n","import { join } from \"node:path\";\nimport { assembleData, findViewerDir, hasData } from \"../core/dashboard.js\";\nimport { startViewerServer } from \"../core/viewer-server.js\";\n\nexport interface ServeOptions {\n cwd: string;\n /** Benchmark output dir relative to cwd (default .edsger/benchmark). */\n dir: string;\n port: number;\n host: string;\n open: boolean;\n}\n\nexport async function runServe(opts: ServeOptions): Promise<number> {\n const benchmarkDir = join(opts.cwd, opts.dir);\n const viewerDir = findViewerDir();\n\n return startViewerServer({\n viewerDir,\n indexFile: \"index.html\",\n dataRoute: \"/edsger-data.json\",\n getData: () => assembleData(benchmarkDir),\n port: opts.port,\n host: opts.host,\n open: opts.open,\n emptyHint: hasData(assembleData(benchmarkDir))\n ? undefined\n : `No benchmark data in ${opts.dir} yet — run \\`edsger benchmark\\` first.`\n });\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, isAbsolute, join } from \"node:path\";\nimport pc from \"picocolors\";\nimport {\n assembleData,\n hasData,\n readViewerSingleTemplate,\n renderSingleFile\n} from \"../core/dashboard.js\";\nimport { openInBrowser } from \"../core/open.js\";\nimport { log } from \"../core/logger.js\";\n\nexport interface ReportOptions {\n cwd: string;\n /** Benchmark output dir relative to cwd (default .edsger/benchmark). */\n dir: string;\n /** Output path for the self-contained HTML (relative to cwd unless absolute). */\n html: string;\n open: boolean;\n}\n\n/** Export a self-contained, shareable HTML dashboard (data inlined). */\nexport async function runReport(opts: ReportOptions): Promise<number> {\n const benchmarkDir = join(opts.cwd, opts.dir);\n const data = assembleData(benchmarkDir);\n if (!hasData(data)) {\n log.error(`No benchmark data in ${opts.dir}. Run \\`edsger benchmark\\` first.`);\n return 1;\n }\n\n const html = renderSingleFile(readViewerSingleTemplate(), data);\n const out = isAbsolute(opts.html) ? opts.html : join(opts.cwd, opts.html);\n mkdirSync(dirname(out), { recursive: true });\n writeFileSync(out, html, \"utf8\");\n\n log.success(\n `Wrote self-contained report to ${pc.bold(opts.html)} ` +\n `${pc.dim(`(${Math.round(html.length / 1024)} kB, open in any browser)`)}`\n );\n if (opts.open) openInBrowser(out);\n return 0;\n}\n","import { appendFileSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { basename, dirname, isAbsolute, join } from \"node:path\";\nimport pc from \"picocolors\";\nimport { resolveStandard } from \"../core/assets.js\";\nimport { loadConfig } from \"../core/config.js\";\nimport { runAgent } from \"../core/agent.js\";\nimport {\n assembleDiagramData,\n findDiagramViewerDir,\n hasData,\n readDiagramViewerSingleTemplate,\n renderDiagramsSingleFile\n} from \"../core/dashboard.js\";\nimport {\n buildDiagramsPrompt,\n prepareDiagrams,\n renderDiagramsMarkdown,\n type PreparedDiagrams\n} from \"../core/diagrams.js\";\nimport { gitInfo } from \"../core/git.js\";\nimport { log } from \"../core/logger.js\";\nimport { openInBrowser } from \"../core/open.js\";\nimport { DiagramsResultSchema } from \"../core/schema.js\";\nimport { startViewerServer } from \"../core/viewer-server.js\";\nimport type { DiagramCatalog, GlobalOptions } from \"../types.js\";\n\nexport interface DiagramGenerateOptions extends GlobalOptions {\n /** Directory to write the diagrams into (relative to repo). */\n out: string;\n /** Skip writing files into the repo. */\n noWrite: boolean;\n /** Restrict generation to these catalog diagram ids. */\n only?: string[];\n}\n\nexport async function runDiagramGenerate(opts: DiagramGenerateOptions): Promise<number> {\n const { config, path: configPath } = loadConfig(opts.cwd);\n const configDir = configPath ? join(configPath, \"..\") : opts.cwd;\n const resolved = resolveStandard(\"diagrams\", opts, config, configDir);\n const catalog = resolved.standard as DiagramCatalog;\n\n log.info(\n `Diagramming ${pc.bold(basename(opts.cwd))} with ${pc.bold(catalog.name)} ` +\n `(languages: ${resolved.languages.join(\", \") || \"generic\"})`\n );\n log.debug(`catalog layers: ${resolved.layers.join(\" → \")}`);\n\n const prompt = buildDiagramsPrompt(catalog, opts.cwd, opts.only);\n const { result, costUsd, numTurns } = await runAgent({\n prompt,\n cwd: opts.cwd,\n model: opts.model,\n maxTurns: opts.maxTurns,\n timeoutMs: opts.timeoutMs,\n allowWrite: false,\n verbose: opts.verbose,\n resultShape: DiagramsResultSchema.shape,\n systemPromptAppend:\n \"You are Edsger, a staff-level software architect. You produce accurate, \" +\n \"legible diagrams of a codebase as valid Mermaid, grounded strictly in the \" +\n \"code you inspect. Never invent components, tables, or flows that are not in \" +\n \"the repository. Do not modify any files.\"\n });\n\n if (!result) {\n log.error(\n \"The agent did not produce a result. Try increasing --max-turns or check credentials.\"\n );\n return 1;\n }\n\n const prepared = prepareDiagrams(catalog, result);\n const generatedAt = new Date().toISOString();\n // Filesystem-safe UTC run id (e.g. 20260701T034500Z): lexicographic == chronological.\n const runId = generatedAt.replace(/[-:]/g, \"\").replace(/\\.\\d+Z$/, \"Z\");\n const git = gitInfo(opts.cwd);\n const md = renderDiagramsMarkdown(prepared, {\n repo: basename(opts.cwd),\n languages: resolved.languages,\n layers: resolved.layers,\n generatedAt,\n model: opts.model\n });\n\n const jsonReport = {\n schema: \"edsger.diagrams/1\",\n runId,\n generatedAt,\n model: opts.model,\n repo: basename(opts.cwd),\n git,\n languages: resolved.languages,\n catalog: { name: catalog.name, version: catalog.version, layers: resolved.layers },\n profile: prepared.profile,\n diagrams: prepared.diagrams,\n notes: prepared.notes,\n costUsd\n };\n\n const groupCounts: Record<string, number> = {};\n for (const d of prepared.diagrams) groupCounts[d.groupId] = (groupCounts[d.groupId] ?? 0) + 1;\n\n // Compact, append-only trend index: one line per run, cheap to read for history.\n const historyRecord = {\n runId,\n generatedAt,\n commit: git.commit,\n branch: git.branch,\n dirty: git.dirty,\n model: opts.model,\n catalogVersion: catalog.version,\n diagramCount: prepared.diagrams.length,\n groups: groupCounts,\n costUsd\n };\n\n if (!opts.noWrite && !opts.dryRun) {\n const baseDir = join(opts.cwd, opts.out);\n const mdOut = md + \"\\n\";\n const jsonOut = JSON.stringify(jsonReport, null, 2) + \"\\n\";\n\n // Archive this run under runs/<timestamp>/ so previous diagram sets are preserved.\n const runDir = join(baseDir, \"runs\", runId);\n mkdirSync(runDir, { recursive: true });\n writeFileSync(join(runDir, \"diagrams.json\"), jsonOut, \"utf8\");\n writeFileSync(join(runDir, \"diagrams.md\"), mdOut, \"utf8\");\n\n // Refresh the canonical top-level files as the stable \"latest\" pointer.\n writeFileSync(join(baseDir, \"diagrams.json\"), jsonOut, \"utf8\");\n writeFileSync(join(baseDir, \"diagrams.md\"), mdOut, \"utf8\");\n\n appendFileSync(join(baseDir, \"history.jsonl\"), JSON.stringify(historyRecord) + \"\\n\", \"utf8\");\n\n log.success(\n `Diagrams written to ${pc.bold(join(opts.out, \"diagrams.md\"))} ` +\n `${pc.dim(`(run archived at ${join(opts.out, \"runs\", runId)})`)}`\n );\n }\n\n printSummary(prepared, numTurns, costUsd);\n if (opts.json) process.stdout.write(JSON.stringify(jsonReport, null, 2) + \"\\n\");\n return 0;\n}\n\nfunction printSummary(prepared: PreparedDiagrams, numTurns: number, costUsd: number): void {\n log.heading(`${prepared.diagrams.length} diagram(s)`);\n let currentGroup: string | null = null;\n for (const d of prepared.diagrams) {\n if (d.groupName !== currentGroup) {\n currentGroup = d.groupName;\n process.stderr.write(` ${pc.bold(currentGroup)}\\n`);\n }\n const warn = d.warnings.length ? ` ${pc.yellow(\"⚠\")}` : \"\";\n process.stderr.write(` ${pc.cyan(\"◆\")} ${d.title} ${pc.dim(`(${d.type})`)}${warn}\\n`);\n }\n log.step(`${numTurns} turns · ~$${costUsd.toFixed(3)}`);\n}\n\n// --- serve -------------------------------------------------------------------\n\nexport interface DiagramServeOptions {\n cwd: string;\n /** Diagrams output dir relative to cwd (default .edsger/diagrams). */\n dir: string;\n port: number;\n host: string;\n open: boolean;\n}\n\nexport async function runDiagramServe(opts: DiagramServeOptions): Promise<number> {\n const diagramsDir = join(opts.cwd, opts.dir);\n const viewerDir = findDiagramViewerDir();\n\n return startViewerServer({\n viewerDir,\n indexFile: \"diagrams.html\",\n dataRoute: \"/edsger-diagrams.json\",\n getData: () => assembleDiagramData(diagramsDir),\n port: opts.port,\n host: opts.host,\n open: opts.open,\n emptyHint: hasData(assembleDiagramData(diagramsDir))\n ? undefined\n : `No diagram data in ${opts.dir} yet — run \\`edsger diagram\\` first.`\n });\n}\n\n// --- report ------------------------------------------------------------------\n\nexport interface DiagramReportOptions {\n cwd: string;\n /** Diagrams output dir relative to cwd (default .edsger/diagrams). */\n dir: string;\n /** Output path for the self-contained HTML (relative to cwd unless absolute). */\n html: string;\n open: boolean;\n}\n\n/** Export a self-contained, shareable HTML diagram viewer (data inlined). */\nexport async function runDiagramReport(opts: DiagramReportOptions): Promise<number> {\n const diagramsDir = join(opts.cwd, opts.dir);\n const data = assembleDiagramData(diagramsDir);\n if (!hasData(data)) {\n log.error(`No diagram data in ${opts.dir}. Run \\`edsger diagram\\` first.`);\n return 1;\n }\n\n const html = renderDiagramsSingleFile(readDiagramViewerSingleTemplate(), data);\n const out = isAbsolute(opts.html) ? opts.html : join(opts.cwd, opts.html);\n mkdirSync(dirname(out), { recursive: true });\n writeFileSync(out, html, \"utf8\");\n\n log.success(\n `Wrote self-contained diagram viewer to ${pc.bold(opts.html)} ` +\n `${pc.dim(`(${Math.round(html.length / 1024)} kB, open in any browser)`)}`\n );\n if (opts.open) openInBrowser(out);\n return 0;\n}\n","import type { DiagramCatalog } from \"../types.js\";\nimport type { DiagramsResult, GeneratedDiagram } from \"./schema.js\";\nimport { log } from \"./logger.js\";\n\n/** A diagram enriched with its (display) group name, ready to persist/render. */\nexport interface PreparedDiagram extends GeneratedDiagram {\n groupName: string;\n /** Non-fatal issues found by a static Mermaid sanity check (may be empty). */\n warnings: string[];\n}\n\nexport interface PreparedDiagrams {\n profile: DiagramsResult[\"profile\"];\n diagrams: PreparedDiagram[];\n notes: string | null;\n}\n\n/** Build the agent prompt that turns a catalog into a repo-specific diagram set. */\nexport function buildDiagramsPrompt(catalog: DiagramCatalog, cwd: string, only?: string[]): string {\n const onlySet = only && only.length ? new Set(only.map((s) => s.trim())) : null;\n\n const catalogText = catalog.groups\n .map((group) => {\n const diagrams = group.diagrams\n .filter((d) => !onlySet || onlySet.has(d.id))\n .map((d) => {\n const detect = d.detect?.length ? `\\n detect: ${d.detect.join(\", \")}` : \"\";\n return (\n ` - id: ${d.id}\\n` +\n ` title: ${d.title}\\n` +\n ` mermaidType: ${d.type}\\n` +\n ` appliesWhen: ${d.appliesWhen.trim()}` +\n detect +\n `\\n guidance: ${d.guidance.trim()}`\n );\n })\n .join(\"\\n\");\n if (!diagrams) return \"\";\n return `- group: ${group.id} (${group.name})\\n${diagrams}`;\n })\n .filter(Boolean)\n .join(\"\\n\");\n\n return [\n `Produce a set of professional software diagrams for the repository at: ${cwd}`,\n ``,\n `You have a catalog of candidate diagrams below. Your job is to pick the ones`,\n `that genuinely fit THIS project and generate each as valid Mermaid.`,\n ``,\n `Method:`,\n `1. Explore the repository (Read/Grep/Glob and read-only Bash like ls, cat, git log).`,\n ` Characterise the project: what kind is it (service, library, CLI, SPA, data`,\n ` pipeline, monorepo, …), what does it integrate with, does it own a database,`,\n ` how is it deployed?`,\n `2. For each catalog diagram, use its appliesWhen/detect to decide whether it adds`,\n ` value for this repo. Only include diagrams the evidence supports. A library`,\n ` needs different diagrams than a microservice. Do NOT invent structure that is`,\n ` not in the code. Aim for the ${onlySet ? \"requested\" : \"5-9 most valuable\"} diagrams.`,\n `3. For each selected diagram, follow its guidance and emit VALID Mermaid of the`,\n ` given mermaidType, grounded in real files. Rules for the mermaid field:`,\n ` - Put ONLY the Mermaid source (starting with the diagram keyword, e.g.`,\n ` \"flowchart TD\" or \"erDiagram\"). Do NOT wrap it in \\`\\`\\`mermaid fences and`,\n ` do NOT add any prose/markdown outside the diagram.`,\n ` - It MUST parse as-is. Use simple alphanumeric node/participant ids and put`,\n ` human text in quoted labels, e.g. A[\"Order Service\"] not A[Order Service].`,\n ` Quote any label containing spaces, punctuation, parentheses or slashes.`,\n ` - Avoid Mermaid reserved words as bare node ids (especially \"end\" in`,\n ` flowcharts — write End or \"end\" instead).`,\n ` - Set \"type\" to the exact keyword the source starts with.`,\n ` - Keep each diagram to roughly one screen and legible.`,\n ` - Prefer faithful over exhaustive; record the files you used as evidence.`,\n `4. When finished, call submit_result exactly once with the project profile and`,\n ` the diagrams (each with id, groupId, title, type, mermaid, description, evidence).`,\n ``,\n `Diagram catalog:`,\n catalogText\n ].join(\"\\n\");\n}\n\n/** Strip accidental ```mermaid fences and surrounding blank lines from source. */\nfunction sanitizeMermaid(src: string): string {\n let s = src.trim();\n const fence = s.match(/^```(?:mermaid)?\\s*\\n([\\s\\S]*?)\\n```$/);\n if (fence && fence[1] !== undefined) s = fence[1].trim();\n return s;\n}\n\n/** Mermaid diagram keywords we know how to render (aligned with the catalog schema). */\nconst KNOWN_MERMAID_TYPES = new Set([\n \"flowchart\",\n \"graph\",\n \"sequenceDiagram\",\n \"classDiagram\",\n \"stateDiagram\",\n \"stateDiagram-v2\",\n \"erDiagram\",\n \"journey\",\n \"gantt\",\n \"gitGraph\",\n \"mindmap\",\n \"timeline\",\n \"requirementDiagram\",\n \"quadrantChart\",\n \"pie\",\n \"sankey-beta\",\n \"xychart-beta\",\n \"block-beta\",\n \"packet-beta\",\n \"kanban\",\n \"zenuml\",\n \"C4Context\",\n \"C4Container\",\n \"C4Component\",\n \"C4Deployment\",\n \"C4Dynamic\",\n \"architecture-beta\"\n]);\n\n/** The first meaningful token of a Mermaid source: its diagram-type keyword. */\nfunction firstKeyword(mermaid: string): string {\n for (const raw of mermaid.split(\"\\n\")) {\n const line = raw.trim();\n if (!line || line.startsWith(\"%%\")) continue;\n return line.split(/[\\s({]/)[0] ?? line;\n }\n return \"\";\n}\n\n/** Normalise interchangeable keywords so type comparisons don't false-positive. */\nfunction normaliseType(keyword: string): string {\n const k = keyword.trim();\n if (k === \"graph\") return \"flowchart\";\n if (k === \"stateDiagram\") return \"stateDiagram-v2\";\n return k;\n}\n\n/** Best-effort mermaid diagram-type keyword, used when the agent omits `type`. */\nfunction inferType(mermaid: string): string {\n return firstKeyword(mermaid) || \"flowchart\";\n}\n\n/**\n * A conservative, dependency-free sanity check on agent-produced Mermaid. It is\n * intentionally high-precision (only flags near-certain problems) so warnings\n * stay trustworthy; a full parse would need a browser/DOM the CLI can't assume.\n */\nexport function validateMermaid(declaredType: string, mermaid: string): string[] {\n const warnings: string[] = [];\n if (mermaid.includes(\"```\")) warnings.push(\"source still contains a ``` fence\");\n\n const keyword = firstKeyword(mermaid);\n if (!keyword) {\n warnings.push(\"no diagram content\");\n return warnings;\n }\n if (!KNOWN_MERMAID_TYPES.has(keyword)) {\n warnings.push(`unrecognised diagram keyword \"${keyword}\"`);\n }\n\n const body = mermaid.split(\"\\n\").filter((l) => {\n const t = l.trim();\n return t && !t.startsWith(\"%%\");\n });\n if (body.length < 2) warnings.push(\"header only — the diagram has no body\");\n\n // Flag a declared type that disagrees with the source's actual keyword (only\n // when the source keyword is one we recognise, to avoid noise).\n if (declaredType && KNOWN_MERMAID_TYPES.has(keyword)) {\n if (normaliseType(declaredType) !== normaliseType(keyword)) {\n warnings.push(`declared type \"${declaredType}\" but source starts with \"${keyword}\"`);\n }\n }\n return warnings;\n}\n\n/**\n * Validate + normalise the agent's raw result into a persistable shape: attach\n * each diagram's group name, sanitise mermaid, drop empties, and order by the\n * catalog's group order for stable, readable output.\n */\nexport function prepareDiagrams(catalog: DiagramCatalog, result: DiagramsResult): PreparedDiagrams {\n const groupName = new Map(catalog.groups.map((g) => [g.id, g.name]));\n const groupOrder = new Map(catalog.groups.map((g, i) => [g.id, i]));\n\n const prepared: PreparedDiagram[] = [];\n const seenIds = new Map<string, number>();\n for (const d of result.diagrams) {\n const mermaid = sanitizeMermaid(d.mermaid ?? \"\");\n if (!mermaid) {\n log.warn(`Skipping diagram \"${d.id}\" — it had no mermaid source.`);\n continue;\n }\n // Disambiguate duplicate ids so viewer keys and Markdown anchors stay unique.\n const baseId = d.id || inferType(mermaid);\n const count = seenIds.get(baseId) ?? 0;\n seenIds.set(baseId, count + 1);\n const id = count === 0 ? baseId : `${baseId}-${count + 1}`;\n\n const type = d.type?.trim() || inferType(mermaid);\n prepared.push({\n ...d,\n id,\n mermaid,\n type,\n evidence: d.evidence ?? [],\n groupName: groupName.get(d.groupId) ?? \"Other\",\n warnings: validateMermaid(type, mermaid)\n });\n }\n\n // Stable sort by catalog group order, keeping within-group order as returned.\n prepared.sort((a, b) => {\n const oa = groupOrder.get(a.groupId) ?? Number.MAX_SAFE_INTEGER;\n const ob = groupOrder.get(b.groupId) ?? Number.MAX_SAFE_INTEGER;\n return oa - ob;\n });\n\n if (prepared.length === 0) {\n log.warn(\"The agent returned no usable diagrams.\");\n } else {\n const flagged = prepared.filter((d) => d.warnings.length);\n if (flagged.length) {\n log.warn(\n `${flagged.length}/${prepared.length} diagram(s) have Mermaid warnings — they will still ` +\n `render if valid, but check: ${flagged.map((d) => d.id).join(\", \")}`\n );\n }\n }\n\n return { profile: result.profile, diagrams: prepared, notes: result.notes ?? null };\n}\n\n/** Render a human-readable Markdown document embedding renderable mermaid blocks. */\nexport function renderDiagramsMarkdown(\n prepared: PreparedDiagrams,\n meta: { repo: string; languages: string[]; layers: string[]; generatedAt: string; model: string }\n): string {\n const lines: string[] = [];\n lines.push(`# Edsger Diagrams`);\n lines.push(\"\");\n lines.push(`> ${prepared.profile.summary}`);\n lines.push(\"\");\n lines.push(`| Field | Value |`);\n lines.push(`| --- | --- |`);\n lines.push(`| Repository | \\`${meta.repo}\\` |`);\n lines.push(`| Languages | ${meta.languages.join(\", \") || \"n/a\"} |`);\n lines.push(`| Project kinds | ${prepared.profile.kinds.join(\", \") || \"n/a\"} |`);\n lines.push(`| Catalog sources | ${meta.layers.join(\" → \")} |`);\n lines.push(`| Model | ${meta.model} |`);\n lines.push(`| Generated | ${meta.generatedAt} |`);\n lines.push(\"\");\n\n if (prepared.profile.characteristics.length) {\n lines.push(`**Characteristics:** ${prepared.profile.characteristics.join(\" · \")}`);\n lines.push(\"\");\n }\n\n // Group the diagrams by their group name, preserving the prepared order.\n let currentGroup: string | null = null;\n for (const d of prepared.diagrams) {\n if (d.groupName !== currentGroup) {\n currentGroup = d.groupName;\n lines.push(`## ${currentGroup}`);\n lines.push(\"\");\n }\n lines.push(`### ${d.title}`);\n lines.push(\"\");\n lines.push(`${d.description} _(${d.type})_`);\n lines.push(\"\");\n if (d.warnings.length) {\n lines.push(`> ⚠️ ${d.warnings.join(\"; \")}`);\n lines.push(\"\");\n }\n lines.push(\"```mermaid\");\n lines.push(d.mermaid);\n lines.push(\"```\");\n lines.push(\"\");\n if (d.evidence.length) {\n lines.push(`<sub>Evidence: ${d.evidence.map((e) => `\\`${e}\\``).join(\", \")}</sub>`);\n lines.push(\"\");\n }\n }\n\n if (prepared.notes) {\n lines.push(`## Notes`);\n lines.push(\"\");\n lines.push(prepared.notes);\n lines.push(\"\");\n }\n\n lines.push(`---`);\n lines.push(`<sub>Generated by [edsger](https://www.npmjs.com/package/edsger).</sub>`);\n return lines.join(\"\\n\");\n}\n","import { appendFileSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { basename, dirname, isAbsolute, join } from \"node:path\";\nimport pc from \"picocolors\";\nimport { resolveStandard } from \"../core/assets.js\";\nimport { loadConfig } from \"../core/config.js\";\nimport { runAgent } from \"../core/agent.js\";\nimport {\n assembleMindmapData,\n findMindmapViewerDir,\n hasData,\n readMindmapViewerSingleTemplate,\n renderMindmapSingleFile\n} from \"../core/dashboard.js\";\nimport {\n buildMindmapPrompt,\n prepareMindmap,\n renderMindmapMarkdown,\n type MindmapTreeNode,\n type PreparedMindmap\n} from \"../core/mindmap.js\";\nimport { gitInfo } from \"../core/git.js\";\nimport { log } from \"../core/logger.js\";\nimport { openInBrowser } from \"../core/open.js\";\nimport { MindmapResultSchema } from \"../core/schema.js\";\nimport { startViewerServer } from \"../core/viewer-server.js\";\nimport type { GlobalOptions, MindmapStandard } from \"../types.js\";\n\nexport interface MindmapGenerateOptions extends GlobalOptions {\n /** Directory to write the mind map into (relative to repo). */\n out: string;\n /** Skip writing files into the repo. */\n noWrite: boolean;\n /** Optional area/topic the map should concentrate its depth on. */\n focus?: string;\n}\n\nexport async function runMindmapGenerate(opts: MindmapGenerateOptions): Promise<number> {\n const { config, path: configPath } = loadConfig(opts.cwd);\n const configDir = configPath ? join(configPath, \"..\") : opts.cwd;\n const resolved = resolveStandard(\"mindmap\", opts, config, configDir);\n const standard = resolved.standard as MindmapStandard;\n\n log.info(\n `Mind-mapping ${pc.bold(basename(opts.cwd))} with ${pc.bold(standard.name)} ` +\n `(languages: ${resolved.languages.join(\", \") || \"generic\"})`\n );\n log.debug(`standard layers: ${resolved.layers.join(\" → \")}`);\n\n const prompt = buildMindmapPrompt(standard, opts.cwd, opts.focus);\n const { result, costUsd, numTurns } = await runAgent({\n prompt,\n cwd: opts.cwd,\n model: opts.model,\n maxTurns: opts.maxTurns,\n timeoutMs: opts.timeoutMs,\n allowWrite: false,\n verbose: opts.verbose,\n resultShape: MindmapResultSchema.shape,\n systemPromptAppend:\n \"You are Edsger, a staff-level engineer explaining a codebase to a newcomer. \" +\n \"You produce a faithful implementation mind map grounded strictly in the code \" +\n \"you inspect: every node true and specific, every leaf citing real files. \" +\n \"Never invent modules, flows, or files that are not in the repository. \" +\n \"Do not modify any files.\"\n });\n\n if (!result) {\n log.error(\n \"The agent did not produce a result. Try increasing --max-turns or check credentials.\"\n );\n return 1;\n }\n\n const prepared = prepareMindmap(result, { repo: basename(opts.cwd) });\n const generatedAt = new Date().toISOString();\n // Filesystem-safe UTC run id (e.g. 20260701T034500Z): lexicographic == chronological.\n const runId = generatedAt.replace(/[-:]/g, \"\").replace(/\\.\\d+Z$/, \"Z\");\n const git = gitInfo(opts.cwd);\n const md = renderMindmapMarkdown(prepared, {\n repo: basename(opts.cwd),\n languages: resolved.languages,\n layers: resolved.layers,\n generatedAt,\n model: opts.model\n });\n\n const jsonReport = {\n schema: \"edsger.mindmap/1\",\n runId,\n generatedAt,\n model: opts.model,\n repo: basename(opts.cwd),\n git,\n languages: resolved.languages,\n standard: { name: standard.name, version: standard.version, layers: resolved.layers },\n profile: prepared.profile,\n root: prepared.root,\n nodeCount: prepared.nodeCount,\n depth: prepared.depth,\n focus: opts.focus ?? null,\n notes: prepared.notes,\n costUsd\n };\n\n // Compact, append-only trend index: one line per run, cheap to read for history.\n const historyRecord = {\n runId,\n generatedAt,\n commit: git.commit,\n branch: git.branch,\n dirty: git.dirty,\n model: opts.model,\n standardVersion: standard.version,\n nodeCount: prepared.nodeCount,\n depth: prepared.depth,\n costUsd\n };\n\n if (!opts.noWrite && !opts.dryRun) {\n const baseDir = join(opts.cwd, opts.out);\n const mdOut = md + \"\\n\";\n const jsonOut = JSON.stringify(jsonReport, null, 2) + \"\\n\";\n\n // Archive this run under runs/<timestamp>/ so previous maps are preserved.\n const runDir = join(baseDir, \"runs\", runId);\n mkdirSync(runDir, { recursive: true });\n writeFileSync(join(runDir, \"mindmap.json\"), jsonOut, \"utf8\");\n writeFileSync(join(runDir, \"mindmap.md\"), mdOut, \"utf8\");\n\n // Refresh the canonical top-level files as the stable \"latest\" pointer.\n writeFileSync(join(baseDir, \"mindmap.json\"), jsonOut, \"utf8\");\n writeFileSync(join(baseDir, \"mindmap.md\"), mdOut, \"utf8\");\n\n appendFileSync(join(baseDir, \"history.jsonl\"), JSON.stringify(historyRecord) + \"\\n\", \"utf8\");\n\n log.success(\n `Mind map written to ${pc.bold(join(opts.out, \"mindmap.md\"))} ` +\n `${pc.dim(`(run archived at ${join(opts.out, \"runs\", runId)})`)}`\n );\n }\n\n printSummary(prepared, numTurns, costUsd);\n if (opts.json) process.stdout.write(JSON.stringify(jsonReport, null, 2) + \"\\n\");\n return 0;\n}\n\n/** Show the root and the first two outline levels, Workflowy-style. */\nfunction printSummary(prepared: PreparedMindmap, numTurns: number, costUsd: number): void {\n log.heading(`${prepared.root.title} — ${prepared.nodeCount} nodes, depth ${prepared.depth}`);\n const line = (node: MindmapTreeNode, indent: string): void => {\n const kids = node.children.length ? pc.dim(` (${countNodes(node) - 1})`) : \"\";\n process.stderr.write(`${indent}${pc.cyan(\"•\")} ${node.title}${kids}\\n`);\n };\n for (const branch of prepared.root.children) {\n line(branch, \" \");\n for (const child of branch.children) line(child, \" \");\n }\n log.step(`${numTurns} turns · ~$${costUsd.toFixed(3)}`);\n}\n\nfunction countNodes(node: MindmapTreeNode): number {\n return 1 + node.children.reduce((acc, c) => acc + countNodes(c), 0);\n}\n\n// --- serve -------------------------------------------------------------------\n\nexport interface MindmapServeOptions {\n cwd: string;\n /** Mind-map output dir relative to cwd (default .edsger/mindmap). */\n dir: string;\n port: number;\n host: string;\n open: boolean;\n}\n\nexport async function runMindmapServe(opts: MindmapServeOptions): Promise<number> {\n const mindmapDir = join(opts.cwd, opts.dir);\n const viewerDir = findMindmapViewerDir();\n\n return startViewerServer({\n viewerDir,\n indexFile: \"mindmap.html\",\n dataRoute: \"/edsger-mindmap.json\",\n getData: () => assembleMindmapData(mindmapDir),\n port: opts.port,\n host: opts.host,\n open: opts.open,\n emptyHint: hasData(assembleMindmapData(mindmapDir))\n ? undefined\n : `No mind-map data in ${opts.dir} yet — run \\`edsger mindmap\\` first.`\n });\n}\n\n// --- report ------------------------------------------------------------------\n\nexport interface MindmapReportOptions {\n cwd: string;\n /** Mind-map output dir relative to cwd (default .edsger/mindmap). */\n dir: string;\n /** Output path for the self-contained HTML (relative to cwd unless absolute). */\n html: string;\n open: boolean;\n}\n\n/** Export a self-contained, shareable HTML mind-map viewer (data inlined). */\nexport async function runMindmapReport(opts: MindmapReportOptions): Promise<number> {\n const mindmapDir = join(opts.cwd, opts.dir);\n const data = assembleMindmapData(mindmapDir);\n if (!hasData(data)) {\n log.error(`No mind-map data in ${opts.dir}. Run \\`edsger mindmap\\` first.`);\n return 1;\n }\n\n const html = renderMindmapSingleFile(readMindmapViewerSingleTemplate(), data);\n const out = isAbsolute(opts.html) ? opts.html : join(opts.cwd, opts.html);\n mkdirSync(dirname(out), { recursive: true });\n writeFileSync(out, html, \"utf8\");\n\n log.success(\n `Wrote self-contained mind-map viewer to ${pc.bold(opts.html)} ` +\n `${pc.dim(`(${Math.round(html.length / 1024)} kB, open in any browser)`)}`\n );\n if (opts.open) openInBrowser(out);\n return 0;\n}\n","import type { MindmapStandard } from \"../types.js\";\nimport type { MindmapFlatNode, MindmapResult } from \"./schema.js\";\nimport { log } from \"./logger.js\";\n\n/** A node of the assembled mind-map tree (the persisted/rendered shape). */\nexport interface MindmapTreeNode {\n id: string;\n title: string;\n summary: string;\n kind: string;\n files: string[];\n children: MindmapTreeNode[];\n}\n\nexport interface PreparedMindmap {\n profile: MindmapResult[\"profile\"];\n root: MindmapTreeNode;\n nodeCount: number;\n /** Depth of the tree, root inclusive. */\n depth: number;\n /** Non-fatal issues found while assembling the tree (may be empty). */\n warnings: string[];\n notes: string | null;\n}\n\n/** Build the agent prompt that turns the standard into a repo-specific mind map. */\nexport function buildMindmapPrompt(standard: MindmapStandard, cwd: string, focus?: string): string {\n const maxDepth = standard.maxDepth ?? 5;\n const aspectsText = standard.aspects\n .map((a) => {\n const detect = a.detect?.length ? `\\n detect: ${a.detect.join(\", \")}` : \"\";\n return (\n ` - id: ${a.id}\\n` +\n ` name: ${a.name}\\n` +\n ` appliesWhen: ${a.appliesWhen.trim()}` +\n detect +\n `\\n guidance: ${a.guidance.trim()}`\n );\n })\n .join(\"\\n\");\n\n return [\n `Build an implementation mind map of the repository at: ${cwd}`,\n ``,\n `The mind map is an outline tree (like Workflowy): the root is the project,`,\n `and the branches explain how the code is actually implemented, deep enough`,\n `that leaves point at concrete files.`,\n ...(focus\n ? [\n ``,\n `FOCUS: the user asked the map to concentrate on: \"${focus}\". Give that`,\n `area most of the depth; keep other branches to a shallow orientation level.`\n ]\n : []),\n ``,\n `Method:`,\n `1. Explore the repository (Read/Grep/Glob and read-only Bash like ls, cat,`,\n ` git log). Characterise the project: what kind is it (service, library, CLI,`,\n ` SPA, data pipeline, monorepo, …) and how the source is organised.`,\n `2. You have a list of candidate top-level branches (\"aspects\") below. Keep only`,\n ` the ones THIS project's code supports (use appliesWhen/detect), rename them`,\n ` to the project's own vocabulary where that is clearer, and grow each into a`,\n ` subtree by following its guidance. Aim for 3-7 first-level branches.`,\n `3. Tree rules:`,\n ` - Root node: the project — its name as the title, a one-line summary of`,\n ` what it does. Exactly ONE root.`,\n ` - Every node: a short title (2-6 words, like an outline bullet) and a one-`,\n ` or-two-sentence summary that says something true and specific about THIS`,\n ` codebase — no generic filler.`,\n ` - Interior nodes group; leaf nodes land on concrete implementation and MUST`,\n ` cite the repo-relative file(s) they describe in \"files\".`,\n ` - Maximum depth ${maxDepth} (root inclusive). Prefer depth where the code is`,\n ` interesting, brevity where it is boilerplate. Do NOT invent structure that`,\n ` is not in the code, and do not just mirror the file listing — explain it.`,\n `4. Encode the tree as a FLAT node list: each node has a unique kebab-case \"id\"`,\n ` and a \"parentId\" referencing its parent's id (null only for the root). List`,\n ` children in reading order right after their parent. Tag each node with a`,\n ` \"kind\": area, module, component, flow, step, data, external, config, or topic.`,\n `5. When finished, call submit_result exactly once with the project profile,`,\n ` the flat node list, and optional notes.`,\n ``,\n ...(standard.guidance ? [`Overall guidance: ${standard.guidance.trim()}`, ``] : []),\n `Candidate top-level branches:`,\n aspectsText\n ].join(\"\\n\");\n}\n\n/** Slug fallback for nodes the agent left without a usable id. */\nfunction slugify(text: string): string {\n return (\n text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 60) || \"node\"\n );\n}\n\n/**\n * Assemble the agent's flat node list into a single-rooted tree, defensively:\n * duplicate ids are renamed, orphans (missing parent) are attached to the root,\n * cycles are broken, and multiple roots are gathered under a synthetic project\n * root. Every anomaly is recorded as a warning rather than a failure.\n */\nexport function prepareMindmap(result: MindmapResult, fallback: { repo: string }): PreparedMindmap {\n const warnings: string[] = [];\n\n // 1. Normalise nodes and de-duplicate ids (first occurrence keeps the id).\n const byId = new Map<string, MindmapFlatNode>();\n for (const raw of result.nodes) {\n const node = { ...raw, id: raw.id?.trim() || slugify(raw.title) };\n if (!node.title?.trim()) {\n warnings.push(`dropped a node with no title (id \"${node.id}\")`);\n continue;\n }\n let id = node.id;\n for (let n = 2; byId.has(id); n++) id = `${node.id}-${n}`;\n if (id !== node.id) warnings.push(`renamed duplicate node id \"${node.id}\" to \"${id}\"`);\n byId.set(id, { ...node, id });\n }\n\n // 2. Resolve each node's effective parent; break self-references and cycles.\n const parentOf = new Map<string, string | null>();\n for (const node of byId.values()) {\n const p = node.parentId && node.parentId !== node.id ? node.parentId : null;\n parentOf.set(node.id, p && byId.has(p) ? p : null);\n if (node.parentId && !byId.has(node.parentId)) {\n warnings.push(`node \"${node.id}\" referenced missing parent \"${node.parentId}\"`);\n }\n }\n for (const id of parentOf.keys()) {\n const seen = new Set<string>([id]);\n let cur = parentOf.get(id) ?? null;\n while (cur) {\n if (seen.has(cur)) {\n warnings.push(`broke a parent cycle at node \"${cur}\"`);\n parentOf.set(cur, null);\n break;\n }\n seen.add(cur);\n cur = parentOf.get(cur) ?? null;\n }\n }\n\n // 3. Build the forest, preserving the agent's node order within siblings.\n const treeOf = new Map<string, MindmapTreeNode>();\n for (const node of byId.values()) {\n treeOf.set(node.id, {\n id: node.id,\n title: node.title.trim(),\n summary: node.summary?.trim() ?? \"\",\n kind: node.kind?.trim() || \"topic\",\n files: node.files ?? [],\n children: []\n });\n }\n const roots: MindmapTreeNode[] = [];\n for (const node of byId.values()) {\n const tree = treeOf.get(node.id)!;\n const parent = parentOf.get(node.id);\n if (parent) treeOf.get(parent)!.children.push(tree);\n else roots.push(tree);\n }\n\n // 4. Ensure a single project root.\n let root: MindmapTreeNode;\n if (roots.length === 1 && roots[0]) {\n root = roots[0];\n } else {\n if (roots.length > 1) warnings.push(`${roots.length} root nodes — gathered under the project`);\n let rootId = \"root\";\n for (let n = 2; treeOf.has(rootId); n++) rootId = `root-${n}`;\n root = {\n id: rootId,\n title: fallback.repo,\n summary: result.profile.summary,\n kind: \"area\",\n files: [],\n children: roots\n };\n }\n\n const nodeCount = countNodes(root);\n const depth = treeDepth(root);\n if (nodeCount <= 1) log.warn(\"The agent returned an (almost) empty mind map.\");\n for (const w of warnings) log.warn(`mindmap: ${w}`);\n\n return { profile: result.profile, root, nodeCount, depth, warnings, notes: result.notes ?? null };\n}\n\nfunction countNodes(node: MindmapTreeNode): number {\n return 1 + node.children.reduce((acc, c) => acc + countNodes(c), 0);\n}\n\nfunction treeDepth(node: MindmapTreeNode): number {\n return 1 + node.children.reduce((acc, c) => Math.max(acc, treeDepth(c)), 0);\n}\n\n/** Render the mind map as a nested Markdown outline (readable + committable). */\nexport function renderMindmapMarkdown(\n prepared: PreparedMindmap,\n meta: { repo: string; languages: string[]; layers: string[]; generatedAt: string; model: string }\n): string {\n const lines: string[] = [];\n lines.push(`# Edsger Mind Map`);\n lines.push(\"\");\n lines.push(`> ${prepared.profile.summary}`);\n lines.push(\"\");\n lines.push(`| Field | Value |`);\n lines.push(`| --- | --- |`);\n lines.push(`| Repository | \\`${meta.repo}\\` |`);\n lines.push(`| Languages | ${meta.languages.join(\", \") || \"n/a\"} |`);\n lines.push(`| Project kinds | ${prepared.profile.kinds.join(\", \") || \"n/a\"} |`);\n lines.push(`| Nodes | ${prepared.nodeCount} (depth ${prepared.depth}) |`);\n lines.push(`| Standard sources | ${meta.layers.join(\" → \")} |`);\n lines.push(`| Model | ${meta.model} |`);\n lines.push(`| Generated | ${meta.generatedAt} |`);\n lines.push(\"\");\n\n lines.push(`## ${prepared.root.title}`);\n if (prepared.root.summary && prepared.root.summary !== prepared.profile.summary) {\n lines.push(\"\");\n lines.push(prepared.root.summary);\n }\n lines.push(\"\");\n for (const child of prepared.root.children) renderNode(lines, child, 0);\n\n if (prepared.notes) {\n lines.push(\"\");\n lines.push(`## Notes`);\n lines.push(\"\");\n lines.push(prepared.notes);\n }\n\n lines.push(\"\");\n lines.push(`---`);\n lines.push(`<sub>Generated by [edsger](https://www.npmjs.com/package/edsger).</sub>`);\n return lines.join(\"\\n\");\n}\n\nfunction renderNode(lines: string[], node: MindmapTreeNode, indent: number): void {\n const pad = \" \".repeat(indent);\n const files = node.files.length ? ` ${node.files.map((f) => `\\`${f}\\``).join(\" \")}` : \"\";\n const summary = node.summary ? ` — ${node.summary}` : \"\";\n lines.push(`${pad}- **${node.title}**${summary}${files}`);\n for (const child of node.children) renderNode(lines, child, indent + 1);\n}\n","import { appendFileSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { basename, dirname, isAbsolute, join } from \"node:path\";\nimport pc from \"picocolors\";\nimport { resolveStandard } from \"../core/assets.js\";\nimport { loadConfig } from \"../core/config.js\";\nimport { runAgent } from \"../core/agent.js\";\nimport {\n assembleTestcasesData,\n findTestcasesViewerDir,\n hasData,\n readTestcasesViewerSingleTemplate,\n renderTestcasesSingleFile\n} from \"../core/dashboard.js\";\nimport {\n PRIORITY_ORDER,\n buildTestcasesPrompt,\n isCase,\n prepareTestcases,\n renderTestcasesMarkdown,\n type PreparedTestcases,\n type TestcaseTreeNode\n} from \"../core/testcases.js\";\nimport { gitInfo } from \"../core/git.js\";\nimport { log } from \"../core/logger.js\";\nimport { openInBrowser } from \"../core/open.js\";\nimport { TestcasesResultSchema } from \"../core/schema.js\";\nimport { startViewerServer } from \"../core/viewer-server.js\";\nimport type { GlobalOptions, TestcasesStandard } from \"../types.js\";\n\nexport interface TestcasesGenerateOptions extends GlobalOptions {\n /** Directory to write the test plan into (relative to repo). */\n out: string;\n /** Skip writing files into the repo. */\n noWrite: boolean;\n /** Optional area/feature the plan should concentrate its depth on. */\n focus?: string;\n}\n\nexport async function runTestcasesGenerate(opts: TestcasesGenerateOptions): Promise<number> {\n const { config, path: configPath } = loadConfig(opts.cwd);\n const configDir = configPath ? join(configPath, \"..\") : opts.cwd;\n const resolved = resolveStandard(\"testcases\", opts, config, configDir);\n const standard = resolved.standard as TestcasesStandard;\n\n log.info(\n `Deriving manual test cases for ${pc.bold(basename(opts.cwd))} with ${pc.bold(standard.name)} ` +\n `(languages: ${resolved.languages.join(\", \") || \"generic\"})`\n );\n log.debug(`standard layers: ${resolved.layers.join(\" → \")}`);\n\n const prompt = buildTestcasesPrompt(standard, opts.cwd, opts.focus);\n const { result, costUsd, numTurns } = await runAgent({\n prompt,\n cwd: opts.cwd,\n model: opts.model,\n maxTurns: opts.maxTurns,\n timeoutMs: opts.timeoutMs,\n allowWrite: false,\n verbose: opts.verbose,\n resultShape: TestcasesResultSchema.shape,\n systemPromptAppend:\n \"You are Edsger, a staff-level QA engineer writing a manual test plan for \" +\n \"a human tester who has never read the code. You derive every test case \" +\n \"strictly from behaviour that exists in the repository you inspect: real \" +\n \"commands, flags, routes, screens, and error branches, with exact steps \" +\n \"and one verifiable expected result each. Never invent behaviour that is \" +\n \"not in the code. Do not modify any files.\"\n });\n\n if (!result) {\n log.error(\n \"The agent did not produce a result. Try increasing --max-turns or check credentials.\"\n );\n return 1;\n }\n\n const prepared = prepareTestcases(result, { repo: basename(opts.cwd) });\n const generatedAt = new Date().toISOString();\n // Filesystem-safe UTC run id (e.g. 20260701T034500Z): lexicographic == chronological.\n const runId = generatedAt.replace(/[-:]/g, \"\").replace(/\\.\\d+Z$/, \"Z\");\n const git = gitInfo(opts.cwd);\n const md = renderTestcasesMarkdown(prepared, {\n repo: basename(opts.cwd),\n languages: resolved.languages,\n layers: resolved.layers,\n generatedAt,\n model: opts.model\n });\n\n const jsonReport = {\n schema: \"edsger.testcases/1\",\n runId,\n generatedAt,\n model: opts.model,\n repo: basename(opts.cwd),\n git,\n languages: resolved.languages,\n standard: { name: standard.name, version: standard.version, layers: resolved.layers },\n profile: prepared.profile,\n root: prepared.root,\n nodeCount: prepared.nodeCount,\n caseCount: prepared.caseCount,\n priorities: prepared.priorities,\n depth: prepared.depth,\n focus: opts.focus ?? null,\n notes: prepared.notes,\n costUsd\n };\n\n // Compact, append-only trend index: one line per run, cheap to read for history.\n const historyRecord = {\n runId,\n generatedAt,\n commit: git.commit,\n branch: git.branch,\n dirty: git.dirty,\n model: opts.model,\n standardVersion: standard.version,\n nodeCount: prepared.nodeCount,\n caseCount: prepared.caseCount,\n priorities: prepared.priorities,\n depth: prepared.depth,\n costUsd\n };\n\n if (!opts.noWrite && !opts.dryRun) {\n const baseDir = join(opts.cwd, opts.out);\n const mdOut = md + \"\\n\";\n const jsonOut = JSON.stringify(jsonReport, null, 2) + \"\\n\";\n\n // Archive this run under runs/<timestamp>/ so previous plans are preserved.\n const runDir = join(baseDir, \"runs\", runId);\n mkdirSync(runDir, { recursive: true });\n writeFileSync(join(runDir, \"testcases.json\"), jsonOut, \"utf8\");\n writeFileSync(join(runDir, \"testcases.md\"), mdOut, \"utf8\");\n\n // Refresh the canonical top-level files as the stable \"latest\" pointer.\n writeFileSync(join(baseDir, \"testcases.json\"), jsonOut, \"utf8\");\n writeFileSync(join(baseDir, \"testcases.md\"), mdOut, \"utf8\");\n\n appendFileSync(join(baseDir, \"history.jsonl\"), JSON.stringify(historyRecord) + \"\\n\", \"utf8\");\n\n log.success(\n `Test plan written to ${pc.bold(join(opts.out, \"testcases.md\"))} ` +\n `${pc.dim(`(run archived at ${join(opts.out, \"runs\", runId)})`)}`\n );\n }\n\n printSummary(prepared, numTurns, costUsd);\n if (opts.json) process.stdout.write(JSON.stringify(jsonReport, null, 2) + \"\\n\");\n return 0;\n}\n\n/** Show the root, the first outline level, and the case tally, Workflowy-style. */\nfunction printSummary(prepared: PreparedTestcases, numTurns: number, costUsd: number): void {\n const tally = PRIORITY_ORDER.filter((p) => prepared.priorities[p] > 0)\n .map((p) => `${prepared.priorities[p]} ${p}`)\n .join(\", \");\n log.heading(\n `${prepared.root.title} — ${prepared.caseCount} cases${tally ? ` (${tally})` : \"\"}, ` +\n `${prepared.nodeCount} nodes, depth ${prepared.depth}`\n );\n const line = (node: TestcaseTreeNode, indent: string): void => {\n const cases = countCases(node);\n const suffix = cases ? pc.dim(` (${cases} case${cases === 1 ? \"\" : \"s\"})`) : \"\";\n process.stderr.write(`${indent}${pc.cyan(\"•\")} ${node.title}${suffix}\\n`);\n };\n for (const branch of prepared.root.children) line(branch, \" \");\n log.step(`${numTurns} turns · ~$${costUsd.toFixed(3)}`);\n}\n\nfunction countCases(node: TestcaseTreeNode): number {\n return (isCase(node) ? 1 : 0) + node.children.reduce((acc, c) => acc + countCases(c), 0);\n}\n\n// --- serve -------------------------------------------------------------------\n\nexport interface TestcasesServeOptions {\n cwd: string;\n /** Test-plan output dir relative to cwd (default .edsger/testcases). */\n dir: string;\n port: number;\n host: string;\n open: boolean;\n}\n\nexport async function runTestcasesServe(opts: TestcasesServeOptions): Promise<number> {\n const testcasesDir = join(opts.cwd, opts.dir);\n const viewerDir = findTestcasesViewerDir();\n\n return startViewerServer({\n viewerDir,\n indexFile: \"testcases.html\",\n dataRoute: \"/edsger-testcases.json\",\n getData: () => assembleTestcasesData(testcasesDir),\n port: opts.port,\n host: opts.host,\n open: opts.open,\n emptyHint: hasData(assembleTestcasesData(testcasesDir))\n ? undefined\n : `No test-case data in ${opts.dir} yet — run \\`edsger testcases\\` first.`\n });\n}\n\n// --- report ------------------------------------------------------------------\n\nexport interface TestcasesReportOptions {\n cwd: string;\n /** Test-plan output dir relative to cwd (default .edsger/testcases). */\n dir: string;\n /** Output path for the self-contained HTML (relative to cwd unless absolute). */\n html: string;\n open: boolean;\n}\n\n/** Export a self-contained, shareable HTML test-case viewer (data inlined). */\nexport async function runTestcasesReport(opts: TestcasesReportOptions): Promise<number> {\n const testcasesDir = join(opts.cwd, opts.dir);\n const data = assembleTestcasesData(testcasesDir);\n if (!hasData(data)) {\n log.error(`No test-case data in ${opts.dir}. Run \\`edsger testcases\\` first.`);\n return 1;\n }\n\n const html = renderTestcasesSingleFile(readTestcasesViewerSingleTemplate(), data);\n const out = isAbsolute(opts.html) ? opts.html : join(opts.cwd, opts.html);\n mkdirSync(dirname(out), { recursive: true });\n writeFileSync(out, html, \"utf8\");\n\n log.success(\n `Wrote self-contained test-case viewer to ${pc.bold(opts.html)} ` +\n `${pc.dim(`(${Math.round(html.length / 1024)} kB, open in any browser)`)}`\n );\n if (opts.open) openInBrowser(out);\n return 0;\n}\n","import type { TestcasesStandard } from \"../types.js\";\nimport type { TestcaseFlatNode, TestcasePriority, TestcasesResult } from \"./schema.js\";\nimport { log } from \"./logger.js\";\n\n/** A node of the assembled test-plan tree (the persisted/rendered shape). */\nexport interface TestcaseTreeNode {\n id: string;\n title: string;\n summary: string;\n kind: string;\n priority: TestcasePriority | null;\n preconditions: string[];\n steps: string[];\n expected: string | null;\n files: string[];\n children: TestcaseTreeNode[];\n}\n\nexport interface PreparedTestcases {\n profile: TestcasesResult[\"profile\"];\n root: TestcaseTreeNode;\n nodeCount: number;\n /** Leaf nodes that are executable cases (have steps or an expected result). */\n caseCount: number;\n /** Case counts per priority (unprioritised cases land under \"medium\"). */\n priorities: Record<TestcasePriority, number>;\n /** Depth of the tree, root inclusive. */\n depth: number;\n /** Non-fatal issues found while assembling the tree (may be empty). */\n warnings: string[];\n notes: string | null;\n}\n\nexport const PRIORITY_ORDER: TestcasePriority[] = [\"critical\", \"high\", \"medium\", \"low\"];\n\n/** True when a node is an executable manual test case (not just a grouping bullet). */\nexport function isCase(node: Pick<TestcaseTreeNode, \"steps\" | \"expected\">): boolean {\n return node.steps.length > 0 || Boolean(node.expected);\n}\n\n/** Build the agent prompt that turns the standard into a repo-specific test plan. */\nexport function buildTestcasesPrompt(\n standard: TestcasesStandard,\n cwd: string,\n focus?: string\n): string {\n const maxDepth = standard.maxDepth ?? 5;\n const aspectsText = standard.aspects\n .map((a) => {\n const detect = a.detect?.length ? `\\n detect: ${a.detect.join(\", \")}` : \"\";\n return (\n ` - id: ${a.id}\\n` +\n ` name: ${a.name}\\n` +\n ` appliesWhen: ${a.appliesWhen.trim()}` +\n detect +\n `\\n guidance: ${a.guidance.trim()}`\n );\n })\n .join(\"\\n\");\n\n return [\n `Derive a MANUAL test-case plan for the repository at: ${cwd}`,\n ``,\n `The plan is an outline tree (like Workflowy): the root is the project, the`,\n `branches are the areas a human tester should exercise, and every leaf is a`,\n `single concrete test case a tester who has never read the code can execute.`,\n `These are NOT automated code tests — they describe how a person verifies the`,\n `software behaves correctly by actually using it.`,\n ...(focus\n ? [\n ``,\n `FOCUS: the user asked the plan to concentrate on: \"${focus}\". Give that`,\n `area most of the depth; keep other areas to a shallow orientation level.`\n ]\n : []),\n ``,\n `Method:`,\n `1. Explore the repository (Read/Grep/Glob and read-only Bash like ls, cat,`,\n ` git log). Characterise the project: what kind is it (service, library, CLI,`,\n ` SPA, data pipeline, monorepo, …), what its real entry points and user-facing`,\n ` behaviours are, and what failure modes the code actually handles.`,\n `2. You have a list of candidate top-level test areas (\"aspects\") below. Keep`,\n ` only the ones THIS project's code supports (use appliesWhen/detect), rename`,\n ` them to the project's own vocabulary where that is clearer, and grow each`,\n ` into a subtree by following its guidance. Aim for 3-7 first-level areas.`,\n `3. Tree rules:`,\n ` - Root node: the project — its name as the title, one line on what a tester`,\n ` is validating. Exactly ONE root.`,\n ` - Interior nodes group features/scenarios: short title (2-8 words) plus a`,\n ` one-sentence summary specific to THIS codebase. Tag them kind: area,`,\n ` feature, flow, scenario, or topic.`,\n ` - EVERY leaf is one executable test case, tagged kind: \"case\", with:`,\n ` * summary — what the case verifies and why it matters;`,\n ` * preconditions — the state to prepare (install done, env var set, …);`,\n ` * steps — exact, observable manual actions in order (\"Run \\`x --y\\`\",`,\n ` \"Click Save\", \"Delete the config file\"), each independently checkable;`,\n ` * expected — the SINGLE outcome the tester verifies (message, exit`,\n ` code, UI state, file contents);`,\n ` * priority — critical (release blocker if broken), high (core`,\n ` behaviour), medium (important but recoverable), or low (polish);`,\n ` * files — the repo files implementing the behaviour under test.`,\n ` - Ground every case in behaviour that is actually in the code: real`,\n ` commands, flags, routes, screens, and error branches. Never invent`,\n ` behaviour, and never write \"check that it works\" — say exactly what to do`,\n ` and exactly what should happen.`,\n ` - Maximum depth ${maxDepth} (root inclusive). Prefer depth where the risk`,\n ` is, brevity where the behaviour is trivial — a plan a tester can work`,\n ` through top-to-bottom, not a combinatorial matrix.`,\n `4. Encode the tree as a FLAT node list: each node has a unique kebab-case \"id\"`,\n ` and a \"parentId\" referencing its parent's id (null only for the root). List`,\n ` children in reading order right after their parent.`,\n `5. When finished, call submit_result exactly once with the project profile,`,\n ` the flat node list, and optional notes.`,\n ``,\n ...(standard.guidance ? [`Overall guidance: ${standard.guidance.trim()}`, ``] : []),\n `Candidate top-level test areas:`,\n aspectsText\n ].join(\"\\n\");\n}\n\n/** Slug fallback for nodes the agent left without a usable id. */\nfunction slugify(text: string): string {\n return (\n text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 60) || \"node\"\n );\n}\n\n/**\n * Assemble the agent's flat node list into a single-rooted tree, defensively:\n * duplicate ids are renamed, orphans (missing parent) are attached to the root,\n * cycles are broken, and multiple roots are gathered under a synthetic project\n * root. Every anomaly is recorded as a warning rather than a failure.\n */\nexport function prepareTestcases(\n result: TestcasesResult,\n fallback: { repo: string }\n): PreparedTestcases {\n const warnings: string[] = [];\n\n // 1. Normalise nodes and de-duplicate ids (first occurrence keeps the id).\n const byId = new Map<string, TestcaseFlatNode>();\n for (const raw of result.nodes) {\n const node = { ...raw, id: raw.id?.trim() || slugify(raw.title) };\n if (!node.title?.trim()) {\n warnings.push(`dropped a node with no title (id \"${node.id}\")`);\n continue;\n }\n let id = node.id;\n for (let n = 2; byId.has(id); n++) id = `${node.id}-${n}`;\n if (id !== node.id) warnings.push(`renamed duplicate node id \"${node.id}\" to \"${id}\"`);\n byId.set(id, { ...node, id });\n }\n\n // 2. Resolve each node's effective parent; break self-references and cycles.\n const parentOf = new Map<string, string | null>();\n for (const node of byId.values()) {\n const p = node.parentId && node.parentId !== node.id ? node.parentId : null;\n parentOf.set(node.id, p && byId.has(p) ? p : null);\n if (node.parentId && !byId.has(node.parentId)) {\n warnings.push(`node \"${node.id}\" referenced missing parent \"${node.parentId}\"`);\n }\n }\n for (const id of parentOf.keys()) {\n const seen = new Set<string>([id]);\n let cur = parentOf.get(id) ?? null;\n while (cur) {\n if (seen.has(cur)) {\n warnings.push(`broke a parent cycle at node \"${cur}\"`);\n parentOf.set(cur, null);\n break;\n }\n seen.add(cur);\n cur = parentOf.get(cur) ?? null;\n }\n }\n\n // 3. Build the forest, preserving the agent's node order within siblings.\n const treeOf = new Map<string, TestcaseTreeNode>();\n for (const node of byId.values()) {\n treeOf.set(node.id, {\n id: node.id,\n title: node.title.trim(),\n summary: node.summary?.trim() ?? \"\",\n kind: node.kind?.trim() || \"topic\",\n priority: node.priority ?? null,\n preconditions: node.preconditions ?? [],\n steps: node.steps ?? [],\n expected: node.expected?.trim() || null,\n files: node.files ?? [],\n children: []\n });\n }\n const roots: TestcaseTreeNode[] = [];\n for (const node of byId.values()) {\n const tree = treeOf.get(node.id)!;\n const parent = parentOf.get(node.id);\n if (parent) treeOf.get(parent)!.children.push(tree);\n else roots.push(tree);\n }\n\n // 4. Ensure a single project root.\n let root: TestcaseTreeNode;\n if (roots.length === 1 && roots[0]) {\n root = roots[0];\n } else {\n if (roots.length > 1) warnings.push(`${roots.length} root nodes — gathered under the project`);\n let rootId = \"root\";\n for (let n = 2; treeOf.has(rootId); n++) rootId = `root-${n}`;\n root = {\n id: rootId,\n title: fallback.repo,\n summary: result.profile.summary,\n kind: \"area\",\n priority: null,\n preconditions: [],\n steps: [],\n expected: null,\n files: [],\n children: roots\n };\n }\n\n const nodeCount = countNodes(root);\n const depth = treeDepth(root);\n const priorities: Record<TestcasePriority, number> = { critical: 0, high: 0, medium: 0, low: 0 };\n let caseCount = 0;\n const tally = (node: TestcaseTreeNode): void => {\n if (isCase(node)) {\n caseCount++;\n priorities[node.priority ?? \"medium\"]++;\n }\n node.children.forEach(tally);\n };\n tally(root);\n\n if (nodeCount <= 1) log.warn(\"The agent returned an (almost) empty test plan.\");\n if (caseCount === 0 && nodeCount > 1) {\n warnings.push(\"no leaf node carries steps/expected — the plan has no executable cases\");\n }\n for (const w of warnings) log.warn(`testcases: ${w}`);\n\n return {\n profile: result.profile,\n root,\n nodeCount,\n caseCount,\n priorities,\n depth,\n warnings,\n notes: result.notes ?? null\n };\n}\n\nfunction countNodes(node: TestcaseTreeNode): number {\n return 1 + node.children.reduce((acc, c) => acc + countNodes(c), 0);\n}\n\nfunction treeDepth(node: TestcaseTreeNode): number {\n return 1 + node.children.reduce((acc, c) => Math.max(acc, treeDepth(c)), 0);\n}\n\n/** Render the test plan as a nested Markdown checklist (readable + committable). */\nexport function renderTestcasesMarkdown(\n prepared: PreparedTestcases,\n meta: { repo: string; languages: string[]; layers: string[]; generatedAt: string; model: string }\n): string {\n const lines: string[] = [];\n lines.push(`# Edsger Manual Test Cases`);\n lines.push(\"\");\n lines.push(`> ${prepared.profile.summary}`);\n lines.push(\"\");\n lines.push(`| Field | Value |`);\n lines.push(`| --- | --- |`);\n lines.push(`| Repository | \\`${meta.repo}\\` |`);\n lines.push(`| Languages | ${meta.languages.join(\", \") || \"n/a\"} |`);\n lines.push(`| Project kinds | ${prepared.profile.kinds.join(\", \") || \"n/a\"} |`);\n lines.push(\n `| Test cases | ${prepared.caseCount} ` +\n `(${PRIORITY_ORDER.map((p) => `${prepared.priorities[p]} ${p}`).join(\", \")}) |`\n );\n lines.push(`| Nodes | ${prepared.nodeCount} (depth ${prepared.depth}) |`);\n lines.push(`| Standard sources | ${meta.layers.join(\" → \")} |`);\n lines.push(`| Model | ${meta.model} |`);\n lines.push(`| Generated | ${meta.generatedAt} |`);\n lines.push(\"\");\n\n lines.push(`## ${prepared.root.title}`);\n if (prepared.root.summary && prepared.root.summary !== prepared.profile.summary) {\n lines.push(\"\");\n lines.push(prepared.root.summary);\n }\n lines.push(\"\");\n for (const child of prepared.root.children) renderNode(lines, child, 0);\n\n if (prepared.notes) {\n lines.push(\"\");\n lines.push(`## Notes`);\n lines.push(\"\");\n lines.push(prepared.notes);\n }\n\n lines.push(\"\");\n lines.push(`---`);\n lines.push(`<sub>Generated by [edsger](https://www.npmjs.com/package/edsger).</sub>`);\n return lines.join(\"\\n\");\n}\n\nfunction renderNode(lines: string[], node: TestcaseTreeNode, indent: number): void {\n const pad = \" \".repeat(indent);\n const files = node.files.length ? ` ${node.files.map((f) => `\\`${f}\\``).join(\" \")}` : \"\";\n const summary = node.summary ? ` — ${node.summary}` : \"\";\n if (isCase(node)) {\n // Cases render as an unchecked checklist item a tester can tick off.\n const prio = node.priority ? ` \\`${node.priority}\\`` : \"\";\n lines.push(`${pad}- [ ] **${node.title}**${prio}${summary}${files}`);\n const sub = \" \".repeat(indent + 1);\n if (node.preconditions.length) {\n lines.push(`${sub}- Preconditions: ${node.preconditions.join(\"; \")}`);\n }\n for (const [i, step] of node.steps.entries()) {\n lines.push(`${sub}- Step ${i + 1}: ${step}`);\n }\n if (node.expected) lines.push(`${sub}- Expected: ${node.expected}`);\n } else {\n lines.push(`${pad}- **${node.title}**${summary}${files}`);\n }\n for (const child of node.children) renderNode(lines, child, indent + 1);\n}\n","import {\n cpSync,\n existsSync,\n mkdirSync,\n readFileSync,\n readdirSync,\n rmSync,\n statSync,\n writeFileSync\n} from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport pc from \"picocolors\";\nimport { findBundledAssetsDir } from \"../core/assets.js\";\nimport { log } from \"../core/logger.js\";\n\nexport interface SkillsScope {\n cwd: string;\n /** Install for the whole user (~/.claude) instead of the current project. */\n global: boolean;\n}\n\nexport interface SkillsInstallOptions extends SkillsScope {\n force: boolean;\n}\n\n/** The skills this CLI manages (must match dir names under assets/skills). */\nconst MANAGED = [\"benchmark\", \"audit\", \"pr-review\", \"pr-resolve\"];\n\nfunction targetSkillsDir(scope: SkillsScope): string {\n return scope.global ? join(homedir(), \".claude\", \"skills\") : join(scope.cwd, \".claude\", \"skills\");\n}\n\nfunction sourceSkillsDir(): string {\n return join(findBundledAssetsDir(), \"skills\");\n}\n\n/**\n * Install the edsger skills into Claude Code so `/benchmark`, `/pr-review` and\n * `/pr-resolve` work — no plugin marketplace or paths required. The skill's\n * `${CLAUDE_PLUGIN_ROOT}` references are rewritten to the bundled assets dir.\n */\nexport async function runSkillsInstall(opts: SkillsInstallOptions): Promise<number> {\n const assetsDir = findBundledAssetsDir();\n const src = sourceSkillsDir();\n if (!existsSync(src)) {\n log.error(`Bundled skills not found at ${src}. Reinstall edsger.`);\n return 1;\n }\n const dest = targetSkillsDir(opts);\n mkdirSync(dest, { recursive: true });\n\n const available = readdirSync(src).filter((n) => existsSync(join(src, n, \"SKILL.md\")));\n let installed = 0;\n for (const name of available) {\n const outDir = join(dest, name);\n if (existsSync(outDir) && !opts.force) {\n log.warn(`skill \"${name}\" already exists — use --force to overwrite`);\n continue;\n }\n // Copy the whole skill dir (in case it grows auxiliary files), then rewrite\n // the SKILL.md plugin-root token to the absolute bundled assets path.\n rmSync(outDir, { recursive: true, force: true });\n cpSync(join(src, name), outDir, { recursive: true });\n const skillFile = join(outDir, \"SKILL.md\");\n const rewritten = readFileSync(skillFile, \"utf8\")\n .split(\"${CLAUDE_PLUGIN_ROOT}\")\n .join(assetsDir);\n writeFileSync(skillFile, rewritten, \"utf8\");\n installed++;\n log.success(`installed /${name}`);\n }\n\n if (installed === 0) {\n log.info(\"Nothing installed.\");\n return 0;\n }\n log.heading(`Installed ${installed} skill(s) into ${pc.bold(dest)}`);\n log.step(`scope: ${opts.global ? \"user (all projects)\" : \"this project\"}`);\n log.step(`standards: ${assetsDir}`);\n log.step(\"Open Claude Code and run /benchmark, /audit, /pr-review, or /pr-resolve.\");\n return 0;\n}\n\nexport async function runSkillsUninstall(opts: SkillsScope): Promise<number> {\n const dest = targetSkillsDir(opts);\n let removed = 0;\n for (const name of MANAGED) {\n const dir = join(dest, name);\n if (existsSync(dir)) {\n rmSync(dir, { recursive: true, force: true });\n removed++;\n log.success(`removed /${name}`);\n }\n }\n log.info(removed ? `Removed ${removed} skill(s) from ${dest}` : \"No edsger skills found.\");\n return 0;\n}\n\nexport async function runSkillsList(opts: SkillsScope): Promise<number> {\n for (const [label, scope] of [\n [\"user\", { ...opts, global: true }],\n [\"project\", { ...opts, global: false }]\n ] as const) {\n const dir = targetSkillsDir(scope);\n const present = MANAGED.filter((n) => {\n const p = join(dir, n, \"SKILL.md\");\n return existsSync(p) && statSync(p).isFile();\n });\n log.heading(`${label}: ${dir}`);\n if (present.length) for (const n of present) process.stderr.write(` ${pc.green(\"✓\")} /${n}\\n`);\n else process.stderr.write(` ${pc.dim(\"(none installed)\")}\\n`);\n }\n return 0;\n}\n"],"mappings":"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","names":["readFileSync","resolve","pc","dirname","isAbsolute","join","pc","existsSync","join","join","existsSync","pc","pc","existsSync","readFileSync","readdirSync","join","join","existsSync","readdirSync","readFileSync","execFileSync","existsSync","statSync","join","pc","join","existsSync","statSync","resolve","pc","join","pc","isAbsolute","dirname","appendFileSync","mkdirSync","writeFileSync","basename","join","pc","join","pc","basename","buildPrompt","mkdirSync","writeFileSync","appendFileSync","printSummary","pc","writeFileSync","join","SEVERITY_RANK","pc","buildPrompt","sevColor","truncate","execFile","promisify","pc","exec","promisify","execFile","pc","buildPrompt","printSummary","join","join","mkdirSync","writeFileSync","dirname","isAbsolute","join","pc","join","isAbsolute","mkdirSync","dirname","writeFileSync","pc","appendFileSync","mkdirSync","writeFileSync","basename","dirname","isAbsolute","join","pc","join","pc","basename","mkdirSync","writeFileSync","appendFileSync","printSummary","isAbsolute","dirname","appendFileSync","mkdirSync","writeFileSync","basename","dirname","isAbsolute","join","pc","indent","join","pc","basename","mkdirSync","writeFileSync","appendFileSync","printSummary","indent","countNodes","isAbsolute","dirname","appendFileSync","mkdirSync","writeFileSync","basename","dirname","isAbsolute","join","pc","slugify","countNodes","treeDepth","renderNode","indent","join","pc","basename","mkdirSync","writeFileSync","appendFileSync","printSummary","indent","isAbsolute","dirname","existsSync","mkdirSync","readFileSync","readdirSync","rmSync","statSync","writeFileSync","homedir","join","pc","join","homedir","existsSync","mkdirSync","readdirSync","rmSync","readFileSync","writeFileSync","pc","statSync","readFileSync","resolve","pc"]}