@lannguyensi/harness 0.5.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 (199) hide show
  1. package/CHANGELOG.md +552 -0
  2. package/LICENSE +21 -0
  3. package/README.md +154 -0
  4. package/dist/cli/add/index.d.ts +14 -0
  5. package/dist/cli/add/index.js +71 -0
  6. package/dist/cli/add/index.js.map +1 -0
  7. package/dist/cli/add/mutate.d.ts +39 -0
  8. package/dist/cli/add/mutate.js +36 -0
  9. package/dist/cli/add/mutate.js.map +1 -0
  10. package/dist/cli/adopt/derive.d.ts +38 -0
  11. package/dist/cli/adopt/derive.js +94 -0
  12. package/dist/cli/adopt/derive.js.map +1 -0
  13. package/dist/cli/adopt/index.d.ts +20 -0
  14. package/dist/cli/adopt/index.js +156 -0
  15. package/dist/cli/adopt/index.js.map +1 -0
  16. package/dist/cli/apply/apply.d.ts +49 -0
  17. package/dist/cli/apply/apply.js +333 -0
  18. package/dist/cli/apply/apply.js.map +1 -0
  19. package/dist/cli/apply/generate-memory-index.d.ts +17 -0
  20. package/dist/cli/apply/generate-memory-index.js +167 -0
  21. package/dist/cli/apply/generate-memory-index.js.map +1 -0
  22. package/dist/cli/apply/generate-settings.d.ts +15 -0
  23. package/dist/cli/apply/generate-settings.js +87 -0
  24. package/dist/cli/apply/generate-settings.js.map +1 -0
  25. package/dist/cli/apply/index.d.ts +1 -0
  26. package/dist/cli/apply/index.js +2 -0
  27. package/dist/cli/apply/index.js.map +1 -0
  28. package/dist/cli/audit.d.ts +36 -0
  29. package/dist/cli/audit.js +121 -0
  30. package/dist/cli/audit.js.map +1 -0
  31. package/dist/cli/describe.d.ts +13 -0
  32. package/dist/cli/describe.js +26 -0
  33. package/dist/cli/describe.js.map +1 -0
  34. package/dist/cli/diff/engine.d.ts +21 -0
  35. package/dist/cli/diff/engine.js +161 -0
  36. package/dist/cli/diff/engine.js.map +1 -0
  37. package/dist/cli/diff/git.d.ts +6 -0
  38. package/dist/cli/diff/git.js +32 -0
  39. package/dist/cli/diff/git.js.map +1 -0
  40. package/dist/cli/diff/index.d.ts +15 -0
  41. package/dist/cli/diff/index.js +39 -0
  42. package/dist/cli/diff/index.js.map +1 -0
  43. package/dist/cli/diff/since-apply.d.ts +57 -0
  44. package/dist/cli/diff/since-apply.js +255 -0
  45. package/dist/cli/diff/since-apply.js.map +1 -0
  46. package/dist/cli/doctor/format.d.ts +2 -0
  47. package/dist/cli/doctor/format.js +126 -0
  48. package/dist/cli/doctor/format.js.map +1 -0
  49. package/dist/cli/doctor/index.d.ts +14 -0
  50. package/dist/cli/doctor/index.js +281 -0
  51. package/dist/cli/doctor/index.js.map +1 -0
  52. package/dist/cli/doctor/types.d.ts +46 -0
  53. package/dist/cli/doctor/types.js +2 -0
  54. package/dist/cli/doctor/types.js.map +1 -0
  55. package/dist/cli/dry-run.d.ts +46 -0
  56. package/dist/cli/dry-run.js +168 -0
  57. package/dist/cli/dry-run.js.map +1 -0
  58. package/dist/cli/exit-codes.d.ts +10 -0
  59. package/dist/cli/exit-codes.js +15 -0
  60. package/dist/cli/exit-codes.js.map +1 -0
  61. package/dist/cli/explain.d.ts +14 -0
  62. package/dist/cli/explain.js +97 -0
  63. package/dist/cli/explain.js.map +1 -0
  64. package/dist/cli/export.d.ts +31 -0
  65. package/dist/cli/export.js +84 -0
  66. package/dist/cli/export.js.map +1 -0
  67. package/dist/cli/index.d.ts +8 -0
  68. package/dist/cli/index.js +549 -0
  69. package/dist/cli/index.js.map +1 -0
  70. package/dist/cli/init/index.d.ts +17 -0
  71. package/dist/cli/init/index.js +57 -0
  72. package/dist/cli/init/index.js.map +1 -0
  73. package/dist/cli/init/templates.d.ts +4 -0
  74. package/dist/cli/init/templates.js +175 -0
  75. package/dist/cli/init/templates.js.map +1 -0
  76. package/dist/cli/list.d.ts +12 -0
  77. package/dist/cli/list.js +118 -0
  78. package/dist/cli/list.js.map +1 -0
  79. package/dist/cli/loader.d.ts +24 -0
  80. package/dist/cli/loader.js +74 -0
  81. package/dist/cli/loader.js.map +1 -0
  82. package/dist/cli/main.d.ts +2 -0
  83. package/dist/cli/main.js +6 -0
  84. package/dist/cli/main.js.map +1 -0
  85. package/dist/cli/policy/intercept.d.ts +34 -0
  86. package/dist/cli/policy/intercept.js +172 -0
  87. package/dist/cli/policy/intercept.js.map +1 -0
  88. package/dist/cli/remove/index.d.ts +18 -0
  89. package/dist/cli/remove/index.js +95 -0
  90. package/dist/cli/remove/index.js.map +1 -0
  91. package/dist/cli/remove/mutate.d.ts +9 -0
  92. package/dist/cli/remove/mutate.js +68 -0
  93. package/dist/cli/remove/mutate.js.map +1 -0
  94. package/dist/cli/validate/checks.d.ts +23 -0
  95. package/dist/cli/validate/checks.js +253 -0
  96. package/dist/cli/validate/checks.js.map +1 -0
  97. package/dist/cli/validate/index.d.ts +18 -0
  98. package/dist/cli/validate/index.js +50 -0
  99. package/dist/cli/validate/index.js.map +1 -0
  100. package/dist/cli/validate/types.d.ts +7 -0
  101. package/dist/cli/validate/types.js +5 -0
  102. package/dist/cli/validate/types.js.map +1 -0
  103. package/dist/index.d.ts +15 -0
  104. package/dist/index.js +16 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/io/atomic-write.d.ts +8 -0
  107. package/dist/io/atomic-write.js +30 -0
  108. package/dist/io/atomic-write.js.map +1 -0
  109. package/dist/io/harness-lock.d.ts +33 -0
  110. package/dist/io/harness-lock.js +260 -0
  111. package/dist/io/harness-lock.js.map +1 -0
  112. package/dist/io/last-apply.d.ts +20 -0
  113. package/dist/io/last-apply.js +123 -0
  114. package/dist/io/last-apply.js.map +1 -0
  115. package/dist/io/lock.d.ts +11 -0
  116. package/dist/io/lock.js +33 -0
  117. package/dist/io/lock.js.map +1 -0
  118. package/dist/io/patch.d.ts +10 -0
  119. package/dist/io/patch.js +8 -0
  120. package/dist/io/patch.js.map +1 -0
  121. package/dist/io/restart-hints.d.ts +5 -0
  122. package/dist/io/restart-hints.js +59 -0
  123. package/dist/io/restart-hints.js.map +1 -0
  124. package/dist/io/three-state.d.ts +7 -0
  125. package/dist/io/three-state.js +20 -0
  126. package/dist/io/three-state.js.map +1 -0
  127. package/dist/io/validate-before-write.d.ts +12 -0
  128. package/dist/io/validate-before-write.js +23 -0
  129. package/dist/io/validate-before-write.js.map +1 -0
  130. package/dist/overrides/index.d.ts +2 -0
  131. package/dist/overrides/index.js +3 -0
  132. package/dist/overrides/index.js.map +1 -0
  133. package/dist/overrides/machines.d.ts +12 -0
  134. package/dist/overrides/machines.js +46 -0
  135. package/dist/overrides/machines.js.map +1 -0
  136. package/dist/overrides/merge.d.ts +6 -0
  137. package/dist/overrides/merge.js +173 -0
  138. package/dist/overrides/merge.js.map +1 -0
  139. package/dist/policies/duration.d.ts +5 -0
  140. package/dist/policies/duration.js +50 -0
  141. package/dist/policies/duration.js.map +1 -0
  142. package/dist/policies/extract.d.ts +50 -0
  143. package/dist/policies/extract.js +190 -0
  144. package/dist/policies/extract.js.map +1 -0
  145. package/dist/policies/index.d.ts +5 -0
  146. package/dist/policies/index.js +6 -0
  147. package/dist/policies/index.js.map +1 -0
  148. package/dist/policies/ledger-client.d.ts +39 -0
  149. package/dist/policies/ledger-client.js +378 -0
  150. package/dist/policies/ledger-client.js.map +1 -0
  151. package/dist/policies/requires.d.ts +44 -0
  152. package/dist/policies/requires.js +146 -0
  153. package/dist/policies/requires.js.map +1 -0
  154. package/dist/policies/timestamp.d.ts +14 -0
  155. package/dist/policies/timestamp.js +36 -0
  156. package/dist/policies/timestamp.js.map +1 -0
  157. package/dist/probes/mcp.d.ts +29 -0
  158. package/dist/probes/mcp.js +226 -0
  159. package/dist/probes/mcp.js.map +1 -0
  160. package/dist/probes/memory.d.ts +24 -0
  161. package/dist/probes/memory.js +89 -0
  162. package/dist/probes/memory.js.map +1 -0
  163. package/dist/runtime/index.d.ts +3 -0
  164. package/dist/runtime/index.js +4 -0
  165. package/dist/runtime/index.js.map +1 -0
  166. package/dist/runtime/intercept.d.ts +53 -0
  167. package/dist/runtime/intercept.js +181 -0
  168. package/dist/runtime/intercept.js.map +1 -0
  169. package/dist/runtime/ledger-record.d.ts +43 -0
  170. package/dist/runtime/ledger-record.js +239 -0
  171. package/dist/runtime/ledger-record.js.map +1 -0
  172. package/dist/runtime/session-id.d.ts +10 -0
  173. package/dist/runtime/session-id.js +37 -0
  174. package/dist/runtime/session-id.js.map +1 -0
  175. package/dist/schema/extract.d.ts +5 -0
  176. package/dist/schema/extract.js +23 -0
  177. package/dist/schema/extract.js.map +1 -0
  178. package/dist/schema/grounding.d.ts +65 -0
  179. package/dist/schema/grounding.js +21 -0
  180. package/dist/schema/grounding.js.map +1 -0
  181. package/dist/schema/hooks.d.ts +86 -0
  182. package/dist/schema/hooks.js +42 -0
  183. package/dist/schema/hooks.js.map +1 -0
  184. package/dist/schema/index.d.ts +961 -0
  185. package/dist/schema/index.js +55 -0
  186. package/dist/schema/index.js.map +1 -0
  187. package/dist/schema/memory.d.ts +131 -0
  188. package/dist/schema/memory.js +38 -0
  189. package/dist/schema/memory.js.map +1 -0
  190. package/dist/schema/policies.d.ts +412 -0
  191. package/dist/schema/policies.js +53 -0
  192. package/dist/schema/policies.js.map +1 -0
  193. package/dist/schema/requires.d.ts +115 -0
  194. package/dist/schema/requires.js +57 -0
  195. package/dist/schema/requires.js.map +1 -0
  196. package/dist/schema/tools.d.ts +283 -0
  197. package/dist/schema/tools.js +66 -0
  198. package/dist/schema/tools.js.map +1 -0
  199. package/package.json +63 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/init/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
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";
3
+ export type TemplateName = "minimal" | "full";
4
+ export declare function getTemplate(name: TemplateName): string;
@@ -0,0 +1,175 @@
1
+ export const MINIMAL_TEMPLATE = `# ~/.claude/harness.yaml
2
+ #
3
+ # Bootstrapped by \`harness init --template minimal\`.
4
+ #
5
+ # This is the empty-but-valid manifest. Run \`harness validate\` to confirm it
6
+ # parses, then add entries under the five top-level keys:
7
+ #
8
+ # grounding: evidence-ledger + claim-gate config (see docs/ARCHITECTURE.md §2)
9
+ # tools: mcp / cli / skills / builtin inventory (§3)
10
+ # memory: directories, retention, scopes (§4)
11
+ # hooks: event-bound shell commands (§5)
12
+ # policies: named rules that bind hooks to triggers (§6)
13
+ #
14
+ # Phase 2 verbs to add entries safely: \`harness add mcp <name> ...\`,
15
+ # \`harness add cli\`, \`harness add hook\`, \`harness add skill\`.
16
+ # Per-machine overrides live at ~/.claude/machines/<discriminator>.harness.overrides.yaml
17
+ # (ARCHITECTURE.md §8) for paths that vary per host.
18
+ #
19
+ # Docs: https://github.com/LanNguyenSi/harness
20
+
21
+ version: 1
22
+ `;
23
+ export const FULL_TEMPLATE = `# ~/.claude/harness.yaml
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\`.
30
+
31
+ version: 1
32
+
33
+ grounding:
34
+ session:
35
+ auto_start: true
36
+ id_format: "gs-{repo}-{rand:8}"
37
+ evidence_ledger:
38
+ path: ~/.evidence-ledger/ledger.db
39
+ retention_days: 90
40
+ policies_source: ~/.claude/harness.d/policies/claim-gate.yaml
41
+
42
+ tools:
43
+ 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
50
+ - 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
54
+ health:
55
+ verb: projects_list
56
+ timeout_ms: 5000
57
+ enabled: true
58
+ - 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
62
+ health:
63
+ verb: ledger_status
64
+ timeout_ms: 5000
65
+ enabled: true
66
+
67
+ cli:
68
+ - name: git-batch
69
+ binary: git-batch
70
+ min_version: "0.2.0"
71
+ required: true
72
+ - name: gh
73
+ binary: gh
74
+ required: true
75
+ - name: ledger
76
+ binary: ledger
77
+ required: false
78
+
79
+ skills:
80
+ enabled:
81
+ - simplify
82
+ - init
83
+ - review
84
+ - security-review
85
+ source_dirs:
86
+ - ~/.claude/skills
87
+
88
+ builtin:
89
+ known: [Read, Edit, Write, Bash, Agent, Skill, TaskCreate]
90
+
91
+ memory:
92
+ directories:
93
+ - path: ~/.claude/projects/{project}/memory
94
+ scope: project
95
+ router:
96
+ command: [node, ~/git/pandora/agent-memory/packages/memory-router/dist/hooks/user-prompt-submit.js]
97
+ enabled: true
98
+ retention:
99
+ staleness_days: 180
100
+ broken_refs: warn
101
+ scopes:
102
+ default: project
103
+ allowed: [project, user]
104
+
105
+ 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
+ - name: require-review-evidence
114
+ event: PreToolUse
115
+ match: "mcp__agent-tasks__pull_requests_merge"
116
+ command: ~/.claude/hooks/require-review-evidence.sh
117
+ blocking: hard
118
+ budget_ms: 2000
119
+
120
+ - name: require-dogfood-evidence
121
+ event: PreToolUse
122
+ match: "Bash"
123
+ command: ~/.claude/hooks/require-dogfood-evidence.sh
124
+ blocking: hard
125
+ budget_ms: 2000
126
+
127
+ - name: require-preflight-evidence
128
+ event: PreToolUse
129
+ match: "Bash"
130
+ bash_match: "^git (status|log|diff|branch)"
131
+ command: ~/.claude/hooks/require-preflight-evidence.sh
132
+ blocking: hard
133
+ budget_ms: 1000
134
+
135
+ policies:
136
+ - name: review-before-merge
137
+ description: Block PR merges unless a ledger entry tagged review:<pr-number> exists for this session.
138
+ trigger:
139
+ event: PreToolUse
140
+ match: "mcp__agent-tasks__pull_requests_merge"
141
+ extract:
142
+ PR_NUMBER: "toolArgs.prNumber"
143
+ requires:
144
+ ledger_tag: "review:\${PR_NUMBER}"
145
+ hook: require-review-evidence
146
+ enforcement: block
147
+
148
+ - name: dogfood-before-release
149
+ description: Block npm publish / git tag v* without a recent dogfood ledger entry.
150
+ trigger:
151
+ event: PreToolUse
152
+ match: "Bash"
153
+ bash_match: "^(npm publish|git tag v.*)"
154
+ requires:
155
+ ledger_tag: "dogfood:\${SESSION_ID}"
156
+ within: 24h
157
+ hook: require-dogfood-evidence
158
+ enforcement: block
159
+
160
+ - name: preflight-before-investigation
161
+ description: Block investigative git reads (status/log/diff/branch) when agent-preflight has not run recently with ready:true for the current repo.
162
+ trigger:
163
+ event: PreToolUse
164
+ match: "Bash"
165
+ bash_match: "^git (status|log|diff|branch)"
166
+ requires:
167
+ ledger_tag: "preflight:\${REPO}"
168
+ within: 1h
169
+ hook: require-preflight-evidence
170
+ enforcement: block
171
+ `;
172
+ export function getTemplate(name) {
173
+ return name === "full" ? FULL_TEMPLATE : MINIMAL_TEMPLATE;
174
+ }
175
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +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;AAIF,MAAM,UAAU,WAAW,CAAC,IAAkB;IAC5C,OAAO,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAgB,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { type LoaderOptions } from "./loader.js";
2
+ export type ListCategory = "mcp" | "cli" | "skills" | "memories" | "hooks" | "policies";
3
+ export declare function isListCategory(s: string): s is ListCategory;
4
+ export interface ListOptions extends LoaderOptions {
5
+ filter?: string;
6
+ json?: boolean;
7
+ }
8
+ export interface ListResult {
9
+ output: string;
10
+ rows: Record<string, unknown>[];
11
+ }
12
+ export declare function list(category: ListCategory, opts?: ListOptions): ListResult;
@@ -0,0 +1,118 @@
1
+ import { inspectMemory } from "../probes/memory.js";
2
+ import { loadManifest } from "./loader.js";
3
+ const CATEGORIES = [
4
+ "mcp",
5
+ "cli",
6
+ "skills",
7
+ "memories",
8
+ "hooks",
9
+ "policies",
10
+ ];
11
+ export function isListCategory(s) {
12
+ return CATEGORIES.includes(s);
13
+ }
14
+ function applyFilter(rows, filter) {
15
+ if (!filter)
16
+ return rows;
17
+ const needle = filter.toLowerCase();
18
+ return rows.filter((r) => {
19
+ const haystack = (r.name ?? r.path ?? "").toString().toLowerCase();
20
+ return haystack.includes(needle);
21
+ });
22
+ }
23
+ function buildMcpRows(manifest) {
24
+ return manifest.tools.mcp.map((m) => ({
25
+ name: m.name,
26
+ enabled: m.enabled !== false,
27
+ health_verb: m.health?.verb ?? null,
28
+ timeout_ms: m.health?.timeout_ms ?? null,
29
+ command: Array.isArray(m.command) ? m.command.join(" ") : m.command,
30
+ }));
31
+ }
32
+ function buildCliRows(manifest) {
33
+ return manifest.tools.cli.map((c) => ({
34
+ name: c.name,
35
+ binary: c.binary,
36
+ required: !!c.required,
37
+ min_version: c.min_version ?? null,
38
+ }));
39
+ }
40
+ function buildSkillRows(manifest) {
41
+ const required = new Set(manifest.tools.skills.required ?? []);
42
+ return manifest.tools.skills.enabled.map((name) => ({
43
+ name,
44
+ required: required.has(name),
45
+ }));
46
+ }
47
+ function buildMemoryRows(manifest, opts) {
48
+ const report = inspectMemory(manifest, {
49
+ homeDir: opts.homeDir,
50
+ project: opts.project,
51
+ });
52
+ const out = [];
53
+ for (const dir of report.directories) {
54
+ out.push({
55
+ path: dir.path,
56
+ scope: dir.scope,
57
+ exists: dir.exists,
58
+ stale_count: report.staleMemories.filter((s) => s.path.startsWith(dir.path)).length,
59
+ });
60
+ }
61
+ return out;
62
+ }
63
+ function buildHookRows(manifest) {
64
+ return manifest.hooks.map((h) => ({
65
+ name: h.name,
66
+ event: h.event,
67
+ blocking: h.blocking === false ? "false" : h.blocking,
68
+ match: h.match ?? null,
69
+ command: h.command,
70
+ }));
71
+ }
72
+ function buildPolicyRows(manifest) {
73
+ return manifest.policies.map((p) => ({
74
+ name: p.name,
75
+ enforcement: p.enforcement,
76
+ event: p.trigger.event,
77
+ hook: p.hook,
78
+ requires_tag: p.requires.ledger_tag,
79
+ }));
80
+ }
81
+ function buildRows(category, manifest, opts) {
82
+ switch (category) {
83
+ case "mcp":
84
+ return buildMcpRows(manifest);
85
+ case "cli":
86
+ return buildCliRows(manifest);
87
+ case "skills":
88
+ return buildSkillRows(manifest);
89
+ case "memories":
90
+ return buildMemoryRows(manifest, opts);
91
+ case "hooks":
92
+ return buildHookRows(manifest);
93
+ case "policies":
94
+ return buildPolicyRows(manifest);
95
+ }
96
+ }
97
+ function renderText(rows) {
98
+ if (rows.length === 0)
99
+ return "(no entries)\n";
100
+ const headers = Object.keys(rows[0]);
101
+ const widths = headers.map((h) => Math.max(h.length, ...rows.map((r) => String(r[h] ?? "").length)));
102
+ const pad = (s, w) => s.padEnd(w, " ");
103
+ const lines = [];
104
+ lines.push(headers.map((h, i) => pad(h, widths[i])).join(" "));
105
+ lines.push(headers.map((_, i) => "-".repeat(widths[i])).join(" "));
106
+ for (const row of rows) {
107
+ lines.push(headers.map((h, i) => pad(String(row[h] ?? ""), widths[i])).join(" "));
108
+ }
109
+ return `${lines.join("\n")}\n`;
110
+ }
111
+ export function list(category, opts = {}) {
112
+ const { manifest } = loadManifest(opts);
113
+ const all = buildRows(category, manifest, opts);
114
+ const rows = applyFilter(all, opts.filter);
115
+ const output = opts.json ? `${JSON.stringify(rows, null, 2)}\n` : renderText(rows);
116
+ return { output, rows };
117
+ }
118
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/cli/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { type DiscriminatorOptions } from "../overrides/machines.js";
2
+ import { type Manifest } from "../schema/index.js";
3
+ export interface LoaderOptions {
4
+ configPath?: string;
5
+ project?: string;
6
+ homeDir?: string;
7
+ discriminator?: DiscriminatorOptions;
8
+ }
9
+ export interface ResolvedPaths {
10
+ base: string;
11
+ machineLayers: string[];
12
+ projectLayer: string | null;
13
+ }
14
+ export interface LoadedManifest {
15
+ manifest: Manifest;
16
+ resolved: ResolvedPaths;
17
+ }
18
+ export interface LoadedRaw {
19
+ mergedRaw: unknown;
20
+ resolved: ResolvedPaths;
21
+ }
22
+ export declare function resolvePaths(opts?: LoaderOptions): ResolvedPaths;
23
+ export declare function loadMergedRaw(opts?: LoaderOptions): LoadedRaw;
24
+ export declare function loadManifest(opts?: LoaderOptions): LoadedManifest;
@@ -0,0 +1,74 @@
1
+ import * as fs from "node:fs";
2
+ import * as os from "node:os";
3
+ import * as path from "node:path";
4
+ import { parse as parseYaml } from "yaml";
5
+ import { applyLayers } from "../overrides/merge.js";
6
+ import { machineOverrideCandidates, resolveMachineDiscriminators, } from "../overrides/machines.js";
7
+ import { ManifestParseError, parseManifest } from "../schema/index.js";
8
+ import { EX_NOINPUT, HarnessExitError } from "./exit-codes.js";
9
+ const DEFAULT_BASENAME = "harness.yaml";
10
+ function defaultHome(opts) {
11
+ return opts.homeDir ?? path.join(os.homedir(), ".claude");
12
+ }
13
+ export function resolvePaths(opts = {}) {
14
+ const home = defaultHome(opts);
15
+ const base = opts.configPath ?? path.join(home, DEFAULT_BASENAME);
16
+ const machinesDir = path.join(home, "machines");
17
+ const candidates = machineOverrideCandidates(resolveMachineDiscriminators(opts.discriminator ?? {}));
18
+ const machineLayers = [];
19
+ for (const c of candidates) {
20
+ const candidatePath = path.join(machinesDir, `${c}.harness.overrides.yaml`);
21
+ if (fs.existsSync(candidatePath))
22
+ machineLayers.push(candidatePath);
23
+ }
24
+ let projectLayer = null;
25
+ if (opts.project) {
26
+ const projectPath = path.join(home, "projects", opts.project, "harness.overrides.yaml");
27
+ if (fs.existsSync(projectPath))
28
+ projectLayer = projectPath;
29
+ }
30
+ return { base, machineLayers, projectLayer };
31
+ }
32
+ function readYamlFile(filePath, label) {
33
+ let raw;
34
+ try {
35
+ raw = fs.readFileSync(filePath, "utf8");
36
+ }
37
+ catch (err) {
38
+ if (err.code === "ENOENT") {
39
+ throw new HarnessExitError(`${label} not found: ${filePath}`, EX_NOINPUT);
40
+ }
41
+ throw new HarnessExitError(`${label} could not be read: ${err.message}`, EX_NOINPUT);
42
+ }
43
+ try {
44
+ return parseYaml(raw);
45
+ }
46
+ catch (err) {
47
+ throw new HarnessExitError(`${label} is not valid YAML (${filePath}): ${err.message}`, EX_NOINPUT);
48
+ }
49
+ }
50
+ export function loadMergedRaw(opts = {}) {
51
+ const resolved = resolvePaths(opts);
52
+ const baseRaw = readYamlFile(resolved.base, "manifest");
53
+ const machineLayers = resolved.machineLayers.map((p, i) => readYamlFile(p, `machine override layer ${i + 1}`));
54
+ const projectLayer = resolved.projectLayer
55
+ ? readYamlFile(resolved.projectLayer, "project override layer")
56
+ : undefined;
57
+ const mergedRaw = applyLayers(baseRaw, ...machineLayers, projectLayer);
58
+ return { mergedRaw, resolved };
59
+ }
60
+ export function loadManifest(opts = {}) {
61
+ const { mergedRaw, resolved } = loadMergedRaw(opts);
62
+ let manifest;
63
+ try {
64
+ manifest = parseManifest(mergedRaw);
65
+ }
66
+ catch (err) {
67
+ if (err instanceof ManifestParseError) {
68
+ throw new HarnessExitError(err.message, EX_NOINPUT);
69
+ }
70
+ throw err;
71
+ }
72
+ return { manifest, resolved };
73
+ }
74
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/cli/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ import { run } from "./index.js";
3
+ run().then((code) => {
4
+ process.exit(code);
5
+ });
6
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAEjC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;IAClB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { type LedgerEntry } from "../../policies/index.js";
2
+ import { type LedgerClient, type PolicyDecision } from "../../runtime/index.js";
3
+ import type { Manifest } from "../../schema/index.js";
4
+ import { type LoaderOptions } from "../loader.js";
5
+ export interface InterceptCliOptions extends LoaderOptions {
6
+ /** Defaults to process.stdin. */
7
+ stdin?: NodeJS.ReadableStream;
8
+ /** Defaults to process.stdout. */
9
+ stdout?: NodeJS.WritableStream;
10
+ /** Defaults to process.stderr. */
11
+ stderr?: NodeJS.WritableStream;
12
+ /** Override timeout per ledger call. */
13
+ ledgerTimeoutMs?: number;
14
+ /** Override "now" for deterministic tests. */
15
+ now?: Date;
16
+ /** Inject a fake ledger client (tests). */
17
+ ledger?: LedgerClient;
18
+ /** Inject the resolved manifest (tests). */
19
+ manifest?: Manifest;
20
+ /**
21
+ * When true (or `HARNESS_POLICY_VERBOSE` env is truthy), emit a
22
+ * human-readable diagnostic block to stderr for each non-allow
23
+ * decision. stdout is unaffected, so Claude Code's deny JSON contract
24
+ * is preserved. Phase 5 #3 — opt-in only.
25
+ */
26
+ verbose?: boolean;
27
+ }
28
+ export interface InterceptCliResult {
29
+ exitCode: number;
30
+ decisions: PolicyDecision[];
31
+ blocked: boolean;
32
+ }
33
+ export declare function runInterceptCli(opts?: InterceptCliOptions): Promise<InterceptCliResult>;
34
+ export type { LedgerEntry };