@cardor/agent-harness-kit 0.1.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.
Files changed (111) hide show
  1. package/README.md +218 -0
  2. package/bin/ahk.js +2 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +113 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/build.d.ts +6 -0
  8. package/dist/commands/build.d.ts.map +1 -0
  9. package/dist/commands/build.js +39 -0
  10. package/dist/commands/build.js.map +1 -0
  11. package/dist/commands/export.d.ts +8 -0
  12. package/dist/commands/export.d.ts.map +1 -0
  13. package/dist/commands/export.js +33 -0
  14. package/dist/commands/export.js.map +1 -0
  15. package/dist/commands/health.d.ts +2 -0
  16. package/dist/commands/health.d.ts.map +1 -0
  17. package/dist/commands/health.js +38 -0
  18. package/dist/commands/health.js.map +1 -0
  19. package/dist/commands/init-helpers.d.ts +9 -0
  20. package/dist/commands/init-helpers.d.ts.map +1 -0
  21. package/dist/commands/init-helpers.js +40 -0
  22. package/dist/commands/init-helpers.js.map +1 -0
  23. package/dist/commands/init.d.ts +9 -0
  24. package/dist/commands/init.d.ts.map +1 -0
  25. package/dist/commands/init.js +202 -0
  26. package/dist/commands/init.js.map +1 -0
  27. package/dist/commands/migrate.d.ts +6 -0
  28. package/dist/commands/migrate.d.ts.map +1 -0
  29. package/dist/commands/migrate.js +45 -0
  30. package/dist/commands/migrate.js.map +1 -0
  31. package/dist/commands/serve.d.ts +6 -0
  32. package/dist/commands/serve.d.ts.map +1 -0
  33. package/dist/commands/serve.js +13 -0
  34. package/dist/commands/serve.js.map +1 -0
  35. package/dist/commands/status.d.ts +6 -0
  36. package/dist/commands/status.d.ts.map +1 -0
  37. package/dist/commands/status.js +71 -0
  38. package/dist/commands/status.js.map +1 -0
  39. package/dist/commands/sync.d.ts +7 -0
  40. package/dist/commands/sync.d.ts.map +1 -0
  41. package/dist/commands/sync.js +57 -0
  42. package/dist/commands/sync.js.map +1 -0
  43. package/dist/commands/task/add.d.ts +2 -0
  44. package/dist/commands/task/add.d.ts.map +1 -0
  45. package/dist/commands/task/add.js +59 -0
  46. package/dist/commands/task/add.js.map +1 -0
  47. package/dist/commands/task/done.d.ts +2 -0
  48. package/dist/commands/task/done.d.ts.map +1 -0
  49. package/dist/commands/task/done.js +45 -0
  50. package/dist/commands/task/done.js.map +1 -0
  51. package/dist/commands/task/index.d.ts +4 -0
  52. package/dist/commands/task/index.d.ts.map +1 -0
  53. package/dist/commands/task/index.js +4 -0
  54. package/dist/commands/task/index.js.map +1 -0
  55. package/dist/commands/task/list.d.ts +7 -0
  56. package/dist/commands/task/list.d.ts.map +1 -0
  57. package/dist/commands/task/list.js +42 -0
  58. package/dist/commands/task/list.js.map +1 -0
  59. package/dist/core/config.d.ts +5 -0
  60. package/dist/core/config.d.ts.map +1 -0
  61. package/dist/core/config.js +77 -0
  62. package/dist/core/config.js.map +1 -0
  63. package/dist/core/db.d.ts +56 -0
  64. package/dist/core/db.d.ts.map +1 -0
  65. package/dist/core/db.js +344 -0
  66. package/dist/core/db.js.map +1 -0
  67. package/dist/core/materializer/claude-code.d.ts +8 -0
  68. package/dist/core/materializer/claude-code.d.ts.map +1 -0
  69. package/dist/core/materializer/claude-code.js +83 -0
  70. package/dist/core/materializer/claude-code.js.map +1 -0
  71. package/dist/core/materializer/index.d.ts +8 -0
  72. package/dist/core/materializer/index.d.ts.map +1 -0
  73. package/dist/core/materializer/index.js +13 -0
  74. package/dist/core/materializer/index.js.map +1 -0
  75. package/dist/core/materializer/opencode.d.ts +8 -0
  76. package/dist/core/materializer/opencode.d.ts.map +1 -0
  77. package/dist/core/materializer/opencode.js +76 -0
  78. package/dist/core/materializer/opencode.js.map +1 -0
  79. package/dist/core/materializer/templates.d.ts +25 -0
  80. package/dist/core/materializer/templates.d.ts.map +1 -0
  81. package/dist/core/materializer/templates.js +319 -0
  82. package/dist/core/materializer/templates.js.map +1 -0
  83. package/dist/core/mcp-server.d.ts +3 -0
  84. package/dist/core/mcp-server.d.ts.map +1 -0
  85. package/dist/core/mcp-server.js +264 -0
  86. package/dist/core/mcp-server.js.map +1 -0
  87. package/dist/core/sqlite-adapter.d.ts +14 -0
  88. package/dist/core/sqlite-adapter.d.ts.map +1 -0
  89. package/dist/core/sqlite-adapter.js +20 -0
  90. package/dist/core/sqlite-adapter.js.map +1 -0
  91. package/dist/index.d.ts +3 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +2 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/tests/db.test.d.ts +2 -0
  96. package/dist/tests/db.test.d.ts.map +1 -0
  97. package/dist/tests/db.test.js +106 -0
  98. package/dist/tests/db.test.js.map +1 -0
  99. package/dist/tests/slugify.test.d.ts +2 -0
  100. package/dist/tests/slugify.test.d.ts.map +1 -0
  101. package/dist/tests/slugify.test.js +26 -0
  102. package/dist/tests/slugify.test.js.map +1 -0
  103. package/dist/tests/templates.test.d.ts +2 -0
  104. package/dist/tests/templates.test.d.ts.map +1 -0
  105. package/dist/tests/templates.test.js +64 -0
  106. package/dist/tests/templates.test.js.map +1 -0
  107. package/dist/types.d.ts +141 -0
  108. package/dist/types.d.ts.map +1 -0
  109. package/dist/types.js +3 -0
  110. package/dist/types.js.map +1 -0
  111. package/package.json +56 -0
@@ -0,0 +1,7 @@
1
+ interface TaskListOptions {
2
+ status?: string;
3
+ json?: boolean;
4
+ }
5
+ export declare function runTaskList(cwd: string, opts: TaskListOptions): Promise<void>;
6
+ export {};
7
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/task/list.ts"],"names":[],"mappings":"AAMA,UAAU,eAAe;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AASD,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAqCnF"}
@@ -0,0 +1,42 @@
1
+ import Table from 'cli-table3';
2
+ import pc from 'picocolors';
3
+ import { loadConfig } from '../../core/config.js';
4
+ import { openDB } from '../../core/db.js';
5
+ const STATUS_COLOR = {
6
+ pending: (s) => pc.dim(s),
7
+ in_progress: (s) => pc.cyan(s),
8
+ done: (s) => pc.green(s),
9
+ blocked: (s) => pc.red(s),
10
+ };
11
+ export async function runTaskList(cwd, opts) {
12
+ const config = await loadConfig(cwd);
13
+ const db = openDB(config, cwd);
14
+ try {
15
+ const validStatuses = ['pending', 'in_progress', 'done', 'blocked'];
16
+ const filterStatus = opts.status && validStatuses.includes(opts.status)
17
+ ? opts.status
18
+ : undefined;
19
+ const tasks = filterStatus ? db.getTasks(filterStatus) : db.getTasks();
20
+ if (opts.json) {
21
+ console.log(JSON.stringify(tasks, null, 2));
22
+ return;
23
+ }
24
+ if (tasks.length === 0) {
25
+ console.log(pc.dim('No tasks' + (filterStatus ? ` with status: ${filterStatus}` : '') + '.'));
26
+ return;
27
+ }
28
+ const table = new Table({
29
+ head: ['ID', 'Slug', 'Title', 'Status'].map((h) => pc.bold(h)),
30
+ style: { head: [], border: [] },
31
+ });
32
+ for (const t of tasks) {
33
+ const colorFn = STATUS_COLOR[t.status] ?? ((s) => s);
34
+ table.push([String(t.id), t.slug, t.title.slice(0, 50), colorFn(t.status)]);
35
+ }
36
+ console.log(table.toString());
37
+ }
38
+ finally {
39
+ db.close();
40
+ }
41
+ }
42
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/task/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { HarnessConfig } from '../types.js';
2
+ export declare function findConfigFile(cwd: string): string | null;
3
+ export declare function loadConfig(cwd: string): Promise<HarnessConfig>;
4
+ export declare function defineHarness(config: HarnessConfig): HarnessConfig;
5
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAQhD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMzD;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAepE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CAElE"}
@@ -0,0 +1,77 @@
1
+ import { createJiti } from 'jiti';
2
+ import { existsSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ const CONFIG_NAMES = [
5
+ 'agent-harness-kit.config.ts',
6
+ 'agent-harness-kit.config.js',
7
+ 'agent-harness-kit.config.mjs',
8
+ ];
9
+ export function findConfigFile(cwd) {
10
+ for (const name of CONFIG_NAMES) {
11
+ const candidate = join(cwd, name);
12
+ if (existsSync(candidate))
13
+ return candidate;
14
+ }
15
+ return null;
16
+ }
17
+ export async function loadConfig(cwd) {
18
+ const configPath = findConfigFile(cwd);
19
+ if (!configPath) {
20
+ throw new Error('No agent-harness-kit.config found. Run: ahk init');
21
+ }
22
+ const jiti = createJiti(import.meta.url);
23
+ const mod = await jiti.import(configPath);
24
+ const config = mod.default ?? mod;
25
+ if (!config || typeof config !== 'object') {
26
+ throw new Error(`agent-harness-kit.config must export a default HarnessConfig object.`);
27
+ }
28
+ return applyDefaults(config);
29
+ }
30
+ export function defineHarness(config) {
31
+ return config;
32
+ }
33
+ function applyDefaults(config) {
34
+ const c = config;
35
+ return {
36
+ ...config,
37
+ provider: c.provider ?? 'claude-code',
38
+ project: {
39
+ docsPath: './docs',
40
+ agentsMd: './AGENTS.md',
41
+ ...c.project,
42
+ },
43
+ agents: {
44
+ lead: { instructionsPath: null },
45
+ explorer: { instructionsPath: null },
46
+ builder: { instructionsPath: null },
47
+ reviewer: { instructionsPath: null },
48
+ custom: [],
49
+ ...c.agents,
50
+ },
51
+ storage: {
52
+ dir: '.harness',
53
+ dbPath: '.harness/harness.db',
54
+ tasks: { adapter: 'local' },
55
+ sections: {
56
+ toolsUsed: true,
57
+ filesModified: true,
58
+ result: true,
59
+ blockers: true,
60
+ nextSteps: false,
61
+ },
62
+ markdownFallback: { enabled: true, path: '.harness/current.md' },
63
+ ...c.storage,
64
+ },
65
+ health: {
66
+ scriptPath: './health.sh',
67
+ required: true,
68
+ ...c.health,
69
+ },
70
+ tools: {
71
+ mcp: { enabled: true, port: 3742 },
72
+ scripts: { enabled: true, outputDir: './.harness/scripts' },
73
+ ...c.tools,
74
+ },
75
+ };
76
+ }
77
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import type { TaskRow, TaskAcceptanceRow, ActionRow, ActionSectionRow, ActionFileRow, TaskStatus, AgentName, HarnessConfig } from '../types.js';
2
+ export declare class HarnessDB {
3
+ private db;
4
+ private config;
5
+ constructor(dbPath: string, config: HarnessConfig);
6
+ addTask(params: {
7
+ slug: string;
8
+ title: string;
9
+ description?: string;
10
+ acceptance?: string[];
11
+ }): TaskRow;
12
+ getTasks(status?: TaskStatus): TaskRow[];
13
+ getTaskById(id: number): TaskRow | null;
14
+ getTaskBySlug(slug: string): TaskRow | null;
15
+ getTaskAcceptance(taskId: number): TaskAcceptanceRow[];
16
+ updateTaskStatus(idOrSlug: number | string, status: TaskStatus): TaskRow;
17
+ claimTask(id: number, agent: string): TaskRow | null;
18
+ startAction(taskId: number, agent: AgentName): ActionRow;
19
+ writeSection(actionId: string, sectionType: string, content: string): void;
20
+ completeAction(actionId: string, summary: string): ActionRow;
21
+ getAction(actionId: string): ActionRow | null;
22
+ getActionsForTask(taskId: number): ActionRow[];
23
+ getActionSections(actionId: string): ActionSectionRow[];
24
+ recordFile(actionId: string, filePath: string, operation: ActionFileRow['operation'], notes?: string): void;
25
+ recordTool(actionId: string, toolName: string, argsJson?: string, resultSummary?: string): void;
26
+ getFilesForTask(taskId: number): (ActionFileRow & {
27
+ agent: AgentName;
28
+ })[];
29
+ getTopTools(limit?: number): {
30
+ tool_name: string;
31
+ uses: number;
32
+ }[];
33
+ getStatusSummary(): {
34
+ status: string;
35
+ total: number;
36
+ }[];
37
+ regenerateCurrentMd(): void;
38
+ exportJson(): {
39
+ tasks: TaskRow[];
40
+ actions: ActionRow[];
41
+ sections: ActionSectionRow[];
42
+ };
43
+ close(): void;
44
+ syncFromFeatureList(tasks: {
45
+ slug: string;
46
+ title: string;
47
+ description?: string;
48
+ acceptance?: string[];
49
+ }[]): {
50
+ added: number;
51
+ skipped: number;
52
+ };
53
+ writeFeatureList(cwd: string): void;
54
+ }
55
+ export declare function openDB(config: HarnessConfig, cwd: string): HarnessDB;
56
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/core/db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,344 @@
1
+ import { mkdirSync, writeFileSync } from 'node:fs';
2
+ import { dirname, join, resolve } from 'node:path';
3
+ import { randomUUID } from 'node:crypto';
4
+ import { openSQLite, lastInsertId } from './sqlite-adapter.js';
5
+ // ─── Schema ───────────────────────────────────────────────────────────────────
6
+ const SCHEMA = `
7
+ CREATE TABLE IF NOT EXISTS tasks (
8
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
9
+ slug TEXT NOT NULL UNIQUE,
10
+ title TEXT NOT NULL,
11
+ description TEXT,
12
+ status TEXT NOT NULL DEFAULT 'pending'
13
+ CHECK(status IN ('pending','in_progress','done','blocked')),
14
+ assigned_to TEXT,
15
+ created_at TEXT NOT NULL,
16
+ started_at TEXT,
17
+ completed_at TEXT
18
+ );
19
+
20
+ CREATE TABLE IF NOT EXISTS task_acceptance (
21
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
22
+ task_id INTEGER NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
23
+ criterion TEXT NOT NULL,
24
+ met INTEGER NOT NULL DEFAULT 0
25
+ );
26
+
27
+ CREATE TABLE IF NOT EXISTS actions (
28
+ id TEXT PRIMARY KEY,
29
+ task_id INTEGER NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
30
+ agent TEXT NOT NULL
31
+ CHECK(agent IN ('lead','explorer','builder','reviewer') OR agent LIKE 'custom:%'),
32
+ status TEXT NOT NULL DEFAULT 'in_progress'
33
+ CHECK(status IN ('in_progress','completed','blocked')),
34
+ created_at TEXT NOT NULL,
35
+ completed_at TEXT,
36
+ summary TEXT
37
+ );
38
+
39
+ CREATE TABLE IF NOT EXISTS action_sections (
40
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
41
+ action_id TEXT NOT NULL REFERENCES actions(id) ON DELETE CASCADE,
42
+ section_type TEXT NOT NULL,
43
+ content TEXT NOT NULL,
44
+ created_at TEXT NOT NULL
45
+ );
46
+
47
+ CREATE TABLE IF NOT EXISTS action_files (
48
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
49
+ action_id TEXT NOT NULL REFERENCES actions(id) ON DELETE CASCADE,
50
+ file_path TEXT NOT NULL,
51
+ operation TEXT NOT NULL
52
+ CHECK(operation IN ('read','created','modified','deleted')),
53
+ notes TEXT
54
+ );
55
+
56
+ CREATE TABLE IF NOT EXISTS action_tools (
57
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
58
+ action_id TEXT NOT NULL REFERENCES actions(id) ON DELETE CASCADE,
59
+ tool_name TEXT NOT NULL,
60
+ args_json TEXT,
61
+ result_summary TEXT,
62
+ called_at TEXT NOT NULL
63
+ );
64
+
65
+ CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);
66
+ CREATE INDEX IF NOT EXISTS idx_actions_task_id ON actions(task_id);
67
+ CREATE INDEX IF NOT EXISTS idx_actions_agent ON actions(agent);
68
+ CREATE INDEX IF NOT EXISTS idx_actions_status ON actions(status);
69
+ CREATE INDEX IF NOT EXISTS idx_action_files_path ON action_files(file_path);
70
+ CREATE INDEX IF NOT EXISTS idx_action_tools_name ON action_tools(tool_name);
71
+ `;
72
+ // ─── DB class ─────────────────────────────────────────────────────────────────
73
+ export class HarnessDB {
74
+ db;
75
+ config;
76
+ constructor(dbPath, config) {
77
+ this.config = config;
78
+ const abs = resolve(dbPath);
79
+ mkdirSync(dirname(abs), { recursive: true });
80
+ this.db = openSQLite(abs);
81
+ this.db.exec(`PRAGMA journal_mode = WAL`);
82
+ this.db.exec(`PRAGMA foreign_keys = ON`);
83
+ this.db.exec(SCHEMA);
84
+ }
85
+ // ─── Tasks ────────────────────────────────────────────────────────────────
86
+ addTask(params) {
87
+ const now = new Date().toISOString();
88
+ this.db
89
+ .prepare(`INSERT INTO tasks (slug, title, description, status, created_at)
90
+ VALUES (@slug, @title, @description, 'pending', @created_at)`)
91
+ .run({
92
+ slug: params.slug,
93
+ title: params.title,
94
+ description: params.description ?? null,
95
+ created_at: now,
96
+ });
97
+ const taskId = lastInsertId(this.db);
98
+ if (params.acceptance?.length) {
99
+ const accStmt = this.db.prepare(`INSERT INTO task_acceptance (task_id, criterion) VALUES (?, ?)`);
100
+ for (const criterion of params.acceptance) {
101
+ accStmt.run(taskId, criterion);
102
+ }
103
+ }
104
+ this.regenerateCurrentMd();
105
+ return this.getTaskById(taskId);
106
+ }
107
+ getTasks(status) {
108
+ if (status) {
109
+ return this.db
110
+ .prepare(`SELECT * FROM tasks WHERE status = ? ORDER BY id`)
111
+ .all(status);
112
+ }
113
+ return this.db.prepare(`SELECT * FROM tasks ORDER BY id`).all();
114
+ }
115
+ getTaskById(id) {
116
+ return this.db.prepare(`SELECT * FROM tasks WHERE id = ?`).get(id) ?? null;
117
+ }
118
+ getTaskBySlug(slug) {
119
+ return this.db.prepare(`SELECT * FROM tasks WHERE slug = ?`).get(slug) ?? null;
120
+ }
121
+ getTaskAcceptance(taskId) {
122
+ return this.db
123
+ .prepare(`SELECT * FROM task_acceptance WHERE task_id = ?`)
124
+ .all(taskId);
125
+ }
126
+ updateTaskStatus(idOrSlug, status) {
127
+ const now = new Date().toISOString();
128
+ const task = typeof idOrSlug === 'number' ? this.getTaskById(idOrSlug) : this.getTaskBySlug(idOrSlug);
129
+ if (!task)
130
+ throw new Error(`Task not found: ${idOrSlug}`);
131
+ if (status === 'in_progress' && !task.started_at) {
132
+ this.db
133
+ .prepare(`UPDATE tasks SET status = ?, started_at = ? WHERE id = ?`)
134
+ .run(status, now, task.id);
135
+ }
136
+ else if (status === 'done') {
137
+ this.db
138
+ .prepare(`UPDATE tasks SET status = ?, completed_at = ? WHERE id = ?`)
139
+ .run(status, now, task.id);
140
+ }
141
+ else {
142
+ this.db.prepare(`UPDATE tasks SET status = ? WHERE id = ?`).run(status, task.id);
143
+ }
144
+ this.regenerateCurrentMd();
145
+ return this.getTaskById(task.id);
146
+ }
147
+ claimTask(id, agent) {
148
+ const now = new Date().toISOString();
149
+ this.db.exec('BEGIN IMMEDIATE');
150
+ try {
151
+ this.db
152
+ .prepare(`UPDATE tasks SET status = 'in_progress', assigned_to = ?, started_at = ?
153
+ WHERE id = ? AND status = 'pending'`)
154
+ .run(agent, now, id);
155
+ this.db.exec('COMMIT');
156
+ // Verify the claim succeeded by reading back — if status changed, we own it
157
+ const task = this.getTaskById(id);
158
+ if (!task || task.status !== 'in_progress' || task.assigned_to !== agent)
159
+ return null;
160
+ this.regenerateCurrentMd();
161
+ return task;
162
+ }
163
+ catch (err) {
164
+ this.db.exec('ROLLBACK');
165
+ throw err;
166
+ }
167
+ }
168
+ // ─── Actions ──────────────────────────────────────────────────────────────
169
+ startAction(taskId, agent) {
170
+ const now = new Date().toISOString();
171
+ const id = randomUUID();
172
+ this.db
173
+ .prepare(`INSERT INTO actions (id, task_id, agent, status, created_at)
174
+ VALUES (?, ?, ?, 'in_progress', ?)`)
175
+ .run(id, taskId, agent, now);
176
+ this.regenerateCurrentMd();
177
+ return this.getAction(id);
178
+ }
179
+ writeSection(actionId, sectionType, content) {
180
+ const now = new Date().toISOString();
181
+ this.db
182
+ .prepare(`INSERT INTO action_sections (action_id, section_type, content, created_at)
183
+ VALUES (?, ?, ?, ?)`)
184
+ .run(actionId, sectionType, content, now);
185
+ this.regenerateCurrentMd();
186
+ }
187
+ completeAction(actionId, summary) {
188
+ const now = new Date().toISOString();
189
+ this.db
190
+ .prepare(`UPDATE actions SET status = 'completed', completed_at = ?, summary = ?
191
+ WHERE id = ?`)
192
+ .run(now, summary, actionId);
193
+ this.regenerateCurrentMd();
194
+ return this.getAction(actionId);
195
+ }
196
+ getAction(actionId) {
197
+ return (this.db.prepare(`SELECT * FROM actions WHERE id = ?`).get(actionId) ?? null);
198
+ }
199
+ getActionsForTask(taskId) {
200
+ return this.db
201
+ .prepare(`SELECT * FROM actions WHERE task_id = ? ORDER BY created_at`)
202
+ .all(taskId);
203
+ }
204
+ getActionSections(actionId) {
205
+ return this.db
206
+ .prepare(`SELECT * FROM action_sections WHERE action_id = ? ORDER BY created_at`)
207
+ .all(actionId);
208
+ }
209
+ recordFile(actionId, filePath, operation, notes) {
210
+ this.db
211
+ .prepare(`INSERT INTO action_files (action_id, file_path, operation, notes)
212
+ VALUES (?, ?, ?, ?)`)
213
+ .run(actionId, filePath, operation, notes ?? null);
214
+ }
215
+ recordTool(actionId, toolName, argsJson, resultSummary) {
216
+ const now = new Date().toISOString();
217
+ this.db
218
+ .prepare(`INSERT INTO action_tools (action_id, tool_name, args_json, result_summary, called_at)
219
+ VALUES (?, ?, ?, ?, ?)`)
220
+ .run(actionId, toolName, argsJson ?? null, resultSummary ?? null, now);
221
+ }
222
+ getFilesForTask(taskId) {
223
+ return this.db
224
+ .prepare(`SELECT af.*, a.agent
225
+ FROM action_files af
226
+ JOIN actions a ON af.action_id = a.id
227
+ WHERE a.task_id = ?
228
+ ORDER BY a.agent, af.operation`)
229
+ .all(taskId);
230
+ }
231
+ getTopTools(limit = 10) {
232
+ return this.db
233
+ .prepare(`SELECT tool_name, COUNT(*) as uses
234
+ FROM action_tools
235
+ GROUP BY tool_name
236
+ ORDER BY uses DESC
237
+ LIMIT ?`)
238
+ .all(limit);
239
+ }
240
+ getStatusSummary() {
241
+ return this.db
242
+ .prepare(`SELECT status, COUNT(*) as total FROM tasks GROUP BY status`)
243
+ .all();
244
+ }
245
+ // ─── current.md fallback ──────────────────────────────────────────────────
246
+ regenerateCurrentMd() {
247
+ if (!this.config.storage.markdownFallback.enabled)
248
+ return;
249
+ const mdPath = resolve(this.config.storage.markdownFallback.path);
250
+ mkdirSync(dirname(mdPath), { recursive: true });
251
+ const inProgress = this.getTasks('in_progress');
252
+ const now = new Date().toISOString();
253
+ let md = `<!-- AUTO-GENERATED by agent-harness-kit — DO NOT EDIT MANUALLY -->\n`;
254
+ md += `<!-- Last updated: ${now} -->\n\n`;
255
+ md += `# Current Session\n\n`;
256
+ if (inProgress.length === 0) {
257
+ md += `## No tasks in progress\n\n`;
258
+ const pending = this.getTasks('pending');
259
+ if (pending.length > 0) {
260
+ md += `### Next pending tasks\n`;
261
+ for (const t of pending.slice(0, 5)) {
262
+ md += `- **#${t.id}** ${t.title} (\`${t.slug}\`)\n`;
263
+ }
264
+ }
265
+ }
266
+ else {
267
+ for (const task of inProgress) {
268
+ md += `## Active Task\n`;
269
+ md += `- **ID:** ${task.id}\n`;
270
+ md += `- **Slug:** ${task.slug}\n`;
271
+ md += `- **Status:** ${task.status}\n`;
272
+ md += `- **Started:** ${task.started_at ?? 'unknown'}\n\n`;
273
+ const actions = this.getActionsForTask(task.id);
274
+ if (actions.length > 0) {
275
+ md += `## Actions this session\n`;
276
+ md += `| Agent | Status | Summary | Started |\n`;
277
+ md += `|----------|-------------|----------------------------------|-------------|\n`;
278
+ for (const a of actions) {
279
+ const started = a.created_at.slice(11, 16);
280
+ const summary = (a.summary ?? '').slice(0, 34).padEnd(34);
281
+ md += `| ${a.agent.padEnd(8)} | ${a.status.padEnd(11)} | ${summary} | ${started} |\n`;
282
+ }
283
+ md += `\n`;
284
+ }
285
+ const acceptance = this.getTaskAcceptance(task.id);
286
+ if (acceptance.length > 0) {
287
+ md += `## Acceptance Criteria\n`;
288
+ for (const a of acceptance) {
289
+ md += `- [${a.met ? 'x' : ' '}] ${a.criterion}\n`;
290
+ }
291
+ md += `\n`;
292
+ }
293
+ }
294
+ }
295
+ writeFileSync(mdPath, md, 'utf8');
296
+ }
297
+ // ─── Export helpers ───────────────────────────────────────────────────────
298
+ exportJson() {
299
+ return {
300
+ tasks: this.getTasks(),
301
+ actions: this.db
302
+ .prepare(`SELECT * FROM actions ORDER BY created_at`)
303
+ .all(),
304
+ sections: this.db
305
+ .prepare(`SELECT * FROM action_sections ORDER BY created_at`)
306
+ .all(),
307
+ };
308
+ }
309
+ close() {
310
+ this.db.close();
311
+ }
312
+ // ─── feature_list.json sync ───────────────────────────────────────────────
313
+ syncFromFeatureList(tasks) {
314
+ let added = 0;
315
+ let skipped = 0;
316
+ for (const t of tasks) {
317
+ if (this.getTaskBySlug(t.slug)) {
318
+ skipped++;
319
+ continue;
320
+ }
321
+ this.addTask(t);
322
+ added++;
323
+ }
324
+ return { added, skipped };
325
+ }
326
+ writeFeatureList(cwd) {
327
+ const tasks = this.getTasks();
328
+ const list = tasks.map((t) => ({
329
+ slug: t.slug,
330
+ title: t.title,
331
+ description: t.description ?? undefined,
332
+ acceptance: this.getTaskAcceptance(t.id).map((a) => a.criterion),
333
+ status: t.status,
334
+ }));
335
+ const path = join(resolve(cwd), this.config.storage.dir, 'feature_list.json');
336
+ mkdirSync(dirname(path), { recursive: true });
337
+ writeFileSync(path, JSON.stringify(list, null, 2) + '\n', 'utf8');
338
+ }
339
+ }
340
+ export function openDB(config, cwd) {
341
+ const dbPath = join(resolve(cwd), config.storage.dbPath);
342
+ return new HarnessDB(dbPath, config);
343
+ }
344
+ //# sourceMappingURL=db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/core/db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { HarnessConfig, Provider, ScaffoldOptions } from '../../types.js';
2
+ import type { Materializer } from './index.js';
3
+ export declare class ClaudeCodeMaterializer implements Materializer {
4
+ scaffold(config: HarnessConfig, opts: ScaffoldOptions): Promise<void>;
5
+ build(config: HarnessConfig, cwd: string): Promise<void>;
6
+ migrate(config: HarnessConfig, _to: Provider, _cwd: string): Promise<void>;
7
+ }
8
+ //# sourceMappingURL=claude-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../../src/core/materializer/claude-code.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAa9C,qBAAa,sBAAuB,YAAW,YAAY;IACnD,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IA4CrE,KAAK,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBxD,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAIjF"}