@cardor/agent-harness-kit 1.2.4 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/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/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/db.ts","../src/core/repositories/ActionRepository.ts","../src/core/repositories/StatsRepository.ts","../src/core/repositories/TaskRepository.ts","../src/commands/export.ts","../src/commands/health.ts","../src/commands/init.ts","../src/schema/init.ts","../src/schema/task.ts","../src/utils/form.ts","../src/commands/init-helpers.ts","../src/commands/migrate.ts","../src/commands/reset.ts","../src/core/mcp-server.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/list.ts","../src/core/package-data.ts","../src/core/update-check.ts"],"sourcesContent":["import { Command } from 'commander'\n\nimport { runBuild } from '@/commands/build'\nimport { runDashboard } from '@/commands/dashboard'\nimport { runExport } from '@/commands/export'\nimport { runHealth } from '@/commands/health'\nimport { runInit } from '@/commands/init'\nimport { runMigrate } from '@/commands/migrate'\nimport { runReset } from '@/commands/reset'\nimport { runServe } from '@/commands/serve'\nimport { runStatus } from '@/commands/status'\nimport { runSync } from '@/commands/sync'\nimport { runTaskAdd, runTaskDone, runTaskList } from '@/commands/task/index'\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 .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 .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('--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\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 ──────────────────────────────────────────────────────────────────\nprogram\n .command('migrate')\n .description('Migrate provider-specific files to a different provider')\n .option('--to <provider>', 'Target provider: claude-code | opencode')\n .action(async (opts) => {\n await runMigrate(cwd, opts)\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\nprogram.hook('postAction', async () => {\n const update = await updateCheck\n if (update) printUpdateMessage(update)\n})\n\nprogram.parse()\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}\n\nexport async function runBuild(cwd: string, opts: BuildOptions): Promise<void> {\n await buildOnce(cwd)\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, writeFileSync } from 'fs'\nimport { join, resolve } from 'path'\n\nimport { write } from '@/utils/file'\n\nimport { mergeClaudeMcpJson, mergeClaudeSettingsJson } from './mcp-merge'\nimport { appendGitignore, slugify, writeAgentFile } from './scaffold-utils'\nimport {\n agentBuilder,\n agentExplorer,\n agentLead,\n agentReviewer,\n agentsMd,\n claudeMd,\n featureListJson,\n HEALTH_SH,\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 writeAgentFile(cwd, '.claude/agents/lead.md', agentLead({ projectName }))\n writeAgentFile(cwd, '.claude/agents/explorer.md', agentExplorer({ projectName, allowedPaths }))\n writeAgentFile(cwd, '.claude/agents/builder.md', agentBuilder({ projectName, writablePaths }))\n writeAgentFile(cwd, '.claude/agents/reviewer.md', agentReviewer({ projectName }))\n\n // .claude/mcp.json — MERGE, never overwrite whole file\n mergeClaudeMcpJson(join(cwd, '.claude/mcp.json'), config.tools.mcp.port)\n // .claude/settings.json — set `agent: \"lead\"` (the official Claude Code default-agent field)\n mergeClaudeSettingsJson(join(cwd, '.claude/settings.json'))\n\n // .gitignore additions\n appendGitignore(cwd)\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: skip if customized, write if missing\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, '.claude/agents/lead.md', agentLead({ projectName }))\n writeAgentFile(cwd, '.claude/agents/explorer.md', agentExplorer({ projectName, allowedPaths }))\n writeAgentFile(cwd, '.claude/agents/builder.md', agentBuilder({ projectName, writablePaths }))\n writeAgentFile(cwd, '.claude/agents/reviewer.md', agentReviewer({ projectName }))\n\n // MCP config: always merge\n mergeClaudeMcpJson(join(cwd, '.claude/mcp.json'), config.tools.mcp.port)\n mergeClaudeSettingsJson(join(cwd, '.claude/settings.json'))\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","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, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { dirname } from 'node:path'\n\n// ─── Claude Code ──────────────────────────────────────────────────────────────\n\nexport function mergeClaudeMcpJson(filePath: string, port: number): 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 merged = {\n ...existing,\n mcpServers: {\n ...((existing.mcpServers as Record<string, unknown>) ?? {}),\n 'agent-harness-kit': {\n type: 'stdio',\n command: 'npx',\n args: ['ahk', 'serve', '--port', String(port)],\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// ─── OpenCode ─────────────────────────────────────────────────────────────────\n\nexport function mergeOpencodeJson(filePath: string, port: number): 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 command: ['npx', 'ahk', 'serve', '--port', String(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): void {\n mkdirSync(dirname(filePath), { recursive: true })\n\n let content = ''\n if (existsSync(filePath)) {\n content = readFileSync(filePath, 'utf8')\n }\n\n const sectionBody = [\n 'command = \"npx\"',\n `args = [\"ahk\", \"serve\", \"--port\", \"${port}\"]`,\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 { join, resolve } from 'node:path'\n\nimport { GITIGNORE_ENTRIES } from './templates'\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","import { readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\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' | '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 starting work.\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 starting)\n\n\\`\\`\\`bash\nbash health.sh\n\\`\\`\\`\n\nIf it exits non-zero, stop and report the issue. Do not proceed with tasks 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 - Run health.sh → exit 1 means stop\n - tasks.get('in_progress') → resume if something is in progress\n - tasks.get('pending') → pick lowest id\n\n2. WORK (lead → explorer → 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 → 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| 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 starting)\n\n\\`\\`\\`bash\nbash health.sh\n\\`\\`\\`\n\nIf it exits non-zero, stop and report the issue. Do not proceed with tasks 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 - Run health.sh → exit 1 means stop\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 → 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 → 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| 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 function configTs(params: {\n name: string\n description: string\n provider: string\n docsPath: string\n tasksAdapter: string\n port: number\n}): string {\n return `import { defineHarness } from '@cardor/agent-harness-kit'\n\nexport default defineHarness({\n project: {\n name: '${params.name}',\n description: '${params.description}',\n docsPath: '${params.docsPath}',\n },\n\n provider: '${params.provider}',\n\n agents: {\n lead: { instructionsPath: null },\n explorer: { instructionsPath: null, allowedPaths: ['${params.docsPath}', './src'] },\n builder: { instructionsPath: null, writablePaths: ['./src', './tests'] },\n reviewer: { instructionsPath: null },\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 },\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 agentReviewer(vars: { projectName: string }): string {\n return loadAgentTemplate('reviewer', vars)\n}\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\nfunction toCodexToml(\n name: string,\n description: string,\n body: string,\n sandboxMode: 'workspace-write' | 'read-only'\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 return `name = \"${name}\"\nsandbox_mode = \"${sandboxMode}\"\n\ndescription = \"\"\"\n${safe(description)}\n\"\"\"\n\ndeveloper_instructions = \"\"\"\n${safe(body.trimEnd())}\n\"\"\"\n`\n}\n\nexport function agentLeadToml(vars: { projectName: string }): string {\n const { description, body } = stripFrontmatter(loadAgentTemplate('lead', vars))\n return toCodexToml('lead', description, body, 'read-only')\n}\n\nexport function agentLeadAsDefaultToml(vars: { projectName: string }): string {\n const { description, body } = stripFrontmatter(loadAgentTemplate('lead', vars))\n return toCodexToml('default', description, body, 'read-only')\n}\n\nexport function agentExplorerToml(vars: { projectName: string; allowedPaths: string }): string {\n const { description, body } = stripFrontmatter(loadAgentTemplate('explorer', vars))\n return toCodexToml('explorer', description, body, 'read-only')\n}\n\nexport function agentBuilderToml(vars: { projectName: string; writablePaths: string }): string {\n const { description, body } = stripFrontmatter(loadAgentTemplate('builder', vars))\n return toCodexToml('builder', description, body, 'workspace-write')\n}\n\nexport function agentReviewerToml(vars: { projectName: string }): string {\n const { description, body } = stripFrontmatter(loadAgentTemplate('reviewer', vars))\n return toCodexToml('reviewer', description, body, 'read-only')\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 { mergeCodexConfigToml } from './mcp-merge'\nimport { appendGitignore, slugify, writeAgentFile } from './scaffold-utils'\nimport {\n agentBuilderToml,\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\n writeAgentFile(cwd, '.codex/agents/lead.toml', agentLeadToml({ projectName }))\n writeAgentFile(cwd, '.codex/agents/explorer.toml', agentExplorerToml({ projectName, allowedPaths }))\n writeAgentFile(cwd, '.codex/agents/builder.toml', agentBuilderToml({ projectName, writablePaths }))\n writeAgentFile(cwd, '.codex/agents/reviewer.toml', agentReviewerToml({ projectName }))\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 }))\n\n // .codex/config.toml — MERGE, never overwrite whole file\n mergeCodexConfigToml(join(cwd, '.codex/config.toml'), config.tools.mcp.port)\n\n appendGitignore(cwd)\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\n writeAgentFile(cwd, '.codex/agents/lead.toml', agentLeadToml({ projectName }))\n writeAgentFile(cwd, '.codex/agents/explorer.toml', agentExplorerToml({ projectName, allowedPaths }))\n writeAgentFile(cwd, '.codex/agents/builder.toml', agentBuilderToml({ projectName, writablePaths }))\n writeAgentFile(cwd, '.codex/agents/reviewer.toml', agentReviewerToml({ projectName }))\n writeAgentFile(cwd, '.codex/agents/default.toml', agentLeadAsDefaultToml({ projectName }))\n\n mergeCodexConfigToml(join(cwd, '.codex/config.toml'), config.tools.mcp.port)\n }\n\n async migrate(config: HarnessConfig, _to: Provider, _cwd: string): Promise<void> {\n void config\n }\n}\n","import { existsSync, mkdirSync, writeFileSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\n\nimport { mergeOpencodeJson } from './mcp-merge'\nimport { appendGitignore, slugify, writeAgentFile } from './scaffold-utils'\nimport { agentBuilder, agentExplorer, agentLead, agentReviewer, agentsMd, featureListJson, HEALTH_SH } 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', agentLead({ projectName }))\n writeAgentFile(cwd, '.opencode/agents/explorer.md', agentExplorer({ projectName, allowedPaths }))\n writeAgentFile(cwd, '.opencode/agents/builder.md', agentBuilder({ projectName, writablePaths }))\n writeAgentFile(cwd, '.opencode/agents/reviewer.md', agentReviewer({ projectName }))\n\n // opencode.json — MERGE, never overwrite whole file\n mergeOpencodeJson(join(cwd, 'opencode.json'), config.tools.mcp.port)\n\n appendGitignore(cwd)\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', agentLead({ projectName }))\n writeAgentFile(cwd, '.opencode/agents/explorer.md', agentExplorer({ projectName, allowedPaths }))\n writeAgentFile(cwd, '.opencode/agents/builder.md', agentBuilder({ projectName, writablePaths }))\n writeAgentFile(cwd, '.opencode/agents/reviewer.md', agentReviewer({ projectName }))\n\n mergeOpencodeJson(join(cwd, 'opencode.json'), config.tools.mcp.port)\n }\n\n async migrate(config: HarnessConfig, _to: Provider, _cwd: string): Promise<void> {\n void config\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}\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 } = 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 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 function startDashboardServer(\n db: HarnessDB,\n dbPath: string | null,\n staticPath: string,\n port: number,\n): 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 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 return c.json(await tasks.getAllWithAcceptanceCounts())\n })\n\n // ─── Task detail ──────────────────────────────────────────────────────────\n app.get('/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 acceptance = await tasks.getAcceptance(id)\n const taskActions = await actions.getWithDetails(id)\n return c.json({ ...task, acceptance, actions: taskActions })\n })\n\n // ─── Tools top ────────────────────────────────────────────────────────────\n app.get('/api/tools/top', async (c) => {\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 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 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 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 return c.json(await stats.getAgentStats())\n })\n\n // ─── Timeline ─────────────────────────────────────────────────────────────\n app.get('/api/timeline', async (c) => {\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 { return fileResponse(candidate) } catch { /* fall through */ }\n }\n }\n return fileResponse(join(staticPath, 'index.html'))\n })\n\n // ─── Start HTTP server ────────────────────────────────────────────────────\n const httpServer = serve({ fetch: app.fetch, port })\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:${port}`,\n close: () => {\n clearTimeout(debounce)\n watcher?.close()\n wss.close()\n httpServer.close()\n },\n }\n}\n","import { randomUUID } from 'node:crypto'\nimport { mkdirSync, writeFileSync } from 'node:fs'\nimport { dirname, join, resolve } from 'node:path'\n\nimport { ActionRepository } from './repositories/ActionRepository'\nimport { StatsRepository } from './repositories/StatsRepository'\nimport { TaskRepository } from './repositories/TaskRepository'\n\nimport type { DBDriver } from './drivers/types'\nimport type {\n ActionFileRow,\n ActionRow,\n ActionSectionRow,\n AgentName,\n HarnessConfig,\n TaskAcceptanceRow,\n TaskRow,\n TaskStatus,\n} from '@/types'\n\n// ─── DB class ─────────────────────────────────────────────────────────────────\n\nexport class HarnessDB {\n readonly tasks: TaskRepository\n readonly actions: ActionRepository\n readonly stats: StatsRepository\n private driver: DBDriver\n private config: HarnessConfig\n\n constructor(driver: DBDriver, config: HarnessConfig) {\n this.driver = driver\n this.config = config\n this.tasks = new TaskRepository(driver)\n this.actions = new ActionRepository(driver)\n this.stats = new StatsRepository(driver)\n }\n\n // ─── Tasks (public facade — delegates to TaskRepository) ──────────────────\n\n async addTask(params: {\n slug: string\n title: string\n description?: string\n acceptance?: string[]\n }): Promise<TaskRow> {\n const taskId = await this.tasks.add({\n slug: params.slug,\n title: params.title,\n description: params.description,\n })\n if (params.acceptance?.length) {\n await this.tasks.addAcceptance(taskId, params.acceptance)\n }\n await this.regenerateCurrentMd()\n return (await this.tasks.getById(taskId))!\n }\n\n async getTasks(status?: TaskStatus): Promise<TaskRow[]> {\n return this.tasks.getAll(status)\n }\n\n async getTaskById(id: number): Promise<TaskRow | null> {\n return this.tasks.getById(id)\n }\n\n async getTaskBySlug(slug: string): Promise<TaskRow | null> {\n return this.tasks.getBySlug(slug)\n }\n\n async getTaskAcceptance(taskId: number): Promise<TaskAcceptanceRow[]> {\n return this.tasks.getAcceptance(taskId)\n }\n\n async updateTaskStatus(idOrSlug: number | string, status: TaskStatus): Promise<TaskRow> {\n const now = new Date().toISOString()\n const task =\n typeof idOrSlug === 'number'\n ? await this.tasks.getById(idOrSlug)\n : await this.tasks.getBySlug(idOrSlug)\n if (!task) throw new Error(`Task not found: ${idOrSlug}`)\n\n if (status === 'in_progress' && !task.started_at) {\n await this.tasks.setStatus(task.id, status, { started_at: now })\n } else if (status === 'done') {\n await this.tasks.setStatus(task.id, status, { completed_at: now })\n } else {\n await this.tasks.setStatus(task.id, status)\n }\n\n await this.regenerateCurrentMd()\n return (await this.tasks.getById(task.id))!\n }\n\n async claimTask(id: number, agent: string): Promise<TaskRow | null> {\n const now = new Date().toISOString()\n return this.driver.transaction(async (tx) => {\n // need to create a new TaskRepository instance bound to the transaction\n const txTasks = new TaskRepository(tx)\n const changed = await txTasks.claim(id, agent, now)\n if (!changed) return null\n const task = await txTasks.getById(id)\n if (!task || task.status !== 'in_progress' || task.assigned_to !== agent) return null\n await this.regenerateCurrentMd()\n return task\n })\n }\n\n async markAcceptanceMet(criterionId: number): Promise<void> {\n return this.tasks.markAcceptanceMet(criterionId)\n }\n\n async getStatusSummary(): Promise<{ status: string; total: number }[]> {\n return this.tasks.getStatusSummary()\n }\n\n // ─── Actions (public facade — delegates to ActionRepository) ──────────────\n\n async startAction(taskId: number, agent: AgentName): Promise<ActionRow> {\n const id = randomUUID()\n const now = new Date().toISOString()\n await this.actions.create(id, taskId, agent, now)\n await this.regenerateCurrentMd()\n return (await this.actions.getById(id))!\n }\n\n async writeSection(actionId: string, sectionType: string, content: string): Promise<void> {\n const now = new Date().toISOString()\n await this.actions.addSection(actionId, sectionType, content, now)\n await this.regenerateCurrentMd()\n }\n\n async completeAction(actionId: string, summary: string): Promise<ActionRow> {\n const now = new Date().toISOString()\n await this.actions.complete(actionId, summary, now)\n await this.regenerateCurrentMd()\n return (await this.actions.getById(actionId))!\n }\n\n async closeOrphanedActions(taskId: number): Promise<number> {\n const now = new Date().toISOString()\n return this.actions.closeOrphaned(taskId, now)\n }\n\n async getAction(actionId: string): Promise<ActionRow | null> {\n return this.actions.getById(actionId)\n }\n\n async getActionsForTask(taskId: number): Promise<ActionRow[]> {\n return this.actions.getForTask(taskId)\n }\n\n async getActionSections(actionId: string): Promise<ActionSectionRow[]> {\n return this.actions.getSections(actionId)\n }\n\n async recordFile(\n actionId: string,\n filePath: string,\n operation: ActionFileRow['operation'],\n notes?: string,\n ): Promise<void> {\n return this.actions.addFile(actionId, filePath, operation, notes ?? null)\n }\n\n async recordTool(\n actionId: string,\n toolName: string,\n argsJson?: string,\n resultSummary?: string,\n ): Promise<void> {\n const now = new Date().toISOString()\n return this.actions.addTool(actionId, toolName, argsJson ?? null, resultSummary ?? null, now)\n }\n\n async getFilesForTask(taskId: number): Promise<(ActionFileRow & { agent: AgentName })[]> {\n return this.actions.getFilesForTask(taskId)\n }\n\n async getTopTools(limit = 10): Promise<{ tool_name: string; uses: number }[]> {\n return this.actions.getTopTools(limit)\n }\n\n // ─── current.md fallback ──────────────────────────────────────────────────\n\n async regenerateCurrentMd(): Promise<void> {\n if (!this.config.storage.markdownFallback.enabled) return\n\n const mdPath = resolve(this.config.storage.markdownFallback.path)\n mkdirSync(dirname(mdPath), { recursive: true })\n\n const inProgress = await this.tasks.getAll('in_progress')\n const now = new Date().toISOString()\n\n let md = `<!-- AUTO-GENERATED by agent-harness-kit — DO NOT EDIT MANUALLY -->\\n`\n md += `<!-- Last updated: ${now} -->\\n\\n`\n md += `# Current Session\\n\\n`\n\n if (inProgress.length === 0) {\n md += `## No tasks in progress\\n\\n`\n const pending = await this.tasks.getAll('pending')\n if (pending.length > 0) {\n md += `### Next pending tasks\\n`\n for (const t of pending.slice(0, 5)) {\n md += `- **#${t.id}** ${t.title} (\\`${t.slug}\\`)\\n`\n }\n }\n } else {\n for (const task of inProgress) {\n md += `## Active Task\\n`\n md += `- **ID:** ${task.id}\\n`\n md += `- **Slug:** ${task.slug}\\n`\n md += `- **Status:** ${task.status}\\n`\n md += `- **Started:** ${task.started_at ?? 'unknown'}\\n\\n`\n\n const taskActions = await this.actions.getForTask(task.id)\n if (taskActions.length > 0) {\n md += `## Actions this session\\n`\n md += `| Agent | Status | Summary | Started |\\n`\n md += `|----------|-------------|----------------------------------|-------------|\\n`\n for (const a of taskActions) {\n const started = a.created_at.slice(11, 16)\n const summary = (a.summary ?? '').slice(0, 34).padEnd(34)\n md += `| ${a.agent.padEnd(8)} | ${a.status.padEnd(11)} | ${summary} | ${started} |\\n`\n }\n md += `\\n`\n }\n\n const acceptance = await this.tasks.getAcceptance(task.id)\n if (acceptance.length > 0) {\n md += `## Acceptance Criteria\\n`\n for (const a of acceptance) {\n md += `- [${a.met ? 'x' : ' '}] ${a.criterion}\\n`\n }\n md += `\\n`\n }\n }\n }\n\n writeFileSync(mdPath, md, 'utf8')\n }\n\n // ─── Raw query escape hatch ───────────────────────────────────────────────\n\n async queryRaw<T = Record<string, unknown>>(sql: string, ...params: unknown[]): Promise<T[]> {\n return this.driver.query<T>(sql, params)\n }\n\n // ─── Export helpers ───────────────────────────────────────────────────────\n\n async exportJson(): Promise<{ tasks: TaskRow[]; actions: ActionRow[]; sections: ActionSectionRow[] }> {\n return {\n tasks: await this.tasks.getAll(),\n actions: await this.actions.getAll(),\n sections: await this.actions.getAllSections(),\n }\n }\n\n async close(): Promise<void> {\n await this.driver.close()\n }\n\n // ─── feature_list.json sync ───────────────────────────────────────────────\n\n async syncFromFeatureList(\n seeds: { slug: string; title: string; description?: string; acceptance?: string[] }[],\n ): Promise<{ added: number; skipped: number }> {\n let added = 0\n let skipped = 0\n for (const t of seeds) {\n if (await this.tasks.getBySlug(t.slug)) {\n skipped++\n continue\n }\n await this.addTask(t)\n added++\n }\n return { added, skipped }\n }\n\n async writeFeatureList(cwd: string): Promise<void> {\n const allTasks = await this.tasks.getAll()\n const list = await Promise.all(\n allTasks.map(async (t) => ({\n slug: t.slug,\n title: t.title,\n description: t.description ?? undefined,\n acceptance: (await this.tasks.getAcceptance(t.id)).map((a) => a.criterion),\n status: t.status,\n })),\n )\n const path = join(resolve(cwd), this.config.storage.dir, 'feature_list.json')\n mkdirSync(dirname(path), { recursive: true })\n writeFileSync(path, JSON.stringify(list, null, 2) + '\\n', 'utf8')\n }\n}\n\n// ─── Factory ─────────────────────────────────────────────────────────────────\n\nexport async function openDB(config: HarnessConfig, cwd: string): Promise<HarnessDB> {\n const dbConfig = config.database\n let driver: DBDriver\n\n if (dbConfig.type === 'postgres') {\n const { PostgresDriver } = await import('./drivers/postgres')\n driver = new PostgresDriver(dbConfig)\n } else if (dbConfig.type === 'mysql') {\n const { MySQLDriver } = await import('./drivers/mysql')\n driver = new MySQLDriver(dbConfig)\n } else {\n const { SQLiteDriver } = await import('./drivers/sqlite')\n if (dbConfig.type !== 'sqlite') {\n throw new Error('Invalid database type')\n }\n driver = new SQLiteDriver(resolve(cwd, dbConfig.path))\n }\n\n await driver.ensureSchema()\n return new HarnessDB(driver, config)\n}\n","import type { DBDriver } from '../drivers/types'\nimport type { ActionFileRow, ActionRow, ActionSectionRow, AgentName } from '@/types'\n\nexport interface ActionWithDetails extends ActionRow {\n sections: ActionSectionRow[]\n files: ActionFileRow[]\n tools: ActionToolRow[]\n}\n\nexport interface ActionToolRow {\n id: number\n action_id: string\n tool_name: string\n args_json: string | null\n result_summary: string | null\n called_at: string\n}\n\nexport class ActionRepository {\n constructor(private driver: DBDriver) {}\n\n async create(id: string, taskId: number, agent: AgentName, now: string): Promise<void> {\n await this.driver.exec(\n `INSERT INTO actions (id, task_id, agent, status, created_at) VALUES (?, ?, ?, 'in_progress', ?)`,\n [id, taskId, agent, now],\n )\n }\n\n async complete(actionId: string, summary: string, now: string): Promise<void> {\n await this.driver.exec(\n `UPDATE actions SET status = 'completed', completed_at = ?, summary = ? WHERE id = ?`,\n [now, summary, actionId],\n )\n }\n\n async closeOrphaned(taskId: number, now: string): Promise<number> {\n return this.driver.exec(\n `UPDATE actions SET status = 'completed', completed_at = ?, summary = 'Auto-closed: task marked done' WHERE task_id = ? AND status = 'in_progress'`,\n [now, taskId],\n )\n }\n\n async getById(actionId: string): Promise<ActionRow | null> {\n return this.driver.queryOne<ActionRow>(`SELECT * FROM actions WHERE id = ?`, [actionId])\n }\n\n async getForTask(taskId: number): Promise<ActionRow[]> {\n return this.driver.query<ActionRow>(\n `SELECT * FROM actions WHERE task_id = ? ORDER BY created_at`,\n [taskId],\n )\n }\n\n async getAll(): Promise<ActionRow[]> {\n return this.driver.query<ActionRow>(`SELECT * FROM actions ORDER BY created_at`)\n }\n\n async getWithDetails(taskId: number): Promise<ActionWithDetails[]> {\n const actions = await this.getForTask(taskId)\n return Promise.all(\n actions.map(async (action) => ({\n ...action,\n sections: await this.getSections(action.id),\n files: await this.getFiles(action.id),\n tools: await this.getTools(action.id),\n })),\n )\n }\n\n // ─── Sections ─────────────────────────────────────────────────────────────\n\n async addSection(actionId: string, sectionType: string, content: string, now: string): Promise<void> {\n await this.driver.exec(\n `INSERT INTO action_sections (action_id, section_type, content, created_at) VALUES (?, ?, ?, ?)`,\n [actionId, sectionType, content, now],\n )\n }\n\n async getSections(actionId: string): Promise<ActionSectionRow[]> {\n return this.driver.query<ActionSectionRow>(\n `SELECT * FROM action_sections WHERE action_id = ? ORDER BY created_at`,\n [actionId],\n )\n }\n\n async getAllSections(): Promise<ActionSectionRow[]> {\n return this.driver.query<ActionSectionRow>(`SELECT * FROM action_sections ORDER BY created_at`)\n }\n\n // ─── Files ────────────────────────────────────────────────────────────────\n\n async addFile(\n actionId: string,\n filePath: string,\n operation: ActionFileRow['operation'],\n notes: string | null,\n ): Promise<void> {\n await this.driver.exec(\n `INSERT INTO action_files (action_id, file_path, operation, notes) VALUES (?, ?, ?, ?)`,\n [actionId, filePath, operation, notes],\n )\n }\n\n async getFiles(actionId: string): Promise<ActionFileRow[]> {\n return this.driver.query<ActionFileRow>(\n `SELECT * FROM action_files WHERE action_id = ?`,\n [actionId],\n )\n }\n\n async getFilesForTask(taskId: number): Promise<(ActionFileRow & { agent: AgentName })[]> {\n return this.driver.query<ActionFileRow & { agent: AgentName }>(\n `SELECT af.*, a.agent FROM action_files af JOIN actions a ON af.action_id = a.id WHERE a.task_id = ? ORDER BY a.agent, af.operation`,\n [taskId],\n )\n }\n\n // ─── Tools ────────────────────────────────────────────────────────────────\n\n async addTool(\n actionId: string,\n toolName: string,\n argsJson: string | null,\n resultSummary: string | null,\n now: string,\n ): Promise<void> {\n await this.driver.exec(\n `INSERT INTO action_tools (action_id, tool_name, args_json, result_summary, called_at) VALUES (?, ?, ?, ?, ?)`,\n [actionId, toolName, argsJson, resultSummary, now],\n )\n }\n\n async getTools(actionId: string): Promise<ActionToolRow[]> {\n return this.driver.query<ActionToolRow>(\n `SELECT * FROM action_tools WHERE action_id = ? ORDER BY called_at`,\n [actionId],\n )\n }\n\n async getTopTools(limit: number): Promise<{ tool_name: string; uses: number }[]> {\n return this.driver.query<{ tool_name: string; uses: number }>(\n `SELECT tool_name, COUNT(*) as uses FROM action_tools GROUP BY tool_name ORDER BY uses DESC LIMIT ?`,\n [limit],\n )\n }\n}\n","import type { DBDriver } from '../drivers/types'\nimport type {\n AgentStatRow,\n CountRow,\n RecentFileRow,\n RecentToolRow,\n TimelineRow,\n TopFileRow,\n} from '../server-types'\n\nexport interface DBCounts {\n totalActions: number\n totalFiles: number\n uniqueTools: number\n activeAgents: number\n}\n\nexport { AgentStatRow, RecentFileRow, RecentToolRow, TimelineRow, TopFileRow }\n\nconst AGENT_ORDER = ['lead', 'explorer', 'builder', 'reviewer']\n\nexport class StatsRepository {\n constructor(private driver: DBDriver) { }\n\n async getCounts(): Promise<DBCounts> {\n const [{ total: totalActions }] = await this.driver.query<CountRow>(\n `SELECT COUNT(*) as total FROM actions`,\n )\n const [{ total: totalFiles }] = await this.driver.query<CountRow>(\n `SELECT COUNT(*) as total FROM action_files`,\n )\n const [{ total: uniqueTools }] = await this.driver.query<CountRow>(\n `SELECT COUNT(DISTINCT tool_name) as total FROM action_tools`,\n )\n const [{ total: activeAgents }] = await this.driver.query<CountRow>(\n `SELECT COUNT(DISTINCT agent) as total FROM actions WHERE status = 'in_progress'`,\n )\n return { totalActions, totalFiles, uniqueTools, activeAgents }\n }\n\n async getRecentTools(limit: number): Promise<RecentToolRow[]> {\n return this.driver.query<RecentToolRow>(\n `SELECT at.*, t.id as task_id, t.title as task_title, t.slug as task_slug, a.agent\n FROM action_tools at\n JOIN actions a ON at.action_id = a.id\n JOIN tasks t ON a.task_id = t.id\n ORDER BY at.called_at DESC\n LIMIT ?`,\n [limit],\n )\n }\n\n async getTopFiles(limit: number): Promise<TopFileRow[]> {\n return this.driver.query<TopFileRow>(\n `SELECT\n file_path,\n COUNT(*) as total,\n SUM(CASE WHEN operation='read' THEN 1 ELSE 0 END) as read,\n SUM(CASE WHEN operation='created' THEN 1 ELSE 0 END) as created,\n SUM(CASE WHEN operation='modified' THEN 1 ELSE 0 END) as modified,\n SUM(CASE WHEN operation='deleted' THEN 1 ELSE 0 END) as deleted\n FROM action_files\n GROUP BY file_path\n ORDER BY total DESC\n LIMIT ?`,\n [limit],\n )\n }\n\n async getRecentFiles(limit: number): Promise<RecentFileRow[]> {\n return this.driver.query<RecentFileRow>(\n `SELECT af.*, t.id as task_id, t.title as task_title, t.slug as task_slug,\n a.agent, a.created_at as called_at\n FROM action_files af\n JOIN actions a ON af.action_id = a.id\n JOIN tasks t ON a.task_id = t.id\n ORDER BY a.created_at DESC\n LIMIT ?`,\n [limit],\n )\n }\n\n async getAgentStats(): Promise<AgentStatRow[]> {\n const rows = await this.driver.query<AgentStatRow>(\n `SELECT\n a.agent,\n COUNT(*) as actions_total,\n SUM(CASE WHEN a.status='completed' THEN 1 ELSE 0 END) as actions_done,\n SUM(CASE WHEN a.status='blocked' THEN 1 ELSE 0 END) as actions_blocked,\n COUNT(DISTINCT a.task_id) as tasks_worked,\n COUNT(DISTINCT af.file_path) as files_touched\n FROM actions a\n LEFT JOIN action_files af ON af.action_id = a.id\n GROUP BY a.agent\n ORDER BY actions_total DESC`,\n )\n return rows.sort((a, b) => {\n const ai = AGENT_ORDER.indexOf(a.agent)\n const bi = AGENT_ORDER.indexOf(b.agent)\n if (ai === -1 && bi === -1) return 0\n if (ai === -1) return 1\n if (bi === -1) return -1\n return ai - bi\n })\n }\n\n async getTimeline(limit: number): Promise<TimelineRow[]> {\n return this.driver.query<TimelineRow>(\n `SELECT a.*, t.title as task_title, t.slug as task_slug, t.status as task_status\n FROM actions a\n JOIN tasks t ON a.task_id = t.id\n ORDER BY a.created_at DESC\n LIMIT ?`,\n [limit],\n )\n }\n}\n","import type { DBDriver } from '../drivers/types'\nimport type { TaskAcceptanceRow, TaskRow, TaskStatus } from '@/types'\n\nexport interface TaskWithAcceptance extends TaskRow {\n acceptance_total: number\n acceptance_met: number\n}\n\nexport class TaskRepository {\n constructor(private driver: DBDriver) {}\n\n async add(params: {\n slug: string\n title: string\n description?: string | null\n status?: TaskStatus\n }): Promise<number> {\n const now = new Date().toISOString()\n return this.driver.insert(\n `INSERT INTO tasks (slug, title, description, status, created_at) VALUES (?, ?, ?, ?, ?)`,\n [params.slug, params.title, params.description ?? null, params.status ?? 'pending', now],\n )\n }\n\n async addAcceptance(taskId: number, criteria: string[]): Promise<void> {\n for (const criterion of criteria) {\n await this.driver.exec(\n `INSERT INTO task_acceptance (task_id, criterion) VALUES (?, ?)`,\n [taskId, criterion],\n )\n }\n }\n\n async getAll(status?: TaskStatus): Promise<TaskRow[]> {\n if (status) {\n return this.driver.query<TaskRow>(`SELECT * FROM tasks WHERE status = ? ORDER BY id`, [status])\n }\n return this.driver.query<TaskRow>(`SELECT * FROM tasks ORDER BY id`)\n }\n\n async getAllWithAcceptanceCounts(): Promise<TaskWithAcceptance[]> {\n return this.driver.query<TaskWithAcceptance>(`\n SELECT t.*,\n COUNT(ta.id) as acceptance_total,\n COALESCE(SUM(ta.met), 0) as acceptance_met\n FROM tasks t\n LEFT JOIN task_acceptance ta ON ta.task_id = t.id\n GROUP BY t.id\n ORDER BY t.id\n `)\n }\n\n async getById(id: number): Promise<TaskRow | null> {\n return this.driver.queryOne<TaskRow>(`SELECT * FROM tasks WHERE id = ?`, [id])\n }\n\n async getBySlug(slug: string): Promise<TaskRow | null> {\n return this.driver.queryOne<TaskRow>(`SELECT * FROM tasks WHERE slug = ?`, [slug])\n }\n\n async getAcceptance(taskId: number): Promise<TaskAcceptanceRow[]> {\n return this.driver.query<TaskAcceptanceRow>(\n `SELECT * FROM task_acceptance WHERE task_id = ?`,\n [taskId],\n )\n }\n\n async setStatus(id: number, status: TaskStatus, extra?: { started_at?: string; completed_at?: string }): Promise<void> {\n if (extra?.started_at) {\n await this.driver.exec(\n `UPDATE tasks SET status = ?, started_at = ? WHERE id = ?`,\n [status, extra.started_at, id],\n )\n } else if (extra?.completed_at) {\n await this.driver.exec(\n `UPDATE tasks SET status = ?, completed_at = ? WHERE id = ?`,\n [status, extra.completed_at, id],\n )\n } else {\n await this.driver.exec(`UPDATE tasks SET status = ? WHERE id = ?`, [status, id])\n }\n }\n\n async claim(id: number, agent: string, now: string): Promise<number> {\n return this.driver.exec(\n `UPDATE tasks SET status = 'in_progress', assigned_to = ?, started_at = ? WHERE id = ? AND status = 'pending'`,\n [agent, now, id],\n )\n }\n\n async markAcceptanceMet(criterionId: number): Promise<void> {\n await this.driver.exec(`UPDATE task_acceptance SET met = 1 WHERE id = ?`, [criterionId])\n }\n\n async getStatusSummary(): Promise<{ status: string; total: number }[]> {\n return this.driver.query<{ status: string; total: number }>(\n `SELECT status, COUNT(*) as total FROM tasks GROUP BY status`,\n )\n }\n}\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', '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: '.claude/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 { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport * as p from '@clack/prompts'\nimport pc from 'picocolors'\n\nimport { openDB } from '@/core/db'\nimport { getMaterializer } from '@/core/materializer/index'\nimport { slugify } from '@/core/materializer/scaffold-utils'\nimport { configTs } 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 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}\n\nexport async function runInit(cwd: string, flags: InitOptions): Promise<void> {\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 // ─── Global installation option ──────────────────────────────────────────\n let globalInstallation = false\n const globalVal = await p.confirm({\n message: 'Install globally (to home directory)?',\n initialValue: false,\n })\n if (p.isCancel(globalVal)) {\n p.cancel('Cancelled.')\n process.exit(0)\n }\n if (globalVal) {\n globalInstallation = true\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 // ─── 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 const spinner = p.spinner()\n spinner.start('Scaffolding...')\n\n try {\n const config = applyConfigDefaults({ name, description, provider, docsPath, tasksAdapter })\n const materializer = getMaterializer(provider)\n\n // Write config file - determine if we're installing globally\n let installDir = cwd\n if (globalInstallation) {\n if (provider === 'claude-code') {\n installDir = join(homedir(), '.claude')\n } else {\n installDir = join(homedir(), '.config', 'opencode')\n }\n }\n\n const configContent = configTs({\n name,\n description,\n provider,\n docsPath,\n tasksAdapter,\n port: config.tools.mcp.port,\n })\n writeFileSync(join(installDir, 'agent-harness-kit.config.ts'), configContent, 'utf8')\n\n // Create .harness dir\n mkdirSync(join(installDir, config.storage.dir), { recursive: true })\n\n // Initialize SQLite DB\n const db = await openDB(config, installDir)\n\n // Scaffold provider-specific files\n await materializer.scaffold(config, { cwd: installDir, firstTask })\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 const agentHarnessKitDir = globalInstallation ? 'home directory' : 'current directory'\n console.log(pc.green(`✓ Scaffolded harness in ${agentHarnessKitDir}`))\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.ts'))\n console.log(pc.green('✓ AGENTS.md'))\n console.log(pc.green('✓ health.sh'))\n console.log(pc.green('✓ .harness/harness.db'))\n console.log(pc.green('✓ .harness/current.md'))\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 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","\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 { 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 applyConfigDefaults(params: {\n name: string\n description: string\n provider: Provider\n docsPath: string\n tasksAdapter: string\n}): HarnessConfig {\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 },\n explorer: { instructionsPath: null, allowedPaths: [params.docsPath, './src'] },\n builder: { instructionsPath: null, writablePaths: ['./src', './tests'] },\n reviewer: { instructionsPath: null },\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 },\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 { 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', '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 { readdirSync, readFileSync, statSync } 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 { slugify } from './materializer/scaffold-utils'\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: '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.',\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 },\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: { type: 'number', description: 'The id of the acceptance criterion to mark as met' },\n },\n required: ['criterionId'],\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: { type: 'string', description: 'URL-safe identifier (lowercase, hyphens). Auto-derived from title if omitted.' },\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: { type: 'string', description: 'Name of the tool that was called (e.g. Read, Bash, Edit)' },\n argsJson: { type: 'string', description: 'Optional JSON string of the arguments passed to the tool' },\n resultSummary: { type: 'string', description: 'Optional short summary of the tool result' },\n },\n required: ['actionId', 'toolName'],\n },\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)\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): 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(JSON.stringify({ actionId, status: action.status, completedAt: action.completed_at }))\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 tasks = status\n ? await db.getTasks(status as TaskStatus)\n : await db.getTasks()\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 '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 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({ file: file.replace(docsPath + '/', ''), line: i + 1, text: lines[i].trim() })\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 { loadConfig } from '@/core/config'\nimport { startMcpServer } from '@/core/mcp-server'\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 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 console.log(JSON.stringify({ tasks: actions, summary }, 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 } 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 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}\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 = filterStatus ? await db.getTasks(filterStatus) : await db.getTasks()\n\n if (opts.json) {\n console.log(JSON.stringify(tasks, null, 2))\n return\n }\n\n if (tasks.length === 0) {\n console.log(pc.dim('No tasks' + (filterStatus ? ` with status: ${filterStatus}` : '') + '.'))\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 } finally {\n await db.close()\n }\n}\n","import { 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: dist/cli.js → ../package.json (root)\n// - installed: node_modules/@cardor/agent-harness-kit/dist/cli.js → ../package.json (package root)\nconst pkgPath = join(dirname(fileURLToPath(import.meta.url)), '..', 'package.json')\n\nexport const pkg = require(pkgPath) as { version: string; name: string }\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":["existsSync","mkdirSync","writeFileSync","join","resolve","cwd","mkdirSync","writeFileSync","existsSync","mkdirSync","readFileSync","writeFileSync","join","resolve","readFileSync","dirname","join","cwd","join","existsSync","mkdirSync","resolve","writeFileSync","readFileSync","cwd","existsSync","join","write","mkdirSync","resolve","writeFileSync","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","task","mkdirSync","writeFileSync","dirname","join","resolve","task","resolve","mkdirSync","dirname","writeFileSync","cwd","join","__dirname","dirname","fileURLToPath","cwd","resolve","join","pc","writeFileSync","pc","cwd","pc","writeFileSync","existsSync","join","resolve","pc","ok","pc","cwd","resolve","existsSync","join","mkdirSync","writeFileSync","join","p","pc","v","p","v","existsSync","readFileSync","join","pc","cwd","pkgPath","pkg","str","cwd","spinner","join","writeFileSync","mkdirSync","pc","p","pc","cwd","pc","spinner","existsSync","join","resolve","p","pc","cwd","resolve","existsSync","pc","confirm","join","readdirSync","readFileSync","join","resolve","cwd","resolve","task","readFileSync","readdirSync","join","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","Table","pc","STATUS_COLOR","pc","cwd","Table","dirname","join","fileURLToPath","require","pc","resolve","pc","v"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/commands/build.ts","../src/core/materializer/claude-code.ts","../src/utils/file.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/db.ts","../src/core/repositories/ActionRepository.ts","../src/core/repositories/StatsRepository.ts","../src/core/repositories/TaskRepository.ts","../src/commands/export.ts","../src/commands/health.ts","../src/commands/init.ts","../src/schema/init.ts","../src/schema/task.ts","../src/utils/form.ts","../src/commands/init-helpers.ts","../src/commands/migrate.ts","../src/commands/reset.ts","../src/core/mcp-server.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/package-data.ts","../src/core/update-check.ts"],"sourcesContent":["import { Command } from 'commander'\n\nimport { runBuild } from '@/commands/build'\nimport { runDashboard } from '@/commands/dashboard'\nimport { runExport } from '@/commands/export'\nimport { runHealth } from '@/commands/health'\nimport { runInit } from '@/commands/init'\nimport { runMigrate } from '@/commands/migrate'\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 { 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 .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 .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 ──────────────────────────────────────────────────────────────────\nprogram\n .command('migrate')\n .description('Migrate provider-specific files to a different provider')\n .option('--to <provider>', 'Target provider: claude-code | opencode')\n .action(async (opts) => {\n await runMigrate(cwd, opts)\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\nprogram.hook('postAction', async () => {\n const update = await updateCheck\n if (update) printUpdateMessage(update)\n})\n\nprogram.parse()\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}\n\nexport async function runBuild(cwd: string, opts: BuildOptions): Promise<void> {\n await buildOnce(cwd)\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, writeFileSync } from 'fs'\nimport { join, resolve } from 'path'\n\nimport { write } from '@/utils/file'\n\nimport { mergeClaudeMcpJson, mergeClaudeSettingsJson } from './mcp-merge'\nimport { appendGitignore, slugify, writeAgentFile } from './scaffold-utils'\nimport {\n agentBuilder,\n agentExplorer,\n agentLead,\n agentReviewer,\n agentsMd,\n claudeMd,\n featureListJson,\n HEALTH_SH,\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 writeAgentFile(cwd, '.claude/agents/lead.md', agentLead({ projectName }))\n writeAgentFile(cwd, '.claude/agents/explorer.md', agentExplorer({ projectName, allowedPaths }))\n writeAgentFile(cwd, '.claude/agents/builder.md', agentBuilder({ projectName, writablePaths }))\n writeAgentFile(cwd, '.claude/agents/reviewer.md', agentReviewer({ projectName }))\n\n // .claude/mcp.json — MERGE, never overwrite whole file\n mergeClaudeMcpJson(join(cwd, '.claude/mcp.json'), config.tools.mcp.port)\n // .claude/settings.json — set `agent: \"lead\"` (the official Claude Code default-agent field)\n mergeClaudeSettingsJson(join(cwd, '.claude/settings.json'))\n\n // .gitignore additions\n appendGitignore(cwd)\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: skip if customized, write if missing\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, '.claude/agents/lead.md', agentLead({ projectName }))\n writeAgentFile(cwd, '.claude/agents/explorer.md', agentExplorer({ projectName, allowedPaths }))\n writeAgentFile(cwd, '.claude/agents/builder.md', agentBuilder({ projectName, writablePaths }))\n writeAgentFile(cwd, '.claude/agents/reviewer.md', agentReviewer({ projectName }))\n\n // MCP config: always merge\n mergeClaudeMcpJson(join(cwd, '.claude/mcp.json'), config.tools.mcp.port)\n mergeClaudeSettingsJson(join(cwd, '.claude/settings.json'))\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","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, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { dirname } from 'node:path'\n\n// ─── Claude Code ──────────────────────────────────────────────────────────────\n\nexport function mergeClaudeMcpJson(filePath: string, port: number): 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 merged = {\n ...existing,\n mcpServers: {\n ...((existing.mcpServers as Record<string, unknown>) ?? {}),\n 'agent-harness-kit': {\n type: 'stdio',\n command: 'npx',\n args: ['ahk', 'serve', '--port', String(port)],\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// ─── OpenCode ─────────────────────────────────────────────────────────────────\n\nexport function mergeOpencodeJson(filePath: string, port: number): 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 command: ['npx', 'ahk', 'serve', '--port', String(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): void {\n mkdirSync(dirname(filePath), { recursive: true })\n\n let content = ''\n if (existsSync(filePath)) {\n content = readFileSync(filePath, 'utf8')\n }\n\n const sectionBody = [\n 'command = \"npx\"',\n `args = [\"ahk\", \"serve\", \"--port\", \"${port}\"]`,\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 { join, resolve } from 'node:path'\n\nimport { GITIGNORE_ENTRIES } from './templates'\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","import { readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\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' | '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 starting work.\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 starting)\n\n\\`\\`\\`bash\nbash health.sh\n\\`\\`\\`\n\nIf it exits non-zero, stop and report the issue. Do not proceed with tasks 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 - Run health.sh → exit 1 means stop\n - tasks.get('in_progress') → resume if something is in progress\n - tasks.get('pending') → pick lowest id\n\n2. WORK (lead → explorer → 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 → 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| 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 starting)\n\n\\`\\`\\`bash\nbash health.sh\n\\`\\`\\`\n\nIf it exits non-zero, stop and report the issue. Do not proceed with tasks 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 - Run health.sh → exit 1 means stop\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 → 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 → 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| 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 function configTs(params: {\n name: string\n description: string\n provider: string\n docsPath: string\n tasksAdapter: string\n port: number\n}): string {\n return `import { defineHarness } from '@cardor/agent-harness-kit'\n\nexport default defineHarness({\n project: {\n name: '${params.name}',\n description: '${params.description}',\n docsPath: '${params.docsPath}',\n },\n\n provider: '${params.provider}',\n\n agents: {\n lead: { instructionsPath: null },\n explorer: { instructionsPath: null, allowedPaths: ['${params.docsPath}', './src'] },\n builder: { instructionsPath: null, writablePaths: ['./src', './tests'] },\n reviewer: { instructionsPath: null },\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 },\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 agentReviewer(vars: { projectName: string }): string {\n return loadAgentTemplate('reviewer', vars)\n}\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\nfunction toCodexToml(\n name: string,\n description: string,\n body: string,\n sandboxMode: 'workspace-write' | 'read-only'\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 return `name = \"${name}\"\nsandbox_mode = \"${sandboxMode}\"\n\ndescription = \"\"\"\n${safe(description)}\n\"\"\"\n\ndeveloper_instructions = \"\"\"\n${safe(body.trimEnd())}\n\"\"\"\n`\n}\n\nexport function agentLeadToml(vars: { projectName: string }): string {\n const { description, body } = stripFrontmatter(loadAgentTemplate('lead', vars))\n return toCodexToml('lead', description, body, 'read-only')\n}\n\nexport function agentLeadAsDefaultToml(vars: { projectName: string }): string {\n const { description, body } = stripFrontmatter(loadAgentTemplate('lead', vars))\n return toCodexToml('default', description, body, 'read-only')\n}\n\nexport function agentExplorerToml(vars: { projectName: string; allowedPaths: string }): string {\n const { description, body } = stripFrontmatter(loadAgentTemplate('explorer', vars))\n return toCodexToml('explorer', description, body, 'read-only')\n}\n\nexport function agentBuilderToml(vars: { projectName: string; writablePaths: string }): string {\n const { description, body } = stripFrontmatter(loadAgentTemplate('builder', vars))\n return toCodexToml('builder', description, body, 'workspace-write')\n}\n\nexport function agentReviewerToml(vars: { projectName: string }): string {\n const { description, body } = stripFrontmatter(loadAgentTemplate('reviewer', vars))\n return toCodexToml('reviewer', description, body, 'read-only')\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 { mergeCodexConfigToml } from './mcp-merge'\nimport { appendGitignore, slugify, writeAgentFile } from './scaffold-utils'\nimport {\n agentBuilderToml,\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\n writeAgentFile(cwd, '.codex/agents/lead.toml', agentLeadToml({ projectName }))\n writeAgentFile(cwd, '.codex/agents/explorer.toml', agentExplorerToml({ projectName, allowedPaths }))\n writeAgentFile(cwd, '.codex/agents/builder.toml', agentBuilderToml({ projectName, writablePaths }))\n writeAgentFile(cwd, '.codex/agents/reviewer.toml', agentReviewerToml({ projectName }))\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 }))\n\n // .codex/config.toml — MERGE, never overwrite whole file\n mergeCodexConfigToml(join(cwd, '.codex/config.toml'), config.tools.mcp.port)\n\n appendGitignore(cwd)\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\n writeAgentFile(cwd, '.codex/agents/lead.toml', agentLeadToml({ projectName }))\n writeAgentFile(cwd, '.codex/agents/explorer.toml', agentExplorerToml({ projectName, allowedPaths }))\n writeAgentFile(cwd, '.codex/agents/builder.toml', agentBuilderToml({ projectName, writablePaths }))\n writeAgentFile(cwd, '.codex/agents/reviewer.toml', agentReviewerToml({ projectName }))\n writeAgentFile(cwd, '.codex/agents/default.toml', agentLeadAsDefaultToml({ projectName }))\n\n mergeCodexConfigToml(join(cwd, '.codex/config.toml'), config.tools.mcp.port)\n }\n\n async migrate(config: HarnessConfig, _to: Provider, _cwd: string): Promise<void> {\n void config\n }\n}\n","import { existsSync, mkdirSync, writeFileSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\n\nimport { mergeOpencodeJson } from './mcp-merge'\nimport { appendGitignore, slugify, writeAgentFile } from './scaffold-utils'\nimport { agentBuilder, agentExplorer, agentLead, agentReviewer, agentsMd, featureListJson, HEALTH_SH } 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', agentLead({ projectName }))\n writeAgentFile(cwd, '.opencode/agents/explorer.md', agentExplorer({ projectName, allowedPaths }))\n writeAgentFile(cwd, '.opencode/agents/builder.md', agentBuilder({ projectName, writablePaths }))\n writeAgentFile(cwd, '.opencode/agents/reviewer.md', agentReviewer({ projectName }))\n\n // opencode.json — MERGE, never overwrite whole file\n mergeOpencodeJson(join(cwd, 'opencode.json'), config.tools.mcp.port)\n\n appendGitignore(cwd)\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', agentLead({ projectName }))\n writeAgentFile(cwd, '.opencode/agents/explorer.md', agentExplorer({ projectName, allowedPaths }))\n writeAgentFile(cwd, '.opencode/agents/builder.md', agentBuilder({ projectName, writablePaths }))\n writeAgentFile(cwd, '.opencode/agents/reviewer.md', agentReviewer({ projectName }))\n\n mergeOpencodeJson(join(cwd, 'opencode.json'), config.tools.mcp.port)\n }\n\n async migrate(config: HarnessConfig, _to: Provider, _cwd: string): Promise<void> {\n void config\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}\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 } = 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 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 function startDashboardServer(\n db: HarnessDB,\n dbPath: string | null,\n staticPath: string,\n port: number,\n): 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(id, body.acceptance.map((a: string) => a.trim()).filter(Boolean))\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 { return fileResponse(candidate) } catch { /* fall through */ }\n }\n }\n return fileResponse(join(staticPath, 'index.html'))\n })\n\n // ─── Start HTTP server ────────────────────────────────────────────────────\n const httpServer = serve({ fetch: app.fetch, port })\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:${port}`,\n close: () => {\n clearTimeout(debounce)\n watcher?.close()\n wss.close()\n httpServer.close()\n },\n }\n}\n","import { randomUUID } from 'node:crypto'\nimport { mkdirSync, writeFileSync } from 'node:fs'\nimport { dirname, join, resolve } from 'node:path'\n\nimport { ActionRepository } from './repositories/ActionRepository'\nimport { StatsRepository } from './repositories/StatsRepository'\nimport { TaskRepository } from './repositories/TaskRepository'\n\nimport type { DBDriver } from './drivers/types'\nimport type {\n ActionFileRow,\n ActionRow,\n ActionSectionRow,\n AgentName,\n HarnessConfig,\n TaskAcceptanceRow,\n TaskRow,\n TaskStatus,\n} from '@/types'\n\n// ─── DB class ─────────────────────────────────────────────────────────────────\n\nexport class HarnessDB {\n readonly tasks: TaskRepository\n readonly actions: ActionRepository\n readonly stats: StatsRepository\n private driver: DBDriver\n private config: HarnessConfig\n\n constructor(driver: DBDriver, config: HarnessConfig) {\n this.driver = driver\n this.config = config\n this.tasks = new TaskRepository(driver)\n this.actions = new ActionRepository(driver)\n this.stats = new StatsRepository(driver)\n }\n\n // ─── Tasks (public facade — delegates to TaskRepository) ──────────────────\n\n async addTask(params: {\n slug: string\n title: string\n description?: string\n acceptance?: string[]\n }): Promise<TaskRow> {\n const taskId = await this.tasks.add({\n slug: params.slug,\n title: params.title,\n description: params.description,\n })\n if (params.acceptance?.length) {\n await this.tasks.addAcceptance(taskId, params.acceptance)\n }\n await this.regenerateCurrentMd()\n return (await this.tasks.getById(taskId))!\n }\n\n async getTasks(status?: TaskStatus, includeArchived = false): Promise<TaskRow[]> {\n return this.tasks.getAll(status, includeArchived)\n }\n\n async getTaskById(id: number): Promise<TaskRow | null> {\n return this.tasks.getById(id)\n }\n\n async getTaskBySlug(slug: string): Promise<TaskRow | null> {\n return this.tasks.getBySlug(slug)\n }\n\n async getTaskAcceptance(taskId: number): Promise<TaskAcceptanceRow[]> {\n return this.tasks.getAcceptance(taskId)\n }\n\n async updateTaskStatus(idOrSlug: number | string, status: TaskStatus): Promise<TaskRow> {\n const now = new Date().toISOString()\n const task =\n typeof idOrSlug === 'number'\n ? await this.tasks.getById(idOrSlug)\n : await this.tasks.getBySlug(idOrSlug)\n if (!task) throw new Error(`Task not found: ${idOrSlug}`)\n\n if (status === 'in_progress' && !task.started_at) {\n await this.tasks.setStatus(task.id, status, { started_at: now })\n } else if (status === 'done') {\n await this.tasks.setStatus(task.id, status, { completed_at: now })\n } else {\n await this.tasks.setStatus(task.id, status)\n }\n\n await this.regenerateCurrentMd()\n return (await this.tasks.getById(task.id))!\n }\n\n async claimTask(id: number, agent: string): Promise<TaskRow | null> {\n const now = new Date().toISOString()\n return this.driver.transaction(async (tx) => {\n // need to create a new TaskRepository instance bound to the transaction\n const txTasks = new TaskRepository(tx)\n const changed = await txTasks.claim(id, agent, now)\n if (!changed) return null\n const task = await txTasks.getById(id)\n if (!task || task.status !== 'in_progress' || task.assigned_to !== agent) return null\n await this.regenerateCurrentMd()\n return task\n })\n }\n\n async markAcceptanceMet(criterionId: number): Promise<void> {\n return this.tasks.markAcceptanceMet(criterionId)\n }\n\n async updateTask(id: number, params: { title?: string; description?: string | null; slug?: string }): Promise<TaskRow> {\n await this.tasks.update(id, params)\n await this.regenerateCurrentMd()\n return (await this.tasks.getById(id))!\n }\n\n async updateTaskAcceptance(taskId: number, criteria: string[]): Promise<void> {\n await this.tasks.replaceAcceptance(taskId, criteria)\n await this.regenerateCurrentMd()\n }\n\n async archiveTask(id: number): Promise<TaskRow> {\n await this.tasks.archive(id)\n await this.regenerateCurrentMd()\n return (await this.tasks.getById(id))!\n }\n\n async unarchiveTask(id: number): Promise<TaskRow> {\n await this.tasks.unarchive(id)\n await this.regenerateCurrentMd()\n return (await this.tasks.getById(id))!\n }\n\n async getArchivedTasks(): Promise<TaskRow[]> {\n return this.tasks.getArchived()\n }\n\n async getStatusSummary(): Promise<{ status: string; total: number }[]> {\n return this.tasks.getStatusSummary()\n }\n\n // ─── Actions (public facade — delegates to ActionRepository) ──────────────\n\n async startAction(taskId: number, agent: AgentName): Promise<ActionRow> {\n const id = randomUUID()\n const now = new Date().toISOString()\n await this.actions.create(id, taskId, agent, now)\n await this.regenerateCurrentMd()\n return (await this.actions.getById(id))!\n }\n\n async writeSection(actionId: string, sectionType: string, content: string): Promise<void> {\n const now = new Date().toISOString()\n await this.actions.addSection(actionId, sectionType, content, now)\n await this.regenerateCurrentMd()\n }\n\n async completeAction(actionId: string, summary: string): Promise<ActionRow> {\n const now = new Date().toISOString()\n await this.actions.complete(actionId, summary, now)\n await this.regenerateCurrentMd()\n return (await this.actions.getById(actionId))!\n }\n\n async closeOrphanedActions(taskId: number): Promise<number> {\n const now = new Date().toISOString()\n return this.actions.closeOrphaned(taskId, now)\n }\n\n async getAction(actionId: string): Promise<ActionRow | null> {\n return this.actions.getById(actionId)\n }\n\n async getActionsForTask(taskId: number): Promise<ActionRow[]> {\n return this.actions.getForTask(taskId)\n }\n\n async getActionSections(actionId: string): Promise<ActionSectionRow[]> {\n return this.actions.getSections(actionId)\n }\n\n async recordFile(\n actionId: string,\n filePath: string,\n operation: ActionFileRow['operation'],\n notes?: string,\n ): Promise<void> {\n return this.actions.addFile(actionId, filePath, operation, notes ?? null)\n }\n\n async recordTool(\n actionId: string,\n toolName: string,\n argsJson?: string,\n resultSummary?: string,\n ): Promise<void> {\n const now = new Date().toISOString()\n return this.actions.addTool(actionId, toolName, argsJson ?? null, resultSummary ?? null, now)\n }\n\n async getFilesForTask(taskId: number): Promise<(ActionFileRow & { agent: AgentName })[]> {\n return this.actions.getFilesForTask(taskId)\n }\n\n async getTopTools(limit = 10): Promise<{ tool_name: string; uses: number }[]> {\n return this.actions.getTopTools(limit)\n }\n\n // ─── current.md fallback ──────────────────────────────────────────────────\n\n async regenerateCurrentMd(): Promise<void> {\n if (!this.config.storage.markdownFallback.enabled) return\n\n const mdPath = resolve(this.config.storage.markdownFallback.path)\n mkdirSync(dirname(mdPath), { recursive: true })\n\n const inProgress = await this.tasks.getAll('in_progress')\n const now = new Date().toISOString()\n\n let md = `<!-- AUTO-GENERATED by agent-harness-kit — DO NOT EDIT MANUALLY -->\\n`\n md += `<!-- Last updated: ${now} -->\\n\\n`\n md += `# Current Session\\n\\n`\n\n if (inProgress.length === 0) {\n md += `## No tasks in progress\\n\\n`\n const pending = await this.tasks.getAll('pending')\n if (pending.length > 0) {\n md += `### Next pending tasks\\n`\n for (const t of pending.slice(0, 5)) {\n md += `- **#${t.id}** ${t.title} (\\`${t.slug}\\`)\\n`\n }\n }\n } else {\n for (const task of inProgress) {\n md += `## Active Task\\n`\n md += `- **ID:** ${task.id}\\n`\n md += `- **Slug:** ${task.slug}\\n`\n md += `- **Status:** ${task.status}\\n`\n md += `- **Started:** ${task.started_at ?? 'unknown'}\\n\\n`\n\n const taskActions = await this.actions.getForTask(task.id)\n if (taskActions.length > 0) {\n md += `## Actions this session\\n`\n md += `| Agent | Status | Summary | Started |\\n`\n md += `|----------|-------------|----------------------------------|-------------|\\n`\n for (const a of taskActions) {\n const started = a.created_at.slice(11, 16)\n const summary = (a.summary ?? '').slice(0, 34).padEnd(34)\n md += `| ${a.agent.padEnd(8)} | ${a.status.padEnd(11)} | ${summary} | ${started} |\\n`\n }\n md += `\\n`\n }\n\n const acceptance = await this.tasks.getAcceptance(task.id)\n if (acceptance.length > 0) {\n md += `## Acceptance Criteria\\n`\n for (const a of acceptance) {\n md += `- [${a.met ? 'x' : ' '}] ${a.criterion}\\n`\n }\n md += `\\n`\n }\n }\n }\n\n writeFileSync(mdPath, md, 'utf8')\n }\n\n // ─── Raw query escape hatch ───────────────────────────────────────────────\n\n async queryRaw<T = Record<string, unknown>>(sql: string, ...params: unknown[]): Promise<T[]> {\n return this.driver.query<T>(sql, params)\n }\n\n // ─── Export helpers ───────────────────────────────────────────────────────\n\n async exportJson(): Promise<{ tasks: TaskRow[]; actions: ActionRow[]; sections: ActionSectionRow[] }> {\n return {\n tasks: await this.tasks.getAll(undefined, true),\n actions: await this.actions.getAll(),\n sections: await this.actions.getAllSections(),\n }\n }\n\n async reconnect(): Promise<void> {\n await this.driver.reconnect()\n }\n\n async close(): Promise<void> {\n await this.driver.close()\n }\n\n // ─── feature_list.json sync ───────────────────────────────────────────────\n\n async syncFromFeatureList(\n seeds: { slug: string; title: string; description?: string; acceptance?: string[] }[],\n ): Promise<{ added: number; skipped: number }> {\n let added = 0\n let skipped = 0\n for (const t of seeds) {\n if (await this.tasks.getBySlug(t.slug)) {\n skipped++\n continue\n }\n await this.addTask(t)\n added++\n }\n return { added, skipped }\n }\n\n async writeFeatureList(cwd: string): Promise<void> {\n const allTasks = await this.tasks.getAll(undefined, true)\n const list = await Promise.all(\n allTasks.map(async (t) => ({\n slug: t.slug,\n title: t.title,\n description: t.description ?? undefined,\n acceptance: (await this.tasks.getAcceptance(t.id)).map((a) => a.criterion),\n status: t.status,\n })),\n )\n const path = join(resolve(cwd), this.config.storage.dir, 'feature_list.json')\n mkdirSync(dirname(path), { recursive: true })\n writeFileSync(path, JSON.stringify(list, null, 2) + '\\n', 'utf8')\n }\n}\n\n// ─── Factory ─────────────────────────────────────────────────────────────────\n\nexport async function openDB(config: HarnessConfig, cwd: string): Promise<HarnessDB> {\n const dbConfig = config.database\n let driver: DBDriver\n\n if (dbConfig.type === 'postgres') {\n const { PostgresDriver } = await import('./drivers/postgres')\n driver = new PostgresDriver(dbConfig)\n } else if (dbConfig.type === 'mysql') {\n const { MySQLDriver } = await import('./drivers/mysql')\n driver = new MySQLDriver(dbConfig)\n } else {\n const { SQLiteDriver } = await import('./drivers/sqlite')\n if (dbConfig.type !== 'sqlite') {\n throw new Error('Invalid database type')\n }\n driver = new SQLiteDriver(resolve(cwd, dbConfig.path))\n }\n\n await driver.ensureSchema()\n return new HarnessDB(driver, config)\n}\n","import type { DBDriver } from '../drivers/types'\nimport type { ActionFileRow, ActionRow, ActionSectionRow, AgentName } from '@/types'\n\nexport interface ActionWithDetails extends ActionRow {\n sections: ActionSectionRow[]\n files: ActionFileRow[]\n tools: ActionToolRow[]\n}\n\nexport interface ActionToolRow {\n id: number\n action_id: string\n tool_name: string\n args_json: string | null\n result_summary: string | null\n called_at: string\n}\n\nexport class ActionRepository {\n constructor(private driver: DBDriver) {}\n\n async create(id: string, taskId: number, agent: AgentName, now: string): Promise<void> {\n await this.driver.exec(\n `INSERT INTO actions (id, task_id, agent, status, created_at) VALUES (?, ?, ?, 'in_progress', ?)`,\n [id, taskId, agent, now],\n )\n }\n\n async complete(actionId: string, summary: string, now: string): Promise<void> {\n await this.driver.exec(\n `UPDATE actions SET status = 'completed', completed_at = ?, summary = ? WHERE id = ?`,\n [now, summary, actionId],\n )\n }\n\n async closeOrphaned(taskId: number, now: string): Promise<number> {\n return this.driver.exec(\n `UPDATE actions SET status = 'completed', completed_at = ?, summary = 'Auto-closed: task marked done' WHERE task_id = ? AND status = 'in_progress'`,\n [now, taskId],\n )\n }\n\n async getById(actionId: string): Promise<ActionRow | null> {\n return this.driver.queryOne<ActionRow>(`SELECT * FROM actions WHERE id = ?`, [actionId])\n }\n\n async getForTask(taskId: number): Promise<ActionRow[]> {\n return this.driver.query<ActionRow>(\n `SELECT * FROM actions WHERE task_id = ? ORDER BY created_at`,\n [taskId],\n )\n }\n\n async getAll(): Promise<ActionRow[]> {\n return this.driver.query<ActionRow>(`SELECT * FROM actions ORDER BY created_at`)\n }\n\n async getWithDetails(taskId: number): Promise<ActionWithDetails[]> {\n const actions = await this.getForTask(taskId)\n return Promise.all(\n actions.map(async (action) => ({\n ...action,\n sections: await this.getSections(action.id),\n files: await this.getFiles(action.id),\n tools: await this.getTools(action.id),\n })),\n )\n }\n\n // ─── Sections ─────────────────────────────────────────────────────────────\n\n async addSection(actionId: string, sectionType: string, content: string, now: string): Promise<void> {\n await this.driver.exec(\n `INSERT INTO action_sections (action_id, section_type, content, created_at) VALUES (?, ?, ?, ?)`,\n [actionId, sectionType, content, now],\n )\n }\n\n async getSections(actionId: string): Promise<ActionSectionRow[]> {\n return this.driver.query<ActionSectionRow>(\n `SELECT * FROM action_sections WHERE action_id = ? ORDER BY created_at`,\n [actionId],\n )\n }\n\n async getAllSections(): Promise<ActionSectionRow[]> {\n return this.driver.query<ActionSectionRow>(`SELECT * FROM action_sections ORDER BY created_at`)\n }\n\n // ─── Files ────────────────────────────────────────────────────────────────\n\n async addFile(\n actionId: string,\n filePath: string,\n operation: ActionFileRow['operation'],\n notes: string | null,\n ): Promise<void> {\n await this.driver.exec(\n `INSERT INTO action_files (action_id, file_path, operation, notes) VALUES (?, ?, ?, ?)`,\n [actionId, filePath, operation, notes],\n )\n }\n\n async getFiles(actionId: string): Promise<ActionFileRow[]> {\n return this.driver.query<ActionFileRow>(\n `SELECT * FROM action_files WHERE action_id = ?`,\n [actionId],\n )\n }\n\n async getFilesForTask(taskId: number): Promise<(ActionFileRow & { agent: AgentName })[]> {\n return this.driver.query<ActionFileRow & { agent: AgentName }>(\n `SELECT af.*, a.agent FROM action_files af JOIN actions a ON af.action_id = a.id WHERE a.task_id = ? ORDER BY a.agent, af.operation`,\n [taskId],\n )\n }\n\n // ─── Tools ────────────────────────────────────────────────────────────────\n\n async addTool(\n actionId: string,\n toolName: string,\n argsJson: string | null,\n resultSummary: string | null,\n now: string,\n ): Promise<void> {\n await this.driver.exec(\n `INSERT INTO action_tools (action_id, tool_name, args_json, result_summary, called_at) VALUES (?, ?, ?, ?, ?)`,\n [actionId, toolName, argsJson, resultSummary, now],\n )\n }\n\n async getTools(actionId: string): Promise<ActionToolRow[]> {\n return this.driver.query<ActionToolRow>(\n `SELECT * FROM action_tools WHERE action_id = ? ORDER BY called_at`,\n [actionId],\n )\n }\n\n async getTopTools(limit: number): Promise<{ tool_name: string; uses: number }[]> {\n return this.driver.query<{ tool_name: string; uses: number }>(\n `SELECT tool_name, COUNT(*) as uses FROM action_tools GROUP BY tool_name ORDER BY uses DESC LIMIT ?`,\n [limit],\n )\n }\n}\n","import type { DBDriver } from '../drivers/types'\nimport type {\n AgentStatRow,\n CountRow,\n RecentFileRow,\n RecentToolRow,\n TimelineRow,\n TopFileRow,\n} from '../server-types'\n\nexport interface DBCounts {\n totalActions: number\n totalFiles: number\n uniqueTools: number\n activeAgents: number\n}\n\nexport { AgentStatRow, RecentFileRow, RecentToolRow, TimelineRow, TopFileRow }\n\nconst AGENT_ORDER = ['lead', 'explorer', 'builder', 'reviewer']\n\nexport class StatsRepository {\n constructor(private driver: DBDriver) { }\n\n async getCounts(): Promise<DBCounts> {\n const [{ total: totalActions }] = await this.driver.query<CountRow>(\n `SELECT COUNT(*) as total FROM actions`,\n )\n const [{ total: totalFiles }] = await this.driver.query<CountRow>(\n `SELECT COUNT(*) as total FROM action_files`,\n )\n const [{ total: uniqueTools }] = await this.driver.query<CountRow>(\n `SELECT COUNT(DISTINCT tool_name) as total FROM action_tools`,\n )\n const [{ total: activeAgents }] = await this.driver.query<CountRow>(\n `SELECT COUNT(DISTINCT agent) as total FROM actions WHERE status = 'in_progress'`,\n )\n return { totalActions, totalFiles, uniqueTools, activeAgents }\n }\n\n async getRecentTools(limit: number): Promise<RecentToolRow[]> {\n return this.driver.query<RecentToolRow>(\n `SELECT at.*, t.id as task_id, t.title as task_title, t.slug as task_slug, a.agent\n FROM action_tools at\n JOIN actions a ON at.action_id = a.id\n JOIN tasks t ON a.task_id = t.id\n ORDER BY at.called_at DESC\n LIMIT ?`,\n [limit],\n )\n }\n\n async getTopFiles(limit: number): Promise<TopFileRow[]> {\n return this.driver.query<TopFileRow>(\n `SELECT\n file_path,\n COUNT(*) as total,\n SUM(CASE WHEN operation='read' THEN 1 ELSE 0 END) as read,\n SUM(CASE WHEN operation='created' THEN 1 ELSE 0 END) as created,\n SUM(CASE WHEN operation='modified' THEN 1 ELSE 0 END) as modified,\n SUM(CASE WHEN operation='deleted' THEN 1 ELSE 0 END) as deleted\n FROM action_files\n GROUP BY file_path\n ORDER BY total DESC\n LIMIT ?`,\n [limit],\n )\n }\n\n async getRecentFiles(limit: number): Promise<RecentFileRow[]> {\n return this.driver.query<RecentFileRow>(\n `SELECT af.*, t.id as task_id, t.title as task_title, t.slug as task_slug,\n a.agent, a.created_at as called_at\n FROM action_files af\n JOIN actions a ON af.action_id = a.id\n JOIN tasks t ON a.task_id = t.id\n ORDER BY a.created_at DESC\n LIMIT ?`,\n [limit],\n )\n }\n\n async getAgentStats(): Promise<AgentStatRow[]> {\n const rows = await this.driver.query<AgentStatRow>(\n `SELECT\n a.agent,\n COUNT(*) as actions_total,\n SUM(CASE WHEN a.status='completed' THEN 1 ELSE 0 END) as actions_done,\n SUM(CASE WHEN a.status='blocked' THEN 1 ELSE 0 END) as actions_blocked,\n COUNT(DISTINCT a.task_id) as tasks_worked,\n COUNT(DISTINCT af.file_path) as files_touched\n FROM actions a\n LEFT JOIN action_files af ON af.action_id = a.id\n GROUP BY a.agent\n ORDER BY actions_total DESC`,\n )\n return rows.sort((a, b) => {\n const ai = AGENT_ORDER.indexOf(a.agent)\n const bi = AGENT_ORDER.indexOf(b.agent)\n if (ai === -1 && bi === -1) return 0\n if (ai === -1) return 1\n if (bi === -1) return -1\n return ai - bi\n })\n }\n\n async getTimeline(limit: number): Promise<TimelineRow[]> {\n return this.driver.query<TimelineRow>(\n `SELECT a.*, t.title as task_title, t.slug as task_slug, t.status as task_status\n FROM actions a\n JOIN tasks t ON a.task_id = t.id\n ORDER BY a.created_at DESC\n LIMIT ?`,\n [limit],\n )\n }\n}\n","import type { DBDriver } from '../drivers/types'\nimport type { TaskAcceptanceRow, TaskRow, TaskStatus } from '@/types'\n\nexport interface TaskWithAcceptance extends TaskRow {\n acceptance_total: number\n acceptance_met: number\n}\n\nexport class TaskRepository {\n constructor(private driver: DBDriver) {}\n\n async add(params: {\n slug: string\n title: string\n description?: string | null\n status?: TaskStatus\n }): Promise<number> {\n const now = new Date().toISOString()\n return this.driver.insert(\n `INSERT INTO tasks (slug, title, description, status, created_at) VALUES (?, ?, ?, ?, ?)`,\n [params.slug, params.title, params.description ?? null, params.status ?? 'pending', now],\n )\n }\n\n async addAcceptance(taskId: number, criteria: string[]): Promise<void> {\n for (const criterion of criteria) {\n await this.driver.exec(\n `INSERT INTO task_acceptance (task_id, criterion) VALUES (?, ?)`,\n [taskId, criterion],\n )\n }\n }\n\n async getAll(status?: TaskStatus, includeArchived = false): Promise<TaskRow[]> {\n let sql = `SELECT * FROM tasks`\n const params: unknown[] = []\n const conditions: string[] = []\n\n if (!includeArchived) {\n conditions.push(`archived_at IS NULL`)\n }\n if (status) {\n conditions.push(`status = ?`)\n params.push(status)\n }\n if (conditions.length > 0) {\n sql += ` WHERE ${conditions.join(' AND ')}`\n }\n sql += ` ORDER BY id`\n\n return this.driver.query<TaskRow>(sql, params)\n }\n\n async getAllWithAcceptanceCounts(includeArchived = false): Promise<TaskWithAcceptance[]> {\n let sql = `\n SELECT t.*,\n COUNT(ta.id) as acceptance_total,\n COALESCE(SUM(ta.met), 0) as acceptance_met\n FROM tasks t\n LEFT JOIN task_acceptance ta ON ta.task_id = t.id\n `\n if (!includeArchived) {\n sql += ` WHERE t.archived_at IS NULL`\n }\n sql += ` GROUP BY t.id ORDER BY t.id`\n return this.driver.query<TaskWithAcceptance>(sql)\n }\n\n async getById(id: number): Promise<TaskRow | null> {\n return this.driver.queryOne<TaskRow>(`SELECT * FROM tasks WHERE id = ?`, [id])\n }\n\n async getBySlug(slug: string): Promise<TaskRow | null> {\n return this.driver.queryOne<TaskRow>(`SELECT * FROM tasks WHERE slug = ?`, [slug])\n }\n\n async getAcceptance(taskId: number): Promise<TaskAcceptanceRow[]> {\n return this.driver.query<TaskAcceptanceRow>(\n `SELECT * FROM task_acceptance WHERE task_id = ?`,\n [taskId],\n )\n }\n\n async setStatus(id: number, status: TaskStatus, extra?: { started_at?: string; completed_at?: string }): Promise<void> {\n if (extra?.started_at) {\n await this.driver.exec(\n `UPDATE tasks SET status = ?, started_at = ? WHERE id = ?`,\n [status, extra.started_at, id],\n )\n } else if (extra?.completed_at) {\n await this.driver.exec(\n `UPDATE tasks SET status = ?, completed_at = ? WHERE id = ?`,\n [status, extra.completed_at, id],\n )\n } else {\n await this.driver.exec(`UPDATE tasks SET status = ? WHERE id = ?`, [status, id])\n }\n }\n\n async update(id: number, params: { title?: string; description?: string | null; slug?: string }): Promise<void> {\n const sets: string[] = []\n const vals: unknown[] = []\n if (params.title !== undefined) { sets.push('title = ?'); vals.push(params.title) }\n if (params.description !== undefined) { sets.push('description = ?'); vals.push(params.description) }\n if (params.slug !== undefined) { sets.push('slug = ?'); vals.push(params.slug) }\n if (sets.length === 0) return\n vals.push(id)\n await this.driver.exec(`UPDATE tasks SET ${sets.join(', ')} WHERE id = ?`, vals)\n }\n\n async replaceAcceptance(taskId: number, criteria: string[]): Promise<void> {\n await this.driver.exec(`DELETE FROM task_acceptance WHERE task_id = ?`, [taskId])\n for (const criterion of criteria) {\n await this.driver.exec(\n `INSERT INTO task_acceptance (task_id, criterion) VALUES (?, ?)`,\n [taskId, criterion],\n )\n }\n }\n\n async archive(id: number): Promise<void> {\n const now = new Date().toISOString()\n await this.driver.exec(`UPDATE tasks SET archived_at = ? WHERE id = ?`, [now, id])\n }\n\n async unarchive(id: number): Promise<void> {\n await this.driver.exec(`UPDATE tasks SET archived_at = NULL WHERE id = ?`, [id])\n }\n\n async getArchived(): Promise<TaskRow[]> {\n return this.driver.query<TaskRow>(\n `SELECT * FROM tasks WHERE archived_at IS NOT NULL ORDER BY archived_at DESC`\n )\n }\n\n async claim(id: number, agent: string, now: string): Promise<number> {\n return this.driver.exec(\n `UPDATE tasks SET status = 'in_progress', assigned_to = ?, started_at = ? WHERE id = ? AND status = 'pending'`,\n [agent, now, id],\n )\n }\n\n async markAcceptanceMet(criterionId: number): Promise<void> {\n await this.driver.exec(`UPDATE task_acceptance SET met = 1 WHERE id = ?`, [criterionId])\n }\n\n async getStatusSummary(): Promise<{ status: string; total: number }[]> {\n return this.driver.query<{ status: string; total: number }>(\n `SELECT status, COUNT(*) as total FROM tasks WHERE archived_at IS NULL GROUP BY status`,\n )\n }\n}\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', '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: '.claude/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 { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport * as p from '@clack/prompts'\nimport pc from 'picocolors'\n\nimport { openDB } from '@/core/db'\nimport { getMaterializer } from '@/core/materializer/index'\nimport { slugify } from '@/core/materializer/scaffold-utils'\nimport { configTs } 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 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}\n\nexport async function runInit(cwd: string, flags: InitOptions): Promise<void> {\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 // ─── Global installation option ──────────────────────────────────────────\n let globalInstallation = false\n const globalVal = await p.confirm({\n message: 'Install globally (to home directory)?',\n initialValue: false,\n })\n if (p.isCancel(globalVal)) {\n p.cancel('Cancelled.')\n process.exit(0)\n }\n if (globalVal) {\n globalInstallation = true\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 // ─── 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 const spinner = p.spinner()\n spinner.start('Scaffolding...')\n\n try {\n const config = applyConfigDefaults({ name, description, provider, docsPath, tasksAdapter })\n const materializer = getMaterializer(provider)\n\n // Write config file - determine if we're installing globally\n let installDir = cwd\n if (globalInstallation) {\n if (provider === 'claude-code') {\n installDir = join(homedir(), '.claude')\n } else {\n installDir = join(homedir(), '.config', 'opencode')\n }\n }\n\n const configContent = configTs({\n name,\n description,\n provider,\n docsPath,\n tasksAdapter,\n port: config.tools.mcp.port,\n })\n writeFileSync(join(installDir, 'agent-harness-kit.config.ts'), configContent, 'utf8')\n\n // Create .harness dir\n mkdirSync(join(installDir, config.storage.dir), { recursive: true })\n\n // Initialize SQLite DB\n const db = await openDB(config, installDir)\n\n // Scaffold provider-specific files\n await materializer.scaffold(config, { cwd: installDir, firstTask })\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 const agentHarnessKitDir = globalInstallation ? 'home directory' : 'current directory'\n console.log(pc.green(`✓ Scaffolded harness in ${agentHarnessKitDir}`))\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.ts'))\n console.log(pc.green('✓ AGENTS.md'))\n console.log(pc.green('✓ health.sh'))\n console.log(pc.green('✓ .harness/harness.db'))\n console.log(pc.green('✓ .harness/current.md'))\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 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","\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 { 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 applyConfigDefaults(params: {\n name: string\n description: string\n provider: Provider\n docsPath: string\n tasksAdapter: string\n}): HarnessConfig {\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 },\n explorer: { instructionsPath: null, allowedPaths: [params.docsPath, './src'] },\n builder: { instructionsPath: null, writablePaths: ['./src', './tests'] },\n reviewer: { instructionsPath: null },\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 },\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 { 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', '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 { readdirSync, readFileSync, statSync } 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 { slugify } from './materializer/scaffold-utils'\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: '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: { type: 'number', description: 'The id of the acceptance criterion to mark as met' },\n },\n required: ['criterionId'],\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: { type: 'string', description: 'URL-safe identifier (lowercase, hyphens). Auto-derived from title if omitted.' },\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: { type: 'string', description: 'Name of the tool that was called (e.g. Read, Bash, Edit)' },\n argsJson: { type: 'string', description: 'Optional JSON string of the arguments passed to the tool' },\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: '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: '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] 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)\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): 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(JSON.stringify({ actionId, status: action.status, completedAt: action.completed_at }))\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 '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, { title, description: description !== undefined ? description : undefined })\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 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({ file: file.replace(docsPath + '/', ''), line: i + 1, text: lines[i].trim() })\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 { loadConfig } from '@/core/config'\nimport { startMcpServer } from '@/core/mcp-server'\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 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 { 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: dist/cli.js → ../package.json (root)\n// - installed: node_modules/@cardor/agent-harness-kit/dist/cli.js → ../package.json (package root)\nconst pkgPath = join(dirname(fileURLToPath(import.meta.url)), '..', 'package.json')\n\nexport const pkg = require(pkgPath) as { version: string; name: string }\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":["existsSync","mkdirSync","writeFileSync","join","resolve","cwd","mkdirSync","writeFileSync","existsSync","mkdirSync","readFileSync","writeFileSync","join","resolve","readFileSync","dirname","join","cwd","join","existsSync","mkdirSync","resolve","writeFileSync","readFileSync","cwd","existsSync","join","write","mkdirSync","resolve","writeFileSync","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","task","mkdirSync","writeFileSync","dirname","join","resolve","task","resolve","mkdirSync","dirname","writeFileSync","cwd","join","__dirname","dirname","fileURLToPath","cwd","resolve","join","pc","writeFileSync","pc","cwd","pc","writeFileSync","existsSync","join","resolve","pc","ok","pc","cwd","resolve","existsSync","join","mkdirSync","writeFileSync","join","p","pc","v","p","v","existsSync","readFileSync","join","pc","cwd","pkgPath","pkg","str","cwd","spinner","join","writeFileSync","mkdirSync","pc","p","pc","cwd","pc","spinner","existsSync","join","resolve","p","pc","cwd","resolve","existsSync","pc","confirm","join","readdirSync","readFileSync","join","resolve","cwd","resolve","task","readFileSync","readdirSync","join","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","dirname","join","fileURLToPath","require","pc","resolve","pc","v"]}