@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
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* git 证据适配器(架构评审 #87)
|
|
4
|
+
*
|
|
5
|
+
* 全仓唯一的 git 取证点:context-builder(触发推断)与 checker 层(CheckEnv 证据)
|
|
6
|
+
* 共用同一实例 = 共用同一证据来源。此前两处各自抓真 git,一次 CLI check 里
|
|
7
|
+
* `git diff --cached --name-only` 实跑两遍。
|
|
8
|
+
*
|
|
9
|
+
* seam 上的两个真 adapter:
|
|
10
|
+
* - 缺省 realGitCommandRunner:真 git 子进程
|
|
11
|
+
* - 注入 runner:委托/计数/命令表(测试与定制场景)
|
|
12
|
+
*
|
|
13
|
+
* memo 落在实例层(命令 → 结果,含失败结果),实例生命周期 = 一次 check run,
|
|
14
|
+
* 因此不存在隐式全局(工单 18 的 run 级收益保留,形状改为显式传递)。
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.realGitCommandRunner = void 0;
|
|
18
|
+
exports.parseHeadDirs = parseHeadDirs;
|
|
19
|
+
exports.createGitEvidence = createGitEvidence;
|
|
20
|
+
exports.splitFileNames = splitFileNames;
|
|
21
|
+
const child_process_1 = require("child_process");
|
|
22
|
+
/** 与 utils/exec.runCommand 同一缓冲上限(大 diff 不 ENOBUFS) */
|
|
23
|
+
const GIT_MAX_BUFFER = 1024 * 1024;
|
|
24
|
+
/**
|
|
25
|
+
* 真 git adapter:同步 spawn,失败抛错交由 memo 归类
|
|
26
|
+
*
|
|
27
|
+
* execSync 声明返回 string | Buffer(Buffer 无 trim),故显式归一为 string——
|
|
28
|
+
* 与迁移前 context-builder 的 `String(output)` 取值语义一致。
|
|
29
|
+
*/
|
|
30
|
+
const realGitCommandRunner = (command, cwd) => String((0, child_process_1.execSync)(command, { cwd, stdio: 'pipe', encoding: 'utf-8', maxBuffer: GIT_MAX_BUFFER })).trim();
|
|
31
|
+
exports.realGitCommandRunner = realGitCommandRunner;
|
|
32
|
+
const STAGED_DIFF = 'git diff --cached';
|
|
33
|
+
const STAGED_DIFF_NAMES = 'git diff --cached --name-only';
|
|
34
|
+
const UNSTAGED_DIFF_NAMES = 'git diff --name-only';
|
|
35
|
+
const HEAD_TREE = 'git ls-tree -r --name-only HEAD';
|
|
36
|
+
/**
|
|
37
|
+
* 从 `git ls-tree -r --name-only HEAD` 输出提取 HEAD 中存在的所有目录
|
|
38
|
+
*
|
|
39
|
+
* 工单 18 批量语义:一次命令替代逐文件 ls-tree。
|
|
40
|
+
*/
|
|
41
|
+
function parseHeadDirs(treeOutput) {
|
|
42
|
+
const dirs = new Set();
|
|
43
|
+
for (const file of treeOutput.split('\n')) {
|
|
44
|
+
if (!file)
|
|
45
|
+
continue;
|
|
46
|
+
const parts = file.split('/');
|
|
47
|
+
for (let i = 1; i < parts.length; i++) {
|
|
48
|
+
dirs.add(parts.slice(0, i).join('/'));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return dirs;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 构造 git 证据 adapter(生产侧唯一构造点)
|
|
55
|
+
*
|
|
56
|
+
* @param projectPath 取证目录
|
|
57
|
+
* @param run 命令执行器,缺省真 git;测试注入计数/替身执行器即可脱离子进程
|
|
58
|
+
*/
|
|
59
|
+
function createGitEvidence(projectPath, run = exports.realGitCommandRunner) {
|
|
60
|
+
const memo = new Map();
|
|
61
|
+
const once = (command) => {
|
|
62
|
+
let result = memo.get(command);
|
|
63
|
+
if (!result) {
|
|
64
|
+
try {
|
|
65
|
+
result = { ok: true, stdout: run(command, projectPath) };
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
result = { ok: false, stdout: '' };
|
|
69
|
+
}
|
|
70
|
+
memo.set(command, result);
|
|
71
|
+
}
|
|
72
|
+
return result;
|
|
73
|
+
};
|
|
74
|
+
return {
|
|
75
|
+
projectPath,
|
|
76
|
+
stagedDiff: () => once(STAGED_DIFF).stdout,
|
|
77
|
+
changedFileNames: (staged) => once(staged ? STAGED_DIFF_NAMES : UNSTAGED_DIFF_NAMES).stdout,
|
|
78
|
+
headDirs: () => {
|
|
79
|
+
const result = once(HEAD_TREE);
|
|
80
|
+
return result.ok ? parseHeadDirs(result.stdout) : null;
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/** 变更文件名列表 → 路径数组(git 无输出时为空集合) */
|
|
85
|
+
function splitFileNames(names) {
|
|
86
|
+
return names.split('\n').filter(Boolean);
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=git-evidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-evidence.js","sourceRoot":"","sources":["../../../src/core/constraints/git-evidence.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;;AAqDH,sCAUC;AAQD,8CA8BC;AAGD,wCAEC;AAxGD,iDAAyC;AA2BzC,uDAAuD;AACvD,MAAM,cAAc,GAAG,IAAI,GAAG,IAAI,CAAC;AAEnC;;;;;GAKG;AACI,MAAM,oBAAoB,GAAqB,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,CACrE,MAAM,CACJ,IAAA,wBAAQ,EAAC,OAAO,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CACxF,CAAC,IAAI,EAAE,CAAC;AAHE,QAAA,oBAAoB,wBAGtB;AAEX,MAAM,WAAW,GAAG,mBAAmB,CAAC;AACxC,MAAM,iBAAiB,GAAG,+BAA+B,CAAC;AAC1D,MAAM,mBAAmB,GAAG,sBAAsB,CAAC;AACnD,MAAM,SAAS,GAAG,iCAAiC,CAAC;AAEpD;;;;GAIG;AACH,SAAgB,aAAa,CAAC,UAAkB;IAC9C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,SAAgB,iBAAiB,CAC/B,WAAmB,EACnB,MAAwB,4BAAoB;IAG5C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAyB,CAAC;IAE9C,MAAM,IAAI,GAAG,CAAC,OAAe,EAAiB,EAAE;QAC9C,IAAI,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC;YAC3D,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;YACrC,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF,OAAO;QACL,WAAW;QACX,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM;QAC1C,gBAAgB,EAAE,CAAC,MAAe,EAAE,EAAE,CACpC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,MAAM;QAC/D,QAAQ,EAAE,GAAG,EAAE;YACb,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/B,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACzD,CAAC;KACF,CAAC;AACJ,CAAC;AAED,mCAAmC;AACnC,SAAgB,cAAc,CAAC,KAAa;IAC1C,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -16,9 +16,8 @@
|
|
|
16
16
|
* 纯检测、只读:不改任何文件。check 仅警告不阻断,详细差异进 report。
|
|
17
17
|
* 两处均无标记段 = 未注入,不算漂移(report 一句话提示,check 不警告)。
|
|
18
18
|
*/
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
export type InjectionFile = (typeof INJECTION_FILES)[number];
|
|
19
|
+
import { type InjectionFile } from './injection-writer';
|
|
20
|
+
export type { InjectionFile };
|
|
22
21
|
/** 注入漂移检测结果 */
|
|
23
22
|
export interface InjectionDrift {
|
|
24
23
|
/** 是否存在任一漂移(版本/内容/重复章节) */
|
|
@@ -47,27 +46,11 @@ export interface InjectionDrift {
|
|
|
47
46
|
}
|
|
48
47
|
/** 修复指引(重跑 init 幂等同步注入段) */
|
|
49
48
|
export declare const INJECTION_DRIFT_FIX_HINT = "\u91CD\u8DD1 `npx @dommaker/harness init` \u540C\u6B65\u6CE8\u5165\u6BB5\uFF08\u6F02\u79FB\u4EC5\u8B66\u544A\uFF0C\u4E0D\u963B\u65AD\uFF09";
|
|
50
|
-
/**
|
|
51
|
-
* 解析治理约束注入段落点(studio #307,ADR 2026-08-21 落点模型)
|
|
52
|
-
*
|
|
53
|
-
* 与 init 的 setupGovernanceConstraints 路由一致:CLAUDE.md 含标记段优先
|
|
54
|
-
* (旧模型仓豁免),否则看 AGENTS.md(新模型仓注入段在 PRESERVE:governance 内);
|
|
55
|
-
* 两处均无完整标记段 → null(未注入)。
|
|
56
|
-
*
|
|
57
|
-
* detectInjectionDrift 与 constraints retire 的注入段同步共用本路由。
|
|
58
|
-
*/
|
|
59
|
-
export declare function resolveInjectionTarget(projectRoot: string): {
|
|
60
|
-
file: InjectionFile;
|
|
61
|
-
content: string;
|
|
62
|
-
startIdx: number;
|
|
63
|
-
endIdx: number;
|
|
64
|
-
} | null;
|
|
65
49
|
/**
|
|
66
50
|
* 检测约束注入段漂移
|
|
67
51
|
*
|
|
68
52
|
* @param projectRoot 项目根路径
|
|
69
|
-
* @param currentVersion 当前 harness
|
|
53
|
+
* @param currentVersion 当前 harness 版本(缺省经 getHarnessPackageVersion 正本读取;测试可显式传入)
|
|
70
54
|
*/
|
|
71
55
|
export declare function detectInjectionDrift(projectRoot: string, currentVersion?: string): InjectionDrift;
|
|
72
|
-
export {};
|
|
73
56
|
//# sourceMappingURL=injection-drift.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"injection-drift.d.ts","sourceRoot":"","sources":["../../../src/core/constraints/injection-drift.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;
|
|
1
|
+
{"version":3,"file":"injection-drift.d.ts","sourceRoot":"","sources":["../../../src/core/constraints/injection-drift.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAMH,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EAAE,aAAa,EAAE,CAAC;AAE9B,eAAe;AACf,MAAM,WAAW,cAAc;IAC7B,2BAA2B;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,8CAA8C;IAC9C,WAAW,EAAE,OAAO,CAAC;IACrB,8BAA8B;IAC9B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,iCAAiC;IACjC,YAAY,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD;;;OAGG;IACH,YAAY,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IACtD,2CAA2C;IAC3C,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW;IACX,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,4BAA4B;AAC5B,eAAO,MAAM,wBAAwB,+IAAqD,CAAC;AAiB3F;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,cAAc,GAAE,MAAmC,GAClD,cAAc,CAkDhB"}
|
|
@@ -52,33 +52,17 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
52
52
|
})();
|
|
53
53
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
54
54
|
exports.INJECTION_DRIFT_FIX_HINT = void 0;
|
|
55
|
-
exports.resolveInjectionTarget = resolveInjectionTarget;
|
|
56
55
|
exports.detectInjectionDrift = detectInjectionDrift;
|
|
57
|
-
const fs = __importStar(require("fs"));
|
|
58
56
|
const path = __importStar(require("path"));
|
|
59
57
|
const effective_constraints_1 = require("../effective-constraints");
|
|
58
|
+
const package_version_1 = require("../../utils/package-version");
|
|
60
59
|
const injection_renderer_1 = require("./injection-renderer");
|
|
61
|
-
|
|
62
|
-
const INJECTION_FILES = ['CLAUDE.md', 'AGENTS.md'];
|
|
60
|
+
const injection_writer_1 = require("./injection-writer");
|
|
63
61
|
/** 修复指引(重跑 init 幂等同步注入段) */
|
|
64
62
|
exports.INJECTION_DRIFT_FIX_HINT = '重跑 `npx @dommaker/harness init` 同步注入段(漂移仅警告,不阻断)';
|
|
65
63
|
const VERSION_LINE_RE = /<!-- version: ([^ ]+) -->/;
|
|
66
64
|
const ENTRY_LINE_RE = /^- \*\*.+?\*\*: .+$/;
|
|
67
65
|
const GROUP_HEADING_RE = /^### .+$/;
|
|
68
|
-
const GOVERNANCE_HEADING_RE = /^## Governance Rules[ \t]*$/gm;
|
|
69
|
-
/**
|
|
70
|
-
* 读取当前 harness 包版本(与 init 注入时写入的版本同源)
|
|
71
|
-
*/
|
|
72
|
-
function getPackageVersion() {
|
|
73
|
-
try {
|
|
74
|
-
const pkgPath = path.join(__dirname, '..', '..', '..', 'package.json');
|
|
75
|
-
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
76
|
-
return pkg.version ?? 'unknown';
|
|
77
|
-
}
|
|
78
|
-
catch {
|
|
79
|
-
return 'unknown';
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
66
|
/**
|
|
83
67
|
* 提取参与条目级比对的"有效行":注入条目(- **id**: text)与分组标题(### ...)。
|
|
84
68
|
* 标记行、版本行、空行不参与——版本单独比对,空行/标记属排版噪音。
|
|
@@ -89,66 +73,35 @@ function significantLines(section) {
|
|
|
89
73
|
.map(l => l.trim())
|
|
90
74
|
.filter(l => ENTRY_LINE_RE.test(l) || GROUP_HEADING_RE.test(l));
|
|
91
75
|
}
|
|
92
|
-
function readIfExists(filePath) {
|
|
93
|
-
try {
|
|
94
|
-
const content = fs.readFileSync(filePath, 'utf-8');
|
|
95
|
-
return typeof content === 'string' ? content : null;
|
|
96
|
-
}
|
|
97
|
-
catch {
|
|
98
|
-
return null;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* 解析治理约束注入段落点(studio #307,ADR 2026-08-21 落点模型)
|
|
103
|
-
*
|
|
104
|
-
* 与 init 的 setupGovernanceConstraints 路由一致:CLAUDE.md 含标记段优先
|
|
105
|
-
* (旧模型仓豁免),否则看 AGENTS.md(新模型仓注入段在 PRESERVE:governance 内);
|
|
106
|
-
* 两处均无完整标记段 → null(未注入)。
|
|
107
|
-
*
|
|
108
|
-
* detectInjectionDrift 与 constraints retire 的注入段同步共用本路由。
|
|
109
|
-
*/
|
|
110
|
-
function resolveInjectionTarget(projectRoot) {
|
|
111
|
-
for (const file of INJECTION_FILES) {
|
|
112
|
-
const content = readIfExists(path.join(projectRoot, file));
|
|
113
|
-
if (content === null)
|
|
114
|
-
continue;
|
|
115
|
-
const startIdx = content.indexOf(injection_renderer_1.CONSTRAINTS_START_MARKER);
|
|
116
|
-
const endIdx = content.indexOf(injection_renderer_1.CONSTRAINTS_END_MARKER);
|
|
117
|
-
if (startIdx !== -1 && endIdx !== -1 && endIdx > startIdx) {
|
|
118
|
-
return { file, content, startIdx, endIdx };
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
return null;
|
|
122
|
-
}
|
|
123
76
|
/**
|
|
124
77
|
* 检测约束注入段漂移
|
|
125
78
|
*
|
|
126
79
|
* @param projectRoot 项目根路径
|
|
127
|
-
* @param currentVersion 当前 harness
|
|
80
|
+
* @param currentVersion 当前 harness 版本(缺省经 getHarnessPackageVersion 正本读取;测试可显式传入)
|
|
128
81
|
*/
|
|
129
|
-
function detectInjectionDrift(projectRoot, currentVersion =
|
|
82
|
+
function detectInjectionDrift(projectRoot, currentVersion = (0, package_version_1.getHarnessPackageVersion)()) {
|
|
130
83
|
const result = {
|
|
131
84
|
hasDrift: false,
|
|
132
85
|
notInjected: false,
|
|
133
86
|
duplicateHeading: false,
|
|
134
87
|
fixHint: exports.INJECTION_DRIFT_FIX_HINT,
|
|
135
88
|
};
|
|
136
|
-
const target = resolveInjectionTarget(projectRoot);
|
|
89
|
+
const target = (0, injection_writer_1.resolveInjectionTarget)(projectRoot);
|
|
137
90
|
if (!target) {
|
|
138
91
|
// 两处均无标记段 = 未注入,不算漂移(check 不警告)。
|
|
139
92
|
// 重复章节仍如实记录供 report 提示:旧落点 CLAUDE.md 优先,其次 AGENTS.md。
|
|
140
|
-
const legacy = readIfExists(path.join(projectRoot, 'CLAUDE.md')) ??
|
|
141
|
-
readIfExists(path.join(projectRoot, 'AGENTS.md'));
|
|
93
|
+
const legacy = (0, injection_writer_1.readIfExists)(path.join(projectRoot, 'CLAUDE.md')) ??
|
|
94
|
+
(0, injection_writer_1.readIfExists)(path.join(projectRoot, 'AGENTS.md'));
|
|
142
95
|
if (legacy !== null) {
|
|
143
|
-
result.duplicateHeading = (
|
|
96
|
+
result.duplicateHeading = (0, injection_writer_1.countGovernanceHeadings)(legacy) > 1;
|
|
144
97
|
}
|
|
145
98
|
result.notInjected = true;
|
|
146
99
|
return result;
|
|
147
100
|
}
|
|
148
101
|
result.injectionFile = target.file;
|
|
149
102
|
const { content, startIdx, endIdx } = target;
|
|
150
|
-
//
|
|
151
|
-
const headingCount = (
|
|
103
|
+
// 重复章节:全文统计治理标题数(严格计数 injection-writer.countGovernanceHeadings,#83)
|
|
104
|
+
const headingCount = (0, injection_writer_1.countGovernanceHeadings)(content);
|
|
152
105
|
result.duplicateHeading = headingCount > 1;
|
|
153
106
|
const actualSection = content.slice(startIdx, endIdx + injection_renderer_1.CONSTRAINTS_END_MARKER.length);
|
|
154
107
|
// 1. 版本漂移
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"injection-drift.js","sourceRoot":"","sources":["../../../src/core/constraints/injection-drift.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"injection-drift.js","sourceRoot":"","sources":["../../../src/core/constraints/injection-drift.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 治理注入段落点写入器(架构评审候选1,ADR-0011)
|
|
3
|
+
*
|
|
4
|
+
* 「按渲染 body 替换标记区间 + 尾换行规一」的切片数学此前手抄 4 份
|
|
5
|
+
* (init.ts 三个 writer / constraints-retire 一份),落点路由读写两侧各抄一份。
|
|
6
|
+
* 本模块是唯一 writer:init/retire 退化为「渲染 body + 调 writer」。
|
|
7
|
+
*
|
|
8
|
+
* 形状两种(排版约定不同,非"算哪些"的差异,故合法分叉):
|
|
9
|
+
* - replaceStandaloneRange:区间独立成节,END 标记后折叠为恰好一个空行
|
|
10
|
+
* (CLAUDE.md 约束段 / Output Style 段 / retire 注入段同步)
|
|
11
|
+
* - replaceEnclosedRange:区间后紧跟外层收口标记(AGENTS.md PRESERVE 段内
|
|
12
|
+
* 的 HARNESS_CONSTRAINTS 区间)——恰好剥一个换行,手写余文原样落回
|
|
13
|
+
*
|
|
14
|
+
* 半标记守护:单边缺失或顺序颠倒 → 'half',拒写(旧实现此时或追加出双份
|
|
15
|
+
* 正本或产生乱序切片,属二次损坏路径,收紧为告警交人工,见 ADR-0011)。
|
|
16
|
+
*
|
|
17
|
+
* 落点路由同规则一份:
|
|
18
|
+
* - resolveInjectionTarget:读侧(漂移检测/retire 同步)——CLAUDE.md 有完整
|
|
19
|
+
* 标记段优先(旧模型仓豁免),否则 AGENTS.md(新模型仓住 PRESERVE 段内)
|
|
20
|
+
* - resolveGovernanceLanding:写侧(init 落点选择)——额外承认 CLAUDE.md
|
|
21
|
+
* 无标记的 `## Governance Rules` 旧块(续写不制造双份正本)
|
|
22
|
+
*
|
|
23
|
+
* 探测/判定同住本模块(#83,ADR-0011 补注:收口范围含探测器,不只写器)——
|
|
24
|
+
* 「这份文档里有没有治理契约 / 有几个正本标题」此前手抄 4 份且正则已漂移,
|
|
25
|
+
* 见文末 GOVERNANCE_HEADING / hasGovernanceContract / countGovernanceHeadings /
|
|
26
|
+
* hasPreserveBlock。
|
|
27
|
+
*/
|
|
28
|
+
/** 注入段落点文件名(检测顺序即路由优先级:旧模型仓 CLAUDE.md 优先) */
|
|
29
|
+
export declare const INJECTION_FILES: readonly ["CLAUDE.md", "AGENTS.md"];
|
|
30
|
+
export type InjectionFile = (typeof INJECTION_FILES)[number];
|
|
31
|
+
/** 标记区间替换结果 */
|
|
32
|
+
export type MarkerWrite = {
|
|
33
|
+
kind: 'updated';
|
|
34
|
+
content: string;
|
|
35
|
+
} | {
|
|
36
|
+
kind: 'absent';
|
|
37
|
+
} | {
|
|
38
|
+
kind: 'half';
|
|
39
|
+
};
|
|
40
|
+
/** 完整标记块的内容切分(inner 含首尾标记行外的全部文本,含原换行) */
|
|
41
|
+
export interface MarkerBlock {
|
|
42
|
+
before: string;
|
|
43
|
+
inner: string;
|
|
44
|
+
/** 后标记之后的原文(未规一) */
|
|
45
|
+
after: string;
|
|
46
|
+
}
|
|
47
|
+
export declare function readIfExists(filePath: string): string | null;
|
|
48
|
+
/**
|
|
49
|
+
* 切出完整标记块(before + begin + inner + end + after)。
|
|
50
|
+
* 'absent' = 两俱无;'half' = 残缺/乱序,拒切。
|
|
51
|
+
*/
|
|
52
|
+
export declare function cutMarkerBlock(content: string, begin: string, end: string): MarkerBlock | 'absent' | 'half';
|
|
53
|
+
/**
|
|
54
|
+
* 替换独立成节的标记区间:body 为含首尾标记的完整替换文本(以换行结尾),
|
|
55
|
+
* 区间后文剥除全部前导换行、以恰好一个空行相接(幂等:重复替换结果稳定)。
|
|
56
|
+
*/
|
|
57
|
+
export declare function replaceStandaloneRange(content: string, begin: string, end: string, body: string): MarkerWrite;
|
|
58
|
+
/**
|
|
59
|
+
* 替换后跟外层收口标记的区间:body 含首尾标记且以换行结尾(收口标记落自己行),
|
|
60
|
+
* 区间后文恰好剥一个换行(外层标记拼接位),其余手写余文原样保留。
|
|
61
|
+
*/
|
|
62
|
+
export declare function replaceEnclosedRange(content: string, begin: string, end: string, body: string): MarkerWrite;
|
|
63
|
+
/**
|
|
64
|
+
* 读侧路由:定位含完整 HARNESS_CONSTRAINTS 标记段的文件(studio #307)。
|
|
65
|
+
* detectInjectionDrift 与 retire 注入段同步共用。
|
|
66
|
+
*/
|
|
67
|
+
export declare function resolveInjectionTarget(projectRoot: string): {
|
|
68
|
+
file: InjectionFile;
|
|
69
|
+
content: string;
|
|
70
|
+
startIdx: number;
|
|
71
|
+
endIdx: number;
|
|
72
|
+
} | null;
|
|
73
|
+
/**
|
|
74
|
+
* 写侧路由(init 落点选择,原 setupGovernanceConstraints 内联判定收于此):
|
|
75
|
+
* CLAUDE.md 有约束标记段或有旧版 `## Governance Rules` 块 → 续写 CLAUDE.md
|
|
76
|
+
* (旧模型仓豁免,不制造双份正本);否则 AGENTS.md PRESERVE:governance。
|
|
77
|
+
*/
|
|
78
|
+
export declare function resolveGovernanceLanding(projectRoot: string): {
|
|
79
|
+
target: 'claude-md' | 'agents-md';
|
|
80
|
+
claudeContent: string | null;
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* 治理正本标题字面量(单一来源,#83):init 的标题写点与下列两个判定谓词
|
|
84
|
+
* 都由它派生,仓内不再本地拼写。字面量无正则元字符,可直接拼入 RegExp。
|
|
85
|
+
*
|
|
86
|
+
* 两谓词回答两个问题,**共享字面量而非共享正则**(triage 裁决 2026-09-02):
|
|
87
|
+
* 强行合一要么在场守护 fail-open 失效(取严格),要么重复计数引入无行尾
|
|
88
|
+
* 锚定的误报(取宽松)。
|
|
89
|
+
*/
|
|
90
|
+
export declare const GOVERNANCE_HEADING = "## Governance Rules";
|
|
91
|
+
/**
|
|
92
|
+
* 宽松谓词:内容里是否有治理契约在场——标题宽松匹配或 HARNESS 约束标记
|
|
93
|
+
* 文本在场即算。fail-open 偏向:排版漂移宁可信其有,漏报「约束正本静默
|
|
94
|
+
* 丢失」的代价高于误报。消费方:governance_presence / sync-docs 治理计数 /
|
|
95
|
+
* init 落点路由(#83)。
|
|
96
|
+
*/
|
|
97
|
+
export declare function hasGovernanceContract(content: string): boolean;
|
|
98
|
+
/**
|
|
99
|
+
* 严格计数:全文统计治理标题数(精确拼写 + 行尾锚定),drift 重复章节
|
|
100
|
+
* 检测专用。宽松变体(如双空格)不计入——在场判定与正本计数是两个问题,
|
|
101
|
+
* 见 GOVERNANCE_HEADING。
|
|
102
|
+
*/
|
|
103
|
+
export declare function countGovernanceHeadings(content: string): number;
|
|
104
|
+
/**
|
|
105
|
+
* PRESERVE 标记块存在性判定:块存在且块体非空(governance_presence 在场
|
|
106
|
+
* 守护消费,#83 收编其手写切片)。标记契约与 sync-docs/preserve-block 一致:
|
|
107
|
+
* 首尾标记均须独占一行——开始标记行首锚定(行尾仅空白),结束标记行 trim
|
|
108
|
+
* 后等于标记文本。结束标记嵌在行中 / 缺失 / 乱序均为畸形块 → false,在场
|
|
109
|
+
* 守护按契约丢失报警(原 presence「行中结束标记也算在场」显式收紧,#83)。
|
|
110
|
+
* name 仅允许字母/数字/下划线/连字符(PRESERVE 命名约定,调用方传常量段名)。
|
|
111
|
+
*/
|
|
112
|
+
export declare function hasPreserveBlock(content: string, name: string): boolean;
|
|
113
|
+
//# sourceMappingURL=injection-writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"injection-writer.d.ts","sourceRoot":"","sources":["../../../src/core/constraints/injection-writer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AASH,6CAA6C;AAC7C,eAAO,MAAM,eAAe,qCAAsC,CAAC;AACnE,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,eAAe;AACf,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErB,0CAA0C;AAC1C,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO5D;AAWD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAQ3G;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAQ7G;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAQ3G;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,GAClB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAWnF;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,GAClB;IAAE,MAAM,EAAE,WAAW,GAAG,WAAW,CAAC;IAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAMrE;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,wBAAwB,CAAC;AAcxD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAevE"}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 治理注入段落点写入器(架构评审候选1,ADR-0011)
|
|
4
|
+
*
|
|
5
|
+
* 「按渲染 body 替换标记区间 + 尾换行规一」的切片数学此前手抄 4 份
|
|
6
|
+
* (init.ts 三个 writer / constraints-retire 一份),落点路由读写两侧各抄一份。
|
|
7
|
+
* 本模块是唯一 writer:init/retire 退化为「渲染 body + 调 writer」。
|
|
8
|
+
*
|
|
9
|
+
* 形状两种(排版约定不同,非"算哪些"的差异,故合法分叉):
|
|
10
|
+
* - replaceStandaloneRange:区间独立成节,END 标记后折叠为恰好一个空行
|
|
11
|
+
* (CLAUDE.md 约束段 / Output Style 段 / retire 注入段同步)
|
|
12
|
+
* - replaceEnclosedRange:区间后紧跟外层收口标记(AGENTS.md PRESERVE 段内
|
|
13
|
+
* 的 HARNESS_CONSTRAINTS 区间)——恰好剥一个换行,手写余文原样落回
|
|
14
|
+
*
|
|
15
|
+
* 半标记守护:单边缺失或顺序颠倒 → 'half',拒写(旧实现此时或追加出双份
|
|
16
|
+
* 正本或产生乱序切片,属二次损坏路径,收紧为告警交人工,见 ADR-0011)。
|
|
17
|
+
*
|
|
18
|
+
* 落点路由同规则一份:
|
|
19
|
+
* - resolveInjectionTarget:读侧(漂移检测/retire 同步)——CLAUDE.md 有完整
|
|
20
|
+
* 标记段优先(旧模型仓豁免),否则 AGENTS.md(新模型仓住 PRESERVE 段内)
|
|
21
|
+
* - resolveGovernanceLanding:写侧(init 落点选择)——额外承认 CLAUDE.md
|
|
22
|
+
* 无标记的 `## Governance Rules` 旧块(续写不制造双份正本)
|
|
23
|
+
*
|
|
24
|
+
* 探测/判定同住本模块(#83,ADR-0011 补注:收口范围含探测器,不只写器)——
|
|
25
|
+
* 「这份文档里有没有治理契约 / 有几个正本标题」此前手抄 4 份且正则已漂移,
|
|
26
|
+
* 见文末 GOVERNANCE_HEADING / hasGovernanceContract / countGovernanceHeadings /
|
|
27
|
+
* hasPreserveBlock。
|
|
28
|
+
*/
|
|
29
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
30
|
+
if (k2 === undefined) k2 = k;
|
|
31
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
32
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
33
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
34
|
+
}
|
|
35
|
+
Object.defineProperty(o, k2, desc);
|
|
36
|
+
}) : (function(o, m, k, k2) {
|
|
37
|
+
if (k2 === undefined) k2 = k;
|
|
38
|
+
o[k2] = m[k];
|
|
39
|
+
}));
|
|
40
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
41
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
42
|
+
}) : function(o, v) {
|
|
43
|
+
o["default"] = v;
|
|
44
|
+
});
|
|
45
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
46
|
+
var ownKeys = function(o) {
|
|
47
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
48
|
+
var ar = [];
|
|
49
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
50
|
+
return ar;
|
|
51
|
+
};
|
|
52
|
+
return ownKeys(o);
|
|
53
|
+
};
|
|
54
|
+
return function (mod) {
|
|
55
|
+
if (mod && mod.__esModule) return mod;
|
|
56
|
+
var result = {};
|
|
57
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
58
|
+
__setModuleDefault(result, mod);
|
|
59
|
+
return result;
|
|
60
|
+
};
|
|
61
|
+
})();
|
|
62
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
63
|
+
exports.GOVERNANCE_HEADING = exports.INJECTION_FILES = void 0;
|
|
64
|
+
exports.readIfExists = readIfExists;
|
|
65
|
+
exports.cutMarkerBlock = cutMarkerBlock;
|
|
66
|
+
exports.replaceStandaloneRange = replaceStandaloneRange;
|
|
67
|
+
exports.replaceEnclosedRange = replaceEnclosedRange;
|
|
68
|
+
exports.resolveInjectionTarget = resolveInjectionTarget;
|
|
69
|
+
exports.resolveGovernanceLanding = resolveGovernanceLanding;
|
|
70
|
+
exports.hasGovernanceContract = hasGovernanceContract;
|
|
71
|
+
exports.countGovernanceHeadings = countGovernanceHeadings;
|
|
72
|
+
exports.hasPreserveBlock = hasPreserveBlock;
|
|
73
|
+
const fs = __importStar(require("fs"));
|
|
74
|
+
const path = __importStar(require("path"));
|
|
75
|
+
const injection_renderer_1 = require("./injection-renderer");
|
|
76
|
+
/** 注入段落点文件名(检测顺序即路由优先级:旧模型仓 CLAUDE.md 优先) */
|
|
77
|
+
exports.INJECTION_FILES = ['CLAUDE.md', 'AGENTS.md'];
|
|
78
|
+
function readIfExists(filePath) {
|
|
79
|
+
try {
|
|
80
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
81
|
+
return typeof content === 'string' ? content : null;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/** 定位完整标记对:两标记俱在且顺序正确 */
|
|
88
|
+
function findPair(content, begin, end) {
|
|
89
|
+
const startIdx = content.indexOf(begin);
|
|
90
|
+
const endIdx = content.indexOf(end);
|
|
91
|
+
if (startIdx === -1 && endIdx === -1)
|
|
92
|
+
return 'absent';
|
|
93
|
+
if (startIdx === -1 || endIdx === -1 || endIdx < startIdx)
|
|
94
|
+
return 'half';
|
|
95
|
+
return { startIdx, endIdx };
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* 切出完整标记块(before + begin + inner + end + after)。
|
|
99
|
+
* 'absent' = 两俱无;'half' = 残缺/乱序,拒切。
|
|
100
|
+
*/
|
|
101
|
+
function cutMarkerBlock(content, begin, end) {
|
|
102
|
+
const pair = findPair(content, begin, end);
|
|
103
|
+
if (pair === 'absent' || pair === 'half')
|
|
104
|
+
return pair;
|
|
105
|
+
return {
|
|
106
|
+
before: content.slice(0, pair.startIdx),
|
|
107
|
+
inner: content.slice(pair.startIdx + begin.length, pair.endIdx),
|
|
108
|
+
after: content.slice(pair.endIdx + end.length),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* 替换独立成节的标记区间:body 为含首尾标记的完整替换文本(以换行结尾),
|
|
113
|
+
* 区间后文剥除全部前导换行、以恰好一个空行相接(幂等:重复替换结果稳定)。
|
|
114
|
+
*/
|
|
115
|
+
function replaceStandaloneRange(content, begin, end, body) {
|
|
116
|
+
const pair = findPair(content, begin, end);
|
|
117
|
+
if (pair === 'absent' || pair === 'half')
|
|
118
|
+
return { kind: pair };
|
|
119
|
+
const after = content.slice(pair.endIdx + end.length).replace(/^\n+/, '');
|
|
120
|
+
return {
|
|
121
|
+
kind: 'updated',
|
|
122
|
+
content: content.slice(0, pair.startIdx) + body + (after ? '\n' + after : ''),
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* 替换后跟外层收口标记的区间:body 含首尾标记且以换行结尾(收口标记落自己行),
|
|
127
|
+
* 区间后文恰好剥一个换行(外层标记拼接位),其余手写余文原样保留。
|
|
128
|
+
*/
|
|
129
|
+
function replaceEnclosedRange(content, begin, end, body) {
|
|
130
|
+
const pair = findPair(content, begin, end);
|
|
131
|
+
if (pair === 'absent' || pair === 'half')
|
|
132
|
+
return { kind: pair };
|
|
133
|
+
const tail = content.slice(pair.endIdx + end.length).replace(/^\n/, '');
|
|
134
|
+
return {
|
|
135
|
+
kind: 'updated',
|
|
136
|
+
content: content.slice(0, pair.startIdx) + body + tail,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* 读侧路由:定位含完整 HARNESS_CONSTRAINTS 标记段的文件(studio #307)。
|
|
141
|
+
* detectInjectionDrift 与 retire 注入段同步共用。
|
|
142
|
+
*/
|
|
143
|
+
function resolveInjectionTarget(projectRoot) {
|
|
144
|
+
for (const file of exports.INJECTION_FILES) {
|
|
145
|
+
const content = readIfExists(path.join(projectRoot, file));
|
|
146
|
+
if (content === null)
|
|
147
|
+
continue;
|
|
148
|
+
const startIdx = content.indexOf(injection_renderer_1.CONSTRAINTS_START_MARKER);
|
|
149
|
+
const endIdx = content.indexOf(injection_renderer_1.CONSTRAINTS_END_MARKER);
|
|
150
|
+
if (startIdx !== -1 && endIdx !== -1 && endIdx > startIdx) {
|
|
151
|
+
return { file, content, startIdx, endIdx };
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* 写侧路由(init 落点选择,原 setupGovernanceConstraints 内联判定收于此):
|
|
158
|
+
* CLAUDE.md 有约束标记段或有旧版 `## Governance Rules` 块 → 续写 CLAUDE.md
|
|
159
|
+
* (旧模型仓豁免,不制造双份正本);否则 AGENTS.md PRESERVE:governance。
|
|
160
|
+
*/
|
|
161
|
+
function resolveGovernanceLanding(projectRoot) {
|
|
162
|
+
const claudeContent = readIfExists(path.join(projectRoot, 'CLAUDE.md'));
|
|
163
|
+
if (claudeContent !== null && hasGovernanceContract(claudeContent)) {
|
|
164
|
+
return { target: 'claude-md', claudeContent };
|
|
165
|
+
}
|
|
166
|
+
return { target: 'agents-md', claudeContent };
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* 治理正本标题字面量(单一来源,#83):init 的标题写点与下列两个判定谓词
|
|
170
|
+
* 都由它派生,仓内不再本地拼写。字面量无正则元字符,可直接拼入 RegExp。
|
|
171
|
+
*
|
|
172
|
+
* 两谓词回答两个问题,**共享字面量而非共享正则**(triage 裁决 2026-09-02):
|
|
173
|
+
* 强行合一要么在场守护 fail-open 失效(取严格),要么重复计数引入无行尾
|
|
174
|
+
* 锚定的误报(取宽松)。
|
|
175
|
+
*/
|
|
176
|
+
exports.GOVERNANCE_HEADING = '## Governance Rules';
|
|
177
|
+
/** 标题文本(去 `## ` 前缀),宽松谓词按 `##` + 任意空白 + 此文本匹配 */
|
|
178
|
+
const GOVERNANCE_HEADING_TEXT = exports.GOVERNANCE_HEADING.replace(/^##\s+/, '');
|
|
179
|
+
/** 宽松标题正则:容忍 `## Governance Rules` 双空格等排版漂移 */
|
|
180
|
+
const GOVERNANCE_HEADING_LOOSE_RE = new RegExp(`^##\\s+${GOVERNANCE_HEADING_TEXT}`, 'm');
|
|
181
|
+
/** 严格标题正则:精确拼写 + 行尾锚定(行尾仅容忍空白) */
|
|
182
|
+
const GOVERNANCE_HEADING_STRICT_RE = new RegExp(`^${exports.GOVERNANCE_HEADING}[ \\t]*$`, 'gm');
|
|
183
|
+
/** 约束标记裸文本(去注释壳),宽松谓词按「标记文本在场」判定,容忍壳残缺 */
|
|
184
|
+
const CONSTRAINTS_START_TEXT = injection_renderer_1.CONSTRAINTS_START_MARKER.replace(/^<!--\s*|\s*-->$/g, '');
|
|
185
|
+
/**
|
|
186
|
+
* 宽松谓词:内容里是否有治理契约在场——标题宽松匹配或 HARNESS 约束标记
|
|
187
|
+
* 文本在场即算。fail-open 偏向:排版漂移宁可信其有,漏报「约束正本静默
|
|
188
|
+
* 丢失」的代价高于误报。消费方:governance_presence / sync-docs 治理计数 /
|
|
189
|
+
* init 落点路由(#83)。
|
|
190
|
+
*/
|
|
191
|
+
function hasGovernanceContract(content) {
|
|
192
|
+
return GOVERNANCE_HEADING_LOOSE_RE.test(content) || content.includes(CONSTRAINTS_START_TEXT);
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* 严格计数:全文统计治理标题数(精确拼写 + 行尾锚定),drift 重复章节
|
|
196
|
+
* 检测专用。宽松变体(如双空格)不计入——在场判定与正本计数是两个问题,
|
|
197
|
+
* 见 GOVERNANCE_HEADING。
|
|
198
|
+
*/
|
|
199
|
+
function countGovernanceHeadings(content) {
|
|
200
|
+
return (content.match(GOVERNANCE_HEADING_STRICT_RE) ?? []).length;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* PRESERVE 标记块存在性判定:块存在且块体非空(governance_presence 在场
|
|
204
|
+
* 守护消费,#83 收编其手写切片)。标记契约与 sync-docs/preserve-block 一致:
|
|
205
|
+
* 首尾标记均须独占一行——开始标记行首锚定(行尾仅空白),结束标记行 trim
|
|
206
|
+
* 后等于标记文本。结束标记嵌在行中 / 缺失 / 乱序均为畸形块 → false,在场
|
|
207
|
+
* 守护按契约丢失报警(原 presence「行中结束标记也算在场」显式收紧,#83)。
|
|
208
|
+
* name 仅允许字母/数字/下划线/连字符(PRESERVE 命名约定,调用方传常量段名)。
|
|
209
|
+
*/
|
|
210
|
+
function hasPreserveBlock(content, name) {
|
|
211
|
+
const beginMarker = `<!-- PRESERVE:${name} -->`;
|
|
212
|
+
const endMarker = `<!-- /PRESERVE:${name} -->`;
|
|
213
|
+
const lines = content.split('\n');
|
|
214
|
+
const begin = lines.findIndex(line => line.trimEnd() === beginMarker);
|
|
215
|
+
if (begin === -1)
|
|
216
|
+
return false;
|
|
217
|
+
let end = -1;
|
|
218
|
+
for (let j = begin + 1; j < lines.length; j++) {
|
|
219
|
+
if (lines[j].trim() === endMarker) {
|
|
220
|
+
end = j;
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
if (end === -1)
|
|
225
|
+
return false;
|
|
226
|
+
return lines.slice(begin + 1, end).join('\n').trim().length > 0;
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=injection-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"injection-writer.js","sourceRoot":"","sources":["../../../src/core/constraints/injection-writer.ts"],"names":[],"mappings":"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"}
|