@cardor/agent-harness-kit 1.10.1 → 1.10.2

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/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/commands/build.ts","../src/core/materializer/claude-code.ts","../src/utils/file.ts","../src/core/materializer/detect-package-manager.ts","../src/core/materializer/mcp-merge.ts","../src/core/materializer/scaffold-utils.ts","../src/core/materializer/templates.ts","../src/core/materializer/codex-cli.ts","../src/core/materializer/opencode.ts","../src/core/materializer/index.ts","../src/commands/dashboard.ts","../src/core/dashboard-server.ts","../src/core/port-utils.ts","../src/commands/doctor.ts","../src/core/doctor.ts","../src/core/package-data.ts","../src/commands/export.ts","../src/commands/health.ts","../src/commands/init.ts","../src/core/materializer/global-sync.ts","../src/schema/init.ts","../src/schema/task.ts","../src/utils/form.ts","../src/commands/init-helpers.ts","../src/commands/migrate.ts","../src/commands/migrate-storage.ts","../src/commands/reset.ts","../src/core/mcp-server.ts","../src/core/permissions-check.ts","../src/commands/serve.ts","../src/commands/status.ts","../src/commands/sync.ts","../src/commands/task/add.ts","../src/commands/task/done.ts","../src/commands/task/edit.ts","../src/commands/task/list.ts","../src/core/local-install-guard.ts","../src/core/update-check.ts"],"sourcesContent":["import { Command } from 'commander'\nimport pc from 'picocolors'\n\nimport { runBuild } from '@/commands/build'\nimport { runDashboard } from '@/commands/dashboard'\nimport { runDoctor } from '@/commands/doctor'\nimport { runExport } from '@/commands/export'\nimport { runHealth } from '@/commands/health'\nimport { runInit } from '@/commands/init'\nimport { runMigrate } from '@/commands/migrate'\nimport { runMigrateStorage } from '@/commands/migrate-storage'\nimport { runReset } from '@/commands/reset'\nimport { runServe } from '@/commands/serve'\nimport { runStatus } from '@/commands/status'\nimport { runSync } from '@/commands/sync'\nimport { runTaskAdd, runTaskDone, runTaskEdit, runTaskList } from '@/commands/task/index'\nimport { isLocalInstallSatisfied, printLocalInstallWarning } from '@/core/local-install-guard'\nimport { pkg } from '@/core/package-data'\nimport { checkForUpdate, printUpdateMessage } from '@/core/update-check'\n\nconst cwd = process.cwd()\n\nconst updateCheck = checkForUpdate(pkg.version)\n\nconst program = new Command()\n\nprogram\n .name('ahk')\n .description('agent-harness-kit — CLI scaffolding for multi-agent harness systems')\n .version(pkg.version, '-v, --version')\n\n// ─── init ─────────────────────────────────────────────────────────────────────\nprogram\n .command('init')\n .description('Scaffold a harness interactively in the current directory')\n .option('--name <name>', 'Project name (skip prompt)')\n .option('--provider <provider>', 'AI provider: claude-code | opencode (skip prompt)')\n .option('--docs <path>', 'Docs folder path (skip prompt)')\n .option('--tasks <adapter>', 'Task adapter: local | jira | linear (skip prompt)')\n .option('--storage-scope <scope>', 'Storage scope: local | global (skip prompt)')\n .action(async (opts) => {\n await runInit(cwd, opts)\n })\n\n// ─── build ────────────────────────────────────────────────────────────────────\nprogram\n .command('build')\n .description('Regenerate AGENTS.md and provider files from agent-harness-kit.config.ts')\n .option('--watch', 'Rebuild on config changes')\n .option('--sync', 'Sync tools: frontmatter in existing .claude/agents/*.md to match current permission constants')\n .action(async (opts) => {\n await runBuild(cwd, opts)\n })\n\n// ─── health ───────────────────────────────────────────────────────────────────\nprogram\n .command('health')\n .description('Run health.sh and report result')\n .action(async () => {\n await runHealth(cwd)\n })\n\n// ─── status ───────────────────────────────────────────────────────────────────\nprogram\n .command('status')\n .description('Show task table and active actions')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n await runStatus(cwd, opts)\n })\n\n// ─── sync ─────────────────────────────────────────────────────────────────────\nprogram\n .command('sync')\n .description('Sync feature_list.json ↔ SQLite')\n .option('--dry-run', 'Show what would change without applying')\n .option('--direction <direction>', 'in | out | both (default: both)')\n .action(async (opts) => {\n await runSync(cwd, { dryRun: opts['dry-run'], direction: opts.direction })\n })\n\n// ─── serve ────────────────────────────────────────────────────────────────────\nprogram\n .command('serve')\n .description('Start the MCP server (stdio)')\n .option('--port <port>', 'Port hint stored in config (default: 3742)', parseInt)\n .action(async (opts) => {\n await runServe(cwd, { port: opts.port })\n })\n\n// ─── task ─────────────────────────────────────────────────────────────────────\nconst task = program.command('task').description('Manage tasks')\n\ntask\n .command('add')\n .description('Add a task interactively')\n .action(async () => {\n await runTaskAdd(cwd)\n })\n\ntask\n .command('list')\n .description('List tasks')\n .option('--status <status>', 'Filter by status: pending | in_progress | done | blocked')\n .option('--archived', 'Show only archived tasks')\n .option('--include-archived', 'Include archived tasks in the list')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n await runTaskList(cwd, opts)\n })\n\ntask\n .command('done <id|slug>')\n .description('Mark a task as done')\n .action(async (idOrSlug: string) => {\n await runTaskDone(cwd, idOrSlug)\n })\n\ntask\n .command('edit')\n .description('Edit a task interactively')\n .action(async () => {\n await runTaskEdit(cwd)\n })\n\n// ─── dashboard ────────────────────────────────────────────────────────────────\nprogram\n .command('dashboard')\n .description('Open web dashboard to visualize harness data')\n .option('-p, --port <port>', 'Port to listen on', '4242')\n .option('--no-open', 'Do not open browser automatically')\n .action(async (opts: { port: string; open: boolean }) => {\n await runDashboard(cwd, { port: parseInt(opts.port), open: opts.open })\n })\n\n// ─── migrate ──────────────────────────────────────────────────────────────────\n// `ahk migrate` is a pure router (no options/action of its own — commander\n// does not reliably support an identical flag declared on both a parent\n// command and its subcommand, see the argv rewrite below) with two\n// subcommands:\n// - `migrate provider --to <x>` — migrate provider-specific scaffold files.\n// - `migrate storage [--force] [--dry-run]` — migrate harness DB storage\n// (local↔global scope, sqlite↔postgres/mysql). See migrate-storage.ts.\n// `ahk migrate --to <x>` (no subcommand) and bare `ahk migrate` are kept as\n// backward-compatible aliases for `migrate provider [--to <x>]` — see the\n// argv rewrite just before `program.parse()` below.\nconst migrate = program\n .command('migrate')\n .description('Migrate provider files to a different provider, or migrate harness storage (see subcommands)')\n\nmigrate\n .command('provider')\n .description('Migrate provider-specific files to a different provider')\n .option('--to <provider>', 'Target provider: claude-code | opencode | codex-cli')\n .action(async (opts) => {\n await runMigrate(cwd, opts)\n })\n\nmigrate\n .command('storage')\n .description(\n 'Migrate harness DB storage between local/global scope or sqlite/postgres/mysql, based on agent-harness-kit.config.ts vs the real current state',\n )\n .option('--force', 'Required to overwrite a non-empty destination (a backup is written first)')\n .option('--dry-run', 'Preview what would migrate without applying any changes')\n .action(async (opts) => {\n try {\n await runMigrateStorage(cwd, { force: opts.force, dryRun: opts['dry-run'] })\n } catch (err) {\n console.error(pc.red(`✗ ${err instanceof Error ? err.message : String(err)}`))\n process.exit(1)\n }\n })\n\n// ─── export ───────────────────────────────────────────────────────────────────\nprogram\n .command('export')\n .description('Export the database')\n .option('--sql', 'SQL dump')\n .option('--json', 'JSON export of tasks and actions')\n .option('--output <path>', 'Output file path (default: stdout)')\n .action(async (opts) => {\n await runExport(cwd, opts)\n })\n\n\n// ─── reset ────────────────────────────────────────────────────────────────────\nprogram\n .command('reset')\n .description('Reset/clear harness data (DB, feature list, agent files)')\n .option('--force', 'Skip confirmation prompts')\n .option('--provider <claude-code|opencode>', 'Reset agent MD files for specified provider')\n .action(async (opts) => {\n await runReset(cwd, opts)\n })\n\n// ─── doctor ───────────────────────────────────────────────────────────────────\nprogram\n .command('doctor')\n .description('Check lib version, agent files, and harness skills sync status')\n .action(async () => {\n await runDoctor(cwd)\n })\n\n// Blocks any command action (but not --version/--help, which commander\n// handles without invoking actions) when the package is only installed\n// globally and not available in the project's local node_modules.\nprogram.hook('preAction', () => {\n if (!isLocalInstallSatisfied(cwd)) {\n printLocalInstallWarning()\n process.exit(1)\n }\n})\n\nprogram.hook('postAction', async () => {\n const update = await updateCheck\n if (update) printUpdateMessage(update)\n})\n\n// ─── backward-compat argv rewrite for `ahk migrate` ────────────────────────\n// Bare `ahk migrate` and `ahk migrate --to <x>` (no subcommand token) must\n// keep working exactly as before subcommands were introduced — rewrite them\n// to `ahk migrate provider [--to <x>]` before commander parses argv.\n// `ahk migrate provider ...` and `ahk migrate storage ...` are untouched.\nfunction rewriteLegacyMigrateArgv(argv: string[]): string[] {\n const migrateIdx = argv.indexOf('migrate')\n if (migrateIdx === -1) return argv\n const next = argv[migrateIdx + 1]\n const isLegacyForm = next === undefined || next === '--to'\n if (!isLegacyForm) return argv\n const rewritten = [...argv]\n rewritten.splice(migrateIdx + 1, 0, 'provider')\n return rewritten\n}\n\nprogram.parse(rewriteLegacyMigrateArgv(process.argv))\n","import { watch } from 'node:fs'\nimport * as p from '@clack/prompts'\nimport pc from 'picocolors'\n\nimport { loadConfig } from '@/core/config'\nimport { getMaterializer } from '@/core/materializer/index'\n\ninterface BuildOptions {\n watch?: boolean\n sync?: boolean\n}\n\nexport async function runBuild(cwd: string, opts: BuildOptions): Promise<void> {\n await buildOnce(cwd)\n\n if (opts.sync) {\n p.log.step('Syncing agent permissions...')\n const config = await loadConfig(cwd)\n const materializer = getMaterializer(config.provider)\n await materializer.syncPermissions(cwd)\n }\n\n if (opts.watch) {\n p.log.info(`Watching agent-harness-kit.config.ts for changes...`)\n watch(cwd, { recursive: false }, async (_, filename) => {\n if (filename?.startsWith('agent-harness-kit.config')) {\n p.log.step('Config changed — rebuilding...')\n await buildOnce(cwd)\n }\n })\n // Keep process alive\n await new Promise(() => { })\n }\n}\n\nasync function buildOnce(cwd: string): Promise<void> {\n const spinner = p.spinner()\n spinner.start('Loading config...')\n\n try {\n const config = await loadConfig(cwd)\n spinner.message('Rebuilding files...')\n const materializer = getMaterializer(config.provider)\n await materializer.build(config, cwd)\n spinner.stop(pc.green('Build complete'))\n p.log.success('AGENTS.md')\n p.log.success(`Agent definitions (${config.provider})`)\n p.log.success('MCP config')\n } catch (err) {\n spinner.stop(pc.red('Build failed'))\n p.log.error(err instanceof Error ? err.message : String(err))\n process.exit(1)\n }\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'\nimport { join, resolve } from 'path'\n\nimport { write } from '@/utils/file'\n\nimport { detectPackageManager } from './detect-package-manager'\nimport {\n mergeClaudeMcpJson,\n mergeClaudeSettingsJson,\n mergeClaudeSettingsLocalJson,\n MCP_CLAUDE_PERMISSIONS_LEAD,\n MCP_CLAUDE_PERMISSIONS_EXPLORER,\n MCP_CLAUDE_PERMISSIONS_CONSULTANT,\n MCP_CLAUDE_PERMISSIONS_BUILDER,\n MCP_CLAUDE_PERMISSIONS_REVIEWER,\n} from './mcp-merge'\nimport { appendGitignore, slugify, writeAgentFile, writeSkills } from './scaffold-utils'\nimport {\n agentBuilder,\n agentConsultant,\n agentExplorer,\n agentLead,\n agentReviewer,\n agentsMd,\n claudeMd,\n featureListJson,\n HEALTH_SH,\n translateFrontmatterForClaudeCode,\n} from './templates'\n\nimport type { Materializer } from './index'\nimport type { HarnessConfig, Provider, ScaffoldOptions } from '@/types'\n\nexport class ClaudeCodeMaterializer implements Materializer {\n async scaffold(config: HarnessConfig, opts: ScaffoldOptions): Promise<void> {\n const { cwd } = opts\n\n // AGENTS.md and CLAUDE.md — always overwrite (generated from config)\n write(cwd, 'AGENTS.md', agentsMd(config))\n write(cwd, 'CLAUDE.md', claudeMd(config))\n\n // health.sh — only create if it doesn't exist\n if (!existsSync(join(cwd, 'health.sh'))) {\n write(cwd, 'health.sh', HEALTH_SH, 0o755)\n }\n\n // .harness/feature_list.json\n const tasks = opts.firstTask ? [{ slug: slugify(opts.firstTask.title), ...opts.firstTask }] : []\n write(cwd, 'feature_list.json', featureListJson(tasks))\n\n // .harness/current.md placeholder\n if (!existsSync(join(cwd, config.storage.markdownFallback.path))) {\n write(\n cwd,\n config.storage.markdownFallback.path,\n `<!-- AUTO-GENERATED by agent-harness-kit — DO NOT EDIT MANUALLY -->\\n<!-- Run ahk status to refresh -->\\n\\n# Current Session\\n\\nNo tasks in progress.\\n`\n )\n }\n\n // .claude/agents/ — skip files the dev may have customized\n const projectName = config.project.name\n const allowedPaths = (config.agents.explorer.allowedPaths ?? []).join(', ')\n const writablePaths = (config.agents.builder.writablePaths ?? []).join(', ')\n const leadModel = config.agents.lead.model\n const explorerModel = config.agents.explorer.model\n const consultantModel = config.agents.consultant?.model\n const builderModel = config.agents.builder.model\n const reviewerModel = config.agents.reviewer.model\n writeAgentFile(cwd, '.claude/agents/lead.md', translateFrontmatterForClaudeCode(agentLead({ projectName }), 'lead', leadModel))\n writeAgentFile(cwd, '.claude/agents/explorer.md', translateFrontmatterForClaudeCode(agentExplorer({ projectName, allowedPaths }), 'explorer', explorerModel))\n writeAgentFile(cwd, '.claude/agents/consultant.md', translateFrontmatterForClaudeCode(agentConsultant({ projectName }), 'consultant', consultantModel))\n writeAgentFile(cwd, '.claude/agents/builder.md', translateFrontmatterForClaudeCode(agentBuilder({ projectName, writablePaths }), 'builder', builderModel))\n writeAgentFile(cwd, '.claude/agents/reviewer.md', translateFrontmatterForClaudeCode(agentReviewer({ projectName }), 'reviewer', reviewerModel))\n\n // .mcp.json — MERGE, never overwrite whole file. Detect the project's\n // package manager fresh from cwd so the spawned command matches npm/pnpm/yarn.\n mergeClaudeMcpJson(join(cwd, '.mcp.json'), config.tools.mcp.port, detectPackageManager(cwd))\n // .claude/settings.json — set `agent: \"lead\"` (the official Claude Code default-agent field)\n mergeClaudeSettingsJson(join(cwd, '.claude/settings.json'))\n // .claude/settings.local.json — merge MCP tool permissions\n mergeClaudeSettingsLocalJson(join(cwd, '.claude/settings.local.json'))\n\n // .gitignore additions\n appendGitignore(cwd)\n writeSkills(cwd, '.claude/skills')\n }\n\n async build(config: HarnessConfig, cwd: string): Promise<void> {\n const write = (relPath: string, content: string) => {\n const abs = join(cwd, relPath)\n mkdirSync(resolve(abs, '..'), { recursive: true })\n writeFileSync(abs, content, 'utf8')\n }\n\n // build always regenerates AGENTS.md and CLAUDE.md (derived from config)\n write('AGENTS.md', agentsMd(config))\n write('CLAUDE.md', claudeMd(config))\n\n // Agent files: always regenerate (build must update existing files)\n const projectName = config.project.name\n const allowedPaths = (config.agents.explorer.allowedPaths ?? []).join(', ')\n const writablePaths = (config.agents.builder.writablePaths ?? []).join(', ')\n const leadModel = config.agents.lead.model\n const explorerModel = config.agents.explorer.model\n const consultantModel = config.agents.consultant?.model\n const builderModel = config.agents.builder.model\n const reviewerModel = config.agents.reviewer.model\n write('.claude/agents/lead.md', translateFrontmatterForClaudeCode(agentLead({ projectName }), 'lead', leadModel))\n write('.claude/agents/explorer.md', translateFrontmatterForClaudeCode(agentExplorer({ projectName, allowedPaths }), 'explorer', explorerModel))\n write('.claude/agents/consultant.md', translateFrontmatterForClaudeCode(agentConsultant({ projectName }), 'consultant', consultantModel))\n write('.claude/agents/builder.md', translateFrontmatterForClaudeCode(agentBuilder({ projectName, writablePaths }), 'builder', builderModel))\n write('.claude/agents/reviewer.md', translateFrontmatterForClaudeCode(agentReviewer({ projectName }), 'reviewer', reviewerModel))\n\n // MCP config: always merge. Re-detecting the package manager on every\n // build means a stale/hardcoded command self-corrects the next time the\n // user runs `ahk build`, even if they switched package managers after\n // the initial `ahk init` — no separate migration flag needed.\n mergeClaudeMcpJson(join(cwd, '.mcp.json'), config.tools.mcp.port, detectPackageManager(cwd))\n mergeClaudeSettingsJson(join(cwd, '.claude/settings.json'))\n mergeClaudeSettingsLocalJson(join(cwd, '.claude/settings.local.json'))\n writeSkills(cwd, '.claude/skills')\n }\n\n async migrate(config: HarnessConfig, _to: Provider, _cwd: string): Promise<void> {\n void config\n // Migration from claude-code is handled by the target materializer\n }\n\n async syncPermissions(cwd: string): Promise<void> {\n const AGENT_TOOLS: Record<string, string[]> = {\n lead: [...MCP_CLAUDE_PERMISSIONS_LEAD],\n explorer: [...MCP_CLAUDE_PERMISSIONS_EXPLORER],\n consultant: [...MCP_CLAUDE_PERMISSIONS_CONSULTANT],\n builder: [...MCP_CLAUDE_PERMISSIONS_BUILDER],\n reviewer: [...MCP_CLAUDE_PERMISSIONS_REVIEWER],\n }\n\n for (const [agent, tools] of Object.entries(AGENT_TOOLS)) {\n const filePath = join(cwd, '.claude', 'agents', `${agent}.md`)\n if (!existsSync(filePath)) {\n console.log(` ${agent}.md not found — skipping`)\n continue\n }\n const content = readFileSync(filePath, 'utf-8')\n // Replace mcp__ lines in the tools: block while preserving native tools (Read/Write/Bash/Task)\n const updated = content.replace(\n /(tools:\\n)((?: - [^\\n]+\\n)*)/m,\n (_match, header, toolsSection) => {\n const nativeLines = toolsSection\n .split('\\n')\n .filter((line: string) => line.trim() && !line.includes('mcp__'))\n const nativeSection = nativeLines.length ? nativeLines.join('\\n') + '\\n' : ''\n const mcpSection = tools.map((t) => ` - ${t}`).join('\\n') + '\\n'\n return header + nativeSection + mcpSection\n }\n )\n if (updated === content) {\n console.log(` ${agent}.md already in sync`)\n } else {\n writeFileSync(filePath, updated, 'utf-8')\n console.log(` ${agent}.md updated`)\n }\n }\n }\n}\n","import { mkdirSync, writeFileSync } from 'fs'\nimport { join, resolve } from 'path'\n\nexport const write = (cwd: string, relPath: string, content: string, mode?: number) => {\n const abs = join(cwd, relPath)\n mkdirSync(resolve(abs, '..'), { recursive: true })\n writeFileSync(abs, content, { encoding: 'utf8', mode })\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nexport type PackageManager = 'npm' | 'pnpm' | 'yarn-classic' | 'yarn-berry' | 'bun'\n\n/**\n * Detects the package manager used by the project at `cwd`.\n *\n * Priority:\n * 1. The `packageManager` field in `package.json` (e.g. `\"yarn@3.6.0\"`,\n * `\"pnpm@8.15.0\"`) — the most reliable signal when present, since it's an\n * explicit declaration (Corepack-compatible) rather than a guess.\n * 2. Lockfile heuristics — `pnpm-lock.yaml` → pnpm, `bun.lockb`/`bun.lock` →\n * bun, `yarn.lock` → yarn (distinguishing classic vs berry via the\n * presence of `.yarnrc.yml`, which only exists in Yarn Berry projects),\n * `package-lock.json` → npm.\n * 3. Fallback: `npm`.\n */\nexport function detectPackageManager(cwd: string): PackageManager {\n const fromField = detectFromPackageManagerField(cwd)\n if (fromField) return fromField\n\n if (existsSync(join(cwd, 'pnpm-lock.yaml'))) return 'pnpm'\n if (existsSync(join(cwd, 'bun.lockb')) || existsSync(join(cwd, 'bun.lock'))) return 'bun'\n if (existsSync(join(cwd, 'yarn.lock'))) {\n return existsSync(join(cwd, '.yarnrc.yml')) ? 'yarn-berry' : 'yarn-classic'\n }\n if (existsSync(join(cwd, 'package-lock.json'))) return 'npm'\n\n return 'npm'\n}\n\nfunction detectFromPackageManagerField(cwd: string): PackageManager | null {\n const pkgPath = join(cwd, 'package.json')\n if (!existsSync(pkgPath)) return null\n\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'))\n const field = pkg?.packageManager\n if (typeof field !== 'string' || !field.trim()) return null\n\n // Format: \"<name>@<version>[+hash]\" (Corepack convention)\n const match = field.match(/^([a-z]+)@(\\d+)/i)\n if (!match) return null\n\n const [, rawName, majorStr] = match\n const name = rawName.toLowerCase()\n const major = Number(majorStr)\n\n switch (name) {\n case 'npm':\n return 'npm'\n case 'pnpm':\n return 'pnpm'\n case 'bun':\n return 'bun'\n case 'yarn':\n return major >= 2 ? 'yarn-berry' : 'yarn-classic'\n default:\n return null\n }\n } catch {\n return null\n }\n}\n\n/**\n * Returns the full command-line tokens for spawning the MCP server via the\n * given package manager, per the corroborated command table:\n *\n * | Manager | Tokens |\n * | ------------ | ---------------------------------------------------- |\n * | npm | `npx --no ahk serve --port <port>` |\n * | pnpm | `pnpm exec ahk serve --port <port>` |\n * | yarn classic | `yarn run ahk serve --port <port>` |\n * | yarn berry | `yarn run ahk serve --port <port>` |\n * | bun | `bunx --no-install ahk serve --port <port>` |\n *\n * Callers split this into `command`/`args` (Claude Code, Codex CLI) or use\n * the array as-is (OpenCode, whose `mcp.<name>.command` field is a single\n * array rather than a separate command/args pair).\n */\nexport function getMcpCommandParts(pm: PackageManager, port: number): string[] {\n const portStr = String(port)\n switch (pm) {\n case 'pnpm':\n return ['pnpm', 'exec', 'ahk', 'serve', '--port', portStr]\n case 'yarn-classic':\n case 'yarn-berry':\n return ['yarn', 'run', 'ahk', 'serve', '--port', portStr]\n case 'bun':\n return ['bunx', '--no-install', 'ahk', 'serve', '--port', portStr]\n case 'npm':\n default:\n return ['npx', '--no', 'ahk', 'serve', '--port', portStr]\n }\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { dirname } from 'node:path'\n\nimport { getMcpCommandParts } from './detect-package-manager'\n\nimport type { PackageManager } from './detect-package-manager'\n\n// ─── Claude Code ──────────────────────────────────────────────────────────────\n\nexport function mergeClaudeMcpJson(filePath: string, port: number, pm: PackageManager = 'npm'): void {\n const folderPath = dirname(filePath)\n if (!existsSync(folderPath)) {\n mkdirSync(folderPath, { recursive: true })\n }\n\n let existing: Record<string, unknown> = {}\n if (existsSync(filePath)) {\n try {\n existing = JSON.parse(readFileSync(filePath, 'utf8')) as Record<string, unknown>\n } catch {\n // Unreadable JSON — start fresh to avoid corrupt state\n }\n }\n\n const [command, ...args] = getMcpCommandParts(pm, port)\n\n const merged = {\n ...existing,\n mcpServers: {\n ...((existing.mcpServers as Record<string, unknown>) ?? {}),\n 'agent-harness-kit': {\n type: 'stdio',\n command,\n args,\n },\n },\n }\n\n mkdirSync(dirname(filePath), { recursive: true })\n writeFileSync(filePath, JSON.stringify(merged, null, 2) + '\\n', 'utf8')\n}\n\n// Write `agent: \"lead\"` to .claude/settings.json — the correct Claude Code field\n// for setting which subagent runs as the main session thread.\nexport function mergeClaudeSettingsJson(filePath: string): void {\n mkdirSync(dirname(filePath), { recursive: true })\n\n let existing: Record<string, unknown> = {}\n if (existsSync(filePath)) {\n try {\n existing = JSON.parse(readFileSync(filePath, 'utf8')) as Record<string, unknown>\n } catch {\n // start fresh\n }\n }\n\n const merged = {\n ...existing,\n agent: 'lead',\n }\n\n writeFileSync(filePath, JSON.stringify(merged, null, 2) + '\\n', 'utf8')\n}\n\n// Merge MCP tool permissions into .claude/settings.local.json\nexport const MCP_CLAUDE_PERMISSIONS_LEAD = [\n 'mcp__agent-harness-kit__actions_start',\n 'mcp__agent-harness-kit__actions_write',\n 'mcp__agent-harness-kit__actions_complete',\n 'mcp__agent-harness-kit__actions_get',\n 'mcp__agent-harness-kit__actions_record_file',\n 'mcp__agent-harness-kit__actions_record_tool',\n 'mcp__agent-harness-kit__tasks_get',\n 'mcp__agent-harness-kit__tasks_claim',\n 'mcp__agent-harness-kit__tasks_add',\n 'mcp__agent-harness-kit__tasks_update',\n 'mcp__agent-harness-kit__tasks_edit',\n 'mcp__agent-harness-kit__tasks_archive',\n 'mcp__agent-harness-kit__tasks_unarchive',\n 'mcp__agent-harness-kit__tasks_acceptance_get',\n 'mcp__agent-harness-kit__docs_search',\n 'mcp__agent-harness-kit__ahk_doctor',\n]\n\nexport const MCP_CLAUDE_PERMISSIONS_EXPLORER = [\n 'mcp__agent-harness-kit__actions_start',\n 'mcp__agent-harness-kit__actions_write',\n 'mcp__agent-harness-kit__actions_complete',\n 'mcp__agent-harness-kit__actions_get',\n 'mcp__agent-harness-kit__actions_record_file',\n 'mcp__agent-harness-kit__actions_record_tool',\n 'mcp__agent-harness-kit__tasks_get',\n 'mcp__agent-harness-kit__tasks_claim',\n 'mcp__agent-harness-kit__tasks_acceptance_get',\n 'mcp__agent-harness-kit__docs_search',\n 'mcp__agent-harness-kit__ahk_doctor',\n]\n\nexport const MCP_CLAUDE_PERMISSIONS_BUILDER = [\n 'mcp__agent-harness-kit__actions_start',\n 'mcp__agent-harness-kit__actions_write',\n 'mcp__agent-harness-kit__actions_complete',\n 'mcp__agent-harness-kit__actions_get',\n 'mcp__agent-harness-kit__actions_record_file',\n 'mcp__agent-harness-kit__actions_record_tool',\n 'mcp__agent-harness-kit__tasks_get',\n 'mcp__agent-harness-kit__tasks_claim',\n 'mcp__agent-harness-kit__tasks_add',\n 'mcp__agent-harness-kit__tasks_update',\n 'mcp__agent-harness-kit__tasks_edit',\n 'mcp__agent-harness-kit__tasks_archive',\n 'mcp__agent-harness-kit__tasks_unarchive',\n 'mcp__agent-harness-kit__tasks_acceptance_get',\n 'mcp__agent-harness-kit__docs_search',\n 'mcp__agent-harness-kit__ahk_doctor',\n]\n\nexport const MCP_CLAUDE_PERMISSIONS_REVIEWER = [\n 'mcp__agent-harness-kit__actions_start',\n 'mcp__agent-harness-kit__actions_write',\n 'mcp__agent-harness-kit__actions_complete',\n 'mcp__agent-harness-kit__actions_get',\n 'mcp__agent-harness-kit__actions_record_file',\n 'mcp__agent-harness-kit__actions_record_tool',\n 'mcp__agent-harness-kit__tasks_get',\n 'mcp__agent-harness-kit__tasks_claim',\n 'mcp__agent-harness-kit__tasks_add',\n 'mcp__agent-harness-kit__tasks_update',\n 'mcp__agent-harness-kit__tasks_edit',\n 'mcp__agent-harness-kit__tasks_archive',\n 'mcp__agent-harness-kit__tasks_unarchive',\n 'mcp__agent-harness-kit__tasks_acceptance_update',\n 'mcp__agent-harness-kit__tasks_acceptance_get',\n 'mcp__agent-harness-kit__docs_search',\n 'mcp__agent-harness-kit__ahk_doctor',\n]\n\nexport const MCP_CLAUDE_PERMISSIONS_CONSULTANT = [\n 'mcp__agent-harness-kit__actions_start',\n 'mcp__agent-harness-kit__actions_write',\n 'mcp__agent-harness-kit__actions_complete',\n 'mcp__agent-harness-kit__actions_get',\n 'mcp__agent-harness-kit__actions_record_file',\n 'mcp__agent-harness-kit__actions_record_tool',\n 'mcp__agent-harness-kit__tasks_get',\n 'mcp__agent-harness-kit__tasks_claim',\n 'mcp__agent-harness-kit__tasks_acceptance_get',\n 'mcp__agent-harness-kit__deps_snapshot',\n 'mcp__agent-harness-kit__deps_check',\n 'mcp__agent-harness-kit__docs_search',\n 'mcp__agent-harness-kit__ahk_doctor',\n] as const\n\n// Full union — used by mergeClaudeSettingsLocalJson for project-wide settings\nexport const MCP_CLAUDE_PERMISSIONS = [\n ...new Set([\n ...MCP_CLAUDE_PERMISSIONS_LEAD,\n ...MCP_CLAUDE_PERMISSIONS_EXPLORER,\n ...MCP_CLAUDE_PERMISSIONS_BUILDER,\n ...MCP_CLAUDE_PERMISSIONS_REVIEWER,\n ...MCP_CLAUDE_PERMISSIONS_CONSULTANT,\n ]),\n]\n\nexport function mergeClaudeSettingsLocalJson(filePath: string): void {\n mkdirSync(dirname(filePath), { recursive: true })\n\n let existing: Record<string, unknown> = {}\n if (existsSync(filePath)) {\n try {\n existing = JSON.parse(readFileSync(filePath, 'utf8')) as Record<string, unknown>\n } catch {\n // start fresh\n }\n }\n\n const existingPermissions = (existing.permissions as Record<string, unknown>) ?? {}\n const existingAllow = (existingPermissions.allow as string[]) ?? []\n const existingServers = (existing.enabledMcpjsonServers as string[]) ?? []\n\n const mergedAllow = Array.from(new Set([...existingAllow, ...MCP_CLAUDE_PERMISSIONS]))\n const mergedServers = Array.from(new Set([...existingServers, 'agent-harness-kit']))\n\n const merged = {\n ...existing,\n permissions: {\n ...existingPermissions,\n allow: mergedAllow,\n },\n enabledMcpjsonServers: mergedServers,\n }\n\n writeFileSync(filePath, JSON.stringify(merged, null, 2) + '\\n', 'utf8')\n}\n\n// ─── OpenCode ─────────────────────────────────────────────────────────────────\n\nexport function mergeOpencodeJson(filePath: string, port: number, pm: PackageManager = 'npm'): void {\n const folderPath = dirname(filePath)\n if (!existsSync(folderPath)) {\n mkdirSync(folderPath, { recursive: true })\n }\n\n let existing: Record<string, unknown> = {}\n if (existsSync(filePath)) {\n try {\n existing = JSON.parse(readFileSync(filePath, 'utf8')) as Record<string, unknown>\n } catch {\n // start fresh\n }\n }\n\n const existingMcp = (existing.mcp as Record<string, unknown>) ?? {}\n\n const merged = {\n ...existing,\n default_agent: 'lead',\n compaction: existing.compaction ?? { auto: true, prune: true, reserved: 10000 },\n permission: existing.permission ?? { write: 'ask' },\n mcp: {\n ...existingMcp,\n 'agent-harness-kit': {\n enabled: true,\n type: 'local',\n // OpenCode's mcp.<name>.command field is a single array (unlike\n // Claude/Codex, which split command/args) — pass the full token list.\n command: getMcpCommandParts(pm, port),\n },\n },\n }\n\n writeFileSync(filePath, JSON.stringify(merged, null, 2) + '\\n', 'utf8')\n}\n\n// ─── Codex CLI ────────────────────────────────────────────────────────────────\n\nfunction mergeTomlSection(content: string, sectionName: string, sectionBody: string): string {\n const lines = content.split('\\n')\n const header = `[${sectionName}]`\n\n const startIdx = lines.findIndex((l) => l.trim() === header)\n\n if (startIdx === -1) {\n const trimmed = content.trimEnd()\n return trimmed + (trimmed ? '\\n\\n' : '') + header + '\\n' + sectionBody.trimEnd() + '\\n'\n }\n\n // Find where the section ends: next line starting with `[` or EOF\n let endIdx = lines.length\n for (let i = startIdx + 1; i < lines.length; i++) {\n if (/^\\[/.test(lines[i])) {\n endIdx = i\n break\n }\n }\n\n const newLines = [\n ...lines.slice(0, startIdx),\n header,\n ...sectionBody.trimEnd().split('\\n'),\n '',\n ...lines.slice(endIdx),\n ]\n\n return newLines.join('\\n')\n}\n\nexport function mergeCodexConfigToml(filePath: string, port: number, pm: PackageManager = 'npm'): void {\n mkdirSync(dirname(filePath), { recursive: true })\n\n let content = ''\n if (existsSync(filePath)) {\n content = readFileSync(filePath, 'utf8')\n }\n\n const [command, ...args] = getMcpCommandParts(pm, port)\n\n const sectionBody = [\n `command = ${JSON.stringify(command)}`,\n `args = ${JSON.stringify(args)}`,\n 'default_tools_approval_mode = \"auto\"',\n ].join('\\n')\n\n content = mergeTomlSection(content, 'mcp_servers.agent-harness-kit', sectionBody)\n\n writeFileSync(filePath, content, 'utf8')\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { dirname, join, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport { GITIGNORE_ENTRIES } from './templates'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\n\nexport function writeAgentFile(cwd: string, relPath: string, content: string): void {\n const abs = join(cwd, relPath)\n if (existsSync(abs)) return // preserve dev customizations\n mkdirSync(resolve(abs, '..'), { recursive: true })\n writeFileSync(abs, content, 'utf8')\n}\n\nexport function appendGitignore(cwd: string): void {\n const giPath = join(cwd, '.gitignore')\n const existing = existsSync(giPath) ? readFileSync(giPath, 'utf8') : ''\n\n const toAdd = GITIGNORE_ENTRIES.split('\\n')\n .filter((line) => line && !existing.includes(line))\n .join('\\n')\n\n if (toAdd.trim()) {\n writeFileSync(giPath, existing + (existing.endsWith('\\n') ? '' : '\\n') + toAdd + '\\n', 'utf8')\n }\n}\n\nexport function slugify(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 64)\n}\n\nexport function writeSkills(cwd: string, skillsDir: string): void {\n const skillNames = ['ahk-ask', 'ahk-consultant', 'ahk-triage', 'ahk-review']\n for (const skillName of skillNames) {\n const src = join(__dirname, 'skills', skillName, 'SKILL.md')\n const destDir = join(cwd, skillsDir, skillName)\n const dest = join(destDir, 'SKILL.md')\n mkdirSync(destDir, { recursive: true })\n writeFileSync(dest, readFileSync(src, 'utf8'), 'utf8')\n }\n}\n\n/**\n * Writes a single skill under an already-resolved absolute `skillsRoot`,\n * preserving the file if it already exists (same \"preserve dev\n * customizations\" idempotency criterion as writeAgentFile). Used by the\n * global sync flow, which needs to add only the skills that are missing\n * rather than unconditionally overwriting every skill like writeSkills()\n * does for project-local scaffold/build.\n */\nexport function writeSkill(skillsRoot: string, skillName: string): void {\n const src = join(__dirname, 'skills', skillName, 'SKILL.md')\n const destDir = join(skillsRoot, skillName)\n const dest = join(destDir, 'SKILL.md')\n if (existsSync(dest)) return // preserve — already present\n mkdirSync(destDir, { recursive: true })\n writeFileSync(dest, readFileSync(src, 'utf8'), 'utf8')\n}\n\n","import { readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport {\n MCP_CLAUDE_PERMISSIONS,\n MCP_CLAUDE_PERMISSIONS_BUILDER,\n MCP_CLAUDE_PERMISSIONS_CONSULTANT,\n MCP_CLAUDE_PERMISSIONS_EXPLORER,\n MCP_CLAUDE_PERMISSIONS_LEAD,\n MCP_CLAUDE_PERMISSIONS_REVIEWER,\n} from './mcp-merge'\n\nimport type { HarnessConfig } from '@/types'\n\n// ─── Agent template loader ────────────────────────────────────────────────────\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\nconst TEMPLATES_DIR = join(__dirname, 'agent-templates')\n\n/**\n * Load an agent template file and interpolate {{variables}}.\n * Variables are replaced using a simple {{key}} pattern.\n */\nfunction loadAgentTemplate(\n name: 'lead' | 'explorer' | 'consultant' | 'builder' | 'reviewer',\n vars: Record<string, string> = {}\n): string {\n const raw = readFileSync(join(TEMPLATES_DIR, `${name}.md`), 'utf8')\n return raw.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key: string) => vars[key] ?? `{{${key}}}`)\n}\n\n// ─── health.sh — exits 1 until the dev implements it ─────────────────────────\n\nexport const HEALTH_SH = `#!/usr/bin/env bash\n# health.sh — project health check for agent-harness-kit\n#\n# This script must exit 0 when the project is healthy.\n# Agents will run this before making codebase changes.\n#\n# TODO: implement your project's health checks below.\n# Examples:\n# npm test\n# docker compose ps | grep -q \"running\"\n# psql -c \"SELECT 1\" > /dev/null 2>&1\n#\n# Until you implement it, this script intentionally exits 1\n# so agents know the environment is not verified.\n\necho \"health.sh not implemented yet.\"\necho \"Edit this file with your project's health checks.\"\necho \"It must exit 0 for agents to start working.\"\nexit 1\n`\n\n// ─── AGENTS.md template ───────────────────────────────────────────────────────\n\nexport function agentsMd(config: HarnessConfig): string {\n const { name, description, docsPath } = config.project\n const port = config.tools.mcp.port\n\n return `# AGENTS.md — ${name}\n\n> **Read this file first.** It is the navigation map for every AI agent working in this repository.\n\n## Project\n\n**${name}** — ${description}\n\n## Health check (run before making codebase changes)\n\n\\`\\`\\`bash\nbash health.sh\n\\`\\`\\`\n\nIf it exits non-zero, stop and report the issue. Do not proceed with codebase changes until health is green.\n\n## Harness data (source of truth)\n\n| File | Purpose |\n|------|---------|\n| \\`.harness/harness.db\\` | SQLite: all tasks, actions, file changes, tool calls |\n| \\`.harness/current.md\\` | Markdown fallback — read this if MCP server is unavailable |\n| \\`.harness/feature_list.json\\` | Human-editable task seed list |\n\n## MCP tools (preferred)\n\nThe harness exposes tools via MCP server on port ${port}. Use these instead of reading files directly.\n\n\\`\\`\\`\nactions.start taskId agent → start an action, returns actionId\nactions.write actionId section text → record a section (result, blockers, ...)\nactions.record_tool actionId toolName [argsJson] [summary] → log a tool call to the Tools dashboard\nactions.record_file actionId filePath operation [notes] → log a file touch to the Files dashboard\nactions.complete actionId summary → close the action\nactions.get taskId → full action history for a task\ntasks.add title [slug] [description] [acceptance] → create a new task from natural language\ntasks.get [status] → list tasks (pending | in_progress | done | blocked)\ntasks.claim id → atomically claim a pending task\ntasks.update id status → change task status\ntasks.acceptance.update criterionId → mark an acceptance criterion as met\ndocs.search query → search ${docsPath} for relevant content\n\\`\\`\\`\n\n## Workflow\n\n\\`\\`\\`\n1. INIT\n - Assess user intent: only run health.sh if changes are needed\n - tasks.get('in_progress') → resume if something is in progress\n - tasks.get('pending') → pick lowest id\n\n2. WORK (lead → explorer → consultant → builder → reviewer)\n - Each agent calls actions.start(taskId, agentName) → actionId\n - After EVERY tool call: actions.record_tool(actionId, toolName, args, summary)\n - After EVERY file change: actions.record_file(actionId, filePath, operation, notes)\n - Closes with actions.complete(actionId, summary)\n\n3. CLOSE\n - tasks.update(taskId, 'done')\n - Run health.sh (if changes were made) → must be green before closing\n\\`\\`\\`\n\n## Agent roles\n\n| Agent | Responsibility |\n|-------|---------------|\n| lead | Decomposes the task into a plan, assigns sub-agents |\n| explorer | Reads and maps relevant code, never writes |\n| consultant | Technical advisor, runs after explorer, before builder. Never writes code. |\n| builder | Implements the plan, writes files |\n| reviewer | Verifies acceptance criteria, approves or blocks |\n\n## What to read\n\n\\`\\`\\`\nAlways: .harness/current.md (or MCP tasks.get)\nIf implementing: ${docsPath}/\nIf orchestrating: Agent definition files in your provider's agents directory\n\\`\\`\\`\n`\n}\n\n// ─── CLAUDE.md template (Claude Code provider) ───────────────────────────────\n\nexport function claudeMd(config: HarnessConfig): string {\n const { name, description, docsPath } = config.project\n const port = config.tools.mcp.port\n\n return `# CLAUDE.md — ${name}\n\n> **Read this file first.** It is the navigation map for every AI agent working in this repository.\n\n## Project\n\n**${name}** — ${description}\n\n## Health check (run before making codebase changes)\n\n\\`\\`\\`bash\nbash health.sh\n\\`\\`\\`\n\nIf it exits non-zero, stop and report the issue. Do not proceed with codebase changes until health is green.\n\n## Harness data (source of truth)\n\n| File | Purpose |\n|------|---------|\n| \\`.harness/harness.db\\` | SQLite: all tasks, actions, file changes, tool calls |\n| \\`.harness/current.md\\` | Markdown fallback — read this if MCP server is unavailable |\n| \\`.harness/feature_list.json\\` | Human-editable task seed list |\n\n## MCP tools (preferred)\n\nThe harness exposes tools via MCP server on port ${port}. Use these instead of reading files directly.\n\n\\`\\`\\`\nactions.start taskId agent → start an action, returns actionId\nactions.write actionId section text → record a section (result, blockers, ...)\nactions.record_tool actionId toolName [argsJson] [summary] → log a tool call to the Tools dashboard\nactions.record_file actionId filePath operation [notes] → log a file touch to the Files dashboard\nactions.complete actionId summary → close the action\nactions.get taskId → full action history for a task\ntasks.add title [slug] [description] [acceptance] → create a new task from natural language\ntasks.get [status] → list tasks (pending | in_progress | done | blocked)\ntasks.claim id → atomically claim a pending task\ntasks.update id status → change task status\ntasks.acceptance.update criterionId → mark an acceptance criterion as met\ndocs.search query → search ${docsPath} for relevant content\n\\`\\`\\`\n\n## Workflow\n\n\\`\\`\\`\n1. INIT\n - Assess user intent: only run health.sh if changes are needed\n - tasks.get('in_progress') → resume if something is in progress\n - tasks.get('pending') → pick lowest id\n - No pending tasks? → ask user, infer fields, call tasks.add, then tasks.claim\n\n2. WORK (lead → explorer → consultant → builder → reviewer)\n - Each agent calls actions.start(taskId, agentName) → actionId\n - After EVERY tool call: actions.record_tool(actionId, toolName, args, summary)\n - After EVERY file change: actions.record_file(actionId, filePath, operation, notes)\n - Closes with actions.complete(actionId, summary)\n\n3. CLOSE\n - tasks.update(taskId, 'done')\n - Run health.sh (if changes were made) → must be green before closing\n\\`\\`\\`\n\n## Agent roles\n\n| Agent | Responsibility |\n|-------|---------------|\n| lead | Decomposes the task into a plan, assigns sub-agents |\n| explorer | Reads and maps relevant code, never writes |\n| consultant | Technical advisor, runs after explorer, before builder. Never writes code. |\n| builder | Implements the plan, writes files |\n| reviewer | Verifies acceptance criteria, approves or blocks |\n\n## What to read\n\n\\`\\`\\`\nAlways: .harness/current.md (or MCP tasks.get)\nIf implementing: ${docsPath}/\nIf orchestrating: Agent definition files in .claude/agents/\n\\`\\`\\`\n`\n}\n\n// ─── agent-harness-kit.config.ts template ───────────────────────────────────────────\n\nexport interface AgentModelOverrides {\n lead?: string\n explorer?: string\n consultant?: string\n builder?: string\n reviewer?: string\n}\n\nfunction modelField(model: string | undefined): string {\n return model ? `, model: ${JSON.stringify(model)}` : ''\n}\n\nexport function configTs(params: {\n name: string\n description: string\n provider: string\n docsPath: string\n tasksAdapter: string\n port: number\n models?: AgentModelOverrides\n scope: 'local' | 'global'\n projectId: string\n}): string {\n const models = params.models ?? {}\n return `import { defineHarness } from '@cardor/agent-harness-kit'\n\nexport default defineHarness({\n project: {\n name: ${JSON.stringify(params.name)},\n description: ${JSON.stringify(params.description)},\n docsPath: '${params.docsPath}',\n },\n\n provider: '${params.provider}',\n\n agents: {\n lead: { instructionsPath: null${modelField(models.lead)} },\n explorer: { instructionsPath: null, allowedPaths: ['${params.docsPath}', './src']${modelField(models.explorer)} },\n builder: { instructionsPath: null, writablePaths: ['./src', './tests']${modelField(models.builder)} },\n reviewer: { instructionsPath: null${modelField(models.reviewer)} },\n ${models.consultant ? `consultant: { instructionsPath: null${modelField(models.consultant)} },\\n ` : ''}custom: [],\n },\n\n // SQLite (default). Switch to postgres/mysql by changing database.type.\n // database: { type: 'postgres', connectionString: process.env.DATABASE_URL },\n // database: { type: 'mysql', connectionString: process.env.DATABASE_URL },\n database: { type: 'sqlite', path: '.harness/harness.db' },\n\n storage: {\n dir: '.harness',\n tasks: { adapter: '${params.tasksAdapter}' },\n sections: {\n toolsUsed: true,\n filesModified: true,\n result: true,\n blockers: true,\n nextSteps: false,\n },\n markdownFallback: { enabled: true, path: '.harness/current.md' },\n // 'local' — DB lives in .harness/ (project-relative). 'global' — DB lives\n // under ~/.harness/dbs/<projectId>/, outside the project tree.\n scope: '${params.scope}',\n projectId: '${params.projectId}',\n },\n\n health: {\n scriptPath: './health.sh',\n required: true,\n },\n\n tools: {\n mcp: { enabled: true, port: ${params.port} },\n scripts: { enabled: true, outputDir: './.harness/scripts' },\n },\n})\n`\n}\n\nexport const configMjs = configTs\n\nexport function configCjs(params: {\n name: string\n description: string\n provider: string\n docsPath: string\n tasksAdapter: string\n port: number\n models?: AgentModelOverrides\n scope: 'local' | 'global'\n projectId: string\n}): string {\n const models = params.models ?? {}\n return `const { defineHarness } = require('@cardor/agent-harness-kit')\n\nmodule.exports = defineHarness({\n project: {\n name: ${JSON.stringify(params.name)},\n description: ${JSON.stringify(params.description)},\n docsPath: '${params.docsPath}',\n },\n\n provider: '${params.provider}',\n\n agents: {\n lead: { instructionsPath: null${modelField(models.lead)} },\n explorer: { instructionsPath: null, allowedPaths: ['${params.docsPath}', './src']${modelField(models.explorer)} },\n builder: { instructionsPath: null, writablePaths: ['./src', './tests']${modelField(models.builder)} },\n reviewer: { instructionsPath: null${modelField(models.reviewer)} },\n ${models.consultant ? `consultant: { instructionsPath: null${modelField(models.consultant)} },\\n ` : ''}custom: [],\n },\n\n // SQLite (default). Switch to postgres/mysql by changing database.type.\n // database: { type: 'postgres', connectionString: process.env.DATABASE_URL },\n // database: { type: 'mysql', connectionString: process.env.DATABASE_URL },\n database: { type: 'sqlite', path: '.harness/harness.db' },\n\n storage: {\n dir: '.harness',\n tasks: { adapter: '${params.tasksAdapter}' },\n sections: {\n toolsUsed: true,\n filesModified: true,\n result: true,\n blockers: true,\n nextSteps: false,\n },\n markdownFallback: { enabled: true, path: '.harness/current.md' },\n // 'local' — DB lives in .harness/ (project-relative). 'global' — DB lives\n // under ~/.harness/dbs/<projectId>/, outside the project tree.\n scope: '${params.scope}',\n projectId: '${params.projectId}',\n },\n\n health: {\n scriptPath: './health.sh',\n required: true,\n },\n\n tools: {\n mcp: { enabled: true, port: ${params.port} },\n scripts: { enabled: true, outputDir: './.harness/scripts' },\n },\n})\n`\n}\n\n// ─── Agent definition templates (loaded from agent-templates/*.md) ─────────────\n\nexport function agentLead(vars: { projectName: string }): string {\n return loadAgentTemplate('lead', vars)\n}\n\nexport function agentExplorer(vars: { projectName: string; allowedPaths: string }): string {\n return loadAgentTemplate('explorer', vars)\n}\n\nexport function agentBuilder(vars: { projectName: string; writablePaths: string }): string {\n return loadAgentTemplate('builder', vars)\n}\n\nexport function agentConsultant(vars: { projectName: string }): string {\n return loadAgentTemplate('consultant', vars)\n}\n\nexport function agentReviewer(vars: { projectName: string }): string {\n return loadAgentTemplate('reviewer', vars)\n}\n\n// Note: agentLead/agentExplorer/agentConsultant/agentBuilder/agentReviewer above produce the\n// raw markdown template (frontmatter without `model:`). The `model:` line is injected downstream\n// by translateFrontmatterForClaudeCode() (Claude Code) — never injected for OpenCode.\n\n// ─── feature_list.json initial seed ──────────────────────────────────────────\n\nexport function featureListJson(\n tasks: { slug: string; title: string; description?: string; acceptance?: string[] }[]\n): string {\n return JSON.stringify(tasks, null, 2) + '\\n'\n}\n\n// ─── Codex CLI agent TOML helpers ────────────────────────────────────────────\n\nfunction stripFrontmatter(md: string): { description: string; body: string } {\n const parts = md.split(/^---\\s*$/m)\n if (parts.length < 3) return { description: '', body: md }\n\n const frontmatter = parts[1]\n const body = parts.slice(2).join('---').replace(/^\\n/, '')\n\n let description = ''\n // YAML folded scalar: `description: >\\n line1\\n line2`\n const foldedMatch = frontmatter.match(/^description:\\s*[>|]\\s*\\n((?:[ \\t]+[^\\n]*\\n?)*)/m)\n if (foldedMatch) {\n description = foldedMatch[1]\n .split('\\n')\n .map((l) => l.trim())\n .filter(Boolean)\n .join(' ')\n } else {\n const inlineMatch = frontmatter.match(/^description:\\s*(.+)$/m)\n if (inlineMatch) description = inlineMatch[1].trim()\n }\n\n return { description, body }\n}\n\n/**\n * Codex CLI does not validate the `model` value client-side (free text, resolved\n * at invocation time). Per explicit product rule: if the value is null/undefined/\n * empty, or its trimmed length is < 3 chars, omit the `model` line entirely —\n * never emit a placeholder or an 'inherit'-like value.\n */\nfunction toCodexToml(\n name: string,\n description: string,\n body: string,\n sandboxMode: 'workspace-write' | 'read-only',\n model?: string\n): string {\n // TOML multiline basic strings end at `\"\"\"` — escape any that appear in content\n const safe = (s: string) => s.replace(/\"\"\"/g, '\"\"\\\\u0022')\n const trimmedModel = model?.trim() ?? ''\n const modelLine = trimmedModel.length >= 3 ? `model = \"${trimmedModel}\"\\n` : ''\n return `name = \"${name}\"\nsandbox_mode = \"${sandboxMode}\"\n${modelLine}\ndescription = \"\"\"\n${safe(description)}\n\"\"\"\n\ndeveloper_instructions = \"\"\"\n${safe(body.trimEnd())}\n\"\"\"\n`\n}\n\nexport function agentLeadToml(vars: { projectName: string; model?: string }): string {\n const { description, body } = stripFrontmatter(loadAgentTemplate('lead', vars))\n return toCodexToml('lead', description, body, 'read-only', vars.model)\n}\n\nexport function agentLeadAsDefaultToml(vars: { projectName: string; model?: string }): string {\n const { description, body } = stripFrontmatter(loadAgentTemplate('lead', vars))\n return toCodexToml('default', description, body, 'read-only', vars.model)\n}\n\nexport function agentExplorerToml(vars: { projectName: string; allowedPaths: string; model?: string }): string {\n const { description, body } = stripFrontmatter(loadAgentTemplate('explorer', vars))\n return toCodexToml('explorer', description, body, 'read-only', vars.model)\n}\n\nexport function agentBuilderToml(vars: { projectName: string; writablePaths: string; model?: string }): string {\n const { description, body } = stripFrontmatter(loadAgentTemplate('builder', vars))\n return toCodexToml('builder', description, body, 'workspace-write', vars.model)\n}\n\nexport function agentReviewerToml(vars: { projectName: string; model?: string }): string {\n const { description, body } = stripFrontmatter(loadAgentTemplate('reviewer', vars))\n return toCodexToml('reviewer', description, body, 'read-only', vars.model)\n}\n\nexport function agentConsultantToml(vars: { projectName: string; model?: string }): string {\n const { description, body } = stripFrontmatter(loadAgentTemplate('consultant', vars))\n return toCodexToml('consultant', description, body, 'read-only', vars.model)\n}\n\n// ─── Claude Code frontmatter translation ─────────────────────────────────────\n\n/**\n * Takes a template markdown string (with simple tools list) and injects\n * `Task` + the agent-specific `mcp__agent-harness-kit__*` tools into the\n * frontmatter `tools:` section for Claude Code.\n *\n * Inserts `Task` after the last non-mcp tool entry, then appends mcp tools.\n */\nexport function translateFrontmatterForClaudeCode(\n md: string,\n agentName: 'lead' | 'explorer' | 'consultant' | 'builder' | 'reviewer',\n model?: string\n): string {\n const permissionsMap: Record<string, string[]> = {\n lead: [...MCP_CLAUDE_PERMISSIONS_LEAD],\n explorer: [...MCP_CLAUDE_PERMISSIONS_EXPLORER],\n consultant: [...MCP_CLAUDE_PERMISSIONS_CONSULTANT],\n builder: [...MCP_CLAUDE_PERMISSIONS_BUILDER],\n reviewer: [...MCP_CLAUDE_PERMISSIONS_REVIEWER],\n }\n const permissions = permissionsMap[agentName] ?? MCP_CLAUDE_PERMISSIONS\n const mcpLines = permissions.map((t) => ` - ${t}`).join('\\n')\n\n // Find the tools: block in frontmatter and append Task + mcp tools after last tool entry\n // We look for the pattern: a line with ` - SomeTool` followed by either `---` or a non-tool line\n let result = md.replace(/(tools:\\n(?: - (?!mcp__)[^\\n]+\\n)+)/, (match) => {\n const trimmed = match.trimEnd()\n return `${trimmed}\\n - Task\\n${mcpLines}\\n`\n })\n\n // Inject a `model:` frontmatter line, independent of the tools: regex above.\n // Placed right after `name: <agentName>` — matches the shape used when a model\n // is manually configured today. No model configured → leave frontmatter untouched.\n if (model) {\n result = injectModelFrontmatterLine(result, model)\n }\n\n return result\n}\n\n/**\n * Inserts (or replaces) a `model: <value>` line right after the `name:` line\n * in a template's YAML frontmatter. Never touches the `tools:` block.\n */\nfunction injectModelFrontmatterLine(md: string, model: string): string {\n // Replace an existing `model:` line if present (idempotent re-generation)...\n if (/^model:\\s*.*$/m.test(md)) {\n return md.replace(/^model:\\s*.*$/m, `model: ${model}`)\n }\n // ...otherwise insert a new `model:` line right after `name:`.\n return md.replace(/^(name:.*)$/m, `$1\\nmodel: ${model}`)\n}\n\n// ─── OpenCode frontmatter translation ────────────────────────────────────────\n\n/**\n * Converts the `tools:` YAML list in a template's frontmatter to the\n * dictionary format expected by OpenCode (e.g. `read: true`, `bash: true`).\n *\n * Only transforms the tools: block — all other frontmatter fields and\n * body content are left exactly as-is.\n */\nexport function translateFrontmatterForOpenCode(md: string): string {\n return md.replace(/(tools:\\n(?: - [^\\n]+\\n)+)/, (match) => {\n const tools = [...match.matchAll(/ - ([^\\n]+)/g)].map((m) => m[1].trim())\n return 'tools:\\n' + tools.map((t) => ` ${t.toLocaleLowerCase()}: true`).join('\\n') + '\\n'\n })\n}\n\n// ─── .gitignore additions ─────────────────────────────────────────────────────\n\nexport const GITIGNORE_ENTRIES = `\n# agent-harness-kit\n.harness/harness.db\n.harness/harness.db-shm\n.harness/harness.db-wal\n.harness/current.md\n`\n","import { existsSync, mkdirSync, writeFileSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\n\nimport { detectPackageManager } from './detect-package-manager'\nimport { mergeCodexConfigToml } from './mcp-merge'\nimport { appendGitignore, slugify, writeAgentFile, writeSkills } from './scaffold-utils'\nimport {\n agentBuilderToml,\n agentConsultantToml,\n agentExplorerToml,\n agentLeadAsDefaultToml,\n agentLeadToml,\n agentReviewerToml,\n agentsMd,\n featureListJson,\n HEALTH_SH,\n} from './templates'\n\nimport type { Materializer } from './index'\nimport type { HarnessConfig, Provider, ScaffoldOptions } from '@/types'\n\nexport class CodexCliMaterializer implements Materializer {\n async scaffold(config: HarnessConfig, opts: ScaffoldOptions): Promise<void> {\n const { cwd } = opts\n\n const write = (relPath: string, content: string, mode?: number) => {\n const abs = join(cwd, relPath)\n mkdirSync(resolve(abs, '..'), { recursive: true })\n writeFileSync(abs, content, { encoding: 'utf8', mode })\n }\n\n // AGENTS.md — always overwrite (generated from config)\n write('AGENTS.md', agentsMd(config))\n\n // health.sh — only create if it doesn't exist\n if (!existsSync(join(cwd, 'health.sh'))) {\n write('health.sh', HEALTH_SH, 0o755)\n }\n\n const tasks = opts.firstTask\n ? [{ slug: slugify(opts.firstTask.title), ...opts.firstTask }]\n : []\n write(join(config.storage.dir, 'feature_list.json'), featureListJson(tasks))\n\n if (!existsSync(join(cwd, config.storage.markdownFallback.path))) {\n write(\n config.storage.markdownFallback.path,\n `<!-- AUTO-GENERATED by agent-harness-kit — DO NOT EDIT MANUALLY -->\\n<!-- Run ahk status to refresh -->\\n\\n# Current Session\\n\\nNo tasks in progress.\\n`\n )\n }\n\n // .codex/agents/ — skip files the dev may have customized\n const projectName = config.project.name\n const allowedPaths = (config.agents.explorer.allowedPaths ?? []).join(', ')\n const writablePaths = (config.agents.builder.writablePaths ?? []).join(', ')\n const leadModel = config.agents.lead.model\n const explorerModel = config.agents.explorer.model\n const consultantModel = config.agents.consultant?.model\n const builderModel = config.agents.builder.model\n const reviewerModel = config.agents.reviewer.model\n\n writeAgentFile(cwd, '.codex/agents/lead.toml', agentLeadToml({ projectName, model: leadModel }))\n writeAgentFile(cwd, '.codex/agents/explorer.toml', agentExplorerToml({ projectName, allowedPaths, model: explorerModel }))\n writeAgentFile(cwd, '.codex/agents/consultant.toml', agentConsultantToml({ projectName, model: consultantModel }))\n writeAgentFile(cwd, '.codex/agents/builder.toml', agentBuilderToml({ projectName, writablePaths, model: builderModel }))\n writeAgentFile(cwd, '.codex/agents/reviewer.toml', agentReviewerToml({ projectName, model: reviewerModel }))\n // Override Codex's built-in `default` agent so `lead` runs when no agent is selected\n writeAgentFile(cwd, '.codex/agents/default.toml', agentLeadAsDefaultToml({ projectName, model: leadModel }))\n\n // .codex/config.toml — MERGE, never overwrite whole file. Detect the\n // project's package manager fresh from cwd so the spawned command matches npm/pnpm/yarn.\n mergeCodexConfigToml(join(cwd, '.codex/config.toml'), config.tools.mcp.port, detectPackageManager(cwd))\n\n appendGitignore(cwd)\n writeSkills(cwd, '.agents/skills')\n }\n\n async build(config: HarnessConfig, cwd: string): Promise<void> {\n const write = (relPath: string, content: string) => {\n const abs = join(cwd, relPath)\n mkdirSync(resolve(abs, '..'), { recursive: true })\n writeFileSync(abs, content, 'utf8')\n }\n\n write('AGENTS.md', agentsMd(config))\n\n const projectName = config.project.name\n const allowedPaths = (config.agents.explorer.allowedPaths ?? []).join(', ')\n const writablePaths = (config.agents.builder.writablePaths ?? []).join(', ')\n const leadModel = config.agents.lead.model\n const explorerModel = config.agents.explorer.model\n const consultantModel = config.agents.consultant?.model\n const builderModel = config.agents.builder.model\n const reviewerModel = config.agents.reviewer.model\n\n writeAgentFile(cwd, '.codex/agents/lead.toml', agentLeadToml({ projectName, model: leadModel }))\n writeAgentFile(cwd, '.codex/agents/explorer.toml', agentExplorerToml({ projectName, allowedPaths, model: explorerModel }))\n writeAgentFile(cwd, '.codex/agents/consultant.toml', agentConsultantToml({ projectName, model: consultantModel }))\n writeAgentFile(cwd, '.codex/agents/builder.toml', agentBuilderToml({ projectName, writablePaths, model: builderModel }))\n writeAgentFile(cwd, '.codex/agents/reviewer.toml', agentReviewerToml({ projectName, model: reviewerModel }))\n writeAgentFile(cwd, '.codex/agents/default.toml', agentLeadAsDefaultToml({ projectName, model: leadModel }))\n\n // Re-detecting on every build self-corrects the command if the user\n // switched package managers since `ahk init` — no migration flag needed.\n mergeCodexConfigToml(join(cwd, '.codex/config.toml'), config.tools.mcp.port, detectPackageManager(cwd))\n writeSkills(cwd, '.agents/skills')\n }\n\n async migrate(config: HarnessConfig, _to: Provider, _cwd: string): Promise<void> {\n void config\n }\n\n async syncPermissions(_cwd: string): Promise<void> {\n console.log(' Permissions sync not needed for codex-cli — skipping')\n }\n}\n","import { existsSync, mkdirSync, writeFileSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\n\nimport { detectPackageManager } from './detect-package-manager'\nimport { mergeOpencodeJson } from './mcp-merge'\nimport { appendGitignore, slugify, writeAgentFile, writeSkills } from './scaffold-utils'\nimport { agentBuilder, agentConsultant, agentExplorer, agentLead, agentReviewer, agentsMd, featureListJson, HEALTH_SH, translateFrontmatterForOpenCode } from './templates'\n\nimport type { Materializer } from './index'\nimport type { HarnessConfig, Provider, ScaffoldOptions } from '@/types'\n\nexport class OpenCodeMaterializer implements Materializer {\n async scaffold(config: HarnessConfig, opts: ScaffoldOptions): Promise<void> {\n const { cwd } = opts\n\n const write = (relPath: string, content: string, mode?: number) => {\n const abs = join(cwd, relPath)\n mkdirSync(resolve(abs, '..'), { recursive: true })\n writeFileSync(abs, content, { encoding: 'utf8', mode })\n }\n\n // AGENTS.md — always overwrite (generated from config)\n write('AGENTS.md', agentsMd(config))\n\n // health.sh — only create if it doesn't exist\n if (!existsSync(join(cwd, 'health.sh'))) {\n write('health.sh', HEALTH_SH, 0o755)\n }\n\n const tasks = opts.firstTask\n ? [{ slug: slugify(opts.firstTask.title), ...opts.firstTask }]\n : []\n write(join(config.storage.dir, 'feature_list.json'), featureListJson(tasks))\n\n if (!existsSync(join(cwd, config.storage.markdownFallback.path))) {\n write(\n config.storage.markdownFallback.path,\n `<!-- AUTO-GENERATED by agent-harness-kit — DO NOT EDIT MANUALLY -->\\n<!-- Run ahk status to refresh -->\\n\\n# Current Session\\n\\nNo tasks in progress.\\n`\n )\n }\n\n // .opencode/agents/ — skip files the dev may have customized\n const projectName = config.project.name\n const allowedPaths = (config.agents.explorer.allowedPaths ?? []).join(', ')\n const writablePaths = (config.agents.builder.writablePaths ?? []).join(', ')\n writeAgentFile(cwd, '.opencode/agents/lead.md', translateFrontmatterForOpenCode(agentLead({ projectName })))\n writeAgentFile(cwd, '.opencode/agents/explorer.md', translateFrontmatterForOpenCode(agentExplorer({ projectName, allowedPaths })))\n writeAgentFile(cwd, '.opencode/agents/consultant.md', translateFrontmatterForOpenCode(agentConsultant({ projectName })))\n writeAgentFile(cwd, '.opencode/agents/builder.md', translateFrontmatterForOpenCode(agentBuilder({ projectName, writablePaths })))\n writeAgentFile(cwd, '.opencode/agents/reviewer.md', translateFrontmatterForOpenCode(agentReviewer({ projectName })))\n\n // opencode.json — MERGE, never overwrite whole file. Detect the project's\n // package manager fresh from cwd so the spawned command matches npm/pnpm/yarn.\n mergeOpencodeJson(join(cwd, 'opencode.json'), config.tools.mcp.port, detectPackageManager(cwd))\n\n appendGitignore(cwd)\n writeSkills(cwd, '.opencode/skills')\n }\n\n async build(config: HarnessConfig, cwd: string): Promise<void> {\n const write = (relPath: string, content: string) => {\n const abs = join(cwd, relPath)\n mkdirSync(resolve(abs, '..'), { recursive: true })\n writeFileSync(abs, content, 'utf8')\n }\n\n write('AGENTS.md', agentsMd(config))\n\n const projectName = config.project.name\n const allowedPaths = (config.agents.explorer.allowedPaths ?? []).join(', ')\n const writablePaths = (config.agents.builder.writablePaths ?? []).join(', ')\n writeAgentFile(cwd, '.opencode/agents/lead.md', translateFrontmatterForOpenCode(agentLead({ projectName })))\n writeAgentFile(cwd, '.opencode/agents/explorer.md', translateFrontmatterForOpenCode(agentExplorer({ projectName, allowedPaths })))\n writeAgentFile(cwd, '.opencode/agents/consultant.md', translateFrontmatterForOpenCode(agentConsultant({ projectName })))\n writeAgentFile(cwd, '.opencode/agents/builder.md', translateFrontmatterForOpenCode(agentBuilder({ projectName, writablePaths })))\n writeAgentFile(cwd, '.opencode/agents/reviewer.md', translateFrontmatterForOpenCode(agentReviewer({ projectName })))\n\n // Re-detecting on every build self-corrects the command if the user\n // switched package managers since `ahk init` — no migration flag needed.\n mergeOpencodeJson(join(cwd, 'opencode.json'), config.tools.mcp.port, detectPackageManager(cwd))\n writeSkills(cwd, '.opencode/skills')\n }\n\n async migrate(config: HarnessConfig, _to: Provider, _cwd: string): Promise<void> {\n void config\n }\n\n async syncPermissions(_cwd: string): Promise<void> {\n console.log(' Permissions sync not needed for opencode — skipping')\n }\n}\n\n","import { ClaudeCodeMaterializer } from './claude-code'\nimport { CodexCliMaterializer } from './codex-cli'\nimport { OpenCodeMaterializer } from './opencode'\n\nimport type { HarnessConfig, Provider, ScaffoldOptions } from '@/types'\n\nexport interface Materializer {\n scaffold(config: HarnessConfig, opts: ScaffoldOptions): Promise<void>\n build(config: HarnessConfig, cwd: string): Promise<void>\n migrate(config: HarnessConfig, to: Provider, cwd: string): Promise<void>\n syncPermissions(cwd: string): Promise<void>\n}\n\nexport function getMaterializer(provider: Provider): Materializer {\n switch (provider) {\n case 'claude-code':\n return new ClaudeCodeMaterializer()\n case 'opencode':\n return new OpenCodeMaterializer()\n case 'codex-cli':\n return new CodexCliMaterializer()\n default:\n throw new Error(`Unknown provider: ${provider as string}`)\n }\n}\n","import { dirname, join, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport pc from 'picocolors'\n\nimport { loadConfig } from '@/core/config'\nimport { startDashboardServer } from '@/core/dashboard-server'\nimport { openDB } from '@/core/db'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\n\ninterface DashboardOptions {\n port: number\n open: boolean\n}\n\nexport async function runDashboard(cwd: string, opts: DashboardOptions): Promise<void> {\n const config = await loadConfig(cwd)\n const db = await openDB(config, cwd)\n const dbPath = config.database.type === 'sqlite' ? resolve(cwd, config.database.path) : null\n const staticPath = join(__dirname, 'dashboard-dist')\n\n const { url } = await startDashboardServer(db, dbPath, staticPath, opts.port)\n\n console.log(pc.green(`✓`) + ` Dashboard running at ${pc.bold(pc.cyan(url))}`)\n console.log(pc.dim(` WebSocket live updates enabled`))\n console.log(pc.dim(` Press Ctrl+C to stop`))\n\n if (opts.open) {\n const { default: open } = await import('open')\n await open(url)\n }\n\n process.on('SIGINT', () => {\n process.exit(0)\n })\n\n // Keep process alive until SIGINT\n await new Promise<void>(() => { })\n}\n","import { watch } from 'node:fs'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { extname, join } from 'node:path'\nimport { serve } from '@hono/node-server'\nimport { Hono } from 'hono'\nimport { WebSocketServer } from 'ws'\n\nimport { findFreePort } from './port-utils'\n\nimport type { HarnessDB } from './db'\nimport type { IncomingMessage } from 'node:http'\nimport type { Socket } from 'node:net'\n\n// ─── Static file serving ──────────────────────────────────────────────────────\n\nconst MIME: Record<string, string> = {\n '.html': 'text/html; charset=utf-8',\n '.js': 'application/javascript; charset=utf-8',\n '.mjs': 'application/javascript; charset=utf-8',\n '.css': 'text/css; charset=utf-8',\n '.json': 'application/json; charset=utf-8',\n '.svg': 'image/svg+xml',\n '.png': 'image/png',\n '.ico': 'image/x-icon',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n '.ttf': 'font/ttf',\n}\n\nfunction fileResponse(filePath: string): Response {\n const content = readFileSync(filePath)\n const mime = MIME[extname(filePath)] ?? 'application/octet-stream'\n return new Response(content, {\n headers: { 'Content-Type': mime, 'Cache-Control': 'no-cache' },\n })\n}\n\n// ─── Server ───────────────────────────────────────────────────────────────────\n\nexport interface DashboardServerResult {\n url: string\n close: () => void\n}\n\nexport async function startDashboardServer(\n db: HarnessDB,\n dbPath: string | null,\n staticPath: string,\n port: number\n): Promise<DashboardServerResult> {\n const app = new Hono()\n const { tasks, actions, stats } = db\n\n // ─── CORS ─────────────────────────────────────────────────────────────────\n app.use('/api/*', async (c, next) => {\n await next()\n c.res.headers.set('Access-Control-Allow-Origin', '*')\n })\n\n // ─── Stats overview ───────────────────────────────────────────────────────\n app.get('/api/stats', async (c) => {\n await db.reconnect()\n const summary = await tasks.getStatusSummary()\n const byStatus: Record<string, number> = { pending: 0, in_progress: 0, done: 0, blocked: 0 }\n for (const { status, total } of summary) byStatus[status] = total\n const counts = await stats.getCounts()\n return c.json({ byStatus, ...counts })\n })\n\n // ─── Meta ─────────────────────────────────────────────────────────────────\n app.get('/api/meta', (c) => {\n return c.json({ ok: true })\n })\n\n // ─── Tasks list ───────────────────────────────────────────────────────────\n app.get('/api/tasks', async (c) => {\n await db.reconnect()\n const includeArchived = c.req.query('includeArchived') === 'true'\n return c.json(await tasks.getAllWithAcceptanceCounts(includeArchived))\n })\n\n // ─── Task detail ──────────────────────────────────────────────────────────\n app.get('/api/tasks/:id', async (c) => {\n await db.reconnect()\n const id = parseInt(c.req.param('id'))\n const task = await tasks.getById(id)\n if (!task) return c.json({ error: 'Not found' }, 404)\n\n const acceptance = await tasks.getAcceptance(id)\n const taskActions = await actions.getWithDetails(id)\n return c.json({ ...task, acceptance, actions: taskActions })\n })\n\n // ─── Task update (PATCH) ────────────────────────────────────────────────\n app.patch('/api/tasks/:id', async (c) => {\n const id = parseInt(c.req.param('id'))\n const task = await tasks.getById(id)\n if (!task) return c.json({ error: 'Not found' }, 404)\n\n const body = await c.req.json()\n const updateParams: { title?: string; description?: string | null; slug?: string } = {}\n if (body.title !== undefined) updateParams.title = body.title\n if (body.description !== undefined) updateParams.description = body.description\n\n await db.updateTask(id, updateParams)\n\n if (body.acceptance !== undefined && Array.isArray(body.acceptance)) {\n await db.updateTaskAcceptance(\n id,\n body.acceptance.map((a: string) => a.trim()).filter(Boolean)\n )\n }\n\n const updated = await tasks.getById(id)\n const acceptance = await tasks.getAcceptance(id)\n const taskActions = await actions.getWithDetails(id)\n return c.json({ ...updated, acceptance, actions: taskActions })\n })\n\n // ─── Archive task ─────────────────────────────────────────────────────────\n app.patch('/api/tasks/:id/archive', async (c) => {\n await db.reconnect()\n const id = parseInt(c.req.param('id'))\n const task = await tasks.getById(id)\n if (!task) return c.json({ error: 'Not found' }, 404)\n const updated = await db.archiveTask(id)\n return c.json(updated)\n })\n\n // ─── Unarchive task ──────────────────────────────────────────────────────\n app.patch('/api/tasks/:id/unarchive', async (c) => {\n await db.reconnect()\n const id = parseInt(c.req.param('id'))\n const task = await tasks.getById(id)\n if (!task) return c.json({ error: 'Not found' }, 404)\n const updated = await db.unarchiveTask(id)\n return c.json(updated)\n })\n\n // ─── Tools top ────────────────────────────────────────────────────────────\n app.get('/api/tools/top', async (c) => {\n await db.reconnect()\n const limit = parseInt(c.req.query('limit') ?? '20')\n return c.json(await actions.getTopTools(limit))\n })\n\n // ─── Tools recent ─────────────────────────────────────────────────────────\n app.get('/api/tools/recent', async (c) => {\n await db.reconnect()\n const limit = parseInt(c.req.query('limit') ?? '50')\n return c.json(await stats.getRecentTools(limit))\n })\n\n // ─── Files top ────────────────────────────────────────────────────────────\n app.get('/api/files/top', async (c) => {\n await db.reconnect()\n const limit = parseInt(c.req.query('limit') ?? '20')\n return c.json(await stats.getTopFiles(limit))\n })\n\n // ─── Files recent ─────────────────────────────────────────────────────────\n app.get('/api/files/recent', async (c) => {\n await db.reconnect()\n const limit = parseInt(c.req.query('limit') ?? '50')\n return c.json(await stats.getRecentFiles(limit))\n })\n\n // ─── Agents stats ─────────────────────────────────────────────────────────\n app.get('/api/agents/stats', async (c) => {\n await db.reconnect()\n return c.json(await stats.getAgentStats())\n })\n\n // ─── Timeline ─────────────────────────────────────────────────────────────\n app.get('/api/timeline', async (c) => {\n await db.reconnect()\n const limit = parseInt(c.req.query('limit') ?? '50')\n return c.json(await stats.getTimeline(limit))\n })\n\n // ─── Static SPA ───────────────────────────────────────────────────────────\n app.get('/*', (c) => {\n const urlPath = c.req.path\n if (urlPath !== '/') {\n const candidate = join(staticPath, urlPath)\n if (existsSync(candidate)) {\n try {\n return fileResponse(candidate)\n } catch {\n /* fall through */\n }\n }\n }\n return fileResponse(join(staticPath, 'index.html'))\n })\n\n // ─── Start HTTP server ────────────────────────────────────────────────────\n const resolvedPort = await findFreePort(port)\n if (resolvedPort !== port) {\n console.log(`Port ${port} in use, using ${resolvedPort}`)\n }\n const httpServer = serve({ fetch: app.fetch, port: resolvedPort })\n\n // ─── WebSocket ────────────────────────────────────────────────────────────\n const wss = new WebSocketServer({ noServer: true })\n\n httpServer.on('upgrade', (req: IncomingMessage, socket: Socket, head: Buffer) => {\n if (req.url === '/ws') {\n wss.handleUpgrade(req, socket, head, (ws) => {\n wss.emit('connection', ws, req)\n })\n } else {\n socket.destroy()\n }\n })\n\n // ─── DB file watcher → broadcast update ──────────────────────────────────\n let debounce: ReturnType<typeof setTimeout>\n\n const broadcast = () => {\n clearTimeout(debounce)\n debounce = setTimeout(() => {\n for (const client of wss.clients) {\n if (client.readyState === 1) {\n client.send(JSON.stringify({ type: 'update' }))\n }\n }\n }, 150)\n }\n\n // SQLite only — no file to watch for Postgres/MySQL\n let watcher: ReturnType<typeof watch> | null = null\n if (dbPath) {\n const walPath = `${dbPath}-wal`\n const watchTarget = existsSync(walPath) ? walPath : dbPath\n watcher = watch(watchTarget, broadcast)\n }\n\n return {\n url: `http://localhost:${resolvedPort}`,\n close: () => {\n clearTimeout(debounce)\n watcher?.close()\n wss.close()\n httpServer.close()\n },\n }\n}\n","import { createServer } from 'node:net'\n\nexport function isPortFree(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const server = createServer()\n server.once('error', () => resolve(false))\n server.once('listening', () => {\n server.close(() => resolve(true))\n })\n server.listen(port, '127.0.0.1')\n })\n}\n\nexport async function findFreePort(start: number, maxAttempts = 10): Promise<number> {\n for (let i = 0; i < maxAttempts; i++) {\n const port = start + i\n if (await isPortFree(port)) return port\n }\n throw new Error(\n `Could not find a free port after ${maxAttempts} attempts (tried ${start}-${start + maxAttempts - 1}). Please free a port and try again.`\n )\n}\n","import pc from 'picocolors'\n\nimport { loadConfig } from '@/core/config'\nimport { getDoctorStatus } from '@/core/doctor'\n\nimport type { AgentStatus, SkillStatus } from '@/core/doctor'\n\n// ─── Formatting helpers ───────────────────────────────────────────────────────\n\nfunction ok(label: string, detail: string): void {\n console.log(` ${pc.cyan(label.padEnd(16))}${pc.green('[✓]')} ${detail}`)\n}\n\nfunction warn(label: string, detail: string, hint?: string): void {\n console.log(` ${pc.cyan(label.padEnd(16))}${pc.yellow('[!]')} ${detail}`)\n if (hint) {\n console.log(` ${''.padEnd(16)} ${pc.dim(hint)}`)\n }\n}\n\nfunction neutral(label: string, detail: string): void {\n console.log(` ${pc.cyan(label.padEnd(16))}${pc.dim('[~]')} ${detail}`)\n}\n\n// ─── Section formatters ───────────────────────────────────────────────────────\n\nfunction printLibSection(lib: { current: string; latest: string | null; outdated: boolean }): void {\n if (lib.latest === null) {\n neutral('lib version', `${lib.current} (unknown — could not reach npm registry)`)\n } else if (lib.outdated) {\n warn(\n 'lib version',\n `${lib.current} → ${lib.latest} available`,\n `run: npm i @cardor/agent-harness-kit@latest && ahk build`\n )\n } else {\n ok('lib version', `${lib.current} (up to date)`)\n }\n}\n\nfunction printAgentsSection(agents: AgentStatus[]): void {\n if (agents.length === 0) {\n warn('agent files', 'no config found — run: ahk init')\n return\n }\n\n const missing = agents.filter((a) => a.status === 'missing')\n const outdated = agents.filter((a) => a.status === 'outdated')\n\n if (missing.length === 0 && outdated.length === 0) {\n ok('agent files', 'all up to date')\n return\n }\n\n for (const agent of missing) {\n warn('agent files', `${agent.name} missing`, 'run: ahk build')\n }\n for (const agent of outdated) {\n warn('agent files', `${agent.name} outdated`, 'run: ahk build')\n }\n}\n\nfunction printSkillsSection(skills: SkillStatus[]): void {\n if (skills.length === 0) {\n warn('harness skills', 'no config found — run: ahk init')\n return\n }\n\n const issues = skills.filter((s) => s.status !== 'ok')\n if (issues.length === 0) {\n ok('harness skills', 'all present and up to date')\n return\n }\n\n for (const skill of issues) {\n const detail =\n skill.status === 'missing' ? `${skill.name} missing` : `${skill.name} outdated`\n warn('harness skills', detail, 'run: ahk build')\n }\n}\n\n// ─── Main command ─────────────────────────────────────────────────────────────\n\nexport async function runDoctor(cwd: string): Promise<void> {\n // Check for config first so we can give a helpful upfront message\n let configFound = true\n try {\n await loadConfig(cwd)\n } catch {\n configFound = false\n }\n\n console.log('')\n console.log(pc.bold(`● ahk doctor ` + '─'.repeat(44)))\n console.log('')\n\n const status = await getDoctorStatus(cwd)\n\n printLibSection(status.lib)\n\n if (!configFound) {\n console.log('')\n warn('config', 'no agent-harness-kit.config found', 'run: ahk init')\n console.log('')\n return\n }\n\n console.log('')\n printAgentsSection(status.agents)\n\n console.log('')\n printSkillsSection(status.skills)\n\n console.log('')\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport { loadConfig } from '@/core/config'\nimport {\n agentBuilder,\n agentBuilderToml,\n agentConsultant,\n agentConsultantToml,\n agentExplorer,\n agentExplorerToml,\n agentLead,\n agentLeadToml,\n agentReviewer,\n agentReviewerToml,\n translateFrontmatterForClaudeCode,\n translateFrontmatterForOpenCode,\n} from '@/core/materializer/templates'\nimport { pkg } from '@/core/package-data'\n\nimport type { HarnessConfig } from '@/types'\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface LibStatus {\n current: string\n latest: string | null // null = couldn't fetch (offline)\n outdated: boolean\n}\n\nexport interface AgentStatus {\n name: string\n status: 'ok' | 'missing' | 'outdated'\n}\n\nexport interface SkillStatus {\n name: string\n status: 'ok' | 'missing' | 'outdated'\n}\n\nexport interface DoctorStatus {\n lib: LibStatus\n agents: AgentStatus[]\n skills: SkillStatus[]\n}\n\n// ─── Constants ────────────────────────────────────────────────────────────────\n\nconst REGISTRY_URL = `https://registry.npmjs.org/${pkg.name}/latest`\nconst TIMEOUT_MS = 2000\nconst LIB_VERSION_CACHE_TTL_MS = 5 * 60 * 1000 // 5 minutes\nconst AGENT_NAMES = ['lead', 'explorer', 'consultant', 'builder', 'reviewer'] as const\nexport type AgentName = (typeof AGENT_NAMES)[number]\nconst SKILL_NAMES = ['ahk-ask', 'ahk-consultant', 'ahk-triage', 'ahk-review'] as const\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\n\n// ─── Lib version check ────────────────────────────────────────────────────────\n\n// In-memory TTL cache for the npm registry lookup only. Agent/skill file checks\n// are local and cheap, so they are intentionally NOT cached — only the network\n// call to the npm registry benefits from memoization.\nlet libVersionCache: { status: LibStatus; fetchedAt: number } | null = null\n\n/** Clears the in-memory lib version cache. Exposed for tests only. */\nexport function __resetLibVersionCacheForTests(): void {\n libVersionCache = null\n}\n\nasync function checkLibVersion(): Promise<LibStatus> {\n const current = pkg.version\n\n if (libVersionCache && Date.now() - libVersionCache.fetchedAt < LIB_VERSION_CACHE_TTL_MS) {\n // Cache is keyed to the running process's current version. If somehow the\n // running version changed (unlikely mid-process), fall through to refetch.\n if (libVersionCache.status.current === current) {\n return libVersionCache.status\n }\n }\n\n try {\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), TIMEOUT_MS)\n\n const res = await fetch(REGISTRY_URL, { signal: controller.signal })\n clearTimeout(timer)\n\n const data = (await res.json()) as { version: string }\n const latest = data.version\n const outdated = isNewer(latest, current)\n const status: LibStatus = { current, latest, outdated }\n libVersionCache = { status, fetchedAt: Date.now() }\n return status\n } catch {\n const status: LibStatus = { current, latest: null, outdated: false }\n // Cache the offline result too, so repeated calls within the TTL don't\n // keep retrying a network call that just timed out/failed.\n libVersionCache = { status, fetchedAt: Date.now() }\n return status\n }\n}\n\nfunction isNewer(latest: string, current: string): boolean {\n const toNum = (v: string) => v.split('.').map(Number)\n const [lMaj, lMin, lPat] = toNum(latest)\n const [cMaj, cMin, cPat] = toNum(current)\n if (lMaj !== cMaj) return lMaj > cMaj\n if (lMin !== cMin) return lMin > cMin\n return lPat > cPat\n}\n\n// ─── Agent file check ─────────────────────────────────────────────────────────\n\nfunction getProviderAgentInfo(provider: string): {\n agentsDir: string\n ext: string\n} {\n switch (provider) {\n case 'claude-code':\n return { agentsDir: '.claude/agents', ext: '.md' }\n case 'opencode':\n return { agentsDir: '.opencode/agents', ext: '.md' }\n case 'codex-cli':\n return { agentsDir: '.codex/agents', ext: '.toml' }\n default:\n return { agentsDir: '.claude/agents', ext: '.md' }\n }\n}\n\nexport function generateExpectedAgentContent(\n agentName: AgentName,\n provider: string,\n vars: { projectName: string; allowedPaths: string; writablePaths: string; model?: string }\n): string {\n const { projectName, allowedPaths, writablePaths, model } = vars\n\n if (provider === 'claude-code') {\n const templateFns = {\n lead: () => agentLead({ projectName }),\n explorer: () => agentExplorer({ projectName, allowedPaths }),\n consultant: () => agentConsultant({ projectName }),\n builder: () => agentBuilder({ projectName, writablePaths }),\n reviewer: () => agentReviewer({ projectName }),\n }\n return translateFrontmatterForClaudeCode(templateFns[agentName](), agentName, model)\n }\n\n if (provider === 'opencode') {\n const templateFns = {\n lead: () => agentLead({ projectName }),\n explorer: () => agentExplorer({ projectName, allowedPaths }),\n consultant: () => agentConsultant({ projectName }),\n builder: () => agentBuilder({ projectName, writablePaths }),\n reviewer: () => agentReviewer({ projectName }),\n }\n // OpenCode never receives a model override — no injection for this provider.\n return translateFrontmatterForOpenCode(templateFns[agentName]())\n }\n\n // codex-cli: TOML format\n const tomlFns = {\n lead: () => agentLeadToml({ projectName, model }),\n explorer: () => agentExplorerToml({ projectName, allowedPaths, model }),\n consultant: () => agentConsultantToml({ projectName, model }),\n builder: () => agentBuilderToml({ projectName, writablePaths, model }),\n reviewer: () => agentReviewerToml({ projectName, model }),\n }\n return tomlFns[agentName]()\n}\n\n// Root-based comparison — shared by both the project-local (cwd) and global\n// (homeDir) checks. Callers resolve `agentsRoot` to an absolute directory;\n// this function never derives paths on its own, so there is exactly ONE\n// place that compares live vs. expected agent content.\nfunction checkAgentFilesAtRoot(\n agentsRoot: string,\n ext: string,\n provider: string,\n projectName: string,\n allowedPaths: string,\n writablePaths: string,\n models: Partial<Record<AgentName, string | undefined>>\n): AgentStatus[] {\n return AGENT_NAMES.map((name) => {\n const filePath = join(agentsRoot, `${name}${ext}`)\n\n if (!existsSync(filePath)) {\n return { name, status: 'missing' as const }\n }\n\n try {\n const live = readFileSync(filePath, 'utf8')\n const expected = generateExpectedAgentContent(name, provider, {\n projectName,\n allowedPaths,\n writablePaths,\n model: models[name],\n })\n return { name, status: live === expected ? 'ok' as const : 'outdated' as const }\n } catch {\n return { name, status: 'outdated' as const }\n }\n })\n}\n\nfunction checkAgentFiles(\n cwd: string,\n provider: string,\n projectName: string,\n allowedPaths: string,\n writablePaths: string,\n models: Partial<Record<AgentName, string | undefined>>\n): AgentStatus[] {\n const { agentsDir, ext } = getProviderAgentInfo(provider)\n return checkAgentFilesAtRoot(\n join(cwd, agentsDir),\n ext,\n provider,\n projectName,\n allowedPaths,\n writablePaths,\n models\n )\n}\n\n// ─── Skill check ─────────────────────────────────────────────────────────────\n\nfunction getProviderSkillsDir(provider: string): string {\n switch (provider) {\n case 'claude-code':\n return '.claude/skills'\n case 'opencode':\n return '.opencode/skills'\n case 'codex-cli':\n return '.agents/skills'\n default:\n return '.claude/skills'\n }\n}\n\n// Root-based comparison — shared by both the project-local (cwd) and global\n// (homeDir) checks. `skillsRoot` is an absolute directory already resolved\n// by the caller.\nfunction checkSkillsAtRoot(skillsRoot: string): SkillStatus[] {\n // Skills are in src/core/materializer/skills/ — at runtime dist/core/materializer/skills/\n const skillSourceBase = join(__dirname, 'skills')\n\n return SKILL_NAMES.map((name) => {\n const livePath = join(skillsRoot, name, 'SKILL.md')\n const sourcePath = join(skillSourceBase, name, 'SKILL.md')\n\n if (!existsSync(livePath)) {\n return { name, status: 'missing' as const }\n }\n\n try {\n const live = readFileSync(livePath, 'utf8')\n const source = readFileSync(sourcePath, 'utf8')\n return { name, status: live === source ? 'ok' : 'outdated' }\n } catch {\n return { name, status: 'outdated' as const }\n }\n })\n}\n\nfunction checkSkills(cwd: string, provider: string): SkillStatus[] {\n const skillsDir = getProviderSkillsDir(provider)\n return checkSkillsAtRoot(join(cwd, skillsDir))\n}\n\n// ─── Global (per-provider, home dir) resolution ────────────────────────────────\n//\n// Project-local paths (getProviderAgentInfo / getProviderSkillsDir above) are\n// always relative to the project cwd. Global paths live under the user's home\n// dir and, for some providers, do NOT mirror the local layout 1:1 — most\n// notably Codex CLI, whose skills live in a namespace separate from its\n// agents (`~/.agents/skills`, not `~/.codex/skills`). These functions must\n// stay independent of getProviderAgentInfo/getProviderSkillsDir rather than\n// deriving from them, since the local and global layouts genuinely differ\n// (e.g. OpenCode's global agents dir is XDG-style `~/.config/opencode/agents`,\n// not `~/.opencode/agents`).\n\nexport function getGlobalProviderAgentDir(\n provider: string,\n homeDir: string\n): { agentsDir: string; ext: string } {\n switch (provider) {\n case 'claude-code':\n return { agentsDir: join(homeDir, '.claude', 'agents'), ext: '.md' }\n case 'opencode':\n return { agentsDir: join(homeDir, '.config', 'opencode', 'agents'), ext: '.md' }\n case 'codex-cli':\n return { agentsDir: join(homeDir, '.codex', 'agents'), ext: '.toml' }\n default:\n return { agentsDir: join(homeDir, '.claude', 'agents'), ext: '.md' }\n }\n}\n\nexport function getGlobalProviderSkillsDir(provider: string, homeDir: string): string {\n switch (provider) {\n case 'claude-code':\n return join(homeDir, '.claude', 'skills')\n case 'opencode':\n return join(homeDir, '.config', 'opencode', 'skills')\n case 'codex-cli':\n // Codex CLI namespace split: agents live under ~/.codex/agents, but\n // skills live under ~/.agents/skills — NOT ~/.codex/skills. Mirrors the\n // project-local convention already used by getProviderSkillsDir().\n return join(homeDir, '.agents', 'skills')\n default:\n return join(homeDir, '.claude', 'skills')\n }\n}\n\nexport interface GlobalDoctorStatus {\n agents: AgentStatus[]\n skills: SkillStatus[]\n}\n\n/**\n * Global counterpart to getDoctorStatus() — reuses the same comparison logic\n * (checkAgentFilesAtRoot / checkSkillsAtRoot / generateExpectedAgentContent)\n * against a root resolved from `homeDir` instead of the project cwd. Never\n * mutates the filesystem — detection only.\n */\nexport async function getGlobalDoctorStatus(\n provider: string,\n config: HarnessConfig,\n homeDir: string = homedir()\n): Promise<GlobalDoctorStatus> {\n const projectName = config.project.name\n const allowedPaths = (config.agents.explorer.allowedPaths ?? []).join(', ')\n const writablePaths = (config.agents.builder.writablePaths ?? []).join(', ')\n const models: Partial<Record<AgentName, string | undefined>> = {\n lead: config.agents.lead.model,\n explorer: config.agents.explorer.model,\n consultant: config.agents.consultant?.model,\n builder: config.agents.builder.model,\n reviewer: config.agents.reviewer.model,\n }\n\n const { agentsDir, ext } = getGlobalProviderAgentDir(provider, homeDir)\n const agents = checkAgentFilesAtRoot(\n agentsDir,\n ext,\n provider,\n projectName,\n allowedPaths,\n writablePaths,\n models\n )\n\n const skillsDir = getGlobalProviderSkillsDir(provider, homeDir)\n const skills = checkSkillsAtRoot(skillsDir)\n\n return { agents, skills }\n}\n\n// ─── Main export ──────────────────────────────────────────────────────────────\n\nexport async function getDoctorStatus(cwd: string): Promise<DoctorStatus> {\n const lib = await checkLibVersion()\n\n let config\n try {\n config = await loadConfig(cwd)\n } catch {\n // Config not found — return minimal status with empty agent/skill checks\n return {\n lib,\n agents: [],\n skills: [],\n }\n }\n\n const provider = config.provider\n const projectName = config.project.name\n const allowedPaths = (config.agents.explorer.allowedPaths ?? []).join(', ')\n const writablePaths = (config.agents.builder.writablePaths ?? []).join(', ')\n const models: Partial<Record<AgentName, string | undefined>> = {\n lead: config.agents.lead.model,\n explorer: config.agents.explorer.model,\n consultant: config.agents.consultant?.model,\n builder: config.agents.builder.model,\n reviewer: config.agents.reviewer.model,\n }\n\n const agents = checkAgentFiles(cwd, provider, projectName, allowedPaths, writablePaths, models)\n const skills = checkSkills(cwd, provider)\n\n return { lib, agents, skills }\n}\n","import { existsSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst require = createRequire(import.meta.url)\n\n// Resolved at runtime relative to the compiled file location:\n// - local dev (compiled): dist/core/package-data.js → ../../package.json (repo root)\n// - installed: node_modules/@cardor/agent-harness-kit/dist/core/package-data.js → ../../package.json (package root)\n// - local dev (running .ts directly via tsx, e.g. tests): src/core/package-data.ts → ../../package.json (repo root)\nconst here = dirname(fileURLToPath(import.meta.url))\nconst candidates = [join(here, '..', '..', 'package.json'), join(here, '..', 'package.json')]\nconst pkgPath = candidates.find((p) => existsSync(p)) ?? candidates[0]\n\nexport const pkg = require(pkgPath) as { version: string; name: string }\n","import { writeFileSync } from 'node:fs'\nimport pc from 'picocolors'\n\nimport { loadConfig } from '@/core/config'\nimport { openDB } from '@/core/db'\n\ninterface ExportOptions {\n sql?: boolean\n json?: boolean\n output?: string\n}\n\nexport async function runExport(cwd: string, opts: ExportOptions): Promise<void> {\n if (!opts.sql && !opts.json) {\n console.error(pc.red('Specify --sql or --json'))\n process.exit(1)\n }\n\n const config = await loadConfig(cwd)\n const db = await openDB(config, cwd)\n\n try {\n if (opts.json) {\n const data = await db.exportJson()\n const out = JSON.stringify(data, null, 2) + '\\n'\n if (opts.output) {\n writeFileSync(opts.output, out, 'utf8')\n console.log(pc.green(`✓ Exported JSON → ${opts.output}`))\n } else {\n process.stdout.write(out)\n }\n }\n\n if (opts.sql) {\n console.error(pc.dim('SQL dump requires direct SQLite access — use: sqlite3 .harness/harness.db .dump'))\n process.exit(1)\n }\n } finally {\n await db.close()\n }\n}\n","import { spawnSync } from 'node:child_process'\nimport { existsSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\nimport pc from 'picocolors'\n\nimport { loadConfig } from '@/core/config'\n\nimport type { HarnessConfig } from '@/types'\n\nfunction checkLine(label: string | null, ok: boolean, message: string, indent = 0): void {\n const prefix = label ? pc.cyan(`[${label}] `) : ' '.repeat(indent)\n const icon = ok ? pc.green('✓') : pc.red('✗')\n console.log(prefix + icon + ' ' + (ok ? pc.green(message) : pc.red(message)))\n}\n\nexport async function runHealth(cwd: string): Promise<void> {\n let config\n try {\n config = await loadConfig(cwd)\n } catch {\n console.error(pc.red('✗ No config found. Run: ahk init'))\n process.exit(1)\n }\n\n let allOk = true\n\n // ─── [checking DB] ──────────────────────────────────────────────────────────\n let dbOk: boolean\n if (config.database.type === 'sqlite') {\n const dbPath = resolve(cwd, config.database.path)\n dbOk = existsSync(dbPath)\n checkLine('checking DB', dbOk, `${config.database.path} reachable`)\n } else {\n // For remote DBs we can't check the file — assume reachable (openDB will fail fast if not)\n dbOk = true\n checkLine('checking DB', true, `${config.database.type}://${config.database.connectionString.replace(/:[^:@]*@/, ':***@')} configured`)\n }\n if (!dbOk) allOk = false\n\n // ─── [checking agents] ──────────────────────────────────────────────────────\n const providerFiles = getProviderHealthFiles(config.provider)\n const agentsDir = providerFiles.agentsDir\n const agentNames = ['lead', 'explorer', 'consultant', 'builder', 'reviewer']\n\n const agentsLabelWidth = '[checking agents] '.length\n for (let i = 0; i < agentNames.length; i++) {\n const name = agentNames[i]\n const agentPath = join(cwd, agentsDir, `${name}${providerFiles.agentExtension}`)\n const ok = existsSync(agentPath)\n checkLine(\n i === 0 ? 'checking agents' : null,\n ok,\n `${name}${providerFiles.agentExtension} present`,\n agentsLabelWidth,\n )\n if (!ok) allOk = false\n }\n\n // ─── [checking MCP] ─────────────────────────────────────────────────────────\n if (config.tools.mcp.enabled) {\n const mcpFile = providerFiles.mcpFile\n const mcpPath = resolve(cwd, mcpFile)\n const mcpOk = existsSync(mcpPath)\n checkLine('checking MCP', mcpOk, `${mcpFile} valid`)\n if (!mcpOk) allOk = false\n }\n\n if (!allOk) {\n console.log('')\n console.error(pc.red('✗ Harness checks failed — fix the above before running health.sh'))\n process.exit(1)\n }\n\n // ─── Run health.sh ──────────────────────────────────────────────────────────\n const scriptPath = resolve(cwd, config.health.scriptPath)\n\n if (!existsSync(scriptPath)) {\n console.error(pc.red(`✗ health.sh not found: ${scriptPath}`))\n console.error(' Run ahk init first.')\n process.exit(1)\n }\n\n const result = spawnSync('bash', [scriptPath], {\n cwd,\n stdio: 'inherit',\n encoding: 'utf8',\n })\n\n if (result.error) {\n console.error(pc.red(`✗ Failed to run health.sh: ${result.error.message}`))\n process.exit(1)\n }\n\n if (result.status === 0) {\n console.log(pc.green('✓ Health check passed'))\n process.exit(0)\n } else {\n console.error(pc.red(`✗ Health check failed (exit ${result.status ?? 'unknown'})`))\n process.exit(result.status ?? 1)\n }\n}\n\nfunction getProviderHealthFiles(provider: HarnessConfig['provider']): {\n agentsDir: string\n agentExtension: '.md' | '.toml'\n mcpFile: string\n} {\n switch (provider) {\n case 'claude-code':\n return { agentsDir: '.claude/agents', agentExtension: '.md', mcpFile: '.mcp.json' }\n case 'opencode':\n return { agentsDir: '.opencode/agents', agentExtension: '.md', mcpFile: 'opencode.json' }\n case 'codex-cli':\n return { agentsDir: '.codex/agents', agentExtension: '.toml', mcpFile: '.codex/config.toml' }\n default:\n throw new Error(`Unknown provider: ${provider as string}`)\n }\n}\n","import { mkdirSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport * as p from '@clack/prompts'\nimport pc from 'picocolors'\n\nimport { findConfigFile } from '@/core/config'\nimport { openDB } from '@/core/db'\nimport { syncGlobalAgentsAndSkills } from '@/core/materializer/global-sync'\nimport { getMaterializer } from '@/core/materializer/index'\nimport { slugify } from '@/core/materializer/scaffold-utils'\nimport { configTs, configMjs, configCjs } from '@/core/materializer/templates'\nimport { initDescriptionSchema, initDocsSchema, initNameSchema } from '@/schema/init'\nimport { taskDescriptionSchema, taskTitleSchema } from '@/schema/task'\nimport { cliFormWithRetry } from '@/utils/form'\n\nimport {\n applyConfigDefaults,\n detectConfigExtension,\n drawBox,\n printWelcomeMessage,\n readProjectNameFromPackageJson,\n} from './init-helpers'\n\nimport type { Provider } from '@/types'\n\ninterface InitOptions {\n name?: string\n provider?: string\n docs?: string\n tasks?: string\n storageScope?: string\n}\n\nexport async function runInit(cwd: string, flags: InitOptions): Promise<void> {\n const existingConfig = findConfigFile(cwd)\n if (existingConfig) {\n console.log(\n pc.yellow('⚠') +\n ' ' +\n pc.bold('Project already initialized.') +\n pc.dim(` (${existingConfig})`)\n )\n console.log()\n console.log(pc.dim('Suggested next steps:'))\n console.log(\n ' ' +\n pc.cyan('ahk build') +\n pc.dim(' — re-sync agent files after updating the library')\n )\n console.log(' ' + pc.cyan('ahk build --sync') + pc.dim(' — also sync agent permissions'))\n console.log(\n ' ' + pc.cyan('ahk reset') + pc.dim(' — wipe and re-initialize from scratch')\n )\n console.log(' ' + pc.cyan('ahk dashboard') + pc.dim(' — open the harness dashboard'))\n process.exit(0)\n }\n\n const detectedName = flags.name ?? readProjectNameFromPackageJson(cwd)\n const projectName = detectedName || 'my-project'\n printWelcomeMessage(projectName)\n\n // ─── Project name ────────────────────────────────────────────────────────\n let name: string\n if (flags.name) {\n name = flags.name\n } else {\n name = await cliFormWithRetry(async () => {\n const val = await p.text({\n message: 'Project name',\n placeholder: 'my-app',\n ...(detectedName && { initialValue: detectedName }),\n })\n if (p.isCancel(val)) {\n p.cancel('Cancelled.')\n process.exit(0)\n }\n return val as string\n }, initNameSchema)\n }\n\n // ─── Description ─────────────────────────────────────────────────────────\n const description = await cliFormWithRetry(async () => {\n const val = await p.text({\n message: 'Short description (shown to agents as context)',\n placeholder: 'A REST API for managing notes',\n })\n if (p.isCancel(val)) {\n p.cancel('Cancelled.')\n process.exit(0)\n }\n return val as string\n }, initDescriptionSchema)\n\n // ─── Provider ─────────────────────────────────────────────────────────────\n let provider: Provider\n if (flags.provider && ['claude-code', 'opencode'].includes(flags.provider)) {\n provider = flags.provider as Provider\n } else {\n const val = await p.select({\n message: 'AI provider',\n options: [\n { value: 'opencode', label: 'OpenCode' },\n { value: 'claude-code', label: 'Claude Code' },\n { value: 'codex-cli', label: 'Codex CLI' },\n ],\n })\n if (p.isCancel(val)) {\n p.cancel('Cancelled.')\n process.exit(0)\n }\n provider = val satisfies Provider\n }\n\n // ─── Per-agent model customization (provider-conditional) ────────────────\n // OpenCode: no closed enum for models — skip entirely, no prompts at all.\n const AGENT_LABELS: { key: 'lead' | 'explorer' | 'consultant' | 'builder' | 'reviewer'; label: string }[] = [\n { key: 'lead', label: 'Lead' },\n { key: 'explorer', label: 'Explorer' },\n { key: 'consultant', label: 'Consultant' },\n { key: 'builder', label: 'Builder' },\n { key: 'reviewer', label: 'Reviewer' },\n ]\n const modelOverrides: Partial<Record<'lead' | 'explorer' | 'consultant' | 'builder' | 'reviewer', string>> = {}\n\n if (provider === 'claude-code' || provider === 'codex-cli') {\n const wantsModelCustomization = await p.confirm({\n message: '¿Personalizar el modelo por agente?',\n initialValue: false,\n })\n if (p.isCancel(wantsModelCustomization)) {\n p.cancel('Cancelled.')\n process.exit(0)\n }\n\n if (wantsModelCustomization) {\n if (provider === 'claude-code') {\n for (const agent of AGENT_LABELS) {\n const val = await p.select({\n message: `Modelo para ${agent.label}`,\n options: [\n { value: 'inherit', label: 'inherit (default)' },\n { value: 'haiku', label: 'haiku' },\n { value: 'sonnet', label: 'sonnet' },\n { value: 'opus', label: 'opus' },\n { value: 'fable', label: 'fable' },\n ],\n initialValue: 'inherit',\n })\n if (p.isCancel(val)) {\n p.cancel('Cancelled.')\n process.exit(0)\n }\n modelOverrides[agent.key] = val as string\n }\n } else {\n // codex-cli: free text. Codex does not validate this value client-side —\n // leaving it blank or under 3 characters means no override will be written.\n for (const agent of AGENT_LABELS) {\n const val = await p.text({\n message: `Modelo para ${agent.label} (Codex no valida este valor)`,\n placeholder: 'ej. gpt-5 (vacío o <3 caracteres = sin override)',\n })\n if (p.isCancel(val)) {\n p.cancel('Cancelled.')\n process.exit(0)\n }\n const trimmed = (val as string).trim()\n if (trimmed.length >= 3) {\n modelOverrides[agent.key] = trimmed\n }\n }\n }\n }\n }\n\n // ─── Docs path ────────────────────────────────────────────────────────────\n let docsPath: string\n if (flags.docs) {\n docsPath = flags.docs\n } else {\n docsPath = await cliFormWithRetry(async () => {\n const val = await p.text({\n message: 'Docs folder path (agents will search here)',\n initialValue: './docs',\n })\n if (p.isCancel(val)) {\n p.cancel('Cancelled.')\n process.exit(0)\n }\n return val as string\n }, initDocsSchema)\n }\n\n // ─── Storage scope ────────────────────────────────────────────────────────\n let storageScope: 'local' | 'global'\n if (flags.storageScope && ['local', 'global'].includes(flags.storageScope)) {\n storageScope = flags.storageScope as 'local' | 'global'\n } else {\n const val = await p.select({\n message: 'Storage scope',\n options: [\n { value: 'local', label: 'Local — .harness/harness.db lives in this project' },\n { value: 'global', label: 'Global — DB lives under ~/.harness/dbs/<projectId>/, outside the project' },\n ],\n initialValue: 'local',\n })\n if (p.isCancel(val)) {\n p.cancel('Cancelled.')\n process.exit(0)\n }\n storageScope = val as 'local' | 'global'\n }\n\n // ─── Task adapter ─────────────────────────────────────────────────────────\n let tasksAdapter: string\n if (flags.tasks && ['local', 'jira', 'linear'].includes(flags.tasks)) {\n tasksAdapter = flags.tasks\n } else {\n const val = await p.select({\n message: 'Task adapter',\n options: [\n { value: 'local', label: 'Local (feature_list.json)' },\n { value: 'jira', label: 'Jira (coming soon)' },\n { value: 'linear', label: 'Linear (coming soon)' },\n ],\n })\n if (p.isCancel(val)) {\n p.cancel('Cancelled')\n process.exit(0)\n }\n tasksAdapter = val as string\n }\n\n // ─── Optional first task ──────────────────────────────────────────────────\n const addFirstTask = await p.confirm({ message: 'Add your first task now?', initialValue: false })\n if (p.isCancel(addFirstTask)) {\n p.cancel('Cancelled')\n process.exit(0)\n }\n\n let firstTask: { title: string; description: string; acceptance: string[] } | undefined\n\n if (addFirstTask) {\n const taskTitle = await cliFormWithRetry(async () => {\n const val = await p.text({ message: 'Task title' })\n if (p.isCancel(val)) {\n p.cancel('Cancelled')\n process.exit(0)\n }\n return (val as string).trim()\n }, taskTitleSchema)\n\n const taskDesc = await cliFormWithRetry(async () => {\n const val = await p.text({ message: 'Task description', placeholder: 'What and why' })\n if (p.isCancel(val)) {\n p.cancel('Cancelled')\n process.exit(0)\n }\n return (val as string).trim()\n }, taskDescriptionSchema)\n\n const acceptance: string[] = []\n p.log.info('Acceptance criteria — one per line, empty line to finish')\n while (true) {\n const criterionVal = await p.text({\n message: '>',\n placeholder: 'Criterion (or press Enter to finish)',\n })\n if (p.isCancel(criterionVal) || !criterionVal || !(criterionVal as string).trim()) break\n acceptance.push((criterionVal as string).trim())\n }\n\n firstTask = { title: taskTitle, description: taskDesc, acceptance }\n }\n\n // ─── Scaffold ─────────────────────────────────────────────────────────────\n let configExt: 'ts' | 'mjs' | 'cjs' = 'ts'\n let globalSyncResult: Awaited<ReturnType<typeof syncGlobalAgentsAndSkills>> | null = null\n const spinner = p.spinner()\n spinner.start('Scaffolding...')\n\n try {\n const config = applyConfigDefaults({\n name,\n description,\n provider,\n docsPath,\n tasksAdapter,\n models: modelOverrides,\n scope: storageScope,\n })\n const materializer = getMaterializer(provider)\n\n const installDir = cwd\n\n configExt = detectConfigExtension(cwd)\n const configFileName = `agent-harness-kit.config.${configExt}`\n const templateFn = configExt === 'ts' ? configTs : configExt === 'mjs' ? configMjs : configCjs\n const configContent = templateFn({\n name,\n description,\n provider,\n docsPath,\n tasksAdapter,\n port: config.tools.mcp.port,\n models: modelOverrides,\n scope: config.storage.scope,\n projectId: config.storage.projectId,\n })\n writeFileSync(join(installDir, configFileName), configContent, 'utf8')\n\n // Create .harness dir (always project-local, regardless of storage scope —\n // this is where health.sh, scripts, and storage-state.json live)\n mkdirSync(join(installDir, config.storage.dir), { recursive: true })\n\n // Initialize SQLite DB (scope-aware: local → .harness/harness.db, global → ~/.harness/dbs/<projectId>/harness.db)\n const db = await openDB(config, installDir)\n\n // Always write .harness/storage-state.json — reflects the REAL current\n // storage state (project-local regardless of scope). Consumed by the\n // future `ahk migrate storage` command.\n await db.writeStorageState(installDir)\n\n // Scaffold provider-specific files\n await materializer.scaffold(config, { cwd: installDir, firstTask })\n\n // Global storage scope also implies globally-installed agents/skills —\n // sync them into the user's home dir (idempotent: only missing files are\n // created, already-synced files are left untouched).\n if (config.storage.scope === 'global') {\n globalSyncResult = await syncGlobalAgentsAndSkills(config, provider)\n }\n\n // Seed first task into DB if provided\n if (firstTask) {\n const slug = slugify(firstTask.title)\n await db.addTask({\n slug,\n title: firstTask.title,\n description: firstTask.description,\n acceptance: firstTask.acceptance,\n })\n }\n\n await db.close()\n spinner.stop('')\n } catch (err) {\n spinner.stop('Failed')\n p.log.error(err instanceof Error ? err.message : String(err))\n throw err\n }\n\n console.log(pc.green('✓ Scaffolded harness in current directory'))\n\n // ─── Summary ─────────────────────────────────────────────────────────────-\n const agentsDir = provider === 'claude-code' ? '.claude/agents/' : '.opencode/agents/'\n const mcpFile = provider === 'claude-code' ? '.claude/mcp.json' : './opencode.json'\n\n console.log('')\n console.log(pc.green(`✓ agent-harness-kit.config.${configExt}`))\n console.log(pc.green('✓ AGENTS.md'))\n console.log(pc.green('✓ health.sh'))\n console.log(pc.green(storageScope === 'global' ? '✓ ~/.harness/dbs/<projectId>/harness.db' : '✓ .harness/harness.db'))\n console.log(pc.green(storageScope === 'global' ? '✓ ~/.harness/dbs/<projectId>/current.md' : '✓ .harness/current.md'))\n console.log(pc.green('✓ .harness/storage-state.json'))\n console.log(pc.green(`✓ ${agentsDir}lead.md`))\n console.log(pc.green(`✓ ${agentsDir}explorer.md`))\n console.log(pc.green(`✓ ${agentsDir}builder.md`))\n console.log(pc.green(`✓ ${agentsDir}reviewer.md`))\n console.log(pc.green(`✓ ${mcpFile}`))\n console.log(pc.green('✓ .gitignore entries added'))\n\n if (globalSyncResult) {\n console.log('')\n if (globalSyncResult.alreadySynced) {\n console.log(pc.dim('✓ Global agents/skills already synced — skipped'))\n } else {\n for (const name of globalSyncResult.createdAgents) {\n console.log(pc.green(`✓ ~global agent added: ${name}`))\n }\n for (const name of globalSyncResult.createdSkills) {\n console.log(pc.green(`✓ ~global skill added: ${name}`))\n }\n }\n }\n\n console.log('')\n console.log(pc.cyan('→') + ` Edit ${pc.cyan('health.sh')} with your project checks`)\n console.log(pc.cyan('→') + ` ${pc.cyan('ahk task add')} to queue work for agents`)\n console.log(\n pc.cyan('→') +\n ` Enrich your docs with knowledge graphs: ${pc.cyan('https://github.com/safishamsi/graphify')}`\n )\n\n const recommendations: string[] = [\n ` Give a try to Heimdall MCP: Transparent proxy that traces every MCP tool call with OpenTelemetry. `,\n ` Learn more: ${pc.cyan('https://github.com/enmanuelmag/heimdall-mcp')} `,\n ]\n\n console.log('')\n drawBox(recommendations)\n}\n","import { homedir } from 'node:os'\n\nimport {\n generateExpectedAgentContent,\n getGlobalDoctorStatus,\n getGlobalProviderAgentDir,\n getGlobalProviderSkillsDir,\n} from '@/core/doctor'\nimport { writeAgentFile, writeSkill } from '@/core/materializer/scaffold-utils'\n\nimport type { AgentName } from '@/core/doctor'\nimport type { HarnessConfig, Provider } from '@/types'\n\nexport interface GlobalSyncResult {\n /** true when every global agent/skill file was already present and matched. */\n alreadySynced: boolean\n createdAgents: string[]\n createdSkills: string[]\n}\n\n/**\n * Synchronizes provider agents/skills into the user's home directory\n * (`~/.claude`, `~/.codex` + `~/.agents/skills`, `~/.config/opencode`) when\n * `storage.scope === 'global'`. Reuses getGlobalDoctorStatus() for detection\n * (missing/outdated/ok) — this module never re-implements the comparison\n * logic, it only decides WHAT to write based on that status and performs the\n * write via the existing writeAgentFile/writeSkill preserve-if-exists\n * helpers, so running `ahk init --storage-scope global` from multiple\n * projects never duplicates or clobbers already-synced global files.\n *\n * `outdated` files are intentionally left untouched — same \"preserve dev\n * customizations\" policy already used by the project-local scaffold flow.\n * Only `missing` files are created.\n */\nexport async function syncGlobalAgentsAndSkills(\n config: HarnessConfig,\n provider: Provider,\n homeDir: string = homedir()\n): Promise<GlobalSyncResult> {\n const status = await getGlobalDoctorStatus(provider, config, homeDir)\n const missingAgents = status.agents.filter((a) => a.status === 'missing')\n const missingSkills = status.skills.filter((s) => s.status === 'missing')\n\n if (missingAgents.length === 0 && missingSkills.length === 0) {\n return { alreadySynced: true, createdAgents: [], createdSkills: [] }\n }\n\n const projectName = config.project.name\n const allowedPaths = (config.agents.explorer.allowedPaths ?? []).join(', ')\n const writablePaths = (config.agents.builder.writablePaths ?? []).join(', ')\n const models: Partial<Record<AgentName, string | undefined>> = {\n lead: config.agents.lead.model,\n explorer: config.agents.explorer.model,\n consultant: config.agents.consultant?.model,\n builder: config.agents.builder.model,\n reviewer: config.agents.reviewer.model,\n }\n\n const createdAgents: string[] = []\n if (missingAgents.length > 0) {\n const { agentsDir, ext } = getGlobalProviderAgentDir(provider, homeDir)\n for (const agent of missingAgents) {\n const name = agent.name as AgentName\n const content = generateExpectedAgentContent(name, provider, {\n projectName,\n allowedPaths,\n writablePaths,\n model: models[name],\n })\n writeAgentFile(agentsDir, `${name}${ext}`, content)\n createdAgents.push(name)\n }\n }\n\n const createdSkills: string[] = []\n if (missingSkills.length > 0) {\n const skillsDir = getGlobalProviderSkillsDir(provider, homeDir)\n for (const skill of missingSkills) {\n writeSkill(skillsDir, skill.name)\n createdSkills.push(skill.name)\n }\n }\n\n return { alreadySynced: false, createdAgents, createdSkills }\n}\n","\nimport * as v from 'valibot'\n\nexport const initNameSchema = v\n .pipe(\n v.string(),\n v.nonEmpty('Project name is required'),\n v.minLength(3, 'Project name must be at least 3 characters'),\n v.maxLength(50, 'Project name must be at most 50 characters'),\n v.trim(),\n )\n\nexport const initDescriptionSchema = v\n .pipe(\n v.string(),\n v.nonEmpty('Description is required'),\n v.maxLength(300, 'Description must be at most 300 characters'),\n v.trim(),\n )\n\nexport const initDocsSchema = v\n .pipe(\n v.string(),\n v.nonEmpty('Docs folder path is required'),\n v.regex(/^[\\w\\-./]+$/, 'Docs folder path can only contain letters, numbers, dashes, underscores, dots, and slashes'),\n v.trim(),\n )","import * as v from 'valibot'\n\nexport const taskTitleSchema = v.pipe(\n v.string(),\n v.nonEmpty('Task title is required'),\n v.minLength(3, 'Task title must be at least 3 characters'),\n v.maxLength(100, 'Task title must be at most 100 characters'),\n)\n\nexport const taskDescriptionSchema = v.pipe(\n v.string(),\n v.nonEmpty('Description is required'),\n v.maxLength(1000, 'Description must be at most 1000 characters'),\n)\n","import * as p from '@clack/prompts'\nimport * as v from 'valibot'\n\n\nexport const cliFormWithRetry = async <T>(\n formFn: () => Promise<T>,\n schema: v.GenericSchema,\n): Promise<T> => {\n while (true) {\n const res = await formFn()\n const result = v.safeParse(schema, res)\n\n if (result.success) return result.output as T\n\n const messages = result.issues.map((i) => i.message).join(', ')\n p.log.error(messages)\n p.log.info('Please try again.\\n')\n }\n}\n","import { randomUUID } from 'node:crypto'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport pc from 'picocolors'\n\nimport type { HarnessConfig, Provider } from '@/types'\n\n/**\n * Read the `name` field from a `package.json` in the given directory.\n * Returns `null` if the file doesn't exist, is malformed, or lacks a valid `name`.\n */\nexport function readProjectNameFromPackageJson(cwd: string): string | null {\n try {\n const pkgPath = join(cwd, 'package.json')\n if (!existsSync(pkgPath)) return null\n const content = readFileSync(pkgPath, 'utf8')\n const pkg = JSON.parse(content)\n const name = pkg?.name\n if (typeof name === 'string' && name.trim()) return name.trim()\n return null\n } catch {\n return null\n }\n}\n\nexport function detectConfigExtension(cwd: string): 'ts' | 'mjs' | 'cjs' {\n try {\n if (existsSync(join(cwd, 'tsconfig.json'))) return 'ts'\n const pkgPath = join(cwd, 'package.json')\n if (!existsSync(pkgPath)) return 'mjs'\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'))\n if (pkg?.type === 'module') return 'mjs'\n } catch {}\n return 'mjs'\n}\n\nexport function applyConfigDefaults(params: {\n name: string\n description: string\n provider: Provider\n docsPath: string\n tasksAdapter: string\n models?: Partial<Record<'lead' | 'explorer' | 'consultant' | 'builder' | 'reviewer', string>>\n /** Storage scope chosen during init. Defaults to 'local' for backward compat. */\n scope?: 'local' | 'global'\n /** Reuse an existing projectId (e.g. re-running init logic). If omitted, a\n * fresh UUID is generated — NEVER derive it from the project path/hash. */\n projectId?: string\n}): HarnessConfig {\n const models = params.models ?? {}\n return {\n provider: params.provider,\n project: {\n name: params.name,\n description: params.description,\n docsPath: params.docsPath,\n agentsMd: './AGENTS.md',\n },\n agents: {\n lead: { instructionsPath: null, ...(models.lead && { model: models.lead }) },\n explorer: {\n instructionsPath: null,\n allowedPaths: [params.docsPath, './src'],\n ...(models.explorer && { model: models.explorer }),\n },\n builder: {\n instructionsPath: null,\n writablePaths: ['./src', './tests'],\n ...(models.builder && { model: models.builder }),\n },\n reviewer: { instructionsPath: null, ...(models.reviewer && { model: models.reviewer }) },\n ...(models.consultant && { consultant: { instructionsPath: null, model: models.consultant } }),\n custom: [],\n },\n database: { type: 'sqlite' as const, path: '.harness/harness.db' },\n storage: {\n dir: '.harness',\n tasks: { adapter: params.tasksAdapter as 'local' },\n sections: {\n toolsUsed: true,\n filesModified: true,\n result: true,\n blockers: true,\n nextSteps: false,\n },\n markdownFallback: { enabled: true, path: '.harness/current.md' },\n scope: params.scope ?? 'local',\n projectId: params.projectId ?? randomUUID(),\n },\n health: {\n scriptPath: './health.sh',\n required: true,\n },\n tools: {\n mcp: { enabled: true, port: 3742 },\n scripts: { enabled: true, outputDir: './.harness/scripts' },\n },\n }\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n\n/** Strip ANSI escape codes for width calculation */\nfunction stripAnsi(str: string): string {\n return str.replace(/\\x1B\\[[0-9;]*m/g, '')\n}\n\n\n/** Draw a bordered box matching printUpdateMessage() style */\nexport function drawBox(lines: string[]): void {\n // Calculate max content width (excluding ANSI codes)\n const width = Math.max(...lines.map((l) => stripAnsi(l).length))\n const border = '─'.repeat(width)\n\n console.log(pc.yellow(`┌${border}┐`))\n for (const line of lines) {\n const pad = width - stripAnsi(line).length\n const padStr = pad > 0 ? ' '.repeat(pad) : ''\n console.log(pc.yellow('│') + line + padStr + pc.yellow('│'))\n }\n console.log(pc.yellow(`└${border}┘`))\n}\n\n/**\n * Print a pretty welcome message when user executes the init command.\n * Styled to match the existing printUpdateMessage() aesthetic.\n */\nexport function printWelcomeMessage(projectName: string): void {\n const sep = '─'.repeat(38)\n\n // Build lines with embedded ANSI codes for width calculation\n const lines: string[] = [\n ` ${pc.bold(pc.white('agent-harness-kit'))} `,\n ` ${pc.gray('—')} harness scaffolding ${pc.gray('—')} `,\n ` ${pc.gray(sep)} `,\n ` ${pc.bold('Project:')} ${projectName || '—'} `,\n ` ${pc.bold('Status:')} ${pc.green('ready to configure')} `,\n ` ${pc.gray(sep)} `,\n ` ${pc.gray('Next steps:')} `,\n ` ${pc.gray('→')} ${pc.gray('Set up your AI provider config')} `,\n ` ${pc.gray('→')} ${pc.gray('Run your health check to verify')} `,\n ` ${pc.gray('→')} ${pc.gray('Start adding tasks for your agents')} `,\n ]\n\n console.log()\n drawBox(lines)\n console.log()\n}\n","import * as p from '@clack/prompts'\nimport pc from 'picocolors'\n\nimport { loadConfig } from '@/core/config'\nimport { getMaterializer } from '@/core/materializer/index'\n\nimport type { Provider } from '@/types'\n\ninterface MigrateOptions {\n to?: string\n}\n\nexport async function runMigrate(cwd: string, opts: MigrateOptions): Promise<void> {\n const config = await loadConfig(cwd)\n\n let target: Provider\n if (opts.to && ['claude-code', 'opencode', 'codex-cli'].includes(opts.to)) {\n target = opts.to as Provider\n } else {\n const val = await p.select({\n message: 'Migrate to provider',\n options: [\n { value: 'claude-code', label: 'Claude Code' },\n { value: 'opencode', label: 'OpenCode' },\n { value: 'codex-cli', label: 'Codex CLI' },\n ],\n })\n if (p.isCancel(val)) {\n p.cancel('Cancelled.')\n process.exit(0)\n }\n target = val as Provider\n }\n\n if (target === config.provider) {\n console.log(pc.dim(`Already on ${target} — nothing to migrate.`))\n return\n }\n\n const spinner = p.spinner()\n spinner.start(`Migrating from ${config.provider} to ${target}...`)\n\n try {\n // Scaffold the new provider's files\n const targetMaterializer = getMaterializer(target)\n await targetMaterializer.build(config, cwd)\n\n spinner.stop(pc.green(`Migrated to ${target}`))\n p.log.warn(`Update agent-harness-kit.config.ts: set provider: '${target}'`)\n p.log.warn(`Then run: ahk build`)\n } catch (err) {\n spinner.stop(pc.red('Migration failed'))\n p.log.error(err instanceof Error ? err.message : String(err))\n process.exit(1)\n }\n}\n","import { copyFileSync, existsSync, mkdirSync, rmSync, writeFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { dirname, join, resolve } from 'node:path'\nimport pc from 'picocolors'\n\nimport { loadConfig } from '@/core/config'\nimport {\n type FullExport,\n getRowCounts,\n isEmptyDatabase,\n openDB,\n readStorageStateFile,\n resolveGlobalStorageDir,\n resolveSqlitePathForScope,\n} from '@/core/db'\n\nimport type { DatabaseConfig, HarnessConfig } from '@/types'\n\nexport interface MigrateStorageOptions {\n force?: boolean\n dryRun?: boolean\n}\n\ntype DbType = DatabaseConfig['type']\n\nfunction log(msg: string): void {\n console.log(msg)\n}\n\n/** Aborts the current migration by throwing — callers (the CLI action\n * handler) are responsible for printing the message and exiting non-zero.\n * Throwing (rather than calling process.exit here) keeps this module\n * testable without killing the test process. */\nfunction fail(msg: string): never {\n throw new Error(msg)\n}\n\n/** Physical location of a project's harness `current.md`, following the same\n * scope convention `HarnessDB.regenerateCurrentMd()` uses. */\nfunction currentMdPathForScope(scope: 'local' | 'global', config: HarnessConfig, cwd: string, homeDir: string): string {\n return scope === 'global'\n ? join(resolveGlobalStorageDir(config, homeDir), 'current.md')\n : resolve(cwd, config.storage.markdownFallback.path)\n}\n\n/** Backs up the destination's current content (all 6 tables, via\n * exportJson()) to a local JSON file BEFORE any destructive `--force`\n * overwrite. Aborts the whole command (throws) if the backup can't be\n * written — fail-safe, per task #47 consultant advisory point 2. */\nasync function backupDestination(cwd: string, storageDir: string, data: FullExport): Promise<string> {\n const backupsDir = resolve(cwd, storageDir, 'backups')\n const path = join(backupsDir, `pre-migrate-${new Date().toISOString().replace(/[:.]/g, '-')}.json`)\n try {\n mkdirSync(backupsDir, { recursive: true })\n writeFileSync(path, JSON.stringify(data, null, 2) + '\\n', 'utf8')\n } catch (err) {\n throw new Error(\n `Could not write destination backup to ${path} (${err instanceof Error ? err.message : String(err)}). ` +\n `Aborting migration WITHOUT touching the destination — nothing was overwritten.`,\n )\n }\n return path\n}\n\n/** Copies a sqlite `.db` file (plus WAL/SHM sidecars if present) to a new\n * path, verifying the copy exists before returning. Does not delete the\n * original — caller decides when it's safe to remove it. */\nfunction copySqliteFile(srcPath: string, destPath: string): void {\n mkdirSync(dirname(destPath), { recursive: true })\n copyFileSync(srcPath, destPath)\n for (const suffix of ['-wal', '-shm']) {\n if (existsSync(`${srcPath}${suffix}`)) {\n copyFileSync(`${srcPath}${suffix}`, `${destPath}${suffix}`)\n }\n }\n if (!existsSync(destPath)) {\n throw new Error(`Copy verification failed: ${destPath} does not exist after copy.`)\n }\n}\n\nexport async function runMigrateStorage(\n cwd: string,\n opts: MigrateStorageOptions,\n homeDir: string = homedir(),\n): Promise<void> {\n const config = await loadConfig(cwd)\n const storageDir = config.storage.dir\n const state = readStorageStateFile(cwd, storageDir)\n\n // ── Case: storage-state.json is missing ──────────────────────────────────\n // NEVER treat this as \"destination empty, safe to migrate\". Probe the real\n // content at both sqlite candidate locations (local + global default\n // paths) before deciding anything. See task #47 consultant advisory pt.6.\n let realScope: 'local' | 'global'\n let realDbType: DbType\n\n if (!state) {\n const defaultSqlitePath = config.database.type === 'sqlite' ? config.database.path : '.harness/harness.db'\n const localPath = resolveSqlitePathForScope('local', defaultSqlitePath, cwd, config, homeDir)\n const globalPath = resolveSqlitePathForScope('global', defaultSqlitePath, cwd, config, homeDir)\n\n const localCount = await probeTaskCount(localPath)\n const globalCount = await probeTaskCount(globalPath)\n\n if (localCount > 0 && globalCount > 0) {\n fail(\n `storage-state.json is missing and BOTH candidate locations have data — ` +\n `local (${localPath}): ${localCount} task(s); global (${globalPath}): ${globalCount} task(s). ` +\n `Refusing to guess which one is authoritative. Resolve manually (inspect both databases) ` +\n `or delete the one that should be discarded, then re-run this command.`,\n )\n }\n\n if (localCount === 0 && globalCount === 0) {\n // Nothing exists anywhere yet — nothing to migrate. Just record the\n // current (desired) state so future runs have a storage-state.json.\n const db = await openDB(config, cwd, homeDir)\n try {\n await db.writeStorageState(cwd)\n } finally {\n await db.close()\n }\n log(pc.dim('storage-state.json was missing; no data found at either candidate location. Nothing to migrate — state recorded.'))\n return\n }\n\n // Exactly one candidate has data — self-heal: treat it as the real\n // (source) location without requiring --force, since this isn't a\n // blind guess (only one plausible source exists).\n realScope = localCount > 0 ? 'local' : 'global'\n realDbType = 'sqlite'\n log(\n pc.yellow(\n `storage-state.json was missing. Detected real data at ${realScope} sqlite location ` +\n `(${realScope === 'local' ? localPath : globalPath}) — using it as the migration source.`,\n ),\n )\n } else {\n realScope = state.scope\n realDbType = state.dbType\n }\n\n const desiredScope = config.storage.scope\n const desiredDbType = config.database.type\n\n // ── Case 1: everything matches — nothing to migrate ──────────────────────\n if (realScope === desiredScope && realDbType === desiredDbType) {\n log(pc.green(`✓ Storage already matches config (scope=${desiredScope}, database=${desiredDbType}) — nothing to migrate.`))\n return\n }\n\n // ── Unsupported direction: source was a remote DB ─────────────────────────\n // storage-state.json intentionally never stores connection strings/creds,\n // so we cannot auto-reconnect to a previous remote database. Out of scope\n // for this command — fail safe rather than guess.\n if (realDbType !== 'sqlite') {\n fail(\n `Cannot auto-locate the previous ${realDbType} database — storage-state.json does not retain connection ` +\n `credentials for security. Manually run \"ahk export --json\" while still connected to the old database ` +\n `(with the old config), then adjust agent-harness-kit.config.ts and re-import. This direction is out of scope for \"ahk migrate storage\".`,\n )\n }\n\n // ── Case: scope changes but dbType stays sqlite → move files directly ────\n if (desiredDbType === 'sqlite' && realDbType === 'sqlite') {\n return migrateScopeOnly(cwd, config, homeDir, realScope, desiredScope, opts)\n }\n\n // ── Case: dbType changes (sqlite -> postgres/mysql, or vice versa is\n // unsupported above) → full export/import through a transaction ──────\n return migrateAcrossDbType(cwd, config, homeDir, realScope, opts)\n}\n\n/** Returns the number of rows in `tasks` at `dbPath`, or 0 if the file\n * doesn't exist. Never creates the file (existence is checked first) —\n * probing must not have side effects. */\nasync function probeTaskCount(dbPath: string): Promise<number> {\n if (!existsSync(dbPath)) return 0\n const { SQLiteDriver } = await import('@/core/drivers/sqlite')\n const driver = new SQLiteDriver(dbPath)\n try {\n await driver.ensureSchema()\n const counts = await getRowCounts(driver)\n return counts.tasks\n } finally {\n await driver.close()\n }\n}\n\n// ─── Case: local <-> global, same engine (sqlite) ──────────────────────────\n\nasync function migrateScopeOnly(\n cwd: string,\n config: HarnessConfig,\n homeDir: string,\n fromScope: 'local' | 'global',\n toScope: 'local' | 'global',\n opts: MigrateStorageOptions,\n): Promise<void> {\n const sqlitePath = config.database.type === 'sqlite' ? config.database.path : '.harness/harness.db'\n const srcDb = resolveSqlitePathForScope(fromScope, sqlitePath, cwd, config, homeDir)\n const destDb = resolveSqlitePathForScope(toScope, sqlitePath, cwd, config, homeDir)\n const srcMd = currentMdPathForScope(fromScope, config, cwd, homeDir)\n const destMd = currentMdPathForScope(toScope, config, cwd, homeDir)\n\n if (!existsSync(srcDb)) {\n fail(`Source database not found at ${srcDb} (expected ${fromScope} scope) — nothing to move.`)\n }\n\n const destExists = existsSync(destDb)\n if (destExists) {\n const { SQLiteDriver } = await import('@/core/drivers/sqlite')\n const destDriver = new SQLiteDriver(destDb)\n let destEmpty: boolean\n try {\n await destDriver.ensureSchema()\n destEmpty = await isEmptyDatabase(destDriver)\n } finally {\n await destDriver.close()\n }\n if (!destEmpty && !opts.force) {\n fail(\n `Destination (${toScope}, ${destDb}) already has data. Re-run with --force to overwrite it ` +\n `(a backup of the destination will be written first).`,\n )\n }\n if (!destEmpty && opts.force) {\n // Back up destination content before overwriting.\n const { SQLiteDriver: Driver } = await import('@/core/drivers/sqlite')\n const backupDriver = new Driver(destDb)\n let data: FullExport\n try {\n await backupDriver.ensureSchema()\n const { HarnessDB } = await import('@/core/db')\n const tmpDb = new HarnessDB(backupDriver, { ...config, storage: { ...config.storage, scope: toScope } }, homeDir)\n data = await tmpDb.exportJson()\n } finally {\n await backupDriver.close()\n }\n const backupPath = await backupDestination(cwd, config.storage.dir, data)\n log(pc.yellow(` Backed up existing destination data → ${backupPath}`))\n }\n }\n\n if (opts.dryRun) {\n log(pc.dim(`[dry-run] Would copy ${srcDb} → ${destDb} (scope ${fromScope} → ${toScope}), and move current.md.`))\n return\n }\n\n copySqliteFile(srcDb, destDb)\n log(pc.green(`✓ Copied database ${srcDb} → ${destDb}`))\n\n if (existsSync(srcMd)) {\n mkdirSync(dirname(destMd), { recursive: true })\n copyFileSync(srcMd, destMd)\n log(pc.green(`✓ Copied current.md ${srcMd} → ${destMd}`))\n }\n\n // Only remove the source AFTER the copy is verified in place.\n rmSync(srcDb, { force: true })\n rmSync(`${srcDb}-wal`, { force: true })\n rmSync(`${srcDb}-shm`, { force: true })\n if (existsSync(srcMd) && srcMd !== destMd) rmSync(srcMd, { force: true })\n\n // Write storage-state ONLY after the move is confirmed successful.\n const db = await openDB(config, cwd, homeDir)\n try {\n await db.writeStorageState(cwd)\n } finally {\n await db.close()\n }\n\n log(pc.green(`✓ Storage migrated: scope ${fromScope} → ${toScope}`))\n}\n\n// ─── Case: database engine changes (sqlite -> postgres/mysql) ─────────────\n\nasync function migrateAcrossDbType(\n cwd: string,\n config: HarnessConfig,\n homeDir: string,\n sourceScope: 'local' | 'global',\n opts: MigrateStorageOptions,\n): Promise<void> {\n const sqlitePath = config.database.type === 'sqlite' ? config.database.path : '.harness/harness.db'\n const srcPath = resolveSqlitePathForScope(sourceScope, sqlitePath, cwd, config, homeDir)\n if (!existsSync(srcPath)) {\n fail(`Source sqlite database not found at ${srcPath} (expected ${sourceScope} scope) — nothing to migrate.`)\n }\n\n const { SQLiteDriver } = await import('@/core/drivers/sqlite')\n const srcDriver = new SQLiteDriver(srcPath)\n let sourceData: FullExport\n let sourceCounts: Awaited<ReturnType<typeof getRowCounts>>\n try {\n await srcDriver.ensureSchema()\n sourceCounts = await getRowCounts(srcDriver)\n const { HarnessDB } = await import('@/core/db')\n const srcDb = new HarnessDB(srcDriver, { ...config, storage: { ...config.storage, scope: sourceScope }, database: { type: 'sqlite', path: sqlitePath } }, homeDir)\n sourceData = await srcDb.exportJson()\n } finally {\n await srcDriver.close()\n }\n\n // Fail fast: connect to destination before touching anything else.\n let destDb\n try {\n destDb = await openDB(config, cwd, homeDir)\n } catch (err) {\n fail(`Could not connect to destination (${config.database.type}): ${err instanceof Error ? err.message : String(err)}. Verify database configuration.`)\n }\n\n try {\n const destCounts = await destDb.getRowCounts()\n const destEmpty = Object.values(destCounts).every((n) => n === 0)\n const sourceEmpty = Object.values(sourceCounts).every((n) => n === 0)\n\n if (!destEmpty) {\n if (!opts.force) {\n const bothHaveData = !sourceEmpty\n fail(\n bothHaveData\n ? `Both source (${sourceCounts.tasks} task(s)) and destination (${config.database.type}, ${destCounts.tasks} task(s)) ` +\n `have data that DIVERGE — this is not a first-time migration. Refusing to auto-merge. ` +\n `Review both manually, or re-run with --force to overwrite the destination (a JSON backup will be written first).`\n : `Destination (${config.database.type}) already has data (${destCounts.tasks} task(s)). ` +\n `Re-run with --force to overwrite it (a backup of the destination will be written first).`,\n )\n }\n }\n\n if (opts.dryRun) {\n log(\n pc.dim(\n `[dry-run] Would migrate ${sourceCounts.tasks} task(s) from sqlite (${sourceScope}, ${srcPath}) ` +\n `to ${config.database.type}${destEmpty ? '' : ' (destination has data — would back up first, then overwrite)'}.`,\n ),\n )\n return\n }\n\n let backupPath: string | null = null\n if (!destEmpty && opts.force) {\n const currentDestData = await destDb.exportJson()\n backupPath = await backupDestination(cwd, config.storage.dir, currentDestData)\n log(pc.yellow(` Backed up existing destination data → ${backupPath}`))\n }\n\n // Single transaction covers the entire import (and truncate, if any).\n // storage-state is written ONLY after this resolves without throwing.\n await destDb.importFullExport(sourceData, config.database.type, { truncateFirst: !destEmpty })\n\n await destDb.writeStorageState(cwd)\n\n log(\n pc.green(\n `✓ Migrated ${sourceData.tasks.length} task(s), ${sourceData.actions.length} action(s) ` +\n `from sqlite (${sourceScope}) → ${config.database.type}.`,\n ),\n )\n if (backupPath) log(pc.dim(` Destination backup: ${backupPath}`))\n log(pc.yellow(` Note: the original sqlite file at ${srcPath} was NOT deleted — remove it manually once you've verified the migration.`))\n } finally {\n await destDb.close()\n }\n}\n","import { existsSync, readdirSync, rmSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\nimport * as p from '@clack/prompts'\nimport pc from 'picocolors'\n\nimport { loadConfig } from '@/core/config'\n\ninterface ResetOptions {\n force?: boolean\n provider?: 'claude-code' | 'opencode'\n}\n\n// Map of agent names to their .md filenames\nconst AGENT_MD_FILES = ['lead', 'explorer', 'consultant', 'builder', 'reviewer']\n\nasync function resetAgentMds(cwd: string, provider: 'claude-code' | 'opencode'): Promise<void> {\n const agentDir = provider === 'claude-code' ? '.claude/agents' : '.opencode/agents'\n const agentDirPath = resolve(cwd, agentDir)\n\n if (!existsSync(agentDirPath)) {\n console.log(pc.yellow(` Skipping agent files — directory not found: ${agentDirPath}`))\n return\n }\n\n // Collect existing agent MD files\n const existingFiles: string[] = []\n try {\n const files = readdirSync(agentDirPath)\n for (const f of files) {\n if (f.endsWith('.md') && AGENT_MD_FILES.includes(f.replace('.md', ''))) {\n existingFiles.push(f)\n }\n }\n } catch {\n // Directory doesn't exist or can't be read\n console.log(pc.yellow(` Skipping agent files — ${agentDirPath} is not readable`))\n return\n }\n\n if (existingFiles.length === 0) {\n console.log(pc.yellow(` No agent MD files found in ${agentDir}/`))\n return\n }\n\n // Confirm removal of each agent MD file\n for (const file of existingFiles) {\n const confirm = await p.confirm({\n message: `Remove ${file}?`,\n initialValue: true,\n })\n if (p.isCancel(confirm)) {\n console.log(pc.red(' Cancelled by user.'))\n return\n }\n if (confirm) {\n try {\n const filePath = join(agentDirPath, file)\n rmSync(filePath, { force: true })\n console.log(pc.green(` Removed ${file}`))\n } catch {\n console.error(pc.red(` Failed to remove ${file}`))\n }\n } else {\n console.log(pc.cyan(` Skipped ${file}`))\n }\n }\n}\n\nexport async function runReset(cwd: string, opts: ResetOptions): Promise<void> {\n let config\n try {\n config = await loadConfig(cwd)\n } catch {\n console.error(pc.red('✗ No agent-harness-kit.config found. Run: ahk init'))\n process.exit(1)\n }\n\n const storageDir = config.storage.dir || '.harness'\n const dbPath = config.database.type === 'sqlite' ? resolve(cwd, config.database.path) : null\n const featureListPath = resolve(cwd, storageDir, 'feature_list.json')\n\n let resetDb = false\n let resetFeatureList = false\n let resetAgentMdsFlag = false\n\n // ─── Determine what to reset ────────────────────────────────────────────────\n\n // Reset DB? (SQLite only — remote DBs are not reset by this command)\n if (dbPath && existsSync(dbPath)) {\n if (opts.force) {\n resetDb = true\n } else {\n if (config.database.type !== 'sqlite') {\n console.log(pc.yellow(` Skipping DB reset — database type \"${config.database.type}\" is not managed by this command.`))\n resetDb = false\n } else {\n const confirm = await p.confirm({\n message: `Delete database (${config.database.path})?`,\n initialValue: true,\n })\n if (p.isCancel(confirm)) {\n console.log(pc.red(' Cancelled by user.'))\n return\n }\n resetDb = confirm\n }\n }\n } else if (!dbPath) {\n console.log(pc.dim(` Skipping DB reset — remote ${config.database.type} database is not managed by this command.`))\n }\n\n // Reset feature_list.json?\n if (existsSync(featureListPath)) {\n if (opts.force) {\n resetFeatureList = true\n } else {\n const confirm = await p.confirm({\n message: `Delete feature list (${storageDir}/feature_list.json)?`,\n initialValue: true,\n })\n if (p.isCancel(confirm)) {\n console.log(pc.red(' Cancelled by user.'))\n return\n }\n resetFeatureList = confirm\n }\n }\n\n // Reset agent MD files?\n if (opts.provider) {\n resetAgentMdsFlag = true\n }\n\n // ─── Perform resets ─────────────────────────────────────────────────\n if (resetDb && dbPath) {\n try {\n rmSync(dbPath, { force: true })\n rmSync(`${dbPath}-wal`, { force: true }) // also remove WAL file if it exists (only for SQLite)\n rmSync(`${dbPath}-shm`, { force: true }) // also remove SHM file if it exists (only for SQLite)\n console.log(pc.green(` ✓ Removed ${dbPath}`))\n } catch {\n console.error(pc.red(` ✗ Failed to remove ${dbPath}`))\n }\n }\n\n if (resetFeatureList) {\n try {\n rmSync(featureListPath, { force: true })\n console.log(pc.green(` ✓ Removed ${storageDir}/feature_list.json`))\n // = true\n } catch {\n console.error(pc.red(` ✗ Failed to remove ${featureListPath}`))\n }\n }\n\n if (resetAgentMdsFlag) {\n console.log('')\n await resetAgentMds(cwd, opts.provider || 'claude-code')\n }\n\n if (!resetDb && !resetFeatureList && !resetAgentMdsFlag) {\n console.log(pc.yellow(' Nothing to reset (all items missing or skipped).'))\n return\n }\n\n // ─── Summary ────────────────────────────────────────────────────────\n console.log('')\n console.log(pc.green('✓ Reset complete. Run \"ahk init\" to scaffold a fresh harness.'))\n}\n","import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\nimport { Server } from '@modelcontextprotocol/sdk/server'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport {\n CallToolRequestSchema,\n type CallToolResult,\n ListToolsRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js'\n\nimport { type HarnessDB, openDB } from './db'\nimport { getDoctorStatus } from './doctor'\nimport { slugify } from './materializer/scaffold-utils'\nimport { checkPermissionsSync } from './permissions-check'\n\nimport type { ActionFileRow, AgentName, HarnessConfig, TaskStatus } from '@/types'\n\nconst VERSION = '0.1.0'\n\n// ─── Tool schemas ─────────────────────────────────────────────────────────────\n\nconst TOOLS = [\n {\n name: 'actions.start',\n description: 'Start a new action for a task. Returns an actionId (UUID).',\n inputSchema: {\n type: 'object',\n properties: {\n taskId: { type: 'number', description: 'The task ID from tasks.get' },\n agent: {\n type: 'string',\n description: 'Agent name: lead | explorer | builder | reviewer | custom:<name>',\n },\n },\n required: ['taskId', 'agent'],\n },\n },\n {\n name: 'actions.write',\n description:\n 'Record a section in an action. Standard sections: result, tools_used, blockers, next_steps. Note: files_modified is a plain-text note only — it does NOT populate the files dashboard. Use actions.record_file to register files in the dashboard.',\n inputSchema: {\n type: 'object',\n properties: {\n actionId: { type: 'string', description: 'UUID returned by actions.start' },\n sectionType: {\n type: 'string',\n description:\n 'Section name: result | tools_used | blockers | next_steps | <custom>. Do NOT use files_modified to track files — it is stored as plain text only. Use actions.record_file instead.',\n },\n content: { type: 'string', description: 'Content for this section' },\n },\n required: ['actionId', 'sectionType', 'content'],\n },\n },\n {\n name: 'actions.complete',\n description: 'Close an action with a one-line summary.',\n inputSchema: {\n type: 'object',\n properties: {\n actionId: { type: 'string', description: 'UUID of the action to close' },\n summary: { type: 'string', description: 'One-line summary of what was done' },\n },\n required: ['actionId', 'summary'],\n },\n },\n {\n name: 'actions.get',\n description: 'Get the full action history for a task (all agents, all sections).',\n inputSchema: {\n type: 'object',\n properties: {\n taskId: { type: 'number', description: 'Task ID' },\n },\n required: ['taskId'],\n },\n },\n {\n name: 'tasks.get',\n description: 'List tasks, optionally filtered by status. Excludes archived tasks by default.',\n inputSchema: {\n type: 'object',\n properties: {\n status: {\n type: 'string',\n enum: ['pending', 'in_progress', 'done', 'blocked'],\n description: 'Filter by status (omit for all tasks)',\n },\n includeArchived: {\n type: 'boolean',\n description: 'If true, include archived tasks in results',\n },\n },\n },\n },\n {\n name: 'tasks.claim',\n description:\n 'Atomically claim a pending task. Returns task_already_claimed if another agent got it first.',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'number', description: 'Task ID to claim' },\n agent: { type: 'string', description: 'Your agent name' },\n },\n required: ['id', 'agent'],\n },\n },\n {\n name: 'tasks.update',\n description: 'Change the status of a task.',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'number', description: 'Task ID' },\n status: {\n type: 'string',\n enum: ['pending', 'in_progress', 'done', 'blocked'],\n },\n },\n required: ['id', 'status'],\n },\n },\n {\n name: 'docs.search',\n description: 'Search the project docs folder for content matching a query.',\n inputSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Search terms' },\n },\n required: ['query'],\n },\n },\n {\n name: 'actions.record_file',\n description:\n 'Record a file touched during an action. This is the only way to populate the files-touched count shown in the dashboard. Call once per file.',\n inputSchema: {\n type: 'object',\n properties: {\n actionId: { type: 'string', description: 'UUID returned by actions.start' },\n filePath: { type: 'string', description: 'Absolute or repo-relative path of the file' },\n operation: {\n type: 'string',\n enum: ['read', 'created', 'modified', 'deleted'],\n description: 'What was done to the file',\n },\n notes: { type: 'string', description: 'Optional short note about the change' },\n },\n required: ['actionId', 'filePath', 'operation'],\n },\n },\n {\n name: 'tasks.acceptance.update',\n description: 'Mark an acceptance criterion as met. Use the criterion id from tasks.get.',\n inputSchema: {\n type: 'object',\n properties: {\n criterionId: {\n type: 'number',\n description: 'The id of the acceptance criterion to mark as met',\n },\n },\n required: ['criterionId'],\n },\n },\n {\n name: 'tasks.acceptance.get',\n description:\n 'Given a taskId, returns all acceptance criteria for that task with their id, task_id, criterion text, and met status. Use the returned id values to call tasks.acceptance_update(criterionId).',\n inputSchema: {\n type: 'object',\n properties: {\n taskId: { type: 'number', description: 'Task ID' },\n },\n required: ['taskId'],\n },\n },\n {\n name: 'tasks.add',\n description:\n 'Create a new task in the harness. Use this when the user describes work in natural language. Infer slug, title, description, and acceptance criteria from the conversation. Ask for missing critical info before calling.',\n inputSchema: {\n type: 'object',\n properties: {\n title: { type: 'string', description: 'Short human-readable title for the task' },\n slug: {\n type: 'string',\n description:\n 'URL-safe identifier (lowercase, hyphens). Auto-derived from title if omitted.',\n },\n description: { type: 'string', description: 'Longer description of the task goal' },\n acceptance: {\n type: 'array',\n items: { type: 'string' },\n description: 'List of acceptance criteria (plain sentences)',\n },\n },\n required: ['title'],\n },\n },\n {\n name: 'actions.record_tool',\n description:\n 'Record a tool call made during an action. This is the only way to populate the Tools dashboard. Call once per tool invocation.',\n inputSchema: {\n type: 'object',\n properties: {\n actionId: { type: 'string', description: 'UUID returned by actions.start' },\n toolName: {\n type: 'string',\n description: 'Name of the tool that was called (e.g. Read, Bash, Edit)',\n },\n argsJson: {\n type: 'string',\n description: 'Optional JSON string of the arguments passed to the tool',\n },\n resultSummary: { type: 'string', description: 'Optional short summary of the tool result' },\n },\n required: ['actionId', 'toolName'],\n },\n },\n {\n name: 'tasks.edit',\n description:\n 'Edit an existing task (title, description, acceptance criteria). Omitted fields keep their current values.',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'number', description: 'Task ID to edit' },\n title: { type: 'string', description: 'New title (optional)' },\n description: { type: 'string', description: 'New description (optional, null to clear)' },\n acceptance: {\n type: 'array',\n items: { type: 'string' },\n description: 'New acceptance criteria list (optional, null to keep existing)',\n },\n },\n required: ['id'],\n },\n },\n {\n name: 'tasks.archive',\n description:\n 'Archive a task. Archived tasks are hidden from default views (CLI and dashboard).',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'number', description: 'Task ID to archive' },\n },\n required: ['id'],\n },\n },\n {\n name: 'tasks.unarchive',\n description: 'Unarchive a previously archived task, restoring it to default views.',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'number', description: 'Task ID to unarchive' },\n },\n required: ['id'],\n },\n },\n {\n name: 'permissions.check',\n description:\n 'Check whether the .claude/agents/*.md tool permission lists are in sync with the current canonical permission constants. Returns per-agent diff with missing and extra tools. Call this at session start to detect outdated agent files after an ahk upgrade.',\n inputSchema: { type: 'object', properties: {}, required: [] },\n },\n {\n name: 'deps.snapshot',\n description: 'Snapshot current package.json dependencies to .harness/deps-lock.json',\n inputSchema: { type: 'object' as const, properties: {}, required: [] },\n },\n {\n name: 'deps.check',\n description: 'Compare current package.json against .harness/deps-lock.json and report changes',\n inputSchema: { type: 'object' as const, properties: {}, required: [] },\n },\n {\n name: 'ahk.doctor',\n description:\n 'Check lib version, agent files, and harness skills sync status. Returns structured JSON.',\n inputSchema: { type: 'object', properties: {}, required: [] },\n },\n] as const\n\n// ─── Server ───────────────────────────────────────────────────────────────────\n\nexport async function startMcpServer(config: HarnessConfig, cwd: string): Promise<void> {\n const db = await openDB(config, cwd)\n const docsPath = resolve(cwd, config.project.docsPath)\n\n const server = new Server(\n { name: 'agent-harness-kit', version: VERSION },\n { capabilities: { tools: {} } }\n )\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }))\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params\n const a = (args ?? {}) as Record<string, unknown>\n\n try {\n const result = await dispatch(name, a, db, docsPath, cwd, config)\n return result\n } catch (err) {\n return ok(`Error: ${err instanceof Error ? err.message : String(err)}`, true)\n }\n })\n\n const transport = new StdioServerTransport()\n await server.connect(transport)\n}\n\n// ─── Dispatch ─────────────────────────────────────────────────────────────────\n\nasync function dispatch(\n name: string,\n args: Record<string, unknown>,\n db: HarnessDB,\n docsPath: string,\n cwd: string,\n config: HarnessConfig\n): Promise<CallToolResult> {\n switch (name) {\n case 'actions.start': {\n const taskId = num(args, 'taskId')\n const agent = str(args, 'agent') as AgentName\n const action = await db.startAction(taskId, agent)\n return ok(JSON.stringify({ actionId: action.id, taskId, agent, status: 'in_progress' }))\n }\n\n case 'actions.write': {\n const actionId = str(args, 'actionId')\n const sectionType = str(args, 'sectionType')\n const content = str(args, 'content')\n await db.writeSection(actionId, sectionType, content)\n return ok(JSON.stringify({ actionId, sectionType, recorded: true }))\n }\n\n case 'actions.complete': {\n const actionId = str(args, 'actionId')\n const summary = str(args, 'summary')\n const action = await db.completeAction(actionId, summary)\n return ok(\n JSON.stringify({ actionId, status: action.status, completedAt: action.completed_at })\n )\n }\n\n case 'actions.get': {\n const taskId = num(args, 'taskId')\n const actions = await db.getActionsForTask(taskId)\n const full = await Promise.all(\n actions.map(async (a) => ({\n ...a,\n sections: await db.getActionSections(a.id),\n }))\n )\n return ok(JSON.stringify(full, null, 2))\n }\n\n case 'tasks.get': {\n const status = args['status'] as string | undefined\n const includeArchived = args['includeArchived'] as boolean | undefined\n const tasks = status\n ? await db.getTasks(status as TaskStatus, includeArchived ?? false)\n : await db.getTasks(undefined, includeArchived ?? false)\n return ok(JSON.stringify(tasks, null, 2))\n }\n\n case 'tasks.claim': {\n const id = num(args, 'id')\n const agent = str(args, 'agent')\n const task = await db.claimTask(id, agent)\n if (!task) {\n return ok(JSON.stringify({ error: 'task_already_claimed', taskId: id }))\n }\n return ok(JSON.stringify(task))\n }\n\n case 'tasks.add': {\n const title = str(args, 'title')\n const slug = (args['slug'] as string | undefined) ?? slugify(title)\n const description = args['description'] as string | undefined\n const acceptance = args['acceptance'] as string[] | undefined\n const task = await db.addTask({ slug, title, description, acceptance })\n return ok(JSON.stringify(task))\n }\n\n case 'tasks.update': {\n const id = num(args, 'id')\n const status = str(args, 'status') as TaskStatus\n if (status === 'done') {\n await db.closeOrphanedActions(id)\n }\n const task = await db.updateTaskStatus(id, status)\n return ok(JSON.stringify(task))\n }\n\n case 'docs.search': {\n const query = str(args, 'query')\n const results = searchDocs(docsPath, query)\n return ok(JSON.stringify(results, null, 2))\n }\n\n case 'actions.record_file': {\n const actionId = str(args, 'actionId')\n const filePath = str(args, 'filePath')\n const operation = str(args, 'operation') as ActionFileRow['operation']\n const notes = args['notes'] as string | undefined\n await db.recordFile(actionId, filePath, operation, notes)\n return ok(JSON.stringify({ actionId, filePath, operation, recorded: true }))\n }\n\n case 'tasks.acceptance.update': {\n const criterionId = num(args, 'criterionId')\n await db.markAcceptanceMet(criterionId)\n return ok(JSON.stringify({ criterionId, met: true }))\n }\n\n case 'tasks.acceptance.get': {\n const taskId = num(args, 'taskId')\n const criteria = await db.getTaskAcceptance(taskId)\n return ok(JSON.stringify(criteria, null, 2))\n }\n\n case 'actions.record_tool': {\n const actionId = str(args, 'actionId')\n const toolName = str(args, 'toolName')\n const argsJson = args['argsJson'] as string | undefined\n const resultSummary = args['resultSummary'] as string | undefined\n await db.recordTool(actionId, toolName, argsJson, resultSummary)\n return ok(JSON.stringify({ actionId, toolName, recorded: true }))\n }\n\n case 'tasks.edit': {\n const id = num(args, 'id')\n const title = args['title'] as string | undefined\n const description = args['description'] as string | null | undefined\n const acceptance = args['acceptance'] as string[] | null | undefined\n\n const task = await db.getTaskById(id)\n if (!task) return ok(JSON.stringify({ error: 'Task not found', taskId: id }), true)\n\n await db.updateTask(id, {\n title,\n description: description !== undefined ? description : undefined,\n })\n if (acceptance !== undefined && acceptance !== null) {\n await db.updateTaskAcceptance(id, acceptance)\n }\n const updated = await db.getTaskById(id)\n return ok(JSON.stringify(updated))\n }\n\n case 'tasks.archive': {\n const id = num(args, 'id')\n const task = await db.archiveTask(id)\n return ok(JSON.stringify(task))\n }\n\n case 'tasks.unarchive': {\n const id = num(args, 'id')\n const task = await db.unarchiveTask(id)\n return ok(JSON.stringify(task))\n }\n\n case 'permissions.check': {\n const result = checkPermissionsSync(cwd, config)\n return ok(JSON.stringify(result, null, 2))\n }\n\n case 'deps.snapshot': {\n const pkgPath = join(cwd, 'package.json')\n if (!existsSync(pkgPath)) {\n return ok('package.json not found in project root', true)\n }\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as {\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n }\n const snapshot = {\n capturedAt: new Date().toISOString(),\n dependencies: pkg.dependencies ?? {},\n devDependencies: pkg.devDependencies ?? {},\n }\n const harnessDir = join(cwd, '.harness')\n mkdirSync(harnessDir, { recursive: true })\n writeFileSync(join(harnessDir, 'deps-lock.json'), JSON.stringify(snapshot, null, 2), 'utf8')\n return ok(\n JSON.stringify({\n message: 'Snapshot saved to .harness/deps-lock.json',\n capturedAt: snapshot.capturedAt,\n })\n )\n }\n\n case 'deps.check': {\n const pkgPath = join(cwd, 'package.json')\n const lockPath = join(cwd, '.harness', 'deps-lock.json')\n if (!existsSync(pkgPath)) {\n return ok('package.json not found in project root', true)\n }\n if (!existsSync(lockPath)) {\n return ok(\n JSON.stringify({\n status: 'no-snapshot',\n message: 'No deps-lock.json found. Run deps.snapshot first to establish a baseline.',\n })\n )\n }\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as {\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n }\n const lock = JSON.parse(readFileSync(lockPath, 'utf8')) as {\n capturedAt: string\n dependencies: Record<string, string>\n devDependencies: Record<string, string>\n }\n const current = { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) }\n const previous = { ...(lock.dependencies ?? {}), ...(lock.devDependencies ?? {}) }\n\n const added: string[] = []\n const removed: string[] = []\n const majorBumps: Array<{ name: string; from: string; to: string }> = []\n\n for (const [name, version] of Object.entries(current)) {\n if (!(name in previous)) {\n added.push(`${name}@${version}`)\n } else {\n const prevMajor = parseInt(\n previous[name].replace(/^[\\^~>=v]/, '').split('.')[0] ?? '0',\n 10\n )\n const curMajor = parseInt(version.replace(/^[\\^~>=v]/, '').split('.')[0] ?? '0', 10)\n if (!isNaN(prevMajor) && !isNaN(curMajor) && curMajor > prevMajor) {\n majorBumps.push({ name, from: previous[name], to: version })\n }\n }\n }\n for (const depName of Object.keys(previous)) {\n if (!(depName in current)) {\n removed.push(depName)\n }\n }\n\n const significant = added.length > 0 || removed.length > 0 || majorBumps.length > 0\n const advisory = significant\n ? 'Significant dependency changes detected. Consider running `pnpx autoskills` (or `npx autoskills` if pnpm is unavailable) to refresh agent skills. Clearing stale skills before re-running is recommended.'\n : 'No significant dependency changes detected.'\n\n return ok(\n JSON.stringify({\n significant,\n added,\n removed,\n majorBumps,\n advisory,\n snapshotDate: lock.capturedAt,\n })\n )\n }\n\n case 'ahk.doctor': {\n const status = await getDoctorStatus(cwd)\n const result = {\n lib: { current: status.lib.current, latest: status.lib.latest, outdated: status.lib.outdated },\n agents: {\n missing: status.agents.filter((a) => a.status === 'missing').map((a) => a.name),\n outdated: status.agents.filter((a) => a.status === 'outdated').map((a) => a.name),\n ok: status.agents.filter((a) => a.status === 'ok').map((a) => a.name),\n },\n skills: {\n missing: status.skills.filter((s) => s.status === 'missing').map((s) => s.name),\n outdated: status.skills.filter((s) => s.status === 'outdated').map((s) => s.name),\n ok: status.skills.filter((s) => s.status === 'ok').map((s) => s.name),\n },\n }\n return ok(JSON.stringify(result, null, 2))\n }\n\n default:\n return ok(`Unknown tool: ${name}`, true)\n }\n}\n\n// ─── docs.search implementation ───────────────────────────────────────────────\n\ninterface DocSnippet {\n file: string\n line: number\n text: string\n}\n\nfunction searchDocs(docsPath: string, query: string, maxResults = 10): DocSnippet[] {\n const terms = query.toLowerCase().split(/\\s+/).filter(Boolean)\n const results: DocSnippet[] = []\n\n try {\n const files = collectMarkdownFiles(docsPath)\n for (const file of files) {\n if (results.length >= maxResults) break\n try {\n const content = readFileSync(file, 'utf8')\n const lines = content.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const lower = lines[i].toLowerCase()\n if (terms.every((t) => lower.includes(t))) {\n results.push({\n file: file.replace(docsPath + '/', ''),\n line: i + 1,\n text: lines[i].trim(),\n })\n if (results.length >= maxResults) break\n }\n }\n } catch {\n // skip unreadable files\n }\n }\n } catch {\n return [{ file: '', line: 0, text: `docs path not found: ${docsPath}` }]\n }\n\n return results\n}\n\nfunction collectMarkdownFiles(dir: string): string[] {\n const files: string[] = []\n try {\n for (const entry of readdirSync(dir)) {\n const full = join(dir, entry)\n const stat = statSync(full)\n if (stat.isDirectory()) {\n files.push(...collectMarkdownFiles(full))\n } else if (entry.endsWith('.md') || entry.endsWith('.txt')) {\n files.push(full)\n }\n }\n } catch {\n // directory may not exist yet\n }\n return files\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction ok(text: string, isError = false): CallToolResult {\n return { content: [{ type: 'text' as const, text }], isError }\n}\n\nfunction str(args: Record<string, unknown>, key: string): string {\n const v = args[key]\n if (typeof v !== 'string') throw new Error(`${key} must be a string`)\n return v\n}\n\nfunction num(args: Record<string, unknown>, key: string): number {\n const v = args[key]\n if (typeof v !== 'number') throw new Error(`${key} must be a number`)\n return v\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport {\n MCP_CLAUDE_PERMISSIONS_BUILDER,\n MCP_CLAUDE_PERMISSIONS_CONSULTANT,\n MCP_CLAUDE_PERMISSIONS_EXPLORER,\n MCP_CLAUDE_PERMISSIONS_LEAD,\n MCP_CLAUDE_PERMISSIONS_REVIEWER,\n} from './materializer/mcp-merge'\n\nimport type { HarnessConfig } from '@/types'\n\nexport type AgentName = 'lead' | 'explorer' | 'consultant' | 'builder' | 'reviewer'\n\nexport interface AgentSyncResult {\n ok: boolean\n missing: string[]\n extra: string[]\n}\n\nexport interface SyncCheckResult {\n in_sync: boolean\n agents?: Record<AgentName, AgentSyncResult>\n}\n\nconst CANONICAL: Record<AgentName, string[]> = {\n lead: [...MCP_CLAUDE_PERMISSIONS_LEAD],\n explorer: [...MCP_CLAUDE_PERMISSIONS_EXPLORER],\n consultant: [...MCP_CLAUDE_PERMISSIONS_CONSULTANT],\n builder: [...MCP_CLAUDE_PERMISSIONS_BUILDER],\n reviewer: [...MCP_CLAUDE_PERMISSIONS_REVIEWER],\n}\n\nfunction parseToolsFromFrontmatter(content: string): string[] {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---/m)\n if (!match) return []\n const fm = match[1]\n const toolsMatch = fm.match(/^tools:\\n((?: - [^\\n]+\\n?)*)/m)\n if (!toolsMatch) return []\n return toolsMatch[1]\n .split('\\n')\n .map((l) => l.trim().replace(/^- /, ''))\n .filter((l) => l.startsWith('mcp__'))\n}\n\nexport function checkPermissionsSync(cwd: string, config: HarnessConfig): SyncCheckResult {\n if (config.provider !== 'claude-code') {\n return { in_sync: true }\n }\n\n const agents: Record<AgentName, AgentSyncResult> = {} as Record<AgentName, AgentSyncResult>\n let in_sync = true\n\n for (const agent of ['lead', 'explorer', 'consultant', 'builder', 'reviewer'] as AgentName[]) {\n const filePath = join(cwd, '.claude', 'agents', `${agent}.md`)\n if (!existsSync(filePath)) {\n const missing = CANONICAL[agent]\n agents[agent] = { ok: false, missing, extra: [] }\n in_sync = false\n continue\n }\n const content = readFileSync(filePath, 'utf-8')\n const installed = parseToolsFromFrontmatter(content)\n const canonical = CANONICAL[agent]\n const missing = canonical.filter((t) => !installed.includes(t))\n const extra = installed.filter((t) => !canonical.includes(t))\n const ok = missing.length === 0 && extra.length === 0\n if (!ok) in_sync = false\n agents[agent] = { ok, missing, extra }\n }\n\n return { in_sync, agents }\n}\n","import { loadConfig } from '@/core/config'\nimport { startMcpServer } from '@/core/mcp-server'\nimport { checkPermissionsSync } from '@/core/permissions-check'\n\ninterface ServeOptions {\n port?: number\n}\n\nexport async function runServe(cwd: string, opts: ServeOptions): Promise<void> {\n const config = await loadConfig(cwd)\n\n if (opts.port) {\n config.tools.mcp.port = opts.port\n }\n\n // MCP server runs on stdio — do not write to stdout after this point.\n // Stderr is used for diagnostics.\n process.stderr.write(`[agent-harness-kit] MCP server starting (stdio)\\n`)\n\n const syncResult = checkPermissionsSync(cwd, config)\n if (!syncResult.in_sync && syncResult.agents) {\n const affected = Object.entries(syncResult.agents)\n .filter(([, r]) => !r.ok)\n .map(([name, r]) => {\n const parts: string[] = []\n if (r.missing.length) parts.push(`missing: ${r.missing.map(t => t.replace('mcp__agent-harness-kit__', '')).join(', ')}`)\n if (r.extra.length) parts.push(`extra: ${r.extra.map(t => t.replace('mcp__agent-harness-kit__', '')).join(', ')}`)\n return `${name} (${parts.join('; ')})`\n })\n .join('\\n ')\n process.stderr.write(`[agent-harness-kit] Agent permissions out of sync. Run: ahk build --sync\\n ${affected}\\n`)\n }\n\n await startMcpServer(config, cwd)\n}\n","import Table from 'cli-table3'\nimport pc from 'picocolors'\n\nimport { loadConfig } from '@/core/config'\nimport { openDB } from '@/core/db'\n\ninterface StatusOptions {\n json?: boolean\n}\n\nconst STATUS_COLOR: Record<string, (s: string) => string> = {\n pending: (s) => pc.dim(s),\n in_progress: (s) => pc.cyan(s),\n done: (s) => pc.green(s),\n blocked: (s) => pc.red(s),\n}\n\nexport async function runStatus(cwd: string, opts: StatusOptions): Promise<void> {\n const config = await loadConfig(cwd)\n const db = await openDB(config, cwd)\n\n try {\n const tasks = await db.getTasks()\n const summary = await db.getStatusSummary()\n\n if (opts.json) {\n const actions = await Promise.all(\n tasks.map(async (t) => ({\n ...t,\n actions: await db.getActionsForTask(t.id),\n acceptance: await db.getTaskAcceptance(t.id),\n })),\n )\n const archivedCount = (await db.getArchivedTasks()).length\n console.log(JSON.stringify({ tasks: actions, summary, archivedCount }, null, 2))\n return\n }\n\n if (tasks.length === 0) {\n console.log(pc.dim('No tasks yet. Run: ahk task add'))\n return\n }\n\n const table = new Table({\n head: ['ID', 'Slug', 'Title', 'Status', 'Assigned', 'Started'].map((h) => pc.bold(h)),\n style: { head: [], border: [] },\n })\n\n for (const t of tasks) {\n const colorFn = STATUS_COLOR[t.status] ?? ((s: string) => s)\n table.push([\n String(t.id),\n t.slug,\n t.title.slice(0, 40),\n colorFn(t.status),\n t.assigned_to ?? '—',\n t.started_at ? t.started_at.slice(0, 10) : '—',\n ])\n }\n\n console.log(table.toString())\n\n // Active actions\n const inProgress = tasks.filter((t) => t.status === 'in_progress')\n if (inProgress.length > 0) {\n console.log('')\n console.log(pc.bold('Active actions:'))\n for (const t of inProgress) {\n const actions = await db.getActionsForTask(t.id)\n const active = actions.filter((a) => a.status === 'in_progress')\n for (const a of active) {\n console.log(` ${pc.cyan(a.agent.padEnd(10))} → task #${t.id} ${t.slug}`)\n }\n }\n }\n\n // Summary line\n console.log('')\n const parts = summary.map((s) => {\n const fn = STATUS_COLOR[s.status] ?? ((x: string) => x)\n return `${fn(s.status)}: ${s.total}`\n })\n console.log(pc.dim('Tasks — ') + parts.join(pc.dim(' | ')))\n\n const archivedTasks = await db.getArchivedTasks()\n if (archivedTasks.length > 0) {\n console.log(pc.dim(`${archivedTasks.length} archived (use \\`ahk task list --archived\\` to view)`))\n }\n } finally {\n await db.close()\n }\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\nimport pc from 'picocolors'\n\nimport { loadConfig } from '@/core/config'\nimport { openDB } from '@/core/db'\n\nimport type { TaskSeed } from '@/types'\n\ninterface SyncOptions {\n dryRun?: boolean\n direction?: 'in' | 'out' | 'both'\n}\n\nexport async function runSync(cwd: string, opts: SyncOptions): Promise<void> {\n const config = await loadConfig(cwd)\n const direction = opts.direction ?? 'both'\n const featureListPath = resolve(join(cwd, config.storage.dir, 'feature_list.json'))\n\n const db = await openDB(config, cwd)\n\n try {\n if (direction === 'in' || direction === 'both') {\n await syncIn(featureListPath, db, opts.dryRun ?? false)\n }\n\n if (direction === 'out' || direction === 'both') {\n await syncOut(db, cwd, opts.dryRun ?? false)\n }\n } finally {\n await db.close()\n }\n}\n\nasync function syncIn(\n featureListPath: string,\n db: Awaited<ReturnType<typeof openDB>>,\n dryRun: boolean\n): Promise<void> {\n if (!existsSync(featureListPath)) {\n console.log(pc.dim(`feature_list.json not found at ${featureListPath} — skipping in-sync`))\n return\n }\n\n let seeds: TaskSeed[]\n try {\n seeds = JSON.parse(readFileSync(featureListPath, 'utf8')) as TaskSeed[]\n } catch (err) {\n console.error(pc.red(`Failed to parse feature_list.json: ${err}`))\n process.exit(1)\n }\n\n if (dryRun) {\n console.log(pc.bold('Dry run — in-sync (feature_list.json → SQLite):'))\n for (const t of seeds) {\n const existing = await db.getTaskBySlug(t.slug)\n console.log(` ${existing ? pc.dim('skip') : pc.green('add ')} ${t.slug}`)\n }\n return\n }\n\n const result = await db.syncFromFeatureList(seeds)\n console.log(pc.green(`✓ In-sync: ${result.added} added, ${result.skipped} already existed`))\n}\n\nasync function syncOut(\n db: Awaited<ReturnType<typeof openDB>>,\n cwd: string,\n dryRun: boolean\n): Promise<void> {\n if (dryRun) {\n const tasks = await db.getTasks()\n console.log(pc.bold('Dry run — out-sync (SQLite → feature_list.json):'))\n console.log(` ${tasks.length} tasks would be written`)\n return\n }\n\n await db.writeFeatureList(cwd)\n console.log(pc.green('✓ Out-sync: feature_list.json updated'))\n}\n","import * as p from '@clack/prompts'\nimport pc from 'picocolors'\n\nimport { loadConfig } from '@/core/config'\nimport { openDB } from '@/core/db'\nimport { slugify } from '@/core/materializer/scaffold-utils'\nimport { taskDescriptionSchema, taskTitleSchema } from '@/schema/task'\nimport { cliFormWithRetry } from '@/utils/form'\n\nexport async function runTaskAdd(cwd: string): Promise<void> {\n p.intro(pc.bold('agent-harness-kit — add task'))\n\n const title = await cliFormWithRetry(\n async () => {\n const val = await p.text({ message: 'Task title' })\n if (p.isCancel(val)) { p.cancel('Cancelled.'); process.exit(0) }\n return (val as string).trim()\n },\n taskTitleSchema,\n )\n\n const description = await cliFormWithRetry(\n async () => {\n const val = await p.text({\n message: 'Description (what and why)',\n placeholder: 'Describe the task in more detail, including any relevant context or instructions for the agents.',\n })\n if (p.isCancel(val)) { p.cancel('Cancelled.'); process.exit(0) }\n return (val as string).trim()\n },\n taskDescriptionSchema,\n )\n\n const acceptance: string[] = []\n p.log.info('Acceptance criteria — one per line, empty line to finish')\n while (true) {\n const val = await p.text({ message: '>', placeholder: 'Criterion (or press Enter to finish)' })\n if (p.isCancel(val) || !val || !(val as string).trim()) break\n acceptance.push((val as string).trim())\n }\n\n const spinner = p.spinner()\n spinner.start('Saving...')\n\n try {\n const config = await loadConfig(cwd)\n const db = await openDB(config, cwd)\n\n const slug = slugify(title)\n const task = await db.addTask({ slug, title, description: description || undefined, acceptance })\n await db.writeFeatureList(cwd)\n await db.close()\n\n spinner.stop('')\n console.log(pc.green(`✓ Task #${task.id} added — ${task.slug} (pending)`))\n console.log(pc.cyan('→') + ' ' + pc.cyan('ahk status') + ' to see all tasks')\n } catch (err) {\n spinner.stop(pc.red('Failed'))\n p.log.error(err instanceof Error ? err.message : String(err))\n process.exit(1)\n }\n}\n\n","import { spawnSync } from 'node:child_process'\nimport { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport pc from 'picocolors'\n\nimport { loadConfig } from '@/core/config'\nimport { openDB } from '@/core/db'\n\nexport async function runTaskDone(cwd: string, idOrSlug: string): Promise<void> {\n const config = await loadConfig(cwd)\n\n // Run health check first if required\n if (config.health.required) {\n const scriptPath = resolve(cwd, config.health.scriptPath)\n if (existsSync(scriptPath)) {\n const result = spawnSync('bash', [scriptPath], { cwd, stdio: 'pipe', encoding: 'utf8' })\n if (result.status !== 0) {\n console.error(pc.red('✗ Health check failed — cannot mark task as done.'))\n if (result.stdout) console.error(result.stdout)\n if (result.stderr) console.error(result.stderr)\n process.exit(1)\n }\n }\n }\n\n const db = await openDB(config, cwd)\n\n try {\n const parsed = parseInt(idOrSlug, 10)\n const isId = !isNaN(parsed)\n const task = isId ? await db.getTaskById(parsed) : await db.getTaskBySlug(idOrSlug)\n\n if (!task) {\n console.error(pc.red(`Task not found: ${idOrSlug}`))\n process.exit(1)\n }\n\n if (task.status === 'done') {\n console.log(pc.dim(`Task #${task.id} is already done.`))\n return\n }\n\n await db.updateTaskStatus(task.id, 'done')\n await db.writeFeatureList(cwd)\n\n console.log(pc.green(`✓ Task #${task.id} — ${task.slug} marked as done`))\n } finally {\n await db.close()\n }\n}\n","import * as p from '@clack/prompts'\nimport pc from 'picocolors'\nimport { loadConfig } from '@/core/config'\nimport { openDB } from '@/core/db'\nimport { slugify } from '@/core/materializer/scaffold-utils'\n\nexport async function runTaskEdit(cwd: string): Promise<void> {\n p.intro(pc.bold('agent-harness-kit — edit task'))\n\n const config = await loadConfig(cwd)\n const db = await openDB(config, cwd)\n\n try {\n // 1. Get all non-done tasks\n const allTasks = await db.getTasks()\n const activeTasks = allTasks.filter(t => t.status !== 'done')\n\n if (activeTasks.length === 0) {\n p.log.error('No active tasks to edit.')\n return\n }\n\n // 2. Let user select a task\n const taskId = await p.select({\n message: 'Select a task to edit',\n options: activeTasks.map(t => ({\n label: `#${t.id} — ${t.title} (${t.slug})`,\n value: t.id,\n })),\n })\n if (p.isCancel(taskId)) { p.cancel('Cancelled.'); process.exit(0) }\n\n const task = await db.getTaskById(taskId as number)\n if (!task) { p.log.error('Task not found'); process.exit(1) }\n\n // 3. Edit title\n const title = await p.text({\n message: 'Title',\n initialValue: task.title,\n })\n if (p.isCancel(title)) { p.cancel('Cancelled.'); process.exit(0) }\n\n // 4. Edit description\n const description = await p.text({\n message: 'Description (what and why)',\n initialValue: task.description ?? '',\n })\n if (p.isCancel(description)) { p.cancel('Cancelled.'); process.exit(0) }\n\n // 5. Edit acceptance criteria\n const currentAcceptance = await db.getTaskAcceptance(task.id)\n const newAcceptance: string[] = []\n\n p.log.info('Acceptance criteria — edit each, empty to delete. Add new ones at the end.')\n\n // Edit existing criteria\n for (let i = 0; i < currentAcceptance.length; i++) {\n const ac = currentAcceptance[i]\n const val = await p.text({\n message: `#${i + 1}/${currentAcceptance.length}`,\n initialValue: ac.criterion,\n defaultValue: '',\n })\n if (p.isCancel(val)) { p.cancel('Cancelled.'); process.exit(0) }\n const trimmed = (val as string).trim()\n if (trimmed !== '') {\n newAcceptance.push(trimmed)\n }\n // If empty, the criterion is deleted (not pushed)\n }\n\n // Add new criteria\n while (true) {\n const val = await p.text({ message: 'New acceptance criterion', placeholder: '(press Enter to finish)' })\n if (p.isCancel(val) || !val || !(val as string).trim()) break\n newAcceptance.push((val as string).trim())\n }\n\n // 6. Save\n const spinner = p.spinner()\n spinner.start('Saving...')\n\n try {\n const newSlug = slugify(title as string)\n await db.updateTask(task.id, {\n title: title as string,\n description: (description as string).trim() || undefined,\n slug: newSlug,\n })\n await db.updateTaskAcceptance(task.id, newAcceptance)\n await db.writeFeatureList(cwd)\n\n spinner.stop('')\n console.log(pc.green(`✓ Task #${task.id} updated — ${newSlug}`))\n } catch (err) {\n spinner.stop(pc.red('Failed'))\n p.log.error(err instanceof Error ? err.message : String(err))\n process.exit(1)\n }\n } finally {\n await db.close()\n }\n}\n","import Table from 'cli-table3'\nimport pc from 'picocolors'\n\nimport { loadConfig } from '@/core/config'\nimport { openDB } from '@/core/db'\n\nimport type { TaskStatus } from '@/types'\n\ninterface TaskListOptions {\n status?: string\n json?: boolean\n archived?: boolean\n includeArchived?: boolean\n}\n\nconst STATUS_COLOR: Record<string, (s: string) => string> = {\n pending: (s) => pc.dim(s),\n in_progress: (s) => pc.cyan(s),\n done: (s) => pc.green(s),\n blocked: (s) => pc.red(s),\n}\n\nexport async function runTaskList(cwd: string, opts: TaskListOptions): Promise<void> {\n const config = await loadConfig(cwd)\n const db = await openDB(config, cwd)\n\n try {\n const validStatuses: TaskStatus[] = ['pending', 'in_progress', 'done', 'blocked']\n const filterStatus =\n opts.status && validStatuses.includes(opts.status as TaskStatus)\n ? (opts.status as TaskStatus)\n : undefined\n\n const tasks = opts.archived\n ? await db.getArchivedTasks()\n : filterStatus\n ? await db.getTasks(filterStatus, opts.includeArchived ?? false)\n : await db.getTasks(undefined, opts.includeArchived ?? false)\n\n if (opts.json) {\n console.log(JSON.stringify(tasks, null, 2))\n return\n }\n\n if (tasks.length === 0) {\n let msg = 'No tasks'\n if (filterStatus) msg += ` with status: ${filterStatus}`\n if (opts.archived) msg += ' (archived)'\n console.log(pc.dim(msg + '.'))\n return\n }\n\n const table = new Table({\n head: ['ID', 'Slug', 'Title', 'Status'].map((h) => pc.bold(h)),\n style: { head: [], border: [] },\n })\n\n for (const t of tasks) {\n const colorFn = STATUS_COLOR[t.status] ?? ((s: string) => s)\n table.push([String(t.id), t.slug, t.title.slice(0, 50), colorFn(t.status)])\n }\n\n console.log(table.toString())\n\n if (!opts.archived && !opts.includeArchived) {\n const archivedTasks = await db.getArchivedTasks()\n if (archivedTasks.length > 0) {\n console.log(pc.dim(`${archivedTasks.length} archived task${archivedTasks.length !== 1 ? 's' : ''} (use --archived to view)`))\n }\n }\n } finally {\n await db.close()\n }\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport pc from 'picocolors'\n\nimport { pkg } from '@/core/package-data'\n\n/**\n * Determines whether `@cardor/agent-harness-kit` is available as a local\n * dependency of the project at `cwd`, or whether `cwd` IS the package\n * itself (self-dev case, e.g. working inside this repo).\n *\n * Commands that call `loadConfig(cwd)` rely on jiti resolving modules\n * relative to the package's own location (`import.meta.url`). When the\n * package is only installed globally, jiti resolves relative to the\n * global install path instead of the project's local `node_modules`,\n * breaking config/dependency resolution. This check lets the CLI warn\n * and exit before running any command logic in that case.\n */\nexport function isLocalInstallSatisfied(cwd: string): boolean {\n // Self-dev case: cwd is the agent-harness-kit repo itself, so there is\n // no (and should be no) node_modules/@cardor/agent-harness-kit entry.\n const selfPkgPath = join(cwd, 'package.json')\n let projectPkg: Record<string, unknown> | null = null\n if (existsSync(selfPkgPath)) {\n try {\n const selfPkg = JSON.parse(readFileSync(selfPkgPath, 'utf8'))\n if (selfPkg?.name === pkg.name) return true\n projectPkg = selfPkg\n } catch {\n // Malformed package.json — ignore and fall through to the node_modules check.\n }\n }\n\n const [scope, name] = pkg.name.split('/')\n const localPath = pkg.name.startsWith('@') ? join(cwd, 'node_modules', scope, name) : join(cwd, 'node_modules', pkg.name)\n\n if (existsSync(localPath)) return true\n\n // Yarn Berry with Plug'n'Play (PnP) never creates a node_modules directory\n // at all, so the check above always fails there even when the package IS\n // correctly declared and resolvable via the PnP loader. Detect PnP via its\n // generated loader files and fall back to checking that the package is\n // declared as a dependency in package.json — the only signal available\n // without depending on a node_modules layout PnP intentionally omits.\n const isPnp = existsSync(join(cwd, '.pnp.cjs')) || existsSync(join(cwd, '.pnp.loader.mjs'))\n if (isPnp && projectPkg) {\n const deps = {\n ...((projectPkg.dependencies as Record<string, unknown>) ?? {}),\n ...((projectPkg.devDependencies as Record<string, unknown>) ?? {}),\n }\n if (Object.prototype.hasOwnProperty.call(deps, pkg.name)) return true\n }\n\n return false\n}\n\n/**\n * Prints a warning explaining that the package must be installed locally,\n * with the exact command to fix it. Styled to match the rest of the CLI.\n */\nexport function printLocalInstallWarning(): void {\n console.error(pc.red(`✗ ${pkg.name} must be installed locally in this project.`))\n console.error(pc.dim(` Run: npm install --save-dev ${pkg.name}`))\n console.error(pc.dim(' (or the equivalent for your package manager: pnpm add -D, yarn add --dev, bun add -d)'))\n}\n","// src/core/update-check.ts\nimport pc from 'picocolors'\n\nimport { drawBox } from '@/commands/init-helpers'\n\nimport { pkg } from './package-data'\n\nconst REGISTRY_URL = `https://registry.npmjs.org/${pkg.name}/latest`\nconst TIMEOUT_MS = 2500\n\ninterface UpdateInfo {\n current: string\n latest: string\n}\n\nexport function checkForUpdate(currentVersion: string): Promise<UpdateInfo | null> {\n return new Promise((resolve) => {\n const timer = setTimeout(() => resolve(null), TIMEOUT_MS)\n\n fetch(REGISTRY_URL)\n .then((res) => res.json())\n .then((data) => {\n clearTimeout(timer)\n const latest = (data as { version: string }).version\n resolve(isNewer(latest, currentVersion) ? { current: currentVersion, latest } : null)\n })\n .catch(() => {\n clearTimeout(timer)\n resolve(null)\n })\n })\n}\n\nexport function printUpdateMessage({ current, latest }: UpdateInfo): void {\n const lines = [\n ` Update available ${pc.dim(current)} → ${pc.green(latest)} `,\n ` Run: ${pc.cyan(`pnpm i ${pkg.name}@${latest}`)} `,\n ]\n\n drawBox(lines)\n}\n\nfunction isNewer(latest: string, current: string): boolean {\n const toNum = (v: string) => v.split('.').map(Number)\n const [lMaj, lMin, lPat] = toNum(latest)\n const [cMaj, cMin, cPat] = toNum(current)\n\n if (lMaj !== cMaj) return lMaj > cMaj\n if (lMin !== cMin) return lMin > cMin\n\n return lPat > cPat\n}\n"],"mappings":"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","names":["pc","existsSync","mkdirSync","readFileSync","writeFileSync","join","resolve","cwd","join","cwd","pkgPath","pkg","existsSync","mkdirSync","readFileSync","writeFileSync","existsSync","mkdirSync","readFileSync","writeFileSync","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","join","resolve","fileURLToPath","readFileSync","dirname","join","dirname","join","readFileSync","__dirname","dirname","fileURLToPath","cwd","join","existsSync","mkdirSync","resolve","writeFileSync","readFileSync","cwd","existsSync","join","write","mkdirSync","resolve","writeFileSync","readFileSync","existsSync","mkdirSync","writeFileSync","join","resolve","cwd","write","join","mkdirSync","resolve","writeFileSync","existsSync","existsSync","mkdirSync","writeFileSync","join","resolve","cwd","write","join","mkdirSync","resolve","writeFileSync","existsSync","cwd","spinner","dirname","join","resolve","fileURLToPath","pc","watch","existsSync","readFileSync","join","resolve","readFileSync","task","join","existsSync","watch","__dirname","dirname","fileURLToPath","cwd","resolve","join","pc","pc","existsSync","readFileSync","dirname","join","fileURLToPath","existsSync","dirname","join","fileURLToPath","require","p","__dirname","dirname","fileURLToPath","v","join","existsSync","readFileSync","cwd","__dirname","pc","cwd","writeFileSync","pc","cwd","pc","writeFileSync","existsSync","join","resolve","pc","ok","pc","cwd","resolve","existsSync","join","mkdirSync","writeFileSync","join","p","pc","homedir","homedir","v","p","v","existsSync","readFileSync","join","pc","cwd","pkgPath","pkg","str","cwd","pc","spinner","writeFileSync","join","mkdirSync","name","p","pc","cwd","pc","spinner","existsSync","mkdirSync","writeFileSync","homedir","dirname","join","resolve","pc","log","cwd","join","resolve","mkdirSync","writeFileSync","dirname","existsSync","homedir","pc","existsSync","rmSync","join","resolve","p","pc","cwd","resolve","existsSync","pc","confirm","join","rmSync","existsSync","mkdirSync","readdirSync","readFileSync","writeFileSync","join","resolve","existsSync","readFileSync","join","cwd","join","existsSync","missing","readFileSync","ok","cwd","resolve","ok","task","pkgPath","join","existsSync","pkg","readFileSync","mkdirSync","writeFileSync","name","readdirSync","text","v","cwd","pc","pc","cwd","existsSync","readFileSync","join","resolve","pc","cwd","resolve","join","existsSync","pc","readFileSync","p","pc","cwd","pc","spinner","task","spawnSync","existsSync","resolve","pc","cwd","resolve","existsSync","spawnSync","pc","task","p","pc","cwd","pc","task","spinner","Table","pc","STATUS_COLOR","pc","cwd","Table","existsSync","readFileSync","join","pc","cwd","join","existsSync","readFileSync","pc","pc","REGISTRY_URL","TIMEOUT_MS","resolve","isNewer","pc","v","pc"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/commands/build.ts","../src/core/materializer/claude-code.ts","../src/utils/file.ts","../src/core/materializer/detect-package-manager.ts","../src/core/materializer/mcp-merge.ts","../src/core/materializer/scaffold-utils.ts","../src/core/materializer/templates.ts","../src/core/materializer/codex-cli.ts","../src/core/materializer/opencode.ts","../src/core/materializer/index.ts","../src/commands/dashboard.ts","../src/core/dashboard-server.ts","../src/core/port-utils.ts","../src/commands/doctor.ts","../src/core/doctor.ts","../src/core/package-data.ts","../src/commands/export.ts","../src/commands/health.ts","../src/commands/init.ts","../src/core/materializer/global-sync.ts","../src/schema/init.ts","../src/schema/task.ts","../src/utils/form.ts","../src/commands/init-helpers.ts","../src/commands/migrate.ts","../src/commands/migrate-storage.ts","../src/commands/reset.ts","../src/core/mcp-server.ts","../src/core/permissions-check.ts","../src/commands/serve.ts","../src/commands/status.ts","../src/commands/sync.ts","../src/commands/task/add.ts","../src/commands/task/done.ts","../src/commands/task/edit.ts","../src/commands/task/list.ts","../src/core/local-install-guard.ts","../src/core/update-check.ts"],"sourcesContent":["import { Command } from 'commander'\nimport pc from 'picocolors'\n\nimport { runBuild } from '@/commands/build'\nimport { runDashboard } from '@/commands/dashboard'\nimport { runDoctor } from '@/commands/doctor'\nimport { runExport } from '@/commands/export'\nimport { runHealth } from '@/commands/health'\nimport { runInit } from '@/commands/init'\nimport { runMigrate } from '@/commands/migrate'\nimport { runMigrateStorage } from '@/commands/migrate-storage'\nimport { runReset } from '@/commands/reset'\nimport { runServe } from '@/commands/serve'\nimport { runStatus } from '@/commands/status'\nimport { runSync } from '@/commands/sync'\nimport { runTaskAdd, runTaskDone, runTaskEdit, runTaskList } from '@/commands/task/index'\nimport { isLocalInstallSatisfied, printLocalInstallWarning } from '@/core/local-install-guard'\nimport { pkg } from '@/core/package-data'\nimport { checkForUpdate, printUpdateMessage } from '@/core/update-check'\n\nconst cwd = process.cwd()\n\nconst updateCheck = checkForUpdate(pkg.version)\n\nconst program = new Command()\n\nprogram\n .name('ahk')\n .description('agent-harness-kit — CLI scaffolding for multi-agent harness systems')\n .version(pkg.version, '-v, --version')\n\n// ─── init ─────────────────────────────────────────────────────────────────────\nprogram\n .command('init')\n .description('Scaffold a harness interactively in the current directory')\n .option('--name <name>', 'Project name (skip prompt)')\n .option('--provider <provider>', 'AI provider: claude-code | opencode (skip prompt)')\n .option('--docs <path>', 'Docs folder path (skip prompt)')\n .option('--tasks <adapter>', 'Task adapter: local | jira | linear (skip prompt)')\n .option('--storage-scope <scope>', 'Storage scope: local | global (skip prompt)')\n .action(async (opts) => {\n await runInit(cwd, opts)\n })\n\n// ─── build ────────────────────────────────────────────────────────────────────\nprogram\n .command('build')\n .description('Regenerate AGENTS.md and provider files from agent-harness-kit.config.ts')\n .option('--watch', 'Rebuild on config changes')\n .option('--sync', 'Sync tools: frontmatter in existing .claude/agents/*.md to match current permission constants')\n .action(async (opts) => {\n await runBuild(cwd, opts)\n })\n\n// ─── health ───────────────────────────────────────────────────────────────────\nprogram\n .command('health')\n .description('Run health.sh and report result')\n .action(async () => {\n await runHealth(cwd)\n })\n\n// ─── status ───────────────────────────────────────────────────────────────────\nprogram\n .command('status')\n .description('Show task table and active actions')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n await runStatus(cwd, opts)\n })\n\n// ─── sync ─────────────────────────────────────────────────────────────────────\nprogram\n .command('sync')\n .description('Sync feature_list.json ↔ SQLite')\n .option('--dry-run', 'Show what would change without applying')\n .option('--direction <direction>', 'in | out | both (default: both)')\n .action(async (opts) => {\n await runSync(cwd, { dryRun: opts['dry-run'], direction: opts.direction })\n })\n\n// ─── serve ────────────────────────────────────────────────────────────────────\nprogram\n .command('serve')\n .description('Start the MCP server (stdio)')\n .option('--port <port>', 'Port hint stored in config (default: 3742)', parseInt)\n .action(async (opts) => {\n await runServe(cwd, { port: opts.port })\n })\n\n// ─── task ─────────────────────────────────────────────────────────────────────\nconst task = program.command('task').description('Manage tasks')\n\ntask\n .command('add')\n .description('Add a task interactively')\n .action(async () => {\n await runTaskAdd(cwd)\n })\n\ntask\n .command('list')\n .description('List tasks')\n .option('--status <status>', 'Filter by status: pending | in_progress | done | blocked')\n .option('--archived', 'Show only archived tasks')\n .option('--include-archived', 'Include archived tasks in the list')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n await runTaskList(cwd, opts)\n })\n\ntask\n .command('done <id|slug>')\n .description('Mark a task as done')\n .action(async (idOrSlug: string) => {\n await runTaskDone(cwd, idOrSlug)\n })\n\ntask\n .command('edit')\n .description('Edit a task interactively')\n .action(async () => {\n await runTaskEdit(cwd)\n })\n\n// ─── dashboard ────────────────────────────────────────────────────────────────\nprogram\n .command('dashboard')\n .description('Open web dashboard to visualize harness data')\n .option('-p, --port <port>', 'Port to listen on', '4242')\n .option('--no-open', 'Do not open browser automatically')\n .action(async (opts: { port: string; open: boolean }) => {\n await runDashboard(cwd, { port: parseInt(opts.port), open: opts.open })\n })\n\n// ─── migrate ──────────────────────────────────────────────────────────────────\n// `ahk migrate` is a pure router (no options/action of its own — commander\n// does not reliably support an identical flag declared on both a parent\n// command and its subcommand, see the argv rewrite below) with two\n// subcommands:\n// - `migrate provider --to <x>` — migrate provider-specific scaffold files.\n// - `migrate storage [--force] [--dry-run]` — migrate harness DB storage\n// (local↔global scope, sqlite↔postgres/mysql). See migrate-storage.ts.\n// `ahk migrate --to <x>` (no subcommand) and bare `ahk migrate` are kept as\n// backward-compatible aliases for `migrate provider [--to <x>]` — see the\n// argv rewrite just before `program.parse()` below.\nconst migrate = program\n .command('migrate')\n .description('Migrate provider files to a different provider, or migrate harness storage (see subcommands)')\n\nmigrate\n .command('provider')\n .description('Migrate provider-specific files to a different provider')\n .option('--to <provider>', 'Target provider: claude-code | opencode | codex-cli')\n .action(async (opts) => {\n await runMigrate(cwd, opts)\n })\n\nmigrate\n .command('storage')\n .description(\n 'Migrate harness DB storage between local/global scope or sqlite/postgres/mysql, based on agent-harness-kit.config.ts vs the real current state',\n )\n .option('--force', 'Required to overwrite a non-empty destination (a backup is written first)')\n .option('--dry-run', 'Preview what would migrate without applying any changes')\n .action(async (opts) => {\n try {\n await runMigrateStorage(cwd, { force: opts.force, dryRun: opts['dry-run'] })\n } catch (err) {\n console.error(pc.red(`✗ ${err instanceof Error ? err.message : String(err)}`))\n process.exit(1)\n }\n })\n\n// ─── export ───────────────────────────────────────────────────────────────────\nprogram\n .command('export')\n .description('Export the database')\n .option('--sql', 'SQL dump')\n .option('--json', 'JSON export of tasks and actions')\n .option('--output <path>', 'Output file path (default: stdout)')\n .action(async (opts) => {\n await runExport(cwd, opts)\n })\n\n\n// ─── reset ────────────────────────────────────────────────────────────────────\nprogram\n .command('reset')\n .description('Reset/clear harness data (DB, feature list, agent files)')\n .option('--force', 'Skip confirmation prompts')\n .option('--provider <claude-code|opencode>', 'Reset agent MD files for specified provider')\n .action(async (opts) => {\n await runReset(cwd, opts)\n })\n\n// ─── doctor ───────────────────────────────────────────────────────────────────\nprogram\n .command('doctor')\n .description('Check lib version, agent files, and harness skills sync status')\n .action(async () => {\n await runDoctor(cwd)\n })\n\n// Prints a non-blocking warning (but not for --version/--help, which\n// commander handles without invoking actions) when the package is only\n// installed globally and not available in the project's local\n// node_modules. This is purely informational — the command continues\n// its normal flow regardless of the check's result.\nprogram.hook('preAction', () => {\n if (!isLocalInstallSatisfied(cwd)) {\n printLocalInstallWarning()\n }\n})\n\nprogram.hook('postAction', async () => {\n const update = await updateCheck\n if (update) printUpdateMessage(update)\n})\n\n// ─── backward-compat argv rewrite for `ahk migrate` ────────────────────────\n// Bare `ahk migrate` and `ahk migrate --to <x>` (no subcommand token) must\n// keep working exactly as before subcommands were introduced — rewrite them\n// to `ahk migrate provider [--to <x>]` before commander parses argv.\n// `ahk migrate provider ...` and `ahk migrate storage ...` are untouched.\nfunction rewriteLegacyMigrateArgv(argv: string[]): string[] {\n const migrateIdx = argv.indexOf('migrate')\n if (migrateIdx === -1) return argv\n const next = argv[migrateIdx + 1]\n const isLegacyForm = next === undefined || next === '--to'\n if (!isLegacyForm) return argv\n const rewritten = [...argv]\n rewritten.splice(migrateIdx + 1, 0, 'provider')\n return rewritten\n}\n\nprogram.parse(rewriteLegacyMigrateArgv(process.argv))\n","import { watch } from 'node:fs'\nimport * as p from '@clack/prompts'\nimport pc from 'picocolors'\n\nimport { loadConfig } from '@/core/config'\nimport { getMaterializer } from '@/core/materializer/index'\n\ninterface BuildOptions {\n watch?: boolean\n sync?: boolean\n}\n\nexport async function runBuild(cwd: string, opts: BuildOptions): Promise<void> {\n await buildOnce(cwd)\n\n if (opts.sync) {\n p.log.step('Syncing agent permissions...')\n const config = await loadConfig(cwd)\n const materializer = getMaterializer(config.provider)\n await materializer.syncPermissions(cwd)\n }\n\n if (opts.watch) {\n p.log.info(`Watching agent-harness-kit.config.ts for changes...`)\n watch(cwd, { recursive: false }, async (_, filename) => {\n if (filename?.startsWith('agent-harness-kit.config')) {\n p.log.step('Config changed — rebuilding...')\n await buildOnce(cwd)\n }\n })\n // Keep process alive\n await new Promise(() => { })\n }\n}\n\nasync function buildOnce(cwd: string): Promise<void> {\n const spinner = p.spinner()\n spinner.start('Loading config...')\n\n try {\n const config = await loadConfig(cwd)\n spinner.message('Rebuilding files...')\n const materializer = getMaterializer(config.provider)\n await materializer.build(config, cwd)\n spinner.stop(pc.green('Build complete'))\n p.log.success('AGENTS.md')\n p.log.success(`Agent definitions (${config.provider})`)\n p.log.success('MCP config')\n } catch (err) {\n spinner.stop(pc.red('Build failed'))\n p.log.error(err instanceof Error ? err.message : String(err))\n process.exit(1)\n }\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'\nimport { join, resolve } from 'path'\n\nimport { write } from '@/utils/file'\n\nimport { detectPackageManager } from './detect-package-manager'\nimport {\n mergeClaudeMcpJson,\n mergeClaudeSettingsJson,\n mergeClaudeSettingsLocalJson,\n MCP_CLAUDE_PERMISSIONS_LEAD,\n MCP_CLAUDE_PERMISSIONS_EXPLORER,\n MCP_CLAUDE_PERMISSIONS_CONSULTANT,\n MCP_CLAUDE_PERMISSIONS_BUILDER,\n MCP_CLAUDE_PERMISSIONS_REVIEWER,\n} from './mcp-merge'\nimport { appendGitignore, slugify, writeAgentFile, writeSkills } from './scaffold-utils'\nimport {\n agentBuilder,\n agentConsultant,\n agentExplorer,\n agentLead,\n agentReviewer,\n agentsMd,\n claudeMd,\n featureListJson,\n HEALTH_SH,\n translateFrontmatterForClaudeCode,\n} from './templates'\n\nimport type { Materializer } from './index'\nimport type { HarnessConfig, Provider, ScaffoldOptions } from '@/types'\n\nexport class ClaudeCodeMaterializer implements Materializer {\n async scaffold(config: HarnessConfig, opts: ScaffoldOptions): Promise<void> {\n const { cwd } = opts\n\n // AGENTS.md and CLAUDE.md — always overwrite (generated from config)\n write(cwd, 'AGENTS.md', agentsMd(config))\n write(cwd, 'CLAUDE.md', claudeMd(config))\n\n // health.sh — only create if it doesn't exist\n if (!existsSync(join(cwd, 'health.sh'))) {\n write(cwd, 'health.sh', HEALTH_SH, 0o755)\n }\n\n // .harness/feature_list.json\n const tasks = opts.firstTask ? [{ slug: slugify(opts.firstTask.title), ...opts.firstTask }] : []\n write(cwd, 'feature_list.json', featureListJson(tasks))\n\n // .harness/current.md placeholder\n if (!existsSync(join(cwd, config.storage.markdownFallback.path))) {\n write(\n cwd,\n config.storage.markdownFallback.path,\n `<!-- AUTO-GENERATED by agent-harness-kit — DO NOT EDIT MANUALLY -->\\n<!-- Run ahk status to refresh -->\\n\\n# Current Session\\n\\nNo tasks in progress.\\n`\n )\n }\n\n // .claude/agents/ — skip files the dev may have customized\n const projectName = config.project.name\n const allowedPaths = (config.agents.explorer.allowedPaths ?? []).join(', ')\n const writablePaths = (config.agents.builder.writablePaths ?? []).join(', ')\n const leadModel = config.agents.lead.model\n const explorerModel = config.agents.explorer.model\n const consultantModel = config.agents.consultant?.model\n const builderModel = config.agents.builder.model\n const reviewerModel = config.agents.reviewer.model\n writeAgentFile(cwd, '.claude/agents/lead.md', translateFrontmatterForClaudeCode(agentLead({ projectName }), 'lead', leadModel))\n writeAgentFile(cwd, '.claude/agents/explorer.md', translateFrontmatterForClaudeCode(agentExplorer({ projectName, allowedPaths }), 'explorer', explorerModel))\n writeAgentFile(cwd, '.claude/agents/consultant.md', translateFrontmatterForClaudeCode(agentConsultant({ projectName }), 'consultant', consultantModel))\n writeAgentFile(cwd, '.claude/agents/builder.md', translateFrontmatterForClaudeCode(agentBuilder({ projectName, writablePaths }), 'builder', builderModel))\n writeAgentFile(cwd, '.claude/agents/reviewer.md', translateFrontmatterForClaudeCode(agentReviewer({ projectName }), 'reviewer', reviewerModel))\n\n // .mcp.json — MERGE, never overwrite whole file. Detect the project's\n // package manager fresh from cwd so the spawned command matches npm/pnpm/yarn.\n mergeClaudeMcpJson(join(cwd, '.mcp.json'), config.tools.mcp.port, detectPackageManager(cwd))\n // .claude/settings.json — set `agent: \"lead\"` (the official Claude Code default-agent field)\n mergeClaudeSettingsJson(join(cwd, '.claude/settings.json'))\n // .claude/settings.local.json — merge MCP tool permissions\n mergeClaudeSettingsLocalJson(join(cwd, '.claude/settings.local.json'))\n\n // .gitignore additions\n appendGitignore(cwd)\n writeSkills(cwd, '.claude/skills')\n }\n\n async build(config: HarnessConfig, cwd: string): Promise<void> {\n const write = (relPath: string, content: string) => {\n const abs = join(cwd, relPath)\n mkdirSync(resolve(abs, '..'), { recursive: true })\n writeFileSync(abs, content, 'utf8')\n }\n\n // build always regenerates AGENTS.md and CLAUDE.md (derived from config)\n write('AGENTS.md', agentsMd(config))\n write('CLAUDE.md', claudeMd(config))\n\n // Agent files: always regenerate (build must update existing files)\n const projectName = config.project.name\n const allowedPaths = (config.agents.explorer.allowedPaths ?? []).join(', ')\n const writablePaths = (config.agents.builder.writablePaths ?? []).join(', ')\n const leadModel = config.agents.lead.model\n const explorerModel = config.agents.explorer.model\n const consultantModel = config.agents.consultant?.model\n const builderModel = config.agents.builder.model\n const reviewerModel = config.agents.reviewer.model\n write('.claude/agents/lead.md', translateFrontmatterForClaudeCode(agentLead({ projectName }), 'lead', leadModel))\n write('.claude/agents/explorer.md', translateFrontmatterForClaudeCode(agentExplorer({ projectName, allowedPaths }), 'explorer', explorerModel))\n write('.claude/agents/consultant.md', translateFrontmatterForClaudeCode(agentConsultant({ projectName }), 'consultant', consultantModel))\n write('.claude/agents/builder.md', translateFrontmatterForClaudeCode(agentBuilder({ projectName, writablePaths }), 'builder', builderModel))\n write('.claude/agents/reviewer.md', translateFrontmatterForClaudeCode(agentReviewer({ projectName }), 'reviewer', reviewerModel))\n\n // MCP config: always merge. Re-detecting the package manager on every\n // build means a stale/hardcoded command self-corrects the next time the\n // user runs `ahk build`, even if they switched package managers after\n // the initial `ahk init` — no separate migration flag needed.\n mergeClaudeMcpJson(join(cwd, '.mcp.json'), config.tools.mcp.port, detectPackageManager(cwd))\n mergeClaudeSettingsJson(join(cwd, '.claude/settings.json'))\n mergeClaudeSettingsLocalJson(join(cwd, '.claude/settings.local.json'))\n writeSkills(cwd, '.claude/skills')\n }\n\n async migrate(config: HarnessConfig, _to: Provider, _cwd: string): Promise<void> {\n void config\n // Migration from claude-code is handled by the target materializer\n }\n\n async syncPermissions(cwd: string): Promise<void> {\n const AGENT_TOOLS: Record<string, string[]> = {\n lead: [...MCP_CLAUDE_PERMISSIONS_LEAD],\n explorer: [...MCP_CLAUDE_PERMISSIONS_EXPLORER],\n consultant: [...MCP_CLAUDE_PERMISSIONS_CONSULTANT],\n builder: [...MCP_CLAUDE_PERMISSIONS_BUILDER],\n reviewer: [...MCP_CLAUDE_PERMISSIONS_REVIEWER],\n }\n\n for (const [agent, tools] of Object.entries(AGENT_TOOLS)) {\n const filePath = join(cwd, '.claude', 'agents', `${agent}.md`)\n if (!existsSync(filePath)) {\n console.log(` ${agent}.md not found — skipping`)\n continue\n }\n const content = readFileSync(filePath, 'utf-8')\n // Replace mcp__ lines in the tools: block while preserving native tools (Read/Write/Bash/Task)\n const updated = content.replace(\n /(tools:\\n)((?: - [^\\n]+\\n)*)/m,\n (_match, header, toolsSection) => {\n const nativeLines = toolsSection\n .split('\\n')\n .filter((line: string) => line.trim() && !line.includes('mcp__'))\n const nativeSection = nativeLines.length ? nativeLines.join('\\n') + '\\n' : ''\n const mcpSection = tools.map((t) => ` - ${t}`).join('\\n') + '\\n'\n return header + nativeSection + mcpSection\n }\n )\n if (updated === content) {\n console.log(` ${agent}.md already in sync`)\n } else {\n writeFileSync(filePath, updated, 'utf-8')\n console.log(` ${agent}.md updated`)\n }\n }\n }\n}\n","import { mkdirSync, writeFileSync } from 'fs'\nimport { join, resolve } from 'path'\n\nexport const write = (cwd: string, relPath: string, content: string, mode?: number) => {\n const abs = join(cwd, relPath)\n mkdirSync(resolve(abs, '..'), { recursive: true })\n writeFileSync(abs, content, { encoding: 'utf8', mode })\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nexport type PackageManager = 'npm' | 'pnpm' | 'yarn-classic' | 'yarn-berry' | 'bun'\n\n/**\n * Detects the package manager used by the project at `cwd`.\n *\n * Priority:\n * 1. The `packageManager` field in `package.json` (e.g. `\"yarn@3.6.0\"`,\n * `\"pnpm@8.15.0\"`) — the most reliable signal when present, since it's an\n * explicit declaration (Corepack-compatible) rather than a guess.\n * 2. Lockfile heuristics — `pnpm-lock.yaml` → pnpm, `bun.lockb`/`bun.lock` →\n * bun, `yarn.lock` → yarn (distinguishing classic vs berry via the\n * presence of `.yarnrc.yml`, which only exists in Yarn Berry projects),\n * `package-lock.json` → npm.\n * 3. Fallback: `npm`.\n */\nexport function detectPackageManager(cwd: string): PackageManager {\n const fromField = detectFromPackageManagerField(cwd)\n if (fromField) return fromField\n\n if (existsSync(join(cwd, 'pnpm-lock.yaml'))) return 'pnpm'\n if (existsSync(join(cwd, 'bun.lockb')) || existsSync(join(cwd, 'bun.lock'))) return 'bun'\n if (existsSync(join(cwd, 'yarn.lock'))) {\n return existsSync(join(cwd, '.yarnrc.yml')) ? 'yarn-berry' : 'yarn-classic'\n }\n if (existsSync(join(cwd, 'package-lock.json'))) return 'npm'\n\n return 'npm'\n}\n\nfunction detectFromPackageManagerField(cwd: string): PackageManager | null {\n const pkgPath = join(cwd, 'package.json')\n if (!existsSync(pkgPath)) return null\n\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'))\n const field = pkg?.packageManager\n if (typeof field !== 'string' || !field.trim()) return null\n\n // Format: \"<name>@<version>[+hash]\" (Corepack convention)\n const match = field.match(/^([a-z]+)@(\\d+)/i)\n if (!match) return null\n\n const [, rawName, majorStr] = match\n const name = rawName.toLowerCase()\n const major = Number(majorStr)\n\n switch (name) {\n case 'npm':\n return 'npm'\n case 'pnpm':\n return 'pnpm'\n case 'bun':\n return 'bun'\n case 'yarn':\n return major >= 2 ? 'yarn-berry' : 'yarn-classic'\n default:\n return null\n }\n } catch {\n return null\n }\n}\n\n/**\n * Returns the full command-line tokens for spawning the MCP server via the\n * given package manager, per the corroborated command table:\n *\n * | Manager | Tokens |\n * | ------------ | ---------------------------------------------------- |\n * | npm | `npx --no ahk serve --port <port>` |\n * | pnpm | `pnpm exec ahk serve --port <port>` |\n * | yarn classic | `yarn run ahk serve --port <port>` |\n * | yarn berry | `yarn run ahk serve --port <port>` |\n * | bun | `bunx --no-install ahk serve --port <port>` |\n *\n * Callers split this into `command`/`args` (Claude Code, Codex CLI) or use\n * the array as-is (OpenCode, whose `mcp.<name>.command` field is a single\n * array rather than a separate command/args pair).\n */\nexport function getMcpCommandParts(pm: PackageManager, port: number): string[] {\n const portStr = String(port)\n switch (pm) {\n case 'pnpm':\n return ['pnpm', 'exec', 'ahk', 'serve', '--port', portStr]\n case 'yarn-classic':\n case 'yarn-berry':\n return ['yarn', 'run', 'ahk', 'serve', '--port', portStr]\n case 'bun':\n return ['bunx', '--no-install', 'ahk', 'serve', '--port', portStr]\n case 'npm':\n default:\n return ['npx', '--no', 'ahk', 'serve', '--port', portStr]\n }\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { dirname } from 'node:path'\n\nimport { getMcpCommandParts } from './detect-package-manager'\n\nimport type { PackageManager } from './detect-package-manager'\n\n// ─── Claude Code ──────────────────────────────────────────────────────────────\n\nexport function mergeClaudeMcpJson(filePath: string, port: number, pm: PackageManager = 'npm'): void {\n const folderPath = dirname(filePath)\n if (!existsSync(folderPath)) {\n mkdirSync(folderPath, { recursive: true })\n }\n\n let existing: Record<string, unknown> = {}\n if (existsSync(filePath)) {\n try {\n existing = JSON.parse(readFileSync(filePath, 'utf8')) as Record<string, unknown>\n } catch {\n // Unreadable JSON — start fresh to avoid corrupt state\n }\n }\n\n const [command, ...args] = getMcpCommandParts(pm, port)\n\n const merged = {\n ...existing,\n mcpServers: {\n ...((existing.mcpServers as Record<string, unknown>) ?? {}),\n 'agent-harness-kit': {\n type: 'stdio',\n command,\n args,\n },\n },\n }\n\n mkdirSync(dirname(filePath), { recursive: true })\n writeFileSync(filePath, JSON.stringify(merged, null, 2) + '\\n', 'utf8')\n}\n\n// Write `agent: \"lead\"` to .claude/settings.json — the correct Claude Code field\n// for setting which subagent runs as the main session thread.\nexport function mergeClaudeSettingsJson(filePath: string): void {\n mkdirSync(dirname(filePath), { recursive: true })\n\n let existing: Record<string, unknown> = {}\n if (existsSync(filePath)) {\n try {\n existing = JSON.parse(readFileSync(filePath, 'utf8')) as Record<string, unknown>\n } catch {\n // start fresh\n }\n }\n\n const merged = {\n ...existing,\n agent: 'lead',\n }\n\n writeFileSync(filePath, JSON.stringify(merged, null, 2) + '\\n', 'utf8')\n}\n\n// Merge MCP tool permissions into .claude/settings.local.json\nexport const MCP_CLAUDE_PERMISSIONS_LEAD = [\n 'mcp__agent-harness-kit__actions_start',\n 'mcp__agent-harness-kit__actions_write',\n 'mcp__agent-harness-kit__actions_complete',\n 'mcp__agent-harness-kit__actions_get',\n 'mcp__agent-harness-kit__actions_record_file',\n 'mcp__agent-harness-kit__actions_record_tool',\n 'mcp__agent-harness-kit__tasks_get',\n 'mcp__agent-harness-kit__tasks_claim',\n 'mcp__agent-harness-kit__tasks_add',\n 'mcp__agent-harness-kit__tasks_update',\n 'mcp__agent-harness-kit__tasks_edit',\n 'mcp__agent-harness-kit__tasks_archive',\n 'mcp__agent-harness-kit__tasks_unarchive',\n 'mcp__agent-harness-kit__tasks_acceptance_get',\n 'mcp__agent-harness-kit__docs_search',\n 'mcp__agent-harness-kit__ahk_doctor',\n]\n\nexport const MCP_CLAUDE_PERMISSIONS_EXPLORER = [\n 'mcp__agent-harness-kit__actions_start',\n 'mcp__agent-harness-kit__actions_write',\n 'mcp__agent-harness-kit__actions_complete',\n 'mcp__agent-harness-kit__actions_get',\n 'mcp__agent-harness-kit__actions_record_file',\n 'mcp__agent-harness-kit__actions_record_tool',\n 'mcp__agent-harness-kit__tasks_get',\n 'mcp__agent-harness-kit__tasks_claim',\n 'mcp__agent-harness-kit__tasks_acceptance_get',\n 'mcp__agent-harness-kit__docs_search',\n 'mcp__agent-harness-kit__ahk_doctor',\n]\n\nexport const MCP_CLAUDE_PERMISSIONS_BUILDER = [\n 'mcp__agent-harness-kit__actions_start',\n 'mcp__agent-harness-kit__actions_write',\n 'mcp__agent-harness-kit__actions_complete',\n 'mcp__agent-harness-kit__actions_get',\n 'mcp__agent-harness-kit__actions_record_file',\n 'mcp__agent-harness-kit__actions_record_tool',\n 'mcp__agent-harness-kit__tasks_get',\n 'mcp__agent-harness-kit__tasks_claim',\n 'mcp__agent-harness-kit__tasks_add',\n 'mcp__agent-harness-kit__tasks_update',\n 'mcp__agent-harness-kit__tasks_edit',\n 'mcp__agent-harness-kit__tasks_archive',\n 'mcp__agent-harness-kit__tasks_unarchive',\n 'mcp__agent-harness-kit__tasks_acceptance_get',\n 'mcp__agent-harness-kit__docs_search',\n 'mcp__agent-harness-kit__ahk_doctor',\n]\n\nexport const MCP_CLAUDE_PERMISSIONS_REVIEWER = [\n 'mcp__agent-harness-kit__actions_start',\n 'mcp__agent-harness-kit__actions_write',\n 'mcp__agent-harness-kit__actions_complete',\n 'mcp__agent-harness-kit__actions_get',\n 'mcp__agent-harness-kit__actions_record_file',\n 'mcp__agent-harness-kit__actions_record_tool',\n 'mcp__agent-harness-kit__tasks_get',\n 'mcp__agent-harness-kit__tasks_claim',\n 'mcp__agent-harness-kit__tasks_add',\n 'mcp__agent-harness-kit__tasks_update',\n 'mcp__agent-harness-kit__tasks_edit',\n 'mcp__agent-harness-kit__tasks_archive',\n 'mcp__agent-harness-kit__tasks_unarchive',\n 'mcp__agent-harness-kit__tasks_acceptance_update',\n 'mcp__agent-harness-kit__tasks_acceptance_get',\n 'mcp__agent-harness-kit__docs_search',\n 'mcp__agent-harness-kit__ahk_doctor',\n]\n\nexport const MCP_CLAUDE_PERMISSIONS_CONSULTANT = [\n 'mcp__agent-harness-kit__actions_start',\n 'mcp__agent-harness-kit__actions_write',\n 'mcp__agent-harness-kit__actions_complete',\n 'mcp__agent-harness-kit__actions_get',\n 'mcp__agent-harness-kit__actions_record_file',\n 'mcp__agent-harness-kit__actions_record_tool',\n 'mcp__agent-harness-kit__tasks_get',\n 'mcp__agent-harness-kit__tasks_claim',\n 'mcp__agent-harness-kit__tasks_acceptance_get',\n 'mcp__agent-harness-kit__deps_snapshot',\n 'mcp__agent-harness-kit__deps_check',\n 'mcp__agent-harness-kit__docs_search',\n 'mcp__agent-harness-kit__ahk_doctor',\n] as const\n\n// Full union — used by mergeClaudeSettingsLocalJson for project-wide settings\nexport const MCP_CLAUDE_PERMISSIONS = [\n ...new Set([\n ...MCP_CLAUDE_PERMISSIONS_LEAD,\n ...MCP_CLAUDE_PERMISSIONS_EXPLORER,\n ...MCP_CLAUDE_PERMISSIONS_BUILDER,\n ...MCP_CLAUDE_PERMISSIONS_REVIEWER,\n ...MCP_CLAUDE_PERMISSIONS_CONSULTANT,\n ]),\n]\n\nexport function mergeClaudeSettingsLocalJson(filePath: string): void {\n mkdirSync(dirname(filePath), { recursive: true })\n\n let existing: Record<string, unknown> = {}\n if (existsSync(filePath)) {\n try {\n existing = JSON.parse(readFileSync(filePath, 'utf8')) as Record<string, unknown>\n } catch {\n // start fresh\n }\n }\n\n const existingPermissions = (existing.permissions as Record<string, unknown>) ?? {}\n const existingAllow = (existingPermissions.allow as string[]) ?? []\n const existingServers = (existing.enabledMcpjsonServers as string[]) ?? []\n\n const mergedAllow = Array.from(new Set([...existingAllow, ...MCP_CLAUDE_PERMISSIONS]))\n const mergedServers = Array.from(new Set([...existingServers, 'agent-harness-kit']))\n\n const merged = {\n ...existing,\n permissions: {\n ...existingPermissions,\n allow: mergedAllow,\n },\n enabledMcpjsonServers: mergedServers,\n }\n\n writeFileSync(filePath, JSON.stringify(merged, null, 2) + '\\n', 'utf8')\n}\n\n// ─── OpenCode ─────────────────────────────────────────────────────────────────\n\nexport function mergeOpencodeJson(filePath: string, port: number, pm: PackageManager = 'npm'): void {\n const folderPath = dirname(filePath)\n if (!existsSync(folderPath)) {\n mkdirSync(folderPath, { recursive: true })\n }\n\n let existing: Record<string, unknown> = {}\n if (existsSync(filePath)) {\n try {\n existing = JSON.parse(readFileSync(filePath, 'utf8')) as Record<string, unknown>\n } catch {\n // start fresh\n }\n }\n\n const existingMcp = (existing.mcp as Record<string, unknown>) ?? {}\n\n const merged = {\n ...existing,\n default_agent: 'lead',\n compaction: existing.compaction ?? { auto: true, prune: true, reserved: 10000 },\n permission: existing.permission ?? { write: 'ask' },\n mcp: {\n ...existingMcp,\n 'agent-harness-kit': {\n enabled: true,\n type: 'local',\n // OpenCode's mcp.<name>.command field is a single array (unlike\n // Claude/Codex, which split command/args) — pass the full token list.\n command: getMcpCommandParts(pm, port),\n },\n },\n }\n\n writeFileSync(filePath, JSON.stringify(merged, null, 2) + '\\n', 'utf8')\n}\n\n// ─── Codex CLI ────────────────────────────────────────────────────────────────\n\nfunction mergeTomlSection(content: string, sectionName: string, sectionBody: string): string {\n const lines = content.split('\\n')\n const header = `[${sectionName}]`\n\n const startIdx = lines.findIndex((l) => l.trim() === header)\n\n if (startIdx === -1) {\n const trimmed = content.trimEnd()\n return trimmed + (trimmed ? '\\n\\n' : '') + header + '\\n' + sectionBody.trimEnd() + '\\n'\n }\n\n // Find where the section ends: next line starting with `[` or EOF\n let endIdx = lines.length\n for (let i = startIdx + 1; i < lines.length; i++) {\n if (/^\\[/.test(lines[i])) {\n endIdx = i\n break\n }\n }\n\n const newLines = [\n ...lines.slice(0, startIdx),\n header,\n ...sectionBody.trimEnd().split('\\n'),\n '',\n ...lines.slice(endIdx),\n ]\n\n return newLines.join('\\n')\n}\n\nexport function mergeCodexConfigToml(filePath: string, port: number, pm: PackageManager = 'npm'): void {\n mkdirSync(dirname(filePath), { recursive: true })\n\n let content = ''\n if (existsSync(filePath)) {\n content = readFileSync(filePath, 'utf8')\n }\n\n const [command, ...args] = getMcpCommandParts(pm, port)\n\n const sectionBody = [\n `command = ${JSON.stringify(command)}`,\n `args = ${JSON.stringify(args)}`,\n 'default_tools_approval_mode = \"auto\"',\n ].join('\\n')\n\n content = mergeTomlSection(content, 'mcp_servers.agent-harness-kit', sectionBody)\n\n writeFileSync(filePath, content, 'utf8')\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { dirname, join, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport { GITIGNORE_ENTRIES } from './templates'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\n\nexport function writeAgentFile(cwd: string, relPath: string, content: string): void {\n const abs = join(cwd, relPath)\n if (existsSync(abs)) return // preserve dev customizations\n mkdirSync(resolve(abs, '..'), { recursive: true })\n writeFileSync(abs, content, 'utf8')\n}\n\nexport function appendGitignore(cwd: string): void {\n const giPath = join(cwd, '.gitignore')\n const existing = existsSync(giPath) ? readFileSync(giPath, 'utf8') : ''\n\n const toAdd = GITIGNORE_ENTRIES.split('\\n')\n .filter((line) => line && !existing.includes(line))\n .join('\\n')\n\n if (toAdd.trim()) {\n writeFileSync(giPath, existing + (existing.endsWith('\\n') ? '' : '\\n') + toAdd + '\\n', 'utf8')\n }\n}\n\nexport function slugify(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 64)\n}\n\nexport function writeSkills(cwd: string, skillsDir: string): void {\n const skillNames = ['ahk-ask', 'ahk-consultant', 'ahk-triage', 'ahk-review']\n for (const skillName of skillNames) {\n const src = join(__dirname, 'skills', skillName, 'SKILL.md')\n const destDir = join(cwd, skillsDir, skillName)\n const dest = join(destDir, 'SKILL.md')\n mkdirSync(destDir, { recursive: true })\n writeFileSync(dest, readFileSync(src, 'utf8'), 'utf8')\n }\n}\n\n/**\n * Writes a single skill under an already-resolved absolute `skillsRoot`,\n * preserving the file if it already exists (same \"preserve dev\n * customizations\" idempotency criterion as writeAgentFile). Used by the\n * global sync flow, which needs to add only the skills that are missing\n * rather than unconditionally overwriting every skill like writeSkills()\n * does for project-local scaffold/build.\n */\nexport function writeSkill(skillsRoot: string, skillName: string): void {\n const src = join(__dirname, 'skills', skillName, 'SKILL.md')\n const destDir = join(skillsRoot, skillName)\n const dest = join(destDir, 'SKILL.md')\n if (existsSync(dest)) return // preserve — already present\n mkdirSync(destDir, { recursive: true })\n writeFileSync(dest, readFileSync(src, 'utf8'), 'utf8')\n}\n\n","import { readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport {\n MCP_CLAUDE_PERMISSIONS,\n MCP_CLAUDE_PERMISSIONS_BUILDER,\n MCP_CLAUDE_PERMISSIONS_CONSULTANT,\n MCP_CLAUDE_PERMISSIONS_EXPLORER,\n MCP_CLAUDE_PERMISSIONS_LEAD,\n MCP_CLAUDE_PERMISSIONS_REVIEWER,\n} from './mcp-merge'\n\nimport type { HarnessConfig } from '@/types'\n\n// ─── Agent template loader ────────────────────────────────────────────────────\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\nconst TEMPLATES_DIR = join(__dirname, 'agent-templates')\n\n/**\n * Load an agent template file and interpolate {{variables}}.\n * Variables are replaced using a simple {{key}} pattern.\n */\nfunction loadAgentTemplate(\n name: 'lead' | 'explorer' | 'consultant' | 'builder' | 'reviewer',\n vars: Record<string, string> = {}\n): string {\n const raw = readFileSync(join(TEMPLATES_DIR, `${name}.md`), 'utf8')\n return raw.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key: string) => vars[key] ?? `{{${key}}}`)\n}\n\n// ─── health.sh — exits 1 until the dev implements it ─────────────────────────\n\nexport const HEALTH_SH = `#!/usr/bin/env bash\n# health.sh — project health check for agent-harness-kit\n#\n# This script must exit 0 when the project is healthy.\n# Agents will run this before making codebase changes.\n#\n# TODO: implement your project's health checks below.\n# Examples:\n# npm test\n# docker compose ps | grep -q \"running\"\n# psql -c \"SELECT 1\" > /dev/null 2>&1\n#\n# Until you implement it, this script intentionally exits 1\n# so agents know the environment is not verified.\n\necho \"health.sh not implemented yet.\"\necho \"Edit this file with your project's health checks.\"\necho \"It must exit 0 for agents to start working.\"\nexit 1\n`\n\n// ─── AGENTS.md template ───────────────────────────────────────────────────────\n\nexport function agentsMd(config: HarnessConfig): string {\n const { name, description, docsPath } = config.project\n const port = config.tools.mcp.port\n\n return `# AGENTS.md — ${name}\n\n> **Read this file first.** It is the navigation map for every AI agent working in this repository.\n\n## Project\n\n**${name}** — ${description}\n\n## Health check (run before making codebase changes)\n\n\\`\\`\\`bash\nbash health.sh\n\\`\\`\\`\n\nIf it exits non-zero, stop and report the issue. Do not proceed with codebase changes until health is green.\n\n## Harness data (source of truth)\n\n| File | Purpose |\n|------|---------|\n| \\`.harness/harness.db\\` | SQLite: all tasks, actions, file changes, tool calls |\n| \\`.harness/current.md\\` | Markdown fallback — read this if MCP server is unavailable |\n| \\`.harness/feature_list.json\\` | Human-editable task seed list |\n\n## MCP tools (preferred)\n\nThe harness exposes tools via MCP server on port ${port}. Use these instead of reading files directly.\n\n\\`\\`\\`\nactions.start taskId agent → start an action, returns actionId\nactions.write actionId section text → record a section (result, blockers, ...)\nactions.record_tool actionId toolName [argsJson] [summary] → log a tool call to the Tools dashboard\nactions.record_file actionId filePath operation [notes] → log a file touch to the Files dashboard\nactions.complete actionId summary → close the action\nactions.get taskId → full action history for a task\ntasks.add title [slug] [description] [acceptance] → create a new task from natural language\ntasks.get [status] → list tasks (pending | in_progress | done | blocked)\ntasks.claim id → atomically claim a pending task\ntasks.update id status → change task status\ntasks.acceptance.update criterionId → mark an acceptance criterion as met\ndocs.search query → search ${docsPath} for relevant content\n\\`\\`\\`\n\n## Workflow\n\n\\`\\`\\`\n1. INIT\n - Assess user intent: only run health.sh if changes are needed\n - tasks.get('in_progress') → resume if something is in progress\n - tasks.get('pending') → pick lowest id\n\n2. WORK (lead → explorer → consultant → builder → reviewer)\n - Each agent calls actions.start(taskId, agentName) → actionId\n - After EVERY tool call: actions.record_tool(actionId, toolName, args, summary)\n - After EVERY file change: actions.record_file(actionId, filePath, operation, notes)\n - Closes with actions.complete(actionId, summary)\n\n3. CLOSE\n - tasks.update(taskId, 'done')\n - Run health.sh (if changes were made) → must be green before closing\n\\`\\`\\`\n\n## Agent roles\n\n| Agent | Responsibility |\n|-------|---------------|\n| lead | Decomposes the task into a plan, assigns sub-agents |\n| explorer | Reads and maps relevant code, never writes |\n| consultant | Technical advisor, runs after explorer, before builder. Never writes code. |\n| builder | Implements the plan, writes files |\n| reviewer | Verifies acceptance criteria, approves or blocks |\n\n## What to read\n\n\\`\\`\\`\nAlways: .harness/current.md (or MCP tasks.get)\nIf implementing: ${docsPath}/\nIf orchestrating: Agent definition files in your provider's agents directory\n\\`\\`\\`\n`\n}\n\n// ─── CLAUDE.md template (Claude Code provider) ───────────────────────────────\n\nexport function claudeMd(config: HarnessConfig): string {\n const { name, description, docsPath } = config.project\n const port = config.tools.mcp.port\n\n return `# CLAUDE.md — ${name}\n\n> **Read this file first.** It is the navigation map for every AI agent working in this repository.\n\n## Project\n\n**${name}** — ${description}\n\n## Health check (run before making codebase changes)\n\n\\`\\`\\`bash\nbash health.sh\n\\`\\`\\`\n\nIf it exits non-zero, stop and report the issue. Do not proceed with codebase changes until health is green.\n\n## Harness data (source of truth)\n\n| File | Purpose |\n|------|---------|\n| \\`.harness/harness.db\\` | SQLite: all tasks, actions, file changes, tool calls |\n| \\`.harness/current.md\\` | Markdown fallback — read this if MCP server is unavailable |\n| \\`.harness/feature_list.json\\` | Human-editable task seed list |\n\n## MCP tools (preferred)\n\nThe harness exposes tools via MCP server on port ${port}. Use these instead of reading files directly.\n\n\\`\\`\\`\nactions.start taskId agent → start an action, returns actionId\nactions.write actionId section text → record a section (result, blockers, ...)\nactions.record_tool actionId toolName [argsJson] [summary] → log a tool call to the Tools dashboard\nactions.record_file actionId filePath operation [notes] → log a file touch to the Files dashboard\nactions.complete actionId summary → close the action\nactions.get taskId → full action history for a task\ntasks.add title [slug] [description] [acceptance] → create a new task from natural language\ntasks.get [status] → list tasks (pending | in_progress | done | blocked)\ntasks.claim id → atomically claim a pending task\ntasks.update id status → change task status\ntasks.acceptance.update criterionId → mark an acceptance criterion as met\ndocs.search query → search ${docsPath} for relevant content\n\\`\\`\\`\n\n## Workflow\n\n\\`\\`\\`\n1. INIT\n - Assess user intent: only run health.sh if changes are needed\n - tasks.get('in_progress') → resume if something is in progress\n - tasks.get('pending') → pick lowest id\n - No pending tasks? → ask user, infer fields, call tasks.add, then tasks.claim\n\n2. WORK (lead → explorer → consultant → builder → reviewer)\n - Each agent calls actions.start(taskId, agentName) → actionId\n - After EVERY tool call: actions.record_tool(actionId, toolName, args, summary)\n - After EVERY file change: actions.record_file(actionId, filePath, operation, notes)\n - Closes with actions.complete(actionId, summary)\n\n3. CLOSE\n - tasks.update(taskId, 'done')\n - Run health.sh (if changes were made) → must be green before closing\n\\`\\`\\`\n\n## Agent roles\n\n| Agent | Responsibility |\n|-------|---------------|\n| lead | Decomposes the task into a plan, assigns sub-agents |\n| explorer | Reads and maps relevant code, never writes |\n| consultant | Technical advisor, runs after explorer, before builder. Never writes code. |\n| builder | Implements the plan, writes files |\n| reviewer | Verifies acceptance criteria, approves or blocks |\n\n## What to read\n\n\\`\\`\\`\nAlways: .harness/current.md (or MCP tasks.get)\nIf implementing: ${docsPath}/\nIf orchestrating: Agent definition files in .claude/agents/\n\\`\\`\\`\n`\n}\n\n// ─── agent-harness-kit.config.ts template ───────────────────────────────────────────\n\nexport interface AgentModelOverrides {\n lead?: string\n explorer?: string\n consultant?: string\n builder?: string\n reviewer?: string\n}\n\nfunction modelField(model: string | undefined): string {\n return model ? `, model: ${JSON.stringify(model)}` : ''\n}\n\ninterface ConfigTemplateParams {\n name: string\n description: string\n provider: string\n docsPath: string\n tasksAdapter: string\n port: number\n models?: AgentModelOverrides\n scope: 'local' | 'global'\n projectId: string\n}\n\n/**\n * Shared body of the config object literal, reused across the .ts/.mjs/.cjs\n * templates below. Returns the inner fields only (no wrapping braces) so\n * each variant can control its own import/export shape around it.\n */\nfunction configObjectBody(params: ConfigTemplateParams): string {\n const models = params.models ?? {}\n return ` project: {\n name: ${JSON.stringify(params.name)},\n description: ${JSON.stringify(params.description)},\n docsPath: '${params.docsPath}',\n },\n\n provider: '${params.provider}',\n\n agents: {\n lead: { instructionsPath: null${modelField(models.lead)} },\n explorer: { instructionsPath: null, allowedPaths: ['${params.docsPath}', './src']${modelField(models.explorer)} },\n builder: { instructionsPath: null, writablePaths: ['./src', './tests']${modelField(models.builder)} },\n reviewer: { instructionsPath: null${modelField(models.reviewer)} },\n ${models.consultant ? `consultant: { instructionsPath: null${modelField(models.consultant)} },\\n ` : ''}custom: [],\n },\n\n // SQLite (default). Switch to postgres/mysql by changing database.type.\n // database: { type: 'postgres', connectionString: process.env.DATABASE_URL },\n // database: { type: 'mysql', connectionString: process.env.DATABASE_URL },\n database: { type: 'sqlite', path: '.harness/harness.db' },\n\n storage: {\n dir: '.harness',\n tasks: { adapter: '${params.tasksAdapter}' },\n sections: {\n toolsUsed: true,\n filesModified: true,\n result: true,\n blockers: true,\n nextSteps: false,\n },\n markdownFallback: { enabled: true, path: '.harness/current.md' },\n // 'local' — DB lives in .harness/ (project-relative). 'global' — DB lives\n // under ~/.harness/dbs/<projectId>/, outside the project tree.\n scope: '${params.scope}',\n projectId: '${params.projectId}',\n },\n\n health: {\n scriptPath: './health.sh',\n required: true,\n },\n\n tools: {\n mcp: { enabled: true, port: ${params.port} },\n scripts: { enabled: true, outputDir: './.harness/scripts' },\n },\n`\n}\n\n/**\n * TypeScript config: uses `import type` (type-only, erased at compile time)\n * instead of a value import of `defineHarness`. This means `loadConfig()`\n * (via jiti) never needs to resolve `@cardor/agent-harness-kit` as a real\n * module at runtime just to load the config — only the type is referenced,\n * which TypeScript strips entirely. `defineHarness()` itself is unaffected\n * and remains available for anyone who prefers to import and call it\n * manually; `loadConfig()` supports both shapes (see config.ts).\n */\nexport function configTs(params: ConfigTemplateParams): string {\n return `import type { HarnessConfig } from '@cardor/agent-harness-kit'\n\nconst config: HarnessConfig = {\n${configObjectBody(params)}}\n\nexport default config\n`\n}\n\n/**\n * .mjs config: plain JavaScript has no compile-time type checking, so there\n * is no benefit to importing anything from the package here — not even a\n * type. The object is exported as-is via ESM `export default`.\n */\nexport function configMjs(params: ConfigTemplateParams): string {\n return `const config = {\n${configObjectBody(params)}}\n\nexport default config\n`\n}\n\n/**\n * .cjs config: same reasoning as configMjs — plain JS, no types to import.\n * Exported via CommonJS `module.exports`, which `loadConfig()` already\n * handles through its `mod.default ?? mod` fallback.\n */\nexport function configCjs(params: ConfigTemplateParams): string {\n return `const config = {\n${configObjectBody(params)}}\n\nmodule.exports = config\n`\n}\n\n// ─── Agent definition templates (loaded from agent-templates/*.md) ─────────────\n\nexport function agentLead(vars: { projectName: string }): string {\n return loadAgentTemplate('lead', vars)\n}\n\nexport function agentExplorer(vars: { projectName: string; allowedPaths: string }): string {\n return loadAgentTemplate('explorer', vars)\n}\n\nexport function agentBuilder(vars: { projectName: string; writablePaths: string }): string {\n return loadAgentTemplate('builder', vars)\n}\n\nexport function agentConsultant(vars: { projectName: string }): string {\n return loadAgentTemplate('consultant', vars)\n}\n\nexport function agentReviewer(vars: { projectName: string }): string {\n return loadAgentTemplate('reviewer', vars)\n}\n\n// Note: agentLead/agentExplorer/agentConsultant/agentBuilder/agentReviewer above produce the\n// raw markdown template (frontmatter without `model:`). The `model:` line is injected downstream\n// by translateFrontmatterForClaudeCode() (Claude Code) — never injected for OpenCode.\n\n// ─── feature_list.json initial seed ──────────────────────────────────────────\n\nexport function featureListJson(\n tasks: { slug: string; title: string; description?: string; acceptance?: string[] }[]\n): string {\n return JSON.stringify(tasks, null, 2) + '\\n'\n}\n\n// ─── Codex CLI agent TOML helpers ────────────────────────────────────────────\n\nfunction stripFrontmatter(md: string): { description: string; body: string } {\n const parts = md.split(/^---\\s*$/m)\n if (parts.length < 3) return { description: '', body: md }\n\n const frontmatter = parts[1]\n const body = parts.slice(2).join('---').replace(/^\\n/, '')\n\n let description = ''\n // YAML folded scalar: `description: >\\n line1\\n line2`\n const foldedMatch = frontmatter.match(/^description:\\s*[>|]\\s*\\n((?:[ \\t]+[^\\n]*\\n?)*)/m)\n if (foldedMatch) {\n description = foldedMatch[1]\n .split('\\n')\n .map((l) => l.trim())\n .filter(Boolean)\n .join(' ')\n } else {\n const inlineMatch = frontmatter.match(/^description:\\s*(.+)$/m)\n if (inlineMatch) description = inlineMatch[1].trim()\n }\n\n return { description, body }\n}\n\n/**\n * Codex CLI does not validate the `model` value client-side (free text, resolved\n * at invocation time). Per explicit product rule: if the value is null/undefined/\n * empty, or its trimmed length is < 3 chars, omit the `model` line entirely —\n * never emit a placeholder or an 'inherit'-like value.\n */\nfunction toCodexToml(\n name: string,\n description: string,\n body: string,\n sandboxMode: 'workspace-write' | 'read-only',\n model?: string\n): string {\n // TOML multiline basic strings end at `\"\"\"` — escape any that appear in content\n const safe = (s: string) => s.replace(/\"\"\"/g, '\"\"\\\\u0022')\n const trimmedModel = model?.trim() ?? ''\n const modelLine = trimmedModel.length >= 3 ? `model = \"${trimmedModel}\"\\n` : ''\n return `name = \"${name}\"\nsandbox_mode = \"${sandboxMode}\"\n${modelLine}\ndescription = \"\"\"\n${safe(description)}\n\"\"\"\n\ndeveloper_instructions = \"\"\"\n${safe(body.trimEnd())}\n\"\"\"\n`\n}\n\nexport function agentLeadToml(vars: { projectName: string; model?: string }): string {\n const { description, body } = stripFrontmatter(loadAgentTemplate('lead', vars))\n return toCodexToml('lead', description, body, 'read-only', vars.model)\n}\n\nexport function agentLeadAsDefaultToml(vars: { projectName: string; model?: string }): string {\n const { description, body } = stripFrontmatter(loadAgentTemplate('lead', vars))\n return toCodexToml('default', description, body, 'read-only', vars.model)\n}\n\nexport function agentExplorerToml(vars: { projectName: string; allowedPaths: string; model?: string }): string {\n const { description, body } = stripFrontmatter(loadAgentTemplate('explorer', vars))\n return toCodexToml('explorer', description, body, 'read-only', vars.model)\n}\n\nexport function agentBuilderToml(vars: { projectName: string; writablePaths: string; model?: string }): string {\n const { description, body } = stripFrontmatter(loadAgentTemplate('builder', vars))\n return toCodexToml('builder', description, body, 'workspace-write', vars.model)\n}\n\nexport function agentReviewerToml(vars: { projectName: string; model?: string }): string {\n const { description, body } = stripFrontmatter(loadAgentTemplate('reviewer', vars))\n return toCodexToml('reviewer', description, body, 'read-only', vars.model)\n}\n\nexport function agentConsultantToml(vars: { projectName: string; model?: string }): string {\n const { description, body } = stripFrontmatter(loadAgentTemplate('consultant', vars))\n return toCodexToml('consultant', description, body, 'read-only', vars.model)\n}\n\n// ─── Claude Code frontmatter translation ─────────────────────────────────────\n\n/**\n * Takes a template markdown string (with simple tools list) and injects\n * `Task` + the agent-specific `mcp__agent-harness-kit__*` tools into the\n * frontmatter `tools:` section for Claude Code.\n *\n * Inserts `Task` after the last non-mcp tool entry, then appends mcp tools.\n */\nexport function translateFrontmatterForClaudeCode(\n md: string,\n agentName: 'lead' | 'explorer' | 'consultant' | 'builder' | 'reviewer',\n model?: string\n): string {\n const permissionsMap: Record<string, string[]> = {\n lead: [...MCP_CLAUDE_PERMISSIONS_LEAD],\n explorer: [...MCP_CLAUDE_PERMISSIONS_EXPLORER],\n consultant: [...MCP_CLAUDE_PERMISSIONS_CONSULTANT],\n builder: [...MCP_CLAUDE_PERMISSIONS_BUILDER],\n reviewer: [...MCP_CLAUDE_PERMISSIONS_REVIEWER],\n }\n const permissions = permissionsMap[agentName] ?? MCP_CLAUDE_PERMISSIONS\n const mcpLines = permissions.map((t) => ` - ${t}`).join('\\n')\n\n // Find the tools: block in frontmatter and append Task + mcp tools after last tool entry\n // We look for the pattern: a line with ` - SomeTool` followed by either `---` or a non-tool line\n let result = md.replace(/(tools:\\n(?: - (?!mcp__)[^\\n]+\\n)+)/, (match) => {\n const trimmed = match.trimEnd()\n return `${trimmed}\\n - Task\\n${mcpLines}\\n`\n })\n\n // Inject a `model:` frontmatter line, independent of the tools: regex above.\n // Placed right after `name: <agentName>` — matches the shape used when a model\n // is manually configured today. No model configured → leave frontmatter untouched.\n if (model) {\n result = injectModelFrontmatterLine(result, model)\n }\n\n return result\n}\n\n/**\n * Inserts (or replaces) a `model: <value>` line right after the `name:` line\n * in a template's YAML frontmatter. Never touches the `tools:` block.\n */\nfunction injectModelFrontmatterLine(md: string, model: string): string {\n // Replace an existing `model:` line if present (idempotent re-generation)...\n if (/^model:\\s*.*$/m.test(md)) {\n return md.replace(/^model:\\s*.*$/m, `model: ${model}`)\n }\n // ...otherwise insert a new `model:` line right after `name:`.\n return md.replace(/^(name:.*)$/m, `$1\\nmodel: ${model}`)\n}\n\n// ─── OpenCode frontmatter translation ────────────────────────────────────────\n\n/**\n * Converts the `tools:` YAML list in a template's frontmatter to the\n * dictionary format expected by OpenCode (e.g. `read: true`, `bash: true`).\n *\n * Only transforms the tools: block — all other frontmatter fields and\n * body content are left exactly as-is.\n */\nexport function translateFrontmatterForOpenCode(md: string): string {\n return md.replace(/(tools:\\n(?: - [^\\n]+\\n)+)/, (match) => {\n const tools = [...match.matchAll(/ - ([^\\n]+)/g)].map((m) => m[1].trim())\n return 'tools:\\n' + tools.map((t) => ` ${t.toLocaleLowerCase()}: true`).join('\\n') + '\\n'\n })\n}\n\n// ─── .gitignore additions ─────────────────────────────────────────────────────\n\nexport const GITIGNORE_ENTRIES = `\n# agent-harness-kit\n.harness/harness.db\n.harness/harness.db-shm\n.harness/harness.db-wal\n.harness/current.md\n`\n","import { existsSync, mkdirSync, writeFileSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\n\nimport { detectPackageManager } from './detect-package-manager'\nimport { mergeCodexConfigToml } from './mcp-merge'\nimport { appendGitignore, slugify, writeAgentFile, writeSkills } from './scaffold-utils'\nimport {\n agentBuilderToml,\n agentConsultantToml,\n agentExplorerToml,\n agentLeadAsDefaultToml,\n agentLeadToml,\n agentReviewerToml,\n agentsMd,\n featureListJson,\n HEALTH_SH,\n} from './templates'\n\nimport type { Materializer } from './index'\nimport type { HarnessConfig, Provider, ScaffoldOptions } from '@/types'\n\nexport class CodexCliMaterializer implements Materializer {\n async scaffold(config: HarnessConfig, opts: ScaffoldOptions): Promise<void> {\n const { cwd } = opts\n\n const write = (relPath: string, content: string, mode?: number) => {\n const abs = join(cwd, relPath)\n mkdirSync(resolve(abs, '..'), { recursive: true })\n writeFileSync(abs, content, { encoding: 'utf8', mode })\n }\n\n // AGENTS.md — always overwrite (generated from config)\n write('AGENTS.md', agentsMd(config))\n\n // health.sh — only create if it doesn't exist\n if (!existsSync(join(cwd, 'health.sh'))) {\n write('health.sh', HEALTH_SH, 0o755)\n }\n\n const tasks = opts.firstTask\n ? [{ slug: slugify(opts.firstTask.title), ...opts.firstTask }]\n : []\n write(join(config.storage.dir, 'feature_list.json'), featureListJson(tasks))\n\n if (!existsSync(join(cwd, config.storage.markdownFallback.path))) {\n write(\n config.storage.markdownFallback.path,\n `<!-- AUTO-GENERATED by agent-harness-kit — DO NOT EDIT MANUALLY -->\\n<!-- Run ahk status to refresh -->\\n\\n# Current Session\\n\\nNo tasks in progress.\\n`\n )\n }\n\n // .codex/agents/ — skip files the dev may have customized\n const projectName = config.project.name\n const allowedPaths = (config.agents.explorer.allowedPaths ?? []).join(', ')\n const writablePaths = (config.agents.builder.writablePaths ?? []).join(', ')\n const leadModel = config.agents.lead.model\n const explorerModel = config.agents.explorer.model\n const consultantModel = config.agents.consultant?.model\n const builderModel = config.agents.builder.model\n const reviewerModel = config.agents.reviewer.model\n\n writeAgentFile(cwd, '.codex/agents/lead.toml', agentLeadToml({ projectName, model: leadModel }))\n writeAgentFile(cwd, '.codex/agents/explorer.toml', agentExplorerToml({ projectName, allowedPaths, model: explorerModel }))\n writeAgentFile(cwd, '.codex/agents/consultant.toml', agentConsultantToml({ projectName, model: consultantModel }))\n writeAgentFile(cwd, '.codex/agents/builder.toml', agentBuilderToml({ projectName, writablePaths, model: builderModel }))\n writeAgentFile(cwd, '.codex/agents/reviewer.toml', agentReviewerToml({ projectName, model: reviewerModel }))\n // Override Codex's built-in `default` agent so `lead` runs when no agent is selected\n writeAgentFile(cwd, '.codex/agents/default.toml', agentLeadAsDefaultToml({ projectName, model: leadModel }))\n\n // .codex/config.toml — MERGE, never overwrite whole file. Detect the\n // project's package manager fresh from cwd so the spawned command matches npm/pnpm/yarn.\n mergeCodexConfigToml(join(cwd, '.codex/config.toml'), config.tools.mcp.port, detectPackageManager(cwd))\n\n appendGitignore(cwd)\n writeSkills(cwd, '.agents/skills')\n }\n\n async build(config: HarnessConfig, cwd: string): Promise<void> {\n const write = (relPath: string, content: string) => {\n const abs = join(cwd, relPath)\n mkdirSync(resolve(abs, '..'), { recursive: true })\n writeFileSync(abs, content, 'utf8')\n }\n\n write('AGENTS.md', agentsMd(config))\n\n const projectName = config.project.name\n const allowedPaths = (config.agents.explorer.allowedPaths ?? []).join(', ')\n const writablePaths = (config.agents.builder.writablePaths ?? []).join(', ')\n const leadModel = config.agents.lead.model\n const explorerModel = config.agents.explorer.model\n const consultantModel = config.agents.consultant?.model\n const builderModel = config.agents.builder.model\n const reviewerModel = config.agents.reviewer.model\n\n writeAgentFile(cwd, '.codex/agents/lead.toml', agentLeadToml({ projectName, model: leadModel }))\n writeAgentFile(cwd, '.codex/agents/explorer.toml', agentExplorerToml({ projectName, allowedPaths, model: explorerModel }))\n writeAgentFile(cwd, '.codex/agents/consultant.toml', agentConsultantToml({ projectName, model: consultantModel }))\n writeAgentFile(cwd, '.codex/agents/builder.toml', agentBuilderToml({ projectName, writablePaths, model: builderModel }))\n writeAgentFile(cwd, '.codex/agents/reviewer.toml', agentReviewerToml({ projectName, model: reviewerModel }))\n writeAgentFile(cwd, '.codex/agents/default.toml', agentLeadAsDefaultToml({ projectName, model: leadModel }))\n\n // Re-detecting on every build self-corrects the command if the user\n // switched package managers since `ahk init` — no migration flag needed.\n mergeCodexConfigToml(join(cwd, '.codex/config.toml'), config.tools.mcp.port, detectPackageManager(cwd))\n writeSkills(cwd, '.agents/skills')\n }\n\n async migrate(config: HarnessConfig, _to: Provider, _cwd: string): Promise<void> {\n void config\n }\n\n async syncPermissions(_cwd: string): Promise<void> {\n console.log(' Permissions sync not needed for codex-cli — skipping')\n }\n}\n","import { existsSync, mkdirSync, writeFileSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\n\nimport { detectPackageManager } from './detect-package-manager'\nimport { mergeOpencodeJson } from './mcp-merge'\nimport { appendGitignore, slugify, writeAgentFile, writeSkills } from './scaffold-utils'\nimport { agentBuilder, agentConsultant, agentExplorer, agentLead, agentReviewer, agentsMd, featureListJson, HEALTH_SH, translateFrontmatterForOpenCode } from './templates'\n\nimport type { Materializer } from './index'\nimport type { HarnessConfig, Provider, ScaffoldOptions } from '@/types'\n\nexport class OpenCodeMaterializer implements Materializer {\n async scaffold(config: HarnessConfig, opts: ScaffoldOptions): Promise<void> {\n const { cwd } = opts\n\n const write = (relPath: string, content: string, mode?: number) => {\n const abs = join(cwd, relPath)\n mkdirSync(resolve(abs, '..'), { recursive: true })\n writeFileSync(abs, content, { encoding: 'utf8', mode })\n }\n\n // AGENTS.md — always overwrite (generated from config)\n write('AGENTS.md', agentsMd(config))\n\n // health.sh — only create if it doesn't exist\n if (!existsSync(join(cwd, 'health.sh'))) {\n write('health.sh', HEALTH_SH, 0o755)\n }\n\n const tasks = opts.firstTask\n ? [{ slug: slugify(opts.firstTask.title), ...opts.firstTask }]\n : []\n write(join(config.storage.dir, 'feature_list.json'), featureListJson(tasks))\n\n if (!existsSync(join(cwd, config.storage.markdownFallback.path))) {\n write(\n config.storage.markdownFallback.path,\n `<!-- AUTO-GENERATED by agent-harness-kit — DO NOT EDIT MANUALLY -->\\n<!-- Run ahk status to refresh -->\\n\\n# Current Session\\n\\nNo tasks in progress.\\n`\n )\n }\n\n // .opencode/agents/ — skip files the dev may have customized\n const projectName = config.project.name\n const allowedPaths = (config.agents.explorer.allowedPaths ?? []).join(', ')\n const writablePaths = (config.agents.builder.writablePaths ?? []).join(', ')\n writeAgentFile(cwd, '.opencode/agents/lead.md', translateFrontmatterForOpenCode(agentLead({ projectName })))\n writeAgentFile(cwd, '.opencode/agents/explorer.md', translateFrontmatterForOpenCode(agentExplorer({ projectName, allowedPaths })))\n writeAgentFile(cwd, '.opencode/agents/consultant.md', translateFrontmatterForOpenCode(agentConsultant({ projectName })))\n writeAgentFile(cwd, '.opencode/agents/builder.md', translateFrontmatterForOpenCode(agentBuilder({ projectName, writablePaths })))\n writeAgentFile(cwd, '.opencode/agents/reviewer.md', translateFrontmatterForOpenCode(agentReviewer({ projectName })))\n\n // opencode.json — MERGE, never overwrite whole file. Detect the project's\n // package manager fresh from cwd so the spawned command matches npm/pnpm/yarn.\n mergeOpencodeJson(join(cwd, 'opencode.json'), config.tools.mcp.port, detectPackageManager(cwd))\n\n appendGitignore(cwd)\n writeSkills(cwd, '.opencode/skills')\n }\n\n async build(config: HarnessConfig, cwd: string): Promise<void> {\n const write = (relPath: string, content: string) => {\n const abs = join(cwd, relPath)\n mkdirSync(resolve(abs, '..'), { recursive: true })\n writeFileSync(abs, content, 'utf8')\n }\n\n write('AGENTS.md', agentsMd(config))\n\n const projectName = config.project.name\n const allowedPaths = (config.agents.explorer.allowedPaths ?? []).join(', ')\n const writablePaths = (config.agents.builder.writablePaths ?? []).join(', ')\n writeAgentFile(cwd, '.opencode/agents/lead.md', translateFrontmatterForOpenCode(agentLead({ projectName })))\n writeAgentFile(cwd, '.opencode/agents/explorer.md', translateFrontmatterForOpenCode(agentExplorer({ projectName, allowedPaths })))\n writeAgentFile(cwd, '.opencode/agents/consultant.md', translateFrontmatterForOpenCode(agentConsultant({ projectName })))\n writeAgentFile(cwd, '.opencode/agents/builder.md', translateFrontmatterForOpenCode(agentBuilder({ projectName, writablePaths })))\n writeAgentFile(cwd, '.opencode/agents/reviewer.md', translateFrontmatterForOpenCode(agentReviewer({ projectName })))\n\n // Re-detecting on every build self-corrects the command if the user\n // switched package managers since `ahk init` — no migration flag needed.\n mergeOpencodeJson(join(cwd, 'opencode.json'), config.tools.mcp.port, detectPackageManager(cwd))\n writeSkills(cwd, '.opencode/skills')\n }\n\n async migrate(config: HarnessConfig, _to: Provider, _cwd: string): Promise<void> {\n void config\n }\n\n async syncPermissions(_cwd: string): Promise<void> {\n console.log(' Permissions sync not needed for opencode — skipping')\n }\n}\n\n","import { ClaudeCodeMaterializer } from './claude-code'\nimport { CodexCliMaterializer } from './codex-cli'\nimport { OpenCodeMaterializer } from './opencode'\n\nimport type { HarnessConfig, Provider, ScaffoldOptions } from '@/types'\n\nexport interface Materializer {\n scaffold(config: HarnessConfig, opts: ScaffoldOptions): Promise<void>\n build(config: HarnessConfig, cwd: string): Promise<void>\n migrate(config: HarnessConfig, to: Provider, cwd: string): Promise<void>\n syncPermissions(cwd: string): Promise<void>\n}\n\nexport function getMaterializer(provider: Provider): Materializer {\n switch (provider) {\n case 'claude-code':\n return new ClaudeCodeMaterializer()\n case 'opencode':\n return new OpenCodeMaterializer()\n case 'codex-cli':\n return new CodexCliMaterializer()\n default:\n throw new Error(`Unknown provider: ${provider as string}`)\n }\n}\n","import { dirname, join, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport pc from 'picocolors'\n\nimport { loadConfig } from '@/core/config'\nimport { startDashboardServer } from '@/core/dashboard-server'\nimport { openDB } from '@/core/db'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\n\ninterface DashboardOptions {\n port: number\n open: boolean\n}\n\nexport async function runDashboard(cwd: string, opts: DashboardOptions): Promise<void> {\n const config = await loadConfig(cwd)\n const db = await openDB(config, cwd)\n const dbPath = config.database.type === 'sqlite' ? resolve(cwd, config.database.path) : null\n const staticPath = join(__dirname, 'dashboard-dist')\n\n const { url } = await startDashboardServer(db, dbPath, staticPath, opts.port)\n\n console.log(pc.green(`✓`) + ` Dashboard running at ${pc.bold(pc.cyan(url))}`)\n console.log(pc.dim(` WebSocket live updates enabled`))\n console.log(pc.dim(` Press Ctrl+C to stop`))\n\n if (opts.open) {\n const { default: open } = await import('open')\n await open(url)\n }\n\n process.on('SIGINT', () => {\n process.exit(0)\n })\n\n // Keep process alive until SIGINT\n await new Promise<void>(() => { })\n}\n","import { watch } from 'node:fs'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { extname, join } from 'node:path'\nimport { serve } from '@hono/node-server'\nimport { Hono } from 'hono'\nimport { WebSocketServer } from 'ws'\n\nimport { findFreePort } from './port-utils'\n\nimport type { HarnessDB } from './db'\nimport type { IncomingMessage } from 'node:http'\nimport type { Socket } from 'node:net'\n\n// ─── Static file serving ──────────────────────────────────────────────────────\n\nconst MIME: Record<string, string> = {\n '.html': 'text/html; charset=utf-8',\n '.js': 'application/javascript; charset=utf-8',\n '.mjs': 'application/javascript; charset=utf-8',\n '.css': 'text/css; charset=utf-8',\n '.json': 'application/json; charset=utf-8',\n '.svg': 'image/svg+xml',\n '.png': 'image/png',\n '.ico': 'image/x-icon',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n '.ttf': 'font/ttf',\n}\n\nfunction fileResponse(filePath: string): Response {\n const content = readFileSync(filePath)\n const mime = MIME[extname(filePath)] ?? 'application/octet-stream'\n return new Response(content, {\n headers: { 'Content-Type': mime, 'Cache-Control': 'no-cache' },\n })\n}\n\n// ─── Server ───────────────────────────────────────────────────────────────────\n\nexport interface DashboardServerResult {\n url: string\n close: () => void\n}\n\nexport async function startDashboardServer(\n db: HarnessDB,\n dbPath: string | null,\n staticPath: string,\n port: number\n): Promise<DashboardServerResult> {\n const app = new Hono()\n const { tasks, actions, stats } = db\n\n // ─── CORS ─────────────────────────────────────────────────────────────────\n app.use('/api/*', async (c, next) => {\n await next()\n c.res.headers.set('Access-Control-Allow-Origin', '*')\n })\n\n // ─── Stats overview ───────────────────────────────────────────────────────\n app.get('/api/stats', async (c) => {\n await db.reconnect()\n const summary = await tasks.getStatusSummary()\n const byStatus: Record<string, number> = { pending: 0, in_progress: 0, done: 0, blocked: 0 }\n for (const { status, total } of summary) byStatus[status] = total\n const counts = await stats.getCounts()\n return c.json({ byStatus, ...counts })\n })\n\n // ─── Meta ─────────────────────────────────────────────────────────────────\n app.get('/api/meta', (c) => {\n return c.json({ ok: true })\n })\n\n // ─── Tasks list ───────────────────────────────────────────────────────────\n app.get('/api/tasks', async (c) => {\n await db.reconnect()\n const includeArchived = c.req.query('includeArchived') === 'true'\n return c.json(await tasks.getAllWithAcceptanceCounts(includeArchived))\n })\n\n // ─── Task detail ──────────────────────────────────────────────────────────\n app.get('/api/tasks/:id', async (c) => {\n await db.reconnect()\n const id = parseInt(c.req.param('id'))\n const task = await tasks.getById(id)\n if (!task) return c.json({ error: 'Not found' }, 404)\n\n const acceptance = await tasks.getAcceptance(id)\n const taskActions = await actions.getWithDetails(id)\n return c.json({ ...task, acceptance, actions: taskActions })\n })\n\n // ─── Task update (PATCH) ────────────────────────────────────────────────\n app.patch('/api/tasks/:id', async (c) => {\n const id = parseInt(c.req.param('id'))\n const task = await tasks.getById(id)\n if (!task) return c.json({ error: 'Not found' }, 404)\n\n const body = await c.req.json()\n const updateParams: { title?: string; description?: string | null; slug?: string } = {}\n if (body.title !== undefined) updateParams.title = body.title\n if (body.description !== undefined) updateParams.description = body.description\n\n await db.updateTask(id, updateParams)\n\n if (body.acceptance !== undefined && Array.isArray(body.acceptance)) {\n await db.updateTaskAcceptance(\n id,\n body.acceptance.map((a: string) => a.trim()).filter(Boolean)\n )\n }\n\n const updated = await tasks.getById(id)\n const acceptance = await tasks.getAcceptance(id)\n const taskActions = await actions.getWithDetails(id)\n return c.json({ ...updated, acceptance, actions: taskActions })\n })\n\n // ─── Archive task ─────────────────────────────────────────────────────────\n app.patch('/api/tasks/:id/archive', async (c) => {\n await db.reconnect()\n const id = parseInt(c.req.param('id'))\n const task = await tasks.getById(id)\n if (!task) return c.json({ error: 'Not found' }, 404)\n const updated = await db.archiveTask(id)\n return c.json(updated)\n })\n\n // ─── Unarchive task ──────────────────────────────────────────────────────\n app.patch('/api/tasks/:id/unarchive', async (c) => {\n await db.reconnect()\n const id = parseInt(c.req.param('id'))\n const task = await tasks.getById(id)\n if (!task) return c.json({ error: 'Not found' }, 404)\n const updated = await db.unarchiveTask(id)\n return c.json(updated)\n })\n\n // ─── Tools top ────────────────────────────────────────────────────────────\n app.get('/api/tools/top', async (c) => {\n await db.reconnect()\n const limit = parseInt(c.req.query('limit') ?? '20')\n return c.json(await actions.getTopTools(limit))\n })\n\n // ─── Tools recent ─────────────────────────────────────────────────────────\n app.get('/api/tools/recent', async (c) => {\n await db.reconnect()\n const limit = parseInt(c.req.query('limit') ?? '50')\n return c.json(await stats.getRecentTools(limit))\n })\n\n // ─── Files top ────────────────────────────────────────────────────────────\n app.get('/api/files/top', async (c) => {\n await db.reconnect()\n const limit = parseInt(c.req.query('limit') ?? '20')\n return c.json(await stats.getTopFiles(limit))\n })\n\n // ─── Files recent ─────────────────────────────────────────────────────────\n app.get('/api/files/recent', async (c) => {\n await db.reconnect()\n const limit = parseInt(c.req.query('limit') ?? '50')\n return c.json(await stats.getRecentFiles(limit))\n })\n\n // ─── Agents stats ─────────────────────────────────────────────────────────\n app.get('/api/agents/stats', async (c) => {\n await db.reconnect()\n return c.json(await stats.getAgentStats())\n })\n\n // ─── Timeline ─────────────────────────────────────────────────────────────\n app.get('/api/timeline', async (c) => {\n await db.reconnect()\n const limit = parseInt(c.req.query('limit') ?? '50')\n return c.json(await stats.getTimeline(limit))\n })\n\n // ─── Static SPA ───────────────────────────────────────────────────────────\n app.get('/*', (c) => {\n const urlPath = c.req.path\n if (urlPath !== '/') {\n const candidate = join(staticPath, urlPath)\n if (existsSync(candidate)) {\n try {\n return fileResponse(candidate)\n } catch {\n /* fall through */\n }\n }\n }\n return fileResponse(join(staticPath, 'index.html'))\n })\n\n // ─── Start HTTP server ────────────────────────────────────────────────────\n const resolvedPort = await findFreePort(port)\n if (resolvedPort !== port) {\n console.log(`Port ${port} in use, using ${resolvedPort}`)\n }\n const httpServer = serve({ fetch: app.fetch, port: resolvedPort })\n\n // ─── WebSocket ────────────────────────────────────────────────────────────\n const wss = new WebSocketServer({ noServer: true })\n\n httpServer.on('upgrade', (req: IncomingMessage, socket: Socket, head: Buffer) => {\n if (req.url === '/ws') {\n wss.handleUpgrade(req, socket, head, (ws) => {\n wss.emit('connection', ws, req)\n })\n } else {\n socket.destroy()\n }\n })\n\n // ─── DB file watcher → broadcast update ──────────────────────────────────\n let debounce: ReturnType<typeof setTimeout>\n\n const broadcast = () => {\n clearTimeout(debounce)\n debounce = setTimeout(() => {\n for (const client of wss.clients) {\n if (client.readyState === 1) {\n client.send(JSON.stringify({ type: 'update' }))\n }\n }\n }, 150)\n }\n\n // SQLite only — no file to watch for Postgres/MySQL\n let watcher: ReturnType<typeof watch> | null = null\n if (dbPath) {\n const walPath = `${dbPath}-wal`\n const watchTarget = existsSync(walPath) ? walPath : dbPath\n watcher = watch(watchTarget, broadcast)\n }\n\n return {\n url: `http://localhost:${resolvedPort}`,\n close: () => {\n clearTimeout(debounce)\n watcher?.close()\n wss.close()\n httpServer.close()\n },\n }\n}\n","import { createServer } from 'node:net'\n\nexport function isPortFree(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const server = createServer()\n server.once('error', () => resolve(false))\n server.once('listening', () => {\n server.close(() => resolve(true))\n })\n server.listen(port, '127.0.0.1')\n })\n}\n\nexport async function findFreePort(start: number, maxAttempts = 10): Promise<number> {\n for (let i = 0; i < maxAttempts; i++) {\n const port = start + i\n if (await isPortFree(port)) return port\n }\n throw new Error(\n `Could not find a free port after ${maxAttempts} attempts (tried ${start}-${start + maxAttempts - 1}). Please free a port and try again.`\n )\n}\n","import pc from 'picocolors'\n\nimport { loadConfig } from '@/core/config'\nimport { getDoctorStatus } from '@/core/doctor'\n\nimport type { AgentStatus, SkillStatus } from '@/core/doctor'\n\n// ─── Formatting helpers ───────────────────────────────────────────────────────\n\nfunction ok(label: string, detail: string): void {\n console.log(` ${pc.cyan(label.padEnd(16))}${pc.green('[✓]')} ${detail}`)\n}\n\nfunction warn(label: string, detail: string, hint?: string): void {\n console.log(` ${pc.cyan(label.padEnd(16))}${pc.yellow('[!]')} ${detail}`)\n if (hint) {\n console.log(` ${''.padEnd(16)} ${pc.dim(hint)}`)\n }\n}\n\nfunction neutral(label: string, detail: string): void {\n console.log(` ${pc.cyan(label.padEnd(16))}${pc.dim('[~]')} ${detail}`)\n}\n\n// ─── Section formatters ───────────────────────────────────────────────────────\n\nfunction printLibSection(lib: { current: string; latest: string | null; outdated: boolean }): void {\n if (lib.latest === null) {\n neutral('lib version', `${lib.current} (unknown — could not reach npm registry)`)\n } else if (lib.outdated) {\n warn(\n 'lib version',\n `${lib.current} → ${lib.latest} available`,\n `run: npm i @cardor/agent-harness-kit@latest && ahk build`\n )\n } else {\n ok('lib version', `${lib.current} (up to date)`)\n }\n}\n\nfunction printAgentsSection(agents: AgentStatus[]): void {\n if (agents.length === 0) {\n warn('agent files', 'no config found — run: ahk init')\n return\n }\n\n const missing = agents.filter((a) => a.status === 'missing')\n const outdated = agents.filter((a) => a.status === 'outdated')\n\n if (missing.length === 0 && outdated.length === 0) {\n ok('agent files', 'all up to date')\n return\n }\n\n for (const agent of missing) {\n warn('agent files', `${agent.name} missing`, 'run: ahk build')\n }\n for (const agent of outdated) {\n warn('agent files', `${agent.name} outdated`, 'run: ahk build')\n }\n}\n\nfunction printSkillsSection(skills: SkillStatus[]): void {\n if (skills.length === 0) {\n warn('harness skills', 'no config found — run: ahk init')\n return\n }\n\n const issues = skills.filter((s) => s.status !== 'ok')\n if (issues.length === 0) {\n ok('harness skills', 'all present and up to date')\n return\n }\n\n for (const skill of issues) {\n const detail =\n skill.status === 'missing' ? `${skill.name} missing` : `${skill.name} outdated`\n warn('harness skills', detail, 'run: ahk build')\n }\n}\n\n// ─── Main command ─────────────────────────────────────────────────────────────\n\nexport async function runDoctor(cwd: string): Promise<void> {\n // Check for config first so we can give a helpful upfront message\n let configFound = true\n try {\n await loadConfig(cwd)\n } catch {\n configFound = false\n }\n\n console.log('')\n console.log(pc.bold(`● ahk doctor ` + '─'.repeat(44)))\n console.log('')\n\n const status = await getDoctorStatus(cwd)\n\n printLibSection(status.lib)\n\n if (!configFound) {\n console.log('')\n warn('config', 'no agent-harness-kit.config found', 'run: ahk init')\n console.log('')\n return\n }\n\n console.log('')\n printAgentsSection(status.agents)\n\n console.log('')\n printSkillsSection(status.skills)\n\n console.log('')\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport { loadConfig } from '@/core/config'\nimport {\n agentBuilder,\n agentBuilderToml,\n agentConsultant,\n agentConsultantToml,\n agentExplorer,\n agentExplorerToml,\n agentLead,\n agentLeadToml,\n agentReviewer,\n agentReviewerToml,\n translateFrontmatterForClaudeCode,\n translateFrontmatterForOpenCode,\n} from '@/core/materializer/templates'\nimport { pkg } from '@/core/package-data'\n\nimport type { HarnessConfig } from '@/types'\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface LibStatus {\n current: string\n latest: string | null // null = couldn't fetch (offline)\n outdated: boolean\n}\n\nexport interface AgentStatus {\n name: string\n status: 'ok' | 'missing' | 'outdated'\n}\n\nexport interface SkillStatus {\n name: string\n status: 'ok' | 'missing' | 'outdated'\n}\n\nexport interface DoctorStatus {\n lib: LibStatus\n agents: AgentStatus[]\n skills: SkillStatus[]\n}\n\n// ─── Constants ────────────────────────────────────────────────────────────────\n\nconst REGISTRY_URL = `https://registry.npmjs.org/${pkg.name}/latest`\nconst TIMEOUT_MS = 2000\nconst LIB_VERSION_CACHE_TTL_MS = 5 * 60 * 1000 // 5 minutes\nconst AGENT_NAMES = ['lead', 'explorer', 'consultant', 'builder', 'reviewer'] as const\nexport type AgentName = (typeof AGENT_NAMES)[number]\nconst SKILL_NAMES = ['ahk-ask', 'ahk-consultant', 'ahk-triage', 'ahk-review'] as const\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\n\n// ─── Lib version check ────────────────────────────────────────────────────────\n\n// In-memory TTL cache for the npm registry lookup only. Agent/skill file checks\n// are local and cheap, so they are intentionally NOT cached — only the network\n// call to the npm registry benefits from memoization.\nlet libVersionCache: { status: LibStatus; fetchedAt: number } | null = null\n\n/** Clears the in-memory lib version cache. Exposed for tests only. */\nexport function __resetLibVersionCacheForTests(): void {\n libVersionCache = null\n}\n\nasync function checkLibVersion(): Promise<LibStatus> {\n const current = pkg.version\n\n if (libVersionCache && Date.now() - libVersionCache.fetchedAt < LIB_VERSION_CACHE_TTL_MS) {\n // Cache is keyed to the running process's current version. If somehow the\n // running version changed (unlikely mid-process), fall through to refetch.\n if (libVersionCache.status.current === current) {\n return libVersionCache.status\n }\n }\n\n try {\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), TIMEOUT_MS)\n\n const res = await fetch(REGISTRY_URL, { signal: controller.signal })\n clearTimeout(timer)\n\n const data = (await res.json()) as { version: string }\n const latest = data.version\n const outdated = isNewer(latest, current)\n const status: LibStatus = { current, latest, outdated }\n libVersionCache = { status, fetchedAt: Date.now() }\n return status\n } catch {\n const status: LibStatus = { current, latest: null, outdated: false }\n // Cache the offline result too, so repeated calls within the TTL don't\n // keep retrying a network call that just timed out/failed.\n libVersionCache = { status, fetchedAt: Date.now() }\n return status\n }\n}\n\nfunction isNewer(latest: string, current: string): boolean {\n const toNum = (v: string) => v.split('.').map(Number)\n const [lMaj, lMin, lPat] = toNum(latest)\n const [cMaj, cMin, cPat] = toNum(current)\n if (lMaj !== cMaj) return lMaj > cMaj\n if (lMin !== cMin) return lMin > cMin\n return lPat > cPat\n}\n\n// ─── Agent file check ─────────────────────────────────────────────────────────\n\nfunction getProviderAgentInfo(provider: string): {\n agentsDir: string\n ext: string\n} {\n switch (provider) {\n case 'claude-code':\n return { agentsDir: '.claude/agents', ext: '.md' }\n case 'opencode':\n return { agentsDir: '.opencode/agents', ext: '.md' }\n case 'codex-cli':\n return { agentsDir: '.codex/agents', ext: '.toml' }\n default:\n return { agentsDir: '.claude/agents', ext: '.md' }\n }\n}\n\nexport function generateExpectedAgentContent(\n agentName: AgentName,\n provider: string,\n vars: { projectName: string; allowedPaths: string; writablePaths: string; model?: string }\n): string {\n const { projectName, allowedPaths, writablePaths, model } = vars\n\n if (provider === 'claude-code') {\n const templateFns = {\n lead: () => agentLead({ projectName }),\n explorer: () => agentExplorer({ projectName, allowedPaths }),\n consultant: () => agentConsultant({ projectName }),\n builder: () => agentBuilder({ projectName, writablePaths }),\n reviewer: () => agentReviewer({ projectName }),\n }\n return translateFrontmatterForClaudeCode(templateFns[agentName](), agentName, model)\n }\n\n if (provider === 'opencode') {\n const templateFns = {\n lead: () => agentLead({ projectName }),\n explorer: () => agentExplorer({ projectName, allowedPaths }),\n consultant: () => agentConsultant({ projectName }),\n builder: () => agentBuilder({ projectName, writablePaths }),\n reviewer: () => agentReviewer({ projectName }),\n }\n // OpenCode never receives a model override — no injection for this provider.\n return translateFrontmatterForOpenCode(templateFns[agentName]())\n }\n\n // codex-cli: TOML format\n const tomlFns = {\n lead: () => agentLeadToml({ projectName, model }),\n explorer: () => agentExplorerToml({ projectName, allowedPaths, model }),\n consultant: () => agentConsultantToml({ projectName, model }),\n builder: () => agentBuilderToml({ projectName, writablePaths, model }),\n reviewer: () => agentReviewerToml({ projectName, model }),\n }\n return tomlFns[agentName]()\n}\n\n// Root-based comparison — shared by both the project-local (cwd) and global\n// (homeDir) checks. Callers resolve `agentsRoot` to an absolute directory;\n// this function never derives paths on its own, so there is exactly ONE\n// place that compares live vs. expected agent content.\nfunction checkAgentFilesAtRoot(\n agentsRoot: string,\n ext: string,\n provider: string,\n projectName: string,\n allowedPaths: string,\n writablePaths: string,\n models: Partial<Record<AgentName, string | undefined>>\n): AgentStatus[] {\n return AGENT_NAMES.map((name) => {\n const filePath = join(agentsRoot, `${name}${ext}`)\n\n if (!existsSync(filePath)) {\n return { name, status: 'missing' as const }\n }\n\n try {\n const live = readFileSync(filePath, 'utf8')\n const expected = generateExpectedAgentContent(name, provider, {\n projectName,\n allowedPaths,\n writablePaths,\n model: models[name],\n })\n return { name, status: live === expected ? 'ok' as const : 'outdated' as const }\n } catch {\n return { name, status: 'outdated' as const }\n }\n })\n}\n\nfunction checkAgentFiles(\n cwd: string,\n provider: string,\n projectName: string,\n allowedPaths: string,\n writablePaths: string,\n models: Partial<Record<AgentName, string | undefined>>\n): AgentStatus[] {\n const { agentsDir, ext } = getProviderAgentInfo(provider)\n return checkAgentFilesAtRoot(\n join(cwd, agentsDir),\n ext,\n provider,\n projectName,\n allowedPaths,\n writablePaths,\n models\n )\n}\n\n// ─── Skill check ─────────────────────────────────────────────────────────────\n\nfunction getProviderSkillsDir(provider: string): string {\n switch (provider) {\n case 'claude-code':\n return '.claude/skills'\n case 'opencode':\n return '.opencode/skills'\n case 'codex-cli':\n return '.agents/skills'\n default:\n return '.claude/skills'\n }\n}\n\n// Root-based comparison — shared by both the project-local (cwd) and global\n// (homeDir) checks. `skillsRoot` is an absolute directory already resolved\n// by the caller.\nfunction checkSkillsAtRoot(skillsRoot: string): SkillStatus[] {\n // Skills are in src/core/materializer/skills/ — at runtime dist/core/materializer/skills/\n const skillSourceBase = join(__dirname, 'skills')\n\n return SKILL_NAMES.map((name) => {\n const livePath = join(skillsRoot, name, 'SKILL.md')\n const sourcePath = join(skillSourceBase, name, 'SKILL.md')\n\n if (!existsSync(livePath)) {\n return { name, status: 'missing' as const }\n }\n\n try {\n const live = readFileSync(livePath, 'utf8')\n const source = readFileSync(sourcePath, 'utf8')\n return { name, status: live === source ? 'ok' : 'outdated' }\n } catch {\n return { name, status: 'outdated' as const }\n }\n })\n}\n\nfunction checkSkills(cwd: string, provider: string): SkillStatus[] {\n const skillsDir = getProviderSkillsDir(provider)\n return checkSkillsAtRoot(join(cwd, skillsDir))\n}\n\n// ─── Global (per-provider, home dir) resolution ────────────────────────────────\n//\n// Project-local paths (getProviderAgentInfo / getProviderSkillsDir above) are\n// always relative to the project cwd. Global paths live under the user's home\n// dir and, for some providers, do NOT mirror the local layout 1:1 — most\n// notably Codex CLI, whose skills live in a namespace separate from its\n// agents (`~/.agents/skills`, not `~/.codex/skills`). These functions must\n// stay independent of getProviderAgentInfo/getProviderSkillsDir rather than\n// deriving from them, since the local and global layouts genuinely differ\n// (e.g. OpenCode's global agents dir is XDG-style `~/.config/opencode/agents`,\n// not `~/.opencode/agents`).\n\nexport function getGlobalProviderAgentDir(\n provider: string,\n homeDir: string\n): { agentsDir: string; ext: string } {\n switch (provider) {\n case 'claude-code':\n return { agentsDir: join(homeDir, '.claude', 'agents'), ext: '.md' }\n case 'opencode':\n return { agentsDir: join(homeDir, '.config', 'opencode', 'agents'), ext: '.md' }\n case 'codex-cli':\n return { agentsDir: join(homeDir, '.codex', 'agents'), ext: '.toml' }\n default:\n return { agentsDir: join(homeDir, '.claude', 'agents'), ext: '.md' }\n }\n}\n\nexport function getGlobalProviderSkillsDir(provider: string, homeDir: string): string {\n switch (provider) {\n case 'claude-code':\n return join(homeDir, '.claude', 'skills')\n case 'opencode':\n return join(homeDir, '.config', 'opencode', 'skills')\n case 'codex-cli':\n // Codex CLI namespace split: agents live under ~/.codex/agents, but\n // skills live under ~/.agents/skills — NOT ~/.codex/skills. Mirrors the\n // project-local convention already used by getProviderSkillsDir().\n return join(homeDir, '.agents', 'skills')\n default:\n return join(homeDir, '.claude', 'skills')\n }\n}\n\nexport interface GlobalDoctorStatus {\n agents: AgentStatus[]\n skills: SkillStatus[]\n}\n\n/**\n * Global counterpart to getDoctorStatus() — reuses the same comparison logic\n * (checkAgentFilesAtRoot / checkSkillsAtRoot / generateExpectedAgentContent)\n * against a root resolved from `homeDir` instead of the project cwd. Never\n * mutates the filesystem — detection only.\n */\nexport async function getGlobalDoctorStatus(\n provider: string,\n config: HarnessConfig,\n homeDir: string = homedir()\n): Promise<GlobalDoctorStatus> {\n const projectName = config.project.name\n const allowedPaths = (config.agents.explorer.allowedPaths ?? []).join(', ')\n const writablePaths = (config.agents.builder.writablePaths ?? []).join(', ')\n const models: Partial<Record<AgentName, string | undefined>> = {\n lead: config.agents.lead.model,\n explorer: config.agents.explorer.model,\n consultant: config.agents.consultant?.model,\n builder: config.agents.builder.model,\n reviewer: config.agents.reviewer.model,\n }\n\n const { agentsDir, ext } = getGlobalProviderAgentDir(provider, homeDir)\n const agents = checkAgentFilesAtRoot(\n agentsDir,\n ext,\n provider,\n projectName,\n allowedPaths,\n writablePaths,\n models\n )\n\n const skillsDir = getGlobalProviderSkillsDir(provider, homeDir)\n const skills = checkSkillsAtRoot(skillsDir)\n\n return { agents, skills }\n}\n\n// ─── Main export ──────────────────────────────────────────────────────────────\n\nexport async function getDoctorStatus(cwd: string): Promise<DoctorStatus> {\n const lib = await checkLibVersion()\n\n let config\n try {\n config = await loadConfig(cwd)\n } catch {\n // Config not found — return minimal status with empty agent/skill checks\n return {\n lib,\n agents: [],\n skills: [],\n }\n }\n\n const provider = config.provider\n const projectName = config.project.name\n const allowedPaths = (config.agents.explorer.allowedPaths ?? []).join(', ')\n const writablePaths = (config.agents.builder.writablePaths ?? []).join(', ')\n const models: Partial<Record<AgentName, string | undefined>> = {\n lead: config.agents.lead.model,\n explorer: config.agents.explorer.model,\n consultant: config.agents.consultant?.model,\n builder: config.agents.builder.model,\n reviewer: config.agents.reviewer.model,\n }\n\n const agents = checkAgentFiles(cwd, provider, projectName, allowedPaths, writablePaths, models)\n const skills = checkSkills(cwd, provider)\n\n return { lib, agents, skills }\n}\n","import { existsSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst require = createRequire(import.meta.url)\n\n// Resolved at runtime relative to the compiled file location:\n// - local dev (compiled): dist/core/package-data.js → ../../package.json (repo root)\n// - installed: node_modules/@cardor/agent-harness-kit/dist/core/package-data.js → ../../package.json (package root)\n// - local dev (running .ts directly via tsx, e.g. tests): src/core/package-data.ts → ../../package.json (repo root)\nconst here = dirname(fileURLToPath(import.meta.url))\nconst candidates = [join(here, '..', '..', 'package.json'), join(here, '..', 'package.json')]\nconst pkgPath = candidates.find((p) => existsSync(p)) ?? candidates[0]\n\nexport const pkg = require(pkgPath) as { version: string; name: string }\n","import { writeFileSync } from 'node:fs'\nimport pc from 'picocolors'\n\nimport { loadConfig } from '@/core/config'\nimport { openDB } from '@/core/db'\n\ninterface ExportOptions {\n sql?: boolean\n json?: boolean\n output?: string\n}\n\nexport async function runExport(cwd: string, opts: ExportOptions): Promise<void> {\n if (!opts.sql && !opts.json) {\n console.error(pc.red('Specify --sql or --json'))\n process.exit(1)\n }\n\n const config = await loadConfig(cwd)\n const db = await openDB(config, cwd)\n\n try {\n if (opts.json) {\n const data = await db.exportJson()\n const out = JSON.stringify(data, null, 2) + '\\n'\n if (opts.output) {\n writeFileSync(opts.output, out, 'utf8')\n console.log(pc.green(`✓ Exported JSON → ${opts.output}`))\n } else {\n process.stdout.write(out)\n }\n }\n\n if (opts.sql) {\n console.error(pc.dim('SQL dump requires direct SQLite access — use: sqlite3 .harness/harness.db .dump'))\n process.exit(1)\n }\n } finally {\n await db.close()\n }\n}\n","import { spawnSync } from 'node:child_process'\nimport { existsSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\nimport pc from 'picocolors'\n\nimport { loadConfig } from '@/core/config'\n\nimport type { HarnessConfig } from '@/types'\n\nfunction checkLine(label: string | null, ok: boolean, message: string, indent = 0): void {\n const prefix = label ? pc.cyan(`[${label}] `) : ' '.repeat(indent)\n const icon = ok ? pc.green('✓') : pc.red('✗')\n console.log(prefix + icon + ' ' + (ok ? pc.green(message) : pc.red(message)))\n}\n\nexport async function runHealth(cwd: string): Promise<void> {\n let config\n try {\n config = await loadConfig(cwd)\n } catch {\n console.error(pc.red('✗ No config found. Run: ahk init'))\n process.exit(1)\n }\n\n let allOk = true\n\n // ─── [checking DB] ──────────────────────────────────────────────────────────\n let dbOk: boolean\n if (config.database.type === 'sqlite') {\n const dbPath = resolve(cwd, config.database.path)\n dbOk = existsSync(dbPath)\n checkLine('checking DB', dbOk, `${config.database.path} reachable`)\n } else {\n // For remote DBs we can't check the file — assume reachable (openDB will fail fast if not)\n dbOk = true\n checkLine('checking DB', true, `${config.database.type}://${config.database.connectionString.replace(/:[^:@]*@/, ':***@')} configured`)\n }\n if (!dbOk) allOk = false\n\n // ─── [checking agents] ──────────────────────────────────────────────────────\n const providerFiles = getProviderHealthFiles(config.provider)\n const agentsDir = providerFiles.agentsDir\n const agentNames = ['lead', 'explorer', 'consultant', 'builder', 'reviewer']\n\n const agentsLabelWidth = '[checking agents] '.length\n for (let i = 0; i < agentNames.length; i++) {\n const name = agentNames[i]\n const agentPath = join(cwd, agentsDir, `${name}${providerFiles.agentExtension}`)\n const ok = existsSync(agentPath)\n checkLine(\n i === 0 ? 'checking agents' : null,\n ok,\n `${name}${providerFiles.agentExtension} present`,\n agentsLabelWidth,\n )\n if (!ok) allOk = false\n }\n\n // ─── [checking MCP] ─────────────────────────────────────────────────────────\n if (config.tools.mcp.enabled) {\n const mcpFile = providerFiles.mcpFile\n const mcpPath = resolve(cwd, mcpFile)\n const mcpOk = existsSync(mcpPath)\n checkLine('checking MCP', mcpOk, `${mcpFile} valid`)\n if (!mcpOk) allOk = false\n }\n\n if (!allOk) {\n console.log('')\n console.error(pc.red('✗ Harness checks failed — fix the above before running health.sh'))\n process.exit(1)\n }\n\n // ─── Run health.sh ──────────────────────────────────────────────────────────\n const scriptPath = resolve(cwd, config.health.scriptPath)\n\n if (!existsSync(scriptPath)) {\n console.error(pc.red(`✗ health.sh not found: ${scriptPath}`))\n console.error(' Run ahk init first.')\n process.exit(1)\n }\n\n const result = spawnSync('bash', [scriptPath], {\n cwd,\n stdio: 'inherit',\n encoding: 'utf8',\n })\n\n if (result.error) {\n console.error(pc.red(`✗ Failed to run health.sh: ${result.error.message}`))\n process.exit(1)\n }\n\n if (result.status === 0) {\n console.log(pc.green('✓ Health check passed'))\n process.exit(0)\n } else {\n console.error(pc.red(`✗ Health check failed (exit ${result.status ?? 'unknown'})`))\n process.exit(result.status ?? 1)\n }\n}\n\nfunction getProviderHealthFiles(provider: HarnessConfig['provider']): {\n agentsDir: string\n agentExtension: '.md' | '.toml'\n mcpFile: string\n} {\n switch (provider) {\n case 'claude-code':\n return { agentsDir: '.claude/agents', agentExtension: '.md', mcpFile: '.mcp.json' }\n case 'opencode':\n return { agentsDir: '.opencode/agents', agentExtension: '.md', mcpFile: 'opencode.json' }\n case 'codex-cli':\n return { agentsDir: '.codex/agents', agentExtension: '.toml', mcpFile: '.codex/config.toml' }\n default:\n throw new Error(`Unknown provider: ${provider as string}`)\n }\n}\n","import { mkdirSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport * as p from '@clack/prompts'\nimport pc from 'picocolors'\n\nimport { findConfigFile } from '@/core/config'\nimport { openDB } from '@/core/db'\nimport { syncGlobalAgentsAndSkills } from '@/core/materializer/global-sync'\nimport { getMaterializer } from '@/core/materializer/index'\nimport { slugify } from '@/core/materializer/scaffold-utils'\nimport { configTs, configMjs, configCjs } from '@/core/materializer/templates'\nimport { initDescriptionSchema, initDocsSchema, initNameSchema } from '@/schema/init'\nimport { taskDescriptionSchema, taskTitleSchema } from '@/schema/task'\nimport { cliFormWithRetry } from '@/utils/form'\n\nimport {\n applyConfigDefaults,\n detectConfigExtension,\n drawBox,\n printWelcomeMessage,\n readProjectNameFromPackageJson,\n} from './init-helpers'\n\nimport type { Provider } from '@/types'\n\ninterface InitOptions {\n name?: string\n provider?: string\n docs?: string\n tasks?: string\n storageScope?: string\n}\n\nexport async function runInit(cwd: string, flags: InitOptions): Promise<void> {\n const existingConfig = findConfigFile(cwd)\n if (existingConfig) {\n console.log(\n pc.yellow('⚠') +\n ' ' +\n pc.bold('Project already initialized.') +\n pc.dim(` (${existingConfig})`)\n )\n console.log()\n console.log(pc.dim('Suggested next steps:'))\n console.log(\n ' ' +\n pc.cyan('ahk build') +\n pc.dim(' — re-sync agent files after updating the library')\n )\n console.log(' ' + pc.cyan('ahk build --sync') + pc.dim(' — also sync agent permissions'))\n console.log(\n ' ' + pc.cyan('ahk reset') + pc.dim(' — wipe and re-initialize from scratch')\n )\n console.log(' ' + pc.cyan('ahk dashboard') + pc.dim(' — open the harness dashboard'))\n process.exit(0)\n }\n\n const detectedName = flags.name ?? readProjectNameFromPackageJson(cwd)\n const projectName = detectedName || 'my-project'\n printWelcomeMessage(projectName)\n\n // ─── Project name ────────────────────────────────────────────────────────\n let name: string\n if (flags.name) {\n name = flags.name\n } else {\n name = await cliFormWithRetry(async () => {\n const val = await p.text({\n message: 'Project name',\n placeholder: 'my-app',\n ...(detectedName && { initialValue: detectedName }),\n })\n if (p.isCancel(val)) {\n p.cancel('Cancelled.')\n process.exit(0)\n }\n return val as string\n }, initNameSchema)\n }\n\n // ─── Description ─────────────────────────────────────────────────────────\n const description = await cliFormWithRetry(async () => {\n const val = await p.text({\n message: 'Short description (shown to agents as context)',\n placeholder: 'A REST API for managing notes',\n })\n if (p.isCancel(val)) {\n p.cancel('Cancelled.')\n process.exit(0)\n }\n return val as string\n }, initDescriptionSchema)\n\n // ─── Provider ─────────────────────────────────────────────────────────────\n let provider: Provider\n if (flags.provider && ['claude-code', 'opencode'].includes(flags.provider)) {\n provider = flags.provider as Provider\n } else {\n const val = await p.select({\n message: 'AI provider',\n options: [\n { value: 'opencode', label: 'OpenCode' },\n { value: 'claude-code', label: 'Claude Code' },\n { value: 'codex-cli', label: 'Codex CLI' },\n ],\n })\n if (p.isCancel(val)) {\n p.cancel('Cancelled.')\n process.exit(0)\n }\n provider = val satisfies Provider\n }\n\n // ─── Per-agent model customization (provider-conditional) ────────────────\n // OpenCode: no closed enum for models — skip entirely, no prompts at all.\n const AGENT_LABELS: { key: 'lead' | 'explorer' | 'consultant' | 'builder' | 'reviewer'; label: string }[] = [\n { key: 'lead', label: 'Lead' },\n { key: 'explorer', label: 'Explorer' },\n { key: 'consultant', label: 'Consultant' },\n { key: 'builder', label: 'Builder' },\n { key: 'reviewer', label: 'Reviewer' },\n ]\n const modelOverrides: Partial<Record<'lead' | 'explorer' | 'consultant' | 'builder' | 'reviewer', string>> = {}\n\n if (provider === 'claude-code' || provider === 'codex-cli') {\n const wantsModelCustomization = await p.confirm({\n message: '¿Personalizar el modelo por agente?',\n initialValue: false,\n })\n if (p.isCancel(wantsModelCustomization)) {\n p.cancel('Cancelled.')\n process.exit(0)\n }\n\n if (wantsModelCustomization) {\n if (provider === 'claude-code') {\n for (const agent of AGENT_LABELS) {\n const val = await p.select({\n message: `Modelo para ${agent.label}`,\n options: [\n { value: 'inherit', label: 'inherit (default)' },\n { value: 'haiku', label: 'haiku' },\n { value: 'sonnet', label: 'sonnet' },\n { value: 'opus', label: 'opus' },\n { value: 'fable', label: 'fable' },\n ],\n initialValue: 'inherit',\n })\n if (p.isCancel(val)) {\n p.cancel('Cancelled.')\n process.exit(0)\n }\n modelOverrides[agent.key] = val as string\n }\n } else {\n // codex-cli: free text. Codex does not validate this value client-side —\n // leaving it blank or under 3 characters means no override will be written.\n for (const agent of AGENT_LABELS) {\n const val = await p.text({\n message: `Modelo para ${agent.label} (Codex no valida este valor)`,\n placeholder: 'ej. gpt-5 (vacío o <3 caracteres = sin override)',\n })\n if (p.isCancel(val)) {\n p.cancel('Cancelled.')\n process.exit(0)\n }\n const trimmed = (val as string).trim()\n if (trimmed.length >= 3) {\n modelOverrides[agent.key] = trimmed\n }\n }\n }\n }\n }\n\n // ─── Docs path ────────────────────────────────────────────────────────────\n let docsPath: string\n if (flags.docs) {\n docsPath = flags.docs\n } else {\n docsPath = await cliFormWithRetry(async () => {\n const val = await p.text({\n message: 'Docs folder path (agents will search here)',\n initialValue: './docs',\n })\n if (p.isCancel(val)) {\n p.cancel('Cancelled.')\n process.exit(0)\n }\n return val as string\n }, initDocsSchema)\n }\n\n // ─── Storage scope ────────────────────────────────────────────────────────\n let storageScope: 'local' | 'global'\n if (flags.storageScope && ['local', 'global'].includes(flags.storageScope)) {\n storageScope = flags.storageScope as 'local' | 'global'\n } else {\n const val = await p.select({\n message: 'Storage scope',\n options: [\n { value: 'local', label: 'Local — .harness/harness.db lives in this project' },\n { value: 'global', label: 'Global — DB lives under ~/.harness/dbs/<projectId>/, outside the project' },\n ],\n initialValue: 'local',\n })\n if (p.isCancel(val)) {\n p.cancel('Cancelled.')\n process.exit(0)\n }\n storageScope = val as 'local' | 'global'\n }\n\n // ─── Task adapter ─────────────────────────────────────────────────────────\n let tasksAdapter: string\n if (flags.tasks && ['local', 'jira', 'linear'].includes(flags.tasks)) {\n tasksAdapter = flags.tasks\n } else {\n const val = await p.select({\n message: 'Task adapter',\n options: [\n { value: 'local', label: 'Local (feature_list.json)' },\n { value: 'jira', label: 'Jira (coming soon)' },\n { value: 'linear', label: 'Linear (coming soon)' },\n ],\n })\n if (p.isCancel(val)) {\n p.cancel('Cancelled')\n process.exit(0)\n }\n tasksAdapter = val as string\n }\n\n // ─── Optional first task ──────────────────────────────────────────────────\n const addFirstTask = await p.confirm({ message: 'Add your first task now?', initialValue: false })\n if (p.isCancel(addFirstTask)) {\n p.cancel('Cancelled')\n process.exit(0)\n }\n\n let firstTask: { title: string; description: string; acceptance: string[] } | undefined\n\n if (addFirstTask) {\n const taskTitle = await cliFormWithRetry(async () => {\n const val = await p.text({ message: 'Task title' })\n if (p.isCancel(val)) {\n p.cancel('Cancelled')\n process.exit(0)\n }\n return (val as string).trim()\n }, taskTitleSchema)\n\n const taskDesc = await cliFormWithRetry(async () => {\n const val = await p.text({ message: 'Task description', placeholder: 'What and why' })\n if (p.isCancel(val)) {\n p.cancel('Cancelled')\n process.exit(0)\n }\n return (val as string).trim()\n }, taskDescriptionSchema)\n\n const acceptance: string[] = []\n p.log.info('Acceptance criteria — one per line, empty line to finish')\n while (true) {\n const criterionVal = await p.text({\n message: '>',\n placeholder: 'Criterion (or press Enter to finish)',\n })\n if (p.isCancel(criterionVal) || !criterionVal || !(criterionVal as string).trim()) break\n acceptance.push((criterionVal as string).trim())\n }\n\n firstTask = { title: taskTitle, description: taskDesc, acceptance }\n }\n\n // ─── Scaffold ─────────────────────────────────────────────────────────────\n let configExt: 'ts' | 'mjs' | 'cjs' = 'ts'\n let globalSyncResult: Awaited<ReturnType<typeof syncGlobalAgentsAndSkills>> | null = null\n const spinner = p.spinner()\n spinner.start('Scaffolding...')\n\n try {\n const config = applyConfigDefaults({\n name,\n description,\n provider,\n docsPath,\n tasksAdapter,\n models: modelOverrides,\n scope: storageScope,\n })\n const materializer = getMaterializer(provider)\n\n const installDir = cwd\n\n configExt = detectConfigExtension(cwd)\n const configFileName = `agent-harness-kit.config.${configExt}`\n const templateFn = configExt === 'ts' ? configTs : configExt === 'mjs' ? configMjs : configCjs\n const configContent = templateFn({\n name,\n description,\n provider,\n docsPath,\n tasksAdapter,\n port: config.tools.mcp.port,\n models: modelOverrides,\n scope: config.storage.scope,\n projectId: config.storage.projectId,\n })\n writeFileSync(join(installDir, configFileName), configContent, 'utf8')\n\n // Create .harness dir (always project-local, regardless of storage scope —\n // this is where health.sh, scripts, and storage-state.json live)\n mkdirSync(join(installDir, config.storage.dir), { recursive: true })\n\n // Initialize SQLite DB (scope-aware: local → .harness/harness.db, global → ~/.harness/dbs/<projectId>/harness.db)\n const db = await openDB(config, installDir)\n\n // Always write .harness/storage-state.json — reflects the REAL current\n // storage state (project-local regardless of scope). Consumed by the\n // future `ahk migrate storage` command.\n await db.writeStorageState(installDir)\n\n // Scaffold provider-specific files\n await materializer.scaffold(config, { cwd: installDir, firstTask })\n\n // Global storage scope also implies globally-installed agents/skills —\n // sync them into the user's home dir (idempotent: only missing files are\n // created, already-synced files are left untouched).\n if (config.storage.scope === 'global') {\n globalSyncResult = await syncGlobalAgentsAndSkills(config, provider)\n }\n\n // Seed first task into DB if provided\n if (firstTask) {\n const slug = slugify(firstTask.title)\n await db.addTask({\n slug,\n title: firstTask.title,\n description: firstTask.description,\n acceptance: firstTask.acceptance,\n })\n }\n\n await db.close()\n spinner.stop('')\n } catch (err) {\n spinner.stop('Failed')\n p.log.error(err instanceof Error ? err.message : String(err))\n throw err\n }\n\n console.log(pc.green('✓ Scaffolded harness in current directory'))\n\n // ─── Summary ─────────────────────────────────────────────────────────────-\n const agentsDir = provider === 'claude-code' ? '.claude/agents/' : '.opencode/agents/'\n const mcpFile = provider === 'claude-code' ? '.claude/mcp.json' : './opencode.json'\n\n console.log('')\n console.log(pc.green(`✓ agent-harness-kit.config.${configExt}`))\n console.log(pc.green('✓ AGENTS.md'))\n console.log(pc.green('✓ health.sh'))\n console.log(pc.green(storageScope === 'global' ? '✓ ~/.harness/dbs/<projectId>/harness.db' : '✓ .harness/harness.db'))\n console.log(pc.green(storageScope === 'global' ? '✓ ~/.harness/dbs/<projectId>/current.md' : '✓ .harness/current.md'))\n console.log(pc.green('✓ .harness/storage-state.json'))\n console.log(pc.green(`✓ ${agentsDir}lead.md`))\n console.log(pc.green(`✓ ${agentsDir}explorer.md`))\n console.log(pc.green(`✓ ${agentsDir}builder.md`))\n console.log(pc.green(`✓ ${agentsDir}reviewer.md`))\n console.log(pc.green(`✓ ${mcpFile}`))\n console.log(pc.green('✓ .gitignore entries added'))\n\n if (globalSyncResult) {\n console.log('')\n if (globalSyncResult.alreadySynced) {\n console.log(pc.dim('✓ Global agents/skills already synced — skipped'))\n } else {\n for (const name of globalSyncResult.createdAgents) {\n console.log(pc.green(`✓ ~global agent added: ${name}`))\n }\n for (const name of globalSyncResult.createdSkills) {\n console.log(pc.green(`✓ ~global skill added: ${name}`))\n }\n }\n }\n\n console.log('')\n console.log(pc.cyan('→') + ` Edit ${pc.cyan('health.sh')} with your project checks`)\n console.log(pc.cyan('→') + ` ${pc.cyan('ahk task add')} to queue work for agents`)\n console.log(\n pc.cyan('→') +\n ` Enrich your docs with knowledge graphs: ${pc.cyan('https://github.com/safishamsi/graphify')}`\n )\n\n const recommendations: string[] = [\n ` Give a try to Heimdall MCP: Transparent proxy that traces every MCP tool call with OpenTelemetry. `,\n ` Learn more: ${pc.cyan('https://github.com/enmanuelmag/heimdall-mcp')} `,\n ]\n\n console.log('')\n drawBox(recommendations)\n}\n","import { homedir } from 'node:os'\n\nimport {\n generateExpectedAgentContent,\n getGlobalDoctorStatus,\n getGlobalProviderAgentDir,\n getGlobalProviderSkillsDir,\n} from '@/core/doctor'\nimport { writeAgentFile, writeSkill } from '@/core/materializer/scaffold-utils'\n\nimport type { AgentName } from '@/core/doctor'\nimport type { HarnessConfig, Provider } from '@/types'\n\nexport interface GlobalSyncResult {\n /** true when every global agent/skill file was already present and matched. */\n alreadySynced: boolean\n createdAgents: string[]\n createdSkills: string[]\n}\n\n/**\n * Synchronizes provider agents/skills into the user's home directory\n * (`~/.claude`, `~/.codex` + `~/.agents/skills`, `~/.config/opencode`) when\n * `storage.scope === 'global'`. Reuses getGlobalDoctorStatus() for detection\n * (missing/outdated/ok) — this module never re-implements the comparison\n * logic, it only decides WHAT to write based on that status and performs the\n * write via the existing writeAgentFile/writeSkill preserve-if-exists\n * helpers, so running `ahk init --storage-scope global` from multiple\n * projects never duplicates or clobbers already-synced global files.\n *\n * `outdated` files are intentionally left untouched — same \"preserve dev\n * customizations\" policy already used by the project-local scaffold flow.\n * Only `missing` files are created.\n */\nexport async function syncGlobalAgentsAndSkills(\n config: HarnessConfig,\n provider: Provider,\n homeDir: string = homedir()\n): Promise<GlobalSyncResult> {\n const status = await getGlobalDoctorStatus(provider, config, homeDir)\n const missingAgents = status.agents.filter((a) => a.status === 'missing')\n const missingSkills = status.skills.filter((s) => s.status === 'missing')\n\n if (missingAgents.length === 0 && missingSkills.length === 0) {\n return { alreadySynced: true, createdAgents: [], createdSkills: [] }\n }\n\n const projectName = config.project.name\n const allowedPaths = (config.agents.explorer.allowedPaths ?? []).join(', ')\n const writablePaths = (config.agents.builder.writablePaths ?? []).join(', ')\n const models: Partial<Record<AgentName, string | undefined>> = {\n lead: config.agents.lead.model,\n explorer: config.agents.explorer.model,\n consultant: config.agents.consultant?.model,\n builder: config.agents.builder.model,\n reviewer: config.agents.reviewer.model,\n }\n\n const createdAgents: string[] = []\n if (missingAgents.length > 0) {\n const { agentsDir, ext } = getGlobalProviderAgentDir(provider, homeDir)\n for (const agent of missingAgents) {\n const name = agent.name as AgentName\n const content = generateExpectedAgentContent(name, provider, {\n projectName,\n allowedPaths,\n writablePaths,\n model: models[name],\n })\n writeAgentFile(agentsDir, `${name}${ext}`, content)\n createdAgents.push(name)\n }\n }\n\n const createdSkills: string[] = []\n if (missingSkills.length > 0) {\n const skillsDir = getGlobalProviderSkillsDir(provider, homeDir)\n for (const skill of missingSkills) {\n writeSkill(skillsDir, skill.name)\n createdSkills.push(skill.name)\n }\n }\n\n return { alreadySynced: false, createdAgents, createdSkills }\n}\n","\nimport * as v from 'valibot'\n\nexport const initNameSchema = v\n .pipe(\n v.string(),\n v.nonEmpty('Project name is required'),\n v.minLength(3, 'Project name must be at least 3 characters'),\n v.maxLength(50, 'Project name must be at most 50 characters'),\n v.trim(),\n )\n\nexport const initDescriptionSchema = v\n .pipe(\n v.string(),\n v.nonEmpty('Description is required'),\n v.maxLength(300, 'Description must be at most 300 characters'),\n v.trim(),\n )\n\nexport const initDocsSchema = v\n .pipe(\n v.string(),\n v.nonEmpty('Docs folder path is required'),\n v.regex(/^[\\w\\-./]+$/, 'Docs folder path can only contain letters, numbers, dashes, underscores, dots, and slashes'),\n v.trim(),\n )","import * as v from 'valibot'\n\nexport const taskTitleSchema = v.pipe(\n v.string(),\n v.nonEmpty('Task title is required'),\n v.minLength(3, 'Task title must be at least 3 characters'),\n v.maxLength(100, 'Task title must be at most 100 characters'),\n)\n\nexport const taskDescriptionSchema = v.pipe(\n v.string(),\n v.nonEmpty('Description is required'),\n v.maxLength(1000, 'Description must be at most 1000 characters'),\n)\n","import * as p from '@clack/prompts'\nimport * as v from 'valibot'\n\n\nexport const cliFormWithRetry = async <T>(\n formFn: () => Promise<T>,\n schema: v.GenericSchema,\n): Promise<T> => {\n while (true) {\n const res = await formFn()\n const result = v.safeParse(schema, res)\n\n if (result.success) return result.output as T\n\n const messages = result.issues.map((i) => i.message).join(', ')\n p.log.error(messages)\n p.log.info('Please try again.\\n')\n }\n}\n","import { randomUUID } from 'node:crypto'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport pc from 'picocolors'\n\nimport type { HarnessConfig, Provider } from '@/types'\n\n/**\n * Read the `name` field from a `package.json` in the given directory.\n * Returns `null` if the file doesn't exist, is malformed, or lacks a valid `name`.\n */\nexport function readProjectNameFromPackageJson(cwd: string): string | null {\n try {\n const pkgPath = join(cwd, 'package.json')\n if (!existsSync(pkgPath)) return null\n const content = readFileSync(pkgPath, 'utf8')\n const pkg = JSON.parse(content)\n const name = pkg?.name\n if (typeof name === 'string' && name.trim()) return name.trim()\n return null\n } catch {\n return null\n }\n}\n\nexport function detectConfigExtension(cwd: string): 'ts' | 'mjs' | 'cjs' {\n try {\n if (existsSync(join(cwd, 'tsconfig.json'))) return 'ts'\n const pkgPath = join(cwd, 'package.json')\n if (!existsSync(pkgPath)) return 'mjs'\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'))\n if (pkg?.type === 'module') return 'mjs'\n } catch {}\n return 'mjs'\n}\n\nexport function applyConfigDefaults(params: {\n name: string\n description: string\n provider: Provider\n docsPath: string\n tasksAdapter: string\n models?: Partial<Record<'lead' | 'explorer' | 'consultant' | 'builder' | 'reviewer', string>>\n /** Storage scope chosen during init. Defaults to 'local' for backward compat. */\n scope?: 'local' | 'global'\n /** Reuse an existing projectId (e.g. re-running init logic). If omitted, a\n * fresh UUID is generated — NEVER derive it from the project path/hash. */\n projectId?: string\n}): HarnessConfig {\n const models = params.models ?? {}\n return {\n provider: params.provider,\n project: {\n name: params.name,\n description: params.description,\n docsPath: params.docsPath,\n agentsMd: './AGENTS.md',\n },\n agents: {\n lead: { instructionsPath: null, ...(models.lead && { model: models.lead }) },\n explorer: {\n instructionsPath: null,\n allowedPaths: [params.docsPath, './src'],\n ...(models.explorer && { model: models.explorer }),\n },\n builder: {\n instructionsPath: null,\n writablePaths: ['./src', './tests'],\n ...(models.builder && { model: models.builder }),\n },\n reviewer: { instructionsPath: null, ...(models.reviewer && { model: models.reviewer }) },\n ...(models.consultant && { consultant: { instructionsPath: null, model: models.consultant } }),\n custom: [],\n },\n database: { type: 'sqlite' as const, path: '.harness/harness.db' },\n storage: {\n dir: '.harness',\n tasks: { adapter: params.tasksAdapter as 'local' },\n sections: {\n toolsUsed: true,\n filesModified: true,\n result: true,\n blockers: true,\n nextSteps: false,\n },\n markdownFallback: { enabled: true, path: '.harness/current.md' },\n scope: params.scope ?? 'local',\n projectId: params.projectId ?? randomUUID(),\n },\n health: {\n scriptPath: './health.sh',\n required: true,\n },\n tools: {\n mcp: { enabled: true, port: 3742 },\n scripts: { enabled: true, outputDir: './.harness/scripts' },\n },\n }\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n\n/** Strip ANSI escape codes for width calculation */\nfunction stripAnsi(str: string): string {\n return str.replace(/\\x1B\\[[0-9;]*m/g, '')\n}\n\n\n/** Draw a bordered box matching printUpdateMessage() style */\nexport function drawBox(lines: string[]): void {\n // Calculate max content width (excluding ANSI codes)\n const width = Math.max(...lines.map((l) => stripAnsi(l).length))\n const border = '─'.repeat(width)\n\n console.log(pc.yellow(`┌${border}┐`))\n for (const line of lines) {\n const pad = width - stripAnsi(line).length\n const padStr = pad > 0 ? ' '.repeat(pad) : ''\n console.log(pc.yellow('│') + line + padStr + pc.yellow('│'))\n }\n console.log(pc.yellow(`└${border}┘`))\n}\n\n/**\n * Print a pretty welcome message when user executes the init command.\n * Styled to match the existing printUpdateMessage() aesthetic.\n */\nexport function printWelcomeMessage(projectName: string): void {\n const sep = '─'.repeat(38)\n\n // Build lines with embedded ANSI codes for width calculation\n const lines: string[] = [\n ` ${pc.bold(pc.white('agent-harness-kit'))} `,\n ` ${pc.gray('—')} harness scaffolding ${pc.gray('—')} `,\n ` ${pc.gray(sep)} `,\n ` ${pc.bold('Project:')} ${projectName || '—'} `,\n ` ${pc.bold('Status:')} ${pc.green('ready to configure')} `,\n ` ${pc.gray(sep)} `,\n ` ${pc.gray('Next steps:')} `,\n ` ${pc.gray('→')} ${pc.gray('Set up your AI provider config')} `,\n ` ${pc.gray('→')} ${pc.gray('Run your health check to verify')} `,\n ` ${pc.gray('→')} ${pc.gray('Start adding tasks for your agents')} `,\n ]\n\n console.log()\n drawBox(lines)\n console.log()\n}\n","import * as p from '@clack/prompts'\nimport pc from 'picocolors'\n\nimport { loadConfig } from '@/core/config'\nimport { getMaterializer } from '@/core/materializer/index'\n\nimport type { Provider } from '@/types'\n\ninterface MigrateOptions {\n to?: string\n}\n\nexport async function runMigrate(cwd: string, opts: MigrateOptions): Promise<void> {\n const config = await loadConfig(cwd)\n\n let target: Provider\n if (opts.to && ['claude-code', 'opencode', 'codex-cli'].includes(opts.to)) {\n target = opts.to as Provider\n } else {\n const val = await p.select({\n message: 'Migrate to provider',\n options: [\n { value: 'claude-code', label: 'Claude Code' },\n { value: 'opencode', label: 'OpenCode' },\n { value: 'codex-cli', label: 'Codex CLI' },\n ],\n })\n if (p.isCancel(val)) {\n p.cancel('Cancelled.')\n process.exit(0)\n }\n target = val as Provider\n }\n\n if (target === config.provider) {\n console.log(pc.dim(`Already on ${target} — nothing to migrate.`))\n return\n }\n\n const spinner = p.spinner()\n spinner.start(`Migrating from ${config.provider} to ${target}...`)\n\n try {\n // Scaffold the new provider's files\n const targetMaterializer = getMaterializer(target)\n await targetMaterializer.build(config, cwd)\n\n spinner.stop(pc.green(`Migrated to ${target}`))\n p.log.warn(`Update agent-harness-kit.config.ts: set provider: '${target}'`)\n p.log.warn(`Then run: ahk build`)\n } catch (err) {\n spinner.stop(pc.red('Migration failed'))\n p.log.error(err instanceof Error ? err.message : String(err))\n process.exit(1)\n }\n}\n","import { copyFileSync, existsSync, mkdirSync, rmSync, writeFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { dirname, join, resolve } from 'node:path'\nimport pc from 'picocolors'\n\nimport { loadConfig } from '@/core/config'\nimport {\n type FullExport,\n getRowCounts,\n isEmptyDatabase,\n openDB,\n readStorageStateFile,\n resolveGlobalStorageDir,\n resolveSqlitePathForScope,\n} from '@/core/db'\n\nimport type { DatabaseConfig, HarnessConfig } from '@/types'\n\nexport interface MigrateStorageOptions {\n force?: boolean\n dryRun?: boolean\n}\n\ntype DbType = DatabaseConfig['type']\n\nfunction log(msg: string): void {\n console.log(msg)\n}\n\n/** Aborts the current migration by throwing — callers (the CLI action\n * handler) are responsible for printing the message and exiting non-zero.\n * Throwing (rather than calling process.exit here) keeps this module\n * testable without killing the test process. */\nfunction fail(msg: string): never {\n throw new Error(msg)\n}\n\n/** Physical location of a project's harness `current.md`, following the same\n * scope convention `HarnessDB.regenerateCurrentMd()` uses. */\nfunction currentMdPathForScope(scope: 'local' | 'global', config: HarnessConfig, cwd: string, homeDir: string): string {\n return scope === 'global'\n ? join(resolveGlobalStorageDir(config, homeDir), 'current.md')\n : resolve(cwd, config.storage.markdownFallback.path)\n}\n\n/** Backs up the destination's current content (all 6 tables, via\n * exportJson()) to a local JSON file BEFORE any destructive `--force`\n * overwrite. Aborts the whole command (throws) if the backup can't be\n * written — fail-safe, per task #47 consultant advisory point 2. */\nasync function backupDestination(cwd: string, storageDir: string, data: FullExport): Promise<string> {\n const backupsDir = resolve(cwd, storageDir, 'backups')\n const path = join(backupsDir, `pre-migrate-${new Date().toISOString().replace(/[:.]/g, '-')}.json`)\n try {\n mkdirSync(backupsDir, { recursive: true })\n writeFileSync(path, JSON.stringify(data, null, 2) + '\\n', 'utf8')\n } catch (err) {\n throw new Error(\n `Could not write destination backup to ${path} (${err instanceof Error ? err.message : String(err)}). ` +\n `Aborting migration WITHOUT touching the destination — nothing was overwritten.`,\n )\n }\n return path\n}\n\n/** Copies a sqlite `.db` file (plus WAL/SHM sidecars if present) to a new\n * path, verifying the copy exists before returning. Does not delete the\n * original — caller decides when it's safe to remove it. */\nfunction copySqliteFile(srcPath: string, destPath: string): void {\n mkdirSync(dirname(destPath), { recursive: true })\n copyFileSync(srcPath, destPath)\n for (const suffix of ['-wal', '-shm']) {\n if (existsSync(`${srcPath}${suffix}`)) {\n copyFileSync(`${srcPath}${suffix}`, `${destPath}${suffix}`)\n }\n }\n if (!existsSync(destPath)) {\n throw new Error(`Copy verification failed: ${destPath} does not exist after copy.`)\n }\n}\n\nexport async function runMigrateStorage(\n cwd: string,\n opts: MigrateStorageOptions,\n homeDir: string = homedir(),\n): Promise<void> {\n const config = await loadConfig(cwd)\n const storageDir = config.storage.dir\n const state = readStorageStateFile(cwd, storageDir)\n\n // ── Case: storage-state.json is missing ──────────────────────────────────\n // NEVER treat this as \"destination empty, safe to migrate\". Probe the real\n // content at both sqlite candidate locations (local + global default\n // paths) before deciding anything. See task #47 consultant advisory pt.6.\n let realScope: 'local' | 'global'\n let realDbType: DbType\n\n if (!state) {\n const defaultSqlitePath = config.database.type === 'sqlite' ? config.database.path : '.harness/harness.db'\n const localPath = resolveSqlitePathForScope('local', defaultSqlitePath, cwd, config, homeDir)\n const globalPath = resolveSqlitePathForScope('global', defaultSqlitePath, cwd, config, homeDir)\n\n const localCount = await probeTaskCount(localPath)\n const globalCount = await probeTaskCount(globalPath)\n\n if (localCount > 0 && globalCount > 0) {\n fail(\n `storage-state.json is missing and BOTH candidate locations have data — ` +\n `local (${localPath}): ${localCount} task(s); global (${globalPath}): ${globalCount} task(s). ` +\n `Refusing to guess which one is authoritative. Resolve manually (inspect both databases) ` +\n `or delete the one that should be discarded, then re-run this command.`,\n )\n }\n\n if (localCount === 0 && globalCount === 0) {\n // Nothing exists anywhere yet — nothing to migrate. Just record the\n // current (desired) state so future runs have a storage-state.json.\n const db = await openDB(config, cwd, homeDir)\n try {\n await db.writeStorageState(cwd)\n } finally {\n await db.close()\n }\n log(pc.dim('storage-state.json was missing; no data found at either candidate location. Nothing to migrate — state recorded.'))\n return\n }\n\n // Exactly one candidate has data — self-heal: treat it as the real\n // (source) location without requiring --force, since this isn't a\n // blind guess (only one plausible source exists).\n realScope = localCount > 0 ? 'local' : 'global'\n realDbType = 'sqlite'\n log(\n pc.yellow(\n `storage-state.json was missing. Detected real data at ${realScope} sqlite location ` +\n `(${realScope === 'local' ? localPath : globalPath}) — using it as the migration source.`,\n ),\n )\n } else {\n realScope = state.scope\n realDbType = state.dbType\n }\n\n const desiredScope = config.storage.scope\n const desiredDbType = config.database.type\n\n // ── Case 1: everything matches — nothing to migrate ──────────────────────\n if (realScope === desiredScope && realDbType === desiredDbType) {\n log(pc.green(`✓ Storage already matches config (scope=${desiredScope}, database=${desiredDbType}) — nothing to migrate.`))\n return\n }\n\n // ── Unsupported direction: source was a remote DB ─────────────────────────\n // storage-state.json intentionally never stores connection strings/creds,\n // so we cannot auto-reconnect to a previous remote database. Out of scope\n // for this command — fail safe rather than guess.\n if (realDbType !== 'sqlite') {\n fail(\n `Cannot auto-locate the previous ${realDbType} database — storage-state.json does not retain connection ` +\n `credentials for security. Manually run \"ahk export --json\" while still connected to the old database ` +\n `(with the old config), then adjust agent-harness-kit.config.ts and re-import. This direction is out of scope for \"ahk migrate storage\".`,\n )\n }\n\n // ── Case: scope changes but dbType stays sqlite → move files directly ────\n if (desiredDbType === 'sqlite' && realDbType === 'sqlite') {\n return migrateScopeOnly(cwd, config, homeDir, realScope, desiredScope, opts)\n }\n\n // ── Case: dbType changes (sqlite -> postgres/mysql, or vice versa is\n // unsupported above) → full export/import through a transaction ──────\n return migrateAcrossDbType(cwd, config, homeDir, realScope, opts)\n}\n\n/** Returns the number of rows in `tasks` at `dbPath`, or 0 if the file\n * doesn't exist. Never creates the file (existence is checked first) —\n * probing must not have side effects. */\nasync function probeTaskCount(dbPath: string): Promise<number> {\n if (!existsSync(dbPath)) return 0\n const { SQLiteDriver } = await import('@/core/drivers/sqlite')\n const driver = new SQLiteDriver(dbPath)\n try {\n await driver.ensureSchema()\n const counts = await getRowCounts(driver)\n return counts.tasks\n } finally {\n await driver.close()\n }\n}\n\n// ─── Case: local <-> global, same engine (sqlite) ──────────────────────────\n\nasync function migrateScopeOnly(\n cwd: string,\n config: HarnessConfig,\n homeDir: string,\n fromScope: 'local' | 'global',\n toScope: 'local' | 'global',\n opts: MigrateStorageOptions,\n): Promise<void> {\n const sqlitePath = config.database.type === 'sqlite' ? config.database.path : '.harness/harness.db'\n const srcDb = resolveSqlitePathForScope(fromScope, sqlitePath, cwd, config, homeDir)\n const destDb = resolveSqlitePathForScope(toScope, sqlitePath, cwd, config, homeDir)\n const srcMd = currentMdPathForScope(fromScope, config, cwd, homeDir)\n const destMd = currentMdPathForScope(toScope, config, cwd, homeDir)\n\n if (!existsSync(srcDb)) {\n fail(`Source database not found at ${srcDb} (expected ${fromScope} scope) — nothing to move.`)\n }\n\n const destExists = existsSync(destDb)\n if (destExists) {\n const { SQLiteDriver } = await import('@/core/drivers/sqlite')\n const destDriver = new SQLiteDriver(destDb)\n let destEmpty: boolean\n try {\n await destDriver.ensureSchema()\n destEmpty = await isEmptyDatabase(destDriver)\n } finally {\n await destDriver.close()\n }\n if (!destEmpty && !opts.force) {\n fail(\n `Destination (${toScope}, ${destDb}) already has data. Re-run with --force to overwrite it ` +\n `(a backup of the destination will be written first).`,\n )\n }\n if (!destEmpty && opts.force) {\n // Back up destination content before overwriting.\n const { SQLiteDriver: Driver } = await import('@/core/drivers/sqlite')\n const backupDriver = new Driver(destDb)\n let data: FullExport\n try {\n await backupDriver.ensureSchema()\n const { HarnessDB } = await import('@/core/db')\n const tmpDb = new HarnessDB(backupDriver, { ...config, storage: { ...config.storage, scope: toScope } }, homeDir)\n data = await tmpDb.exportJson()\n } finally {\n await backupDriver.close()\n }\n const backupPath = await backupDestination(cwd, config.storage.dir, data)\n log(pc.yellow(` Backed up existing destination data → ${backupPath}`))\n }\n }\n\n if (opts.dryRun) {\n log(pc.dim(`[dry-run] Would copy ${srcDb} → ${destDb} (scope ${fromScope} → ${toScope}), and move current.md.`))\n return\n }\n\n copySqliteFile(srcDb, destDb)\n log(pc.green(`✓ Copied database ${srcDb} → ${destDb}`))\n\n if (existsSync(srcMd)) {\n mkdirSync(dirname(destMd), { recursive: true })\n copyFileSync(srcMd, destMd)\n log(pc.green(`✓ Copied current.md ${srcMd} → ${destMd}`))\n }\n\n // Only remove the source AFTER the copy is verified in place.\n rmSync(srcDb, { force: true })\n rmSync(`${srcDb}-wal`, { force: true })\n rmSync(`${srcDb}-shm`, { force: true })\n if (existsSync(srcMd) && srcMd !== destMd) rmSync(srcMd, { force: true })\n\n // Write storage-state ONLY after the move is confirmed successful.\n const db = await openDB(config, cwd, homeDir)\n try {\n await db.writeStorageState(cwd)\n } finally {\n await db.close()\n }\n\n log(pc.green(`✓ Storage migrated: scope ${fromScope} → ${toScope}`))\n}\n\n// ─── Case: database engine changes (sqlite -> postgres/mysql) ─────────────\n\nasync function migrateAcrossDbType(\n cwd: string,\n config: HarnessConfig,\n homeDir: string,\n sourceScope: 'local' | 'global',\n opts: MigrateStorageOptions,\n): Promise<void> {\n const sqlitePath = config.database.type === 'sqlite' ? config.database.path : '.harness/harness.db'\n const srcPath = resolveSqlitePathForScope(sourceScope, sqlitePath, cwd, config, homeDir)\n if (!existsSync(srcPath)) {\n fail(`Source sqlite database not found at ${srcPath} (expected ${sourceScope} scope) — nothing to migrate.`)\n }\n\n const { SQLiteDriver } = await import('@/core/drivers/sqlite')\n const srcDriver = new SQLiteDriver(srcPath)\n let sourceData: FullExport\n let sourceCounts: Awaited<ReturnType<typeof getRowCounts>>\n try {\n await srcDriver.ensureSchema()\n sourceCounts = await getRowCounts(srcDriver)\n const { HarnessDB } = await import('@/core/db')\n const srcDb = new HarnessDB(srcDriver, { ...config, storage: { ...config.storage, scope: sourceScope }, database: { type: 'sqlite', path: sqlitePath } }, homeDir)\n sourceData = await srcDb.exportJson()\n } finally {\n await srcDriver.close()\n }\n\n // Fail fast: connect to destination before touching anything else.\n let destDb\n try {\n destDb = await openDB(config, cwd, homeDir)\n } catch (err) {\n fail(`Could not connect to destination (${config.database.type}): ${err instanceof Error ? err.message : String(err)}. Verify database configuration.`)\n }\n\n try {\n const destCounts = await destDb.getRowCounts()\n const destEmpty = Object.values(destCounts).every((n) => n === 0)\n const sourceEmpty = Object.values(sourceCounts).every((n) => n === 0)\n\n if (!destEmpty) {\n if (!opts.force) {\n const bothHaveData = !sourceEmpty\n fail(\n bothHaveData\n ? `Both source (${sourceCounts.tasks} task(s)) and destination (${config.database.type}, ${destCounts.tasks} task(s)) ` +\n `have data that DIVERGE — this is not a first-time migration. Refusing to auto-merge. ` +\n `Review both manually, or re-run with --force to overwrite the destination (a JSON backup will be written first).`\n : `Destination (${config.database.type}) already has data (${destCounts.tasks} task(s)). ` +\n `Re-run with --force to overwrite it (a backup of the destination will be written first).`,\n )\n }\n }\n\n if (opts.dryRun) {\n log(\n pc.dim(\n `[dry-run] Would migrate ${sourceCounts.tasks} task(s) from sqlite (${sourceScope}, ${srcPath}) ` +\n `to ${config.database.type}${destEmpty ? '' : ' (destination has data — would back up first, then overwrite)'}.`,\n ),\n )\n return\n }\n\n let backupPath: string | null = null\n if (!destEmpty && opts.force) {\n const currentDestData = await destDb.exportJson()\n backupPath = await backupDestination(cwd, config.storage.dir, currentDestData)\n log(pc.yellow(` Backed up existing destination data → ${backupPath}`))\n }\n\n // Single transaction covers the entire import (and truncate, if any).\n // storage-state is written ONLY after this resolves without throwing.\n await destDb.importFullExport(sourceData, config.database.type, { truncateFirst: !destEmpty })\n\n await destDb.writeStorageState(cwd)\n\n log(\n pc.green(\n `✓ Migrated ${sourceData.tasks.length} task(s), ${sourceData.actions.length} action(s) ` +\n `from sqlite (${sourceScope}) → ${config.database.type}.`,\n ),\n )\n if (backupPath) log(pc.dim(` Destination backup: ${backupPath}`))\n log(pc.yellow(` Note: the original sqlite file at ${srcPath} was NOT deleted — remove it manually once you've verified the migration.`))\n } finally {\n await destDb.close()\n }\n}\n","import { existsSync, readdirSync, rmSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\nimport * as p from '@clack/prompts'\nimport pc from 'picocolors'\n\nimport { loadConfig } from '@/core/config'\n\ninterface ResetOptions {\n force?: boolean\n provider?: 'claude-code' | 'opencode'\n}\n\n// Map of agent names to their .md filenames\nconst AGENT_MD_FILES = ['lead', 'explorer', 'consultant', 'builder', 'reviewer']\n\nasync function resetAgentMds(cwd: string, provider: 'claude-code' | 'opencode'): Promise<void> {\n const agentDir = provider === 'claude-code' ? '.claude/agents' : '.opencode/agents'\n const agentDirPath = resolve(cwd, agentDir)\n\n if (!existsSync(agentDirPath)) {\n console.log(pc.yellow(` Skipping agent files — directory not found: ${agentDirPath}`))\n return\n }\n\n // Collect existing agent MD files\n const existingFiles: string[] = []\n try {\n const files = readdirSync(agentDirPath)\n for (const f of files) {\n if (f.endsWith('.md') && AGENT_MD_FILES.includes(f.replace('.md', ''))) {\n existingFiles.push(f)\n }\n }\n } catch {\n // Directory doesn't exist or can't be read\n console.log(pc.yellow(` Skipping agent files — ${agentDirPath} is not readable`))\n return\n }\n\n if (existingFiles.length === 0) {\n console.log(pc.yellow(` No agent MD files found in ${agentDir}/`))\n return\n }\n\n // Confirm removal of each agent MD file\n for (const file of existingFiles) {\n const confirm = await p.confirm({\n message: `Remove ${file}?`,\n initialValue: true,\n })\n if (p.isCancel(confirm)) {\n console.log(pc.red(' Cancelled by user.'))\n return\n }\n if (confirm) {\n try {\n const filePath = join(agentDirPath, file)\n rmSync(filePath, { force: true })\n console.log(pc.green(` Removed ${file}`))\n } catch {\n console.error(pc.red(` Failed to remove ${file}`))\n }\n } else {\n console.log(pc.cyan(` Skipped ${file}`))\n }\n }\n}\n\nexport async function runReset(cwd: string, opts: ResetOptions): Promise<void> {\n let config\n try {\n config = await loadConfig(cwd)\n } catch {\n console.error(pc.red('✗ No agent-harness-kit.config found. Run: ahk init'))\n process.exit(1)\n }\n\n const storageDir = config.storage.dir || '.harness'\n const dbPath = config.database.type === 'sqlite' ? resolve(cwd, config.database.path) : null\n const featureListPath = resolve(cwd, storageDir, 'feature_list.json')\n\n let resetDb = false\n let resetFeatureList = false\n let resetAgentMdsFlag = false\n\n // ─── Determine what to reset ────────────────────────────────────────────────\n\n // Reset DB? (SQLite only — remote DBs are not reset by this command)\n if (dbPath && existsSync(dbPath)) {\n if (opts.force) {\n resetDb = true\n } else {\n if (config.database.type !== 'sqlite') {\n console.log(pc.yellow(` Skipping DB reset — database type \"${config.database.type}\" is not managed by this command.`))\n resetDb = false\n } else {\n const confirm = await p.confirm({\n message: `Delete database (${config.database.path})?`,\n initialValue: true,\n })\n if (p.isCancel(confirm)) {\n console.log(pc.red(' Cancelled by user.'))\n return\n }\n resetDb = confirm\n }\n }\n } else if (!dbPath) {\n console.log(pc.dim(` Skipping DB reset — remote ${config.database.type} database is not managed by this command.`))\n }\n\n // Reset feature_list.json?\n if (existsSync(featureListPath)) {\n if (opts.force) {\n resetFeatureList = true\n } else {\n const confirm = await p.confirm({\n message: `Delete feature list (${storageDir}/feature_list.json)?`,\n initialValue: true,\n })\n if (p.isCancel(confirm)) {\n console.log(pc.red(' Cancelled by user.'))\n return\n }\n resetFeatureList = confirm\n }\n }\n\n // Reset agent MD files?\n if (opts.provider) {\n resetAgentMdsFlag = true\n }\n\n // ─── Perform resets ─────────────────────────────────────────────────\n if (resetDb && dbPath) {\n try {\n rmSync(dbPath, { force: true })\n rmSync(`${dbPath}-wal`, { force: true }) // also remove WAL file if it exists (only for SQLite)\n rmSync(`${dbPath}-shm`, { force: true }) // also remove SHM file if it exists (only for SQLite)\n console.log(pc.green(` ✓ Removed ${dbPath}`))\n } catch {\n console.error(pc.red(` ✗ Failed to remove ${dbPath}`))\n }\n }\n\n if (resetFeatureList) {\n try {\n rmSync(featureListPath, { force: true })\n console.log(pc.green(` ✓ Removed ${storageDir}/feature_list.json`))\n // = true\n } catch {\n console.error(pc.red(` ✗ Failed to remove ${featureListPath}`))\n }\n }\n\n if (resetAgentMdsFlag) {\n console.log('')\n await resetAgentMds(cwd, opts.provider || 'claude-code')\n }\n\n if (!resetDb && !resetFeatureList && !resetAgentMdsFlag) {\n console.log(pc.yellow(' Nothing to reset (all items missing or skipped).'))\n return\n }\n\n // ─── Summary ────────────────────────────────────────────────────────\n console.log('')\n console.log(pc.green('✓ Reset complete. Run \"ahk init\" to scaffold a fresh harness.'))\n}\n","import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\nimport { Server } from '@modelcontextprotocol/sdk/server'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport {\n CallToolRequestSchema,\n type CallToolResult,\n ListToolsRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js'\n\nimport { type HarnessDB, openDB } from './db'\nimport { getDoctorStatus } from './doctor'\nimport { slugify } from './materializer/scaffold-utils'\nimport { checkPermissionsSync } from './permissions-check'\n\nimport type { ActionFileRow, AgentName, HarnessConfig, TaskStatus } from '@/types'\n\nconst VERSION = '0.1.0'\n\n// ─── Tool schemas ─────────────────────────────────────────────────────────────\n\nconst TOOLS = [\n {\n name: 'actions.start',\n description: 'Start a new action for a task. Returns an actionId (UUID).',\n inputSchema: {\n type: 'object',\n properties: {\n taskId: { type: 'number', description: 'The task ID from tasks.get' },\n agent: {\n type: 'string',\n description: 'Agent name: lead | explorer | builder | reviewer | custom:<name>',\n },\n },\n required: ['taskId', 'agent'],\n },\n },\n {\n name: 'actions.write',\n description:\n 'Record a section in an action. Standard sections: result, tools_used, blockers, next_steps. Note: files_modified is a plain-text note only — it does NOT populate the files dashboard. Use actions.record_file to register files in the dashboard.',\n inputSchema: {\n type: 'object',\n properties: {\n actionId: { type: 'string', description: 'UUID returned by actions.start' },\n sectionType: {\n type: 'string',\n description:\n 'Section name: result | tools_used | blockers | next_steps | <custom>. Do NOT use files_modified to track files — it is stored as plain text only. Use actions.record_file instead.',\n },\n content: { type: 'string', description: 'Content for this section' },\n },\n required: ['actionId', 'sectionType', 'content'],\n },\n },\n {\n name: 'actions.complete',\n description: 'Close an action with a one-line summary.',\n inputSchema: {\n type: 'object',\n properties: {\n actionId: { type: 'string', description: 'UUID of the action to close' },\n summary: { type: 'string', description: 'One-line summary of what was done' },\n },\n required: ['actionId', 'summary'],\n },\n },\n {\n name: 'actions.get',\n description: 'Get the full action history for a task (all agents, all sections).',\n inputSchema: {\n type: 'object',\n properties: {\n taskId: { type: 'number', description: 'Task ID' },\n },\n required: ['taskId'],\n },\n },\n {\n name: 'tasks.get',\n description: 'List tasks, optionally filtered by status. Excludes archived tasks by default.',\n inputSchema: {\n type: 'object',\n properties: {\n status: {\n type: 'string',\n enum: ['pending', 'in_progress', 'done', 'blocked'],\n description: 'Filter by status (omit for all tasks)',\n },\n includeArchived: {\n type: 'boolean',\n description: 'If true, include archived tasks in results',\n },\n },\n },\n },\n {\n name: 'tasks.claim',\n description:\n 'Atomically claim a pending task. Returns task_already_claimed if another agent got it first.',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'number', description: 'Task ID to claim' },\n agent: { type: 'string', description: 'Your agent name' },\n },\n required: ['id', 'agent'],\n },\n },\n {\n name: 'tasks.update',\n description: 'Change the status of a task.',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'number', description: 'Task ID' },\n status: {\n type: 'string',\n enum: ['pending', 'in_progress', 'done', 'blocked'],\n },\n },\n required: ['id', 'status'],\n },\n },\n {\n name: 'docs.search',\n description: 'Search the project docs folder for content matching a query.',\n inputSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Search terms' },\n },\n required: ['query'],\n },\n },\n {\n name: 'actions.record_file',\n description:\n 'Record a file touched during an action. This is the only way to populate the files-touched count shown in the dashboard. Call once per file.',\n inputSchema: {\n type: 'object',\n properties: {\n actionId: { type: 'string', description: 'UUID returned by actions.start' },\n filePath: { type: 'string', description: 'Absolute or repo-relative path of the file' },\n operation: {\n type: 'string',\n enum: ['read', 'created', 'modified', 'deleted'],\n description: 'What was done to the file',\n },\n notes: { type: 'string', description: 'Optional short note about the change' },\n },\n required: ['actionId', 'filePath', 'operation'],\n },\n },\n {\n name: 'tasks.acceptance.update',\n description: 'Mark an acceptance criterion as met. Use the criterion id from tasks.get.',\n inputSchema: {\n type: 'object',\n properties: {\n criterionId: {\n type: 'number',\n description: 'The id of the acceptance criterion to mark as met',\n },\n },\n required: ['criterionId'],\n },\n },\n {\n name: 'tasks.acceptance.get',\n description:\n 'Given a taskId, returns all acceptance criteria for that task with their id, task_id, criterion text, and met status. Use the returned id values to call tasks.acceptance_update(criterionId).',\n inputSchema: {\n type: 'object',\n properties: {\n taskId: { type: 'number', description: 'Task ID' },\n },\n required: ['taskId'],\n },\n },\n {\n name: 'tasks.add',\n description:\n 'Create a new task in the harness. Use this when the user describes work in natural language. Infer slug, title, description, and acceptance criteria from the conversation. Ask for missing critical info before calling.',\n inputSchema: {\n type: 'object',\n properties: {\n title: { type: 'string', description: 'Short human-readable title for the task' },\n slug: {\n type: 'string',\n description:\n 'URL-safe identifier (lowercase, hyphens). Auto-derived from title if omitted.',\n },\n description: { type: 'string', description: 'Longer description of the task goal' },\n acceptance: {\n type: 'array',\n items: { type: 'string' },\n description: 'List of acceptance criteria (plain sentences)',\n },\n },\n required: ['title'],\n },\n },\n {\n name: 'actions.record_tool',\n description:\n 'Record a tool call made during an action. This is the only way to populate the Tools dashboard. Call once per tool invocation.',\n inputSchema: {\n type: 'object',\n properties: {\n actionId: { type: 'string', description: 'UUID returned by actions.start' },\n toolName: {\n type: 'string',\n description: 'Name of the tool that was called (e.g. Read, Bash, Edit)',\n },\n argsJson: {\n type: 'string',\n description: 'Optional JSON string of the arguments passed to the tool',\n },\n resultSummary: { type: 'string', description: 'Optional short summary of the tool result' },\n },\n required: ['actionId', 'toolName'],\n },\n },\n {\n name: 'tasks.edit',\n description:\n 'Edit an existing task (title, description, acceptance criteria). Omitted fields keep their current values.',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'number', description: 'Task ID to edit' },\n title: { type: 'string', description: 'New title (optional)' },\n description: { type: 'string', description: 'New description (optional, null to clear)' },\n acceptance: {\n type: 'array',\n items: { type: 'string' },\n description: 'New acceptance criteria list (optional, null to keep existing)',\n },\n },\n required: ['id'],\n },\n },\n {\n name: 'tasks.archive',\n description:\n 'Archive a task. Archived tasks are hidden from default views (CLI and dashboard).',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'number', description: 'Task ID to archive' },\n },\n required: ['id'],\n },\n },\n {\n name: 'tasks.unarchive',\n description: 'Unarchive a previously archived task, restoring it to default views.',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'number', description: 'Task ID to unarchive' },\n },\n required: ['id'],\n },\n },\n {\n name: 'permissions.check',\n description:\n 'Check whether the .claude/agents/*.md tool permission lists are in sync with the current canonical permission constants. Returns per-agent diff with missing and extra tools. Call this at session start to detect outdated agent files after an ahk upgrade.',\n inputSchema: { type: 'object', properties: {}, required: [] },\n },\n {\n name: 'deps.snapshot',\n description: 'Snapshot current package.json dependencies to .harness/deps-lock.json',\n inputSchema: { type: 'object' as const, properties: {}, required: [] },\n },\n {\n name: 'deps.check',\n description: 'Compare current package.json against .harness/deps-lock.json and report changes',\n inputSchema: { type: 'object' as const, properties: {}, required: [] },\n },\n {\n name: 'ahk.doctor',\n description:\n 'Check lib version, agent files, and harness skills sync status. Returns structured JSON.',\n inputSchema: { type: 'object', properties: {}, required: [] },\n },\n] as const\n\n// ─── Server ───────────────────────────────────────────────────────────────────\n\nexport async function startMcpServer(config: HarnessConfig, cwd: string): Promise<void> {\n const db = await openDB(config, cwd)\n const docsPath = resolve(cwd, config.project.docsPath)\n\n const server = new Server(\n { name: 'agent-harness-kit', version: VERSION },\n { capabilities: { tools: {} } }\n )\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }))\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params\n const a = (args ?? {}) as Record<string, unknown>\n\n try {\n const result = await dispatch(name, a, db, docsPath, cwd, config)\n return result\n } catch (err) {\n return ok(`Error: ${err instanceof Error ? err.message : String(err)}`, true)\n }\n })\n\n const transport = new StdioServerTransport()\n await server.connect(transport)\n}\n\n// ─── Dispatch ─────────────────────────────────────────────────────────────────\n\nasync function dispatch(\n name: string,\n args: Record<string, unknown>,\n db: HarnessDB,\n docsPath: string,\n cwd: string,\n config: HarnessConfig\n): Promise<CallToolResult> {\n switch (name) {\n case 'actions.start': {\n const taskId = num(args, 'taskId')\n const agent = str(args, 'agent') as AgentName\n const action = await db.startAction(taskId, agent)\n return ok(JSON.stringify({ actionId: action.id, taskId, agent, status: 'in_progress' }))\n }\n\n case 'actions.write': {\n const actionId = str(args, 'actionId')\n const sectionType = str(args, 'sectionType')\n const content = str(args, 'content')\n await db.writeSection(actionId, sectionType, content)\n return ok(JSON.stringify({ actionId, sectionType, recorded: true }))\n }\n\n case 'actions.complete': {\n const actionId = str(args, 'actionId')\n const summary = str(args, 'summary')\n const action = await db.completeAction(actionId, summary)\n return ok(\n JSON.stringify({ actionId, status: action.status, completedAt: action.completed_at })\n )\n }\n\n case 'actions.get': {\n const taskId = num(args, 'taskId')\n const actions = await db.getActionsForTask(taskId)\n const full = await Promise.all(\n actions.map(async (a) => ({\n ...a,\n sections: await db.getActionSections(a.id),\n }))\n )\n return ok(JSON.stringify(full, null, 2))\n }\n\n case 'tasks.get': {\n const status = args['status'] as string | undefined\n const includeArchived = args['includeArchived'] as boolean | undefined\n const tasks = status\n ? await db.getTasks(status as TaskStatus, includeArchived ?? false)\n : await db.getTasks(undefined, includeArchived ?? false)\n return ok(JSON.stringify(tasks, null, 2))\n }\n\n case 'tasks.claim': {\n const id = num(args, 'id')\n const agent = str(args, 'agent')\n const task = await db.claimTask(id, agent)\n if (!task) {\n return ok(JSON.stringify({ error: 'task_already_claimed', taskId: id }))\n }\n return ok(JSON.stringify(task))\n }\n\n case 'tasks.add': {\n const title = str(args, 'title')\n const slug = (args['slug'] as string | undefined) ?? slugify(title)\n const description = args['description'] as string | undefined\n const acceptance = args['acceptance'] as string[] | undefined\n const task = await db.addTask({ slug, title, description, acceptance })\n return ok(JSON.stringify(task))\n }\n\n case 'tasks.update': {\n const id = num(args, 'id')\n const status = str(args, 'status') as TaskStatus\n if (status === 'done') {\n await db.closeOrphanedActions(id)\n }\n const task = await db.updateTaskStatus(id, status)\n return ok(JSON.stringify(task))\n }\n\n case 'docs.search': {\n const query = str(args, 'query')\n const results = searchDocs(docsPath, query)\n return ok(JSON.stringify(results, null, 2))\n }\n\n case 'actions.record_file': {\n const actionId = str(args, 'actionId')\n const filePath = str(args, 'filePath')\n const operation = str(args, 'operation') as ActionFileRow['operation']\n const notes = args['notes'] as string | undefined\n await db.recordFile(actionId, filePath, operation, notes)\n return ok(JSON.stringify({ actionId, filePath, operation, recorded: true }))\n }\n\n case 'tasks.acceptance.update': {\n const criterionId = num(args, 'criterionId')\n await db.markAcceptanceMet(criterionId)\n return ok(JSON.stringify({ criterionId, met: true }))\n }\n\n case 'tasks.acceptance.get': {\n const taskId = num(args, 'taskId')\n const criteria = await db.getTaskAcceptance(taskId)\n return ok(JSON.stringify(criteria, null, 2))\n }\n\n case 'actions.record_tool': {\n const actionId = str(args, 'actionId')\n const toolName = str(args, 'toolName')\n const argsJson = args['argsJson'] as string | undefined\n const resultSummary = args['resultSummary'] as string | undefined\n await db.recordTool(actionId, toolName, argsJson, resultSummary)\n return ok(JSON.stringify({ actionId, toolName, recorded: true }))\n }\n\n case 'tasks.edit': {\n const id = num(args, 'id')\n const title = args['title'] as string | undefined\n const description = args['description'] as string | null | undefined\n const acceptance = args['acceptance'] as string[] | null | undefined\n\n const task = await db.getTaskById(id)\n if (!task) return ok(JSON.stringify({ error: 'Task not found', taskId: id }), true)\n\n await db.updateTask(id, {\n title,\n description: description !== undefined ? description : undefined,\n })\n if (acceptance !== undefined && acceptance !== null) {\n await db.updateTaskAcceptance(id, acceptance)\n }\n const updated = await db.getTaskById(id)\n return ok(JSON.stringify(updated))\n }\n\n case 'tasks.archive': {\n const id = num(args, 'id')\n const task = await db.archiveTask(id)\n return ok(JSON.stringify(task))\n }\n\n case 'tasks.unarchive': {\n const id = num(args, 'id')\n const task = await db.unarchiveTask(id)\n return ok(JSON.stringify(task))\n }\n\n case 'permissions.check': {\n const result = checkPermissionsSync(cwd, config)\n return ok(JSON.stringify(result, null, 2))\n }\n\n case 'deps.snapshot': {\n const pkgPath = join(cwd, 'package.json')\n if (!existsSync(pkgPath)) {\n return ok('package.json not found in project root', true)\n }\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as {\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n }\n const snapshot = {\n capturedAt: new Date().toISOString(),\n dependencies: pkg.dependencies ?? {},\n devDependencies: pkg.devDependencies ?? {},\n }\n const harnessDir = join(cwd, '.harness')\n mkdirSync(harnessDir, { recursive: true })\n writeFileSync(join(harnessDir, 'deps-lock.json'), JSON.stringify(snapshot, null, 2), 'utf8')\n return ok(\n JSON.stringify({\n message: 'Snapshot saved to .harness/deps-lock.json',\n capturedAt: snapshot.capturedAt,\n })\n )\n }\n\n case 'deps.check': {\n const pkgPath = join(cwd, 'package.json')\n const lockPath = join(cwd, '.harness', 'deps-lock.json')\n if (!existsSync(pkgPath)) {\n return ok('package.json not found in project root', true)\n }\n if (!existsSync(lockPath)) {\n return ok(\n JSON.stringify({\n status: 'no-snapshot',\n message: 'No deps-lock.json found. Run deps.snapshot first to establish a baseline.',\n })\n )\n }\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as {\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n }\n const lock = JSON.parse(readFileSync(lockPath, 'utf8')) as {\n capturedAt: string\n dependencies: Record<string, string>\n devDependencies: Record<string, string>\n }\n const current = { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) }\n const previous = { ...(lock.dependencies ?? {}), ...(lock.devDependencies ?? {}) }\n\n const added: string[] = []\n const removed: string[] = []\n const majorBumps: Array<{ name: string; from: string; to: string }> = []\n\n for (const [name, version] of Object.entries(current)) {\n if (!(name in previous)) {\n added.push(`${name}@${version}`)\n } else {\n const prevMajor = parseInt(\n previous[name].replace(/^[\\^~>=v]/, '').split('.')[0] ?? '0',\n 10\n )\n const curMajor = parseInt(version.replace(/^[\\^~>=v]/, '').split('.')[0] ?? '0', 10)\n if (!isNaN(prevMajor) && !isNaN(curMajor) && curMajor > prevMajor) {\n majorBumps.push({ name, from: previous[name], to: version })\n }\n }\n }\n for (const depName of Object.keys(previous)) {\n if (!(depName in current)) {\n removed.push(depName)\n }\n }\n\n const significant = added.length > 0 || removed.length > 0 || majorBumps.length > 0\n const advisory = significant\n ? 'Significant dependency changes detected. Consider running `pnpx autoskills` (or `npx autoskills` if pnpm is unavailable) to refresh agent skills. Clearing stale skills before re-running is recommended.'\n : 'No significant dependency changes detected.'\n\n return ok(\n JSON.stringify({\n significant,\n added,\n removed,\n majorBumps,\n advisory,\n snapshotDate: lock.capturedAt,\n })\n )\n }\n\n case 'ahk.doctor': {\n const status = await getDoctorStatus(cwd)\n const result = {\n lib: { current: status.lib.current, latest: status.lib.latest, outdated: status.lib.outdated },\n agents: {\n missing: status.agents.filter((a) => a.status === 'missing').map((a) => a.name),\n outdated: status.agents.filter((a) => a.status === 'outdated').map((a) => a.name),\n ok: status.agents.filter((a) => a.status === 'ok').map((a) => a.name),\n },\n skills: {\n missing: status.skills.filter((s) => s.status === 'missing').map((s) => s.name),\n outdated: status.skills.filter((s) => s.status === 'outdated').map((s) => s.name),\n ok: status.skills.filter((s) => s.status === 'ok').map((s) => s.name),\n },\n }\n return ok(JSON.stringify(result, null, 2))\n }\n\n default:\n return ok(`Unknown tool: ${name}`, true)\n }\n}\n\n// ─── docs.search implementation ───────────────────────────────────────────────\n\ninterface DocSnippet {\n file: string\n line: number\n text: string\n}\n\nfunction searchDocs(docsPath: string, query: string, maxResults = 10): DocSnippet[] {\n const terms = query.toLowerCase().split(/\\s+/).filter(Boolean)\n const results: DocSnippet[] = []\n\n try {\n const files = collectMarkdownFiles(docsPath)\n for (const file of files) {\n if (results.length >= maxResults) break\n try {\n const content = readFileSync(file, 'utf8')\n const lines = content.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const lower = lines[i].toLowerCase()\n if (terms.every((t) => lower.includes(t))) {\n results.push({\n file: file.replace(docsPath + '/', ''),\n line: i + 1,\n text: lines[i].trim(),\n })\n if (results.length >= maxResults) break\n }\n }\n } catch {\n // skip unreadable files\n }\n }\n } catch {\n return [{ file: '', line: 0, text: `docs path not found: ${docsPath}` }]\n }\n\n return results\n}\n\nfunction collectMarkdownFiles(dir: string): string[] {\n const files: string[] = []\n try {\n for (const entry of readdirSync(dir)) {\n const full = join(dir, entry)\n const stat = statSync(full)\n if (stat.isDirectory()) {\n files.push(...collectMarkdownFiles(full))\n } else if (entry.endsWith('.md') || entry.endsWith('.txt')) {\n files.push(full)\n }\n }\n } catch {\n // directory may not exist yet\n }\n return files\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction ok(text: string, isError = false): CallToolResult {\n return { content: [{ type: 'text' as const, text }], isError }\n}\n\nfunction str(args: Record<string, unknown>, key: string): string {\n const v = args[key]\n if (typeof v !== 'string') throw new Error(`${key} must be a string`)\n return v\n}\n\nfunction num(args: Record<string, unknown>, key: string): number {\n const v = args[key]\n if (typeof v !== 'number') throw new Error(`${key} must be a number`)\n return v\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport {\n MCP_CLAUDE_PERMISSIONS_BUILDER,\n MCP_CLAUDE_PERMISSIONS_CONSULTANT,\n MCP_CLAUDE_PERMISSIONS_EXPLORER,\n MCP_CLAUDE_PERMISSIONS_LEAD,\n MCP_CLAUDE_PERMISSIONS_REVIEWER,\n} from './materializer/mcp-merge'\n\nimport type { HarnessConfig } from '@/types'\n\nexport type AgentName = 'lead' | 'explorer' | 'consultant' | 'builder' | 'reviewer'\n\nexport interface AgentSyncResult {\n ok: boolean\n missing: string[]\n extra: string[]\n}\n\nexport interface SyncCheckResult {\n in_sync: boolean\n agents?: Record<AgentName, AgentSyncResult>\n}\n\nconst CANONICAL: Record<AgentName, string[]> = {\n lead: [...MCP_CLAUDE_PERMISSIONS_LEAD],\n explorer: [...MCP_CLAUDE_PERMISSIONS_EXPLORER],\n consultant: [...MCP_CLAUDE_PERMISSIONS_CONSULTANT],\n builder: [...MCP_CLAUDE_PERMISSIONS_BUILDER],\n reviewer: [...MCP_CLAUDE_PERMISSIONS_REVIEWER],\n}\n\nfunction parseToolsFromFrontmatter(content: string): string[] {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---/m)\n if (!match) return []\n const fm = match[1]\n const toolsMatch = fm.match(/^tools:\\n((?: - [^\\n]+\\n?)*)/m)\n if (!toolsMatch) return []\n return toolsMatch[1]\n .split('\\n')\n .map((l) => l.trim().replace(/^- /, ''))\n .filter((l) => l.startsWith('mcp__'))\n}\n\nexport function checkPermissionsSync(cwd: string, config: HarnessConfig): SyncCheckResult {\n if (config.provider !== 'claude-code') {\n return { in_sync: true }\n }\n\n const agents: Record<AgentName, AgentSyncResult> = {} as Record<AgentName, AgentSyncResult>\n let in_sync = true\n\n for (const agent of ['lead', 'explorer', 'consultant', 'builder', 'reviewer'] as AgentName[]) {\n const filePath = join(cwd, '.claude', 'agents', `${agent}.md`)\n if (!existsSync(filePath)) {\n const missing = CANONICAL[agent]\n agents[agent] = { ok: false, missing, extra: [] }\n in_sync = false\n continue\n }\n const content = readFileSync(filePath, 'utf-8')\n const installed = parseToolsFromFrontmatter(content)\n const canonical = CANONICAL[agent]\n const missing = canonical.filter((t) => !installed.includes(t))\n const extra = installed.filter((t) => !canonical.includes(t))\n const ok = missing.length === 0 && extra.length === 0\n if (!ok) in_sync = false\n agents[agent] = { ok, missing, extra }\n }\n\n return { in_sync, agents }\n}\n","import { loadConfig } from '@/core/config'\nimport { startMcpServer } from '@/core/mcp-server'\nimport { checkPermissionsSync } from '@/core/permissions-check'\n\ninterface ServeOptions {\n port?: number\n}\n\nexport async function runServe(cwd: string, opts: ServeOptions): Promise<void> {\n const config = await loadConfig(cwd)\n\n if (opts.port) {\n config.tools.mcp.port = opts.port\n }\n\n // MCP server runs on stdio — do not write to stdout after this point.\n // Stderr is used for diagnostics.\n process.stderr.write(`[agent-harness-kit] MCP server starting (stdio)\\n`)\n\n const syncResult = checkPermissionsSync(cwd, config)\n if (!syncResult.in_sync && syncResult.agents) {\n const affected = Object.entries(syncResult.agents)\n .filter(([, r]) => !r.ok)\n .map(([name, r]) => {\n const parts: string[] = []\n if (r.missing.length) parts.push(`missing: ${r.missing.map(t => t.replace('mcp__agent-harness-kit__', '')).join(', ')}`)\n if (r.extra.length) parts.push(`extra: ${r.extra.map(t => t.replace('mcp__agent-harness-kit__', '')).join(', ')}`)\n return `${name} (${parts.join('; ')})`\n })\n .join('\\n ')\n process.stderr.write(`[agent-harness-kit] Agent permissions out of sync. Run: ahk build --sync\\n ${affected}\\n`)\n }\n\n await startMcpServer(config, cwd)\n}\n","import Table from 'cli-table3'\nimport pc from 'picocolors'\n\nimport { loadConfig } from '@/core/config'\nimport { openDB } from '@/core/db'\n\ninterface StatusOptions {\n json?: boolean\n}\n\nconst STATUS_COLOR: Record<string, (s: string) => string> = {\n pending: (s) => pc.dim(s),\n in_progress: (s) => pc.cyan(s),\n done: (s) => pc.green(s),\n blocked: (s) => pc.red(s),\n}\n\nexport async function runStatus(cwd: string, opts: StatusOptions): Promise<void> {\n const config = await loadConfig(cwd)\n const db = await openDB(config, cwd)\n\n try {\n const tasks = await db.getTasks()\n const summary = await db.getStatusSummary()\n\n if (opts.json) {\n const actions = await Promise.all(\n tasks.map(async (t) => ({\n ...t,\n actions: await db.getActionsForTask(t.id),\n acceptance: await db.getTaskAcceptance(t.id),\n })),\n )\n const archivedCount = (await db.getArchivedTasks()).length\n console.log(JSON.stringify({ tasks: actions, summary, archivedCount }, null, 2))\n return\n }\n\n if (tasks.length === 0) {\n console.log(pc.dim('No tasks yet. Run: ahk task add'))\n return\n }\n\n const table = new Table({\n head: ['ID', 'Slug', 'Title', 'Status', 'Assigned', 'Started'].map((h) => pc.bold(h)),\n style: { head: [], border: [] },\n })\n\n for (const t of tasks) {\n const colorFn = STATUS_COLOR[t.status] ?? ((s: string) => s)\n table.push([\n String(t.id),\n t.slug,\n t.title.slice(0, 40),\n colorFn(t.status),\n t.assigned_to ?? '—',\n t.started_at ? t.started_at.slice(0, 10) : '—',\n ])\n }\n\n console.log(table.toString())\n\n // Active actions\n const inProgress = tasks.filter((t) => t.status === 'in_progress')\n if (inProgress.length > 0) {\n console.log('')\n console.log(pc.bold('Active actions:'))\n for (const t of inProgress) {\n const actions = await db.getActionsForTask(t.id)\n const active = actions.filter((a) => a.status === 'in_progress')\n for (const a of active) {\n console.log(` ${pc.cyan(a.agent.padEnd(10))} → task #${t.id} ${t.slug}`)\n }\n }\n }\n\n // Summary line\n console.log('')\n const parts = summary.map((s) => {\n const fn = STATUS_COLOR[s.status] ?? ((x: string) => x)\n return `${fn(s.status)}: ${s.total}`\n })\n console.log(pc.dim('Tasks — ') + parts.join(pc.dim(' | ')))\n\n const archivedTasks = await db.getArchivedTasks()\n if (archivedTasks.length > 0) {\n console.log(pc.dim(`${archivedTasks.length} archived (use \\`ahk task list --archived\\` to view)`))\n }\n } finally {\n await db.close()\n }\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\nimport pc from 'picocolors'\n\nimport { loadConfig } from '@/core/config'\nimport { openDB } from '@/core/db'\n\nimport type { TaskSeed } from '@/types'\n\ninterface SyncOptions {\n dryRun?: boolean\n direction?: 'in' | 'out' | 'both'\n}\n\nexport async function runSync(cwd: string, opts: SyncOptions): Promise<void> {\n const config = await loadConfig(cwd)\n const direction = opts.direction ?? 'both'\n const featureListPath = resolve(join(cwd, config.storage.dir, 'feature_list.json'))\n\n const db = await openDB(config, cwd)\n\n try {\n if (direction === 'in' || direction === 'both') {\n await syncIn(featureListPath, db, opts.dryRun ?? false)\n }\n\n if (direction === 'out' || direction === 'both') {\n await syncOut(db, cwd, opts.dryRun ?? false)\n }\n } finally {\n await db.close()\n }\n}\n\nasync function syncIn(\n featureListPath: string,\n db: Awaited<ReturnType<typeof openDB>>,\n dryRun: boolean\n): Promise<void> {\n if (!existsSync(featureListPath)) {\n console.log(pc.dim(`feature_list.json not found at ${featureListPath} — skipping in-sync`))\n return\n }\n\n let seeds: TaskSeed[]\n try {\n seeds = JSON.parse(readFileSync(featureListPath, 'utf8')) as TaskSeed[]\n } catch (err) {\n console.error(pc.red(`Failed to parse feature_list.json: ${err}`))\n process.exit(1)\n }\n\n if (dryRun) {\n console.log(pc.bold('Dry run — in-sync (feature_list.json → SQLite):'))\n for (const t of seeds) {\n const existing = await db.getTaskBySlug(t.slug)\n console.log(` ${existing ? pc.dim('skip') : pc.green('add ')} ${t.slug}`)\n }\n return\n }\n\n const result = await db.syncFromFeatureList(seeds)\n console.log(pc.green(`✓ In-sync: ${result.added} added, ${result.skipped} already existed`))\n}\n\nasync function syncOut(\n db: Awaited<ReturnType<typeof openDB>>,\n cwd: string,\n dryRun: boolean\n): Promise<void> {\n if (dryRun) {\n const tasks = await db.getTasks()\n console.log(pc.bold('Dry run — out-sync (SQLite → feature_list.json):'))\n console.log(` ${tasks.length} tasks would be written`)\n return\n }\n\n await db.writeFeatureList(cwd)\n console.log(pc.green('✓ Out-sync: feature_list.json updated'))\n}\n","import * as p from '@clack/prompts'\nimport pc from 'picocolors'\n\nimport { loadConfig } from '@/core/config'\nimport { openDB } from '@/core/db'\nimport { slugify } from '@/core/materializer/scaffold-utils'\nimport { taskDescriptionSchema, taskTitleSchema } from '@/schema/task'\nimport { cliFormWithRetry } from '@/utils/form'\n\nexport async function runTaskAdd(cwd: string): Promise<void> {\n p.intro(pc.bold('agent-harness-kit — add task'))\n\n const title = await cliFormWithRetry(\n async () => {\n const val = await p.text({ message: 'Task title' })\n if (p.isCancel(val)) { p.cancel('Cancelled.'); process.exit(0) }\n return (val as string).trim()\n },\n taskTitleSchema,\n )\n\n const description = await cliFormWithRetry(\n async () => {\n const val = await p.text({\n message: 'Description (what and why)',\n placeholder: 'Describe the task in more detail, including any relevant context or instructions for the agents.',\n })\n if (p.isCancel(val)) { p.cancel('Cancelled.'); process.exit(0) }\n return (val as string).trim()\n },\n taskDescriptionSchema,\n )\n\n const acceptance: string[] = []\n p.log.info('Acceptance criteria — one per line, empty line to finish')\n while (true) {\n const val = await p.text({ message: '>', placeholder: 'Criterion (or press Enter to finish)' })\n if (p.isCancel(val) || !val || !(val as string).trim()) break\n acceptance.push((val as string).trim())\n }\n\n const spinner = p.spinner()\n spinner.start('Saving...')\n\n try {\n const config = await loadConfig(cwd)\n const db = await openDB(config, cwd)\n\n const slug = slugify(title)\n const task = await db.addTask({ slug, title, description: description || undefined, acceptance })\n await db.writeFeatureList(cwd)\n await db.close()\n\n spinner.stop('')\n console.log(pc.green(`✓ Task #${task.id} added — ${task.slug} (pending)`))\n console.log(pc.cyan('→') + ' ' + pc.cyan('ahk status') + ' to see all tasks')\n } catch (err) {\n spinner.stop(pc.red('Failed'))\n p.log.error(err instanceof Error ? err.message : String(err))\n process.exit(1)\n }\n}\n\n","import { spawnSync } from 'node:child_process'\nimport { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport pc from 'picocolors'\n\nimport { loadConfig } from '@/core/config'\nimport { openDB } from '@/core/db'\n\nexport async function runTaskDone(cwd: string, idOrSlug: string): Promise<void> {\n const config = await loadConfig(cwd)\n\n // Run health check first if required\n if (config.health.required) {\n const scriptPath = resolve(cwd, config.health.scriptPath)\n if (existsSync(scriptPath)) {\n const result = spawnSync('bash', [scriptPath], { cwd, stdio: 'pipe', encoding: 'utf8' })\n if (result.status !== 0) {\n console.error(pc.red('✗ Health check failed — cannot mark task as done.'))\n if (result.stdout) console.error(result.stdout)\n if (result.stderr) console.error(result.stderr)\n process.exit(1)\n }\n }\n }\n\n const db = await openDB(config, cwd)\n\n try {\n const parsed = parseInt(idOrSlug, 10)\n const isId = !isNaN(parsed)\n const task = isId ? await db.getTaskById(parsed) : await db.getTaskBySlug(idOrSlug)\n\n if (!task) {\n console.error(pc.red(`Task not found: ${idOrSlug}`))\n process.exit(1)\n }\n\n if (task.status === 'done') {\n console.log(pc.dim(`Task #${task.id} is already done.`))\n return\n }\n\n await db.updateTaskStatus(task.id, 'done')\n await db.writeFeatureList(cwd)\n\n console.log(pc.green(`✓ Task #${task.id} — ${task.slug} marked as done`))\n } finally {\n await db.close()\n }\n}\n","import * as p from '@clack/prompts'\nimport pc from 'picocolors'\nimport { loadConfig } from '@/core/config'\nimport { openDB } from '@/core/db'\nimport { slugify } from '@/core/materializer/scaffold-utils'\n\nexport async function runTaskEdit(cwd: string): Promise<void> {\n p.intro(pc.bold('agent-harness-kit — edit task'))\n\n const config = await loadConfig(cwd)\n const db = await openDB(config, cwd)\n\n try {\n // 1. Get all non-done tasks\n const allTasks = await db.getTasks()\n const activeTasks = allTasks.filter(t => t.status !== 'done')\n\n if (activeTasks.length === 0) {\n p.log.error('No active tasks to edit.')\n return\n }\n\n // 2. Let user select a task\n const taskId = await p.select({\n message: 'Select a task to edit',\n options: activeTasks.map(t => ({\n label: `#${t.id} — ${t.title} (${t.slug})`,\n value: t.id,\n })),\n })\n if (p.isCancel(taskId)) { p.cancel('Cancelled.'); process.exit(0) }\n\n const task = await db.getTaskById(taskId as number)\n if (!task) { p.log.error('Task not found'); process.exit(1) }\n\n // 3. Edit title\n const title = await p.text({\n message: 'Title',\n initialValue: task.title,\n })\n if (p.isCancel(title)) { p.cancel('Cancelled.'); process.exit(0) }\n\n // 4. Edit description\n const description = await p.text({\n message: 'Description (what and why)',\n initialValue: task.description ?? '',\n })\n if (p.isCancel(description)) { p.cancel('Cancelled.'); process.exit(0) }\n\n // 5. Edit acceptance criteria\n const currentAcceptance = await db.getTaskAcceptance(task.id)\n const newAcceptance: string[] = []\n\n p.log.info('Acceptance criteria — edit each, empty to delete. Add new ones at the end.')\n\n // Edit existing criteria\n for (let i = 0; i < currentAcceptance.length; i++) {\n const ac = currentAcceptance[i]\n const val = await p.text({\n message: `#${i + 1}/${currentAcceptance.length}`,\n initialValue: ac.criterion,\n defaultValue: '',\n })\n if (p.isCancel(val)) { p.cancel('Cancelled.'); process.exit(0) }\n const trimmed = (val as string).trim()\n if (trimmed !== '') {\n newAcceptance.push(trimmed)\n }\n // If empty, the criterion is deleted (not pushed)\n }\n\n // Add new criteria\n while (true) {\n const val = await p.text({ message: 'New acceptance criterion', placeholder: '(press Enter to finish)' })\n if (p.isCancel(val) || !val || !(val as string).trim()) break\n newAcceptance.push((val as string).trim())\n }\n\n // 6. Save\n const spinner = p.spinner()\n spinner.start('Saving...')\n\n try {\n const newSlug = slugify(title as string)\n await db.updateTask(task.id, {\n title: title as string,\n description: (description as string).trim() || undefined,\n slug: newSlug,\n })\n await db.updateTaskAcceptance(task.id, newAcceptance)\n await db.writeFeatureList(cwd)\n\n spinner.stop('')\n console.log(pc.green(`✓ Task #${task.id} updated — ${newSlug}`))\n } catch (err) {\n spinner.stop(pc.red('Failed'))\n p.log.error(err instanceof Error ? err.message : String(err))\n process.exit(1)\n }\n } finally {\n await db.close()\n }\n}\n","import Table from 'cli-table3'\nimport pc from 'picocolors'\n\nimport { loadConfig } from '@/core/config'\nimport { openDB } from '@/core/db'\n\nimport type { TaskStatus } from '@/types'\n\ninterface TaskListOptions {\n status?: string\n json?: boolean\n archived?: boolean\n includeArchived?: boolean\n}\n\nconst STATUS_COLOR: Record<string, (s: string) => string> = {\n pending: (s) => pc.dim(s),\n in_progress: (s) => pc.cyan(s),\n done: (s) => pc.green(s),\n blocked: (s) => pc.red(s),\n}\n\nexport async function runTaskList(cwd: string, opts: TaskListOptions): Promise<void> {\n const config = await loadConfig(cwd)\n const db = await openDB(config, cwd)\n\n try {\n const validStatuses: TaskStatus[] = ['pending', 'in_progress', 'done', 'blocked']\n const filterStatus =\n opts.status && validStatuses.includes(opts.status as TaskStatus)\n ? (opts.status as TaskStatus)\n : undefined\n\n const tasks = opts.archived\n ? await db.getArchivedTasks()\n : filterStatus\n ? await db.getTasks(filterStatus, opts.includeArchived ?? false)\n : await db.getTasks(undefined, opts.includeArchived ?? false)\n\n if (opts.json) {\n console.log(JSON.stringify(tasks, null, 2))\n return\n }\n\n if (tasks.length === 0) {\n let msg = 'No tasks'\n if (filterStatus) msg += ` with status: ${filterStatus}`\n if (opts.archived) msg += ' (archived)'\n console.log(pc.dim(msg + '.'))\n return\n }\n\n const table = new Table({\n head: ['ID', 'Slug', 'Title', 'Status'].map((h) => pc.bold(h)),\n style: { head: [], border: [] },\n })\n\n for (const t of tasks) {\n const colorFn = STATUS_COLOR[t.status] ?? ((s: string) => s)\n table.push([String(t.id), t.slug, t.title.slice(0, 50), colorFn(t.status)])\n }\n\n console.log(table.toString())\n\n if (!opts.archived && !opts.includeArchived) {\n const archivedTasks = await db.getArchivedTasks()\n if (archivedTasks.length > 0) {\n console.log(pc.dim(`${archivedTasks.length} archived task${archivedTasks.length !== 1 ? 's' : ''} (use --archived to view)`))\n }\n }\n } finally {\n await db.close()\n }\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport pc from 'picocolors'\n\nimport { pkg } from '@/core/package-data'\n\n/**\n * Determines whether `@cardor/agent-harness-kit` is available as a local\n * dependency of the project at `cwd`, or whether `cwd` IS the package\n * itself (self-dev case, e.g. working inside this repo).\n *\n * The generated config no longer needs the package resolvable at runtime\n * (`import type` is erased at compile time, and the .mjs/.cjs templates\n * don't import the package at all), so this check is no longer required\n * for `loadConfig(cwd)` to succeed. It is kept as a non-blocking warning\n * so a team/CI can still pin an explicit local version of the CLI for\n * reproducibility — the command always continues regardless of the result.\n */\nexport function isLocalInstallSatisfied(cwd: string): boolean {\n // Self-dev case: cwd is the agent-harness-kit repo itself, so there is\n // no (and should be no) node_modules/@cardor/agent-harness-kit entry.\n const selfPkgPath = join(cwd, 'package.json')\n let projectPkg: Record<string, unknown> | null = null\n if (existsSync(selfPkgPath)) {\n try {\n const selfPkg = JSON.parse(readFileSync(selfPkgPath, 'utf8'))\n if (selfPkg?.name === pkg.name) return true\n projectPkg = selfPkg\n } catch {\n // Malformed package.json — ignore and fall through to the node_modules check.\n }\n }\n\n const [scope, name] = pkg.name.split('/')\n const localPath = pkg.name.startsWith('@') ? join(cwd, 'node_modules', scope, name) : join(cwd, 'node_modules', pkg.name)\n\n if (existsSync(localPath)) return true\n\n // Yarn Berry with Plug'n'Play (PnP) never creates a node_modules directory\n // at all, so the check above always fails there even when the package IS\n // correctly declared and resolvable via the PnP loader. Detect PnP via its\n // generated loader files and fall back to checking that the package is\n // declared as a dependency in package.json — the only signal available\n // without depending on a node_modules layout PnP intentionally omits.\n const isPnp = existsSync(join(cwd, '.pnp.cjs')) || existsSync(join(cwd, '.pnp.loader.mjs'))\n if (isPnp && projectPkg) {\n const deps = {\n ...((projectPkg.dependencies as Record<string, unknown>) ?? {}),\n ...((projectPkg.devDependencies as Record<string, unknown>) ?? {}),\n }\n if (Object.prototype.hasOwnProperty.call(deps, pkg.name)) return true\n }\n\n return false\n}\n\n/**\n * Prints a non-blocking warning recommending a local install, with the\n * exact command to fix it. This is informational only — the command\n * continues to run either way. A local install is no longer required for\n * config loading to work; it is still recommended so the version of the\n * package used stays reproducible and pinned across your team and CI,\n * instead of drifting with whatever is installed globally on each machine.\n */\nexport function printLocalInstallWarning(): void {\n console.error(pc.yellow(`⚠ ${pkg.name} is not installed locally in this project.`))\n console.error(pc.dim(' This is only a recommendation for reproducibility: pinning a local'))\n console.error(pc.dim(' version keeps behavior consistent across your team and CI, instead of'))\n console.error(pc.dim(' drifting with whatever version is installed globally on each machine.'))\n console.error(pc.dim(` Run: npm install --save-dev ${pkg.name}`))\n console.error(pc.dim(' (or the equivalent for your package manager: pnpm add -D, yarn add --dev, bun add -d)'))\n}\n","// src/core/update-check.ts\nimport pc from 'picocolors'\n\nimport { drawBox } from '@/commands/init-helpers'\n\nimport { pkg } from './package-data'\n\nconst REGISTRY_URL = `https://registry.npmjs.org/${pkg.name}/latest`\nconst TIMEOUT_MS = 2500\n\ninterface UpdateInfo {\n current: string\n latest: string\n}\n\nexport function checkForUpdate(currentVersion: string): Promise<UpdateInfo | null> {\n return new Promise((resolve) => {\n const timer = setTimeout(() => resolve(null), TIMEOUT_MS)\n\n fetch(REGISTRY_URL)\n .then((res) => res.json())\n .then((data) => {\n clearTimeout(timer)\n const latest = (data as { version: string }).version\n resolve(isNewer(latest, currentVersion) ? { current: currentVersion, latest } : null)\n })\n .catch(() => {\n clearTimeout(timer)\n resolve(null)\n })\n })\n}\n\nexport function printUpdateMessage({ current, latest }: UpdateInfo): void {\n const lines = [\n ` Update available ${pc.dim(current)} → ${pc.green(latest)} `,\n ` Run: ${pc.cyan(`pnpm i ${pkg.name}@${latest}`)} `,\n ]\n\n drawBox(lines)\n}\n\nfunction isNewer(latest: string, current: string): boolean {\n const toNum = (v: string) => v.split('.').map(Number)\n const [lMaj, lMin, lPat] = toNum(latest)\n const [cMaj, cMin, cPat] = toNum(current)\n\n if (lMaj !== cMaj) return lMaj > cMaj\n if (lMin !== cMin) return lMin > cMin\n\n return lPat > cPat\n}\n"],"mappings":"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","names":["pc","existsSync","mkdirSync","readFileSync","writeFileSync","join","resolve","cwd","join","cwd","pkgPath","pkg","existsSync","mkdirSync","readFileSync","writeFileSync","existsSync","mkdirSync","readFileSync","writeFileSync","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","join","resolve","fileURLToPath","readFileSync","dirname","join","dirname","join","readFileSync","__dirname","dirname","fileURLToPath","cwd","join","existsSync","mkdirSync","resolve","writeFileSync","readFileSync","cwd","existsSync","join","write","mkdirSync","resolve","writeFileSync","readFileSync","existsSync","mkdirSync","writeFileSync","join","resolve","cwd","write","join","mkdirSync","resolve","writeFileSync","existsSync","existsSync","mkdirSync","writeFileSync","join","resolve","cwd","write","join","mkdirSync","resolve","writeFileSync","existsSync","cwd","spinner","dirname","join","resolve","fileURLToPath","pc","watch","existsSync","readFileSync","join","resolve","readFileSync","task","join","existsSync","watch","__dirname","dirname","fileURLToPath","cwd","resolve","join","pc","pc","existsSync","readFileSync","dirname","join","fileURLToPath","existsSync","dirname","join","fileURLToPath","require","p","__dirname","dirname","fileURLToPath","v","join","existsSync","readFileSync","cwd","__dirname","pc","cwd","writeFileSync","pc","cwd","pc","writeFileSync","existsSync","join","resolve","pc","ok","pc","cwd","resolve","existsSync","join","mkdirSync","writeFileSync","join","p","pc","homedir","homedir","v","p","v","existsSync","readFileSync","join","pc","cwd","pkgPath","pkg","str","cwd","pc","spinner","writeFileSync","join","mkdirSync","name","p","pc","cwd","pc","spinner","existsSync","mkdirSync","writeFileSync","homedir","dirname","join","resolve","pc","log","cwd","join","resolve","mkdirSync","writeFileSync","dirname","existsSync","homedir","pc","existsSync","rmSync","join","resolve","p","pc","cwd","resolve","existsSync","pc","confirm","join","rmSync","existsSync","mkdirSync","readdirSync","readFileSync","writeFileSync","join","resolve","existsSync","readFileSync","join","cwd","join","existsSync","missing","readFileSync","ok","cwd","resolve","ok","task","pkgPath","join","existsSync","pkg","readFileSync","mkdirSync","writeFileSync","name","readdirSync","text","v","cwd","pc","pc","cwd","existsSync","readFileSync","join","resolve","pc","cwd","resolve","join","existsSync","pc","readFileSync","p","pc","cwd","pc","spinner","task","spawnSync","existsSync","resolve","pc","cwd","resolve","existsSync","spawnSync","pc","task","p","pc","cwd","pc","task","spinner","Table","pc","STATUS_COLOR","pc","cwd","Table","existsSync","readFileSync","join","pc","cwd","join","existsSync","readFileSync","pc","pc","REGISTRY_URL","TIMEOUT_MS","resolve","isNewer","pc","v","pc"]}