@hunter-harness/workflow-harness 0.2.6 → 0.2.7
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/harness/bundles/general/claude-code/.harness-build.json +1 -1
- package/harness/bundles/general/claude-code/contracts/workflow-policy.json +169 -0
- package/harness/bundles/general/claude-code/harness-archive/SKILL.md +3 -1
- package/harness/bundles/general/claude-code/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-knowledge-ingest/scripts/harness_knowledge.py +26 -1
- package/harness/bundles/general/claude-code/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +2 -0
- package/harness/bundles/general/claude-code/harness-knowledge-query/SKILL.md +3 -1
- package/harness/bundles/general/claude-code/harness-plan/SKILL.md +3 -1
- package/harness/bundles/general/claude-code/harness-review/SKILL.md +3 -1
- package/harness/bundles/general/claude-code/harness-run/SKILL.md +9 -6
- package/harness/bundles/general/claude-code/harness-run/checklist.md +2 -2
- package/harness/bundles/general/claude-code/harness-run/reference.md +5 -2
- package/harness/bundles/general/claude-code/harness-submit/SKILL.md +7 -5
- package/harness/bundles/general/claude-code/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-test/SKILL.md +8 -2
- package/harness/bundles/general/claude-code/scripts/harness_apidoc.py +53 -0
- package/harness/bundles/general/claude-code/scripts/harness_archive.py +41 -16
- package/harness/bundles/general/claude-code/scripts/harness_change.py +854 -0
- package/harness/bundles/general/claude-code/scripts/harness_gate.py +1038 -0
- package/harness/bundles/general/claude-code/scripts/harness_service.py +34 -1
- package/harness/bundles/general/claude-code/scripts/harness_test_guard.py +210 -14
- package/harness/bundles/general/claude-code/scripts/harness_workflow_policy.py +160 -0
- package/harness/bundles/general/codebuddy/.harness-build.json +1 -1
- package/harness/bundles/general/codebuddy/contracts/workflow-policy.json +169 -0
- package/harness/bundles/general/codebuddy/harness-archive/SKILL.md +3 -1
- package/harness/bundles/general/codebuddy/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge.py +26 -1
- package/harness/bundles/general/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +2 -0
- package/harness/bundles/general/codebuddy/harness-knowledge-query/SKILL.md +3 -1
- package/harness/bundles/general/codebuddy/harness-plan/SKILL.md +3 -1
- package/harness/bundles/general/codebuddy/harness-review/SKILL.md +3 -1
- package/harness/bundles/general/codebuddy/harness-run/SKILL.md +9 -6
- package/harness/bundles/general/codebuddy/harness-run/checklist.md +2 -2
- package/harness/bundles/general/codebuddy/harness-run/reference.md +5 -2
- package/harness/bundles/general/codebuddy/harness-submit/SKILL.md +7 -5
- package/harness/bundles/general/codebuddy/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-test/SKILL.md +8 -2
- package/harness/bundles/general/codebuddy/scripts/harness_apidoc.py +53 -0
- package/harness/bundles/general/codebuddy/scripts/harness_archive.py +41 -16
- package/harness/bundles/general/codebuddy/scripts/harness_change.py +854 -0
- package/harness/bundles/general/codebuddy/scripts/harness_gate.py +1038 -0
- package/harness/bundles/general/codebuddy/scripts/harness_service.py +34 -1
- package/harness/bundles/general/codebuddy/scripts/harness_test_guard.py +210 -14
- package/harness/bundles/general/codebuddy/scripts/harness_workflow_policy.py +160 -0
- package/harness/bundles/general/codex/.harness-build.json +1 -1
- package/harness/bundles/general/codex/contracts/workflow-policy.json +169 -0
- package/harness/bundles/general/codex/harness-archive/SKILL.md +3 -1
- package/harness/bundles/general/codex/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-knowledge-ingest/scripts/harness_knowledge.py +26 -1
- package/harness/bundles/general/codex/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +2 -0
- package/harness/bundles/general/codex/harness-knowledge-query/SKILL.md +3 -1
- package/harness/bundles/general/codex/harness-plan/SKILL.md +3 -1
- package/harness/bundles/general/codex/harness-review/SKILL.md +3 -1
- package/harness/bundles/general/codex/harness-run/SKILL.md +9 -6
- package/harness/bundles/general/codex/harness-run/checklist.md +2 -2
- package/harness/bundles/general/codex/harness-run/reference.md +5 -2
- package/harness/bundles/general/codex/harness-submit/SKILL.md +7 -5
- package/harness/bundles/general/codex/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-test/SKILL.md +8 -2
- package/harness/bundles/general/codex/scripts/harness_apidoc.py +53 -0
- package/harness/bundles/general/codex/scripts/harness_archive.py +41 -16
- package/harness/bundles/general/codex/scripts/harness_change.py +854 -0
- package/harness/bundles/general/codex/scripts/harness_gate.py +1038 -0
- package/harness/bundles/general/codex/scripts/harness_service.py +34 -1
- package/harness/bundles/general/codex/scripts/harness_test_guard.py +210 -14
- package/harness/bundles/general/codex/scripts/harness_workflow_policy.py +160 -0
- package/harness/bundles/general/cursor/.harness-build.json +1 -1
- package/harness/bundles/general/cursor/contracts/workflow-policy.json +169 -0
- package/harness/bundles/general/cursor/harness-archive/SKILL.md +3 -1
- package/harness/bundles/general/cursor/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-knowledge-ingest/scripts/harness_knowledge.py +26 -1
- package/harness/bundles/general/cursor/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +2 -0
- package/harness/bundles/general/cursor/harness-knowledge-query/SKILL.md +3 -1
- package/harness/bundles/general/cursor/harness-plan/SKILL.md +3 -1
- package/harness/bundles/general/cursor/harness-review/SKILL.md +3 -1
- package/harness/bundles/general/cursor/harness-run/SKILL.md +9 -6
- package/harness/bundles/general/cursor/harness-run/checklist.md +2 -2
- package/harness/bundles/general/cursor/harness-run/reference.md +5 -2
- package/harness/bundles/general/cursor/harness-submit/SKILL.md +7 -5
- package/harness/bundles/general/cursor/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-test/SKILL.md +8 -2
- package/harness/bundles/general/cursor/scripts/harness_apidoc.py +53 -0
- package/harness/bundles/general/cursor/scripts/harness_archive.py +41 -16
- package/harness/bundles/general/cursor/scripts/harness_change.py +854 -0
- package/harness/bundles/general/cursor/scripts/harness_gate.py +1038 -0
- package/harness/bundles/general/cursor/scripts/harness_service.py +34 -1
- package/harness/bundles/general/cursor/scripts/harness_test_guard.py +210 -14
- package/harness/bundles/general/cursor/scripts/harness_workflow_policy.py +160 -0
- package/harness/bundles/java/claude-code/.harness-build.json +1 -1
- package/harness/bundles/java/claude-code/contracts/workflow-policy.json +169 -0
- package/harness/bundles/java/claude-code/harness-apidoc/SKILL.md +7 -1
- package/harness/bundles/java/claude-code/harness-archive/SKILL.md +3 -1
- package/harness/bundles/java/claude-code/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-knowledge-ingest/scripts/harness_knowledge.py +26 -1
- package/harness/bundles/java/claude-code/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +2 -0
- package/harness/bundles/java/claude-code/harness-knowledge-query/SKILL.md +3 -1
- package/harness/bundles/java/claude-code/harness-package/SKILL.md +6 -3
- package/harness/bundles/java/claude-code/harness-plan/SKILL.md +3 -1
- package/harness/bundles/java/claude-code/harness-review/SKILL.md +3 -1
- package/harness/bundles/java/claude-code/harness-run/SKILL.md +9 -6
- package/harness/bundles/java/claude-code/harness-submit/SKILL.md +7 -5
- package/harness/bundles/java/claude-code/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-test/SKILL.md +8 -2
- package/harness/bundles/java/claude-code/scripts/harness_apidoc.py +53 -0
- package/harness/bundles/java/claude-code/scripts/harness_archive.py +41 -16
- package/harness/bundles/java/claude-code/scripts/harness_change.py +854 -0
- package/harness/bundles/java/claude-code/scripts/harness_gate.py +1038 -0
- package/harness/bundles/java/claude-code/scripts/harness_service.py +34 -1
- package/harness/bundles/java/claude-code/scripts/harness_test_guard.py +210 -14
- package/harness/bundles/java/claude-code/scripts/harness_workflow_policy.py +160 -0
- package/harness/bundles/java/codebuddy/.harness-build.json +1 -1
- package/harness/bundles/java/codebuddy/contracts/workflow-policy.json +169 -0
- package/harness/bundles/java/codebuddy/harness-apidoc/SKILL.md +7 -1
- package/harness/bundles/java/codebuddy/harness-archive/SKILL.md +3 -1
- package/harness/bundles/java/codebuddy/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge.py +26 -1
- package/harness/bundles/java/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +2 -0
- package/harness/bundles/java/codebuddy/harness-knowledge-query/SKILL.md +3 -1
- package/harness/bundles/java/codebuddy/harness-package/SKILL.md +6 -3
- package/harness/bundles/java/codebuddy/harness-plan/SKILL.md +3 -1
- package/harness/bundles/java/codebuddy/harness-review/SKILL.md +3 -1
- package/harness/bundles/java/codebuddy/harness-run/SKILL.md +9 -6
- package/harness/bundles/java/codebuddy/harness-submit/SKILL.md +7 -5
- package/harness/bundles/java/codebuddy/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-test/SKILL.md +8 -2
- package/harness/bundles/java/codebuddy/scripts/harness_apidoc.py +53 -0
- package/harness/bundles/java/codebuddy/scripts/harness_archive.py +41 -16
- package/harness/bundles/java/codebuddy/scripts/harness_change.py +854 -0
- package/harness/bundles/java/codebuddy/scripts/harness_gate.py +1038 -0
- package/harness/bundles/java/codebuddy/scripts/harness_service.py +34 -1
- package/harness/bundles/java/codebuddy/scripts/harness_test_guard.py +210 -14
- package/harness/bundles/java/codebuddy/scripts/harness_workflow_policy.py +160 -0
- package/harness/bundles/java/codex/.harness-build.json +1 -1
- package/harness/bundles/java/codex/contracts/workflow-policy.json +169 -0
- package/harness/bundles/java/codex/harness-apidoc/SKILL.md +7 -1
- package/harness/bundles/java/codex/harness-archive/SKILL.md +3 -1
- package/harness/bundles/java/codex/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-knowledge-ingest/scripts/harness_knowledge.py +26 -1
- package/harness/bundles/java/codex/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +2 -0
- package/harness/bundles/java/codex/harness-knowledge-query/SKILL.md +3 -1
- package/harness/bundles/java/codex/harness-package/SKILL.md +6 -3
- package/harness/bundles/java/codex/harness-plan/SKILL.md +3 -1
- package/harness/bundles/java/codex/harness-review/SKILL.md +3 -1
- package/harness/bundles/java/codex/harness-run/SKILL.md +9 -6
- package/harness/bundles/java/codex/harness-submit/SKILL.md +7 -5
- package/harness/bundles/java/codex/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-test/SKILL.md +8 -2
- package/harness/bundles/java/codex/scripts/harness_apidoc.py +53 -0
- package/harness/bundles/java/codex/scripts/harness_archive.py +41 -16
- package/harness/bundles/java/codex/scripts/harness_change.py +854 -0
- package/harness/bundles/java/codex/scripts/harness_gate.py +1038 -0
- package/harness/bundles/java/codex/scripts/harness_service.py +34 -1
- package/harness/bundles/java/codex/scripts/harness_test_guard.py +210 -14
- package/harness/bundles/java/codex/scripts/harness_workflow_policy.py +160 -0
- package/harness/bundles/java/cursor/.harness-build.json +1 -1
- package/harness/bundles/java/cursor/contracts/workflow-policy.json +169 -0
- package/harness/bundles/java/cursor/harness-apidoc/SKILL.md +7 -1
- package/harness/bundles/java/cursor/harness-archive/SKILL.md +3 -1
- package/harness/bundles/java/cursor/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-knowledge-ingest/scripts/harness_knowledge.py +26 -1
- package/harness/bundles/java/cursor/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +2 -0
- package/harness/bundles/java/cursor/harness-knowledge-query/SKILL.md +3 -1
- package/harness/bundles/java/cursor/harness-package/SKILL.md +6 -3
- package/harness/bundles/java/cursor/harness-plan/SKILL.md +3 -1
- package/harness/bundles/java/cursor/harness-review/SKILL.md +3 -1
- package/harness/bundles/java/cursor/harness-run/SKILL.md +9 -6
- package/harness/bundles/java/cursor/harness-submit/SKILL.md +7 -5
- package/harness/bundles/java/cursor/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-test/SKILL.md +8 -2
- package/harness/bundles/java/cursor/scripts/harness_apidoc.py +53 -0
- package/harness/bundles/java/cursor/scripts/harness_archive.py +41 -16
- package/harness/bundles/java/cursor/scripts/harness_change.py +854 -0
- package/harness/bundles/java/cursor/scripts/harness_gate.py +1038 -0
- package/harness/bundles/java/cursor/scripts/harness_service.py +34 -1
- package/harness/bundles/java/cursor/scripts/harness_test_guard.py +210 -14
- package/harness/bundles/java/cursor/scripts/harness_workflow_policy.py +160 -0
- package/harness/manifests/general/claude-code.json +39 -19
- package/harness/manifests/general/codebuddy.json +39 -19
- package/harness/manifests/general/codex.json +39 -19
- package/harness/manifests/general/cursor.json +39 -19
- package/harness/manifests/java/claude-code.json +39 -19
- package/harness/manifests/java/codebuddy.json +39 -19
- package/harness/manifests/java/codex.json +39 -19
- package/harness/manifests/java/cursor.json +39 -19
- package/hunter-workflow-family.json +2 -2
- package/package.json +1 -1
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"riskTiers": {
|
|
4
|
+
"fast": {
|
|
5
|
+
"description": "Low-risk docs/comments/non-behavioral config; no API/DB/security/concurrency.",
|
|
6
|
+
"defaultPhases": ["plan", "run", "submit", "archive"],
|
|
7
|
+
"requiredValidations": ["unitTest"],
|
|
8
|
+
"conditionalStages": ["review", "package", "apidoc"],
|
|
9
|
+
"upgradeTriggers": ["api-change", "security", "migration", "concurrency", "breaking-contract"]
|
|
10
|
+
},
|
|
11
|
+
"standard": {
|
|
12
|
+
"description": "Ordinary production code and non-breaking API/features.",
|
|
13
|
+
"defaultPhases": ["plan", "run", "test", "submit", "archive"],
|
|
14
|
+
"requiredValidations": ["compile", "unitTest", "unitTestFull"],
|
|
15
|
+
"conditionalStages": ["review", "package", "apidoc"],
|
|
16
|
+
"upgradeTriggers": ["auth", "security", "delete", "migration", "concurrency", "artifact-protocol", "shared-state", "breaking-api"]
|
|
17
|
+
},
|
|
18
|
+
"full": {
|
|
19
|
+
"description": "Auth/security/delete/migration/concurrency/service protocol/shared state/breaking contracts.",
|
|
20
|
+
"defaultPhases": ["plan", "run", "test", "review", "submit", "archive"],
|
|
21
|
+
"requiredValidations": ["compile", "unitTest", "unitTestFull", "apiTest"],
|
|
22
|
+
"conditionalStages": ["package", "apidoc"],
|
|
23
|
+
"upgradeTriggers": []
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"skills": {
|
|
27
|
+
"harness-plan": {
|
|
28
|
+
"phase": "plan",
|
|
29
|
+
"inputs": ["requirements", "change-context"],
|
|
30
|
+
"artifacts": ["plans", "spec", "test-scenarios", "implementation-detail"],
|
|
31
|
+
"events": ["phase.start", "phase.end", "decision"],
|
|
32
|
+
"allowedInteractions": [],
|
|
33
|
+
"capabilities": ["risk-classify-plan"]
|
|
34
|
+
},
|
|
35
|
+
"harness-run": {
|
|
36
|
+
"phase": "run",
|
|
37
|
+
"inputs": ["implementation-detail", "state-snapshot"],
|
|
38
|
+
"artifacts": ["code", "verification-ledger"],
|
|
39
|
+
"events": ["phase.start", "phase.end", "command", "verification"],
|
|
40
|
+
"allowedInteractions": [],
|
|
41
|
+
"capabilities": ["gate-begin", "gate-close", "ledger-record"]
|
|
42
|
+
},
|
|
43
|
+
"harness-test": {
|
|
44
|
+
"phase": "test",
|
|
45
|
+
"inputs": ["test-scenarios", "verification-ledger"],
|
|
46
|
+
"artifacts": ["test-reports", "verification-ledger"],
|
|
47
|
+
"events": ["phase.start", "phase.end", "command", "verification"],
|
|
48
|
+
"allowedInteractions": [],
|
|
49
|
+
"capabilities": ["gate-begin", "gate-close", "test-guard", "ledger-record"]
|
|
50
|
+
},
|
|
51
|
+
"harness-review": {
|
|
52
|
+
"phase": "review",
|
|
53
|
+
"inputs": ["diff", "verification-ledger", "test-reports"],
|
|
54
|
+
"artifacts": ["review-report"],
|
|
55
|
+
"events": ["phase.start", "phase.end", "issue", "artifact"],
|
|
56
|
+
"allowedInteractions": [],
|
|
57
|
+
"capabilities": ["gate-begin", "gate-close"]
|
|
58
|
+
},
|
|
59
|
+
"harness-submit": {
|
|
60
|
+
"phase": "submit",
|
|
61
|
+
"inputs": ["verification-ledger", "test-tracking"],
|
|
62
|
+
"artifacts": ["git-integration"],
|
|
63
|
+
"events": ["phase.start", "phase.end", "command", "artifact"],
|
|
64
|
+
"allowedInteractions": ["merge-conflict-resolution"],
|
|
65
|
+
"capabilities": ["gate-begin", "gate-close", "integration-lock", "test-guard-stage"]
|
|
66
|
+
},
|
|
67
|
+
"harness-package": {
|
|
68
|
+
"profiles": ["java"],
|
|
69
|
+
"phase": "package",
|
|
70
|
+
"inputs": ["verification-ledger", "final-commit"],
|
|
71
|
+
"artifacts": ["deploy-artifact"],
|
|
72
|
+
"events": ["phase.start", "phase.end", "command", "verification"],
|
|
73
|
+
"allowedInteractions": [],
|
|
74
|
+
"capabilities": ["gate-begin", "gate-close", "ledger-can-reuse"]
|
|
75
|
+
},
|
|
76
|
+
"harness-archive": {
|
|
77
|
+
"phase": "archive",
|
|
78
|
+
"inputs": ["events", "verification-ledger", "reports"],
|
|
79
|
+
"artifacts": ["summary-data", "archive-manifest"],
|
|
80
|
+
"events": ["phase.start", "phase.end", "artifact"],
|
|
81
|
+
"allowedInteractions": [],
|
|
82
|
+
"capabilities": ["gate-begin", "gate-close"]
|
|
83
|
+
},
|
|
84
|
+
"harness-sync": {
|
|
85
|
+
"phase": "sync",
|
|
86
|
+
"inputs": ["canonical-harness"],
|
|
87
|
+
"artifacts": ["bundle-projection"],
|
|
88
|
+
"events": ["phase.start", "phase.end", "command"],
|
|
89
|
+
"allowedInteractions": [],
|
|
90
|
+
"capabilities": []
|
|
91
|
+
},
|
|
92
|
+
"harness-codebase-map": {
|
|
93
|
+
"phase": "codebase-map",
|
|
94
|
+
"inputs": ["project-root"],
|
|
95
|
+
"artifacts": ["codebase-map"],
|
|
96
|
+
"events": ["phase.start", "phase.end"],
|
|
97
|
+
"allowedInteractions": [],
|
|
98
|
+
"capabilities": []
|
|
99
|
+
},
|
|
100
|
+
"harness-knowledge-query": {
|
|
101
|
+
"phase": "knowledge-query",
|
|
102
|
+
"inputs": ["knowledge-index"],
|
|
103
|
+
"artifacts": [],
|
|
104
|
+
"events": ["phase.start", "phase.end"],
|
|
105
|
+
"allowedInteractions": [],
|
|
106
|
+
"capabilities": ["read-only"]
|
|
107
|
+
},
|
|
108
|
+
"harness-knowledge-ingest": {
|
|
109
|
+
"phase": "knowledge-ingest",
|
|
110
|
+
"inputs": ["archive-evidence"],
|
|
111
|
+
"artifacts": ["knowledge-index"],
|
|
112
|
+
"events": ["phase.start", "phase.end", "command"],
|
|
113
|
+
"allowedInteractions": [],
|
|
114
|
+
"capabilities": []
|
|
115
|
+
},
|
|
116
|
+
"harness-apidoc": {
|
|
117
|
+
"profiles": ["java"],
|
|
118
|
+
"phase": "apidoc",
|
|
119
|
+
"inputs": ["api-diff"],
|
|
120
|
+
"artifacts": ["api-contract-summary"],
|
|
121
|
+
"events": ["phase.start", "phase.end", "artifact"],
|
|
122
|
+
"allowedInteractions": [],
|
|
123
|
+
"capabilities": ["gate-begin", "gate-close"]
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
"requiredArtifacts": {
|
|
127
|
+
"plan": ["plans", "spec"],
|
|
128
|
+
"run": [],
|
|
129
|
+
"test": ["tests/test-report-*.md"],
|
|
130
|
+
"review": ["reports/review/review-report-*.md"],
|
|
131
|
+
"submit": [],
|
|
132
|
+
"package": [],
|
|
133
|
+
"archive": ["reports/final/summary-data.json"]
|
|
134
|
+
},
|
|
135
|
+
"requiredValidations": {
|
|
136
|
+
"run": ["compile", "unitTest"],
|
|
137
|
+
"test": ["unitTestFull"],
|
|
138
|
+
"submit": [],
|
|
139
|
+
"package": ["package"]
|
|
140
|
+
},
|
|
141
|
+
"conditionalStages": {
|
|
142
|
+
"review": {
|
|
143
|
+
"tiers": ["standard", "full"],
|
|
144
|
+
"signals": ["security", "auth", "breaking-api", "shared-state"]
|
|
145
|
+
},
|
|
146
|
+
"package": {
|
|
147
|
+
"tiers": ["standard", "full"],
|
|
148
|
+
"signals": ["deploy-required", "install-verification"]
|
|
149
|
+
},
|
|
150
|
+
"apidoc": {
|
|
151
|
+
"tiers": ["standard", "full"],
|
|
152
|
+
"signals": ["api-diff-present"]
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
"interactionWhitelist": {
|
|
156
|
+
"global": [],
|
|
157
|
+
"harness-submit": ["merge-conflict-resolution"],
|
|
158
|
+
"harness-plan": ["risk-confirmation"]
|
|
159
|
+
},
|
|
160
|
+
"checkpointRules": {
|
|
161
|
+
"foundation-gate": {
|
|
162
|
+
"afterTasks": [1, 2, 3, 4],
|
|
163
|
+
"beforeTasks": [6, 7, 8, 9, 10],
|
|
164
|
+
"blocking": true,
|
|
165
|
+
"requiredReport": "reports/review/foundation-gate-review.md",
|
|
166
|
+
"reviewerTool": "codex"
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
@@ -20,7 +20,7 @@ disallowed-tools:
|
|
|
20
20
|
- Bash(awk *)
|
|
21
21
|
- Bash(curl *)
|
|
22
22
|
---
|
|
23
|
-
<!-- generated by harness_deploy.py; core=
|
|
23
|
+
<!-- generated by harness_deploy.py; core=48a6bb3c8d0d04e0; overlay=java; agent=claude-code; do not edit -->
|
|
24
24
|
# harness-apidoc — 前端接口文档(Java overlay)
|
|
25
25
|
|
|
26
26
|
## Purpose
|
|
@@ -48,6 +48,12 @@ disallowed-tools:
|
|
|
48
48
|
|
|
49
49
|
## Workflow
|
|
50
50
|
|
|
51
|
+
先用 `harness_change.py resolve [--change] --json` 解析 change;多个 active change 未显式选择时返回 `CHANGE_SELECTION_REQUIRED`。确认存在真实 API diff;无变化时记录跳过,不生成空文档。阶段边界使用 `harness_gate.py begin --phase apidoc --change <id> --task <n> --skills-root <skills-root> --executor-tool <tool> --json` 与 `harness_gate.py close --phase apidoc --change <id> --status <OK|WARN|FAIL> --run-id <begin-run-id> --json`,禁止手工追加阶段事件。
|
|
52
|
+
|
|
53
|
+
默认输出 40–80 行契约差异摘要,只保留前端动作、变化接口、请求/响应边界、变化的枚举/错误码、兼容性和证据链接;显式 `--full` 才生成完整七章节。文件名使用 `YYYY-MM-DD-<变更语义安全名称>.md`,不以 commit hash 充当标题。
|
|
54
|
+
|
|
55
|
+
文件名必须由 `harness_apidoc.py filename --description "<做了什么变更>" --json` 生成,避免 Windows 非法字符、超长路径和不可读 hash 文件名。
|
|
56
|
+
|
|
51
57
|
1. 确定 change-name(Glob plans,读 frontmatter)
|
|
52
58
|
2. append `phase.start`
|
|
53
59
|
3. 扫描变更涉及 Controller/VO/ErrorCode(CodeGraph 优先)
|
|
@@ -20,7 +20,7 @@ disallowed-tools:
|
|
|
20
20
|
- Bash(awk *)
|
|
21
21
|
- Bash(curl *)
|
|
22
22
|
---
|
|
23
|
-
<!-- generated by harness_deploy.py; core=
|
|
23
|
+
<!-- generated by harness_deploy.py; core=48a6bb3c8d0d04e0; overlay=java; agent=claude-code; do not edit -->
|
|
24
24
|
# harness-archive — 变更归档
|
|
25
25
|
|
|
26
26
|
## Purpose
|
|
@@ -72,6 +72,8 @@ disallowed-tools:
|
|
|
72
72
|
|
|
73
73
|
## Workflow
|
|
74
74
|
|
|
75
|
+
先用 `harness_change.py resolve [--change] --json` 解析 change;多个 active change 未显式选择时返回 `CHANGE_SELECTION_REQUIRED`,禁止按 Glob/mtime 自动选择。`harness_archive.py finalize` 内部负责且仅负责一次 `harness_gate.py begin` 与 `harness_gate.py close`。调用者禁止重复调用阶段门禁,避免重复事件和幽灵 change 目录。
|
|
76
|
+
|
|
75
77
|
### Phase 0:读取规则和上下文
|
|
76
78
|
|
|
77
79
|
1. 读取本文件。
|
|
@@ -20,7 +20,7 @@ disallowed-tools:
|
|
|
20
20
|
- Bash(awk *)
|
|
21
21
|
- Bash(curl *)
|
|
22
22
|
---
|
|
23
|
-
<!-- generated by harness_deploy.py; core=
|
|
23
|
+
<!-- generated by harness_deploy.py; core=48a6bb3c8d0d04e0; overlay=java; agent=claude-code; do not edit -->
|
|
24
24
|
# harness-codebase-map — 代码库地图
|
|
25
25
|
|
|
26
26
|
## Purpose
|
|
@@ -20,7 +20,7 @@ disallowed-tools:
|
|
|
20
20
|
- Bash(awk *)
|
|
21
21
|
- Bash(curl *)
|
|
22
22
|
---
|
|
23
|
-
<!-- generated by harness_deploy.py; core=
|
|
23
|
+
<!-- generated by harness_deploy.py; core=48a6bb3c8d0d04e0; overlay=java; agent=claude-code; do not edit -->
|
|
24
24
|
# harness-knowledge-ingest
|
|
25
25
|
|
|
26
26
|
从 `.harness/archive/**/reports/final/summary-data.json` 抽取项目知识,生成并维护本地 `.harness/knowledge/` 索引。
|
package/harness/bundles/java/claude-code/harness-knowledge-ingest/scripts/harness_knowledge.py
CHANGED
|
@@ -2982,6 +2982,7 @@ def query_index(
|
|
|
2982
2982
|
file_filters: list[str] | None = None,
|
|
2983
2983
|
statuses: list[str] | None = None,
|
|
2984
2984
|
types: list[str] | None = None,
|
|
2985
|
+
change_id: str | None = None,
|
|
2985
2986
|
) -> dict[str, Any]:
|
|
2986
2987
|
project = project.resolve()
|
|
2987
2988
|
knowledge = project / ".harness" / "knowledge"
|
|
@@ -2994,6 +2995,26 @@ def query_index(
|
|
|
2994
2995
|
build_index(project, snapshot=snapshot)
|
|
2995
2996
|
entries = search_entries(sqlite_path, query, limit, file_filters, statuses, types)
|
|
2996
2997
|
context_path = write_context_pack(project, knowledge, query, entries)
|
|
2998
|
+
if change_id:
|
|
2999
|
+
changes_root = (project / ".harness" / "changes").resolve()
|
|
3000
|
+
change_dir = (changes_root / change_id).resolve()
|
|
3001
|
+
try:
|
|
3002
|
+
change_dir.relative_to(changes_root)
|
|
3003
|
+
except ValueError as exc:
|
|
3004
|
+
raise ValueError("change id escapes .harness/changes") from exc
|
|
3005
|
+
if not change_dir.is_dir():
|
|
3006
|
+
raise ValueError(f"change does not exist: {change_id}")
|
|
3007
|
+
write_json(
|
|
3008
|
+
change_dir / "meta" / "knowledge-context.json",
|
|
3009
|
+
{
|
|
3010
|
+
"schemaVersion": 1,
|
|
3011
|
+
"changeId": change_id,
|
|
3012
|
+
"generatedAt": now_iso(),
|
|
3013
|
+
"query": query,
|
|
3014
|
+
"contextPack": str(context_path),
|
|
3015
|
+
"matchIds": [entry["id"] for entry in entries],
|
|
3016
|
+
},
|
|
3017
|
+
)
|
|
2997
3018
|
filters = {
|
|
2998
3019
|
"files": file_filters or [],
|
|
2999
3020
|
"statuses": statuses or [],
|
|
@@ -4391,6 +4412,7 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
4391
4412
|
query.add_argument("--file", action="append", dest="files", default=[], help="Only return entries linked to this source file")
|
|
4392
4413
|
query.add_argument("--status", action="append", dest="statuses", default=[], help="Only return entries with this lifecycle status")
|
|
4393
4414
|
query.add_argument("--type", action="append", dest="types", default=[], help="Only return entries of this knowledge type")
|
|
4415
|
+
query.add_argument("--change", default=None, help="Write a change-scoped knowledge-context pointer")
|
|
4394
4416
|
|
|
4395
4417
|
promote = sub.add_parser("promote", help="Promote a candidate knowledge entry to active")
|
|
4396
4418
|
promote.add_argument("--project", default=".", help="Project root containing .harness/knowledge")
|
|
@@ -4487,7 +4509,10 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
4487
4509
|
print(json.dumps(result, ensure_ascii=False, indent=2))
|
|
4488
4510
|
return 0
|
|
4489
4511
|
if args.command == "query":
|
|
4490
|
-
result = query_index(
|
|
4512
|
+
result = query_index(
|
|
4513
|
+
Path(args.project), args.query, args.limit, args.files, args.statuses,
|
|
4514
|
+
args.types, args.change,
|
|
4515
|
+
)
|
|
4491
4516
|
print(json.dumps(result, ensure_ascii=False, indent=2))
|
|
4492
4517
|
return 0
|
|
4493
4518
|
if args.command == "promote":
|
package/harness/bundles/java/claude-code/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py
CHANGED
|
@@ -219,6 +219,7 @@ def create_server() -> Any:
|
|
|
219
219
|
files: list[str] | None = None,
|
|
220
220
|
statuses: list[str] | None = None,
|
|
221
221
|
types: list[str] | None = None,
|
|
222
|
+
change_id: str | None = None,
|
|
222
223
|
) -> dict[str, Any]:
|
|
223
224
|
return hk.query_index(
|
|
224
225
|
Path(project),
|
|
@@ -227,6 +228,7 @@ def create_server() -> Any:
|
|
|
227
228
|
file_filters=files or [],
|
|
228
229
|
statuses=statuses or [],
|
|
229
230
|
types=types or [],
|
|
231
|
+
change_id=change_id,
|
|
230
232
|
)
|
|
231
233
|
|
|
232
234
|
@server.tool(description=TOOL_DESCRIPTIONS[7]["description"])
|
|
@@ -20,9 +20,11 @@ disallowed-tools:
|
|
|
20
20
|
- Bash(awk *)
|
|
21
21
|
- Bash(curl *)
|
|
22
22
|
---
|
|
23
|
-
<!-- generated by harness_deploy.py; core=
|
|
23
|
+
<!-- generated by harness_deploy.py; core=48a6bb3c8d0d04e0; overlay=java; agent=claude-code; do not edit -->
|
|
24
24
|
# harness-knowledge-query
|
|
25
25
|
|
|
26
|
+
并行 change 中查询必须传 `--change <change-id>`;成功后以该 change 的 `meta/knowledge-context.json` 为稳定指针。全局 `context-packs/latest.json` 仅向后兼容,不得用于判断多个 active change 的上下文归属。
|
|
27
|
+
|
|
26
28
|
根据用户的新需求或排查问题,从项目本地 `.harness/knowledge` 中检索历史需求、决策、实现、风险和测试证据,并生成 AI 可读的 context pack。
|
|
27
29
|
|
|
28
30
|
此 skill 只负责查询和使用知识。整理、同步和 promote 条目由 `harness-knowledge-ingest` 负责。
|
|
@@ -20,7 +20,7 @@ disallowed-tools:
|
|
|
20
20
|
- Bash(awk *)
|
|
21
21
|
- Bash(curl *)
|
|
22
22
|
---
|
|
23
|
-
<!-- generated by harness_deploy.py; core=
|
|
23
|
+
<!-- generated by harness_deploy.py; core=48a6bb3c8d0d04e0; overlay=java; agent=claude-code; do not edit -->
|
|
24
24
|
# harness-package — 增量模块打包(Java overlay)
|
|
25
25
|
|
|
26
26
|
## Purpose
|
|
@@ -55,10 +55,13 @@ disallowed-tools:
|
|
|
55
55
|
|
|
56
56
|
## Workflow
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
0. `harness_change.py resolve` → **`harness_gate.py begin --phase package --change <id>`**
|
|
59
|
+
1. 读 ledger + build-profile 的 `commands.package`(v2,按 profile key resolve);验证经 `harness_ledger.py can-reuse` / `record`(禁止手写 ledger)
|
|
59
60
|
2. 识别变更模块(git diff + pom 结构)
|
|
60
61
|
3. **单次** Maven package lifecycle(spec §3.3 去重,不预先 compile/test):full test 可复用(`can-reuse unitTestFull=true`)→ 按 `commands.package` resolve 执行一次 skip-tests package;不可复用 → 按 `commands.package` resolve 执行一次含测试 package
|
|
61
|
-
4. 写打包报告
|
|
62
|
+
4. 写打包报告 → **`harness_gate.py close --phase package --status ...`**(禁止手工 phase.end)
|
|
63
|
+
|
|
64
|
+
> `MISSING_V2_FIELDS` 时必须重新 `record`/执行验证,禁止用自然语言绕过。
|
|
62
65
|
|
|
63
66
|
## P0 执行可信度规则
|
|
64
67
|
|
|
@@ -20,11 +20,13 @@ disallowed-tools:
|
|
|
20
20
|
- Bash(awk *)
|
|
21
21
|
- Bash(curl *)
|
|
22
22
|
---
|
|
23
|
-
<!-- generated by harness_deploy.py; core=
|
|
23
|
+
<!-- generated by harness_deploy.py; core=48a6bb3c8d0d04e0; overlay=java; agent=claude-code; do not edit -->
|
|
24
24
|
# harness-plan — 需求规划
|
|
25
25
|
|
|
26
26
|
## Purpose
|
|
27
27
|
|
|
28
|
+
确定 change 后必须运行 `python <skills-root>/scripts/harness_gate.py classify --change <id> --stage plan --json`,并把脚本返回的 risk tier、默认阶段、条件阶段和必需验证写入计划;不得凭模型印象另建风险分级。
|
|
29
|
+
|
|
28
30
|
需求 → 设计文档 → 任务拆分 → 测试场景表(编码/测试唯一真相源)。存在 `.harness/archive/` 或 `.harness/knowledge/` 时须先 `harness-knowledge-query`。
|
|
29
31
|
|
|
30
32
|
## When to Use
|
|
@@ -21,7 +21,7 @@ disallowed-tools:
|
|
|
21
21
|
- Bash(curl *)
|
|
22
22
|
- Bash(codegraph *)
|
|
23
23
|
---
|
|
24
|
-
<!-- generated by harness_deploy.py; core=
|
|
24
|
+
<!-- generated by harness_deploy.py; core=48a6bb3c8d0d04e0; overlay=java; agent=claude-code; do not edit -->
|
|
25
25
|
# harness-review — 代码审查
|
|
26
26
|
|
|
27
27
|
## Purpose
|
|
@@ -63,6 +63,8 @@ disallowed-tools:
|
|
|
63
63
|
|
|
64
64
|
## Workflow
|
|
65
65
|
|
|
66
|
+
先用 `harness_change.py resolve [--change] --json` 解析 change;多个 active change 未显式选择时返回 `CHANGE_SELECTION_REQUIRED`,禁止再按 Glob/mtime 猜测。阶段边界固定使用 `harness_gate.py begin --phase review --change <id> --task <n> --skills-root <skills-root> --executor-tool <tool> --json` 和 `harness_gate.py close --phase review --change <id> --status <OK|WARN|FAIL> --run-id <begin-run-id> --json`。不得手工追加 `phase.start/phase.end`;close 失败不得宣称审查完成。
|
|
67
|
+
|
|
66
68
|
0. **启动准备** — 确定变更名(Glob `.harness/changes/*/plans/*-plan.md`,排除 `.harness/archive/*/`,读 frontmatter 提取 change-name);**append `phase.start` 事件**(不得等审查完成才补)
|
|
67
69
|
1. **读取 worktree 状态(门禁检查)** — 读 `.harness/changes/<change-name>/meta/worktree.json`:`requested=true` 但 worktree 不存在 → 停止并提示先修复 `harness-run`,不得静默回主目录(否则 git diff 为空);`requested=true` 且 worktree 已创建 → spawned agent 用该 worktree 路径执行 `git diff`(确保审查 worktree 变更而非主目录);`requested=false` → 审查主目录变更
|
|
68
70
|
<!-- @section-id review.delegate -->
|
|
@@ -21,7 +21,7 @@ disallowed-tools:
|
|
|
21
21
|
- Bash(curl *)
|
|
22
22
|
- Bash(codegraph *)
|
|
23
23
|
---
|
|
24
|
-
<!-- generated by harness_deploy.py; core=
|
|
24
|
+
<!-- generated by harness_deploy.py; core=48a6bb3c8d0d04e0; overlay=java; agent=claude-code; do not edit -->
|
|
25
25
|
# harness-run — 需求编码
|
|
26
26
|
|
|
27
27
|
## Purpose
|
|
@@ -73,15 +73,17 @@ disallowed-tools:
|
|
|
73
73
|
|
|
74
74
|
## Workflow 概要
|
|
75
75
|
|
|
76
|
-
0.
|
|
77
|
-
0.5. **测试基础设施探测**(先写 `CHECKING`,四项证据齐备后再结论)→ `reference.md` Step 0.5
|
|
76
|
+
0. 加载上下文:先 `harness_change.py resolve [--change] --json`(多 active 缺参 → `CHANGE_SELECTION_REQUIRED`,禁止按 mtime 猜测);读 spec/plan/detail/scenarios/ledger/run-task-status/worktree;`--fixback` 读 fixback → **`harness_gate.py begin --phase run --change <id>`**(内部 claim + phase.start + identity;禁止手工 Write `events.ndjson` / 手工 `phase.end`)
|
|
77
|
+
0.5. **测试基础设施探测**(先写 `CHECKING`,四项证据齐备后再结论)→ `reference.md` Step 0.5;进入 TDD 前执行 `harness_test_guard.py begin --project . --change-dir ".harness/changes/<cn>" --json`
|
|
78
78
|
1. **变更簇 TDD** — `protocols.md` `run-tdd-protocol`;批量 RED/GREEN;按需 `change-cluster-review-protocol`(高风险 + reviewer 预检可用)
|
|
79
|
-
2. 构建验证 +
|
|
79
|
+
2. 构建验证 + **仅**通过 `harness_ledger.py record` 写 ledger(禁止 Write/Edit `verification-ledger.json`);`diff-hash --change-dir` 纳入 ignored tests → `reference.md` Step 2c
|
|
80
80
|
3. **场景覆盖检查**(场景表映射,禁止用用例数冒充场景数)
|
|
81
|
-
4. **关门检查**(10
|
|
81
|
+
4. **关门检查**(10 项)→ `harness_test_guard.py close` → **`harness_gate.py close --phase run --change <id> --status <OK|WARN|FAIL>`**(内部 phase.end + 释放租约;close 失败不得用自然语言宣称成功)
|
|
82
82
|
|
|
83
83
|
**Fixback**:`--fixback` 或用户要求时读 `reports/review/fixback-*.md`;RED 优先;未选用则记 `fixback: advisory-not-applied`。
|
|
84
84
|
|
|
85
|
+
**Foundation Gate**:若 `meta/implementation-checkpoints.json` 中 `foundation-gate` 为 pending,不得开始 plan 中任务 6+;由 `harness_gate.py` 硬阻断。
|
|
86
|
+
|
|
85
87
|
### Java 构建验证(Maven)
|
|
86
88
|
|
|
87
89
|
- 所有 `mvn`/`git` 经 `powershell.exe -NoProfile -Command`;命令读 `.harness/config/build-profile.json` 的 `commands`(v2,按 profile key resolve;**禁止 hardcode 模块名/端口**)
|
|
@@ -106,7 +108,8 @@ disallowed-tools:
|
|
|
106
108
|
| **变更簇 TDD** | 一簇一次 RED/GREEN;低价值项豁免;新分支必须 RED |
|
|
107
109
|
| **RED/GREEN** | RED 须有效;静态验证 ≠ 测试通过;greenfield 大重写豁免见 reference |
|
|
108
110
|
| **Mapper/DB** | 纯 Mock 不得宣称 DB 验证通过;迁移脚本**永不自动执行** |
|
|
109
|
-
| **探测/ledger** |
|
|
111
|
+
| **探测/ledger** | 基础设施先探测;每次构建/测试经 `harness_ledger.py record`;禁止手写 ledger JSON;用 canonical `diff-hash --change-dir` |
|
|
112
|
+
| **Gate/Guard** | 阶段边界只用 `harness_gate.py begin/close`;测试跟踪用 `harness_test_guard.py begin/close/record/stage` |
|
|
110
113
|
| **预存变更** | 保留 → baseline 隔离;存在则最终 ≥ 🟡WARN |
|
|
111
114
|
| **关门/状态** | 10 项关门检查;持久化 run-task-status;P0 静态-only 不得建议 submit |
|
|
112
115
|
| **Worktree** | `requested=true` 时代码只写 worktree |
|
|
@@ -20,7 +20,7 @@ disallowed-tools:
|
|
|
20
20
|
- Bash(awk *)
|
|
21
21
|
- Bash(curl *)
|
|
22
22
|
---
|
|
23
|
-
<!-- generated by harness_deploy.py; core=
|
|
23
|
+
<!-- generated by harness_deploy.py; core=48a6bb3c8d0d04e0; overlay=java; agent=claude-code; do not edit -->
|
|
24
24
|
# harness-submit — 最终提交(含 worktree 合并)
|
|
25
25
|
|
|
26
26
|
## Purpose
|
|
@@ -67,18 +67,20 @@ disallowed-tools:
|
|
|
67
67
|
|
|
68
68
|
## Workflow
|
|
69
69
|
|
|
70
|
+
worktree 合并前必须运行 `harness_change.py integration-lock acquire --run-id <run-id> --json`;获取失败即停止。无论成功、冲突或异常,都在 `finally` 运行 `harness_change.py integration-lock release --run-id <run-id> --json`。持有 integration lock 后不得反向申请 change lease。
|
|
71
|
+
|
|
70
72
|
**模式判定**:读 `meta/worktree.json`。`requested=false` → 步骤 0–7(主目录);`requested=true` → 步骤 0–6 在 worktree 执行,成功后**不结束**,接续「worktree 合并流程」。用户仅调用 `/harness-merge` 且 worktree 已有本地 commit 时,从合并流程步骤 M0 重入。
|
|
71
73
|
|
|
72
74
|
### 提交流程(步骤 0–7)
|
|
73
75
|
|
|
74
|
-
0. **启动准备** —
|
|
76
|
+
0. **启动准备** — `harness_change.py resolve` 确定变更名;**`harness_gate.py begin --phase submit --change <id>`**;读 ledger,以 `harness_ledger.py diff-hash --repo . --base <baseCommit> --change-dir ".harness/changes/<change-name>" --json` 计算 diffHash + post-test 7 类分类(禁止手写 ledger / 手工 phase.end)
|
|
75
77
|
1. **合并最新代码** — 主目录:`stash` → `pull --rebase` → `stash pop`;**worktree:N/A**(远端同步在合并段主分支完成)
|
|
76
|
-
2. **最终验证** — ledger 复用优先;**提交前最终门禁只调 `can-reuse`**(删除与 coverage 冲突的二次全量门禁):`harness_ledger.py can-reuse --verification unitTestFull --scope module --project . --profile-input unitTestFull --command <resolved commands.unitTestFull.command>`。`--command` **按 profile key resolve**:读 `build-profile.json` 的 `commands.unitTestFull.command`(v2),或 `harness_profile.py resolve --project . --key unitTestFull --json` 取 resolved command,**不复制示例模块名**(文档示例只展示 key)。`--profile-input unitTestFull` 从 `verificationInputs.unitTestFull`(v2 由 `commands.unitTestFull.inputs` 派生)展开依赖闭包,**禁止用仅含 staged 文件的 `--files` 快捷方式**冒充全量闭包。`reuse=true` → 不再执行二次全量测试;仅 `reuse=false` 时执行**同一 resolved verification**(profile `unitTestFull` 命令),成功后用同一文件集、command、`scope=module` 写回 ledger `unitTestFull` 项。增量 `unitTest` 永远不能冒充 `unitTestFull` 门禁。
|
|
78
|
+
2. **最终验证** — ledger 复用优先;**提交前最终门禁只调 `can-reuse`**(删除与 coverage 冲突的二次全量门禁):`harness_ledger.py can-reuse --verification unitTestFull --scope module --project . --profile-input unitTestFull --command <resolved commands.unitTestFull.command>`。`--command` **按 profile key resolve**:读 `build-profile.json` 的 `commands.unitTestFull.command`(v2),或 `harness_profile.py resolve --project . --key unitTestFull --json` 取 resolved command,**不复制示例模块名**(文档示例只展示 key)。`--profile-input unitTestFull` 从 `verificationInputs.unitTestFull`(v2 由 `commands.unitTestFull.inputs` 派生)展开依赖闭包,**禁止用仅含 staged 文件的 `--files` 快捷方式**冒充全量闭包。`reuse=true` → 不再执行二次全量测试;仅 `reuse=false` 时执行**同一 resolved verification**(profile `unitTestFull` 命令),成功后用同一文件集、command、`scope=module` 经 **`harness_ledger.py record`** 写回 ledger `unitTestFull` 项。增量 `unitTest` 永远不能冒充 `unitTestFull` 门禁。
|
|
77
79
|
3. **.gitignore + 精确暂存** ⚠️ — 检查 `.harness/` 在 `.gitignore`;**禁止 `git add -A`**。若存在 `evidence/test-tracking.json`,先执行 `python <skills-root>/scripts/harness_test_guard.py stage --project . --change-dir ".harness/changes/<change-name>" --json`;失败即硬停止。无 manifest 时不使用 `-f`。manifest 之外的文件按精确业务路径正常暂存,**禁止全局 force-add**。
|
|
78
80
|
4. **提交方式** — 主目录:AskUserQuestion 三选项(commit+push / 仅本地 / 取消);**worktree:固定仅本地 commit**
|
|
79
81
|
5. **commit-message.txt** ⚠️ — 展示 staged、diff stat、完整中文 message;用户确认
|
|
80
82
|
6. **commit / push** — `git commit -F`;主目录按选项 push(push 前 fetch 检查远端);**worktree:只 commit,记录 local hash**
|
|
81
|
-
7.
|
|
83
|
+
7. **收尾** — **`harness_gate.py close --phase submit --status ...`**;主目录:可选 worktree 清理 + 提示 `/harness-archive`;**worktree:接续下方合并流程**
|
|
82
84
|
|
|
83
85
|
详细步骤见 `checklist.md`。
|
|
84
86
|
|
|
@@ -92,7 +94,7 @@ M4. **冲突处理** — 若 `CONFLICT` → **停下**,列出冲突文件,
|
|
|
92
94
|
M5. **合并后验证** — 他人提交引入 → 必须重跑构建+测试;否则 ledger 复用 🔁REUSED
|
|
93
95
|
M6. **push 主分支** — fetch 后 `log HEAD..@{u}` 非空则回 M2;否则 push,记录 `mergeFinalHash`
|
|
94
96
|
M7. **清理 worktree** — `worktree remove` + `branch -D`(Windows 兜底见 `reference.md`);更新 `worktree.json`(`created=false` + removedAt 等)
|
|
95
|
-
M8. **ledger + 收尾** — 写入 `mergeFinalHash
|
|
97
|
+
M8. **ledger + 收尾** — 经 `harness_ledger.py record` 写入 `mergeFinalHash`;**`harness_gate.py close --phase merge`**(禁止手工 phase.end);提示 `/harness-archive`
|
|
96
98
|
|
|
97
99
|
### Java 提交前验证补充
|
|
98
100
|
|
|
@@ -19,7 +19,7 @@ disallowed-tools:
|
|
|
19
19
|
- Bash(awk *)
|
|
20
20
|
- Bash(curl *)
|
|
21
21
|
---
|
|
22
|
-
<!-- generated by harness_deploy.py; core=
|
|
22
|
+
<!-- generated by harness_deploy.py; core=48a6bb3c8d0d04e0; overlay=java; agent=claude-code; do not edit -->
|
|
23
23
|
# harness-sync — 元数据同步
|
|
24
24
|
|
|
25
25
|
## Purpose
|
|
@@ -22,7 +22,7 @@ disallowed-tools:
|
|
|
22
22
|
- Bash(node *)
|
|
23
23
|
- Bash(codegraph *)
|
|
24
24
|
---
|
|
25
|
-
<!-- generated by harness_deploy.py; core=
|
|
25
|
+
<!-- generated by harness_deploy.py; core=48a6bb3c8d0d04e0; overlay=java; agent=claude-code; do not edit -->
|
|
26
26
|
# harness-test — 测试执行
|
|
27
27
|
|
|
28
28
|
## Purpose
|
|
@@ -62,9 +62,15 @@ disallowed-tools:
|
|
|
62
62
|
|
|
63
63
|
## Workflow
|
|
64
64
|
|
|
65
|
+
测试跟踪的确定性边界为 `harness_test_guard.py begin` 和 `harness_test_guard.py close`;任一失败都必须传递给 `harness_gate.py close`,不得以自然语言覆盖失败状态。
|
|
66
|
+
|
|
67
|
+
并行服务测试先运行 `harness_change.py lease-port --change <id> --run-id <run-id> --range <start-end> --json`,再把返回端口传给 `harness_service.py ensure --leased-port <port> --lease-owner <run-id>`。`serviceStart` 的 command/health/overlay 可用 `{leasedPort}` 占位符;用户自启进程仍只进入 Service Gate,禁止 kill。测试清理的 `finally` 中运行 `harness_change.py release-port --change <id> --run-id <run-id> --json`,避免租约池耗尽。
|
|
68
|
+
|
|
65
69
|
### Phase 0:环境准备(主会话执行,需要交互确认)
|
|
66
70
|
|
|
67
|
-
|
|
71
|
+
先 `harness_change.py resolve [--change] --json` 解析 change-id;再 **`harness_gate.py begin --phase test --change <id>`**(禁止手工 phase.start / 手写 ledger)。执行各项强制环境检查 + **命令执行模式 preflight (0.1)**;只有首选执行器不可用时,才执行 fallback 执行器探测。
|
|
72
|
+
|
|
73
|
+
验证写入**仅**允许 `harness_ledger.py record` / `can-reuse`;禁止 Write/Edit `verification-ledger.json`。测试跟踪:`harness_test_guard.py begin` → 执行 → `close`(可选 `mark` stale-test-repair)。阶段结束必须 `harness_gate.py close --phase test --status ...`。
|
|
68
74
|
|
|
69
75
|
- **Read `checklist.md`** — 各项检查详情 + 0.1 preflight + Playwright 探测 + 避坑规则指引
|
|
70
76
|
- **失败处理**:任一项检查失败 → 终止流程并报告原因,用户确认修复后才能继续
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Small deterministic helpers for compact API contract reports."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import argparse
|
|
7
|
+
import datetime as dt
|
|
8
|
+
import json
|
|
9
|
+
import re
|
|
10
|
+
import sys
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
COMMIT_ONLY = re.compile(r"^[0-9a-f]{7,64}$", re.IGNORECASE)
|
|
14
|
+
INVALID_FILENAME = re.compile(r"[<>:\"/\\|?*\x00-\x1f]+")
|
|
15
|
+
SEPARATORS = re.compile(r"[\s_-]+")
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def build_filename(description: str, *, date: str | None = None) -> str:
|
|
19
|
+
raw = str(description or "").strip()
|
|
20
|
+
if not raw or COMMIT_ONLY.fullmatch(raw):
|
|
21
|
+
raise ValueError("a human-readable API change description is required")
|
|
22
|
+
slug = INVALID_FILENAME.sub("-", raw)
|
|
23
|
+
slug = SEPARATORS.sub("-", slug).strip(" .-")
|
|
24
|
+
if not slug:
|
|
25
|
+
raise ValueError("description does not contain filename-safe text")
|
|
26
|
+
day = date or dt.date.today().isoformat()
|
|
27
|
+
slug = slug[:86].rstrip(" .-")
|
|
28
|
+
return f"{day}-{slug}.md"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def main(argv: list[str] | None = None) -> int:
|
|
32
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
33
|
+
sub = parser.add_subparsers(dest="command", required=True)
|
|
34
|
+
filename = sub.add_parser("filename", help="build a safe dated report filename")
|
|
35
|
+
filename.add_argument("--description", required=True)
|
|
36
|
+
filename.add_argument("--date", default=None)
|
|
37
|
+
filename.add_argument("--json", action="store_true")
|
|
38
|
+
args = parser.parse_args(argv)
|
|
39
|
+
try:
|
|
40
|
+
value = build_filename(args.description, date=args.date)
|
|
41
|
+
except ValueError as exc:
|
|
42
|
+
sys.stderr.write(json.dumps({"ok": False, "error": str(exc)}) + "\n")
|
|
43
|
+
return 1
|
|
44
|
+
payload = {"ok": True, "filename": value}
|
|
45
|
+
if args.json:
|
|
46
|
+
sys.stdout.write(json.dumps(payload, ensure_ascii=False) + "\n")
|
|
47
|
+
else:
|
|
48
|
+
sys.stdout.write(value + "\n")
|
|
49
|
+
return 0
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
if __name__ == "__main__":
|
|
53
|
+
raise SystemExit(main())
|