@dommaker/harness 1.2.3 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/README.md +0 -2
- package/bin/harness.js +86 -32
- package/dist/cli/command-contract.d.ts +83 -0
- package/dist/cli/command-contract.d.ts.map +1 -0
- package/dist/cli/command-contract.js +66 -0
- package/dist/cli/command-contract.js.map +1 -0
- package/dist/cli/commands/acceptance.d.ts +3 -2
- package/dist/cli/commands/acceptance.d.ts.map +1 -1
- package/dist/cli/commands/acceptance.js +28 -24
- package/dist/cli/commands/acceptance.js.map +1 -1
- package/dist/cli/commands/analyze-sessions.d.ts +2 -1
- package/dist/cli/commands/analyze-sessions.d.ts.map +1 -1
- package/dist/cli/commands/analyze-sessions.js +25 -24
- package/dist/cli/commands/analyze-sessions.js.map +1 -1
- package/dist/cli/commands/check.d.ts +14 -2
- package/dist/cli/commands/check.d.ts.map +1 -1
- package/dist/cli/commands/check.js +76 -61
- package/dist/cli/commands/check.js.map +1 -1
- package/dist/cli/commands/command.d.ts +5 -1
- package/dist/cli/commands/command.d.ts.map +1 -1
- package/dist/cli/commands/command.js +26 -17
- package/dist/cli/commands/command.js.map +1 -1
- package/dist/cli/commands/constraints-report.d.ts +2 -1
- package/dist/cli/commands/constraints-report.d.ts.map +1 -1
- package/dist/cli/commands/constraints-report.js +37 -33
- package/dist/cli/commands/constraints-report.js.map +1 -1
- package/dist/cli/commands/constraints-retire.d.ts +6 -5
- package/dist/cli/commands/constraints-retire.d.ts.map +1 -1
- package/dist/cli/commands/constraints-retire.js +50 -52
- package/dist/cli/commands/constraints-retire.js.map +1 -1
- package/dist/cli/commands/constraints.d.ts +2 -1
- package/dist/cli/commands/constraints.d.ts.map +1 -1
- package/dist/cli/commands/constraints.js +10 -27
- package/dist/cli/commands/constraints.js.map +1 -1
- package/dist/cli/commands/contract.d.ts +3 -2
- package/dist/cli/commands/contract.d.ts.map +1 -1
- package/dist/cli/commands/contract.js +45 -42
- package/dist/cli/commands/contract.js.map +1 -1
- package/dist/cli/commands/definitions.d.ts +11 -11
- package/dist/cli/commands/definitions.d.ts.map +1 -1
- package/dist/cli/commands/definitions.js +30 -215
- package/dist/cli/commands/definitions.js.map +1 -1
- package/dist/cli/commands/failure.d.ts +5 -4
- package/dist/cli/commands/failure.d.ts.map +1 -1
- package/dist/cli/commands/failure.js +33 -26
- package/dist/cli/commands/failure.js.map +1 -1
- package/dist/cli/commands/init.d.ts +7 -5
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +147 -211
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/knowledge.d.ts +21 -15
- package/dist/cli/commands/knowledge.d.ts.map +1 -1
- package/dist/cli/commands/knowledge.js +237 -199
- package/dist/cli/commands/knowledge.js.map +1 -1
- package/dist/cli/commands/passes-gate.d.ts +8 -2
- package/dist/cli/commands/passes-gate.d.ts.map +1 -1
- package/dist/cli/commands/passes-gate.js +44 -66
- package/dist/cli/commands/passes-gate.js.map +1 -1
- package/dist/cli/commands/performance.d.ts +2 -1
- package/dist/cli/commands/performance.d.ts.map +1 -1
- package/dist/cli/commands/performance.js +20 -18
- package/dist/cli/commands/performance.js.map +1 -1
- package/dist/cli/commands/posteval-plan.d.ts +5 -1
- package/dist/cli/commands/posteval-plan.d.ts.map +1 -1
- package/dist/cli/commands/posteval-plan.js +26 -15
- package/dist/cli/commands/posteval-plan.js.map +1 -1
- package/dist/cli/commands/release.d.ts +6 -1
- package/dist/cli/commands/release.d.ts.map +1 -1
- package/dist/cli/commands/release.js +73 -77
- package/dist/cli/commands/release.js.map +1 -1
- package/dist/cli/commands/report.d.ts +2 -1
- package/dist/cli/commands/report.d.ts.map +1 -1
- package/dist/cli/commands/report.js +9 -5
- package/dist/cli/commands/report.js.map +1 -1
- package/dist/cli/commands/review.d.ts +3 -2
- package/dist/cli/commands/review.d.ts.map +1 -1
- package/dist/cli/commands/review.js +33 -29
- package/dist/cli/commands/review.js.map +1 -1
- package/dist/cli/commands/sdd.d.ts +2 -1
- package/dist/cli/commands/sdd.d.ts.map +1 -1
- package/dist/cli/commands/sdd.js +7 -5
- package/dist/cli/commands/sdd.js.map +1 -1
- package/dist/cli/commands/security.d.ts +3 -2
- package/dist/cli/commands/security.d.ts.map +1 -1
- package/dist/cli/commands/security.js +29 -26
- package/dist/cli/commands/security.js.map +1 -1
- package/dist/cli/commands/spec-baseline-check.d.ts +2 -1
- package/dist/cli/commands/spec-baseline-check.d.ts.map +1 -1
- package/dist/cli/commands/spec-baseline-check.js +15 -11
- package/dist/cli/commands/spec-baseline-check.js.map +1 -1
- package/dist/cli/commands/spec.d.ts +7 -2
- package/dist/cli/commands/spec.d.ts.map +1 -1
- package/dist/cli/commands/spec.js +61 -51
- package/dist/cli/commands/spec.js.map +1 -1
- package/dist/cli/commands/status.d.ts +2 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +57 -53
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/sync-docs/agents-syncer.d.ts.map +1 -1
- package/dist/cli/commands/sync-docs/agents-syncer.js +31 -16
- package/dist/cli/commands/sync-docs/agents-syncer.js.map +1 -1
- package/dist/cli/commands/sync-docs/context-syncer.d.ts.map +1 -1
- package/dist/cli/commands/sync-docs/context-syncer.js +3 -2
- package/dist/cli/commands/sync-docs/context-syncer.js.map +1 -1
- package/dist/cli/commands/sync-docs/index.d.ts +2 -1
- package/dist/cli/commands/sync-docs/index.d.ts.map +1 -1
- package/dist/cli/commands/sync-docs/index.js +68 -88
- package/dist/cli/commands/sync-docs/index.js.map +1 -1
- package/dist/cli/commands/sync-docs/project-reader.d.ts +6 -1
- package/dist/cli/commands/sync-docs/project-reader.d.ts.map +1 -1
- package/dist/cli/commands/sync-docs/project-reader.js +14 -16
- package/dist/cli/commands/sync-docs/project-reader.js.map +1 -1
- package/dist/cli/commands/update-user-model.d.ts +2 -1
- package/dist/cli/commands/update-user-model.d.ts.map +1 -1
- package/dist/cli/commands/update-user-model.js +31 -45
- package/dist/cli/commands/update-user-model.js.map +1 -1
- package/dist/cli/commands/validate.d.ts +4 -3
- package/dist/cli/commands/validate.d.ts.map +1 -1
- package/dist/cli/commands/validate.js +28 -26
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/session-mining/transcript.d.ts +7 -1
- package/dist/cli/session-mining/transcript.d.ts.map +1 -1
- package/dist/cli/session-mining/transcript.js +21 -14
- package/dist/cli/session-mining/transcript.js.map +1 -1
- package/dist/completion-checkers/index.d.ts +3 -3
- package/dist/completion-checkers/index.js +3 -3
- package/dist/completion-checkers/phase-format.d.ts +1 -1
- package/dist/completion-checkers/phase-format.js +2 -2
- package/dist/completion-checkers/phase-format.js.map +1 -1
- package/dist/completion-checkers/tdd-chain.d.ts +1 -1
- package/dist/completion-checkers/tdd-chain.js +2 -2
- package/dist/completion-checkers/tdd-chain.js.map +1 -1
- package/dist/completion-checkers/types.d.ts +5 -5
- package/dist/completion-checkers/types.d.ts.map +1 -1
- package/dist/completion-checkers/types.js +2 -2
- package/dist/context/session-manager.d.ts.map +1 -1
- package/dist/context/session-manager.js +19 -32
- package/dist/context/session-manager.js.map +1 -1
- package/dist/core/constraints/agent-prompt-renderer.d.ts.map +1 -1
- package/dist/core/constraints/agent-prompt-renderer.js +1 -4
- package/dist/core/constraints/agent-prompt-renderer.js.map +1 -1
- package/dist/core/constraints/capabilities-parser.d.ts +24 -7
- package/dist/core/constraints/capabilities-parser.d.ts.map +1 -1
- package/dist/core/constraints/capabilities-parser.js +32 -28
- package/dist/core/constraints/capabilities-parser.js.map +1 -1
- package/dist/core/constraints/capabilities-reconcile.d.ts +67 -0
- package/dist/core/constraints/capabilities-reconcile.d.ts.map +1 -0
- package/dist/core/constraints/capabilities-reconcile.js +105 -0
- package/dist/core/constraints/capabilities-reconcile.js.map +1 -0
- package/dist/core/constraints/checker.d.ts +21 -43
- package/dist/core/constraints/checker.d.ts.map +1 -1
- package/dist/core/constraints/checker.js +64 -115
- package/dist/core/constraints/checker.js.map +1 -1
- package/dist/core/constraints/checkers/capability-sync.d.ts +4 -3
- package/dist/core/constraints/checkers/capability-sync.d.ts.map +1 -1
- package/dist/core/constraints/checkers/capability-sync.js +29 -69
- package/dist/core/constraints/checkers/capability-sync.js.map +1 -1
- package/dist/core/constraints/checkers/context-doc-sync.d.ts +4 -2
- package/dist/core/constraints/checkers/context-doc-sync.d.ts.map +1 -1
- package/dist/core/constraints/checkers/context-doc-sync.js +13 -22
- package/dist/core/constraints/checkers/context-doc-sync.js.map +1 -1
- package/dist/core/constraints/checkers/docs-freshness.d.ts.map +1 -1
- package/dist/core/constraints/checkers/docs-freshness.js +37 -63
- package/dist/core/constraints/checkers/docs-freshness.js.map +1 -1
- package/dist/core/constraints/checkers/governance-presence.d.ts +2 -2
- package/dist/core/constraints/checkers/governance-presence.d.ts.map +1 -1
- package/dist/core/constraints/checkers/governance-presence.js +7 -28
- package/dist/core/constraints/checkers/governance-presence.js.map +1 -1
- package/dist/core/constraints/checkers/no-test-simplification.d.ts.map +1 -1
- package/dist/core/constraints/checkers/no-test-simplification.js +4 -3
- package/dist/core/constraints/checkers/no-test-simplification.js.map +1 -1
- package/dist/core/constraints/checkers/types.d.ts +2 -2
- package/dist/core/constraints/context-builder.d.ts +15 -14
- package/dist/core/constraints/context-builder.d.ts.map +1 -1
- package/dist/core/constraints/context-builder.js +32 -96
- package/dist/core/constraints/context-builder.js.map +1 -1
- package/dist/core/constraints/doc-freshness/runner.d.ts.map +1 -1
- package/dist/core/constraints/doc-freshness/runner.js +2 -1
- package/dist/core/constraints/doc-freshness/runner.js.map +1 -1
- package/dist/core/constraints/git-evidence.d.ts +60 -0
- package/dist/core/constraints/git-evidence.d.ts.map +1 -0
- package/dist/core/constraints/git-evidence.js +88 -0
- package/dist/core/constraints/git-evidence.js.map +1 -0
- package/dist/core/constraints/injection-drift.d.ts +3 -20
- package/dist/core/constraints/injection-drift.d.ts.map +1 -1
- package/dist/core/constraints/injection-drift.js +10 -57
- package/dist/core/constraints/injection-drift.js.map +1 -1
- package/dist/core/constraints/injection-writer.d.ts +113 -0
- package/dist/core/constraints/injection-writer.d.ts.map +1 -0
- package/dist/core/constraints/injection-writer.js +228 -0
- package/dist/core/constraints/injection-writer.js.map +1 -0
- package/dist/core/constraints/usage-report.d.ts +22 -1
- package/dist/core/constraints/usage-report.d.ts.map +1 -1
- package/dist/core/constraints/usage-report.js +27 -20
- package/dist/core/constraints/usage-report.js.map +1 -1
- package/dist/core/index.d.ts +2 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +4 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/project-config-loader.d.ts +32 -1
- package/dist/core/project-config-loader.d.ts.map +1 -1
- package/dist/core/project-config-loader.js +39 -9
- package/dist/core/project-config-loader.js.map +1 -1
- package/dist/core/validators/passes-gate.d.ts +15 -64
- package/dist/core/validators/passes-gate.d.ts.map +1 -1
- package/dist/core/validators/passes-gate.js +84 -222
- package/dist/core/validators/passes-gate.js.map +1 -1
- package/dist/core/validators/test-output.d.ts +58 -0
- package/dist/core/validators/test-output.d.ts.map +1 -0
- package/dist/core/validators/test-output.js +109 -0
- package/dist/core/validators/test-output.js.map +1 -0
- package/dist/failure/recorder.d.ts +7 -1
- package/dist/failure/recorder.d.ts.map +1 -1
- package/dist/failure/recorder.js +13 -9
- package/dist/failure/recorder.js.map +1 -1
- package/dist/gates/acceptance.d.ts +1 -48
- package/dist/gates/acceptance.d.ts.map +1 -1
- package/dist/gates/acceptance.js +6 -38
- package/dist/gates/acceptance.js.map +1 -1
- package/dist/gates/checker-gate.d.ts.map +1 -1
- package/dist/gates/checker-gate.js +6 -11
- package/dist/gates/checker-gate.js.map +1 -1
- package/dist/gates/command.d.ts.map +1 -1
- package/dist/gates/command.js +10 -22
- package/dist/gates/command.js.map +1 -1
- package/dist/gates/contract.d.ts.map +1 -1
- package/dist/gates/contract.js +22 -61
- package/dist/gates/contract.js.map +1 -1
- package/dist/gates/performance.d.ts.map +1 -1
- package/dist/gates/performance.js +13 -31
- package/dist/gates/performance.js.map +1 -1
- package/dist/gates/review.d.ts.map +1 -1
- package/dist/gates/review.js +21 -53
- package/dist/gates/review.js.map +1 -1
- package/dist/gates/security.d.ts.map +1 -1
- package/dist/gates/security.js +14 -32
- package/dist/gates/security.js.map +1 -1
- package/dist/gates/types.d.ts +28 -5
- package/dist/gates/types.d.ts.map +1 -1
- package/dist/gates/types.js +38 -1
- package/dist/gates/types.js.map +1 -1
- package/dist/hooks/bootstrap.d.ts +2 -0
- package/dist/hooks/bootstrap.d.ts.map +1 -1
- package/dist/hooks/bootstrap.js +5 -2
- package/dist/hooks/bootstrap.js.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -4
- package/dist/index.js.map +1 -1
- package/dist/knowledge/audit.d.ts +7 -2
- package/dist/knowledge/audit.d.ts.map +1 -1
- package/dist/knowledge/audit.js +59 -79
- package/dist/knowledge/audit.js.map +1 -1
- package/dist/knowledge/flywheel-metrics.d.ts +39 -0
- package/dist/knowledge/flywheel-metrics.d.ts.map +1 -0
- package/dist/knowledge/flywheel-metrics.js +47 -0
- package/dist/knowledge/flywheel-metrics.js.map +1 -0
- package/dist/knowledge/import.d.ts.map +1 -1
- package/dist/knowledge/import.js +4 -14
- package/dist/knowledge/import.js.map +1 -1
- package/dist/knowledge/index-generator.d.ts.map +1 -1
- package/dist/knowledge/index-generator.js +18 -15
- package/dist/knowledge/index-generator.js.map +1 -1
- package/dist/knowledge/ingest.d.ts.map +1 -1
- package/dist/knowledge/ingest.js +9 -4
- package/dist/knowledge/ingest.js.map +1 -1
- package/dist/knowledge/migration.d.ts.map +1 -1
- package/dist/knowledge/migration.js +11 -8
- package/dist/knowledge/migration.js.map +1 -1
- package/dist/knowledge/reference-tracker.d.ts.map +1 -1
- package/dist/knowledge/reference-tracker.js +12 -9
- package/dist/knowledge/reference-tracker.js.map +1 -1
- package/dist/knowledge/store.d.ts +15 -0
- package/dist/knowledge/store.d.ts.map +1 -1
- package/dist/knowledge/store.js +59 -10
- package/dist/knowledge/store.js.map +1 -1
- package/dist/monitoring/context-tracker.d.ts.map +1 -1
- package/dist/monitoring/context-tracker.js +11 -20
- package/dist/monitoring/context-tracker.js.map +1 -1
- package/dist/monitoring/index.d.ts +1 -1
- package/dist/monitoring/index.d.ts.map +1 -1
- package/dist/monitoring/index.js +1 -2
- package/dist/monitoring/index.js.map +1 -1
- package/dist/monitoring/trace-analyzer.d.ts +15 -0
- package/dist/monitoring/trace-analyzer.d.ts.map +1 -1
- package/dist/monitoring/trace-analyzer.js +19 -2
- package/dist/monitoring/trace-analyzer.js.map +1 -1
- package/dist/monitoring/traces.d.ts +21 -2
- package/dist/monitoring/traces.d.ts.map +1 -1
- package/dist/monitoring/traces.js +38 -29
- package/dist/monitoring/traces.js.map +1 -1
- package/dist/release/index.d.ts +3 -0
- package/dist/release/index.d.ts.map +1 -0
- package/dist/release/index.js +7 -0
- package/dist/release/index.js.map +1 -0
- package/dist/release/integrity.d.ts +65 -0
- package/dist/release/integrity.d.ts.map +1 -0
- package/dist/release/integrity.js +151 -0
- package/dist/release/integrity.js.map +1 -0
- package/dist/sdd/index-generator.js +10 -11
- package/dist/sdd/index-generator.js.map +1 -1
- package/dist/test-setup/project-fixture.d.ts +48 -0
- package/dist/test-setup/project-fixture.d.ts.map +1 -0
- package/dist/test-setup/project-fixture.js +106 -0
- package/dist/test-setup/project-fixture.js.map +1 -0
- package/dist/types/constraint.d.ts +0 -18
- package/dist/types/constraint.d.ts.map +1 -1
- package/dist/types/constraint.js.map +1 -1
- package/dist/types/failure.d.ts +7 -0
- package/dist/types/failure.d.ts.map +1 -1
- package/dist/types/failure.js +8 -1
- package/dist/types/failure.js.map +1 -1
- package/dist/types/passes-gate.d.ts +10 -25
- package/dist/types/passes-gate.d.ts.map +1 -1
- package/dist/types/project-config.d.ts +1 -1
- package/dist/types/session.d.ts +6 -5
- package/dist/types/session.d.ts.map +1 -1
- package/dist/utils/exec.d.ts +10 -0
- package/dist/utils/exec.d.ts.map +1 -1
- package/dist/utils/exec.js +12 -0
- package/dist/utils/exec.js.map +1 -1
- package/dist/utils/file-walk.d.ts +9 -1
- package/dist/utils/file-walk.d.ts.map +1 -1
- package/dist/utils/file-walk.js +10 -1
- package/dist/utils/file-walk.js.map +1 -1
- package/dist/utils/frontmatter.d.ts +73 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +141 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/jsonl.d.ts +92 -0
- package/dist/utils/jsonl.d.ts.map +1 -0
- package/dist/utils/jsonl.js +166 -0
- package/dist/utils/jsonl.js.map +1 -0
- package/dist/utils/package-version.d.ts +16 -0
- package/dist/utils/package-version.d.ts.map +1 -0
- package/dist/utils/package-version.js +63 -0
- package/dist/utils/package-version.js.map +1 -0
- package/package.json +1 -1
- package/src/CONTEXT.md +7 -2
- package/src/__tests__/acceptance-gate.test.ts +3 -1
- package/src/__tests__/checker-extra.test.ts +7 -1218
- package/src/__tests__/context-files-resolution.test.ts +116 -0
- package/src/__tests__/effective-constraints.test.ts +10 -13
- package/src/__tests__/exec.test.ts +35 -1
- package/src/__tests__/failure-recorder.test.ts +9 -0
- package/src/__tests__/layering.test.ts +152 -0
- package/src/__tests__/passes-gate-extra.test.ts +0 -145
- package/src/__tests__/passes-gate.test.ts +142 -106
- package/src/__tests__/public-exports.test.ts +3 -0
- package/src/__tests__/skip-semantics.test.ts +5 -9
- package/src/cli/__tests__/command-contract.test.ts +170 -0
- package/src/cli/command-contract.ts +108 -0
- package/src/cli/commands/CONTEXT.md +22 -7
- package/src/cli/commands/__tests__/acceptance.test.ts +40 -33
- package/src/cli/commands/__tests__/analyze-sessions.test.ts +35 -29
- package/src/cli/commands/__tests__/bin-exit-mapping.test.ts +101 -0
- package/src/cli/commands/__tests__/check-drift.test.ts +27 -34
- package/src/cli/commands/__tests__/check-skip-output.test.ts +21 -24
- package/src/cli/commands/__tests__/check.test.ts +378 -382
- package/src/cli/commands/__tests__/command.test.ts +85 -70
- package/src/cli/commands/__tests__/constraints-report.test.ts +100 -71
- package/src/cli/commands/__tests__/constraints-retire.test.ts +152 -95
- package/src/cli/commands/__tests__/contract.test.ts +27 -34
- package/src/cli/commands/__tests__/failure.test.ts +31 -34
- package/src/cli/commands/__tests__/init-injection.test.ts +58 -28
- package/src/cli/commands/__tests__/init.test.ts +77 -48
- package/src/cli/commands/__tests__/knowledge-flywheel-consistency.test.ts +108 -0
- package/src/cli/commands/__tests__/knowledge.test.ts +96 -38
- package/src/cli/commands/__tests__/passes-gate.test.ts +43 -45
- package/src/cli/commands/__tests__/performance.test.ts +22 -23
- package/src/cli/commands/__tests__/posteval-plan.test.ts +39 -38
- package/src/cli/commands/__tests__/project-path-anchoring.test.ts +157 -0
- package/src/cli/commands/__tests__/project-path-convention.test.ts +169 -0
- package/src/cli/commands/__tests__/registry.test.ts +69 -35
- package/src/cli/commands/__tests__/release.test.ts +224 -74
- package/src/cli/commands/__tests__/report-extra.test.ts +16 -16
- package/src/cli/commands/__tests__/report.test.ts +25 -25
- package/src/cli/commands/__tests__/review.test.ts +33 -31
- package/src/cli/commands/__tests__/security.test.ts +23 -27
- package/src/cli/commands/__tests__/spec-baseline-check.test.ts +20 -20
- package/src/cli/commands/__tests__/spec.test.ts +41 -29
- package/src/cli/commands/__tests__/status-extra.test.ts +18 -18
- package/src/cli/commands/__tests__/status-skipped-lines.test.ts +72 -0
- package/src/cli/commands/__tests__/status.test.ts +34 -34
- package/src/cli/commands/__tests__/sync-docs-agents.test.ts +108 -86
- package/src/cli/commands/__tests__/sync-docs.test.ts +72 -74
- package/src/cli/commands/__tests__/update-user-model.test.ts +62 -33
- package/src/cli/commands/__tests__/validate.test.ts +27 -29
- package/src/cli/commands/acceptance.ts +35 -24
- package/src/cli/commands/analyze-sessions.ts +25 -24
- package/src/cli/commands/check.ts +88 -65
- package/src/cli/commands/command.ts +30 -17
- package/src/cli/commands/constraints-report.ts +37 -34
- package/src/cli/commands/constraints-retire.ts +58 -55
- package/src/cli/commands/constraints.ts +10 -27
- package/src/cli/commands/contract.ts +51 -42
- package/src/cli/commands/definitions.ts +37 -223
- package/src/cli/commands/failure.ts +35 -27
- package/src/cli/commands/init.ts +166 -220
- package/src/cli/commands/knowledge.ts +250 -203
- package/src/cli/commands/passes-gate.ts +58 -68
- package/src/cli/commands/performance.ts +23 -18
- package/src/cli/commands/posteval-plan.ts +29 -15
- package/src/cli/commands/release.ts +75 -78
- package/src/cli/commands/report.ts +9 -5
- package/src/cli/commands/review.ts +39 -29
- package/src/cli/commands/sdd.ts +7 -5
- package/src/cli/commands/security.ts +35 -26
- package/src/cli/commands/spec-baseline-check.ts +16 -11
- package/src/cli/commands/spec.ts +66 -53
- package/src/cli/commands/status.ts +59 -53
- package/src/cli/commands/sync-docs/agents-syncer.ts +31 -15
- package/src/cli/commands/sync-docs/context-syncer.ts +3 -2
- package/src/cli/commands/sync-docs/index.ts +73 -100
- package/src/cli/commands/sync-docs/project-reader.ts +17 -18
- package/src/cli/commands/update-user-model.ts +33 -45
- package/src/cli/commands/validate.ts +31 -25
- package/src/cli/session-mining/__tests__/transcript.test.ts +118 -0
- package/src/cli/session-mining/transcript.ts +26 -8
- package/src/completion-checkers/CONTEXT.md +1 -1
- package/src/completion-checkers/__tests__/contract-presence.test.ts +1 -1
- package/src/completion-checkers/__tests__/phase-format.test.ts +1 -1
- package/src/completion-checkers/__tests__/tdd-chain.test.ts +2 -2
- package/src/completion-checkers/index.ts +3 -3
- package/src/completion-checkers/phase-format.ts +2 -2
- package/src/completion-checkers/tdd-chain.ts +2 -2
- package/src/completion-checkers/types.ts +5 -5
- package/src/context/session-manager.ts +19 -33
- package/src/core/CONTEXT.md +9 -6
- package/src/core/constraints/__tests__/capabilities-reconcile.test.ts +200 -0
- package/src/core/constraints/__tests__/capability-counts.test.ts +94 -0
- package/src/core/constraints/__tests__/git-evidence.test.ts +208 -0
- package/src/core/constraints/__tests__/injection-drift.test.ts +3 -10
- package/src/core/constraints/__tests__/injection-writer.test.ts +231 -0
- package/src/core/constraints/__tests__/trace-injection.test.ts +71 -0
- package/src/core/constraints/__tests__/usage-report.test.ts +112 -0
- package/src/core/constraints/agent-prompt-renderer.ts +2 -6
- package/src/core/constraints/capabilities-parser.ts +53 -35
- package/src/core/constraints/capabilities-reconcile.ts +166 -0
- package/src/core/constraints/checker.ts +75 -130
- package/src/core/constraints/checkers/__tests__/capability-sync.test.ts +214 -0
- package/src/core/constraints/checkers/__tests__/context-doc-sync.test.ts +77 -0
- package/src/core/constraints/checkers/__tests__/docs-freshness.test.ts +117 -0
- package/src/{__tests__ → core/constraints/checkers/__tests__}/governance-presence.test.ts +83 -9
- package/src/core/constraints/checkers/__tests__/iron-flags.test.ts +50 -0
- package/src/core/constraints/checkers/__tests__/no-bypass-checkpoint.test.ts +76 -0
- package/src/{__tests__ → core/constraints/checkers/__tests__}/no-hardcoded-credentials.test.ts +4 -3
- package/src/core/constraints/checkers/__tests__/no-test-simplification.test.ts +58 -0
- package/src/core/constraints/checkers/__tests__/three-state-consistency.test.ts +145 -0
- package/src/core/constraints/checkers/capability-sync.ts +29 -88
- package/src/core/constraints/checkers/context-doc-sync.ts +15 -25
- package/src/core/constraints/checkers/docs-freshness.ts +40 -69
- package/src/core/constraints/checkers/governance-presence.ts +7 -25
- package/src/core/constraints/checkers/no-test-simplification.ts +4 -3
- package/src/core/constraints/checkers/types.ts +2 -2
- package/src/core/constraints/context-builder.ts +39 -91
- package/src/core/constraints/doc-freshness/runner.ts +2 -1
- package/src/core/constraints/git-evidence.ts +120 -0
- package/src/core/constraints/injection-drift.ts +13 -60
- package/src/core/constraints/injection-writer.ts +212 -0
- package/src/core/constraints/usage-report.ts +36 -17
- package/src/core/index.ts +4 -2
- package/src/core/project-config-loader.ts +49 -9
- package/src/core/validators/__tests__/passes-gate.test.ts +2 -56
- package/src/core/validators/__tests__/test-output.test.ts +372 -0
- package/src/core/validators/passes-gate.ts +86 -248
- package/src/core/validators/test-output.ts +128 -0
- package/src/failure/__tests__/recorder.test.ts +168 -0
- package/src/failure/recorder.ts +13 -11
- package/src/gates/CONTEXT.md +6 -3
- package/src/gates/__tests__/acceptance-types-single-source.test.ts +68 -0
- package/src/gates/__tests__/acceptance.test.ts +4 -86
- package/src/gates/__tests__/effective-gates.test.ts +3 -8
- package/src/gates/__tests__/test-verdict-consistency.test.ts +140 -0
- package/src/gates/acceptance.ts +19 -84
- package/src/gates/checker-gate.ts +8 -7
- package/src/gates/command.ts +10 -16
- package/src/gates/contract.ts +22 -61
- package/src/gates/performance.ts +10 -22
- package/src/gates/review.ts +21 -41
- package/src/gates/security.ts +10 -22
- package/src/gates/types.ts +70 -5
- package/src/hooks/CONTEXT.md +1 -1
- package/src/hooks/bootstrap.ts +5 -2
- package/src/index.ts +11 -6
- package/src/knowledge/CONTEXT.md +8 -3
- package/src/knowledge/__tests__/audit-labels.test.ts +44 -0
- package/src/knowledge/__tests__/flywheel-metrics.test.ts +135 -0
- package/src/knowledge/__tests__/import.test.ts +44 -0
- package/src/knowledge/__tests__/index-generator.test.ts +55 -2
- package/src/knowledge/__tests__/ingest.test.ts +85 -0
- package/src/knowledge/__tests__/migration.test.ts +47 -0
- package/src/knowledge/__tests__/reference-tracker.test.ts +16 -0
- package/src/knowledge/__tests__/store.test.ts +194 -0
- package/src/knowledge/audit.ts +67 -71
- package/src/knowledge/flywheel-metrics.ts +71 -0
- package/src/knowledge/import.ts +4 -18
- package/src/knowledge/index-generator.ts +20 -15
- package/src/knowledge/ingest.ts +9 -4
- package/src/knowledge/migration.ts +11 -8
- package/src/knowledge/reference-tracker.ts +12 -8
- package/src/knowledge/store.ts +64 -11
- package/src/monitoring/CONTEXT.md +8 -3
- package/src/monitoring/__tests__/skipped-lines-report.test.ts +178 -0
- package/src/monitoring/__tests__/traces.test.ts +57 -0
- package/src/monitoring/context-tracker.ts +11 -23
- package/src/monitoring/index.ts +1 -1
- package/src/monitoring/trace-analyzer.ts +21 -2
- package/src/monitoring/traces.ts +39 -36
- package/src/release/CONTEXT.md +24 -0
- package/src/release/__tests__/barrel.test.ts +60 -0
- package/src/release/__tests__/integrity.test.ts +157 -0
- package/src/release/index.ts +2 -0
- package/src/release/integrity.ts +141 -0
- package/src/sdd/__tests__/index-generator.test.ts +71 -0
- package/src/sdd/index-generator.ts +9 -9
- package/src/test-setup/__tests__/project-fixture.test.ts +178 -0
- package/src/test-setup/project-fixture.ts +87 -0
- package/src/tools/CONTEXT.md +6 -0
- package/src/tools/__tests__/registry.test.ts +221 -0
- package/src/types/__tests__/types.test.ts +4 -5
- package/src/types/constraint.ts +0 -25
- package/src/types/failure.ts +8 -0
- package/src/types/passes-gate.ts +10 -30
- package/src/types/project-config.ts +1 -1
- package/src/types/session.ts +5 -5
- package/src/utils/__tests__/frontmatter.test.ts +206 -0
- package/src/utils/__tests__/jsonl-skip-disposition.test.ts +175 -0
- package/src/utils/__tests__/jsonl.test.ts +187 -0
- package/src/utils/__tests__/package-version.test.ts +97 -0
- package/src/utils/exec.ts +15 -0
- package/src/utils/file-walk.ts +11 -2
- package/src/utils/frontmatter.ts +121 -0
- package/src/utils/jsonl.ts +167 -0
- package/src/utils/package-version.ts +27 -0
- package/dist/cli/commands/doc-freshness-check.d.ts +0 -53
- package/dist/cli/commands/doc-freshness-check.d.ts.map +0 -1
- package/dist/cli/commands/doc-freshness-check.js +0 -352
- package/dist/cli/commands/doc-freshness-check.js.map +0 -1
- package/dist/types/index.d.ts +0 -14
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -39
- package/dist/types/index.js.map +0 -1
- package/src/__tests__/long-running.test.ts +0 -17
- package/src/__tests__/passes-gate-extension.test.ts +0 -151
- package/src/cli/commands/__tests__/doc-freshness-check.test.ts +0 -168
- package/src/cli/commands/doc-freshness-check.ts +0 -386
- package/src/spec/CONTEXT.md +0 -11
- package/src/types/index.ts +0 -47
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,21 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [1.4.0] - 2026-09-08
|
|
10
|
+
|
|
11
|
+
### Changes
|
|
12
|
+
- fix(core,gates)!: 两个测试门禁判「过没过」的依据统一为**退出码为主 + 文本交叉否决**(ADR-0014,harness#93)——判定收在 `core/validators/test-output.ts` 新增的 `judgeTestRun({exitCode, output, allowPartialPass})` 一处,两门禁的结论一律从它取:passes-gate 成功分支不再硬编码 `passed = true`(exit 0 而输出含 `✕` 用例 / `FAIL <path>` 套件行 / `N failed` 汇总行 → 判负),acceptance 弃用裸 `includes('PASS') && !includes('FAIL')` 兜底(通过的用例名里带大写 `FAIL`、路径含 `FAIL/` 目录名不再反转结论;jest 零失败汇总行无 "passed" 字样也不再误伤),文本再也救不回非零退出。`allowPartialPass`(CLI `--allow-partial`)的落点从「赦免非零退出」移到「关闭文本否决」这一维。exit 0 的空输出/零测试不再判负(零测试识别另票)。按 minor 发布:`PassesGate.check()` 的 `allowed` 得出条件属行为变更,studio 消费的 `{allowed, violations}` 形状不变
|
|
13
|
+
- refactor(core)!: **harness 核心判定不取数、不执法覆盖率**(裁决 B 删薄,ADR-0015,harness#94)——删 `core/validators/test-output.ts` 的 `extractCoverage`(stdout 文本正则路:jest `All files |`、istanbul `Statements :`、pytest-cov `TOTAL`)与公开类型 `TaskTestResult.coverage`(含 `types/session.ts` 模块内镜像类型的同名字段):该正则的唯一用途是填这个全仓零读取的展示字段,`PassesGate.check()` 只读 `passed`/`evidence`。保留并逐字不变的两处真执法:CLI `harness passes-gate --coverage`(`coverageCheck`,读 json-summary、阈值默认 80、未达标不改退出码)与 `performance` 门禁的 `collectCoverage`;`check()` 入参类型 `TestResult.coverage` 亦保留(调用方自备数据,只原样回显)。职责边界定名:要「覆盖率不达阈值就拦」用 performance 门禁或 CI,不用 passes-gate。按 minor 发布:`TaskTestResult` / `ExtensionTestResult` 是包根公开类型的字段收缩,唯一外部消费方 studio 对该字段零引用(ADR-0012 核实),不留兼容 shim
|
|
14
|
+
- fix(core,gates)!: 两个门禁的 `-p/--project-path` 不再半失效(harness#95)——立约定「projectPath 只在 CLI 入口兜底一次,之后传到每个 IO/执行点」并据此修两处:`PassesGate.runTests()` 内部的 `const workDir = process.cwd()` 改为**必传形参** `runTests(workDir)`(此前 `-p` 只喂命令探测,执行与证据落盘仍在 cwd → 拿 A 工程的命令、在 B 目录跑、证据写进 B),`SpecAcceptanceGate` 删掉构造器默认值 `tasksPath: './tasks.yml'`、check() 取径统一 `path.resolve(context.projectPath, …)`(相对值不再按调用方 cwd 解析;acceptance 的「无 tasks.yml 即跳过」本身是 passed:true,读错位置即假绿)。约定正本 `src/cli/commands/CONTEXT.md`;机器可检两道闸:`src/cli/commands/__tests__/project-path-convention.test.ts`(CLI 层 cwd 只能是兜底形状 + 下游 cwd 站点与 `xxxPath: 相对值` 默认值冻结豁免表,逐条带理由、站点消失不删条目也失败)与 `project-path-anchoring.test.ts`(前提统一 cwd ≠ projectPath、不 mock 任何 IO 的行为回归)。同型扫荡三处豁免留痕:`release` 的 pkgPath(定义表本无 `-p`,根已逐个传给每条 `run(cmd, pkgPath)`)、`constraints` 的版本读取(报 harness 自身包版本,主锚 `__dirname`、cwd 仅兜底)、`core/spec/validator.ts` 的 `schemaPath: './specs/schemas'`(**确是同型病灶**:找 spec 文件用 projectPath、找 schema 用 cwd;`validateFile`/`loadSchema` 签名无根,属 spec 域收口,另票)。按 minor 发布:`PassesGate.runTests()` 是包根公开类的方法签名变更(调用方必须传执行根),无 config 构造的 `SpecAcceptanceGate` 其 tasks.yml 落点从 `<cwd>/tasks.yml` 变为 `<projectPath>/tasks.yml`
|
|
15
|
+
- feat(monitoring,core,cli): 坏行计数从 module 层贯通到消费面——立契约「**凡以 `skip` 策略读 JSONL,坏行计数必须到达该消费面的用户可见输出,或在调用点显式记名豁免并写明理由**」(#82 范围外项,harness#100)——#82 只做到「不抛 + 返回部分结果」,同一份损坏在四条路里两条静默吞、一条把损坏算成正常、一条报错,studio 端点连原来的 `logger.error` 都没了。承载纯增量、不动任何既有签名:`TraceCollector.readReport(filter?)` 与 `TraceAnalyzer.analyzeRecentReport(hours)` 是新增报告入口(就地返回形状 `{traces|summaries, skippedLines}`,`JsonlReadResult`/`JsonlBadLinePolicy` 不进包根,ADR-0003 类型面零扩张),`read()/readRecent()/readByConstraint()/getStats()/analyzeRecent()/analyzeConstraint()` 退化为丢掉计数的薄包装(#82 裁决 4 的兼容约束继续成立,`skipped-lines-report.test.ts` 用类型断言 + `@ts-expect-error` 在编译期钉住),计数是**文件级口径**(坏行没有 timestamp/constraintId 可归窗,故消费方无法用「原始行数 − 统计条数」反推——这条写死,挡实现捷径)。四处消费点逐一收口:`constraints report` 的坏行数挂 `ConstraintsUsageReport.traceFileExists` 同一降级维度(新增 `readProjectTracesReport()`,文本降级行 / `--json` 字段 / `--export` 摘要行三处呈现,只报条数不报路径与坏行内容)、`harness status` 的 `记录数` 保持原始行数口径**逐字节不变**(坏行另起一行 stderr,改口径属行为变更本票不做)、`constraints retire` 两条路径(交互与 `--yes` 直达)落盘前告知、`failure list` 的 #96 定稿文案与退出码逐字未动。其余 skip 读点逐个记名豁免(transcript / session-manager×2 / context-builder×2 / context-tracker / reference-tracker / recorder),豁免注释如实写明影响方向与不透传的代价;机器可检面新增 `src/utils/__tests__/jsonl-skip-disposition.test.ts` 三道闸(每个 `readJsonl` 调用点必须判得出策略、skip 读点集合冻结 12 处、每个读点上方 6 行内声明 `计数去向:` 且邻居声明不顶替)。studio 半边(端点响应体加 `skippedLines`)在 **dommaker/studio#451**,前置是本票随 `harness-ship release` 发版
|
|
16
|
+
|
|
17
|
+
## [1.3.0] - 2026-09-01
|
|
18
|
+
|
|
19
|
+
### Changes
|
|
20
|
+
- docs(release): 覆盖口径显式化——深度内部文件不在清单是裁决非遗漏(harness#77)
|
|
21
|
+
- feat(release): 发布物完整性自检能力公开导出(harness#77)
|
|
22
|
+
- refactor(boundary): 边界净化——词表泛化 + knowledge 缺省数据根 + failures.log 口径(harness#76)
|
|
23
|
+
|
|
9
24
|
## [1.2.3] - 2026-08-28
|
|
10
25
|
|
|
11
26
|
### Changes
|
package/README.md
CHANGED
|
@@ -36,7 +36,6 @@ await checkBeforeExecution({
|
|
|
36
36
|
operation: 'code_implementation',
|
|
37
37
|
taskDescription: '重构用户认证模块',
|
|
38
38
|
projectPath: '/path/to/project',
|
|
39
|
-
hasWorktree: true,
|
|
40
39
|
});
|
|
41
40
|
|
|
42
41
|
// 获取约束元数据
|
|
@@ -111,7 +110,6 @@ harness update-user-model # 增量更新用户思维模型
|
|
|
111
110
|
|
|
112
111
|
# 文档与 Spec
|
|
113
112
|
harness sync-docs # 同步 CAPABILITIES.md + CONTEXT.md + AGENTS.md
|
|
114
|
-
harness doc-freshness-check # 文档声明新鲜度检查
|
|
115
113
|
harness spec # Spec 验证
|
|
116
114
|
harness spec-baseline-check # Spec 前置条件验证
|
|
117
115
|
harness sdd # SDD 索引管理
|
package/bin/harness.js
CHANGED
|
@@ -11,18 +11,43 @@
|
|
|
11
11
|
* COMMAND_DEFINITIONS(非门禁命令)与 GATE_DEFINITIONS.cli(6 门禁命令,
|
|
12
12
|
* 形状同为 CommandDefinition,ADR-0007),不含任何单命令知识;
|
|
13
13
|
* 新增命令 = 命令文件 + 定义表一条 + 测试,不再改本文件。
|
|
14
|
+
*
|
|
15
|
+
* 架构评审候选7:本文件是**全仓唯一的退出码出口**。命令实现返回 CommandResult
|
|
16
|
+
* ({ kind, reason? }),此处按 kind 做唯一映射(ok/skip → 0,fail/usage-error → 1);
|
|
17
|
+
* 命令实现与定义表内不得出现 process.exit / process.exitCode。
|
|
14
18
|
*/
|
|
15
19
|
|
|
16
20
|
const { Command } = require('commander');
|
|
17
21
|
const { version } = require('../package.json');
|
|
18
22
|
|
|
19
23
|
/**
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
|
|
24
|
+
* kind → 对外退出码(历史面只有 0/1;语义进类型,码值映射只在这一处)。
|
|
25
|
+
* 未知/缺失 kind = 命令契约违规 → fail-closed。
|
|
26
|
+
*/
|
|
27
|
+
function exitCodeFor(result) {
|
|
28
|
+
switch (result && result.kind) {
|
|
29
|
+
case 'ok':
|
|
30
|
+
case 'skip':
|
|
31
|
+
return 0;
|
|
32
|
+
case 'fail':
|
|
33
|
+
case 'usage-error':
|
|
34
|
+
return 1;
|
|
35
|
+
default:
|
|
36
|
+
console.error(`[harness] 命令返回了未知判定结果(期望 kind ok/skip/fail/usage-error): ${JSON.stringify(result)}`);
|
|
37
|
+
return 1;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* 把命令判定映射到进程退出码。
|
|
43
|
+
* 0 不退出(沿用进程自然退出,保持 stdout 冲刷行为不变);非 0 立即退出
|
|
44
|
+
* (与历史各命令自身的 process.exit 行为一致:首败即停)。
|
|
23
45
|
*/
|
|
24
|
-
|
|
25
|
-
const
|
|
46
|
+
function applyResult(result) {
|
|
47
|
+
const code = exitCodeFor(result);
|
|
48
|
+
if (code !== 0) process.exit(code);
|
|
49
|
+
return code;
|
|
50
|
+
}
|
|
26
51
|
|
|
27
52
|
/**
|
|
28
53
|
* per-command 懒加载(O2):按定义表中的 module+export 引用,只在 action
|
|
@@ -81,19 +106,31 @@ function buildCommand(parent, def) {
|
|
|
81
106
|
}
|
|
82
107
|
}
|
|
83
108
|
|
|
109
|
+
/**
|
|
110
|
+
* 子命令解析:主名直查,别名表遍历匹配(候选7:别名是数据,不再复印条目)
|
|
111
|
+
*/
|
|
112
|
+
function resolveSubcommand(subcommands, name) {
|
|
113
|
+
if (subcommands[name]) return subcommands[name];
|
|
114
|
+
for (const entry of Object.values(subcommands)) {
|
|
115
|
+
if (entry.aliases && entry.aliases.includes(name)) return entry;
|
|
116
|
+
}
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
|
|
84
120
|
/**
|
|
85
121
|
* 执行一条命令定义:
|
|
86
122
|
* 1. optionRoutes(选项条件路由,全部匹配项按序执行,替代默认 action)
|
|
87
|
-
* 2. subcommands
|
|
123
|
+
* 2. subcommands(位置参数首值路由,含别名;strict 下未知值报错退出)
|
|
88
124
|
* 3. 默认 action
|
|
89
|
-
*
|
|
125
|
+
* 每条路由/子命令/action 的返回值都经 applyResult 映射退出码(首败即停,
|
|
126
|
+
* 与历史命令自身 process.exit 的截断行为一致)。
|
|
90
127
|
*/
|
|
91
128
|
async function runDefinition(command, def, positionals, options) {
|
|
92
129
|
if (def.optionRoutes) {
|
|
93
130
|
const matched = def.optionRoutes.filter(r => options[r.flag] === r.when);
|
|
94
131
|
if (matched.length > 0) {
|
|
95
132
|
for (const route of matched) {
|
|
96
|
-
await callImpl(route.impl,
|
|
133
|
+
applyResult(await callImpl(route.impl, [options]));
|
|
97
134
|
}
|
|
98
135
|
return;
|
|
99
136
|
}
|
|
@@ -102,15 +139,18 @@ async function runDefinition(command, def, positionals, options) {
|
|
|
102
139
|
if (def.subcommands) {
|
|
103
140
|
const sub = positionals[0];
|
|
104
141
|
if (sub != null) {
|
|
105
|
-
const entry = def.subcommands
|
|
142
|
+
const entry = resolveSubcommand(def.subcommands, sub);
|
|
106
143
|
if (entry) {
|
|
107
|
-
const
|
|
108
|
-
|
|
144
|
+
const callArgs = entry.withPositionals
|
|
145
|
+
? [positionals.slice(1), options]
|
|
146
|
+
: [options];
|
|
147
|
+
applyResult(await callImpl(entry.impl, callArgs));
|
|
109
148
|
return;
|
|
110
149
|
}
|
|
111
150
|
if (def.subcommandStrict !== false) {
|
|
112
151
|
console.error(`未知子命令: ${sub}`);
|
|
113
|
-
|
|
152
|
+
applyResult({ kind: 'usage-error', reason: `未知子命令: ${sub}` });
|
|
153
|
+
return;
|
|
114
154
|
}
|
|
115
155
|
// 非 strict(如 spec / 门禁命令):未知位置参数落回默认 action
|
|
116
156
|
} else if (!def.bareRunsAction) {
|
|
@@ -124,27 +164,41 @@ async function runDefinition(command, def, positionals, options) {
|
|
|
124
164
|
command.help();
|
|
125
165
|
return;
|
|
126
166
|
}
|
|
127
|
-
|
|
128
|
-
|
|
167
|
+
applyResult(await callImpl(def.action, def.mapActionArgs ? def.mapActionArgs(positionals, options) : [options]));
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* 构建命令树并解析。定义表在此处才 require(纯数据模块,保持 --help/--version
|
|
172
|
+
* 零命令实现加载);被 require 时(bin 侧退出码映射测试)不触发解析。
|
|
173
|
+
*/
|
|
174
|
+
function main() {
|
|
175
|
+
const { COMMAND_DEFINITIONS } = require('../dist/cli/commands/definitions');
|
|
176
|
+
const { GATE_DEFINITIONS } = require('../dist/gates/definitions');
|
|
177
|
+
|
|
178
|
+
const program = new Command();
|
|
179
|
+
|
|
180
|
+
program
|
|
181
|
+
.name('harness')
|
|
182
|
+
.description('通用工程约束框架 - 铁律系统、检查点验证、测试门控、执行追踪')
|
|
183
|
+
.version(version);
|
|
184
|
+
|
|
185
|
+
// ========================================
|
|
186
|
+
// 全部命令:注册表驱动生成(非门禁 COMMAND_DEFINITIONS + 门禁 GATE_DEFINITIONS.cli,
|
|
187
|
+
// 形状同为 CommandDefinition,ADR-0007)
|
|
188
|
+
// ========================================
|
|
189
|
+
for (const def of [
|
|
190
|
+
...COMMAND_DEFINITIONS,
|
|
191
|
+
...GATE_DEFINITIONS.filter(g => g.cli).map(g => g.cli),
|
|
192
|
+
]) {
|
|
193
|
+
buildCommand(program, def);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// 解析命令行参数
|
|
197
|
+
program.parse();
|
|
129
198
|
}
|
|
130
199
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
program
|
|
134
|
-
.name('harness')
|
|
135
|
-
.description('通用工程约束框架 - 铁律系统、检查点验证、测试门控、执行追踪')
|
|
136
|
-
.version(version);
|
|
137
|
-
|
|
138
|
-
// ========================================
|
|
139
|
-
// 全部命令:注册表驱动生成(非门禁 COMMAND_DEFINITIONS + 门禁 GATE_DEFINITIONS.cli,
|
|
140
|
-
// 形状同为 CommandDefinition,ADR-0007)
|
|
141
|
-
// ========================================
|
|
142
|
-
for (const def of [
|
|
143
|
-
...COMMAND_DEFINITIONS,
|
|
144
|
-
...GATE_DEFINITIONS.filter(g => g.cli).map(g => g.cli),
|
|
145
|
-
]) {
|
|
146
|
-
buildCommand(program, def);
|
|
200
|
+
if (require.main === module) {
|
|
201
|
+
main();
|
|
147
202
|
}
|
|
148
203
|
|
|
149
|
-
|
|
150
|
-
program.parse();
|
|
204
|
+
module.exports = { exitCodeFor, applyResult };
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI 命令契约(架构评审候选7)
|
|
3
|
+
*
|
|
4
|
+
* 命令实现的 interface 由两部分组成,都在本模块定义:
|
|
5
|
+
* - **返回值 `CommandResult`**:判定结果(哪个 kind、为什么)。退出码不再由命令
|
|
6
|
+
* 自己 `process.exit`,而是由 bin 依 kind 唯一映射(`process.exit` 因此只出现在
|
|
7
|
+
* bin/harness.js 一处)。
|
|
8
|
+
* - **写入面 `CommandIO`**:流式输出去向。命令一律经注入的 io 打印,缺省 process
|
|
9
|
+
* 标准流——长命令(如 release)边跑边输出,不憋到结束由 bin 统一打印。
|
|
10
|
+
*
|
|
11
|
+
* 对外行为护栏:`processIO` 下 log/logError 的输出字节与 console.log/console.error
|
|
12
|
+
* 逐字一致(见 __tests__/command-contract.test.ts),CLI 语法与文案冻结。
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* 命令判定类别。
|
|
16
|
+
* 对外退出码只有 0/1(历史面),语义放进 kind,码值映射收敛在 bin。
|
|
17
|
+
*/
|
|
18
|
+
export type CommandKind = 'ok' | 'skip' | 'fail' | 'usage-error';
|
|
19
|
+
/**
|
|
20
|
+
* 命令实现返回值(判别联合)。
|
|
21
|
+
* `fail` / `usage-error` 必附 `reason`,且 reason 要能唯一定位失败点
|
|
22
|
+
* (多闸门命令须含闸门标识);`skip` 可选附原因。
|
|
23
|
+
*/
|
|
24
|
+
export type CommandResult = {
|
|
25
|
+
kind: 'ok';
|
|
26
|
+
} | {
|
|
27
|
+
kind: 'skip';
|
|
28
|
+
reason?: string;
|
|
29
|
+
} | {
|
|
30
|
+
kind: 'fail';
|
|
31
|
+
reason: string;
|
|
32
|
+
} | {
|
|
33
|
+
kind: 'usage-error';
|
|
34
|
+
reason: string;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* 命令输出流注入面(最小可写接口,`process.stdout` / `process.stderr` 结构化满足)
|
|
38
|
+
*/
|
|
39
|
+
export interface CommandIO {
|
|
40
|
+
stdout: {
|
|
41
|
+
write(chunk: string): boolean;
|
|
42
|
+
};
|
|
43
|
+
stderr: {
|
|
44
|
+
write(chunk: string): boolean;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/** 缺省 io:process 标准流(bin 不注入时的现状行为) */
|
|
48
|
+
export declare const processIO: CommandIO;
|
|
49
|
+
/**
|
|
50
|
+
* 与 console.log 同语义(util.format + 换行)写入 io.stdout
|
|
51
|
+
*/
|
|
52
|
+
export declare function log(io: CommandIO, ...args: unknown[]): void;
|
|
53
|
+
/**
|
|
54
|
+
* 与 console.error 同语义(util.format + 换行)写入 io.stderr
|
|
55
|
+
*/
|
|
56
|
+
export declare function logError(io: CommandIO, ...args: unknown[]): void;
|
|
57
|
+
/**
|
|
58
|
+
* 捕获型 io:测试注入面,替代 `spyOn(process, 'exit')` 时代的彩色字符串断言。
|
|
59
|
+
*/
|
|
60
|
+
export interface CapturingIO extends CommandIO {
|
|
61
|
+
/** 已写入 stdout 的全部文本 */
|
|
62
|
+
outText(): string;
|
|
63
|
+
/** 已写入 stderr 的全部文本 */
|
|
64
|
+
errText(): string;
|
|
65
|
+
/** stdout 按行切分(末尾换行不产生空尾行) */
|
|
66
|
+
outLines(): string[];
|
|
67
|
+
/** stderr 按行切分(末尾换行不产生空尾行) */
|
|
68
|
+
errLines(): string[];
|
|
69
|
+
/** stdout 每次写入的原始文本(一次 log 调用 = 一条记录,等价旧的 console.log 调用参数视图) */
|
|
70
|
+
outRecords(): string[];
|
|
71
|
+
/** stderr 每次写入的原始文本 */
|
|
72
|
+
errRecords(): string[];
|
|
73
|
+
}
|
|
74
|
+
export declare function captureIO(): CapturingIO;
|
|
75
|
+
/**
|
|
76
|
+
* 解析 --json 命令的捕获输出(测试断言面,harness#108)
|
|
77
|
+
*
|
|
78
|
+
* 与 captureIO 同住一处:它是 captureIO 的消费端正本,此前散在各命令测试里
|
|
79
|
+
* 逐字复制(JSON.parse(outText()))。缺省返回 Record 形状;消费方已知字段
|
|
80
|
+
* 形状时传泛型(如 lastJsonOutput<any>(io) 做任意字段穿透)。
|
|
81
|
+
*/
|
|
82
|
+
export declare function lastJsonOutput<T = Record<string, unknown>>(capture: CapturingIO): T;
|
|
83
|
+
//# sourceMappingURL=command-contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-contract.d.ts","sourceRoot":"","sources":["../../src/cli/command-contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,aAAa,CAAC;AAEjE;;;;GAIG;AACH,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,GACd;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE;QAAE,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IAC1C,MAAM,EAAE;QAAE,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;CAC3C;AAED,uCAAuC;AACvC,eAAO,MAAM,SAAS,EAAE,SAGvB,CAAC;AAEF;;GAEG;AACH,wBAAgB,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAE3D;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAEhE;AAED;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,SAAS;IAC5C,uBAAuB;IACvB,OAAO,IAAI,MAAM,CAAC;IAClB,uBAAuB;IACvB,OAAO,IAAI,MAAM,CAAC;IAClB,8BAA8B;IAC9B,QAAQ,IAAI,MAAM,EAAE,CAAC;IACrB,8BAA8B;IAC9B,QAAQ,IAAI,MAAM,EAAE,CAAC;IACrB,iEAAiE;IACjE,UAAU,IAAI,MAAM,EAAE,CAAC;IACvB,uBAAuB;IACvB,UAAU,IAAI,MAAM,EAAE,CAAC;CACxB;AAED,wBAAgB,SAAS,IAAI,WAAW,CAiBvC;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,WAAW,GAAG,CAAC,CAEnF"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CLI 命令契约(架构评审候选7)
|
|
4
|
+
*
|
|
5
|
+
* 命令实现的 interface 由两部分组成,都在本模块定义:
|
|
6
|
+
* - **返回值 `CommandResult`**:判定结果(哪个 kind、为什么)。退出码不再由命令
|
|
7
|
+
* 自己 `process.exit`,而是由 bin 依 kind 唯一映射(`process.exit` 因此只出现在
|
|
8
|
+
* bin/harness.js 一处)。
|
|
9
|
+
* - **写入面 `CommandIO`**:流式输出去向。命令一律经注入的 io 打印,缺省 process
|
|
10
|
+
* 标准流——长命令(如 release)边跑边输出,不憋到结束由 bin 统一打印。
|
|
11
|
+
*
|
|
12
|
+
* 对外行为护栏:`processIO` 下 log/logError 的输出字节与 console.log/console.error
|
|
13
|
+
* 逐字一致(见 __tests__/command-contract.test.ts),CLI 语法与文案冻结。
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.processIO = void 0;
|
|
17
|
+
exports.log = log;
|
|
18
|
+
exports.logError = logError;
|
|
19
|
+
exports.captureIO = captureIO;
|
|
20
|
+
exports.lastJsonOutput = lastJsonOutput;
|
|
21
|
+
const util_1 = require("util");
|
|
22
|
+
/** 缺省 io:process 标准流(bin 不注入时的现状行为) */
|
|
23
|
+
exports.processIO = {
|
|
24
|
+
stdout: process.stdout,
|
|
25
|
+
stderr: process.stderr,
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* 与 console.log 同语义(util.format + 换行)写入 io.stdout
|
|
29
|
+
*/
|
|
30
|
+
function log(io, ...args) {
|
|
31
|
+
io.stdout.write((0, util_1.format)(...args) + '\n');
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 与 console.error 同语义(util.format + 换行)写入 io.stderr
|
|
35
|
+
*/
|
|
36
|
+
function logError(io, ...args) {
|
|
37
|
+
io.stderr.write((0, util_1.format)(...args) + '\n');
|
|
38
|
+
}
|
|
39
|
+
function captureIO() {
|
|
40
|
+
let out = '';
|
|
41
|
+
let err = '';
|
|
42
|
+
const outChunks = [];
|
|
43
|
+
const errChunks = [];
|
|
44
|
+
const split = (text) => text.endsWith('\n') ? text.slice(0, -1).split('\n') : (text === '' ? [] : text.split('\n'));
|
|
45
|
+
return {
|
|
46
|
+
stdout: { write: (chunk) => { out += chunk; outChunks.push(chunk); return true; } },
|
|
47
|
+
stderr: { write: (chunk) => { err += chunk; errChunks.push(chunk); return true; } },
|
|
48
|
+
outText: () => out,
|
|
49
|
+
errText: () => err,
|
|
50
|
+
outLines: () => split(out),
|
|
51
|
+
errLines: () => split(err),
|
|
52
|
+
outRecords: () => [...outChunks],
|
|
53
|
+
errRecords: () => [...errChunks],
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* 解析 --json 命令的捕获输出(测试断言面,harness#108)
|
|
58
|
+
*
|
|
59
|
+
* 与 captureIO 同住一处:它是 captureIO 的消费端正本,此前散在各命令测试里
|
|
60
|
+
* 逐字复制(JSON.parse(outText()))。缺省返回 Record 形状;消费方已知字段
|
|
61
|
+
* 形状时传泛型(如 lastJsonOutput<any>(io) 做任意字段穿透)。
|
|
62
|
+
*/
|
|
63
|
+
function lastJsonOutput(capture) {
|
|
64
|
+
return JSON.parse(capture.outText());
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=command-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-contract.js","sourceRoot":"","sources":["../../src/cli/command-contract.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;AAsCH,kBAEC;AAKD,4BAEC;AAoBD,8BAiBC;AASD,wCAEC;AA7FD,+BAA8B;AA2B9B,uCAAuC;AAC1B,QAAA,SAAS,GAAc;IAClC,MAAM,EAAE,OAAO,CAAC,MAAM;IACtB,MAAM,EAAE,OAAO,CAAC,MAAM;CACvB,CAAC;AAEF;;GAEG;AACH,SAAgB,GAAG,CAAC,EAAa,EAAE,GAAG,IAAe;IACnD,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,aAAM,EAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,SAAgB,QAAQ,CAAC,EAAa,EAAE,GAAG,IAAe;IACxD,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,aAAM,EAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AAC1C,CAAC;AAoBD,SAAgB,SAAS;IACvB,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,CAAC,IAAY,EAAY,EAAE,CACvC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9F,OAAO;QACL,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,KAAa,EAAE,EAAE,GAAG,GAAG,IAAI,KAAK,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE;QAC3F,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,KAAa,EAAE,EAAE,GAAG,GAAG,IAAI,KAAK,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE;QAC3F,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG;QAClB,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG;QAClB,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC;QAC1B,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC;QAC1B,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC;QAChC,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC;KACjC,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,cAAc,CAA8B,OAAoB;IAC9E,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* 验收标准门控,检查任务是否满足验收标准
|
|
5
5
|
*/
|
|
6
|
+
import { type CommandIO, type CommandResult } from '../command-contract';
|
|
6
7
|
export interface AcceptanceOptions {
|
|
7
8
|
/** 任务 ID */
|
|
8
9
|
taskId?: string;
|
|
@@ -18,9 +19,9 @@ export interface AcceptanceOptions {
|
|
|
18
19
|
/**
|
|
19
20
|
* 执行验收门控
|
|
20
21
|
*/
|
|
21
|
-
export declare function acceptance(options: AcceptanceOptions): Promise<
|
|
22
|
+
export declare function acceptance(options: AcceptanceOptions, io?: CommandIO): Promise<CommandResult>;
|
|
22
23
|
/**
|
|
23
24
|
* 列出所有任务及其验收标准
|
|
24
25
|
*/
|
|
25
|
-
export declare function listAcceptanceCriteria(options: AcceptanceOptions): Promise<
|
|
26
|
+
export declare function listAcceptanceCriteria(options: AcceptanceOptions, io?: CommandIO): Promise<CommandResult>;
|
|
26
27
|
//# sourceMappingURL=acceptance.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acceptance.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/acceptance.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"acceptance.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/acceptance.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EAAkB,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzF,MAAM,WAAW,iBAAiB;IAChC,YAAY;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mBAAmB;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,kBAAkB;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,iBAAiB,EAC1B,EAAE,GAAE,SAAqB,GACxB,OAAO,CAAC,aAAa,CAAC,CA8CxB;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,iBAAiB,EAC1B,EAAE,GAAE,SAAqB,GACxB,OAAO,CAAC,aAAa,CAAC,CAmCxB"}
|
|
@@ -47,11 +47,12 @@ const chalk_1 = __importDefault(require("chalk"));
|
|
|
47
47
|
const fs = __importStar(require("fs/promises"));
|
|
48
48
|
const path = __importStar(require("path"));
|
|
49
49
|
const acceptance_1 = require("../../gates/acceptance");
|
|
50
|
+
const command_contract_1 = require("../command-contract");
|
|
50
51
|
/**
|
|
51
52
|
* 执行验收门控
|
|
52
53
|
*/
|
|
53
|
-
async function acceptance(options) {
|
|
54
|
-
|
|
54
|
+
async function acceptance(options, io = command_contract_1.processIO) {
|
|
55
|
+
(0, command_contract_1.log)(io, chalk_1.default.blue('📋 验收标准门控检查...'));
|
|
55
56
|
const projectPath = options.projectPath || process.cwd();
|
|
56
57
|
// 创建验收门控实例
|
|
57
58
|
const gate = new acceptance_1.SpecAcceptanceGate({
|
|
@@ -67,37 +68,38 @@ async function acceptance(options) {
|
|
|
67
68
|
};
|
|
68
69
|
const result = await gate.check(context);
|
|
69
70
|
if (result.passed) {
|
|
70
|
-
|
|
71
|
-
|
|
71
|
+
(0, command_contract_1.log)(io);
|
|
72
|
+
(0, command_contract_1.log)(io, chalk_1.default.green('✅ 验收标准检查通过'));
|
|
72
73
|
if (result.details) {
|
|
73
|
-
|
|
74
|
-
|
|
74
|
+
(0, command_contract_1.log)(io, chalk_1.default.gray(` 通过项: ${result.details.checkedCriteria ?? 0}`));
|
|
75
|
+
(0, command_contract_1.log)(io, chalk_1.default.gray(` 总项数: ${result.details.totalCriteria ?? 0}`));
|
|
75
76
|
}
|
|
76
77
|
}
|
|
77
78
|
else {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
79
|
+
(0, command_contract_1.log)(io);
|
|
80
|
+
(0, command_contract_1.log)(io, chalk_1.default.red('❌ 验收标准检查失败'));
|
|
81
|
+
(0, command_contract_1.log)(io, chalk_1.default.red(` ${result.message}`));
|
|
81
82
|
if (result.details?.uncheckedCriteria) {
|
|
82
83
|
result.details.uncheckedCriteria.forEach((criteria) => {
|
|
83
|
-
|
|
84
|
+
(0, command_contract_1.log)(io, chalk_1.default.red(` - ${criteria}`));
|
|
84
85
|
});
|
|
85
86
|
}
|
|
86
|
-
|
|
87
|
+
return { kind: 'fail', reason: `acceptance gate denied: ${result.message}` };
|
|
87
88
|
}
|
|
89
|
+
return { kind: 'ok' };
|
|
88
90
|
}
|
|
89
91
|
catch (error) {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
92
|
+
(0, command_contract_1.log)(io);
|
|
93
|
+
(0, command_contract_1.log)(io, chalk_1.default.red('❌ 验收标准检查出错'));
|
|
94
|
+
(0, command_contract_1.log)(io, chalk_1.default.red(` ${error.message}`));
|
|
95
|
+
return { kind: 'fail', reason: `acceptance gate error: ${error.message}` };
|
|
94
96
|
}
|
|
95
97
|
}
|
|
96
98
|
/**
|
|
97
99
|
* 列出所有任务及其验收标准
|
|
98
100
|
*/
|
|
99
|
-
async function listAcceptanceCriteria(options) {
|
|
100
|
-
|
|
101
|
+
async function listAcceptanceCriteria(options, io = command_contract_1.processIO) {
|
|
102
|
+
(0, command_contract_1.log)(io, chalk_1.default.blue('📋 任务验收标准列表...\n'));
|
|
101
103
|
const projectPath = options.projectPath || process.cwd();
|
|
102
104
|
const tasksPath = options.tasksPath || path.join(projectPath, 'tasks.yml');
|
|
103
105
|
try {
|
|
@@ -105,27 +107,29 @@ async function listAcceptanceCriteria(options) {
|
|
|
105
107
|
const yaml = await Promise.resolve().then(() => __importStar(require('js-yaml')));
|
|
106
108
|
const tasks = yaml.load(content);
|
|
107
109
|
if (!tasks || typeof tasks !== 'object') {
|
|
108
|
-
|
|
109
|
-
return;
|
|
110
|
+
(0, command_contract_1.log)(io, chalk_1.default.yellow('⚠️ 未找到任务定义'));
|
|
111
|
+
return { kind: 'skip', reason: `未找到任务定义: ${tasksPath}` };
|
|
110
112
|
}
|
|
111
113
|
for (const [taskId, task] of Object.entries(tasks)) {
|
|
112
114
|
if (typeof task === 'object' && task !== null) {
|
|
113
|
-
|
|
115
|
+
(0, command_contract_1.log)(io, chalk_1.default.cyan(`${taskId}:`));
|
|
114
116
|
const taskObj = task;
|
|
115
117
|
if (taskObj.acceptanceCriteria) {
|
|
116
118
|
taskObj.acceptanceCriteria.forEach((criteria, i) => {
|
|
117
|
-
|
|
119
|
+
(0, command_contract_1.log)(io, chalk_1.default.gray(` ${i + 1}. ${criteria}`));
|
|
118
120
|
});
|
|
119
121
|
}
|
|
120
122
|
else {
|
|
121
|
-
|
|
123
|
+
(0, command_contract_1.log)(io, chalk_1.default.gray(' (无验收标准)'));
|
|
122
124
|
}
|
|
123
|
-
|
|
125
|
+
(0, command_contract_1.log)(io);
|
|
124
126
|
}
|
|
125
127
|
}
|
|
128
|
+
return { kind: 'ok' };
|
|
126
129
|
}
|
|
127
130
|
catch (error) {
|
|
128
|
-
|
|
131
|
+
(0, command_contract_1.log)(io, chalk_1.default.red(`❌ 读取 tasks.yml 失败: ${error.message}`));
|
|
132
|
+
return { kind: 'skip', reason: `读取 tasks.yml 失败: ${error.message}` };
|
|
129
133
|
}
|
|
130
134
|
}
|
|
131
135
|
//# sourceMappingURL=acceptance.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acceptance.js","sourceRoot":"","sources":["../../../src/cli/commands/acceptance.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"acceptance.js","sourceRoot":"","sources":["../../../src/cli/commands/acceptance.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,10 +10,11 @@
|
|
|
10
10
|
*
|
|
11
11
|
* 工单 19-C:transcript 解析/纠正模式/分词相似度收敛至 cli/session-mining/。
|
|
12
12
|
*/
|
|
13
|
+
import { type CommandIO, type CommandResult } from '../command-contract';
|
|
13
14
|
export interface AnalyzeSessionsOptions {
|
|
14
15
|
days?: number;
|
|
15
16
|
projectPath?: string;
|
|
16
17
|
json?: boolean;
|
|
17
18
|
}
|
|
18
|
-
export declare function analyzeSessions(options: AnalyzeSessionsOptions): Promise<
|
|
19
|
+
export declare function analyzeSessions(options: AnalyzeSessionsOptions, io?: CommandIO): Promise<CommandResult>;
|
|
19
20
|
//# sourceMappingURL=analyze-sessions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze-sessions.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/analyze-sessions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"analyze-sessions.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/analyze-sessions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAmBH,OAAO,EAAkB,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzF,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAmBD,wBAAsB,eAAe,CAAC,OAAO,EAAE,sBAAsB,EAAE,EAAE,GAAE,SAAqB,GAAG,OAAO,CAAC,aAAa,CAAC,CA0CxH"}
|