loop-engineering-harness 1.0.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/README.md +266 -0
- package/bin/cli.js +166 -0
- package/docs/langfuse-dashboards.md +39 -0
- package/package.json +34 -0
- package/src/detect.js +79 -0
- package/src/install.js +58 -0
- package/src/loop.js +181 -0
- package/src/merge.js +173 -0
- package/src/metrics.js +70 -0
- package/src/uninstall.js +63 -0
- package/template/.claude/agents/context-researcher.md +47 -0
- package/template/.claude/agents/planner.md +71 -0
- package/template/.claude/agents/reviewer.md +64 -0
- package/template/.claude/agents/specialist-backend.md +34 -0
- package/template/.claude/agents/specialist-database.md +32 -0
- package/template/.claude/agents/specialist-frontend.md +35 -0
- package/template/.claude/commands/feature.md +147 -0
- package/template/.claude/hooks/artifact-size.py +71 -0
- package/template/.claude/hooks/commit-gate.py +85 -0
- package/template/.claude/hooks/dispatch-gate.py +193 -0
- package/template/.claude/hooks/divergence-monitor.py +98 -0
- package/template/.claude/hooks/harness_lib.py +260 -0
- package/template/.claude/hooks/loop_lib.py +108 -0
- package/template/.claude/hooks/precompact-guard.py +91 -0
- package/template/.claude/hooks/req_lib.py +148 -0
- package/template/.claude/hooks/requirements-gate.py +62 -0
- package/template/.claude/hooks/retrieval-nudge.py +160 -0
- package/template/.claude/hooks/session-rehydrate.py +65 -0
- package/template/.claude/hooks/state-updater.py +119 -0
- package/template/.claude/hooks/trace-emitter.py +128 -0
- package/template/.claude/hooks/version-gate.py +86 -0
- package/template/.claude/hooks/version-tracker.py +67 -0
- package/template/.claude/hooks/version_lib.py +243 -0
- package/template/.claude/scripts/approve-plan.py +91 -0
- package/template/.claude/scripts/changeset.py +18 -0
- package/template/.claude/scripts/extract-deps.py +288 -0
- package/template/.claude/scripts/version.py +144 -0
- package/template/.claude/skills/contract-writing/SKILL.md +50 -0
- package/template/.claude/skills/discovery-interview/SKILL.md +56 -0
- package/template/.claude/skills/review-taxonomy/SKILL.md +51 -0
- package/template/CLAUDE.harness.md +68 -0
- package/template/harness.config.json +58 -0
- package/template/settings.harness.json +87 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"graphify": {
|
|
3
|
+
"binary": "graphify",
|
|
4
|
+
"index_path": "graphify-out/"
|
|
5
|
+
},
|
|
6
|
+
"retries": {
|
|
7
|
+
"mechanical": 2,
|
|
8
|
+
"contract": 1,
|
|
9
|
+
"ambiguity": 0,
|
|
10
|
+
"security": 0
|
|
11
|
+
},
|
|
12
|
+
"dependency_depth": 1,
|
|
13
|
+
"retrieval_nudge": {
|
|
14
|
+
"mode": "block",
|
|
15
|
+
"auto_init": true
|
|
16
|
+
},
|
|
17
|
+
"observability": {
|
|
18
|
+
"provider": "langfuse",
|
|
19
|
+
"enabled": true,
|
|
20
|
+
"host": "env:LANGFUSE_HOST",
|
|
21
|
+
"public_key": "env:LANGFUSE_PUBLIC_KEY",
|
|
22
|
+
"secret_key": "env:LANGFUSE_SECRET_KEY"
|
|
23
|
+
},
|
|
24
|
+
"gates": {
|
|
25
|
+
"commit_requires_integration_review": true,
|
|
26
|
+
"commit_requires_version": true
|
|
27
|
+
},
|
|
28
|
+
"versioning": {
|
|
29
|
+
"enabled": true,
|
|
30
|
+
"manifests": ["package.json", "requirements.txt", "pyproject.toml", "go.mod", "Cargo.toml"],
|
|
31
|
+
"require_major_dep_ack": true,
|
|
32
|
+
"require_code_bump": true,
|
|
33
|
+
"require_dev_history": true
|
|
34
|
+
},
|
|
35
|
+
"budgets": {
|
|
36
|
+
"context_pack": 2000,
|
|
37
|
+
"task_entry": 300,
|
|
38
|
+
"review_findings": 500,
|
|
39
|
+
"per_task_default": 15000,
|
|
40
|
+
"dispatch_prompt_max": 8000
|
|
41
|
+
},
|
|
42
|
+
"circuit_breaker": {
|
|
43
|
+
"footprint_violations": { "warn": 1, "halt": 2 },
|
|
44
|
+
"max_escalations_per_feature": 2,
|
|
45
|
+
"burndown": { "warn_pct": 80, "halt_pct": 100 }
|
|
46
|
+
},
|
|
47
|
+
"requirements": {
|
|
48
|
+
"enabled": true,
|
|
49
|
+
"min_acceptance_criteria": 1,
|
|
50
|
+
"require_coverage": true
|
|
51
|
+
},
|
|
52
|
+
"loop": {
|
|
53
|
+
"queue": "specs/_queue.json",
|
|
54
|
+
"answer_queue": "specs/_answers.json",
|
|
55
|
+
"headless": true,
|
|
56
|
+
"auto_approve": false
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
{
|
|
2
|
+
"hooks": {
|
|
3
|
+
"PreToolUse": [
|
|
4
|
+
{
|
|
5
|
+
"matcher": "Grep|Glob",
|
|
6
|
+
"hooks": [
|
|
7
|
+
{ "type": "command", "command": "__PYTHON__ \"$CLAUDE_PROJECT_DIR/.claude/hooks/retrieval-nudge.py\"", "_harness": true }
|
|
8
|
+
]
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"matcher": "Bash",
|
|
12
|
+
"hooks": [
|
|
13
|
+
{ "type": "command", "command": "__PYTHON__ \"$CLAUDE_PROJECT_DIR/.claude/hooks/commit-gate.py\"", "_harness": true },
|
|
14
|
+
{ "type": "command", "command": "__PYTHON__ \"$CLAUDE_PROJECT_DIR/.claude/hooks/version-gate.py\"", "_harness": true }
|
|
15
|
+
]
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"matcher": "Task",
|
|
19
|
+
"hooks": [
|
|
20
|
+
{ "type": "command", "command": "__PYTHON__ \"$CLAUDE_PROJECT_DIR/.claude/hooks/requirements-gate.py\"", "_harness": true },
|
|
21
|
+
{ "type": "command", "command": "__PYTHON__ \"$CLAUDE_PROJECT_DIR/.claude/hooks/dispatch-gate.py\"", "_harness": true }
|
|
22
|
+
]
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"matcher": "*",
|
|
26
|
+
"hooks": [
|
|
27
|
+
{ "type": "command", "command": "__PYTHON__ \"$CLAUDE_PROJECT_DIR/.claude/hooks/trace-emitter.py\"", "_harness": true }
|
|
28
|
+
]
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"PostToolUse": [
|
|
32
|
+
{
|
|
33
|
+
"matcher": "Task",
|
|
34
|
+
"hooks": [
|
|
35
|
+
{ "type": "command", "command": "__PYTHON__ \"$CLAUDE_PROJECT_DIR/.claude/hooks/state-updater.py\"", "_harness": true },
|
|
36
|
+
{ "type": "command", "command": "__PYTHON__ \"$CLAUDE_PROJECT_DIR/.claude/hooks/trace-emitter.py\"", "_harness": true }
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"matcher": "Edit|Write|MultiEdit",
|
|
41
|
+
"hooks": [
|
|
42
|
+
{ "type": "command", "command": "__PYTHON__ \"$CLAUDE_PROJECT_DIR/.claude/hooks/divergence-monitor.py\"", "_harness": true },
|
|
43
|
+
{ "type": "command", "command": "__PYTHON__ \"$CLAUDE_PROJECT_DIR/.claude/hooks/artifact-size.py\"", "_harness": true },
|
|
44
|
+
{ "type": "command", "command": "__PYTHON__ \"$CLAUDE_PROJECT_DIR/.claude/hooks/version-tracker.py\"", "_harness": true }
|
|
45
|
+
]
|
|
46
|
+
}
|
|
47
|
+
],
|
|
48
|
+
"SubagentStop": [
|
|
49
|
+
{
|
|
50
|
+
"hooks": [
|
|
51
|
+
{ "type": "command", "command": "__PYTHON__ \"$CLAUDE_PROJECT_DIR/.claude/hooks/state-updater.py\"", "_harness": true },
|
|
52
|
+
{ "type": "command", "command": "__PYTHON__ \"$CLAUDE_PROJECT_DIR/.claude/hooks/trace-emitter.py\"", "_harness": true }
|
|
53
|
+
]
|
|
54
|
+
}
|
|
55
|
+
],
|
|
56
|
+
"SessionStart": [
|
|
57
|
+
{
|
|
58
|
+
"hooks": [
|
|
59
|
+
{ "type": "command", "command": "__PYTHON__ \"$CLAUDE_PROJECT_DIR/.claude/hooks/session-rehydrate.py\"", "_harness": true },
|
|
60
|
+
{ "type": "command", "command": "__PYTHON__ \"$CLAUDE_PROJECT_DIR/.claude/hooks/trace-emitter.py\"", "_harness": true }
|
|
61
|
+
]
|
|
62
|
+
}
|
|
63
|
+
],
|
|
64
|
+
"PreCompact": [
|
|
65
|
+
{
|
|
66
|
+
"hooks": [
|
|
67
|
+
{ "type": "command", "command": "__PYTHON__ \"$CLAUDE_PROJECT_DIR/.claude/hooks/precompact-guard.py\"", "_harness": true },
|
|
68
|
+
{ "type": "command", "command": "__PYTHON__ \"$CLAUDE_PROJECT_DIR/.claude/hooks/trace-emitter.py\"", "_harness": true }
|
|
69
|
+
]
|
|
70
|
+
}
|
|
71
|
+
],
|
|
72
|
+
"Stop": [
|
|
73
|
+
{
|
|
74
|
+
"hooks": [
|
|
75
|
+
{ "type": "command", "command": "__PYTHON__ \"$CLAUDE_PROJECT_DIR/.claude/hooks/trace-emitter.py\"", "_harness": true }
|
|
76
|
+
]
|
|
77
|
+
}
|
|
78
|
+
],
|
|
79
|
+
"SessionEnd": [
|
|
80
|
+
{
|
|
81
|
+
"hooks": [
|
|
82
|
+
{ "type": "command", "command": "__PYTHON__ \"$CLAUDE_PROJECT_DIR/.claude/hooks/trace-emitter.py\"", "_harness": true }
|
|
83
|
+
]
|
|
84
|
+
}
|
|
85
|
+
]
|
|
86
|
+
}
|
|
87
|
+
}
|