@cardor/agent-harness-kit 0.12.1 → 0.15.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 (133) hide show
  1. package/bin/ahk.js +1 -1
  2. package/dist/chunk-LQ7SDMK6.js +82 -0
  3. package/dist/chunk-LQ7SDMK6.js.map +1 -0
  4. package/dist/cli.js +1984 -109
  5. package/dist/cli.js.map +1 -1
  6. package/dist/dashboard-dist/assets/{index-Cdm4QZ8j.js → index-B_wwF3FX.js} +3 -3
  7. package/dist/dashboard-dist/assets/{index-TQMzdmXs.css → index-MNS3Gb-w.css} +1 -1
  8. package/dist/dashboard-dist/index.html +2 -2
  9. package/dist/index.js +6 -1
  10. package/dist/index.js.map +1 -1
  11. package/package.json +12 -5
  12. package/dist/cli.d.ts +0 -2
  13. package/dist/cli.d.ts.map +0 -1
  14. package/dist/commands/build.d.ts +0 -6
  15. package/dist/commands/build.d.ts.map +0 -1
  16. package/dist/commands/build.js +0 -39
  17. package/dist/commands/build.js.map +0 -1
  18. package/dist/commands/dashboard.d.ts +0 -7
  19. package/dist/commands/dashboard.d.ts.map +0 -1
  20. package/dist/commands/dashboard.js +0 -27
  21. package/dist/commands/dashboard.js.map +0 -1
  22. package/dist/commands/export.d.ts +0 -8
  23. package/dist/commands/export.d.ts.map +0 -1
  24. package/dist/commands/export.js +0 -33
  25. package/dist/commands/export.js.map +0 -1
  26. package/dist/commands/health.d.ts +0 -2
  27. package/dist/commands/health.d.ts.map +0 -1
  28. package/dist/commands/health.js +0 -78
  29. package/dist/commands/health.js.map +0 -1
  30. package/dist/commands/init-helpers.d.ts +0 -9
  31. package/dist/commands/init-helpers.d.ts.map +0 -1
  32. package/dist/commands/init-helpers.js +0 -40
  33. package/dist/commands/init-helpers.js.map +0 -1
  34. package/dist/commands/init.d.ts +0 -9
  35. package/dist/commands/init.d.ts.map +0 -1
  36. package/dist/commands/init.js +0 -192
  37. package/dist/commands/init.js.map +0 -1
  38. package/dist/commands/migrate.d.ts +0 -6
  39. package/dist/commands/migrate.d.ts.map +0 -1
  40. package/dist/commands/migrate.js +0 -45
  41. package/dist/commands/migrate.js.map +0 -1
  42. package/dist/commands/serve.d.ts +0 -6
  43. package/dist/commands/serve.d.ts.map +0 -1
  44. package/dist/commands/serve.js +0 -13
  45. package/dist/commands/serve.js.map +0 -1
  46. package/dist/commands/status.d.ts +0 -6
  47. package/dist/commands/status.d.ts.map +0 -1
  48. package/dist/commands/status.js +0 -71
  49. package/dist/commands/status.js.map +0 -1
  50. package/dist/commands/sync.d.ts +0 -7
  51. package/dist/commands/sync.d.ts.map +0 -1
  52. package/dist/commands/sync.js +0 -57
  53. package/dist/commands/sync.js.map +0 -1
  54. package/dist/commands/task/add.d.ts +0 -2
  55. package/dist/commands/task/add.d.ts.map +0 -1
  56. package/dist/commands/task/add.js +0 -53
  57. package/dist/commands/task/add.js.map +0 -1
  58. package/dist/commands/task/done.d.ts +0 -2
  59. package/dist/commands/task/done.d.ts.map +0 -1
  60. package/dist/commands/task/done.js +0 -45
  61. package/dist/commands/task/done.js.map +0 -1
  62. package/dist/commands/task/index.d.ts +0 -4
  63. package/dist/commands/task/index.d.ts.map +0 -1
  64. package/dist/commands/task/index.js +0 -4
  65. package/dist/commands/task/index.js.map +0 -1
  66. package/dist/commands/task/list.d.ts +0 -7
  67. package/dist/commands/task/list.d.ts.map +0 -1
  68. package/dist/commands/task/list.js +0 -42
  69. package/dist/commands/task/list.js.map +0 -1
  70. package/dist/core/config.d.ts +0 -5
  71. package/dist/core/config.d.ts.map +0 -1
  72. package/dist/core/config.js +0 -77
  73. package/dist/core/config.js.map +0 -1
  74. package/dist/core/dashboard-server.d.ts +0 -7
  75. package/dist/core/dashboard-server.d.ts.map +0 -1
  76. package/dist/core/dashboard-server.js +0 -211
  77. package/dist/core/dashboard-server.js.map +0 -1
  78. package/dist/core/db.d.ts +0 -57
  79. package/dist/core/db.d.ts.map +0 -1
  80. package/dist/core/db.js +0 -348
  81. package/dist/core/db.js.map +0 -1
  82. package/dist/core/materializer/agent-templates/test123.txt +0 -0
  83. package/dist/core/materializer/claude-code.d.ts +0 -8
  84. package/dist/core/materializer/claude-code.d.ts.map +0 -1
  85. package/dist/core/materializer/claude-code.js +0 -66
  86. package/dist/core/materializer/claude-code.js.map +0 -1
  87. package/dist/core/materializer/index.d.ts +0 -8
  88. package/dist/core/materializer/index.d.ts.map +0 -1
  89. package/dist/core/materializer/index.js +0 -13
  90. package/dist/core/materializer/index.js.map +0 -1
  91. package/dist/core/materializer/mcp-merge.d.ts +0 -3
  92. package/dist/core/materializer/mcp-merge.d.ts.map +0 -1
  93. package/dist/core/materializer/mcp-merge.js +0 -59
  94. package/dist/core/materializer/mcp-merge.js.map +0 -1
  95. package/dist/core/materializer/opencode.d.ts +0 -8
  96. package/dist/core/materializer/opencode.d.ts.map +0 -1
  97. package/dist/core/materializer/opencode.js +0 -59
  98. package/dist/core/materializer/opencode.js.map +0 -1
  99. package/dist/core/materializer/scaffold-utils.d.ts +0 -4
  100. package/dist/core/materializer/scaffold-utils.d.ts.map +0 -1
  101. package/dist/core/materializer/scaffold-utils.js +0 -28
  102. package/dist/core/materializer/scaffold-utils.js.map +0 -1
  103. package/dist/core/materializer/templates.d.ts +0 -33
  104. package/dist/core/materializer/templates.d.ts.map +0 -1
  105. package/dist/core/materializer/templates.js +0 -187
  106. package/dist/core/materializer/templates.js.map +0 -1
  107. package/dist/core/mcp-server.d.ts +0 -3
  108. package/dist/core/mcp-server.d.ts.map +0 -1
  109. package/dist/core/mcp-server.js +0 -264
  110. package/dist/core/mcp-server.js.map +0 -1
  111. package/dist/core/sqlite-adapter.d.ts +0 -14
  112. package/dist/core/sqlite-adapter.d.ts.map +0 -1
  113. package/dist/core/sqlite-adapter.js +0 -20
  114. package/dist/core/sqlite-adapter.js.map +0 -1
  115. package/dist/dashboard-dist/assets/index-DJInh0UZ.js +0 -9
  116. package/dist/index.d.ts +0 -3
  117. package/dist/index.d.ts.map +0 -1
  118. package/dist/tests/db.test.d.ts +0 -2
  119. package/dist/tests/db.test.d.ts.map +0 -1
  120. package/dist/tests/db.test.js +0 -106
  121. package/dist/tests/db.test.js.map +0 -1
  122. package/dist/tests/slugify.test.d.ts +0 -2
  123. package/dist/tests/slugify.test.d.ts.map +0 -1
  124. package/dist/tests/slugify.test.js +0 -19
  125. package/dist/tests/slugify.test.js.map +0 -1
  126. package/dist/tests/templates.test.d.ts +0 -2
  127. package/dist/tests/templates.test.d.ts.map +0 -1
  128. package/dist/tests/templates.test.js +0 -71
  129. package/dist/tests/templates.test.js.map +0 -1
  130. package/dist/types.d.ts +0 -141
  131. package/dist/types.d.ts.map +0 -1
  132. package/dist/types.js +0 -3
  133. package/dist/types.js.map +0 -1
@@ -1,4 +0,0 @@
1
- export declare function writeAgentFile(cwd: string, relPath: string, content: string): void;
2
- export declare function appendGitignore(cwd: string): void;
3
- export declare function slugify(title: string): string;
4
- //# sourceMappingURL=scaffold-utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scaffold-utils.d.ts","sourceRoot":"","sources":["../../../src/core/materializer/scaffold-utils.ts"],"names":[],"mappings":"AAIA,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAKlF;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAWjD;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAM7C"}
@@ -1,28 +0,0 @@
1
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
- import { join, resolve } from 'node:path';
3
- import { GITIGNORE_ENTRIES } from './templates.js';
4
- export function writeAgentFile(cwd, relPath, content) {
5
- const abs = join(cwd, relPath);
6
- if (existsSync(abs))
7
- return; // preserve dev customizations
8
- mkdirSync(resolve(abs, '..'), { recursive: true });
9
- writeFileSync(abs, content, 'utf8');
10
- }
11
- export function appendGitignore(cwd) {
12
- const giPath = join(cwd, '.gitignore');
13
- const existing = existsSync(giPath) ? readFileSync(giPath, 'utf8') : '';
14
- const toAdd = GITIGNORE_ENTRIES.split('\n')
15
- .filter((line) => line && !existing.includes(line))
16
- .join('\n');
17
- if (toAdd.trim()) {
18
- writeFileSync(giPath, existing + (existing.endsWith('\n') ? '' : '\n') + toAdd + '\n', 'utf8');
19
- }
20
- }
21
- export function slugify(title) {
22
- return title
23
- .toLowerCase()
24
- .replace(/[^a-z0-9]+/g, '-')
25
- .replace(/^-+|-+$/g, '')
26
- .slice(0, 64);
27
- }
28
- //# sourceMappingURL=scaffold-utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scaffold-utils.js","sourceRoot":"","sources":["../../../src/core/materializer/scaffold-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC5E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAElD,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,OAAe,EAAE,OAAe;IAC1E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IAC9B,IAAI,UAAU,CAAC,GAAG,CAAC;QAAE,OAAM,CAAE,8BAA8B;IAC3D,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAClD,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;AACrC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAA;IACtC,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAEvE,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC;SACxC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;SAClD,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QACjB,aAAa,CAAC,MAAM,EAAE,QAAQ,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,EAAE,MAAM,CAAC,CAAA;IAChG,CAAC;AACH,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,OAAO,KAAK;SACT,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AACjB,CAAC"}
@@ -1,33 +0,0 @@
1
- import type { HarnessConfig } from '../../types.js';
2
- export declare const HEALTH_SH = "#!/usr/bin/env bash\n# health.sh \u2014 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";
3
- export declare function agentsMd(config: HarnessConfig): string;
4
- export declare function configTs(params: {
5
- name: string;
6
- description: string;
7
- provider: string;
8
- docsPath: string;
9
- tasksAdapter: string;
10
- port: number;
11
- }): string;
12
- export declare function agentLead(vars: {
13
- projectName: string;
14
- }): string;
15
- export declare function agentExplorer(vars: {
16
- projectName: string;
17
- allowedPaths: string;
18
- }): string;
19
- export declare function agentBuilder(vars: {
20
- projectName: string;
21
- writablePaths: string;
22
- }): string;
23
- export declare function agentReviewer(vars: {
24
- projectName: string;
25
- }): string;
26
- export declare function featureListJson(tasks: {
27
- slug: string;
28
- title: string;
29
- description?: string;
30
- acceptance?: string[];
31
- }[]): string;
32
- export declare 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";
33
- //# sourceMappingURL=templates.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../../src/core/materializer/templates.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAqBnD,eAAO,MAAM,SAAS,uoBAmBrB,CAAA;AAID,wBAAgB,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CA8EtD;AAID,wBAAgB,QAAQ,CAAC,MAAM,EAAE;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;CACb,GAAG,MAAM,CA6CT;AAID,wBAAgB,SAAS,CAAC,IAAI,EAAE;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAE/D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAEzF;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAEzF;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAEnE;AAID,wBAAgB,eAAe,CAC7B,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,EAAE,GACpF,MAAM,CAER;AAID,eAAO,MAAM,iBAAiB,wHAM7B,CAAA"}
@@ -1,187 +0,0 @@
1
- import { readFileSync } from 'node:fs';
2
- import { join, dirname } from 'node:path';
3
- import { fileURLToPath } from 'node:url';
4
- // ─── Agent template loader ────────────────────────────────────────────────────
5
- const __dirname = dirname(fileURLToPath(import.meta.url));
6
- const TEMPLATES_DIR = join(__dirname, 'agent-templates');
7
- /**
8
- * Load an agent template file and interpolate {{variables}}.
9
- * Variables are replaced using a simple {{key}} pattern.
10
- */
11
- function loadAgentTemplate(name, vars = {}) {
12
- const raw = readFileSync(join(TEMPLATES_DIR, `${name}.md`), 'utf8');
13
- return raw.replace(/\{\{(\w+)\}\}/g, (_, key) => vars[key] ?? `{{${key}}}`);
14
- }
15
- // ─── health.sh — exits 1 until the dev implements it ─────────────────────────
16
- export const HEALTH_SH = `#!/usr/bin/env bash
17
- # health.sh — project health check for agent-harness-kit
18
- #
19
- # This script must exit 0 when the project is healthy.
20
- # Agents will run this before starting work.
21
- #
22
- # TODO: implement your project's health checks below.
23
- # Examples:
24
- # npm test
25
- # docker compose ps | grep -q "running"
26
- # psql -c "SELECT 1" > /dev/null 2>&1
27
- #
28
- # Until you implement it, this script intentionally exits 1
29
- # so agents know the environment is not verified.
30
-
31
- echo "health.sh not implemented yet."
32
- echo "Edit this file with your project's health checks."
33
- echo "It must exit 0 for agents to start working."
34
- exit 1
35
- `;
36
- // ─── AGENTS.md template ───────────────────────────────────────────────────────
37
- export function agentsMd(config) {
38
- const { name, description, docsPath } = config.project;
39
- const port = config.tools.mcp.port;
40
- return `# AGENTS.md — ${name}
41
-
42
- > **Read this file first.** It is the navigation map for every AI agent working in this repository.
43
-
44
- ## Project
45
-
46
- **${name}** — ${description}
47
-
48
- ## Health check (run before starting)
49
-
50
- \`\`\`bash
51
- bash health.sh
52
- \`\`\`
53
-
54
- If it exits non-zero, stop and report the issue. Do not proceed with tasks until health is green.
55
-
56
- ## Harness data (source of truth)
57
-
58
- | File | Purpose |
59
- |------|---------|
60
- | \`.harness/harness.db\` | SQLite: all tasks, actions, file changes, tool calls |
61
- | \`.harness/current.md\` | Markdown fallback — read this if MCP server is unavailable |
62
- | \`.harness/feature_list.json\` | Human-editable task seed list |
63
-
64
- ## MCP tools (preferred)
65
-
66
- The harness exposes tools via MCP server on port ${port}. Use these instead of reading files directly.
67
-
68
- \`\`\`
69
- actions.start taskId agent → start an action, returns actionId
70
- actions.write actionId section text → record a section (result, tools_used, ...)
71
- actions.complete actionId summary → close the action
72
- actions.get taskId → full action history for a task
73
- tasks.get [status] → list tasks (pending | in_progress | done | blocked)
74
- tasks.claim id → atomically claim a pending task
75
- tasks.update id status → change task status
76
- docs.search query → search ${docsPath} for relevant content
77
- \`\`\`
78
-
79
- ## Workflow
80
-
81
- \`\`\`
82
- 1. INIT
83
- - Run health.sh → exit 1 means stop
84
- - tasks.get('in_progress') → resume if something is in progress
85
- - tasks.get('pending') → pick lowest id
86
-
87
- 2. WORK (lead → explorer → builder → reviewer)
88
- - Each agent calls actions.start(taskId, agentName) → actionId
89
- - Records work with actions.write(actionId, section, content)
90
- - Closes with actions.complete(actionId, summary)
91
-
92
- 3. CLOSE
93
- - tasks.update(taskId, 'done')
94
- - Run health.sh → must be green before closing
95
- \`\`\`
96
-
97
- ## Agent roles
98
-
99
- | Agent | Responsibility |
100
- |-------|---------------|
101
- | lead | Decomposes the task into a plan, assigns sub-agents |
102
- | explorer | Reads and maps relevant code, never writes |
103
- | builder | Implements the plan, writes files |
104
- | reviewer | Verifies acceptance criteria, approves or blocks |
105
-
106
- ## What to read
107
-
108
- \`\`\`
109
- Always: .harness/current.md (or MCP tasks.get)
110
- If implementing: ${docsPath}/
111
- If orchestrating: Agent definition files in your provider's agents directory
112
- \`\`\`
113
- `;
114
- }
115
- // ─── agent-harness-kit.config.ts template ───────────────────────────────────────────
116
- export function configTs(params) {
117
- return `import { defineHarness } from '@cardor/agent-harness-kit'
118
-
119
- export default defineHarness({
120
- project: {
121
- name: '${params.name}',
122
- description: '${params.description}',
123
- docsPath: '${params.docsPath}',
124
- },
125
-
126
- provider: '${params.provider}',
127
-
128
- agents: {
129
- lead: { instructionsPath: null },
130
- explorer: { instructionsPath: null, allowedPaths: ['${params.docsPath}', './src'] },
131
- builder: { instructionsPath: null, writablePaths: ['./src', './tests'] },
132
- reviewer: { instructionsPath: null },
133
- custom: [],
134
- },
135
-
136
- storage: {
137
- dir: '.harness',
138
- dbPath: '.harness/harness.db',
139
- tasks: { adapter: '${params.tasksAdapter}' },
140
- sections: {
141
- toolsUsed: true,
142
- filesModified: true,
143
- result: true,
144
- blockers: true,
145
- nextSteps: false,
146
- },
147
- markdownFallback: { enabled: true, path: '.harness/current.md' },
148
- },
149
-
150
- health: {
151
- scriptPath: './health.sh',
152
- required: true,
153
- },
154
-
155
- tools: {
156
- mcp: { enabled: true, port: ${params.port} },
157
- scripts: { enabled: true, outputDir: './.harness/scripts' },
158
- },
159
- })
160
- `;
161
- }
162
- // ─── Agent definition templates (loaded from agent-templates/*.md) ─────────────
163
- export function agentLead(vars) {
164
- return loadAgentTemplate('lead', vars);
165
- }
166
- export function agentExplorer(vars) {
167
- return loadAgentTemplate('explorer', vars);
168
- }
169
- export function agentBuilder(vars) {
170
- return loadAgentTemplate('builder', vars);
171
- }
172
- export function agentReviewer(vars) {
173
- return loadAgentTemplate('reviewer', vars);
174
- }
175
- // ─── feature_list.json initial seed ──────────────────────────────────────────
176
- export function featureListJson(tasks) {
177
- return JSON.stringify(tasks, null, 2) + '\n';
178
- }
179
- // ─── .gitignore additions ─────────────────────────────────────────────────────
180
- export const GITIGNORE_ENTRIES = `
181
- # agent-harness-kit
182
- .harness/harness.db
183
- .harness/harness.db-shm
184
- .harness/harness.db-wal
185
- .harness/current.md
186
- `;
187
- //# sourceMappingURL=templates.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/core/materializer/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAGxC,iFAAiF;AAEjF,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AACzD,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAA;AAExD;;;GAGG;AACH,SAAS,iBAAiB,CACxB,IAAkD,EAClD,OAA+B,EAAE;IAEjC,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,KAAK,CAAC,EAAE,MAAM,CAAC,CAAA;IACnE,OAAO,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,GAAW,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,CAAA;AACrF,CAAC;AAED,gFAAgF;AAEhF,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;CAmBxB,CAAA;AAED,iFAAiF;AAEjF,MAAM,UAAU,QAAQ,CAAC,MAAqB;IAC5C,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,OAAO,CAAA;IACtD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAA;IAElC,OAAO,iBAAiB,IAAI;;;;;;IAM1B,IAAI,QAAQ,WAAW;;;;;;;;;;;;;;;;;;;;mDAoBwB,IAAI;;;;;;;;;;mDAUJ,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAkCxC,QAAQ;;;CAG1B,CAAA;AACD,CAAC;AAED,uFAAuF;AAEvF,MAAM,UAAU,QAAQ,CAAC,MAOxB;IACC,OAAO;;;;aAII,MAAM,CAAC,IAAI;oBACJ,MAAM,CAAC,WAAW;iBACrB,MAAM,CAAC,QAAQ;;;eAGjB,MAAM,CAAC,QAAQ;;;;0DAI4B,MAAM,CAAC,QAAQ;;;;;;;;;0BAS/C,MAAM,CAAC,YAAY;;;;;;;;;;;;;;;;;sCAiBP,MAAM,CAAC,IAAI;;;;CAIhD,CAAA;AACD,CAAC;AAED,kFAAkF;AAElF,MAAM,UAAU,SAAS,CAAC,IAA6B;IACrD,OAAO,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;AACxC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAmD;IAC/E,OAAO,iBAAiB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;AAC5C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAoD;IAC/E,OAAO,iBAAiB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;AAC3C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAA6B;IACzD,OAAO,iBAAiB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;AAC5C,CAAC;AAED,gFAAgF;AAEhF,MAAM,UAAU,eAAe,CAC7B,KAAqF;IAErF,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAA;AAC9C,CAAC;AAED,iFAAiF;AAEjF,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;CAMhC,CAAA"}
@@ -1,3 +0,0 @@
1
- import type { HarnessConfig } from '../types.js';
2
- export declare function startMcpServer(config: HarnessConfig, cwd: string): Promise<void>;
3
- //# sourceMappingURL=mcp-server.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/core/mcp-server.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAa,MAAM,aAAa,CAAA;AAwH3D,wBAAsB,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBtF"}
@@ -1,264 +0,0 @@
1
- import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
- import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
- import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
4
- import { readdirSync, readFileSync, statSync } from 'node:fs';
5
- import { join, resolve } from 'node:path';
6
- import { openDB } from './db.js';
7
- const VERSION = '0.1.0';
8
- // ─── Tool schemas ─────────────────────────────────────────────────────────────
9
- const TOOLS = [
10
- {
11
- name: 'actions.start',
12
- description: 'Start a new action for a task. Returns an actionId (UUID).',
13
- inputSchema: {
14
- type: 'object',
15
- properties: {
16
- taskId: { type: 'number', description: 'The task ID from tasks.get' },
17
- agent: {
18
- type: 'string',
19
- description: 'Agent name: lead | explorer | builder | reviewer | custom:<name>',
20
- },
21
- },
22
- required: ['taskId', 'agent'],
23
- },
24
- },
25
- {
26
- name: 'actions.write',
27
- description: 'Record a section in an action. Standard sections: result, tools_used, files_modified, blockers, next_steps.',
28
- inputSchema: {
29
- type: 'object',
30
- properties: {
31
- actionId: { type: 'string', description: 'UUID returned by actions.start' },
32
- sectionType: {
33
- type: 'string',
34
- description: 'Section name: result | tools_used | files_modified | blockers | next_steps | <custom>',
35
- },
36
- content: { type: 'string', description: 'Content for this section' },
37
- },
38
- required: ['actionId', 'sectionType', 'content'],
39
- },
40
- },
41
- {
42
- name: 'actions.complete',
43
- description: 'Close an action with a one-line summary.',
44
- inputSchema: {
45
- type: 'object',
46
- properties: {
47
- actionId: { type: 'string', description: 'UUID of the action to close' },
48
- summary: { type: 'string', description: 'One-line summary of what was done' },
49
- },
50
- required: ['actionId', 'summary'],
51
- },
52
- },
53
- {
54
- name: 'actions.get',
55
- description: 'Get the full action history for a task (all agents, all sections).',
56
- inputSchema: {
57
- type: 'object',
58
- properties: {
59
- taskId: { type: 'number', description: 'Task ID' },
60
- },
61
- required: ['taskId'],
62
- },
63
- },
64
- {
65
- name: 'tasks.get',
66
- description: 'List tasks, optionally filtered by status.',
67
- inputSchema: {
68
- type: 'object',
69
- properties: {
70
- status: {
71
- type: 'string',
72
- enum: ['pending', 'in_progress', 'done', 'blocked'],
73
- description: 'Filter by status (omit for all tasks)',
74
- },
75
- },
76
- },
77
- },
78
- {
79
- name: 'tasks.claim',
80
- description: 'Atomically claim a pending task. Returns task_already_claimed if another agent got it first.',
81
- inputSchema: {
82
- type: 'object',
83
- properties: {
84
- id: { type: 'number', description: 'Task ID to claim' },
85
- agent: { type: 'string', description: 'Your agent name' },
86
- },
87
- required: ['id', 'agent'],
88
- },
89
- },
90
- {
91
- name: 'tasks.update',
92
- description: 'Change the status of a task.',
93
- inputSchema: {
94
- type: 'object',
95
- properties: {
96
- id: { type: 'number', description: 'Task ID' },
97
- status: {
98
- type: 'string',
99
- enum: ['pending', 'in_progress', 'done', 'blocked'],
100
- },
101
- },
102
- required: ['id', 'status'],
103
- },
104
- },
105
- {
106
- name: 'docs.search',
107
- description: 'Search the project docs folder for content matching a query.',
108
- inputSchema: {
109
- type: 'object',
110
- properties: {
111
- query: { type: 'string', description: 'Search terms' },
112
- },
113
- required: ['query'],
114
- },
115
- },
116
- ];
117
- // ─── Server ───────────────────────────────────────────────────────────────────
118
- export async function startMcpServer(config, cwd) {
119
- const db = openDB(config, cwd);
120
- const docsPath = resolve(cwd, config.project.docsPath);
121
- const server = new Server({ name: 'agent-harness-kit', version: VERSION }, { capabilities: { tools: {} } });
122
- server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));
123
- server.setRequestHandler(CallToolRequestSchema, async (request) => {
124
- const { name, arguments: args } = request.params;
125
- const a = (args ?? {});
126
- try {
127
- const result = await dispatch(name, a, db, docsPath);
128
- return result;
129
- }
130
- catch (err) {
131
- return ok(`Error: ${err instanceof Error ? err.message : String(err)}`, true);
132
- }
133
- });
134
- const transport = new StdioServerTransport();
135
- await server.connect(transport);
136
- }
137
- // ─── Dispatch ─────────────────────────────────────────────────────────────────
138
- async function dispatch(name, args, db, docsPath) {
139
- switch (name) {
140
- case 'actions.start': {
141
- const taskId = num(args, 'taskId');
142
- const agent = str(args, 'agent');
143
- const action = db.startAction(taskId, agent);
144
- return ok(JSON.stringify({ actionId: action.id, taskId, agent, status: 'in_progress' }));
145
- }
146
- case 'actions.write': {
147
- const actionId = str(args, 'actionId');
148
- const sectionType = str(args, 'sectionType');
149
- const content = str(args, 'content');
150
- db.writeSection(actionId, sectionType, content);
151
- return ok(JSON.stringify({ actionId, sectionType, recorded: true }));
152
- }
153
- case 'actions.complete': {
154
- const actionId = str(args, 'actionId');
155
- const summary = str(args, 'summary');
156
- const action = db.completeAction(actionId, summary);
157
- return ok(JSON.stringify({ actionId, status: action.status, completedAt: action.completed_at }));
158
- }
159
- case 'actions.get': {
160
- const taskId = num(args, 'taskId');
161
- const actions = db.getActionsForTask(taskId);
162
- const full = actions.map((a) => ({
163
- ...a,
164
- sections: db.getActionSections(a.id),
165
- }));
166
- return ok(JSON.stringify(full, null, 2));
167
- }
168
- case 'tasks.get': {
169
- const status = args['status'];
170
- const tasks = status
171
- ? db.getTasks(status)
172
- : db.getTasks();
173
- return ok(JSON.stringify(tasks, null, 2));
174
- }
175
- case 'tasks.claim': {
176
- const id = num(args, 'id');
177
- const agent = str(args, 'agent');
178
- const task = db.claimTask(id, agent);
179
- if (!task) {
180
- return ok(JSON.stringify({ error: 'task_already_claimed', taskId: id }));
181
- }
182
- return ok(JSON.stringify(task));
183
- }
184
- case 'tasks.update': {
185
- const id = num(args, 'id');
186
- const status = str(args, 'status');
187
- const task = db.updateTaskStatus(id, status);
188
- return ok(JSON.stringify(task));
189
- }
190
- case 'docs.search': {
191
- const query = str(args, 'query');
192
- const results = searchDocs(docsPath, query);
193
- return ok(JSON.stringify(results, null, 2));
194
- }
195
- default:
196
- return ok(`Unknown tool: ${name}`, true);
197
- }
198
- }
199
- function searchDocs(docsPath, query, maxResults = 10) {
200
- const terms = query.toLowerCase().split(/\s+/).filter(Boolean);
201
- const results = [];
202
- try {
203
- const files = collectMarkdownFiles(docsPath);
204
- for (const file of files) {
205
- if (results.length >= maxResults)
206
- break;
207
- try {
208
- const content = readFileSync(file, 'utf8');
209
- const lines = content.split('\n');
210
- for (let i = 0; i < lines.length; i++) {
211
- const lower = lines[i].toLowerCase();
212
- if (terms.every((t) => lower.includes(t))) {
213
- results.push({ file: file.replace(docsPath + '/', ''), line: i + 1, text: lines[i].trim() });
214
- if (results.length >= maxResults)
215
- break;
216
- }
217
- }
218
- }
219
- catch {
220
- // skip unreadable files
221
- }
222
- }
223
- }
224
- catch {
225
- return [{ file: '', line: 0, text: `docs path not found: ${docsPath}` }];
226
- }
227
- return results;
228
- }
229
- function collectMarkdownFiles(dir) {
230
- const files = [];
231
- try {
232
- for (const entry of readdirSync(dir)) {
233
- const full = join(dir, entry);
234
- const stat = statSync(full);
235
- if (stat.isDirectory()) {
236
- files.push(...collectMarkdownFiles(full));
237
- }
238
- else if (entry.endsWith('.md') || entry.endsWith('.txt')) {
239
- files.push(full);
240
- }
241
- }
242
- }
243
- catch {
244
- // directory may not exist yet
245
- }
246
- return files;
247
- }
248
- // ─── Helpers ──────────────────────────────────────────────────────────────────
249
- function ok(text, isError = false) {
250
- return { content: [{ type: 'text', text }], isError };
251
- }
252
- function str(args, key) {
253
- const v = args[key];
254
- if (typeof v !== 'string')
255
- throw new Error(`${key} must be a string`);
256
- return v;
257
- }
258
- function num(args, key) {
259
- const v = args[key];
260
- if (typeof v !== 'number')
261
- throw new Error(`${key} must be a number`);
262
- return v;
263
- }
264
- //# sourceMappingURL=mcp-server.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../src/core/mcp-server.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- export type SQLRow = Record<string, unknown>;
2
- export interface SQLStatement {
3
- run(...args: unknown[]): unknown;
4
- get(...args: unknown[]): SQLRow | undefined;
5
- all(...args: unknown[]): SQLRow[];
6
- }
7
- export interface SQLiteDB {
8
- exec(sql: string): void;
9
- prepare(sql: string): SQLStatement;
10
- close(): void;
11
- }
12
- export declare function openSQLite(path: string): SQLiteDB;
13
- export declare function lastInsertId(db: SQLiteDB): number;
14
- //# sourceMappingURL=sqlite-adapter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sqlite-adapter.d.ts","sourceRoot":"","sources":["../../src/core/sqlite-adapter.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAE5C,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;IAChC,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,GAAG,SAAS,CAAA;IAC3C,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAAA;CAClC;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAA;IAClC,KAAK,IAAI,IAAI,CAAA;CACd;AAID,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAYjD;AAMD,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CAGjD"}
@@ -1,20 +0,0 @@
1
- import { createRequire } from 'node:module';
2
- const _require = createRequire(import.meta.url);
3
- const isBun = 'bun' in process.versions;
4
- // ─── Factory ─────────────────────────────────────────────────────────────────
5
- export function openSQLite(path) {
6
- if (isBun) {
7
- const { Database } = _require('bun:sqlite');
8
- return new Database(path);
9
- }
10
- const { DatabaseSync } = _require('node:sqlite');
11
- return new DatabaseSync(path);
12
- }
13
- // ─── last_insert_rowid() helper ───────────────────────────────────────────────
14
- // Both bun:sqlite and node:sqlite have different return types for stmt.run().
15
- // Reading last_insert_rowid() directly avoids the inconsistency.
16
- export function lastInsertId(db) {
17
- const row = db.prepare('SELECT last_insert_rowid() AS id').get();
18
- return row.id;
19
- }
20
- //# sourceMappingURL=sqlite-adapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sqlite-adapter.js","sourceRoot":"","sources":["../../src/core/sqlite-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC/C,MAAM,KAAK,GAAG,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAA;AAmBvC,gFAAgF;AAEhF,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC,YAAY,CAEzC,CAAA;QACD,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAwB,CAAA;IAClD,CAAC;IAED,MAAM,EAAE,YAAY,EAAE,GAAG,QAAQ,CAAC,aAAa,CAE9C,CAAA;IACD,OAAO,IAAI,YAAY,CAAC,IAAI,CAAwB,CAAA;AACtD,CAAC;AAED,iFAAiF;AACjF,8EAA8E;AAC9E,iEAAiE;AAEjE,MAAM,UAAU,YAAY,CAAC,EAAY;IACvC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC,GAAG,EAAoB,CAAA;IAClF,OAAO,GAAG,CAAC,EAAE,CAAA;AACf,CAAC"}