@hunter-harness/workflow-harness 0.4.0 → 0.4.1
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/harness-archive/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-execute/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-query/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-plan/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-pull/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-push/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-review/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-run/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-submit/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-test/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/scripts/harness_archive.py +29 -6
- package/harness/bundles/general/claude-code/scripts/harness_deploy.py +1 -1
- package/harness/bundles/general/claude-code/scripts/harness_knowledge_candidates.py +398 -0
- package/harness/bundles/general/codebuddy/.harness-build.json +1 -1
- package/harness/bundles/general/codebuddy/harness-archive/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-execute/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-knowledge-ingest/SKILL.md +1 -1
- 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-pull/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-push/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-review/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-run/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-submit/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-test/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/scripts/harness_archive.py +29 -6
- package/harness/bundles/general/codebuddy/scripts/harness_deploy.py +1 -1
- package/harness/bundles/general/codebuddy/scripts/harness_knowledge_candidates.py +398 -0
- package/harness/bundles/general/codex/.harness-build.json +1 -1
- package/harness/bundles/general/codex/harness-archive/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-execute/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-knowledge-ingest/SKILL.md +1 -1
- 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-pull/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-push/SKILL.md +1 -1
- 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-submit/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-test/SKILL.md +1 -1
- package/harness/bundles/general/codex/scripts/harness_archive.py +29 -6
- package/harness/bundles/general/codex/scripts/harness_deploy.py +1 -1
- package/harness/bundles/general/codex/scripts/harness_knowledge_candidates.py +398 -0
- package/harness/bundles/general/cursor/.harness-build.json +1 -1
- package/harness/bundles/general/cursor/harness-archive/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-execute/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-knowledge-ingest/SKILL.md +1 -1
- 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-pull/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-push/SKILL.md +1 -1
- 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-submit/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-test/SKILL.md +1 -1
- package/harness/bundles/general/cursor/scripts/harness_archive.py +29 -6
- package/harness/bundles/general/cursor/scripts/harness_deploy.py +1 -1
- package/harness/bundles/general/cursor/scripts/harness_knowledge_candidates.py +398 -0
- package/harness/bundles/general/pi/.harness-build.json +6 -0
- package/harness/bundles/general/pi/CONTEXT.md +98 -0
- package/harness/bundles/general/pi/README.md +478 -0
- package/harness/bundles/general/pi/contracts/build-profile-v3.schema.json +302 -0
- package/harness/bundles/general/pi/contracts/ci-metrics.schema.json +36 -0
- package/harness/bundles/general/pi/contracts/doctor-capability.schema.json +43 -0
- package/harness/bundles/general/pi/contracts/external-platform-observation.schema.json +62 -0
- package/harness/bundles/general/pi/contracts/fixtures/managed-execution.json +341 -0
- package/harness/bundles/general/pi/contracts/process-identity.schema.json +132 -0
- package/harness/bundles/general/pi/contracts/run-session.schema.json +142 -0
- package/harness/bundles/general/pi/contracts/service-retirement-receipt.schema.json +85 -0
- package/harness/bundles/general/pi/contracts/service-session.schema.json +147 -0
- package/harness/bundles/general/pi/contracts/workflow-policy.json +574 -0
- package/harness/bundles/general/pi/harness-archive/SKILL.md +322 -0
- package/harness/bundles/general/pi/harness-archive/checklist.md +71 -0
- package/harness/bundles/general/pi/harness-archive/reference.md +150 -0
- package/harness/bundles/general/pi/harness-archive/scripts/gen-manifest.ps1 +31 -0
- package/harness/bundles/general/pi/harness-archive/templates/summary-data-template.json +218 -0
- package/harness/bundles/general/pi/harness-codebase-map/SKILL.md +116 -0
- package/harness/bundles/general/pi/harness-codebase-map/checklist.md +126 -0
- package/harness/bundles/general/pi/harness-codebase-map/reference.md +364 -0
- package/harness/bundles/general/pi/harness-codebase-map/templates/ARCHITECTURE.md +57 -0
- package/harness/bundles/general/pi/harness-codebase-map/templates/CONCERNS.md +49 -0
- package/harness/bundles/general/pi/harness-codebase-map/templates/CONVENTIONS.md +57 -0
- package/harness/bundles/general/pi/harness-codebase-map/templates/INTEGRATIONS.md +52 -0
- package/harness/bundles/general/pi/harness-codebase-map/templates/STACK.md +55 -0
- package/harness/bundles/general/pi/harness-codebase-map/templates/STRUCTURE.md +69 -0
- package/harness/bundles/general/pi/harness-codebase-map/templates/TESTING.md +64 -0
- package/harness/bundles/general/pi/harness-codebase-map/templates/map-manifest.schema.json +73 -0
- package/harness/bundles/general/pi/harness-codebase-map/templates/map-summary.md +64 -0
- package/harness/bundles/general/pi/harness-execute/SKILL.md +170 -0
- package/harness/bundles/general/pi/harness-knowledge-ingest/SKILL.md +103 -0
- package/harness/bundles/general/pi/harness-knowledge-query/SKILL.md +97 -0
- package/harness/bundles/general/pi/harness-plan/SKILL.md +158 -0
- package/harness/bundles/general/pi/harness-plan/checklist.md +243 -0
- package/harness/bundles/general/pi/harness-plan/protocols.md +133 -0
- package/harness/bundles/general/pi/harness-plan/reference.md +468 -0
- package/harness/bundles/general/pi/harness-pull/SKILL.md +55 -0
- package/harness/bundles/general/pi/harness-push/SKILL.md +83 -0
- package/harness/bundles/general/pi/harness-review/SKILL.md +175 -0
- package/harness/bundles/general/pi/harness-review/checklist.md +124 -0
- package/harness/bundles/general/pi/harness-review/protocols.md +69 -0
- package/harness/bundles/general/pi/harness-review/reference.md +114 -0
- package/harness/bundles/general/pi/harness-run/SKILL.md +188 -0
- package/harness/bundles/general/pi/harness-run/checklist.md +279 -0
- package/harness/bundles/general/pi/harness-run/protocols.md +141 -0
- package/harness/bundles/general/pi/harness-run/reference.md +886 -0
- package/harness/bundles/general/pi/harness-submit/SKILL.md +182 -0
- package/harness/bundles/general/pi/harness-submit/checklist.md +452 -0
- package/harness/bundles/general/pi/harness-submit/reference.md +152 -0
- package/harness/bundles/general/pi/harness-sync/SKILL.md +72 -0
- package/harness/bundles/general/pi/harness-sync/reference.md +176 -0
- package/harness/bundles/general/pi/harness-test/SKILL.md +250 -0
- package/harness/bundles/general/pi/harness-test/checklist.md +359 -0
- package/harness/bundles/general/pi/harness-test/pitfalls-java.md +14 -0
- package/harness/bundles/general/pi/harness-test/pitfalls.md +307 -0
- package/harness/bundles/general/pi/harness-test/reference.md +880 -0
- package/harness/bundles/general/pi/harness-test/scripts/runtime-helpers.mjs +216 -0
- package/harness/bundles/general/pi/protocols/archive-report-protocol.md +196 -0
- package/harness/bundles/general/pi/protocols/ci-layering-protocol.md +22 -0
- package/harness/bundles/general/pi/protocols/evidence-based-reporting-protocol.md +134 -0
- package/harness/bundles/general/pi/protocols/execution-session-protocol.md +52 -0
- package/harness/bundles/general/pi/protocols/external-platform-protocol.md +27 -0
- package/harness/bundles/general/pi/protocols/ledger-protocol.md +365 -0
- package/harness/bundles/general/pi/protocols/memory-closeout-protocol.md +21 -0
- package/harness/bundles/general/pi/protocols/model-routing-protocol.md +22 -0
- package/harness/bundles/general/pi/protocols/powershell-protocol.md +238 -0
- package/harness/bundles/general/pi/protocols/registry-governance-protocol.md +31 -0
- package/harness/bundles/general/pi/protocols/report-pipeline-protocol.md +172 -0
- package/harness/bundles/general/pi/protocols/sensitive-info-protocol.md +110 -0
- package/harness/bundles/general/pi/protocols/state-layout-protocol.md +209 -0
- package/harness/bundles/general/pi/protocols/submit-protocol.md +78 -0
- package/harness/bundles/general/pi/protocols/verification-graph-protocol.md +32 -0
- package/harness/bundles/general/pi/scripts/harness_adoption_metrics.py +391 -0
- package/harness/bundles/general/pi/scripts/harness_apidoc.py +53 -0
- package/harness/bundles/general/pi/scripts/harness_archive.py +11345 -0
- package/harness/bundles/general/pi/scripts/harness_change.py +1626 -0
- package/harness/bundles/general/pi/scripts/harness_check_gate.py +113 -0
- package/harness/bundles/general/pi/scripts/harness_context.py +1774 -0
- package/harness/bundles/general/pi/scripts/harness_deploy.py +968 -0
- package/harness/bundles/general/pi/scripts/harness_efficiency.py +443 -0
- package/harness/bundles/general/pi/scripts/harness_environment.py +1690 -0
- package/harness/bundles/general/pi/scripts/harness_events.py +2234 -0
- package/harness/bundles/general/pi/scripts/harness_events_sync.py +1425 -0
- package/harness/bundles/general/pi/scripts/harness_execution_contracts.py +596 -0
- package/harness/bundles/general/pi/scripts/harness_fixback.py +1975 -0
- package/harness/bundles/general/pi/scripts/harness_gate.py +3816 -0
- package/harness/bundles/general/pi/scripts/harness_headless.py +37 -0
- package/harness/bundles/general/pi/scripts/harness_integration.py +2564 -0
- package/harness/bundles/general/pi/scripts/harness_knowledge_candidates.py +796 -0
- package/harness/bundles/general/pi/scripts/harness_ledger.py +3556 -0
- package/harness/bundles/general/pi/scripts/harness_migration_head.py +220 -0
- package/harness/bundles/general/pi/scripts/harness_orchestration.py +344 -0
- package/harness/bundles/general/pi/scripts/harness_paths.py +676 -0
- package/harness/bundles/general/pi/scripts/harness_phase.py +1726 -0
- package/harness/bundles/general/pi/scripts/harness_plan_aggregate.py +249 -0
- package/harness/bundles/general/pi/scripts/harness_plan_finalize.py +1016 -0
- package/harness/bundles/general/pi/scripts/harness_preflight.py +650 -0
- package/harness/bundles/general/pi/scripts/harness_process.py +1065 -0
- package/harness/bundles/general/pi/scripts/harness_profile.py +1817 -0
- package/harness/bundles/general/pi/scripts/harness_report_model.py +442 -0
- package/harness/bundles/general/pi/scripts/harness_retry.py +175 -0
- package/harness/bundles/general/pi/scripts/harness_review.py +631 -0
- package/harness/bundles/general/pi/scripts/harness_runtime.py +2243 -0
- package/harness/bundles/general/pi/scripts/harness_service.py +3355 -0
- package/harness/bundles/general/pi/scripts/harness_state.py +365 -0
- package/harness/bundles/general/pi/scripts/harness_sync.py +407 -0
- package/harness/bundles/general/pi/scripts/harness_test_cleanup.py +175 -0
- package/harness/bundles/general/pi/scripts/harness_test_guard.py +1899 -0
- package/harness/bundles/general/pi/scripts/harness_test_runner.py +1586 -0
- package/harness/bundles/general/pi/scripts/harness_verification.py +593 -0
- package/harness/bundles/general/pi/scripts/harness_workflow_policy.py +266 -0
- package/harness/bundles/java/claude-code/.harness-build.json +1 -1
- package/harness/bundles/java/claude-code/harness-apidoc/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-archive/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-execute/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-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-pull/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-push/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-review/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-run/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-submit/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-test/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/scripts/harness_archive.py +29 -6
- package/harness/bundles/java/claude-code/scripts/harness_deploy.py +1 -1
- package/harness/bundles/java/claude-code/scripts/harness_knowledge_candidates.py +398 -0
- package/harness/bundles/java/codebuddy/.harness-build.json +1 -1
- package/harness/bundles/java/codebuddy/harness-apidoc/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-archive/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-execute/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-knowledge-ingest/SKILL.md +1 -1
- 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-pull/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-push/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-review/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-run/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-submit/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-test/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/scripts/harness_archive.py +29 -6
- package/harness/bundles/java/codebuddy/scripts/harness_deploy.py +1 -1
- package/harness/bundles/java/codebuddy/scripts/harness_knowledge_candidates.py +398 -0
- package/harness/bundles/java/codex/.harness-build.json +1 -1
- package/harness/bundles/java/codex/harness-apidoc/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-archive/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-execute/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-knowledge-ingest/SKILL.md +1 -1
- 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-pull/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-push/SKILL.md +1 -1
- 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 +1 -1
- package/harness/bundles/java/codex/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-test/SKILL.md +1 -1
- package/harness/bundles/java/codex/scripts/harness_archive.py +29 -6
- package/harness/bundles/java/codex/scripts/harness_deploy.py +1 -1
- package/harness/bundles/java/codex/scripts/harness_knowledge_candidates.py +398 -0
- package/harness/bundles/java/cursor/.harness-build.json +1 -1
- package/harness/bundles/java/cursor/harness-apidoc/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-archive/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-execute/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-knowledge-ingest/SKILL.md +1 -1
- 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-pull/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-push/SKILL.md +1 -1
- 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 +1 -1
- package/harness/bundles/java/cursor/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-test/SKILL.md +1 -1
- package/harness/bundles/java/cursor/scripts/harness_archive.py +29 -6
- package/harness/bundles/java/cursor/scripts/harness_deploy.py +1 -1
- package/harness/bundles/java/cursor/scripts/harness_knowledge_candidates.py +398 -0
- package/harness/bundles/java/pi/.harness-build.json +6 -0
- package/harness/bundles/java/pi/CONTEXT.md +98 -0
- package/harness/bundles/java/pi/README.md +478 -0
- package/harness/bundles/java/pi/contracts/build-profile-v3.schema.json +302 -0
- package/harness/bundles/java/pi/contracts/ci-metrics.schema.json +36 -0
- package/harness/bundles/java/pi/contracts/doctor-capability.schema.json +43 -0
- package/harness/bundles/java/pi/contracts/external-platform-observation.schema.json +62 -0
- package/harness/bundles/java/pi/contracts/fixtures/managed-execution.json +341 -0
- package/harness/bundles/java/pi/contracts/process-identity.schema.json +132 -0
- package/harness/bundles/java/pi/contracts/run-session.schema.json +142 -0
- package/harness/bundles/java/pi/contracts/service-retirement-receipt.schema.json +85 -0
- package/harness/bundles/java/pi/contracts/service-session.schema.json +147 -0
- package/harness/bundles/java/pi/contracts/workflow-policy.json +574 -0
- package/harness/bundles/java/pi/harness-apidoc/SKILL.md +97 -0
- package/harness/bundles/java/pi/harness-apidoc/checklist.md +142 -0
- package/harness/bundles/java/pi/harness-apidoc/reference.md +233 -0
- package/harness/bundles/java/pi/harness-archive/SKILL.md +322 -0
- package/harness/bundles/java/pi/harness-archive/checklist.md +71 -0
- package/harness/bundles/java/pi/harness-archive/reference.md +150 -0
- package/harness/bundles/java/pi/harness-archive/scripts/gen-manifest.ps1 +31 -0
- package/harness/bundles/java/pi/harness-archive/templates/summary-data-template.json +218 -0
- package/harness/bundles/java/pi/harness-codebase-map/SKILL.md +116 -0
- package/harness/bundles/java/pi/harness-codebase-map/checklist.md +126 -0
- package/harness/bundles/java/pi/harness-codebase-map/reference.md +364 -0
- package/harness/bundles/java/pi/harness-codebase-map/templates/ARCHITECTURE.md +57 -0
- package/harness/bundles/java/pi/harness-codebase-map/templates/CONCERNS.md +49 -0
- package/harness/bundles/java/pi/harness-codebase-map/templates/CONVENTIONS.md +57 -0
- package/harness/bundles/java/pi/harness-codebase-map/templates/INTEGRATIONS.md +52 -0
- package/harness/bundles/java/pi/harness-codebase-map/templates/STACK.md +55 -0
- package/harness/bundles/java/pi/harness-codebase-map/templates/STRUCTURE.md +69 -0
- package/harness/bundles/java/pi/harness-codebase-map/templates/TESTING.md +64 -0
- package/harness/bundles/java/pi/harness-codebase-map/templates/map-manifest.schema.json +73 -0
- package/harness/bundles/java/pi/harness-codebase-map/templates/map-summary.md +64 -0
- package/harness/bundles/java/pi/harness-execute/SKILL.md +170 -0
- package/harness/bundles/java/pi/harness-knowledge-ingest/SKILL.md +103 -0
- package/harness/bundles/java/pi/harness-knowledge-query/SKILL.md +97 -0
- package/harness/bundles/java/pi/harness-package/SKILL.md +94 -0
- package/harness/bundles/java/pi/harness-package/checklist.md +322 -0
- package/harness/bundles/java/pi/harness-package/reference.md +210 -0
- package/harness/bundles/java/pi/harness-plan/SKILL.md +158 -0
- package/harness/bundles/java/pi/harness-plan/checklist.md +243 -0
- package/harness/bundles/java/pi/harness-plan/protocols.md +133 -0
- package/harness/bundles/java/pi/harness-plan/reference.md +468 -0
- package/harness/bundles/java/pi/harness-pull/SKILL.md +55 -0
- package/harness/bundles/java/pi/harness-push/SKILL.md +83 -0
- package/harness/bundles/java/pi/harness-review/SKILL.md +175 -0
- package/harness/bundles/java/pi/harness-review/checklist.md +124 -0
- package/harness/bundles/java/pi/harness-review/protocols.md +69 -0
- package/harness/bundles/java/pi/harness-review/reference.md +114 -0
- package/harness/bundles/java/pi/harness-run/SKILL.md +206 -0
- package/harness/bundles/java/pi/harness-run/checklist.md +252 -0
- package/harness/bundles/java/pi/harness-run/protocols.md +141 -0
- package/harness/bundles/java/pi/harness-run/reference.md +820 -0
- package/harness/bundles/java/pi/harness-submit/SKILL.md +189 -0
- package/harness/bundles/java/pi/harness-submit/checklist.md +452 -0
- package/harness/bundles/java/pi/harness-submit/reference.md +152 -0
- package/harness/bundles/java/pi/harness-sync/SKILL.md +72 -0
- package/harness/bundles/java/pi/harness-sync/reference.md +176 -0
- package/harness/bundles/java/pi/harness-test/SKILL.md +264 -0
- package/harness/bundles/java/pi/harness-test/checklist.md +320 -0
- package/harness/bundles/java/pi/harness-test/pitfalls-java.md +16 -0
- package/harness/bundles/java/pi/harness-test/pitfalls.md +307 -0
- package/harness/bundles/java/pi/harness-test/reference.md +792 -0
- package/harness/bundles/java/pi/harness-test/scripts/runtime-helpers.mjs +216 -0
- package/harness/bundles/java/pi/protocols/archive-report-protocol.md +196 -0
- package/harness/bundles/java/pi/protocols/ci-layering-protocol.md +22 -0
- package/harness/bundles/java/pi/protocols/evidence-based-reporting-protocol.md +134 -0
- package/harness/bundles/java/pi/protocols/execution-session-protocol.md +52 -0
- package/harness/bundles/java/pi/protocols/external-platform-protocol.md +27 -0
- package/harness/bundles/java/pi/protocols/ledger-protocol.md +365 -0
- package/harness/bundles/java/pi/protocols/memory-closeout-protocol.md +21 -0
- package/harness/bundles/java/pi/protocols/model-routing-protocol.md +22 -0
- package/harness/bundles/java/pi/protocols/powershell-protocol.md +238 -0
- package/harness/bundles/java/pi/protocols/registry-governance-protocol.md +31 -0
- package/harness/bundles/java/pi/protocols/report-pipeline-protocol.md +172 -0
- package/harness/bundles/java/pi/protocols/sensitive-info-protocol.md +110 -0
- package/harness/bundles/java/pi/protocols/state-layout-protocol.md +209 -0
- package/harness/bundles/java/pi/protocols/submit-protocol.md +78 -0
- package/harness/bundles/java/pi/protocols/verification-graph-protocol.md +32 -0
- package/harness/bundles/java/pi/scripts/harness_adoption_metrics.py +391 -0
- package/harness/bundles/java/pi/scripts/harness_apidoc.py +53 -0
- package/harness/bundles/java/pi/scripts/harness_archive.py +11345 -0
- package/harness/bundles/java/pi/scripts/harness_change.py +1626 -0
- package/harness/bundles/java/pi/scripts/harness_check_gate.py +113 -0
- package/harness/bundles/java/pi/scripts/harness_context.py +1774 -0
- package/harness/bundles/java/pi/scripts/harness_deploy.py +968 -0
- package/harness/bundles/java/pi/scripts/harness_efficiency.py +443 -0
- package/harness/bundles/java/pi/scripts/harness_environment.py +1690 -0
- package/harness/bundles/java/pi/scripts/harness_events.py +2234 -0
- package/harness/bundles/java/pi/scripts/harness_events_sync.py +1425 -0
- package/harness/bundles/java/pi/scripts/harness_execution_contracts.py +596 -0
- package/harness/bundles/java/pi/scripts/harness_fixback.py +1975 -0
- package/harness/bundles/java/pi/scripts/harness_gate.py +3816 -0
- package/harness/bundles/java/pi/scripts/harness_headless.py +37 -0
- package/harness/bundles/java/pi/scripts/harness_integration.py +2564 -0
- package/harness/bundles/java/pi/scripts/harness_knowledge_candidates.py +796 -0
- package/harness/bundles/java/pi/scripts/harness_ledger.py +3556 -0
- package/harness/bundles/java/pi/scripts/harness_migration_head.py +220 -0
- package/harness/bundles/java/pi/scripts/harness_orchestration.py +344 -0
- package/harness/bundles/java/pi/scripts/harness_paths.py +676 -0
- package/harness/bundles/java/pi/scripts/harness_phase.py +1726 -0
- package/harness/bundles/java/pi/scripts/harness_plan_aggregate.py +249 -0
- package/harness/bundles/java/pi/scripts/harness_plan_finalize.py +1016 -0
- package/harness/bundles/java/pi/scripts/harness_preflight.py +650 -0
- package/harness/bundles/java/pi/scripts/harness_process.py +1065 -0
- package/harness/bundles/java/pi/scripts/harness_profile.py +1817 -0
- package/harness/bundles/java/pi/scripts/harness_report_model.py +442 -0
- package/harness/bundles/java/pi/scripts/harness_retry.py +175 -0
- package/harness/bundles/java/pi/scripts/harness_review.py +631 -0
- package/harness/bundles/java/pi/scripts/harness_runtime.py +2243 -0
- package/harness/bundles/java/pi/scripts/harness_service.py +3355 -0
- package/harness/bundles/java/pi/scripts/harness_state.py +365 -0
- package/harness/bundles/java/pi/scripts/harness_sync.py +407 -0
- package/harness/bundles/java/pi/scripts/harness_test_cleanup.py +175 -0
- package/harness/bundles/java/pi/scripts/harness_test_guard.py +1899 -0
- package/harness/bundles/java/pi/scripts/harness_test_runner.py +1586 -0
- package/harness/bundles/java/pi/scripts/harness_verification.py +593 -0
- package/harness/bundles/java/pi/scripts/harness_workflow_policy.py +266 -0
- package/harness/manifests/general/claude-code.json +17 -17
- package/harness/manifests/general/codebuddy.json +17 -17
- package/harness/manifests/general/codex.json +17 -17
- package/harness/manifests/general/cursor.json +17 -17
- package/harness/manifests/general/pi.json +475 -0
- package/harness/manifests/java/claude-code.json +19 -19
- package/harness/manifests/java/codebuddy.json +19 -19
- package/harness/manifests/java/codex.json +19 -19
- package/harness/manifests/java/cursor.json +19 -19
- package/harness/manifests/java/pi.json +499 -0
- package/hunter-workflow-family.json +2 -2
- package/package.json +1 -1
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Harness state/context snapshot (cluster 3, spec §3.6).
|
|
3
|
+
|
|
4
|
+
Per-segment fingerprints for project/worktree/git/profile/rules/map/knowledge/
|
|
5
|
+
diff. Each segment fails independently; cache miss re-captures only the affected
|
|
6
|
+
segment. plan/run/test/review/submit read this snapshot; stale segments are
|
|
7
|
+
re-captured by the script. Never skip code or verification gates on cache alone.
|
|
8
|
+
|
|
9
|
+
Python 3.10+ stdlib only. UTF-8 without BOM. Windows path friendly.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import datetime as dt
|
|
15
|
+
import argparse
|
|
16
|
+
import hashlib
|
|
17
|
+
import json
|
|
18
|
+
import os
|
|
19
|
+
import subprocess
|
|
20
|
+
import sys
|
|
21
|
+
from pathlib import Path
|
|
22
|
+
from typing import Any
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
SCRIPTS_DIR = Path(__file__).resolve().parent
|
|
26
|
+
if str(SCRIPTS_DIR) not in sys.path:
|
|
27
|
+
sys.path.insert(0, str(SCRIPTS_DIR))
|
|
28
|
+
|
|
29
|
+
from harness_ledger import compute_inputs_hash # noqa: E402
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
if hasattr(sys.stdout, "reconfigure"):
|
|
33
|
+
sys.stdout.reconfigure(encoding="utf-8")
|
|
34
|
+
if hasattr(sys.stderr, "reconfigure"):
|
|
35
|
+
sys.stderr.reconfigure(encoding="utf-8")
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
SNAPSHOT_SCHEMA_VERSION = 1
|
|
39
|
+
SNAPSHOT_REL = Path("meta") / "state-snapshot.json"
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def now_iso() -> str:
|
|
43
|
+
return dt.datetime.now().astimezone().isoformat(timespec="seconds")
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def read_json(path: Path) -> Any:
|
|
47
|
+
# utf-8-sig 兼容可能残留的 BOM(与 harness_ledger.py 保持一致)。
|
|
48
|
+
return json.loads(path.read_text(encoding="utf-8-sig"))
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def write_json(path: Path, data: Any) -> None:
|
|
52
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
53
|
+
text = json.dumps(data, ensure_ascii=False, indent=2) + "\n"
|
|
54
|
+
# 强制 LF,UTF-8 无 BOM(与 harness_ledger/harness_profile 保持一致)。
|
|
55
|
+
# 原子写 temp+os.replace:崩溃后不留半写文件(与 runtime-helpers.mjs writeJsonUtf8NoBom 一致)。
|
|
56
|
+
tmp = path.with_name(f".{path.name}.{os.getpid()}.tmp")
|
|
57
|
+
try:
|
|
58
|
+
tmp.write_text(text, encoding="utf-8", newline="\n")
|
|
59
|
+
os.replace(tmp, path)
|
|
60
|
+
except BaseException:
|
|
61
|
+
tmp.unlink(missing_ok=True)
|
|
62
|
+
raise
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def snapshot_path(change_dir: Path) -> Path:
|
|
66
|
+
return change_dir / SNAPSHOT_REL
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def _empty_segment_fingerprint() -> str:
|
|
70
|
+
return "sha256:" + hashlib.sha256(b"").hexdigest()
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def capture_file_segment(
|
|
74
|
+
files: list[str], *, captured_at: str | None = None
|
|
75
|
+
) -> dict[str, Any]:
|
|
76
|
+
"""对一组文件算指纹(compute_inputs_hash,order-independent),返回 segment dict。
|
|
77
|
+
|
|
78
|
+
空文件集 → 稳定空指纹 + 空 files(段存在但无输入,不算失效)。
|
|
79
|
+
缺失文件由 compute_inputs_hash 抛 FileNotFoundError(调用方应保证文件存在)。
|
|
80
|
+
"""
|
|
81
|
+
if files:
|
|
82
|
+
fp, resolved = compute_inputs_hash(files)
|
|
83
|
+
return {
|
|
84
|
+
"fingerprint": fp,
|
|
85
|
+
"files": resolved,
|
|
86
|
+
"capturedAt": captured_at or now_iso(),
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
"fingerprint": _empty_segment_fingerprint(),
|
|
90
|
+
"files": [],
|
|
91
|
+
"capturedAt": captured_at or now_iso(),
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def capture_snapshot(
|
|
96
|
+
change_dir: Path,
|
|
97
|
+
*,
|
|
98
|
+
change_name: str,
|
|
99
|
+
project: Path,
|
|
100
|
+
worktree_root: Path,
|
|
101
|
+
base: str | None = None,
|
|
102
|
+
head: str | None = None,
|
|
103
|
+
segment_files: dict[str, list[str]] | None = None,
|
|
104
|
+
) -> dict[str, Any]:
|
|
105
|
+
"""采集全段 state snapshot。
|
|
106
|
+
|
|
107
|
+
segment_files 指定每段(profile/rules/map/knowledge/...)的文件集;调用方
|
|
108
|
+
(各 skill)决定每段采什么文件,snapshot 只负责采集 + 比对 + 失效。
|
|
109
|
+
git 段记录 base/head;diff 指纹由调用方按需用 harness_ledger.compute_diff_hash
|
|
110
|
+
采后填入 segment_files(spec §3.6)。
|
|
111
|
+
"""
|
|
112
|
+
_ = change_dir # 预留给未来 write-back;当前 capture 只返回 dict
|
|
113
|
+
segment_files = segment_files or {}
|
|
114
|
+
segments: dict[str, Any] = {}
|
|
115
|
+
for name, files in segment_files.items():
|
|
116
|
+
segments[name] = capture_file_segment(files)
|
|
117
|
+
|
|
118
|
+
return {
|
|
119
|
+
"schemaVersion": SNAPSHOT_SCHEMA_VERSION,
|
|
120
|
+
"generatedAt": now_iso(),
|
|
121
|
+
"changeName": change_name,
|
|
122
|
+
# The first captured Git boundary is the immutable identity of the
|
|
123
|
+
# change. Later phases may advance HEAD, but must never silently move
|
|
124
|
+
# the base and collapse the archive range.
|
|
125
|
+
"changeBase": base or "",
|
|
126
|
+
"project": {"root": str(project.resolve())},
|
|
127
|
+
"worktree": {"root": str(Path(worktree_root).resolve())},
|
|
128
|
+
"git": {"base": base or "", "head": head or ""},
|
|
129
|
+
"segments": segments,
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def write_snapshot(change_dir: Path, snapshot: dict[str, Any]) -> Path:
|
|
134
|
+
path = snapshot_path(change_dir)
|
|
135
|
+
write_json(path, snapshot)
|
|
136
|
+
return path
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def load_snapshot(change_dir: Path) -> dict[str, Any] | None:
|
|
140
|
+
path = snapshot_path(change_dir)
|
|
141
|
+
if not path.is_file():
|
|
142
|
+
return None
|
|
143
|
+
try:
|
|
144
|
+
data = read_json(path)
|
|
145
|
+
except (OSError, json.JSONDecodeError):
|
|
146
|
+
return None
|
|
147
|
+
return data if isinstance(data, dict) else None
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def is_segment_stale(
|
|
151
|
+
snapshot: dict[str, Any], segment: str, current_fingerprint: str
|
|
152
|
+
) -> bool:
|
|
153
|
+
"""某段指纹是否变化。段不存在 → True(需采集)。"""
|
|
154
|
+
segs = snapshot.get("segments") or {}
|
|
155
|
+
seg = segs.get(segment)
|
|
156
|
+
if not isinstance(seg, dict):
|
|
157
|
+
return True
|
|
158
|
+
return seg.get("fingerprint") != current_fingerprint
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def refresh_segments(
|
|
162
|
+
change_dir: Path,
|
|
163
|
+
snapshot: dict[str, Any],
|
|
164
|
+
*,
|
|
165
|
+
project: Path,
|
|
166
|
+
worktree_root: Path,
|
|
167
|
+
segment_files: dict[str, list[str]],
|
|
168
|
+
segments: list[str],
|
|
169
|
+
) -> dict[str, Any]:
|
|
170
|
+
"""只重采指定段;其他段保留原 capturedAt/fingerprint。
|
|
171
|
+
|
|
172
|
+
spec §3.6:缓存失效只重采受影响段,不得仅凭缓存跳过代码或验证门禁。
|
|
173
|
+
返回 refreshed snapshot(不写盘;调用方按需 write_snapshot)。
|
|
174
|
+
"""
|
|
175
|
+
_ = change_dir # 预留给未来 write-back
|
|
176
|
+
refreshed = dict(snapshot)
|
|
177
|
+
refreshed["project"] = {"root": str(project.resolve())}
|
|
178
|
+
refreshed["worktree"] = {"root": str(Path(worktree_root).resolve())}
|
|
179
|
+
refreshed_segments = dict(snapshot.get("segments") or {})
|
|
180
|
+
for name in segments:
|
|
181
|
+
files = segment_files.get(name, [])
|
|
182
|
+
refreshed_segments[name] = capture_file_segment(files)
|
|
183
|
+
refreshed["segments"] = refreshed_segments
|
|
184
|
+
refreshed["generatedAt"] = now_iso()
|
|
185
|
+
return refreshed
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
def _git(project: Path, *args: str) -> str:
|
|
189
|
+
proc = subprocess.run(
|
|
190
|
+
["git", "-C", str(project), *args],
|
|
191
|
+
capture_output=True,
|
|
192
|
+
text=True,
|
|
193
|
+
encoding="utf-8",
|
|
194
|
+
errors="replace",
|
|
195
|
+
check=False,
|
|
196
|
+
)
|
|
197
|
+
return proc.stdout.strip() if proc.returncode == 0 else ""
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def _existing_files(paths: list[Path]) -> list[str]:
|
|
201
|
+
return sorted({str(path.resolve()) for path in paths if path.is_file()})
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
def discover_segment_files(
|
|
205
|
+
project: Path, change_dir: Path, *, base: str = "", head: str = "HEAD"
|
|
206
|
+
) -> dict[str, list[str]]:
|
|
207
|
+
"""Discover the compact inputs shared by plan/run/test/review/submit."""
|
|
208
|
+
project = project.resolve()
|
|
209
|
+
rules = [project / "AGENTS.md", project / "CLAUDE.md"]
|
|
210
|
+
for pattern in (
|
|
211
|
+
".claude/rules/**/*",
|
|
212
|
+
".cursor/rules/**/*",
|
|
213
|
+
".codebuddy/rules/**/*",
|
|
214
|
+
".codebuddy/.rules/**/*",
|
|
215
|
+
):
|
|
216
|
+
rules.extend(project.glob(pattern))
|
|
217
|
+
|
|
218
|
+
profile = [
|
|
219
|
+
project / ".harness/config/build-profile.json",
|
|
220
|
+
project / ".harness/context-index.json",
|
|
221
|
+
project / "project.yaml",
|
|
222
|
+
project / "harness.json",
|
|
223
|
+
]
|
|
224
|
+
codebase_map = list((project / ".harness/codebase/map").glob("**/*"))
|
|
225
|
+
# Knowledge is remote-only. Keep the segment for schema compatibility, but
|
|
226
|
+
# do not discover or fingerprint local indexes/fallback state.
|
|
227
|
+
knowledge: list[Path] = []
|
|
228
|
+
change_inputs: list[Path] = []
|
|
229
|
+
for folder in ("spec", "plans", "meta"):
|
|
230
|
+
change_inputs.extend((change_dir / folder).glob("**/*"))
|
|
231
|
+
change_inputs = [path for path in change_inputs if path != snapshot_path(change_dir)]
|
|
232
|
+
|
|
233
|
+
changed_names: list[str] = []
|
|
234
|
+
if base:
|
|
235
|
+
raw = _git(project, "diff", "--name-only", "--diff-filter=ACMRT", f"{base}..{head}")
|
|
236
|
+
changed_names = [line for line in raw.splitlines() if line.strip()]
|
|
237
|
+
code = [project / name for name in changed_names]
|
|
238
|
+
return {
|
|
239
|
+
"profile": _existing_files(profile),
|
|
240
|
+
"rules": _existing_files(rules),
|
|
241
|
+
"map": _existing_files(codebase_map),
|
|
242
|
+
"knowledge": _existing_files(knowledge),
|
|
243
|
+
"change": _existing_files(change_inputs),
|
|
244
|
+
"code": _existing_files(code),
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
def capture_current_state(
|
|
249
|
+
*,
|
|
250
|
+
project: Path,
|
|
251
|
+
change_dir: Path,
|
|
252
|
+
change_name: str,
|
|
253
|
+
worktree_root: Path,
|
|
254
|
+
base: str = "",
|
|
255
|
+
head: str = "HEAD",
|
|
256
|
+
) -> tuple[dict[str, Any], list[str]]:
|
|
257
|
+
git_head = _git(project, "rev-parse", head)
|
|
258
|
+
resolved_head = git_head or head
|
|
259
|
+
previous = load_snapshot(change_dir)
|
|
260
|
+
previous_git = previous.get("git") if isinstance(previous, dict) else None
|
|
261
|
+
previous_base = (
|
|
262
|
+
str(previous.get("changeBase") or "").strip()
|
|
263
|
+
if isinstance(previous, dict)
|
|
264
|
+
else ""
|
|
265
|
+
)
|
|
266
|
+
if not previous_base and isinstance(previous_git, dict):
|
|
267
|
+
previous_base = str(
|
|
268
|
+
previous_git.get("base") or previous_git.get("baseCommit") or ""
|
|
269
|
+
).strip()
|
|
270
|
+
requested_base = _git(project, "rev-parse", base) if base else ""
|
|
271
|
+
# First capture establishes the boundary. A later --base value is an
|
|
272
|
+
# observation hint only; changing the boundary requires the explicit
|
|
273
|
+
# archive range-adoption receipt.
|
|
274
|
+
resolved_base = previous_base or requested_base or git_head
|
|
275
|
+
files = discover_segment_files(project, change_dir, base=resolved_base, head=resolved_head)
|
|
276
|
+
fresh = capture_snapshot(
|
|
277
|
+
change_dir,
|
|
278
|
+
change_name=change_name,
|
|
279
|
+
project=project,
|
|
280
|
+
worktree_root=worktree_root,
|
|
281
|
+
base=resolved_base,
|
|
282
|
+
head=resolved_head,
|
|
283
|
+
segment_files=files,
|
|
284
|
+
)
|
|
285
|
+
changed: list[str] = []
|
|
286
|
+
baseline_created = previous is None
|
|
287
|
+
unresolved: list[str] = []
|
|
288
|
+
unresolved_reasons: list[dict[str, str]] = []
|
|
289
|
+
if previous:
|
|
290
|
+
old_segments = previous.get("segments") or {}
|
|
291
|
+
for name, segment in fresh["segments"].items():
|
|
292
|
+
old = old_segments.get(name)
|
|
293
|
+
if isinstance(old, dict) and old.get("fingerprint") == segment.get("fingerprint"):
|
|
294
|
+
segment["capturedAt"] = old.get("capturedAt", segment["capturedAt"])
|
|
295
|
+
else:
|
|
296
|
+
changed.append(name)
|
|
297
|
+
# First observation establishes the baseline; it is not evidence that
|
|
298
|
+
# segments changed, nor that they are "unresolved". Segments are only
|
|
299
|
+
# unresolved when they genuinely fail to read/compute (retro §5.6).
|
|
300
|
+
# On first capture, all successfully-captured segments are baseline,
|
|
301
|
+
# not unresolved.
|
|
302
|
+
fresh["baselineCreated"] = baseline_created
|
|
303
|
+
fresh["changedSegments"] = sorted(changed)
|
|
304
|
+
fresh["unresolvedSegments"] = unresolved
|
|
305
|
+
fresh["unresolvedReasons"] = unresolved_reasons
|
|
306
|
+
fresh["comparisonAvailable"] = not baseline_created
|
|
307
|
+
fresh["baselineStatus"] = "created" if baseline_created else "reused"
|
|
308
|
+
write_snapshot(change_dir, fresh)
|
|
309
|
+
return fresh, changed
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
def build_parser() -> argparse.ArgumentParser:
|
|
313
|
+
parser = argparse.ArgumentParser(description="Capture reusable Harness state")
|
|
314
|
+
sub = parser.add_subparsers(dest="command", required=True)
|
|
315
|
+
capture = sub.add_parser("capture", help="capture or refresh changed segments")
|
|
316
|
+
capture.add_argument("--project", default=".")
|
|
317
|
+
capture.add_argument("--change-dir", required=True)
|
|
318
|
+
capture.add_argument("--change-name")
|
|
319
|
+
capture.add_argument("--worktree-root")
|
|
320
|
+
capture.add_argument("--base", default="")
|
|
321
|
+
capture.add_argument("--head", default="HEAD")
|
|
322
|
+
capture.add_argument("--json", action="store_true")
|
|
323
|
+
return parser
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
def main(argv: list[str] | None = None) -> int:
|
|
327
|
+
args = build_parser().parse_args(argv)
|
|
328
|
+
project = Path(args.project).resolve()
|
|
329
|
+
change_dir = Path(args.change_dir).resolve()
|
|
330
|
+
name = args.change_name or change_dir.name
|
|
331
|
+
worktree = Path(args.worktree_root).resolve() if args.worktree_root else project
|
|
332
|
+
snapshot, changed = capture_current_state(
|
|
333
|
+
project=project,
|
|
334
|
+
change_dir=change_dir,
|
|
335
|
+
change_name=name,
|
|
336
|
+
worktree_root=worktree,
|
|
337
|
+
base=args.base,
|
|
338
|
+
head=args.head,
|
|
339
|
+
)
|
|
340
|
+
result = {
|
|
341
|
+
"ok": True,
|
|
342
|
+
"path": str(snapshot_path(change_dir)),
|
|
343
|
+
"changedSegments": changed,
|
|
344
|
+
"reusedSegments": sorted(
|
|
345
|
+
set(snapshot["segments"])
|
|
346
|
+
- set(changed)
|
|
347
|
+
- set(snapshot.get("unresolvedSegments") or [])
|
|
348
|
+
),
|
|
349
|
+
"baselineCreated": bool(snapshot.get("baselineCreated")),
|
|
350
|
+
"baselineStatus": snapshot.get("baselineStatus", "reused"),
|
|
351
|
+
"comparisonAvailable": bool(snapshot.get("comparisonAvailable", True)),
|
|
352
|
+
"unresolvedSegments": list(snapshot.get("unresolvedSegments") or []),
|
|
353
|
+
"unresolvedReasons": list(snapshot.get("unresolvedReasons") or []),
|
|
354
|
+
"git": snapshot["git"],
|
|
355
|
+
}
|
|
356
|
+
if args.json:
|
|
357
|
+
print(json.dumps(result, ensure_ascii=False))
|
|
358
|
+
else:
|
|
359
|
+
print(f"state snapshot: {result['path']}")
|
|
360
|
+
print(f"changed: {', '.join(changed) if changed else 'none'}")
|
|
361
|
+
return 0
|
|
362
|
+
|
|
363
|
+
|
|
364
|
+
if __name__ == "__main__":
|
|
365
|
+
raise SystemExit(main())
|