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.
Files changed (43) hide show
  1. package/README.md +266 -0
  2. package/bin/cli.js +166 -0
  3. package/docs/langfuse-dashboards.md +39 -0
  4. package/package.json +34 -0
  5. package/src/detect.js +79 -0
  6. package/src/install.js +58 -0
  7. package/src/loop.js +181 -0
  8. package/src/merge.js +173 -0
  9. package/src/metrics.js +70 -0
  10. package/src/uninstall.js +63 -0
  11. package/template/.claude/agents/context-researcher.md +47 -0
  12. package/template/.claude/agents/planner.md +71 -0
  13. package/template/.claude/agents/reviewer.md +64 -0
  14. package/template/.claude/agents/specialist-backend.md +34 -0
  15. package/template/.claude/agents/specialist-database.md +32 -0
  16. package/template/.claude/agents/specialist-frontend.md +35 -0
  17. package/template/.claude/commands/feature.md +147 -0
  18. package/template/.claude/hooks/artifact-size.py +71 -0
  19. package/template/.claude/hooks/commit-gate.py +85 -0
  20. package/template/.claude/hooks/dispatch-gate.py +193 -0
  21. package/template/.claude/hooks/divergence-monitor.py +98 -0
  22. package/template/.claude/hooks/harness_lib.py +260 -0
  23. package/template/.claude/hooks/loop_lib.py +108 -0
  24. package/template/.claude/hooks/precompact-guard.py +91 -0
  25. package/template/.claude/hooks/req_lib.py +148 -0
  26. package/template/.claude/hooks/requirements-gate.py +62 -0
  27. package/template/.claude/hooks/retrieval-nudge.py +160 -0
  28. package/template/.claude/hooks/session-rehydrate.py +65 -0
  29. package/template/.claude/hooks/state-updater.py +119 -0
  30. package/template/.claude/hooks/trace-emitter.py +128 -0
  31. package/template/.claude/hooks/version-gate.py +86 -0
  32. package/template/.claude/hooks/version-tracker.py +67 -0
  33. package/template/.claude/hooks/version_lib.py +243 -0
  34. package/template/.claude/scripts/approve-plan.py +91 -0
  35. package/template/.claude/scripts/changeset.py +18 -0
  36. package/template/.claude/scripts/extract-deps.py +288 -0
  37. package/template/.claude/scripts/version.py +144 -0
  38. package/template/.claude/skills/contract-writing/SKILL.md +50 -0
  39. package/template/.claude/skills/discovery-interview/SKILL.md +56 -0
  40. package/template/.claude/skills/review-taxonomy/SKILL.md +51 -0
  41. package/template/CLAUDE.harness.md +68 -0
  42. package/template/harness.config.json +58 -0
  43. 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
+ }