@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.
- package/CHANGELOG.md +552 -0
- package/LICENSE +21 -0
- package/README.md +154 -0
- package/dist/cli/add/index.d.ts +14 -0
- package/dist/cli/add/index.js +71 -0
- package/dist/cli/add/index.js.map +1 -0
- package/dist/cli/add/mutate.d.ts +39 -0
- package/dist/cli/add/mutate.js +36 -0
- package/dist/cli/add/mutate.js.map +1 -0
- package/dist/cli/adopt/derive.d.ts +38 -0
- package/dist/cli/adopt/derive.js +94 -0
- package/dist/cli/adopt/derive.js.map +1 -0
- package/dist/cli/adopt/index.d.ts +20 -0
- package/dist/cli/adopt/index.js +156 -0
- package/dist/cli/adopt/index.js.map +1 -0
- package/dist/cli/apply/apply.d.ts +49 -0
- package/dist/cli/apply/apply.js +333 -0
- package/dist/cli/apply/apply.js.map +1 -0
- package/dist/cli/apply/generate-memory-index.d.ts +17 -0
- package/dist/cli/apply/generate-memory-index.js +167 -0
- package/dist/cli/apply/generate-memory-index.js.map +1 -0
- package/dist/cli/apply/generate-settings.d.ts +15 -0
- package/dist/cli/apply/generate-settings.js +87 -0
- package/dist/cli/apply/generate-settings.js.map +1 -0
- package/dist/cli/apply/index.d.ts +1 -0
- package/dist/cli/apply/index.js +2 -0
- package/dist/cli/apply/index.js.map +1 -0
- package/dist/cli/audit.d.ts +36 -0
- package/dist/cli/audit.js +121 -0
- package/dist/cli/audit.js.map +1 -0
- package/dist/cli/describe.d.ts +13 -0
- package/dist/cli/describe.js +26 -0
- package/dist/cli/describe.js.map +1 -0
- package/dist/cli/diff/engine.d.ts +21 -0
- package/dist/cli/diff/engine.js +161 -0
- package/dist/cli/diff/engine.js.map +1 -0
- package/dist/cli/diff/git.d.ts +6 -0
- package/dist/cli/diff/git.js +32 -0
- package/dist/cli/diff/git.js.map +1 -0
- package/dist/cli/diff/index.d.ts +15 -0
- package/dist/cli/diff/index.js +39 -0
- package/dist/cli/diff/index.js.map +1 -0
- package/dist/cli/diff/since-apply.d.ts +57 -0
- package/dist/cli/diff/since-apply.js +255 -0
- package/dist/cli/diff/since-apply.js.map +1 -0
- package/dist/cli/doctor/format.d.ts +2 -0
- package/dist/cli/doctor/format.js +126 -0
- package/dist/cli/doctor/format.js.map +1 -0
- package/dist/cli/doctor/index.d.ts +14 -0
- package/dist/cli/doctor/index.js +281 -0
- package/dist/cli/doctor/index.js.map +1 -0
- package/dist/cli/doctor/types.d.ts +46 -0
- package/dist/cli/doctor/types.js +2 -0
- package/dist/cli/doctor/types.js.map +1 -0
- package/dist/cli/dry-run.d.ts +46 -0
- package/dist/cli/dry-run.js +168 -0
- package/dist/cli/dry-run.js.map +1 -0
- package/dist/cli/exit-codes.d.ts +10 -0
- package/dist/cli/exit-codes.js +15 -0
- package/dist/cli/exit-codes.js.map +1 -0
- package/dist/cli/explain.d.ts +14 -0
- package/dist/cli/explain.js +97 -0
- package/dist/cli/explain.js.map +1 -0
- package/dist/cli/export.d.ts +31 -0
- package/dist/cli/export.js +84 -0
- package/dist/cli/export.js.map +1 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.js +549 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init/index.d.ts +17 -0
- package/dist/cli/init/index.js +57 -0
- package/dist/cli/init/index.js.map +1 -0
- package/dist/cli/init/templates.d.ts +4 -0
- package/dist/cli/init/templates.js +175 -0
- package/dist/cli/init/templates.js.map +1 -0
- package/dist/cli/list.d.ts +12 -0
- package/dist/cli/list.js +118 -0
- package/dist/cli/list.js.map +1 -0
- package/dist/cli/loader.d.ts +24 -0
- package/dist/cli/loader.js +74 -0
- package/dist/cli/loader.js.map +1 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.js +6 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/policy/intercept.d.ts +34 -0
- package/dist/cli/policy/intercept.js +172 -0
- package/dist/cli/policy/intercept.js.map +1 -0
- package/dist/cli/remove/index.d.ts +18 -0
- package/dist/cli/remove/index.js +95 -0
- package/dist/cli/remove/index.js.map +1 -0
- package/dist/cli/remove/mutate.d.ts +9 -0
- package/dist/cli/remove/mutate.js +68 -0
- package/dist/cli/remove/mutate.js.map +1 -0
- package/dist/cli/validate/checks.d.ts +23 -0
- package/dist/cli/validate/checks.js +253 -0
- package/dist/cli/validate/checks.js.map +1 -0
- package/dist/cli/validate/index.d.ts +18 -0
- package/dist/cli/validate/index.js +50 -0
- package/dist/cli/validate/index.js.map +1 -0
- package/dist/cli/validate/types.d.ts +7 -0
- package/dist/cli/validate/types.js +5 -0
- package/dist/cli/validate/types.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/io/atomic-write.d.ts +8 -0
- package/dist/io/atomic-write.js +30 -0
- package/dist/io/atomic-write.js.map +1 -0
- package/dist/io/harness-lock.d.ts +33 -0
- package/dist/io/harness-lock.js +260 -0
- package/dist/io/harness-lock.js.map +1 -0
- package/dist/io/last-apply.d.ts +20 -0
- package/dist/io/last-apply.js +123 -0
- package/dist/io/last-apply.js.map +1 -0
- package/dist/io/lock.d.ts +11 -0
- package/dist/io/lock.js +33 -0
- package/dist/io/lock.js.map +1 -0
- package/dist/io/patch.d.ts +10 -0
- package/dist/io/patch.js +8 -0
- package/dist/io/patch.js.map +1 -0
- package/dist/io/restart-hints.d.ts +5 -0
- package/dist/io/restart-hints.js +59 -0
- package/dist/io/restart-hints.js.map +1 -0
- package/dist/io/three-state.d.ts +7 -0
- package/dist/io/three-state.js +20 -0
- package/dist/io/three-state.js.map +1 -0
- package/dist/io/validate-before-write.d.ts +12 -0
- package/dist/io/validate-before-write.js +23 -0
- package/dist/io/validate-before-write.js.map +1 -0
- package/dist/overrides/index.d.ts +2 -0
- package/dist/overrides/index.js +3 -0
- package/dist/overrides/index.js.map +1 -0
- package/dist/overrides/machines.d.ts +12 -0
- package/dist/overrides/machines.js +46 -0
- package/dist/overrides/machines.js.map +1 -0
- package/dist/overrides/merge.d.ts +6 -0
- package/dist/overrides/merge.js +173 -0
- package/dist/overrides/merge.js.map +1 -0
- package/dist/policies/duration.d.ts +5 -0
- package/dist/policies/duration.js +50 -0
- package/dist/policies/duration.js.map +1 -0
- package/dist/policies/extract.d.ts +50 -0
- package/dist/policies/extract.js +190 -0
- package/dist/policies/extract.js.map +1 -0
- package/dist/policies/index.d.ts +5 -0
- package/dist/policies/index.js +6 -0
- package/dist/policies/index.js.map +1 -0
- package/dist/policies/ledger-client.d.ts +39 -0
- package/dist/policies/ledger-client.js +378 -0
- package/dist/policies/ledger-client.js.map +1 -0
- package/dist/policies/requires.d.ts +44 -0
- package/dist/policies/requires.js +146 -0
- package/dist/policies/requires.js.map +1 -0
- package/dist/policies/timestamp.d.ts +14 -0
- package/dist/policies/timestamp.js +36 -0
- package/dist/policies/timestamp.js.map +1 -0
- package/dist/probes/mcp.d.ts +29 -0
- package/dist/probes/mcp.js +226 -0
- package/dist/probes/mcp.js.map +1 -0
- package/dist/probes/memory.d.ts +24 -0
- package/dist/probes/memory.js +89 -0
- package/dist/probes/memory.js.map +1 -0
- package/dist/runtime/index.d.ts +3 -0
- package/dist/runtime/index.js +4 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/intercept.d.ts +53 -0
- package/dist/runtime/intercept.js +181 -0
- package/dist/runtime/intercept.js.map +1 -0
- package/dist/runtime/ledger-record.d.ts +43 -0
- package/dist/runtime/ledger-record.js +239 -0
- package/dist/runtime/ledger-record.js.map +1 -0
- package/dist/runtime/session-id.d.ts +10 -0
- package/dist/runtime/session-id.js +37 -0
- package/dist/runtime/session-id.js.map +1 -0
- package/dist/schema/extract.d.ts +5 -0
- package/dist/schema/extract.js +23 -0
- package/dist/schema/extract.js.map +1 -0
- package/dist/schema/grounding.d.ts +65 -0
- package/dist/schema/grounding.js +21 -0
- package/dist/schema/grounding.js.map +1 -0
- package/dist/schema/hooks.d.ts +86 -0
- package/dist/schema/hooks.js +42 -0
- package/dist/schema/hooks.js.map +1 -0
- package/dist/schema/index.d.ts +961 -0
- package/dist/schema/index.js +55 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/memory.d.ts +131 -0
- package/dist/schema/memory.js +38 -0
- package/dist/schema/memory.js.map +1 -0
- package/dist/schema/policies.d.ts +412 -0
- package/dist/schema/policies.js +53 -0
- package/dist/schema/policies.js.map +1 -0
- package/dist/schema/requires.d.ts +115 -0
- package/dist/schema/requires.js +57 -0
- package/dist/schema/requires.js.map +1 -0
- package/dist/schema/tools.d.ts +283 -0
- package/dist/schema/tools.js +66 -0
- package/dist/schema/tools.js.map +1 -0
- 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;
|
package/dist/cli/list.js
ADDED
|
@@ -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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"}
|
package/dist/cli/main.js
ADDED
|
@@ -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 };
|