@lannguyensi/harness 0.9.0 → 0.10.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.
@@ -1,4 +1,4 @@
1
1
  export declare const MINIMAL_TEMPLATE = "# ~/.claude/harness.yaml\n#\n# Bootstrapped by `harness init --template minimal`.\n#\n# This is the empty-but-valid manifest. Run `harness validate` to confirm it\n# parses, then add entries under the five top-level keys:\n#\n# grounding: evidence-ledger + claim-gate config (see docs/ARCHITECTURE.md \u00A72)\n# tools: mcp / cli / skills / builtin inventory (\u00A73)\n# memory: directories, retention, scopes (\u00A74)\n# hooks: event-bound shell commands (\u00A75)\n# policies: named rules that bind hooks to triggers (\u00A76)\n#\n# Phase 2 verbs to add entries safely: `harness add mcp <name> ...`,\n# `harness add cli`, `harness add hook`, `harness add skill`.\n# Per-machine overrides live at ~/.claude/machines/<discriminator>.harness.overrides.yaml\n# (ARCHITECTURE.md \u00A78) for paths that vary per host.\n#\n# Docs: https://github.com/LanNguyenSi/harness\n\nversion: 1\n";
2
- export declare const FULL_TEMPLATE = "# ~/.claude/harness.yaml\n#\n# Bootstrapped by `harness init --template full`. Mirrors the example manifest\n# from docs/ARCHITECTURE.md Appendix A. Paths under `command:` reference the\n# developer machine that authored Appendix A \u2014 adapt them to your host (or\n# move host-specific paths to ~/.claude/machines/<hostname>.harness.overrides.yaml\n# per ARCHITECTURE.md \u00A78) before running `harness validate`.\n\nversion: 1\n\ngrounding:\n session:\n auto_start: true\n id_format: \"gs-{repo}-{rand:8}\"\n evidence_ledger:\n path: ~/.evidence-ledger/ledger.db\n retention_days: 90\n policies_source: ~/.claude/harness.d/policies/claim-gate.yaml\n\ntools:\n mcp:\n - name: codebase-oracle\n command: [npx, tsx, ~/git/pandora/codebase-oracle/src/mcp-server.ts]\n health:\n verb: oracle_list_repos\n timeout_ms: 5000\n enabled: true\n - name: agent-tasks\n command: [node, ~/git/pandora/agent-tasks/mcp-server/dist/server.js]\n env:\n AGENT_TASKS_URL: https://agent-tasks.opentriologue.ai\n health:\n verb: projects_list\n timeout_ms: 5000\n enabled: true\n - name: grounding-mcp\n command: [node, ~/git/pandora/agent-grounding/packages/grounding-mcp/dist/server.js]\n env:\n EVIDENCE_LEDGER_DB: ~/.evidence-ledger/ledger.db\n health:\n verb: ledger_status\n timeout_ms: 5000\n enabled: true\n\n cli:\n - name: git-batch\n binary: git-batch\n min_version: \"0.2.0\"\n required: true\n - name: gh\n binary: gh\n required: true\n - name: ledger\n binary: ledger\n required: false\n\n skills:\n enabled:\n - simplify\n - init\n - review\n - security-review\n source_dirs:\n - ~/.claude/skills\n\n builtin:\n known: [Read, Edit, Write, Bash, Agent, Skill, TaskCreate]\n\nmemory:\n directories:\n - path: ~/.claude/projects/{project}/memory\n scope: project\n router:\n command: [node, ~/git/pandora/agent-memory/packages/memory-router/dist/hooks/user-prompt-submit.js]\n enabled: true\n retention:\n staleness_days: 180\n broken_refs: warn\n scopes:\n default: project\n allowed: [project, user]\n\nhooks:\n - name: git-preflight\n event: SessionStart\n command: ~/.claude/hooks/git-preflight.sh\n blocking: false\n budget_ms: 30000\n description: \"Run agent-preflight on session start; record ready + confidence into the ledger as preflight:${REPO}.\"\n\n - name: require-review-evidence\n event: PreToolUse\n match: \"mcp__agent-tasks__pull_requests_merge\"\n command: ~/.claude/hooks/require-review-evidence.sh\n blocking: hard\n budget_ms: 2000\n\n - name: require-dogfood-evidence\n event: PreToolUse\n match: \"Bash\"\n command: ~/.claude/hooks/require-dogfood-evidence.sh\n blocking: hard\n budget_ms: 2000\n\n - name: require-preflight-evidence\n event: PreToolUse\n match: \"Bash\"\n bash_match: \"^git (status|log|diff|branch)\"\n command: ~/.claude/hooks/require-preflight-evidence.sh\n blocking: hard\n budget_ms: 1000\n\npolicies:\n - name: review-before-merge\n description: Block PR merges unless a ledger entry tagged review:<pr-number> exists for this session.\n trigger:\n event: PreToolUse\n match: \"mcp__agent-tasks__pull_requests_merge\"\n extract:\n PR_NUMBER: \"toolArgs.prNumber\"\n requires:\n ledger_tag: \"review:${PR_NUMBER}\"\n hook: require-review-evidence\n enforcement: block\n\n - name: dogfood-before-release\n description: Block npm publish / git tag v* without a recent dogfood ledger entry.\n trigger:\n event: PreToolUse\n match: \"Bash\"\n bash_match: \"^(npm publish|git tag v.*)\"\n requires:\n ledger_tag: \"dogfood:${SESSION_ID}\"\n within: 24h\n hook: require-dogfood-evidence\n enforcement: block\n\n - name: preflight-before-investigation\n description: Block investigative git reads (status/log/diff/branch) when agent-preflight has not run recently with ready:true for the current repo.\n trigger:\n event: PreToolUse\n match: \"Bash\"\n bash_match: \"^git (status|log|diff|branch)\"\n requires:\n ledger_tag: \"preflight:${REPO}\"\n within: 1h\n hook: require-preflight-evidence\n enforcement: block\n";
2
+ export declare const FULL_TEMPLATE = "# ~/.claude/harness.yaml\n#\n# Bootstrapped by `harness init --template full`. The reference manifest:\n# all 5 example policies wired through the generic `harness policy intercept`\n# engine, so no external shell scripts under ~/.claude/hooks/ are required.\n#\n# What you still need on PATH (the wizard offers to `npm i -g` these on\n# init): agent-tasks-mcp-bridge, grounding-mcp, memory-router-*,\n# understanding-gate-claude-*. Optional add-on: a local codebase-oracle\n# MCP server (see comment under tools.mcp below).\n\nversion: 1\n\ngrounding:\n session:\n auto_start: true\n id_format: \"gs-{repo}-{rand:8}\"\n evidence_ledger:\n path: ~/.evidence-ledger/ledger.db\n retention_days: 90\n policies_source: ~/.claude/harness.d/policies/claim-gate.yaml\n\ntools:\n mcp:\n # codebase-oracle (the Pandora RAG MCP server) is intentionally NOT\n # in this default. The npm name `codebase-oracle` is already taken\n # by an unrelated CLI, and the Pandora variant is not yet published\n # under a non-colliding scope. Operators who run from a local\n # checkout can add it back with (note: `harness add` splits the\n # command on commas, not whitespace):\n # harness add mcp codebase-oracle \\\n # --command 'npx,tsx,~/git/pandora/codebase-oracle/src/mcp-server.ts'\n - name: agent-tasks\n # Zero-setup entry: `@agent-tasks/mcp-bridge` exposes the\n # `agent-tasks-mcp-bridge` binary on PATH. The bridge owns token\n # storage and defaults to the hosted backend; override with\n # `AGENT_TASKS_BASE_URL` / `AGENT_TASKS_TOKEN` for self-hosted.\n command: [agent-tasks-mcp-bridge]\n health:\n verb: projects_list\n timeout_ms: 5000\n enabled: true\n - name: grounding-mcp\n # Published bin from `@lannguyensi/grounding-mcp`. No env is set:\n # the bundled default resolves to `~/.evidence-ledger/ledger.db`\n # via os.homedir() at startup. Passing a literal tilde in env\n # bypasses shell expansion and creates rogue cwd-relative DB files\n # (see agent-tasks/42d224a6 incident).\n command: [grounding-mcp]\n health:\n verb: ledger_status\n timeout_ms: 5000\n enabled: true\n\n cli:\n - name: gh\n binary: gh\n required: true\n\n skills:\n enabled:\n - simplify\n - init\n - review\n - security-review\n source_dirs:\n - ~/.claude/skills\n\n builtin:\n known: [Read, Edit, Write, Bash, Agent, Skill, TaskCreate, Glob, Grep]\n\nmemory:\n directories:\n - path: ~/.claude/projects/{project}/memory\n scope: project\n router:\n # Published bin from `@lannguyensi/memory-router`.\n command: [memory-router-user-prompt-submit]\n enabled: true\n retention:\n staleness_days: 180\n broken_refs: warn\n scopes:\n default: project\n allowed: [project, user]\n\n# All PreToolUse hooks share the generic `harness policy intercept` CLI\n# entrypoint. The engine reads the tool event on stdin, evaluates whichever\n# policy below has a matching trigger (`match` + optional `bash_match`),\n# and emits Claude Code's deny envelope when the required ledger tag is\n# absent. No external shell scripts are required.\n#\n# Operators who want a SessionStart producer that writes `preflight:${REPO}`\n# (so the `preflight-before-investigation` policy unblocks) need an\n# agent-preflight-style runner; the bundled `harness session-start preflight`\n# builtin is on the roadmap (agent-tasks follow-up). Until then, supply your\n# own `~/.claude/hooks/git-preflight.sh` and add an entry here.\nhooks:\n - name: require-review-evidence\n event: PreToolUse\n match: \"mcp__agent-tasks__pull_requests_merge\"\n command: harness policy intercept\n blocking: hard\n budget_ms: 2000\n\n - name: require-dogfood-evidence\n event: PreToolUse\n match: \"Bash\"\n bash_match: '(^|\\n|;|\\||&&|\\()\\s*(\\w+=\\S+\\s+)*(npm publish\\b|git( -C \\S+)* tag v)'\n command: harness policy intercept\n blocking: hard\n budget_ms: 2000\n\n - name: require-preflight-evidence\n event: PreToolUse\n match: \"Bash\"\n bash_match: '(^|\\n|;|\\||&&|\\()\\s*(\\w+=\\S+\\s+)*git( -C \\S+)* (status|log|diff|branch)\\b'\n command: harness policy intercept\n blocking: hard\n budget_ms: 1000\n\n - name: require-review-subagent-evidence\n event: PreToolUse\n match: \"mcp__agent-tasks__pull_requests_create\"\n command: harness policy intercept\n blocking: hard\n budget_ms: 2000\n\n - name: require-preflight-push-evidence\n event: PreToolUse\n match: \"Bash\"\n bash_match: '(^|\\n|;|\\||&&|\\()\\s*(\\w+=\\S+\\s+)*git( -C \\S+)* push\\b'\n command: harness policy intercept\n blocking: hard\n budget_ms: 1000\n\npolicies:\n - name: review-before-merge\n description: Block PR merges unless a ledger entry tagged review:<pr-number> exists for this session.\n trigger:\n event: PreToolUse\n match: \"mcp__agent-tasks__pull_requests_merge\"\n extract:\n PR_NUMBER: \"toolArgs.prNumber\"\n requires:\n ledger_tag: \"review:${PR_NUMBER}\"\n hook: require-review-evidence\n enforcement: block\n\n - name: dogfood-before-release\n description: Block npm publish / git tag v* without a recent dogfood ledger entry.\n trigger:\n event: PreToolUse\n match: \"Bash\"\n bash_match: '(^|\\n|;|\\||&&|\\()\\s*(\\w+=\\S+\\s+)*(npm publish\\b|git( -C \\S+)* tag v)'\n requires:\n ledger_tag: \"dogfood:${SESSION_ID}\"\n within: 24h\n hook: require-dogfood-evidence\n enforcement: block\n\n - name: preflight-before-investigation\n description: Block investigative git reads (status/log/diff/branch) when agent-preflight has not run recently with ready:true for the current repo.\n trigger:\n event: PreToolUse\n match: \"Bash\"\n bash_match: '(^|\\n|;|\\||&&|\\()\\s*(\\w+=\\S+\\s+)*git( -C \\S+)* (status|log|diff|branch)\\b'\n requires:\n ledger_tag: \"preflight:${REPO}\"\n within: 1h\n hook: require-preflight-evidence\n enforcement: block\n\n - name: review-subagent-before-pr-create\n description: Block agent-tasks PR creation unless a review-subagent ledger entry tagged for this task already exists. Forces the rigorous review BEFORE the PR opens, not after.\n trigger:\n event: PreToolUse\n match: \"mcp__agent-tasks__pull_requests_create\"\n extract:\n TASK_ID: \"toolArgs.taskId\"\n requires:\n ledger_tag: \"review-subagent:${TASK_ID}\"\n hook: require-review-subagent-evidence\n enforcement: block\n\n - name: preflight-before-push\n description: Block git push unless a fresh preflight ledger entry exists for the current branch. Catches the stale-checkout class of incident at the last reversible step.\n trigger:\n event: PreToolUse\n match: \"Bash\"\n bash_match: '(^|\\n|;|\\||&&|\\()\\s*(\\w+=\\S+\\s+)*git( -C \\S+)* push\\b'\n requires:\n ledger_tag: \"preflight:${BRANCH}\"\n within: 10m\n hook: require-preflight-push-evidence\n enforcement: block\n\n# Full inherits the Solo/Team understanding-gate stack: the Stop hook\n# persists each Understanding Report and the PreToolUse pre-tool-use\n# blocker refuses Edit/Write/Bash until the report is approved. Drop\n# this block if you want the reference policies above without the\n# baseline gate.\npolicy_packs:\n - name: understanding-before-execution\n source: builtin\n enabled: true\n description: Force agents to expose their task interpretation and wait for explicit human approval before any write-capable tool fires.\n config:\n mode: grill_me\n";
3
3
  export type TemplateName = "minimal" | "full" | "solo" | "team";
4
4
  export declare function getTemplate(name: TemplateName): string;
@@ -22,11 +22,14 @@ version: 1
22
22
  `;
23
23
  export const FULL_TEMPLATE = `# ~/.claude/harness.yaml
24
24
  #
25
- # Bootstrapped by \`harness init --template full\`. Mirrors the example manifest
26
- # from docs/ARCHITECTURE.md Appendix A. Paths under \`command:\` reference the
27
- # developer machine that authored Appendix A adapt them to your host (or
28
- # move host-specific paths to ~/.claude/machines/<hostname>.harness.overrides.yaml
29
- # per ARCHITECTURE.md §8) before running \`harness validate\`.
25
+ # Bootstrapped by \`harness init --template full\`. The reference manifest:
26
+ # all 5 example policies wired through the generic \`harness policy intercept\`
27
+ # engine, so no external shell scripts under ~/.claude/hooks/ are required.
28
+ #
29
+ # What you still need on PATH (the wizard offers to \`npm i -g\` these on
30
+ # init): agent-tasks-mcp-bridge, grounding-mcp, memory-router-*,
31
+ # understanding-gate-claude-*. Optional add-on: a local codebase-oracle
32
+ # MCP server (see comment under tools.mcp below).
30
33
 
31
34
  version: 1
32
35
 
@@ -41,40 +44,40 @@ grounding:
41
44
 
42
45
  tools:
43
46
  mcp:
44
- - name: codebase-oracle
45
- command: [npx, tsx, ~/git/pandora/codebase-oracle/src/mcp-server.ts]
46
- health:
47
- verb: oracle_list_repos
48
- timeout_ms: 5000
49
- enabled: true
47
+ # codebase-oracle (the Pandora RAG MCP server) is intentionally NOT
48
+ # in this default. The npm name \`codebase-oracle\` is already taken
49
+ # by an unrelated CLI, and the Pandora variant is not yet published
50
+ # under a non-colliding scope. Operators who run from a local
51
+ # checkout can add it back with (note: \`harness add\` splits the
52
+ # command on commas, not whitespace):
53
+ # harness add mcp codebase-oracle \\
54
+ # --command 'npx,tsx,~/git/pandora/codebase-oracle/src/mcp-server.ts'
50
55
  - name: agent-tasks
51
- command: [node, ~/git/pandora/agent-tasks/mcp-server/dist/server.js]
52
- env:
53
- AGENT_TASKS_URL: https://agent-tasks.opentriologue.ai
56
+ # Zero-setup entry: \`@agent-tasks/mcp-bridge\` exposes the
57
+ # \`agent-tasks-mcp-bridge\` binary on PATH. The bridge owns token
58
+ # storage and defaults to the hosted backend; override with
59
+ # \`AGENT_TASKS_BASE_URL\` / \`AGENT_TASKS_TOKEN\` for self-hosted.
60
+ command: [agent-tasks-mcp-bridge]
54
61
  health:
55
62
  verb: projects_list
56
63
  timeout_ms: 5000
57
64
  enabled: true
58
65
  - name: grounding-mcp
59
- command: [node, ~/git/pandora/agent-grounding/packages/grounding-mcp/dist/server.js]
60
- env:
61
- EVIDENCE_LEDGER_DB: ~/.evidence-ledger/ledger.db
66
+ # Published bin from \`@lannguyensi/grounding-mcp\`. No env is set:
67
+ # the bundled default resolves to \`~/.evidence-ledger/ledger.db\`
68
+ # via os.homedir() at startup. Passing a literal tilde in env
69
+ # bypasses shell expansion and creates rogue cwd-relative DB files
70
+ # (see agent-tasks/42d224a6 incident).
71
+ command: [grounding-mcp]
62
72
  health:
63
73
  verb: ledger_status
64
74
  timeout_ms: 5000
65
75
  enabled: true
66
76
 
67
77
  cli:
68
- - name: git-batch
69
- binary: git-batch
70
- min_version: "0.2.0"
71
- required: true
72
78
  - name: gh
73
79
  binary: gh
74
80
  required: true
75
- - name: ledger
76
- binary: ledger
77
- required: false
78
81
 
79
82
  skills:
80
83
  enabled:
@@ -86,14 +89,15 @@ tools:
86
89
  - ~/.claude/skills
87
90
 
88
91
  builtin:
89
- known: [Read, Edit, Write, Bash, Agent, Skill, TaskCreate]
92
+ known: [Read, Edit, Write, Bash, Agent, Skill, TaskCreate, Glob, Grep]
90
93
 
91
94
  memory:
92
95
  directories:
93
96
  - path: ~/.claude/projects/{project}/memory
94
97
  scope: project
95
98
  router:
96
- command: [node, ~/git/pandora/agent-memory/packages/memory-router/dist/hooks/user-prompt-submit.js]
99
+ # Published bin from \`@lannguyensi/memory-router\`.
100
+ command: [memory-router-user-prompt-submit]
97
101
  enabled: true
98
102
  retention:
99
103
  staleness_days: 180
@@ -102,33 +106,53 @@ memory:
102
106
  default: project
103
107
  allowed: [project, user]
104
108
 
109
+ # All PreToolUse hooks share the generic \`harness policy intercept\` CLI
110
+ # entrypoint. The engine reads the tool event on stdin, evaluates whichever
111
+ # policy below has a matching trigger (\`match\` + optional \`bash_match\`),
112
+ # and emits Claude Code's deny envelope when the required ledger tag is
113
+ # absent. No external shell scripts are required.
114
+ #
115
+ # Operators who want a SessionStart producer that writes \`preflight:\${REPO}\`
116
+ # (so the \`preflight-before-investigation\` policy unblocks) need an
117
+ # agent-preflight-style runner; the bundled \`harness session-start preflight\`
118
+ # builtin is on the roadmap (agent-tasks follow-up). Until then, supply your
119
+ # own \`~/.claude/hooks/git-preflight.sh\` and add an entry here.
105
120
  hooks:
106
- - name: git-preflight
107
- event: SessionStart
108
- command: ~/.claude/hooks/git-preflight.sh
109
- blocking: false
110
- budget_ms: 30000
111
- description: "Run agent-preflight on session start; record ready + confidence into the ledger as preflight:\${REPO}."
112
-
113
121
  - name: require-review-evidence
114
122
  event: PreToolUse
115
123
  match: "mcp__agent-tasks__pull_requests_merge"
116
- command: ~/.claude/hooks/require-review-evidence.sh
124
+ command: harness policy intercept
117
125
  blocking: hard
118
126
  budget_ms: 2000
119
127
 
120
128
  - name: require-dogfood-evidence
121
129
  event: PreToolUse
122
130
  match: "Bash"
123
- command: ~/.claude/hooks/require-dogfood-evidence.sh
131
+ bash_match: '(^|\\n|;|\\||&&|\\()\\s*(\\w+=\\S+\\s+)*(npm publish\\b|git( -C \\S+)* tag v)'
132
+ command: harness policy intercept
124
133
  blocking: hard
125
134
  budget_ms: 2000
126
135
 
127
136
  - name: require-preflight-evidence
128
137
  event: PreToolUse
129
138
  match: "Bash"
130
- bash_match: "^git (status|log|diff|branch)"
131
- command: ~/.claude/hooks/require-preflight-evidence.sh
139
+ bash_match: '(^|\\n|;|\\||&&|\\()\\s*(\\w+=\\S+\\s+)*git( -C \\S+)* (status|log|diff|branch)\\b'
140
+ command: harness policy intercept
141
+ blocking: hard
142
+ budget_ms: 1000
143
+
144
+ - name: require-review-subagent-evidence
145
+ event: PreToolUse
146
+ match: "mcp__agent-tasks__pull_requests_create"
147
+ command: harness policy intercept
148
+ blocking: hard
149
+ budget_ms: 2000
150
+
151
+ - name: require-preflight-push-evidence
152
+ event: PreToolUse
153
+ match: "Bash"
154
+ bash_match: '(^|\\n|;|\\||&&|\\()\\s*(\\w+=\\S+\\s+)*git( -C \\S+)* push\\b'
155
+ command: harness policy intercept
132
156
  blocking: hard
133
157
  budget_ms: 1000
134
158
 
@@ -150,7 +174,7 @@ policies:
150
174
  trigger:
151
175
  event: PreToolUse
152
176
  match: "Bash"
153
- bash_match: "^(npm publish|git tag v.*)"
177
+ bash_match: '(^|\\n|;|\\||&&|\\()\\s*(\\w+=\\S+\\s+)*(npm publish\\b|git( -C \\S+)* tag v)'
154
178
  requires:
155
179
  ledger_tag: "dogfood:\${SESSION_ID}"
156
180
  within: 24h
@@ -162,12 +186,49 @@ policies:
162
186
  trigger:
163
187
  event: PreToolUse
164
188
  match: "Bash"
165
- bash_match: "^git (status|log|diff|branch)"
189
+ bash_match: '(^|\\n|;|\\||&&|\\()\\s*(\\w+=\\S+\\s+)*git( -C \\S+)* (status|log|diff|branch)\\b'
166
190
  requires:
167
191
  ledger_tag: "preflight:\${REPO}"
168
192
  within: 1h
169
193
  hook: require-preflight-evidence
170
194
  enforcement: block
195
+
196
+ - name: review-subagent-before-pr-create
197
+ description: Block agent-tasks PR creation unless a review-subagent ledger entry tagged for this task already exists. Forces the rigorous review BEFORE the PR opens, not after.
198
+ trigger:
199
+ event: PreToolUse
200
+ match: "mcp__agent-tasks__pull_requests_create"
201
+ extract:
202
+ TASK_ID: "toolArgs.taskId"
203
+ requires:
204
+ ledger_tag: "review-subagent:\${TASK_ID}"
205
+ hook: require-review-subagent-evidence
206
+ enforcement: block
207
+
208
+ - name: preflight-before-push
209
+ description: Block git push unless a fresh preflight ledger entry exists for the current branch. Catches the stale-checkout class of incident at the last reversible step.
210
+ trigger:
211
+ event: PreToolUse
212
+ match: "Bash"
213
+ bash_match: '(^|\\n|;|\\||&&|\\()\\s*(\\w+=\\S+\\s+)*git( -C \\S+)* push\\b'
214
+ requires:
215
+ ledger_tag: "preflight:\${BRANCH}"
216
+ within: 10m
217
+ hook: require-preflight-push-evidence
218
+ enforcement: block
219
+
220
+ # Full inherits the Solo/Team understanding-gate stack: the Stop hook
221
+ # persists each Understanding Report and the PreToolUse pre-tool-use
222
+ # blocker refuses Edit/Write/Bash until the report is approved. Drop
223
+ # this block if you want the reference policies above without the
224
+ # baseline gate.
225
+ policy_packs:
226
+ - name: understanding-before-execution
227
+ source: builtin
228
+ enabled: true
229
+ description: Force agents to expose their task interpretation and wait for explicit human approval before any write-capable tool fires.
230
+ config:
231
+ mode: grill_me
171
232
  `;
172
233
  import { SOLO_TEMPLATE, TEAM_TEMPLATE } from "./profiles.js";
173
234
  export function getTemplate(name) {
@@ -1 +1 @@
1
- {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/cli/init/templates.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;CAqB/B,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoJ5B,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI7D,MAAM,UAAU,WAAW,CAAC,IAAkB;IAC5C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,OAAO,aAAa,CAAC;QACvB,KAAK,MAAM;YACT,OAAO,aAAa,CAAC;QACvB,KAAK,MAAM;YACT,OAAO,aAAa,CAAC;QACvB,KAAK,SAAS;YACZ,OAAO,gBAAgB,CAAC;IAC5B,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/cli/init/templates.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;CAqB/B,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiN5B,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI7D,MAAM,UAAU,WAAW,CAAC,IAAkB;IAC5C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,OAAO,aAAa,CAAC;QACvB,KAAK,MAAM;YACT,OAAO,aAAa,CAAC;QACvB,KAAK,MAAM;YACT,OAAO,aAAa,CAAC;QACvB,KAAK,SAAS;YACZ,OAAO,gBAAgB,CAAC;IAC5B,CAAC;AACH,CAAC"}
@@ -5,10 +5,17 @@ export interface StaleMemory {
5
5
  ageDays: number;
6
6
  }
7
7
  export interface MemoryReport {
8
+ /**
9
+ * `unresolved: true` marks an entry that still contains a placeholder
10
+ * (e.g. `{project}`) because no project context was provided to the
11
+ * probe. The doctor renders these as informational notes instead of
12
+ * "missing", since the real directory only exists per-project.
13
+ */
8
14
  directories: Array<{
9
15
  path: string;
10
16
  scope: string;
11
17
  exists: boolean;
18
+ unresolved?: boolean;
12
19
  }>;
13
20
  routerExecutable: {
14
21
  path: string;
@@ -20,5 +27,11 @@ export interface MemoryOptions {
20
27
  homeDir?: string;
21
28
  project?: string;
22
29
  now?: Date;
30
+ /**
31
+ * Override `process.env.PATH` for the router-executable lookup. Tests
32
+ * use this to assert the bare-name-on-PATH branch without leaking the
33
+ * host's real PATH into the assertion surface.
34
+ */
35
+ pathEnv?: string;
23
36
  }
24
37
  export declare function inspectMemory(manifest: Manifest, opts?: MemoryOptions): MemoryReport;
@@ -43,23 +43,60 @@ export function inspectMemory(manifest, opts = {}) {
43
43
  const stalenessDays = manifest.memory.retention.staleness_days;
44
44
  const cutoffMs = now.getTime() - stalenessDays * 86400000;
45
45
  const directories = manifest.memory.directories.map((d) => {
46
- const expanded = expandHome(substituteProject(d.path, opts.project), home);
46
+ const substituted = substituteProject(d.path, opts.project);
47
+ const expanded = expandHome(substituted, home);
48
+ const unresolved = expanded.includes("{project}");
47
49
  return {
48
50
  path: expanded,
49
51
  scope: d.scope,
50
- exists: fs.existsSync(expanded),
52
+ // An entry with an unresolved placeholder is a pattern, not a
53
+ // concrete path; existence is not meaningful and the doctor
54
+ // should not flag it as missing.
55
+ exists: unresolved ? true : fs.existsSync(expanded),
56
+ ...(unresolved ? { unresolved: true } : {}),
51
57
  };
52
58
  });
53
59
  let routerExecutable = null;
54
60
  if (manifest.memory.router) {
55
61
  const cmd = manifest.memory.router.command;
56
- const scriptPath = cmd.find((arg) => path.isAbsolute(arg) || arg.startsWith("~/")) ?? cmd[0];
62
+ // For `[node, /abs/script.js]` shapes the original cmd[0]="node" is
63
+ // useless: the meaningful executable is the script path. Prefer the
64
+ // first absolute / tilde-prefixed argument, then fall back to the
65
+ // first arg that is not an interpreter wrapper. Without this guard
66
+ // the PATH walk below would happily resolve "node" / "npx" / "bun"
67
+ // and report the router as installed even when the actual script is
68
+ // missing.
69
+ const isWrapper = (s) => s === "node" || s === "npx" || s === "bun" || s === "deno" || s === "ts-node" || s === "tsx";
70
+ const scriptPath = cmd.find((arg) => path.isAbsolute(arg) || arg.startsWith("~/")) ??
71
+ cmd.find((arg) => !isWrapper(arg)) ??
72
+ cmd[0];
57
73
  if (scriptPath) {
58
- const candidate = expandHome(scriptPath, home);
59
- routerExecutable = {
60
- path: candidate,
61
- exists: fs.existsSync(candidate),
62
- };
74
+ // Two shapes are supported in the manifest: an absolute or
75
+ // tilde-prefixed file path (legacy, `node /abs/router.js`) and a
76
+ // bare bin name on PATH (current, `memory-router-user-prompt-submit`).
77
+ // For the bare-name case we replicate the PATH walk that the
78
+ // doctor uses for `tools.cli` entries so a published bin counts
79
+ // as "found".
80
+ if (path.isAbsolute(scriptPath) || scriptPath.startsWith("~/")) {
81
+ const candidate = expandHome(scriptPath, home);
82
+ routerExecutable = { path: candidate, exists: fs.existsSync(candidate) };
83
+ }
84
+ else {
85
+ const pathEnv = opts.pathEnv ?? process.env.PATH ?? "";
86
+ let resolved = null;
87
+ for (const seg of pathEnv.split(path.delimiter)) {
88
+ if (!seg)
89
+ continue;
90
+ const candidate = path.join(seg, scriptPath);
91
+ if (fs.existsSync(candidate)) {
92
+ resolved = candidate;
93
+ break;
94
+ }
95
+ }
96
+ routerExecutable = resolved
97
+ ? { path: resolved, exists: true }
98
+ : { path: scriptPath, exists: false };
99
+ }
63
100
  }
64
101
  }
65
102
  const staleMemories = [];
@@ -1 +1 @@
1
- {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/probes/memory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/probes/memory.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lannguyensi/harness",
3
- "version": "0.9.0",
3
+ "version": "0.10.0",
4
4
  "description": "Declarative control plane for agent harnesses — one YAML for grounding, tools, memory, and hooks.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/LanNguyenSi/harness",