@dommaker/harness 1.3.0 → 1.5.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 +20 -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 +104 -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 +27 -219
- 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 +31 -25
- 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 +17 -30
- package/dist/cli/commands/knowledge.d.ts.map +1 -1
- package/dist/cli/commands/knowledge.js +183 -273
- 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 +69 -59
- 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 +5 -2
- 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 +9 -3
- package/dist/cli/commands/update-user-model.d.ts.map +1 -1
- package/dist/cli/commands/update-user-model.js +56 -61
- 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/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 +68 -117
- package/dist/core/constraints/checker.js.map +1 -1
- package/dist/core/constraints/checkers/capability-sync.d.ts +20 -8
- package/dist/core/constraints/checkers/capability-sync.d.ts.map +1 -1
- package/dist/core/constraints/checkers/capability-sync.js +66 -77
- 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 +49 -66
- 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/index.d.ts +2 -2
- package/dist/core/constraints/checkers/index.d.ts.map +1 -1
- package/dist/core/constraints/checkers/index.js +2 -1
- package/dist/core/constraints/checkers/index.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 +43 -4
- package/dist/core/constraints/checkers/types.d.ts.map +1 -1
- package/dist/core/constraints/checkers/types.js +33 -0
- package/dist/core/constraints/checkers/types.js.map +1 -1
- 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 +6 -0
- package/dist/failure/recorder.d.ts.map +1 -1
- package/dist/failure/recorder.js +12 -8
- 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 +2 -1
- package/dist/gates/checker-gate.d.ts.map +1 -1
- package/dist/gates/checker-gate.js +11 -13
- 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 +1 -2
- package/dist/index.d.ts.map +1 -1
- 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 +17 -14
- 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 +2 -2
- package/dist/release/index.d.ts.map +1 -1
- package/dist/release/index.js +1 -5
- package/dist/release/index.js.map +1 -1
- 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 +8 -18
- package/dist/types/constraint.d.ts.map +1 -1
- package/dist/types/constraint.js +6 -1
- package/dist/types/constraint.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/types/trace.d.ts +9 -0
- package/dist/types/trace.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 +8 -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__/layering.test.ts +152 -0
- package/src/__tests__/passes-gate-extra.test.ts +0 -145
- package/src/__tests__/passes-gate.test.ts +130 -101
- 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 +23 -8
- 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 +107 -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 +448 -378
- 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 +69 -43
- 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 +231 -0
- package/src/cli/commands/__tests__/registry.test.ts +75 -35
- package/src/cli/commands/__tests__/release.test.ts +209 -80
- 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 +77 -78
- package/src/cli/commands/__tests__/sync-docs.test.ts +72 -74
- package/src/cli/commands/__tests__/update-user-model.test.ts +97 -34
- 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 +127 -66
- 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 +34 -227
- package/src/cli/commands/failure.ts +33 -26
- package/src/cli/commands/init.ts +166 -220
- package/src/cli/commands/knowledge.ts +192 -289
- 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 +70 -59
- 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 +5 -2
- 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 +64 -61
- 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/context/session-manager.ts +19 -33
- package/src/core/CONTEXT.md +10 -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 +82 -133
- package/src/core/constraints/checkers/__tests__/capability-sync.test.ts +273 -0
- package/src/core/constraints/checkers/__tests__/check-outcome.test.ts +176 -0
- package/src/core/constraints/checkers/__tests__/context-doc-sync.test.ts +77 -0
- package/src/core/constraints/checkers/__tests__/docs-freshness.test.ts +126 -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 +153 -0
- package/src/core/constraints/checkers/capability-sync.ts +75 -96
- package/src/core/constraints/checkers/context-doc-sync.ts +15 -25
- package/src/core/constraints/checkers/docs-freshness.ts +54 -70
- package/src/core/constraints/checkers/governance-presence.ts +7 -25
- package/src/core/constraints/checkers/index.ts +9 -2
- package/src/core/constraints/checkers/no-test-simplification.ts +4 -3
- package/src/core/constraints/checkers/types.ts +60 -4
- 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 +12 -10
- package/src/gates/CONTEXT.md +7 -4
- 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__/checker-gate.test.ts +24 -0
- 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 +12 -15
- 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 +0 -4
- 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 +53 -0
- 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 +19 -14
- 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 +1 -0
- package/src/release/__tests__/barrel.test.ts +60 -0
- package/src/release/index.ts +2 -13
- 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 +16 -27
- 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/types/trace.ts +10 -0
- 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/src/gates/command.ts
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* 检查命令是否安全,防止执行危险操作
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
+
import { pass, gateResult } from './types';
|
|
8
9
|
import type { GateResult, CommandGateConfig, CommandBlacklistRule, Gate, GateContext, GateDecision } from './types';
|
|
9
10
|
import { decisionFromResult } from './decision';
|
|
10
11
|
|
|
@@ -232,32 +233,25 @@ export class CommandGate implements Gate {
|
|
|
232
233
|
const startTime = Date.now();
|
|
233
234
|
|
|
234
235
|
if (!this.config.enabled) {
|
|
235
|
-
return
|
|
236
|
-
gate: 'command',
|
|
237
|
-
passed: true,
|
|
238
|
-
message: '命令门禁已禁用',
|
|
239
|
-
timestamp: new Date().toISOString(),
|
|
240
|
-
duration: Date.now() - startTime,
|
|
241
|
-
};
|
|
236
|
+
return pass('command', '命令门禁已禁用', startTime);
|
|
242
237
|
}
|
|
243
238
|
|
|
244
239
|
const result = this.checkBlacklist(command);
|
|
245
240
|
|
|
246
|
-
return
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
241
|
+
return gateResult(
|
|
242
|
+
'command',
|
|
243
|
+
result.allowed,
|
|
244
|
+
result.allowed
|
|
250
245
|
? this.formatSuccessMessage(result)
|
|
251
246
|
: this.formatBlockMessage(result),
|
|
252
|
-
|
|
247
|
+
startTime,
|
|
248
|
+
{
|
|
253
249
|
blocked: result.blocked,
|
|
254
250
|
warnings: result.warnings,
|
|
255
251
|
audits: result.audits,
|
|
256
252
|
command,
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
duration: Date.now() - startTime,
|
|
260
|
-
};
|
|
253
|
+
}
|
|
254
|
+
);
|
|
261
255
|
}
|
|
262
256
|
|
|
263
257
|
/**
|
package/src/gates/contract.ts
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
import * as fs from 'fs/promises';
|
|
11
11
|
import * as path from 'path';
|
|
12
|
+
import { pass, fail, fromError } from './types';
|
|
12
13
|
import type { GateResult, GateContext, ContractGateConfig, Gate, GateDecision } from './types';
|
|
13
14
|
import { decisionFromResult } from './decision';
|
|
14
15
|
|
|
@@ -43,13 +44,7 @@ export class ContractGate implements Gate {
|
|
|
43
44
|
const startTime = Date.now();
|
|
44
45
|
|
|
45
46
|
if (!this.config.enabled) {
|
|
46
|
-
return
|
|
47
|
-
gate: 'contract',
|
|
48
|
-
passed: true,
|
|
49
|
-
message: '契约门禁已禁用',
|
|
50
|
-
timestamp: new Date().toISOString(),
|
|
51
|
-
duration: Date.now() - startTime,
|
|
52
|
-
};
|
|
47
|
+
return pass('contract', '契约门禁已禁用', startTime);
|
|
53
48
|
}
|
|
54
49
|
|
|
55
50
|
try {
|
|
@@ -60,34 +55,20 @@ export class ContractGate implements Gate {
|
|
|
60
55
|
try {
|
|
61
56
|
await fs.access(contractPath);
|
|
62
57
|
} catch {
|
|
63
|
-
return {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
details: {
|
|
68
|
-
contractPath,
|
|
69
|
-
suggestion: '创建 OpenAPI 规范文件',
|
|
70
|
-
},
|
|
71
|
-
timestamp: new Date().toISOString(),
|
|
72
|
-
duration: Date.now() - startTime,
|
|
73
|
-
};
|
|
58
|
+
return pass('contract', '未找到契约文件,跳过检查', startTime, {
|
|
59
|
+
contractPath,
|
|
60
|
+
suggestion: '创建 OpenAPI 规范文件',
|
|
61
|
+
});
|
|
74
62
|
}
|
|
75
63
|
|
|
76
64
|
// 验证契约格式
|
|
77
65
|
const validation = await this.validateContract(contractPath);
|
|
78
66
|
|
|
79
67
|
if (!validation.valid) {
|
|
80
|
-
return {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
details: {
|
|
85
|
-
contractPath,
|
|
86
|
-
errors: validation.errors,
|
|
87
|
-
},
|
|
88
|
-
timestamp: new Date().toISOString(),
|
|
89
|
-
duration: Date.now() - startTime,
|
|
90
|
-
};
|
|
68
|
+
return fail('contract', `契约格式无效: ${validation.errors.join(', ')}`, startTime, {
|
|
69
|
+
contractPath,
|
|
70
|
+
errors: validation.errors,
|
|
71
|
+
});
|
|
91
72
|
}
|
|
92
73
|
|
|
93
74
|
// 检查破坏性变更(如果提供了旧契约)
|
|
@@ -98,42 +79,22 @@ export class ContractGate implements Gate {
|
|
|
98
79
|
);
|
|
99
80
|
|
|
100
81
|
if (breakingChanges.length > 0 && !this.config.allowBreakingChanges) {
|
|
101
|
-
return {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
oldContractPath: context.oldContractPath,
|
|
108
|
-
breakingChanges,
|
|
109
|
-
suggestion: '更新 API 版本或保持向后兼容',
|
|
110
|
-
},
|
|
111
|
-
timestamp: new Date().toISOString(),
|
|
112
|
-
duration: Date.now() - startTime,
|
|
113
|
-
};
|
|
82
|
+
return fail('contract', `发现破坏性变更: ${breakingChanges.length} 个`, startTime, {
|
|
83
|
+
contractPath,
|
|
84
|
+
oldContractPath: context.oldContractPath,
|
|
85
|
+
breakingChanges,
|
|
86
|
+
suggestion: '更新 API 版本或保持向后兼容',
|
|
87
|
+
});
|
|
114
88
|
}
|
|
115
89
|
}
|
|
116
90
|
|
|
117
|
-
return {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
contractPath,
|
|
123
|
-
endpoints: validation.endpoints,
|
|
124
|
-
version: validation.version,
|
|
125
|
-
},
|
|
126
|
-
timestamp: new Date().toISOString(),
|
|
127
|
-
duration: Date.now() - startTime,
|
|
128
|
-
};
|
|
91
|
+
return pass('contract', '契约检查通过', startTime, {
|
|
92
|
+
contractPath,
|
|
93
|
+
endpoints: validation.endpoints,
|
|
94
|
+
version: validation.version,
|
|
95
|
+
});
|
|
129
96
|
} catch (error: any) {
|
|
130
|
-
return
|
|
131
|
-
gate: 'contract',
|
|
132
|
-
passed: false,
|
|
133
|
-
message: `契约检查失败: ${error.message}`,
|
|
134
|
-
timestamp: new Date().toISOString(),
|
|
135
|
-
duration: Date.now() - startTime,
|
|
136
|
-
};
|
|
97
|
+
return fromError('contract', '契约检查失败', error, startTime);
|
|
137
98
|
}
|
|
138
99
|
}
|
|
139
100
|
|
package/src/gates/performance.ts
CHANGED
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
import { execAsync } from '../utils/exec';
|
|
17
17
|
import * as fs from 'fs/promises';
|
|
18
18
|
import * as path from 'path';
|
|
19
|
+
import { pass, gateResult, fromError } from './types';
|
|
19
20
|
import type { GateResult, GateContext, PerformanceGateConfig, PerformanceThresholds, Gate, GateDecision } from './types';
|
|
20
21
|
import { decisionFromResult } from './decision';
|
|
21
22
|
|
|
@@ -70,13 +71,7 @@ export class PerformanceGate implements Gate {
|
|
|
70
71
|
const startTime = Date.now();
|
|
71
72
|
|
|
72
73
|
if (!this.config.enabled) {
|
|
73
|
-
return
|
|
74
|
-
gate: 'performance',
|
|
75
|
-
passed: true,
|
|
76
|
-
message: '性能门禁已禁用',
|
|
77
|
-
timestamp: new Date().toISOString(),
|
|
78
|
-
duration: Date.now() - startTime,
|
|
79
|
-
};
|
|
74
|
+
return pass('performance', '性能门禁已禁用', startTime);
|
|
80
75
|
}
|
|
81
76
|
|
|
82
77
|
try {
|
|
@@ -122,11 +117,12 @@ export class PerformanceGate implements Gate {
|
|
|
122
117
|
? `性能检查通过: ${this.formatMetrics(metrics)}`
|
|
123
118
|
: failures.join('; ');
|
|
124
119
|
|
|
125
|
-
return
|
|
126
|
-
|
|
120
|
+
return gateResult(
|
|
121
|
+
'performance',
|
|
127
122
|
passed,
|
|
128
|
-
|
|
129
|
-
|
|
123
|
+
warnings.length > 0 ? `${message} (警告: ${warnings.join('; ')})` : message,
|
|
124
|
+
startTime,
|
|
125
|
+
{
|
|
130
126
|
metrics: {
|
|
131
127
|
responseTime: metrics.responseTime,
|
|
132
128
|
memoryUsage: metrics.memoryUsage,
|
|
@@ -136,18 +132,10 @@ export class PerformanceGate implements Gate {
|
|
|
136
132
|
thresholds,
|
|
137
133
|
failures,
|
|
138
134
|
warnings,
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
duration: Date.now() - startTime,
|
|
142
|
-
};
|
|
135
|
+
}
|
|
136
|
+
);
|
|
143
137
|
} catch (error: any) {
|
|
144
|
-
return
|
|
145
|
-
gate: 'performance',
|
|
146
|
-
passed: false,
|
|
147
|
-
message: `性能检查失败: ${error.message}`,
|
|
148
|
-
timestamp: new Date().toISOString(),
|
|
149
|
-
duration: Date.now() - startTime,
|
|
150
|
-
};
|
|
138
|
+
return fromError('performance', '性能检查失败', error, startTime);
|
|
151
139
|
}
|
|
152
140
|
}
|
|
153
141
|
|
package/src/gates/review.ts
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import { execAsync } from '../utils/exec';
|
|
11
|
+
import { gateResult, fromError } from './types';
|
|
11
12
|
import type { GateResult, GateContext, ReviewGateConfig, Gate, GateDecision } from './types';
|
|
12
13
|
import { decisionFromResult } from './decision';
|
|
13
14
|
|
|
@@ -50,13 +51,7 @@ export class ReviewGate implements Gate {
|
|
|
50
51
|
// 否则尝试从 git 获取
|
|
51
52
|
return this.checkLocalGit(context);
|
|
52
53
|
} catch (error: any) {
|
|
53
|
-
return
|
|
54
|
-
gate: 'review',
|
|
55
|
-
passed: false,
|
|
56
|
-
message: `审查检查失败: ${error.message}`,
|
|
57
|
-
timestamp: new Date().toISOString(),
|
|
58
|
-
duration: Date.now() - startTime,
|
|
59
|
-
};
|
|
54
|
+
return fromError('review', '审查检查失败', error, startTime);
|
|
60
55
|
}
|
|
61
56
|
}
|
|
62
57
|
|
|
@@ -86,33 +81,25 @@ export class ReviewGate implements Gate {
|
|
|
86
81
|
approvals.length >= this.config.minReviewers &&
|
|
87
82
|
(!this.config.blockOnChangesRequested || changesRequested.length === 0);
|
|
88
83
|
|
|
89
|
-
return
|
|
90
|
-
|
|
84
|
+
return gateResult(
|
|
85
|
+
'review',
|
|
91
86
|
passed,
|
|
92
|
-
|
|
87
|
+
passed
|
|
93
88
|
? `审查通过: ${approvals.length} 个审批`
|
|
94
89
|
: `审查未通过: ${approvals.length}/${this.config.minReviewers} 审批, ${changesRequested.length} 个变更请求`,
|
|
95
|
-
|
|
90
|
+
startTime,
|
|
91
|
+
{
|
|
96
92
|
approvals: approvals.length,
|
|
97
93
|
changesRequested: changesRequested.length,
|
|
98
94
|
pending: pending.length,
|
|
99
95
|
minReviewers: this.config.minReviewers,
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
duration: Date.now() - startTime,
|
|
103
|
-
};
|
|
96
|
+
}
|
|
97
|
+
);
|
|
104
98
|
} catch (error: any) {
|
|
105
99
|
// gh CLI 不可用或 PR 不存在
|
|
106
|
-
return {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
message: `无法获取 PR 状态: ${error.message}`,
|
|
110
|
-
details: {
|
|
111
|
-
suggestion: '确保已安装 gh CLI 并配置了 GitHub token',
|
|
112
|
-
},
|
|
113
|
-
timestamp: new Date().toISOString(),
|
|
114
|
-
duration: Date.now() - startTime,
|
|
115
|
-
};
|
|
100
|
+
return fromError('review', '无法获取 PR 状态', error, startTime, {
|
|
101
|
+
suggestion: '确保已安装 gh CLI 并配置了 GitHub token',
|
|
102
|
+
});
|
|
116
103
|
}
|
|
117
104
|
}
|
|
118
105
|
|
|
@@ -138,28 +125,21 @@ export class ReviewGate implements Gate {
|
|
|
138
125
|
const hasUnpushed = unpushed.trim().length > 0;
|
|
139
126
|
|
|
140
127
|
// 本地模式无法验证审查,返回警告
|
|
141
|
-
return
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
128
|
+
return gateResult(
|
|
129
|
+
'review',
|
|
130
|
+
!this.config.requireApproval,
|
|
131
|
+
this.config.requireApproval
|
|
145
132
|
? '本地模式无法验证审查,请通过 PR 进行代码审查'
|
|
146
133
|
: '审查要求未启用,跳过检查',
|
|
147
|
-
|
|
134
|
+
startTime,
|
|
135
|
+
{
|
|
148
136
|
lastCommit: logOutput,
|
|
149
137
|
hasUnpushedCommits: hasUnpushed,
|
|
150
138
|
requireApproval: this.config.requireApproval,
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
duration: Date.now() - startTime,
|
|
154
|
-
};
|
|
139
|
+
}
|
|
140
|
+
);
|
|
155
141
|
} catch (error: any) {
|
|
156
|
-
return
|
|
157
|
-
gate: 'review',
|
|
158
|
-
passed: false,
|
|
159
|
-
message: `Git 检查失败: ${error.message}`,
|
|
160
|
-
timestamp: new Date().toISOString(),
|
|
161
|
-
duration: Date.now() - startTime,
|
|
162
|
-
};
|
|
142
|
+
return fromError('review', 'Git 检查失败', error, startTime);
|
|
163
143
|
}
|
|
164
144
|
}
|
|
165
145
|
|
package/src/gates/security.ts
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import { execAsync } from '../utils/exec';
|
|
11
|
+
import { pass, gateResult, fromError } from './types';
|
|
11
12
|
import type { GateResult, GateContext, SecurityGateConfig, Gate, GateDecision } from './types';
|
|
12
13
|
import { decisionFromResult } from './decision';
|
|
13
14
|
|
|
@@ -43,13 +44,7 @@ export class SecurityGate implements Gate {
|
|
|
43
44
|
const startTime = Date.now();
|
|
44
45
|
|
|
45
46
|
if (!this.config.enabled) {
|
|
46
|
-
return
|
|
47
|
-
gate: 'security',
|
|
48
|
-
passed: true,
|
|
49
|
-
message: '安全门禁已禁用',
|
|
50
|
-
timestamp: new Date().toISOString(),
|
|
51
|
-
duration: Date.now() - startTime,
|
|
52
|
-
};
|
|
47
|
+
return pass('security', '安全门禁已禁用', startTime);
|
|
53
48
|
}
|
|
54
49
|
|
|
55
50
|
try {
|
|
@@ -65,13 +60,14 @@ export class SecurityGate implements Gate {
|
|
|
65
60
|
|
|
66
61
|
const passed = this.isPassed(analysis);
|
|
67
62
|
|
|
68
|
-
return
|
|
69
|
-
|
|
63
|
+
return gateResult(
|
|
64
|
+
'security',
|
|
70
65
|
passed,
|
|
71
|
-
|
|
66
|
+
passed
|
|
72
67
|
? '安全扫描通过'
|
|
73
68
|
: `发现 ${analysis.critical} 个严重漏洞, ${analysis.high} 个高危漏洞`,
|
|
74
|
-
|
|
69
|
+
startTime,
|
|
70
|
+
{
|
|
75
71
|
critical: analysis.critical,
|
|
76
72
|
high: analysis.high,
|
|
77
73
|
moderate: analysis.moderate,
|
|
@@ -79,18 +75,10 @@ export class SecurityGate implements Gate {
|
|
|
79
75
|
total: analysis.total,
|
|
80
76
|
vulnerabilities: analysis.vulnerabilities.slice(0, 10), // 只返回前 10 个
|
|
81
77
|
scanCommand,
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
duration: Date.now() - startTime,
|
|
85
|
-
};
|
|
78
|
+
}
|
|
79
|
+
);
|
|
86
80
|
} catch (error: any) {
|
|
87
|
-
return
|
|
88
|
-
gate: 'security',
|
|
89
|
-
passed: false,
|
|
90
|
-
message: `安全扫描失败: ${error.message}`,
|
|
91
|
-
timestamp: new Date().toISOString(),
|
|
92
|
-
duration: Date.now() - startTime,
|
|
93
|
-
};
|
|
81
|
+
return fromError('security', '安全扫描失败', error, startTime);
|
|
94
82
|
}
|
|
95
83
|
}
|
|
96
84
|
|
package/src/gates/types.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 门禁类型定义
|
|
2
|
+
* 门禁类型定义 + GateResult 构造器
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -17,6 +17,65 @@ export interface GateResult {
|
|
|
17
17
|
duration?: number;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
+
/**
|
|
21
|
+
* GateResult 构造器:报告层的唯一落点
|
|
22
|
+
*
|
|
23
|
+
* gate/passed/message 逐次手写最容易漏的是 duration(无类型可救,字段是可选的);
|
|
24
|
+
* 时间戳与耗时口径也由此统一。无 details 时不出该键(与手写形状一致)。
|
|
25
|
+
*/
|
|
26
|
+
export function gateResult(
|
|
27
|
+
gate: string,
|
|
28
|
+
passed: boolean,
|
|
29
|
+
message: string,
|
|
30
|
+
startedAt: number,
|
|
31
|
+
details?: Record<string, any>
|
|
32
|
+
): GateResult {
|
|
33
|
+
return {
|
|
34
|
+
gate,
|
|
35
|
+
passed,
|
|
36
|
+
message,
|
|
37
|
+
...(details ? { details } : {}),
|
|
38
|
+
timestamp: new Date().toISOString(),
|
|
39
|
+
duration: Date.now() - startedAt,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** 通过报告 */
|
|
44
|
+
export function pass(
|
|
45
|
+
gate: string,
|
|
46
|
+
message: string,
|
|
47
|
+
startedAt: number,
|
|
48
|
+
details?: Record<string, any>
|
|
49
|
+
): GateResult {
|
|
50
|
+
return gateResult(gate, true, message, startedAt, details);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** 未通过报告 */
|
|
54
|
+
export function fail(
|
|
55
|
+
gate: string,
|
|
56
|
+
message: string,
|
|
57
|
+
startedAt: number,
|
|
58
|
+
details?: Record<string, any>
|
|
59
|
+
): GateResult {
|
|
60
|
+
return gateResult(gate, false, message, startedAt, details);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* 异常报告:message = `${label}: ${原因}`
|
|
65
|
+
*
|
|
66
|
+
* 非 Error 抛出物按 String() 取原因(原 `error.message` 会得到 undefined)。
|
|
67
|
+
*/
|
|
68
|
+
export function fromError(
|
|
69
|
+
gate: string,
|
|
70
|
+
label: string,
|
|
71
|
+
error: unknown,
|
|
72
|
+
startedAt: number,
|
|
73
|
+
details?: Record<string, any>
|
|
74
|
+
): GateResult {
|
|
75
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
76
|
+
return fail(gate, `${label}: ${reason}`, startedAt, details);
|
|
77
|
+
}
|
|
78
|
+
|
|
20
79
|
/**
|
|
21
80
|
* 门禁决策三态(守卫/门禁统一,G1)
|
|
22
81
|
*
|
|
@@ -145,15 +204,21 @@ export interface ContractGateConfig {
|
|
|
145
204
|
}
|
|
146
205
|
|
|
147
206
|
/**
|
|
148
|
-
*
|
|
207
|
+
* 验收标准门禁配置(单一正本,harness#101:并入原 acceptance.ts 宽版的 e2e 字段)
|
|
149
208
|
*/
|
|
150
209
|
export interface SpecAcceptanceGateConfig {
|
|
151
|
-
/** tasks.yml
|
|
210
|
+
/** tasks.yml 路径;相对值按 check 上下文的 projectPath 解析,缺省 `<projectPath>/tasks.yml` */
|
|
152
211
|
tasksPath?: string;
|
|
153
212
|
/** 是否检查所有任务 */
|
|
154
213
|
checkAllTasks?: boolean;
|
|
155
214
|
/** 自定义验收条件 */
|
|
156
215
|
customAcceptanceCriteria?: Record<string, (task: any) => Promise<boolean>>;
|
|
216
|
+
/** E2E 测试命令模板 */
|
|
217
|
+
e2eTestCommand?: string;
|
|
218
|
+
/** E2E 测试超时时间(毫秒) */
|
|
219
|
+
e2eTestTimeout?: number;
|
|
220
|
+
/** 项目路径 */
|
|
221
|
+
projectPath?: string;
|
|
157
222
|
}
|
|
158
223
|
|
|
159
224
|
/**
|
|
@@ -164,12 +229,12 @@ export interface AcceptanceGateContext {
|
|
|
164
229
|
projectPath: string;
|
|
165
230
|
/** 任务 ID */
|
|
166
231
|
taskId?: string;
|
|
167
|
-
/** tasks.yml
|
|
232
|
+
/** tasks.yml 路径;相对值按 projectPath 解析 */
|
|
168
233
|
tasksPath?: string;
|
|
169
234
|
}
|
|
170
235
|
|
|
171
236
|
/**
|
|
172
|
-
*
|
|
237
|
+
* 验收标准(旧格式,向后兼容)
|
|
173
238
|
*/
|
|
174
239
|
export interface AcceptanceCriteria {
|
|
175
240
|
id: string;
|
package/src/hooks/CONTEXT.md
CHANGED
|
@@ -13,7 +13,7 @@ H5(#44)起增加两个机制(G2/G7):
|
|
|
13
13
|
- `assertHookRegistryClosed` — 注册表闭环双向校验(构建/测试期)
|
|
14
14
|
- `HookConfig`(type)— per-hook 配置声明(归一后形状)
|
|
15
15
|
- `toErrorStrategy` — blocking → errorStrategy 无损映射(G7)
|
|
16
|
-
- `bootstrapHarness` / `bootstrapHarnessSync` — Harness
|
|
16
|
+
- `bootstrapHarness` / `bootstrapHarnessSync` — Harness 启动引导;也是 trace 记录器的组合根:`new ConstraintChecker(getTraceCollector())`(harness#88,core 不上行依赖 monitoring,故由本层接线)
|
|
17
17
|
|
|
18
18
|
## 依赖关系
|
|
19
19
|
- 依赖 `src/types/` Hook 相关类型
|
package/src/hooks/bootstrap.ts
CHANGED
|
@@ -10,11 +10,14 @@
|
|
|
10
10
|
* const harness = await bootstrapHarness('/path/to/project');
|
|
11
11
|
* // harness.checker, harness.config, harness.hooks, harness.sessions
|
|
12
12
|
* ```
|
|
13
|
+
*
|
|
14
|
+
* checker 的 trace 记录器在此接线(harness#88:core 不上行依赖 monitoring)。
|
|
13
15
|
*/
|
|
14
16
|
|
|
15
17
|
import { ConstraintChecker } from '../core/constraints/checker';
|
|
16
18
|
import { SessionManager } from '../context/session-manager';
|
|
17
19
|
import { ProjectConfigLoader } from '../core/project-config-loader';
|
|
20
|
+
import { getTraceCollector } from '../monitoring/traces';
|
|
18
21
|
import { HookRegistry } from './registry';
|
|
19
22
|
import { HookPipeline } from './pipeline';
|
|
20
23
|
import type { MergedConstraintsConfig } from '../types/project-config';
|
|
@@ -72,7 +75,7 @@ export async function bootstrapHarness(
|
|
|
72
75
|
const { mergedConstraints } = await loadConfigAsync(resolvedPath);
|
|
73
76
|
|
|
74
77
|
// 2. 初始化核心组件
|
|
75
|
-
const checker = ConstraintChecker
|
|
78
|
+
const checker = new ConstraintChecker(getTraceCollector());
|
|
76
79
|
|
|
77
80
|
const sessions = new SessionManager(resolvedPath);
|
|
78
81
|
const hooks = new HookRegistry();
|
|
@@ -108,7 +111,7 @@ export function bootstrapHarnessSync(
|
|
|
108
111
|
loader.load();
|
|
109
112
|
const mergedConstraints = loader.mergeConstraints();
|
|
110
113
|
|
|
111
|
-
const checker = ConstraintChecker
|
|
114
|
+
const checker = new ConstraintChecker(getTraceCollector());
|
|
112
115
|
|
|
113
116
|
const sessions = new SessionManager(resolvedPath);
|
|
114
117
|
const hooks = new HookRegistry();
|
package/src/index.ts
CHANGED
|
@@ -103,11 +103,9 @@ export type {
|
|
|
103
103
|
PassesGateResult,
|
|
104
104
|
PassesGateCheckResult,
|
|
105
105
|
PassesGateViolation,
|
|
106
|
-
PassesGateExtension,
|
|
107
106
|
TestResult,
|
|
108
107
|
DynamicTask,
|
|
109
108
|
TaskTestResult,
|
|
110
|
-
ExtensionTestResult,
|
|
111
109
|
} from './types/passes-gate';
|
|
112
110
|
export type {
|
|
113
111
|
StepMeta,
|
|
@@ -137,8 +135,6 @@ export type {
|
|
|
137
135
|
TaskStepStatus,
|
|
138
136
|
SessionInfo,
|
|
139
137
|
} from './types/session';
|
|
140
|
-
// 与 passes-gate 同名类型的 session 版(沿用既有别名)
|
|
141
|
-
export { DynamicTask as ExtendedDynamicTask, TaskTestResult as ExtendedTaskTestResult } from './types/session';
|
|
142
138
|
|
|
143
139
|
// ========================================
|
|
144
140
|
// Spec 验证(已接线的 spec 故事:validator + SpecAcceptanceGate)
|
package/src/knowledge/CONTEXT.md
CHANGED
|
@@ -17,13 +17,14 @@
|
|
|
17
17
|
- 所有模式支持 `decayAt` 硬过期
|
|
18
18
|
|
|
19
19
|
## 核心导出
|
|
20
|
-
- `KnowledgeStore` — 知识条目 CRUD +
|
|
20
|
+
- `KnowledgeStore` — 知识条目 CRUD + 结构化存储;`saveAll()` 批量写入(循环内只更新内存索引、结束一次 writeIndex,harness#107)
|
|
21
21
|
- `KnowledgeQuery` — 语义搜索 + 类型/标签过滤 + `queryByMode()` + `consume(taskContext)`;`query()` 是 budget 截断管线(仅用于 prompt 注入),`search()` 是全语料文本搜索(先匹配→排序→limit,交互搜索专用,勿用 query() 代替)
|
|
22
22
|
- `KnowledgeLifecycle` — per-mode 生命周期管理
|
|
23
23
|
- `KnowledgeIngest` — 知识摄取引擎(含 ingest gate 质量门)+ `ingestExternal()` 外部内容摄入
|
|
24
24
|
- `sanitizeExternalContent` — 外部内容安全清洗(过滤注入模式 + 长度限制)
|
|
25
25
|
- `migrateKnowledgeEntries` — AS-021 迁移工具(为现有条目添加 consumptionMode/origin)
|
|
26
|
-
- `KnowledgeAudit` —
|
|
26
|
+
- `KnowledgeAudit` — 7 维度质量审计引擎。per-entry 规则记录带 `scope: 'active' | 'all'`(active = 不判定 archived 条目);人口过滤由 `ruleDetail()` 统一执行,规则内禁止再写 `entry.maturity === 'archived'` 早返回。规则中文 label 正本在规则定义的 `label` 字段(harness#109,ADR-0002 定义即注册),`AUDIT_RULE_LABELS` 派生导出、与 `AuditRuleName` 编译期闭环,CLI 展示层直接消费、禁止另建 label 表
|
|
27
|
+
- `flywheel-metrics`(包内,不进导出面)— 知识飞轮指标唯一实现:`evaluateFlywheel(env)` 出 canonical 比例、`genuineRefs()` 出 synthetic 过滤口径,audit D6 / `knowledge stats` / `knowledge health` 三处共消费(ADR-0013)
|
|
27
28
|
- `ReferenceTracker` — 知识引用关系图谱
|
|
28
29
|
- `KnowledgeLinter` — 知识质量检查(完整性/一致性/时效性)
|
|
29
30
|
- `ColdStartImporter` — 冷启动知识导入
|
|
@@ -32,20 +33,24 @@
|
|
|
32
33
|
|
|
33
34
|
## 依赖关系
|
|
34
35
|
- 依赖 `src/types/` 知识相关类型
|
|
36
|
+
- 依赖 `src/utils/frontmatter` — markdown frontmatter 解析/序列化的唯一正本(harness#89:store、migration、index-generator、ingest 共用同一套语法判定,不再各写正则)
|
|
35
37
|
- 依赖 `src/context/types`(ContextUsageSnapshot 等类型;不依赖 monitoring——知识健康评分由本目录 doctor.ts 的 KnowledgeHealthScorer 承载)
|
|
36
38
|
- 被 `src/cli/commands/knowledge.ts` CLI 消费(含 `migrate` 子命令)
|
|
37
39
|
|
|
38
40
|
## 约定
|
|
41
|
+
- 知识条目文件的 frontmatter 语法只由 `src/utils/frontmatter` 定义(harness#89):缺头/空 meta = `absent`(合法输入,按非条目静默处理);未闭合/YAML 非法 = `malformed`(必须显式上报后按消费方语义恢复——migration 落 `errors`、store 与 index-generator 打一行 stderr 后跳过或走 best-effort),禁止静默丢条目;canonical 字段序是 `store.toFrontmatter` 的私有策略,`join` 只管包裹格式
|
|
39
42
|
- 知识条目有明确的生命周期状态(按 consumptionMode 分化)
|
|
40
43
|
- 约束退役(`harness constraints retire`,人确认)时写入 KnowledgeStore:规则原文 + 退役原因 + 历史统计
|
|
41
44
|
- Linter 检查完整性/一致性/时效性三个维度
|
|
42
|
-
- Audit
|
|
45
|
+
- Audit 7 维度评分:D1结构 D2内容 D3去重 D4成熟度 D5新鲜度 D6飞轮 D7增量存活
|
|
43
46
|
- Ingest gate: ingestEntry() 先经 audit.validate() 检查,reject 不入库
|
|
44
47
|
- 外部内容三层防御:ingest sanitization + retrieval marking + prompt constraint
|
|
45
48
|
- 消费饱和度替代固定 TTL 用于 signal 过期判断
|
|
49
|
+
- **飞轮指标只有一个实现**(ADR-0013):`refCoverage` / `avgRefs` / `consumptionHitRate` 一律出自 `flywheel-metrics.evaluateFlywheel()`,canonical 分子 = `genuineRefs()` 过滤后的真实消费引用(`search|test-agent|prompt-inject|monitor|analyst|...:<date>` 自动化按天记账键不算消费,`unknown:` 注入键算消费)。audit D6 / `knowledge stats` / `knowledge health` 只在展示层做单位与字段名映射(百分比取整、一位小数、`avgRefs`→`avgRefCount`),人口筛选留在各调用方。新增消费方禁止自行数 `referencedBy.length`。
|
|
46
50
|
|
|
47
51
|
## 注意事项
|
|
48
52
|
- Phase 1+4 实现的知识引擎核心
|
|
49
53
|
- 约束"退役不删除"——retire 落盘 config.yml `enabled: false` + retired 元数据,保留规则原文 + 退役原因 + 历史统计(可回滚)
|
|
50
54
|
- `MaturityLevel` 包含 6 个值: draft/verified/proven/archived/active/deprecated
|
|
51
55
|
- `excludeArchived` 同时排除 archived 和 deprecated
|
|
56
|
+
- 仍有两处按**原始** `referencedBy.length` 判定,不属飞轮指标、ADR-0013 明确列为范围外:`lifecycle.ts` 的 signal 饱和 / reference 激活(退役阈值调整另票)、`knowledge health` 的 D1「verified 零引用」线索提示(逐条 issue 线索,非聚合分子)
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 审计规则 label 闭环测试(架构评审 A6,#109)
|
|
3
|
+
*
|
|
4
|
+
* label 正本在 audit.ts 规则定义上(定义即注册),AUDIT_RULE_LABELS 派生自规则表。
|
|
5
|
+
* 新增规则无 label → 编译期/本测试期即失败,CLI 不再静默回落英文键名。
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import * as fs from 'fs';
|
|
9
|
+
import * as os from 'os';
|
|
10
|
+
import * as path from 'path';
|
|
11
|
+
import { KnowledgeAudit, AUDIT_RULE_LABELS } from '../audit';
|
|
12
|
+
import type { AuditRuleName } from '../audit';
|
|
13
|
+
|
|
14
|
+
function makeTmpDir(): string {
|
|
15
|
+
return fs.mkdtempSync(path.join(os.tmpdir(), 'audit-labels-test-'));
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
describe('AUDIT_RULE_LABELS', () => {
|
|
19
|
+
let tmpDir: string;
|
|
20
|
+
|
|
21
|
+
beforeEach(() => {
|
|
22
|
+
tmpDir = makeTmpDir();
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
afterEach(() => {
|
|
26
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('应与运行期 summary 的规则键集完全一致(双向闭环)', () => {
|
|
30
|
+
const report = new KnowledgeAudit({ baseDir: tmpDir }).run();
|
|
31
|
+
const summaryKeys = Object.keys(report.summary).sort();
|
|
32
|
+
const labelKeys = (Object.keys(AUDIT_RULE_LABELS) as AuditRuleName[]).sort();
|
|
33
|
+
expect(labelKeys).toEqual(summaryKeys);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('每条规则都有非空中文 label,event-noise / deprecated-domain 不再缺失', () => {
|
|
37
|
+
for (const [rule, label] of Object.entries(AUDIT_RULE_LABELS)) {
|
|
38
|
+
expect(label.trim().length).toBeGreaterThan(0);
|
|
39
|
+
expect(label).not.toBe(rule); // 不允许回落英文键名
|
|
40
|
+
}
|
|
41
|
+
expect(AUDIT_RULE_LABELS['event-noise']).toBe('运维事件噪音');
|
|
42
|
+
expect(AUDIT_RULE_LABELS['deprecated-domain']).toBe('废弃领域残留');
|
|
43
|
+
});
|
|
44
|
+
});
|