@hunter-harness/workflow-harness 0.2.8 → 0.2.10
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 +3 -3
- package/harness/bundles/general/claude-code/harness-archive/SKILL.md +3 -3
- package/harness/bundles/general/claude-code/harness-archive/reference.md +30 -12
- package/harness/bundles/general/claude-code/harness-archive/templates/render-summary.mjs +5 -1
- package/harness/bundles/general/claude-code/harness-archive/templates/summary-data-template.json +6 -2
- package/harness/bundles/general/claude-code/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-knowledge-ingest/SKILL.md +3 -1
- package/harness/bundles/general/claude-code/harness-knowledge-ingest/reference.md +7 -0
- package/harness/bundles/general/claude-code/harness-knowledge-ingest/scripts/harness_knowledge.py +117 -0
- package/harness/bundles/general/claude-code/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-plan/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-plan/checklist.md +6 -0
- package/harness/bundles/general/claude-code/harness-review/SKILL.md +3 -3
- package/harness/bundles/general/claude-code/harness-run/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-run/checklist.md +5 -0
- package/harness/bundles/general/claude-code/harness-run/reference.md +33 -1
- package/harness/bundles/general/claude-code/harness-submit/SKILL.md +15 -10
- package/harness/bundles/general/claude-code/harness-submit/checklist.md +40 -76
- package/harness/bundles/general/claude-code/harness-sync/SKILL.md +17 -2
- package/harness/bundles/general/claude-code/harness-sync/reference.md +2 -2
- package/harness/bundles/general/claude-code/harness-test/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-test/checklist.md +9 -0
- package/harness/bundles/general/claude-code/harness-test/pitfalls-java.md +14 -0
- package/harness/bundles/general/claude-code/harness-test/reference.md +38 -0
- package/harness/bundles/general/claude-code/protocols/archive-report-protocol.md +26 -4
- package/harness/bundles/general/claude-code/protocols/ledger-protocol.md +38 -0
- package/harness/bundles/general/claude-code/protocols/powershell-protocol.md +16 -0
- package/harness/bundles/general/claude-code/protocols/report-pipeline-protocol.md +17 -0
- package/harness/bundles/general/claude-code/protocols/state-layout-protocol.md +15 -0
- package/harness/bundles/general/claude-code/scripts/harness_archive.py +1209 -170
- package/harness/bundles/general/claude-code/scripts/harness_change.py +18 -0
- package/harness/bundles/general/claude-code/scripts/harness_deploy.py +1 -44
- package/harness/bundles/general/claude-code/scripts/harness_events.py +174 -25
- package/harness/bundles/general/claude-code/scripts/harness_gate.py +203 -29
- package/harness/bundles/general/claude-code/scripts/harness_integration.py +878 -0
- package/harness/bundles/general/claude-code/scripts/harness_ledger.py +457 -10
- package/harness/bundles/general/claude-code/scripts/harness_paths.py +315 -0
- package/harness/bundles/general/claude-code/scripts/harness_profile.py +45 -0
- package/harness/bundles/general/claude-code/scripts/harness_review.py +326 -0
- package/harness/bundles/general/claude-code/scripts/harness_sync.py +407 -0
- package/harness/bundles/general/claude-code/scripts/harness_test_guard.py +244 -49
- package/harness/bundles/general/codebuddy/.harness-build.json +1 -1
- package/harness/bundles/general/codebuddy/contracts/workflow-policy.json +3 -3
- package/harness/bundles/general/codebuddy/harness-archive/SKILL.md +3 -3
- package/harness/bundles/general/codebuddy/harness-archive/reference.md +30 -12
- package/harness/bundles/general/codebuddy/harness-archive/templates/render-summary.mjs +5 -1
- package/harness/bundles/general/codebuddy/harness-archive/templates/summary-data-template.json +6 -2
- package/harness/bundles/general/codebuddy/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-knowledge-ingest/SKILL.md +3 -1
- package/harness/bundles/general/codebuddy/harness-knowledge-ingest/reference.md +7 -0
- package/harness/bundles/general/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge.py +117 -0
- package/harness/bundles/general/codebuddy/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-plan/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-plan/checklist.md +6 -0
- package/harness/bundles/general/codebuddy/harness-review/SKILL.md +3 -3
- package/harness/bundles/general/codebuddy/harness-run/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-run/checklist.md +5 -0
- package/harness/bundles/general/codebuddy/harness-run/reference.md +33 -1
- package/harness/bundles/general/codebuddy/harness-submit/SKILL.md +15 -10
- package/harness/bundles/general/codebuddy/harness-submit/checklist.md +40 -76
- package/harness/bundles/general/codebuddy/harness-sync/SKILL.md +17 -2
- package/harness/bundles/general/codebuddy/harness-sync/reference.md +2 -2
- package/harness/bundles/general/codebuddy/harness-test/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-test/checklist.md +9 -0
- package/harness/bundles/general/codebuddy/harness-test/pitfalls-java.md +14 -0
- package/harness/bundles/general/codebuddy/harness-test/reference.md +38 -0
- package/harness/bundles/general/codebuddy/protocols/archive-report-protocol.md +26 -4
- package/harness/bundles/general/codebuddy/protocols/ledger-protocol.md +38 -0
- package/harness/bundles/general/codebuddy/protocols/powershell-protocol.md +16 -0
- package/harness/bundles/general/codebuddy/protocols/report-pipeline-protocol.md +17 -0
- package/harness/bundles/general/codebuddy/protocols/state-layout-protocol.md +15 -0
- package/harness/bundles/general/codebuddy/scripts/harness_archive.py +1209 -170
- package/harness/bundles/general/codebuddy/scripts/harness_change.py +18 -0
- package/harness/bundles/general/codebuddy/scripts/harness_deploy.py +1 -44
- package/harness/bundles/general/codebuddy/scripts/harness_events.py +174 -25
- package/harness/bundles/general/codebuddy/scripts/harness_gate.py +203 -29
- package/harness/bundles/general/codebuddy/scripts/harness_integration.py +878 -0
- package/harness/bundles/general/codebuddy/scripts/harness_ledger.py +457 -10
- package/harness/bundles/general/codebuddy/scripts/harness_paths.py +315 -0
- package/harness/bundles/general/codebuddy/scripts/harness_profile.py +45 -0
- package/harness/bundles/general/codebuddy/scripts/harness_review.py +326 -0
- package/harness/bundles/general/codebuddy/scripts/harness_sync.py +407 -0
- package/harness/bundles/general/codebuddy/scripts/harness_test_guard.py +244 -49
- package/harness/bundles/general/codex/.harness-build.json +1 -1
- package/harness/bundles/general/codex/contracts/workflow-policy.json +3 -3
- package/harness/bundles/general/codex/harness-archive/SKILL.md +3 -3
- package/harness/bundles/general/codex/harness-archive/reference.md +30 -12
- package/harness/bundles/general/codex/harness-archive/templates/render-summary.mjs +5 -1
- package/harness/bundles/general/codex/harness-archive/templates/summary-data-template.json +6 -2
- package/harness/bundles/general/codex/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-knowledge-ingest/SKILL.md +3 -1
- package/harness/bundles/general/codex/harness-knowledge-ingest/reference.md +7 -0
- package/harness/bundles/general/codex/harness-knowledge-ingest/scripts/harness_knowledge.py +117 -0
- package/harness/bundles/general/codex/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-plan/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-plan/checklist.md +6 -0
- package/harness/bundles/general/codex/harness-review/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-run/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-run/checklist.md +5 -0
- package/harness/bundles/general/codex/harness-run/reference.md +33 -1
- package/harness/bundles/general/codex/harness-submit/SKILL.md +15 -10
- package/harness/bundles/general/codex/harness-submit/checklist.md +40 -76
- package/harness/bundles/general/codex/harness-sync/SKILL.md +17 -2
- package/harness/bundles/general/codex/harness-sync/reference.md +2 -2
- package/harness/bundles/general/codex/harness-test/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-test/checklist.md +9 -0
- package/harness/bundles/general/codex/harness-test/pitfalls-java.md +14 -0
- package/harness/bundles/general/codex/harness-test/reference.md +38 -0
- package/harness/bundles/general/codex/protocols/archive-report-protocol.md +26 -4
- package/harness/bundles/general/codex/protocols/ledger-protocol.md +38 -0
- package/harness/bundles/general/codex/protocols/powershell-protocol.md +16 -0
- package/harness/bundles/general/codex/protocols/report-pipeline-protocol.md +17 -0
- package/harness/bundles/general/codex/protocols/state-layout-protocol.md +15 -0
- package/harness/bundles/general/codex/scripts/harness_archive.py +1209 -170
- package/harness/bundles/general/codex/scripts/harness_change.py +18 -0
- package/harness/bundles/general/codex/scripts/harness_deploy.py +1 -44
- package/harness/bundles/general/codex/scripts/harness_events.py +174 -25
- package/harness/bundles/general/codex/scripts/harness_gate.py +203 -29
- package/harness/bundles/general/codex/scripts/harness_integration.py +878 -0
- package/harness/bundles/general/codex/scripts/harness_ledger.py +457 -10
- package/harness/bundles/general/codex/scripts/harness_paths.py +315 -0
- package/harness/bundles/general/codex/scripts/harness_profile.py +45 -0
- package/harness/bundles/general/codex/scripts/harness_review.py +326 -0
- package/harness/bundles/general/codex/scripts/harness_sync.py +407 -0
- package/harness/bundles/general/codex/scripts/harness_test_guard.py +244 -49
- package/harness/bundles/general/cursor/.harness-build.json +1 -1
- package/harness/bundles/general/cursor/contracts/workflow-policy.json +3 -3
- package/harness/bundles/general/cursor/harness-archive/SKILL.md +3 -3
- package/harness/bundles/general/cursor/harness-archive/reference.md +30 -12
- package/harness/bundles/general/cursor/harness-archive/templates/render-summary.mjs +5 -1
- package/harness/bundles/general/cursor/harness-archive/templates/summary-data-template.json +6 -2
- package/harness/bundles/general/cursor/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-knowledge-ingest/SKILL.md +3 -1
- package/harness/bundles/general/cursor/harness-knowledge-ingest/reference.md +7 -0
- package/harness/bundles/general/cursor/harness-knowledge-ingest/scripts/harness_knowledge.py +117 -0
- package/harness/bundles/general/cursor/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-plan/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-plan/checklist.md +6 -0
- package/harness/bundles/general/cursor/harness-review/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-run/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-run/checklist.md +5 -0
- package/harness/bundles/general/cursor/harness-run/reference.md +33 -1
- package/harness/bundles/general/cursor/harness-submit/SKILL.md +15 -10
- package/harness/bundles/general/cursor/harness-submit/checklist.md +40 -76
- package/harness/bundles/general/cursor/harness-sync/SKILL.md +17 -2
- package/harness/bundles/general/cursor/harness-sync/reference.md +2 -2
- package/harness/bundles/general/cursor/harness-test/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-test/checklist.md +9 -0
- package/harness/bundles/general/cursor/harness-test/pitfalls-java.md +14 -0
- package/harness/bundles/general/cursor/harness-test/reference.md +38 -0
- package/harness/bundles/general/cursor/protocols/archive-report-protocol.md +26 -4
- package/harness/bundles/general/cursor/protocols/ledger-protocol.md +38 -0
- package/harness/bundles/general/cursor/protocols/powershell-protocol.md +16 -0
- package/harness/bundles/general/cursor/protocols/report-pipeline-protocol.md +17 -0
- package/harness/bundles/general/cursor/protocols/state-layout-protocol.md +15 -0
- package/harness/bundles/general/cursor/scripts/harness_archive.py +1209 -170
- package/harness/bundles/general/cursor/scripts/harness_change.py +18 -0
- package/harness/bundles/general/cursor/scripts/harness_deploy.py +1 -44
- package/harness/bundles/general/cursor/scripts/harness_events.py +174 -25
- package/harness/bundles/general/cursor/scripts/harness_gate.py +203 -29
- package/harness/bundles/general/cursor/scripts/harness_integration.py +878 -0
- package/harness/bundles/general/cursor/scripts/harness_ledger.py +457 -10
- package/harness/bundles/general/cursor/scripts/harness_paths.py +315 -0
- package/harness/bundles/general/cursor/scripts/harness_profile.py +45 -0
- package/harness/bundles/general/cursor/scripts/harness_review.py +326 -0
- package/harness/bundles/general/cursor/scripts/harness_sync.py +407 -0
- package/harness/bundles/general/cursor/scripts/harness_test_guard.py +244 -49
- package/harness/bundles/java/claude-code/.harness-build.json +1 -1
- package/harness/bundles/java/claude-code/contracts/workflow-policy.json +3 -3
- package/harness/bundles/java/claude-code/harness-apidoc/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-archive/SKILL.md +3 -3
- package/harness/bundles/java/claude-code/harness-archive/reference.md +30 -12
- package/harness/bundles/java/claude-code/harness-archive/templates/render-summary.mjs +5 -1
- package/harness/bundles/java/claude-code/harness-archive/templates/summary-data-template.json +6 -2
- package/harness/bundles/java/claude-code/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-knowledge-ingest/SKILL.md +3 -1
- package/harness/bundles/java/claude-code/harness-knowledge-ingest/reference.md +7 -0
- package/harness/bundles/java/claude-code/harness-knowledge-ingest/scripts/harness_knowledge.py +117 -0
- package/harness/bundles/java/claude-code/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-package/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-plan/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-plan/checklist.md +6 -0
- package/harness/bundles/java/claude-code/harness-review/SKILL.md +3 -3
- package/harness/bundles/java/claude-code/harness-run/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-submit/SKILL.md +15 -10
- package/harness/bundles/java/claude-code/harness-submit/checklist.md +40 -76
- package/harness/bundles/java/claude-code/harness-sync/SKILL.md +17 -2
- package/harness/bundles/java/claude-code/harness-sync/reference.md +2 -2
- package/harness/bundles/java/claude-code/harness-test/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/protocols/archive-report-protocol.md +26 -4
- package/harness/bundles/java/claude-code/protocols/ledger-protocol.md +38 -0
- package/harness/bundles/java/claude-code/protocols/powershell-protocol.md +16 -0
- package/harness/bundles/java/claude-code/protocols/report-pipeline-protocol.md +17 -0
- package/harness/bundles/java/claude-code/protocols/state-layout-protocol.md +15 -0
- package/harness/bundles/java/claude-code/scripts/harness_archive.py +1209 -170
- package/harness/bundles/java/claude-code/scripts/harness_change.py +18 -0
- package/harness/bundles/java/claude-code/scripts/harness_deploy.py +1 -44
- package/harness/bundles/java/claude-code/scripts/harness_events.py +174 -25
- package/harness/bundles/java/claude-code/scripts/harness_gate.py +203 -29
- package/harness/bundles/java/claude-code/scripts/harness_integration.py +878 -0
- package/harness/bundles/java/claude-code/scripts/harness_ledger.py +457 -10
- package/harness/bundles/java/claude-code/scripts/harness_paths.py +315 -0
- package/harness/bundles/java/claude-code/scripts/harness_profile.py +45 -0
- package/harness/bundles/java/claude-code/scripts/harness_review.py +326 -0
- package/harness/bundles/java/claude-code/scripts/harness_sync.py +407 -0
- package/harness/bundles/java/claude-code/scripts/harness_test_guard.py +244 -49
- package/harness/bundles/java/codebuddy/.harness-build.json +1 -1
- package/harness/bundles/java/codebuddy/contracts/workflow-policy.json +3 -3
- package/harness/bundles/java/codebuddy/harness-apidoc/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-archive/SKILL.md +3 -3
- package/harness/bundles/java/codebuddy/harness-archive/reference.md +30 -12
- package/harness/bundles/java/codebuddy/harness-archive/templates/render-summary.mjs +5 -1
- package/harness/bundles/java/codebuddy/harness-archive/templates/summary-data-template.json +6 -2
- package/harness/bundles/java/codebuddy/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-knowledge-ingest/SKILL.md +3 -1
- package/harness/bundles/java/codebuddy/harness-knowledge-ingest/reference.md +7 -0
- package/harness/bundles/java/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge.py +117 -0
- package/harness/bundles/java/codebuddy/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-package/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-plan/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-plan/checklist.md +6 -0
- package/harness/bundles/java/codebuddy/harness-review/SKILL.md +3 -3
- package/harness/bundles/java/codebuddy/harness-run/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-submit/SKILL.md +15 -10
- package/harness/bundles/java/codebuddy/harness-submit/checklist.md +40 -76
- package/harness/bundles/java/codebuddy/harness-sync/SKILL.md +17 -2
- package/harness/bundles/java/codebuddy/harness-sync/reference.md +2 -2
- package/harness/bundles/java/codebuddy/harness-test/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/protocols/archive-report-protocol.md +26 -4
- package/harness/bundles/java/codebuddy/protocols/ledger-protocol.md +38 -0
- package/harness/bundles/java/codebuddy/protocols/powershell-protocol.md +16 -0
- package/harness/bundles/java/codebuddy/protocols/report-pipeline-protocol.md +17 -0
- package/harness/bundles/java/codebuddy/protocols/state-layout-protocol.md +15 -0
- package/harness/bundles/java/codebuddy/scripts/harness_archive.py +1209 -170
- package/harness/bundles/java/codebuddy/scripts/harness_change.py +18 -0
- package/harness/bundles/java/codebuddy/scripts/harness_deploy.py +1 -44
- package/harness/bundles/java/codebuddy/scripts/harness_events.py +174 -25
- package/harness/bundles/java/codebuddy/scripts/harness_gate.py +203 -29
- package/harness/bundles/java/codebuddy/scripts/harness_integration.py +878 -0
- package/harness/bundles/java/codebuddy/scripts/harness_ledger.py +457 -10
- package/harness/bundles/java/codebuddy/scripts/harness_paths.py +315 -0
- package/harness/bundles/java/codebuddy/scripts/harness_profile.py +45 -0
- package/harness/bundles/java/codebuddy/scripts/harness_review.py +326 -0
- package/harness/bundles/java/codebuddy/scripts/harness_sync.py +407 -0
- package/harness/bundles/java/codebuddy/scripts/harness_test_guard.py +244 -49
- package/harness/bundles/java/codex/.harness-build.json +1 -1
- package/harness/bundles/java/codex/contracts/workflow-policy.json +3 -3
- package/harness/bundles/java/codex/harness-apidoc/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-archive/SKILL.md +3 -3
- package/harness/bundles/java/codex/harness-archive/reference.md +30 -12
- package/harness/bundles/java/codex/harness-archive/templates/render-summary.mjs +5 -1
- package/harness/bundles/java/codex/harness-archive/templates/summary-data-template.json +6 -2
- package/harness/bundles/java/codex/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-knowledge-ingest/SKILL.md +3 -1
- package/harness/bundles/java/codex/harness-knowledge-ingest/reference.md +7 -0
- package/harness/bundles/java/codex/harness-knowledge-ingest/scripts/harness_knowledge.py +117 -0
- package/harness/bundles/java/codex/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-package/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-plan/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-plan/checklist.md +6 -0
- package/harness/bundles/java/codex/harness-review/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-run/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-submit/SKILL.md +15 -10
- package/harness/bundles/java/codex/harness-submit/checklist.md +40 -76
- package/harness/bundles/java/codex/harness-sync/SKILL.md +17 -2
- package/harness/bundles/java/codex/harness-sync/reference.md +2 -2
- package/harness/bundles/java/codex/harness-test/SKILL.md +1 -1
- package/harness/bundles/java/codex/protocols/archive-report-protocol.md +26 -4
- package/harness/bundles/java/codex/protocols/ledger-protocol.md +38 -0
- package/harness/bundles/java/codex/protocols/powershell-protocol.md +16 -0
- package/harness/bundles/java/codex/protocols/report-pipeline-protocol.md +17 -0
- package/harness/bundles/java/codex/protocols/state-layout-protocol.md +15 -0
- package/harness/bundles/java/codex/scripts/harness_archive.py +1209 -170
- package/harness/bundles/java/codex/scripts/harness_change.py +18 -0
- package/harness/bundles/java/codex/scripts/harness_deploy.py +1 -44
- package/harness/bundles/java/codex/scripts/harness_events.py +174 -25
- package/harness/bundles/java/codex/scripts/harness_gate.py +203 -29
- package/harness/bundles/java/codex/scripts/harness_integration.py +878 -0
- package/harness/bundles/java/codex/scripts/harness_ledger.py +457 -10
- package/harness/bundles/java/codex/scripts/harness_paths.py +315 -0
- package/harness/bundles/java/codex/scripts/harness_profile.py +45 -0
- package/harness/bundles/java/codex/scripts/harness_review.py +326 -0
- package/harness/bundles/java/codex/scripts/harness_sync.py +407 -0
- package/harness/bundles/java/codex/scripts/harness_test_guard.py +244 -49
- package/harness/bundles/java/cursor/.harness-build.json +1 -1
- package/harness/bundles/java/cursor/contracts/workflow-policy.json +3 -3
- package/harness/bundles/java/cursor/harness-apidoc/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-archive/SKILL.md +3 -3
- package/harness/bundles/java/cursor/harness-archive/reference.md +30 -12
- package/harness/bundles/java/cursor/harness-archive/templates/render-summary.mjs +5 -1
- package/harness/bundles/java/cursor/harness-archive/templates/summary-data-template.json +6 -2
- package/harness/bundles/java/cursor/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-knowledge-ingest/SKILL.md +3 -1
- package/harness/bundles/java/cursor/harness-knowledge-ingest/reference.md +7 -0
- package/harness/bundles/java/cursor/harness-knowledge-ingest/scripts/harness_knowledge.py +117 -0
- package/harness/bundles/java/cursor/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-package/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-plan/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-plan/checklist.md +6 -0
- package/harness/bundles/java/cursor/harness-review/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-run/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-submit/SKILL.md +15 -10
- package/harness/bundles/java/cursor/harness-submit/checklist.md +40 -76
- package/harness/bundles/java/cursor/harness-sync/SKILL.md +17 -2
- package/harness/bundles/java/cursor/harness-sync/reference.md +2 -2
- package/harness/bundles/java/cursor/harness-test/SKILL.md +1 -1
- package/harness/bundles/java/cursor/protocols/archive-report-protocol.md +26 -4
- package/harness/bundles/java/cursor/protocols/ledger-protocol.md +38 -0
- package/harness/bundles/java/cursor/protocols/powershell-protocol.md +16 -0
- package/harness/bundles/java/cursor/protocols/report-pipeline-protocol.md +17 -0
- package/harness/bundles/java/cursor/protocols/state-layout-protocol.md +15 -0
- package/harness/bundles/java/cursor/scripts/harness_archive.py +1209 -170
- package/harness/bundles/java/cursor/scripts/harness_change.py +18 -0
- package/harness/bundles/java/cursor/scripts/harness_deploy.py +1 -44
- package/harness/bundles/java/cursor/scripts/harness_events.py +174 -25
- package/harness/bundles/java/cursor/scripts/harness_gate.py +203 -29
- package/harness/bundles/java/cursor/scripts/harness_integration.py +878 -0
- package/harness/bundles/java/cursor/scripts/harness_ledger.py +457 -10
- package/harness/bundles/java/cursor/scripts/harness_paths.py +315 -0
- package/harness/bundles/java/cursor/scripts/harness_profile.py +45 -0
- package/harness/bundles/java/cursor/scripts/harness_review.py +326 -0
- package/harness/bundles/java/cursor/scripts/harness_sync.py +407 -0
- package/harness/bundles/java/cursor/scripts/harness_test_guard.py +244 -49
- package/harness/manifests/general/claude-code.json +58 -38
- package/harness/manifests/general/codebuddy.json +58 -38
- package/harness/manifests/general/codex.json +58 -38
- package/harness/manifests/general/cursor.json +58 -38
- package/harness/manifests/java/claude-code.json +52 -36
- package/harness/manifests/java/codebuddy.json +52 -36
- package/harness/manifests/java/codex.json +52 -36
- package/harness/manifests/java/cursor.json +52 -36
- package/hunter-workflow-family.json +2 -2
- package/package.json +1 -1
|
@@ -31,6 +31,8 @@ SCRIPTS_DIR = Path(__file__).resolve().parent
|
|
|
31
31
|
if str(SCRIPTS_DIR) not in sys.path:
|
|
32
32
|
sys.path.insert(0, str(SCRIPTS_DIR))
|
|
33
33
|
|
|
34
|
+
import harness_paths # noqa: E402
|
|
35
|
+
|
|
34
36
|
if hasattr(sys.stdout, "reconfigure"):
|
|
35
37
|
sys.stdout.reconfigure(encoding="utf-8")
|
|
36
38
|
if hasattr(sys.stderr, "reconfigure"):
|
|
@@ -208,6 +210,20 @@ def change_dir_for_id(project_root: Path, change_id: str) -> Path | None:
|
|
|
208
210
|
return None
|
|
209
211
|
|
|
210
212
|
|
|
213
|
+
def _layout_fields(project_root: Path, change_id: str) -> dict[str, Any]:
|
|
214
|
+
"""Layout enrichment for resolve payloads; empty on any resolution issue."""
|
|
215
|
+
try:
|
|
216
|
+
layout = harness_paths.resolve_change_layout(project_root, change_id)
|
|
217
|
+
except (FileNotFoundError, ValueError, OSError):
|
|
218
|
+
return {}
|
|
219
|
+
return {
|
|
220
|
+
"contractRoot": layout["contractRoot"],
|
|
221
|
+
"stateRoot": layout["stateRoot"],
|
|
222
|
+
"layout": layout["layout"],
|
|
223
|
+
"repositoryId": layout["repositoryId"],
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
|
|
211
227
|
def resolve_change(
|
|
212
228
|
project_root: Path,
|
|
213
229
|
change_id: str | None,
|
|
@@ -229,6 +245,7 @@ def resolve_change(
|
|
|
229
245
|
"changeDir": str(resolved),
|
|
230
246
|
"projectRoot": str(project_root.resolve()),
|
|
231
247
|
"activeCount": len(active),
|
|
248
|
+
**_layout_fields(project_root, change_id),
|
|
232
249
|
}
|
|
233
250
|
if not active:
|
|
234
251
|
return {
|
|
@@ -247,6 +264,7 @@ def resolve_change(
|
|
|
247
264
|
"projectRoot": str(project_root.resolve()),
|
|
248
265
|
"activeCount": 1,
|
|
249
266
|
"autoSelected": True,
|
|
267
|
+
**_layout_fields(project_root, only["changeId"]),
|
|
250
268
|
}
|
|
251
269
|
return {
|
|
252
270
|
"ok": False,
|
|
@@ -719,40 +719,6 @@ def cmd_install(build_out: Path, project: Path, target: Path | None) -> dict[str
|
|
|
719
719
|
}
|
|
720
720
|
|
|
721
721
|
|
|
722
|
-
def cmd_diff(build_out: Path, project: Path, target: Path | None) -> dict[str, Any]:
|
|
723
|
-
build_out = build_out.resolve()
|
|
724
|
-
project = project.resolve()
|
|
725
|
-
installed = (target or project / ".claude" / "skills").resolve()
|
|
726
|
-
if not installed.is_dir():
|
|
727
|
-
return {
|
|
728
|
-
"ok": True,
|
|
729
|
-
"action": "diff",
|
|
730
|
-
"stale": True,
|
|
731
|
-
"missingInstall": True,
|
|
732
|
-
"outdated": [],
|
|
733
|
-
"missing": [],
|
|
734
|
-
"extra": [],
|
|
735
|
-
}
|
|
736
|
-
|
|
737
|
-
built = collect_files(build_out)
|
|
738
|
-
current = collect_files(installed)
|
|
739
|
-
outdated = [p for p, h in built.items() if p in current and current[p] != h]
|
|
740
|
-
missing = [p for p in built if p not in current]
|
|
741
|
-
# extra includes install-side managed manifests only as metadata, so they
|
|
742
|
-
# are excluded from the extra set; every other untracked file is a real
|
|
743
|
-
# extra and must mark the install stale (design §3.8 要点3).
|
|
744
|
-
extra = [p for p in current if p not in built and p not in INSTALL_METADATA]
|
|
745
|
-
return {
|
|
746
|
-
"ok": True,
|
|
747
|
-
"action": "diff",
|
|
748
|
-
"stale": bool(outdated or missing or extra),
|
|
749
|
-
"outdated": sorted(outdated),
|
|
750
|
-
"missing": sorted(missing),
|
|
751
|
-
"extra": sorted(extra),
|
|
752
|
-
"comparedAt": now_iso(),
|
|
753
|
-
}
|
|
754
|
-
|
|
755
|
-
|
|
756
722
|
def cmd_validate_manifest(
|
|
757
723
|
bundle_dir: Path, manifest_entries: list[dict[str, Any]]
|
|
758
724
|
) -> dict[str, Any]:
|
|
@@ -783,7 +749,7 @@ def cmd_validate_manifest(
|
|
|
783
749
|
|
|
784
750
|
|
|
785
751
|
def build_parser() -> argparse.ArgumentParser:
|
|
786
|
-
p = argparse.ArgumentParser(description="Harness skills deploy (build/install
|
|
752
|
+
p = argparse.ArgumentParser(description="Harness skills deploy (build/install)")
|
|
787
753
|
sub = p.add_subparsers(dest="command", required=True)
|
|
788
754
|
|
|
789
755
|
b = sub.add_parser("build", help="Synthesize core + overlay into output dir")
|
|
@@ -799,12 +765,6 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
799
765
|
i.add_argument("--target", type=Path)
|
|
800
766
|
i.add_argument("--json", action="store_true")
|
|
801
767
|
|
|
802
|
-
d = sub.add_parser("diff", help="Compare installed skills vs build output")
|
|
803
|
-
d.add_argument("--from", dest="from_dir", type=Path, required=True)
|
|
804
|
-
d.add_argument("--project", type=Path, required=True)
|
|
805
|
-
d.add_argument("--target", type=Path)
|
|
806
|
-
d.add_argument("--json", action="store_true")
|
|
807
|
-
|
|
808
768
|
v = sub.add_parser(
|
|
809
769
|
"validate-manifest", help="Validate bundle dir vs manifest (missing/extra/hash)"
|
|
810
770
|
)
|
|
@@ -823,9 +783,6 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
823
783
|
if args.command == "install":
|
|
824
784
|
result = cmd_install(args.from_dir, args.project, args.target)
|
|
825
785
|
return emit_json(result) if args.json else 0
|
|
826
|
-
if args.command == "diff":
|
|
827
|
-
result = cmd_diff(args.from_dir, args.project, args.target)
|
|
828
|
-
return emit_json(result) if args.json else 0
|
|
829
786
|
if args.command == "validate-manifest":
|
|
830
787
|
manifest_data = json.loads(args.manifest.read_text(encoding="utf-8"))
|
|
831
788
|
entries = (
|
|
@@ -23,6 +23,12 @@ import uuid
|
|
|
23
23
|
from pathlib import Path
|
|
24
24
|
from typing import Any
|
|
25
25
|
|
|
26
|
+
SCRIPTS_DIR = Path(__file__).resolve().parent
|
|
27
|
+
if str(SCRIPTS_DIR) not in sys.path:
|
|
28
|
+
sys.path.insert(0, str(SCRIPTS_DIR))
|
|
29
|
+
|
|
30
|
+
import harness_paths # noqa: E402
|
|
31
|
+
|
|
26
32
|
|
|
27
33
|
if hasattr(sys.stdout, "reconfigure"):
|
|
28
34
|
sys.stdout.reconfigure(encoding="utf-8")
|
|
@@ -43,6 +49,7 @@ EVENT_TYPES = frozenset(
|
|
|
43
49
|
)
|
|
44
50
|
|
|
45
51
|
SCHEMA_VERSION = 3
|
|
52
|
+
_NOTE_FALLBACK_MAXLEN = 60
|
|
46
53
|
HEADER_LINE = (
|
|
47
54
|
"本文件由 harness_events.py 自动渲染,请勿手工编辑;事实源为 events.ndjson"
|
|
48
55
|
)
|
|
@@ -98,12 +105,16 @@ def resolve_change_dir(raw: str) -> Path:
|
|
|
98
105
|
return Path(raw).expanduser().resolve()
|
|
99
106
|
|
|
100
107
|
|
|
108
|
+
def _state_dir(change_dir: Path) -> Path:
|
|
109
|
+
return Path(harness_paths.resolve_state_dir_for_contract(change_dir))
|
|
110
|
+
|
|
111
|
+
|
|
101
112
|
def events_path(change_dir: Path) -> Path:
|
|
102
|
-
return change_dir / "events.ndjson"
|
|
113
|
+
return _state_dir(change_dir) / "events.ndjson"
|
|
103
114
|
|
|
104
115
|
|
|
105
116
|
def execution_log_path(change_dir: Path) -> Path:
|
|
106
|
-
return change_dir / "logs" / "execution-log.md"
|
|
117
|
+
return _state_dir(change_dir) / "logs" / "execution-log.md"
|
|
107
118
|
|
|
108
119
|
|
|
109
120
|
def archived_change_dir(change_dir: Path) -> Path | None:
|
|
@@ -178,6 +189,26 @@ def load_events(path: Path) -> list[dict[str, Any]]:
|
|
|
178
189
|
return events
|
|
179
190
|
|
|
180
191
|
|
|
192
|
+
def merge_event_files(paths: list[Path]) -> list[dict[str, Any]]:
|
|
193
|
+
"""Union events from multiple NDJSON files by event ID (UT-001/RET-05).
|
|
194
|
+
|
|
195
|
+
Each event ID appears exactly once; first-seen copy wins. Missing IDs are
|
|
196
|
+
kept keyed by (file index, line number) so unidentified events are never
|
|
197
|
+
silently dropped.
|
|
198
|
+
"""
|
|
199
|
+
merged: list[dict[str, Any]] = []
|
|
200
|
+
seen: set[str] = set()
|
|
201
|
+
for path in paths:
|
|
202
|
+
for event in load_events(Path(path)):
|
|
203
|
+
event_id = str(event.get("id") or "").strip()
|
|
204
|
+
if event_id:
|
|
205
|
+
if event_id in seen:
|
|
206
|
+
continue
|
|
207
|
+
seen.add(event_id)
|
|
208
|
+
merged.append(event)
|
|
209
|
+
return merged
|
|
210
|
+
|
|
211
|
+
|
|
181
212
|
def atomic_append_line(path: Path, line: str) -> None:
|
|
182
213
|
"""Write line to a temp file first, then append to the target (append-only)."""
|
|
183
214
|
path.parent.mkdir(parents=True, exist_ok=True)
|
|
@@ -316,6 +347,8 @@ def build_event(args: argparse.Namespace, existing: list[dict[str, Any]]) -> dic
|
|
|
316
347
|
def status_symbol(status: Any, reason: Any = None) -> str:
|
|
317
348
|
text = str(status or "").strip().lower()
|
|
318
349
|
reason_text = str(reason or "").strip()
|
|
350
|
+
if not text:
|
|
351
|
+
return "—"
|
|
319
352
|
ok_set = {"ok", "passed", "pass", "success", "green", "✅", "✅ok"}
|
|
320
353
|
warn_set = {"warn", "warning", "yellow", "skipped", "skip", "🟡", "🟡warn"}
|
|
321
354
|
fail_set = {"fail", "failed", "error", "red", "blocked", "❌", "❌fail"}
|
|
@@ -327,7 +360,7 @@ def status_symbol(status: Any, reason: Any = None) -> str:
|
|
|
327
360
|
return f"❌FAIL({reason_text})" if reason_text else "❌FAIL"
|
|
328
361
|
if reason_text:
|
|
329
362
|
return f"{status}({reason_text})"
|
|
330
|
-
return str(status
|
|
363
|
+
return str(status)
|
|
331
364
|
|
|
332
365
|
|
|
333
366
|
def severity_symbol(severity: Any, message: Any = None) -> str:
|
|
@@ -339,7 +372,10 @@ def severity_symbol(severity: Any, message: Any = None) -> str:
|
|
|
339
372
|
return f"🟡WARN({msg})" if msg else "🟡WARN"
|
|
340
373
|
if text in {"info", "ok", "note"}:
|
|
341
374
|
return f"✅OK({msg})" if msg else "✅OK"
|
|
342
|
-
|
|
375
|
+
# Empty/unknown severity: never emit literal "issue"/"None".
|
|
376
|
+
if not text:
|
|
377
|
+
return ""
|
|
378
|
+
return f"{severity}: {msg}" if msg else str(severity)
|
|
343
379
|
|
|
344
380
|
|
|
345
381
|
def format_duration(ms: int | None) -> str:
|
|
@@ -427,9 +463,10 @@ def phase_duration_ms(phase_events: list[dict[str, Any]]) -> int | None:
|
|
|
427
463
|
elif etype == "phase.end":
|
|
428
464
|
end_ts = event.get("timestamp")
|
|
429
465
|
if start_ts and end_ts:
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
466
|
+
# Closed phases end at the matching phase.end. Late events appended
|
|
467
|
+
# after closure are reported separately (late_event_stats) and never
|
|
468
|
+
# extend the closed duration (RET-21).
|
|
469
|
+
return duration_ms_between(start_ts, end_ts)
|
|
433
470
|
# Fallback: first to last timestamp in the phase bucket.
|
|
434
471
|
stamps = [e.get("timestamp") for e in phase_events if e.get("timestamp")]
|
|
435
472
|
if len(stamps) >= 2:
|
|
@@ -437,38 +474,124 @@ def phase_duration_ms(phase_events: list[dict[str, Any]]) -> int | None:
|
|
|
437
474
|
return None
|
|
438
475
|
|
|
439
476
|
|
|
477
|
+
def late_event_stats(phase_events: list[dict[str, Any]]) -> dict[str, int]:
|
|
478
|
+
"""Count events recorded after the closing phase.end (RET-21)."""
|
|
479
|
+
end_ts = None
|
|
480
|
+
for event in phase_events:
|
|
481
|
+
if event.get("type") == "phase.end":
|
|
482
|
+
end_ts = event.get("timestamp")
|
|
483
|
+
if not end_ts:
|
|
484
|
+
return {"lateEventCount": 0, "lateEventSpanMs": 0}
|
|
485
|
+
late_stamps = []
|
|
486
|
+
seen_end = False
|
|
487
|
+
for event in phase_events:
|
|
488
|
+
if event.get("type") == "phase.end" and not seen_end:
|
|
489
|
+
seen_end = True
|
|
490
|
+
continue
|
|
491
|
+
if seen_end and event.get("timestamp"):
|
|
492
|
+
late_stamps.append(event["timestamp"])
|
|
493
|
+
if not late_stamps:
|
|
494
|
+
return {"lateEventCount": 0, "lateEventSpanMs": 0}
|
|
495
|
+
span = duration_ms_between(end_ts, late_stamps[-1]) or 0
|
|
496
|
+
return {"lateEventCount": len(late_stamps), "lateEventSpanMs": span}
|
|
497
|
+
|
|
498
|
+
|
|
499
|
+
def attempt_invocations(phase_events: list[dict[str, Any]]) -> list[dict[str, Any]]:
|
|
500
|
+
"""Per-attempt invocation view: attempt, status, durationMs (RET-22)."""
|
|
501
|
+
invocations: list[dict[str, Any]] = []
|
|
502
|
+
for attempt in split_phase_attempts(phase_events):
|
|
503
|
+
events_in = attempt.get("events") or []
|
|
504
|
+
start_ts = None
|
|
505
|
+
end_ts = None
|
|
506
|
+
status = None
|
|
507
|
+
for event in events_in:
|
|
508
|
+
if event.get("type") == "phase.start" and start_ts is None:
|
|
509
|
+
start_ts = event.get("timestamp")
|
|
510
|
+
elif event.get("type") == "phase.end":
|
|
511
|
+
end_ts = event.get("timestamp")
|
|
512
|
+
status = event.get("status", status)
|
|
513
|
+
duration = None
|
|
514
|
+
if start_ts and end_ts:
|
|
515
|
+
duration = duration_ms_between(start_ts, end_ts)
|
|
516
|
+
invocations.append(
|
|
517
|
+
{
|
|
518
|
+
"attempt": attempt.get("attempt"),
|
|
519
|
+
"status": status,
|
|
520
|
+
"durationMs": duration,
|
|
521
|
+
}
|
|
522
|
+
)
|
|
523
|
+
return invocations
|
|
524
|
+
|
|
525
|
+
|
|
526
|
+
def canonical_phase_timing(phase_events: list[dict[str, Any]]) -> dict[str, Any]:
|
|
527
|
+
"""Single reducer for every duration view (RET-20).
|
|
528
|
+
|
|
529
|
+
activeExecutionMs: phase.start → matching phase.end (closed contract).
|
|
530
|
+
wallClockSpanMs: first → last timestamp in the bucket, late events included.
|
|
531
|
+
"""
|
|
532
|
+
stamps = [e.get("timestamp") for e in phase_events if e.get("timestamp")]
|
|
533
|
+
active = phase_duration_ms(phase_events)
|
|
534
|
+
late = late_event_stats(phase_events)
|
|
535
|
+
wall = duration_ms_between(stamps[0], stamps[-1]) if len(stamps) >= 2 else active
|
|
536
|
+
return {
|
|
537
|
+
"activeExecutionMs": active,
|
|
538
|
+
"wallClockSpanMs": wall,
|
|
539
|
+
"lateEventCount": late["lateEventCount"],
|
|
540
|
+
"lateEventSpanMs": late["lateEventSpanMs"],
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
|
|
440
544
|
def render_command_block(commands: list[dict[str, Any]]) -> list[str]:
|
|
441
545
|
if not commands:
|
|
442
546
|
return []
|
|
547
|
+
|
|
548
|
+
def command_display(event: dict[str, Any]) -> str:
|
|
549
|
+
cmd = str(event.get("command") or "").strip()
|
|
550
|
+
if cmd:
|
|
551
|
+
return cmd
|
|
552
|
+
return str(event.get("note") or "").strip()
|
|
553
|
+
|
|
443
554
|
if len(commands) == 1:
|
|
444
555
|
event = commands[0]
|
|
445
|
-
|
|
556
|
+
display = command_display(event)
|
|
557
|
+
if not display:
|
|
558
|
+
return []
|
|
446
559
|
exit_code = event.get("exit_code")
|
|
447
560
|
exit_text = "?" if exit_code is None else str(exit_code)
|
|
448
561
|
duration = format_duration(
|
|
449
562
|
int(event["duration_ms"]) if isinstance(event.get("duration_ms"), int) else None
|
|
450
563
|
)
|
|
451
564
|
note = str(event.get("note") or "").strip()
|
|
452
|
-
parts = [f"- command: `{
|
|
453
|
-
|
|
565
|
+
parts = [f"- command: `{display}`", f"exit={exit_text}", f"duration={duration}"]
|
|
566
|
+
# Avoid duplicating note when it was already used as the display text.
|
|
567
|
+
if note and note != display:
|
|
454
568
|
parts.append(f"note={note}")
|
|
455
569
|
return [" · ".join(parts)]
|
|
456
570
|
|
|
457
|
-
|
|
458
|
-
"",
|
|
459
|
-
"| 命令 | exit | duration | note |",
|
|
460
|
-
"| --- | ---: | ---: | --- |",
|
|
461
|
-
]
|
|
571
|
+
rows: list[str] = []
|
|
462
572
|
for event in commands:
|
|
463
|
-
|
|
573
|
+
display = command_display(event)
|
|
574
|
+
if not display:
|
|
575
|
+
continue
|
|
576
|
+
cmd = display.replace("|", "\\|")
|
|
464
577
|
exit_code = event.get("exit_code")
|
|
465
578
|
exit_text = "?" if exit_code is None else str(exit_code)
|
|
466
579
|
duration = format_duration(
|
|
467
580
|
int(event["duration_ms"]) if isinstance(event.get("duration_ms"), int) else None
|
|
468
581
|
)
|
|
469
582
|
note = str(event.get("note") or "").replace("|", "\\|")
|
|
470
|
-
|
|
471
|
-
|
|
583
|
+
# If note was promoted to the command cell, leave the note column empty.
|
|
584
|
+
note_cell = "" if note == display else note
|
|
585
|
+
rows.append(f"| `{cmd}` | {exit_text} | {duration} | {note_cell} |")
|
|
586
|
+
if not rows:
|
|
587
|
+
return []
|
|
588
|
+
lines = [
|
|
589
|
+
"",
|
|
590
|
+
"| 命令 | exit | duration | note |",
|
|
591
|
+
"| --- | ---: | ---: | --- |",
|
|
592
|
+
*rows,
|
|
593
|
+
"",
|
|
594
|
+
]
|
|
472
595
|
return lines
|
|
473
596
|
|
|
474
597
|
|
|
@@ -491,23 +614,37 @@ def render_event_line(event: dict[str, Any]) -> list[str]:
|
|
|
491
614
|
suffix = f" — {note}" if note else ""
|
|
492
615
|
return [f"- phase.end @ {event.get('timestamp', '')}{suffix}"]
|
|
493
616
|
if etype == "verification":
|
|
494
|
-
|
|
495
|
-
|
|
617
|
+
note = str(event.get("note") or "").strip()
|
|
618
|
+
name = str(event.get("name") or "").strip() or (
|
|
619
|
+
note[:_NOTE_FALLBACK_MAXLEN] if note else ""
|
|
620
|
+
)
|
|
621
|
+
if not name:
|
|
622
|
+
return []
|
|
623
|
+
symbol = status_symbol(event.get("status"), event.get("reason"))
|
|
496
624
|
return [f"- verification: {name} → {symbol}"]
|
|
497
625
|
if etype == "decision":
|
|
498
|
-
decision = event.get("decision") or ""
|
|
499
|
-
reason = event.get("reason") or event.get("note") or ""
|
|
626
|
+
decision = str(event.get("decision") or "").strip()
|
|
627
|
+
reason = str(event.get("reason") or event.get("note") or "").strip()
|
|
628
|
+
if not decision:
|
|
629
|
+
return [f"- decision: {reason}"] if reason else []
|
|
500
630
|
if reason:
|
|
501
631
|
return [f"- decision: {decision} — {reason}"]
|
|
502
632
|
return [f"- decision: {decision}"]
|
|
503
633
|
if etype == "issue":
|
|
504
|
-
|
|
634
|
+
note = str(event.get("note") or "").strip()
|
|
635
|
+
message = str(event.get("message") or "").strip() or note
|
|
636
|
+
symbol = severity_symbol(event.get("severity"), message)
|
|
637
|
+
if not symbol:
|
|
638
|
+
return [f"- issue: {note}"] if note else []
|
|
505
639
|
code = event.get("code")
|
|
506
640
|
prefix = f"[{code}] " if code else ""
|
|
507
641
|
return [f"- issue: {prefix}{symbol}"]
|
|
508
642
|
if etype == "artifact":
|
|
509
|
-
path = event.get("path") or ""
|
|
643
|
+
path = str(event.get("path") or "").strip()
|
|
644
|
+
note = str(event.get("note") or "").strip()
|
|
510
645
|
kind = event.get("kind")
|
|
646
|
+
if not path:
|
|
647
|
+
return [f"- artifact: {note}"] if note else []
|
|
511
648
|
if kind:
|
|
512
649
|
return [f"- artifact: `{path}` ({kind})"]
|
|
513
650
|
return [f"- artifact: `{path}`"]
|
|
@@ -647,12 +784,24 @@ def cmd_append(args: argparse.Namespace) -> int:
|
|
|
647
784
|
as_json=as_json,
|
|
648
785
|
)
|
|
649
786
|
path = events_path(change_dir)
|
|
650
|
-
lock_path =
|
|
787
|
+
lock_path = path.with_name(path.name + ".lock")
|
|
651
788
|
|
|
652
789
|
# §6.1/§6.2: 普通 append = 加锁 -> 追加一行 -> fsync -> 解锁,不 load 历史、不渲染。
|
|
653
790
|
# new_event_id 用完整 uuid,无需扫描去重。锁覆盖 atomic_append_line 的
|
|
654
791
|
# open/write/flush/fsync 全过程。
|
|
655
792
|
event = build_event(args, [])
|
|
793
|
+
# Semantic hints (non-fatal): guide agents toward required fields.
|
|
794
|
+
if args.type == "issue" and not args.severity:
|
|
795
|
+
event["severity"] = "info"
|
|
796
|
+
print(
|
|
797
|
+
"warning: issue without --severity, defaulted to info",
|
|
798
|
+
file=sys.stderr,
|
|
799
|
+
)
|
|
800
|
+
if args.type == "verification" and (not args.name or not args.status):
|
|
801
|
+
print(
|
|
802
|
+
"warning: verification missing --name or --status",
|
|
803
|
+
file=sys.stderr,
|
|
804
|
+
)
|
|
656
805
|
line = json.dumps(event, ensure_ascii=False, separators=(",", ":"))
|
|
657
806
|
try:
|
|
658
807
|
with event_file_lock(lock_path):
|