@dommaker/harness 1.2.3 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/README.md +0 -2
- package/bin/harness.js +86 -32
- package/dist/cli/command-contract.d.ts +83 -0
- package/dist/cli/command-contract.d.ts.map +1 -0
- package/dist/cli/command-contract.js +66 -0
- package/dist/cli/command-contract.js.map +1 -0
- package/dist/cli/commands/acceptance.d.ts +3 -2
- package/dist/cli/commands/acceptance.d.ts.map +1 -1
- package/dist/cli/commands/acceptance.js +28 -24
- package/dist/cli/commands/acceptance.js.map +1 -1
- package/dist/cli/commands/analyze-sessions.d.ts +2 -1
- package/dist/cli/commands/analyze-sessions.d.ts.map +1 -1
- package/dist/cli/commands/analyze-sessions.js +25 -24
- package/dist/cli/commands/analyze-sessions.js.map +1 -1
- package/dist/cli/commands/check.d.ts +14 -2
- package/dist/cli/commands/check.d.ts.map +1 -1
- package/dist/cli/commands/check.js +76 -61
- package/dist/cli/commands/check.js.map +1 -1
- package/dist/cli/commands/command.d.ts +5 -1
- package/dist/cli/commands/command.d.ts.map +1 -1
- package/dist/cli/commands/command.js +26 -17
- package/dist/cli/commands/command.js.map +1 -1
- package/dist/cli/commands/constraints-report.d.ts +2 -1
- package/dist/cli/commands/constraints-report.d.ts.map +1 -1
- package/dist/cli/commands/constraints-report.js +37 -33
- package/dist/cli/commands/constraints-report.js.map +1 -1
- package/dist/cli/commands/constraints-retire.d.ts +6 -5
- package/dist/cli/commands/constraints-retire.d.ts.map +1 -1
- package/dist/cli/commands/constraints-retire.js +50 -52
- package/dist/cli/commands/constraints-retire.js.map +1 -1
- package/dist/cli/commands/constraints.d.ts +2 -1
- package/dist/cli/commands/constraints.d.ts.map +1 -1
- package/dist/cli/commands/constraints.js +10 -27
- package/dist/cli/commands/constraints.js.map +1 -1
- package/dist/cli/commands/contract.d.ts +3 -2
- package/dist/cli/commands/contract.d.ts.map +1 -1
- package/dist/cli/commands/contract.js +45 -42
- package/dist/cli/commands/contract.js.map +1 -1
- package/dist/cli/commands/definitions.d.ts +11 -11
- package/dist/cli/commands/definitions.d.ts.map +1 -1
- package/dist/cli/commands/definitions.js +30 -215
- package/dist/cli/commands/definitions.js.map +1 -1
- package/dist/cli/commands/failure.d.ts +5 -4
- package/dist/cli/commands/failure.d.ts.map +1 -1
- package/dist/cli/commands/failure.js +33 -26
- package/dist/cli/commands/failure.js.map +1 -1
- package/dist/cli/commands/init.d.ts +7 -5
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +147 -211
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/knowledge.d.ts +21 -15
- package/dist/cli/commands/knowledge.d.ts.map +1 -1
- package/dist/cli/commands/knowledge.js +237 -199
- package/dist/cli/commands/knowledge.js.map +1 -1
- package/dist/cli/commands/passes-gate.d.ts +8 -2
- package/dist/cli/commands/passes-gate.d.ts.map +1 -1
- package/dist/cli/commands/passes-gate.js +44 -66
- package/dist/cli/commands/passes-gate.js.map +1 -1
- package/dist/cli/commands/performance.d.ts +2 -1
- package/dist/cli/commands/performance.d.ts.map +1 -1
- package/dist/cli/commands/performance.js +20 -18
- package/dist/cli/commands/performance.js.map +1 -1
- package/dist/cli/commands/posteval-plan.d.ts +5 -1
- package/dist/cli/commands/posteval-plan.d.ts.map +1 -1
- package/dist/cli/commands/posteval-plan.js +26 -15
- package/dist/cli/commands/posteval-plan.js.map +1 -1
- package/dist/cli/commands/release.d.ts +6 -1
- package/dist/cli/commands/release.d.ts.map +1 -1
- package/dist/cli/commands/release.js +73 -77
- package/dist/cli/commands/release.js.map +1 -1
- package/dist/cli/commands/report.d.ts +2 -1
- package/dist/cli/commands/report.d.ts.map +1 -1
- package/dist/cli/commands/report.js +9 -5
- package/dist/cli/commands/report.js.map +1 -1
- package/dist/cli/commands/review.d.ts +3 -2
- package/dist/cli/commands/review.d.ts.map +1 -1
- package/dist/cli/commands/review.js +33 -29
- package/dist/cli/commands/review.js.map +1 -1
- package/dist/cli/commands/sdd.d.ts +2 -1
- package/dist/cli/commands/sdd.d.ts.map +1 -1
- package/dist/cli/commands/sdd.js +7 -5
- package/dist/cli/commands/sdd.js.map +1 -1
- package/dist/cli/commands/security.d.ts +3 -2
- package/dist/cli/commands/security.d.ts.map +1 -1
- package/dist/cli/commands/security.js +29 -26
- package/dist/cli/commands/security.js.map +1 -1
- package/dist/cli/commands/spec-baseline-check.d.ts +2 -1
- package/dist/cli/commands/spec-baseline-check.d.ts.map +1 -1
- package/dist/cli/commands/spec-baseline-check.js +15 -11
- package/dist/cli/commands/spec-baseline-check.js.map +1 -1
- package/dist/cli/commands/spec.d.ts +7 -2
- package/dist/cli/commands/spec.d.ts.map +1 -1
- package/dist/cli/commands/spec.js +61 -51
- package/dist/cli/commands/spec.js.map +1 -1
- package/dist/cli/commands/status.d.ts +2 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +57 -53
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/sync-docs/agents-syncer.d.ts.map +1 -1
- package/dist/cli/commands/sync-docs/agents-syncer.js +31 -16
- package/dist/cli/commands/sync-docs/agents-syncer.js.map +1 -1
- package/dist/cli/commands/sync-docs/context-syncer.d.ts.map +1 -1
- package/dist/cli/commands/sync-docs/context-syncer.js +3 -2
- package/dist/cli/commands/sync-docs/context-syncer.js.map +1 -1
- package/dist/cli/commands/sync-docs/index.d.ts +2 -1
- package/dist/cli/commands/sync-docs/index.d.ts.map +1 -1
- package/dist/cli/commands/sync-docs/index.js +68 -88
- package/dist/cli/commands/sync-docs/index.js.map +1 -1
- package/dist/cli/commands/sync-docs/project-reader.d.ts +6 -1
- package/dist/cli/commands/sync-docs/project-reader.d.ts.map +1 -1
- package/dist/cli/commands/sync-docs/project-reader.js +14 -16
- package/dist/cli/commands/sync-docs/project-reader.js.map +1 -1
- package/dist/cli/commands/update-user-model.d.ts +2 -1
- package/dist/cli/commands/update-user-model.d.ts.map +1 -1
- package/dist/cli/commands/update-user-model.js +31 -45
- package/dist/cli/commands/update-user-model.js.map +1 -1
- package/dist/cli/commands/validate.d.ts +4 -3
- package/dist/cli/commands/validate.d.ts.map +1 -1
- package/dist/cli/commands/validate.js +28 -26
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/session-mining/transcript.d.ts +7 -1
- package/dist/cli/session-mining/transcript.d.ts.map +1 -1
- package/dist/cli/session-mining/transcript.js +21 -14
- package/dist/cli/session-mining/transcript.js.map +1 -1
- package/dist/completion-checkers/index.d.ts +3 -3
- package/dist/completion-checkers/index.js +3 -3
- package/dist/completion-checkers/phase-format.d.ts +1 -1
- package/dist/completion-checkers/phase-format.js +2 -2
- package/dist/completion-checkers/phase-format.js.map +1 -1
- package/dist/completion-checkers/tdd-chain.d.ts +1 -1
- package/dist/completion-checkers/tdd-chain.js +2 -2
- package/dist/completion-checkers/tdd-chain.js.map +1 -1
- package/dist/completion-checkers/types.d.ts +5 -5
- package/dist/completion-checkers/types.d.ts.map +1 -1
- package/dist/completion-checkers/types.js +2 -2
- package/dist/context/session-manager.d.ts.map +1 -1
- package/dist/context/session-manager.js +19 -32
- package/dist/context/session-manager.js.map +1 -1
- package/dist/core/constraints/agent-prompt-renderer.d.ts.map +1 -1
- package/dist/core/constraints/agent-prompt-renderer.js +1 -4
- package/dist/core/constraints/agent-prompt-renderer.js.map +1 -1
- package/dist/core/constraints/capabilities-parser.d.ts +24 -7
- package/dist/core/constraints/capabilities-parser.d.ts.map +1 -1
- package/dist/core/constraints/capabilities-parser.js +32 -28
- package/dist/core/constraints/capabilities-parser.js.map +1 -1
- package/dist/core/constraints/capabilities-reconcile.d.ts +67 -0
- package/dist/core/constraints/capabilities-reconcile.d.ts.map +1 -0
- package/dist/core/constraints/capabilities-reconcile.js +105 -0
- package/dist/core/constraints/capabilities-reconcile.js.map +1 -0
- package/dist/core/constraints/checker.d.ts +21 -43
- package/dist/core/constraints/checker.d.ts.map +1 -1
- package/dist/core/constraints/checker.js +64 -115
- package/dist/core/constraints/checker.js.map +1 -1
- package/dist/core/constraints/checkers/capability-sync.d.ts +4 -3
- package/dist/core/constraints/checkers/capability-sync.d.ts.map +1 -1
- package/dist/core/constraints/checkers/capability-sync.js +29 -69
- package/dist/core/constraints/checkers/capability-sync.js.map +1 -1
- package/dist/core/constraints/checkers/context-doc-sync.d.ts +4 -2
- package/dist/core/constraints/checkers/context-doc-sync.d.ts.map +1 -1
- package/dist/core/constraints/checkers/context-doc-sync.js +13 -22
- package/dist/core/constraints/checkers/context-doc-sync.js.map +1 -1
- package/dist/core/constraints/checkers/docs-freshness.d.ts.map +1 -1
- package/dist/core/constraints/checkers/docs-freshness.js +37 -63
- package/dist/core/constraints/checkers/docs-freshness.js.map +1 -1
- package/dist/core/constraints/checkers/governance-presence.d.ts +2 -2
- package/dist/core/constraints/checkers/governance-presence.d.ts.map +1 -1
- package/dist/core/constraints/checkers/governance-presence.js +7 -28
- package/dist/core/constraints/checkers/governance-presence.js.map +1 -1
- package/dist/core/constraints/checkers/no-test-simplification.d.ts.map +1 -1
- package/dist/core/constraints/checkers/no-test-simplification.js +4 -3
- package/dist/core/constraints/checkers/no-test-simplification.js.map +1 -1
- package/dist/core/constraints/checkers/types.d.ts +2 -2
- package/dist/core/constraints/context-builder.d.ts +15 -14
- package/dist/core/constraints/context-builder.d.ts.map +1 -1
- package/dist/core/constraints/context-builder.js +32 -96
- package/dist/core/constraints/context-builder.js.map +1 -1
- package/dist/core/constraints/doc-freshness/runner.d.ts.map +1 -1
- package/dist/core/constraints/doc-freshness/runner.js +2 -1
- package/dist/core/constraints/doc-freshness/runner.js.map +1 -1
- package/dist/core/constraints/git-evidence.d.ts +60 -0
- package/dist/core/constraints/git-evidence.d.ts.map +1 -0
- package/dist/core/constraints/git-evidence.js +88 -0
- package/dist/core/constraints/git-evidence.js.map +1 -0
- package/dist/core/constraints/injection-drift.d.ts +3 -20
- package/dist/core/constraints/injection-drift.d.ts.map +1 -1
- package/dist/core/constraints/injection-drift.js +10 -57
- package/dist/core/constraints/injection-drift.js.map +1 -1
- package/dist/core/constraints/injection-writer.d.ts +113 -0
- package/dist/core/constraints/injection-writer.d.ts.map +1 -0
- package/dist/core/constraints/injection-writer.js +228 -0
- package/dist/core/constraints/injection-writer.js.map +1 -0
- package/dist/core/constraints/usage-report.d.ts +22 -1
- package/dist/core/constraints/usage-report.d.ts.map +1 -1
- package/dist/core/constraints/usage-report.js +27 -20
- package/dist/core/constraints/usage-report.js.map +1 -1
- package/dist/core/index.d.ts +2 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +4 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/project-config-loader.d.ts +32 -1
- package/dist/core/project-config-loader.d.ts.map +1 -1
- package/dist/core/project-config-loader.js +39 -9
- package/dist/core/project-config-loader.js.map +1 -1
- package/dist/core/validators/passes-gate.d.ts +15 -64
- package/dist/core/validators/passes-gate.d.ts.map +1 -1
- package/dist/core/validators/passes-gate.js +84 -222
- package/dist/core/validators/passes-gate.js.map +1 -1
- package/dist/core/validators/test-output.d.ts +58 -0
- package/dist/core/validators/test-output.d.ts.map +1 -0
- package/dist/core/validators/test-output.js +109 -0
- package/dist/core/validators/test-output.js.map +1 -0
- package/dist/failure/recorder.d.ts +7 -1
- package/dist/failure/recorder.d.ts.map +1 -1
- package/dist/failure/recorder.js +13 -9
- package/dist/failure/recorder.js.map +1 -1
- package/dist/gates/acceptance.d.ts +1 -48
- package/dist/gates/acceptance.d.ts.map +1 -1
- package/dist/gates/acceptance.js +6 -38
- package/dist/gates/acceptance.js.map +1 -1
- package/dist/gates/checker-gate.d.ts.map +1 -1
- package/dist/gates/checker-gate.js +6 -11
- package/dist/gates/checker-gate.js.map +1 -1
- package/dist/gates/command.d.ts.map +1 -1
- package/dist/gates/command.js +10 -22
- package/dist/gates/command.js.map +1 -1
- package/dist/gates/contract.d.ts.map +1 -1
- package/dist/gates/contract.js +22 -61
- package/dist/gates/contract.js.map +1 -1
- package/dist/gates/performance.d.ts.map +1 -1
- package/dist/gates/performance.js +13 -31
- package/dist/gates/performance.js.map +1 -1
- package/dist/gates/review.d.ts.map +1 -1
- package/dist/gates/review.js +21 -53
- package/dist/gates/review.js.map +1 -1
- package/dist/gates/security.d.ts.map +1 -1
- package/dist/gates/security.js +14 -32
- package/dist/gates/security.js.map +1 -1
- package/dist/gates/types.d.ts +28 -5
- package/dist/gates/types.d.ts.map +1 -1
- package/dist/gates/types.js +38 -1
- package/dist/gates/types.js.map +1 -1
- package/dist/hooks/bootstrap.d.ts +2 -0
- package/dist/hooks/bootstrap.d.ts.map +1 -1
- package/dist/hooks/bootstrap.js +5 -2
- package/dist/hooks/bootstrap.js.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -4
- package/dist/index.js.map +1 -1
- package/dist/knowledge/audit.d.ts +7 -2
- package/dist/knowledge/audit.d.ts.map +1 -1
- package/dist/knowledge/audit.js +59 -79
- package/dist/knowledge/audit.js.map +1 -1
- package/dist/knowledge/flywheel-metrics.d.ts +39 -0
- package/dist/knowledge/flywheel-metrics.d.ts.map +1 -0
- package/dist/knowledge/flywheel-metrics.js +47 -0
- package/dist/knowledge/flywheel-metrics.js.map +1 -0
- package/dist/knowledge/import.d.ts.map +1 -1
- package/dist/knowledge/import.js +4 -14
- package/dist/knowledge/import.js.map +1 -1
- package/dist/knowledge/index-generator.d.ts.map +1 -1
- package/dist/knowledge/index-generator.js +18 -15
- package/dist/knowledge/index-generator.js.map +1 -1
- package/dist/knowledge/ingest.d.ts.map +1 -1
- package/dist/knowledge/ingest.js +9 -4
- package/dist/knowledge/ingest.js.map +1 -1
- package/dist/knowledge/migration.d.ts.map +1 -1
- package/dist/knowledge/migration.js +11 -8
- package/dist/knowledge/migration.js.map +1 -1
- package/dist/knowledge/reference-tracker.d.ts.map +1 -1
- package/dist/knowledge/reference-tracker.js +12 -9
- package/dist/knowledge/reference-tracker.js.map +1 -1
- package/dist/knowledge/store.d.ts +15 -0
- package/dist/knowledge/store.d.ts.map +1 -1
- package/dist/knowledge/store.js +59 -10
- package/dist/knowledge/store.js.map +1 -1
- package/dist/monitoring/context-tracker.d.ts.map +1 -1
- package/dist/monitoring/context-tracker.js +11 -20
- package/dist/monitoring/context-tracker.js.map +1 -1
- package/dist/monitoring/index.d.ts +1 -1
- package/dist/monitoring/index.d.ts.map +1 -1
- package/dist/monitoring/index.js +1 -2
- package/dist/monitoring/index.js.map +1 -1
- package/dist/monitoring/trace-analyzer.d.ts +15 -0
- package/dist/monitoring/trace-analyzer.d.ts.map +1 -1
- package/dist/monitoring/trace-analyzer.js +19 -2
- package/dist/monitoring/trace-analyzer.js.map +1 -1
- package/dist/monitoring/traces.d.ts +21 -2
- package/dist/monitoring/traces.d.ts.map +1 -1
- package/dist/monitoring/traces.js +38 -29
- package/dist/monitoring/traces.js.map +1 -1
- package/dist/release/index.d.ts +3 -0
- package/dist/release/index.d.ts.map +1 -0
- package/dist/release/index.js +7 -0
- package/dist/release/index.js.map +1 -0
- package/dist/release/integrity.d.ts +65 -0
- package/dist/release/integrity.d.ts.map +1 -0
- package/dist/release/integrity.js +151 -0
- package/dist/release/integrity.js.map +1 -0
- package/dist/sdd/index-generator.js +10 -11
- package/dist/sdd/index-generator.js.map +1 -1
- package/dist/test-setup/project-fixture.d.ts +48 -0
- package/dist/test-setup/project-fixture.d.ts.map +1 -0
- package/dist/test-setup/project-fixture.js +106 -0
- package/dist/test-setup/project-fixture.js.map +1 -0
- package/dist/types/constraint.d.ts +0 -18
- package/dist/types/constraint.d.ts.map +1 -1
- package/dist/types/constraint.js.map +1 -1
- package/dist/types/failure.d.ts +7 -0
- package/dist/types/failure.d.ts.map +1 -1
- package/dist/types/failure.js +8 -1
- package/dist/types/failure.js.map +1 -1
- package/dist/types/passes-gate.d.ts +10 -25
- package/dist/types/passes-gate.d.ts.map +1 -1
- package/dist/types/project-config.d.ts +1 -1
- package/dist/types/session.d.ts +6 -5
- package/dist/types/session.d.ts.map +1 -1
- package/dist/utils/exec.d.ts +10 -0
- package/dist/utils/exec.d.ts.map +1 -1
- package/dist/utils/exec.js +12 -0
- package/dist/utils/exec.js.map +1 -1
- package/dist/utils/file-walk.d.ts +9 -1
- package/dist/utils/file-walk.d.ts.map +1 -1
- package/dist/utils/file-walk.js +10 -1
- package/dist/utils/file-walk.js.map +1 -1
- package/dist/utils/frontmatter.d.ts +73 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +141 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/jsonl.d.ts +92 -0
- package/dist/utils/jsonl.d.ts.map +1 -0
- package/dist/utils/jsonl.js +166 -0
- package/dist/utils/jsonl.js.map +1 -0
- package/dist/utils/package-version.d.ts +16 -0
- package/dist/utils/package-version.d.ts.map +1 -0
- package/dist/utils/package-version.js +63 -0
- package/dist/utils/package-version.js.map +1 -0
- package/package.json +1 -1
- package/src/CONTEXT.md +7 -2
- package/src/__tests__/acceptance-gate.test.ts +3 -1
- package/src/__tests__/checker-extra.test.ts +7 -1218
- package/src/__tests__/context-files-resolution.test.ts +116 -0
- package/src/__tests__/effective-constraints.test.ts +10 -13
- package/src/__tests__/exec.test.ts +35 -1
- package/src/__tests__/failure-recorder.test.ts +9 -0
- package/src/__tests__/layering.test.ts +152 -0
- package/src/__tests__/passes-gate-extra.test.ts +0 -145
- package/src/__tests__/passes-gate.test.ts +142 -106
- package/src/__tests__/public-exports.test.ts +3 -0
- package/src/__tests__/skip-semantics.test.ts +5 -9
- package/src/cli/__tests__/command-contract.test.ts +170 -0
- package/src/cli/command-contract.ts +108 -0
- package/src/cli/commands/CONTEXT.md +22 -7
- package/src/cli/commands/__tests__/acceptance.test.ts +40 -33
- package/src/cli/commands/__tests__/analyze-sessions.test.ts +35 -29
- package/src/cli/commands/__tests__/bin-exit-mapping.test.ts +101 -0
- package/src/cli/commands/__tests__/check-drift.test.ts +27 -34
- package/src/cli/commands/__tests__/check-skip-output.test.ts +21 -24
- package/src/cli/commands/__tests__/check.test.ts +378 -382
- package/src/cli/commands/__tests__/command.test.ts +85 -70
- package/src/cli/commands/__tests__/constraints-report.test.ts +100 -71
- package/src/cli/commands/__tests__/constraints-retire.test.ts +152 -95
- package/src/cli/commands/__tests__/contract.test.ts +27 -34
- package/src/cli/commands/__tests__/failure.test.ts +31 -34
- package/src/cli/commands/__tests__/init-injection.test.ts +58 -28
- package/src/cli/commands/__tests__/init.test.ts +77 -48
- package/src/cli/commands/__tests__/knowledge-flywheel-consistency.test.ts +108 -0
- package/src/cli/commands/__tests__/knowledge.test.ts +96 -38
- package/src/cli/commands/__tests__/passes-gate.test.ts +43 -45
- package/src/cli/commands/__tests__/performance.test.ts +22 -23
- package/src/cli/commands/__tests__/posteval-plan.test.ts +39 -38
- package/src/cli/commands/__tests__/project-path-anchoring.test.ts +157 -0
- package/src/cli/commands/__tests__/project-path-convention.test.ts +169 -0
- package/src/cli/commands/__tests__/registry.test.ts +69 -35
- package/src/cli/commands/__tests__/release.test.ts +224 -74
- package/src/cli/commands/__tests__/report-extra.test.ts +16 -16
- package/src/cli/commands/__tests__/report.test.ts +25 -25
- package/src/cli/commands/__tests__/review.test.ts +33 -31
- package/src/cli/commands/__tests__/security.test.ts +23 -27
- package/src/cli/commands/__tests__/spec-baseline-check.test.ts +20 -20
- package/src/cli/commands/__tests__/spec.test.ts +41 -29
- package/src/cli/commands/__tests__/status-extra.test.ts +18 -18
- package/src/cli/commands/__tests__/status-skipped-lines.test.ts +72 -0
- package/src/cli/commands/__tests__/status.test.ts +34 -34
- package/src/cli/commands/__tests__/sync-docs-agents.test.ts +108 -86
- package/src/cli/commands/__tests__/sync-docs.test.ts +72 -74
- package/src/cli/commands/__tests__/update-user-model.test.ts +62 -33
- package/src/cli/commands/__tests__/validate.test.ts +27 -29
- package/src/cli/commands/acceptance.ts +35 -24
- package/src/cli/commands/analyze-sessions.ts +25 -24
- package/src/cli/commands/check.ts +88 -65
- package/src/cli/commands/command.ts +30 -17
- package/src/cli/commands/constraints-report.ts +37 -34
- package/src/cli/commands/constraints-retire.ts +58 -55
- package/src/cli/commands/constraints.ts +10 -27
- package/src/cli/commands/contract.ts +51 -42
- package/src/cli/commands/definitions.ts +37 -223
- package/src/cli/commands/failure.ts +35 -27
- package/src/cli/commands/init.ts +166 -220
- package/src/cli/commands/knowledge.ts +250 -203
- package/src/cli/commands/passes-gate.ts +58 -68
- package/src/cli/commands/performance.ts +23 -18
- package/src/cli/commands/posteval-plan.ts +29 -15
- package/src/cli/commands/release.ts +75 -78
- package/src/cli/commands/report.ts +9 -5
- package/src/cli/commands/review.ts +39 -29
- package/src/cli/commands/sdd.ts +7 -5
- package/src/cli/commands/security.ts +35 -26
- package/src/cli/commands/spec-baseline-check.ts +16 -11
- package/src/cli/commands/spec.ts +66 -53
- package/src/cli/commands/status.ts +59 -53
- package/src/cli/commands/sync-docs/agents-syncer.ts +31 -15
- package/src/cli/commands/sync-docs/context-syncer.ts +3 -2
- package/src/cli/commands/sync-docs/index.ts +73 -100
- package/src/cli/commands/sync-docs/project-reader.ts +17 -18
- package/src/cli/commands/update-user-model.ts +33 -45
- package/src/cli/commands/validate.ts +31 -25
- package/src/cli/session-mining/__tests__/transcript.test.ts +118 -0
- package/src/cli/session-mining/transcript.ts +26 -8
- package/src/completion-checkers/CONTEXT.md +1 -1
- package/src/completion-checkers/__tests__/contract-presence.test.ts +1 -1
- package/src/completion-checkers/__tests__/phase-format.test.ts +1 -1
- package/src/completion-checkers/__tests__/tdd-chain.test.ts +2 -2
- package/src/completion-checkers/index.ts +3 -3
- package/src/completion-checkers/phase-format.ts +2 -2
- package/src/completion-checkers/tdd-chain.ts +2 -2
- package/src/completion-checkers/types.ts +5 -5
- package/src/context/session-manager.ts +19 -33
- package/src/core/CONTEXT.md +9 -6
- package/src/core/constraints/__tests__/capabilities-reconcile.test.ts +200 -0
- package/src/core/constraints/__tests__/capability-counts.test.ts +94 -0
- package/src/core/constraints/__tests__/git-evidence.test.ts +208 -0
- package/src/core/constraints/__tests__/injection-drift.test.ts +3 -10
- package/src/core/constraints/__tests__/injection-writer.test.ts +231 -0
- package/src/core/constraints/__tests__/trace-injection.test.ts +71 -0
- package/src/core/constraints/__tests__/usage-report.test.ts +112 -0
- package/src/core/constraints/agent-prompt-renderer.ts +2 -6
- package/src/core/constraints/capabilities-parser.ts +53 -35
- package/src/core/constraints/capabilities-reconcile.ts +166 -0
- package/src/core/constraints/checker.ts +75 -130
- package/src/core/constraints/checkers/__tests__/capability-sync.test.ts +214 -0
- package/src/core/constraints/checkers/__tests__/context-doc-sync.test.ts +77 -0
- package/src/core/constraints/checkers/__tests__/docs-freshness.test.ts +117 -0
- package/src/{__tests__ → core/constraints/checkers/__tests__}/governance-presence.test.ts +83 -9
- package/src/core/constraints/checkers/__tests__/iron-flags.test.ts +50 -0
- package/src/core/constraints/checkers/__tests__/no-bypass-checkpoint.test.ts +76 -0
- package/src/{__tests__ → core/constraints/checkers/__tests__}/no-hardcoded-credentials.test.ts +4 -3
- package/src/core/constraints/checkers/__tests__/no-test-simplification.test.ts +58 -0
- package/src/core/constraints/checkers/__tests__/three-state-consistency.test.ts +145 -0
- package/src/core/constraints/checkers/capability-sync.ts +29 -88
- package/src/core/constraints/checkers/context-doc-sync.ts +15 -25
- package/src/core/constraints/checkers/docs-freshness.ts +40 -69
- package/src/core/constraints/checkers/governance-presence.ts +7 -25
- package/src/core/constraints/checkers/no-test-simplification.ts +4 -3
- package/src/core/constraints/checkers/types.ts +2 -2
- package/src/core/constraints/context-builder.ts +39 -91
- package/src/core/constraints/doc-freshness/runner.ts +2 -1
- package/src/core/constraints/git-evidence.ts +120 -0
- package/src/core/constraints/injection-drift.ts +13 -60
- package/src/core/constraints/injection-writer.ts +212 -0
- package/src/core/constraints/usage-report.ts +36 -17
- package/src/core/index.ts +4 -2
- package/src/core/project-config-loader.ts +49 -9
- package/src/core/validators/__tests__/passes-gate.test.ts +2 -56
- package/src/core/validators/__tests__/test-output.test.ts +372 -0
- package/src/core/validators/passes-gate.ts +86 -248
- package/src/core/validators/test-output.ts +128 -0
- package/src/failure/__tests__/recorder.test.ts +168 -0
- package/src/failure/recorder.ts +13 -11
- package/src/gates/CONTEXT.md +6 -3
- package/src/gates/__tests__/acceptance-types-single-source.test.ts +68 -0
- package/src/gates/__tests__/acceptance.test.ts +4 -86
- package/src/gates/__tests__/effective-gates.test.ts +3 -8
- package/src/gates/__tests__/test-verdict-consistency.test.ts +140 -0
- package/src/gates/acceptance.ts +19 -84
- package/src/gates/checker-gate.ts +8 -7
- package/src/gates/command.ts +10 -16
- package/src/gates/contract.ts +22 -61
- package/src/gates/performance.ts +10 -22
- package/src/gates/review.ts +21 -41
- package/src/gates/security.ts +10 -22
- package/src/gates/types.ts +70 -5
- package/src/hooks/CONTEXT.md +1 -1
- package/src/hooks/bootstrap.ts +5 -2
- package/src/index.ts +11 -6
- package/src/knowledge/CONTEXT.md +8 -3
- package/src/knowledge/__tests__/audit-labels.test.ts +44 -0
- package/src/knowledge/__tests__/flywheel-metrics.test.ts +135 -0
- package/src/knowledge/__tests__/import.test.ts +44 -0
- package/src/knowledge/__tests__/index-generator.test.ts +55 -2
- package/src/knowledge/__tests__/ingest.test.ts +85 -0
- package/src/knowledge/__tests__/migration.test.ts +47 -0
- package/src/knowledge/__tests__/reference-tracker.test.ts +16 -0
- package/src/knowledge/__tests__/store.test.ts +194 -0
- package/src/knowledge/audit.ts +67 -71
- package/src/knowledge/flywheel-metrics.ts +71 -0
- package/src/knowledge/import.ts +4 -18
- package/src/knowledge/index-generator.ts +20 -15
- package/src/knowledge/ingest.ts +9 -4
- package/src/knowledge/migration.ts +11 -8
- package/src/knowledge/reference-tracker.ts +12 -8
- package/src/knowledge/store.ts +64 -11
- package/src/monitoring/CONTEXT.md +8 -3
- package/src/monitoring/__tests__/skipped-lines-report.test.ts +178 -0
- package/src/monitoring/__tests__/traces.test.ts +57 -0
- package/src/monitoring/context-tracker.ts +11 -23
- package/src/monitoring/index.ts +1 -1
- package/src/monitoring/trace-analyzer.ts +21 -2
- package/src/monitoring/traces.ts +39 -36
- package/src/release/CONTEXT.md +24 -0
- package/src/release/__tests__/barrel.test.ts +60 -0
- package/src/release/__tests__/integrity.test.ts +157 -0
- package/src/release/index.ts +2 -0
- package/src/release/integrity.ts +141 -0
- package/src/sdd/__tests__/index-generator.test.ts +71 -0
- package/src/sdd/index-generator.ts +9 -9
- package/src/test-setup/__tests__/project-fixture.test.ts +178 -0
- package/src/test-setup/project-fixture.ts +87 -0
- package/src/tools/CONTEXT.md +6 -0
- package/src/tools/__tests__/registry.test.ts +221 -0
- package/src/types/__tests__/types.test.ts +4 -5
- package/src/types/constraint.ts +0 -25
- package/src/types/failure.ts +8 -0
- package/src/types/passes-gate.ts +10 -30
- package/src/types/project-config.ts +1 -1
- package/src/types/session.ts +5 -5
- package/src/utils/__tests__/frontmatter.test.ts +206 -0
- package/src/utils/__tests__/jsonl-skip-disposition.test.ts +175 -0
- package/src/utils/__tests__/jsonl.test.ts +187 -0
- package/src/utils/__tests__/package-version.test.ts +97 -0
- package/src/utils/exec.ts +15 -0
- package/src/utils/file-walk.ts +11 -2
- package/src/utils/frontmatter.ts +121 -0
- package/src/utils/jsonl.ts +167 -0
- package/src/utils/package-version.ts +27 -0
- package/dist/cli/commands/doc-freshness-check.d.ts +0 -53
- package/dist/cli/commands/doc-freshness-check.d.ts.map +0 -1
- package/dist/cli/commands/doc-freshness-check.js +0 -352
- package/dist/cli/commands/doc-freshness-check.js.map +0 -1
- package/dist/types/index.d.ts +0 -14
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -39
- package/dist/types/index.js.map +0 -1
- package/src/__tests__/long-running.test.ts +0 -17
- package/src/__tests__/passes-gate-extension.test.ts +0 -151
- package/src/cli/commands/__tests__/doc-freshness-check.test.ts +0 -168
- package/src/cli/commands/doc-freshness-check.ts +0 -386
- package/src/spec/CONTEXT.md +0 -11
- package/src/types/index.ts +0 -47
|
@@ -9,12 +9,13 @@
|
|
|
9
9
|
import { Constraint, ConstraintContext, ConstraintResult, ConstraintCheckResult } from '../../types/constraint';
|
|
10
10
|
import type { ExecutionTrace } from '../../types/trace';
|
|
11
11
|
import type { MergedConstraintsConfig } from '../../types/project-config';
|
|
12
|
+
import { type GitEvidence } from './git-evidence';
|
|
12
13
|
/**
|
|
13
|
-
* trace
|
|
14
|
-
* 不反向依赖 core,方向单向、无环,checker 可直接值引用 getTraceCollector)
|
|
14
|
+
* trace 记录器最小接口(工单 15 decycle 收尾,harness#88)
|
|
15
15
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
16
|
+
* core 不上行依赖 monitoring:记录器经**构造参数**注入,未注入 = no-op
|
|
17
|
+
* (默认无副作用)。真实收集器由组合根接线——CLI check/report 与 bootstrap
|
|
18
|
+
* 各自 `new ConstraintChecker(getTraceCollector())`。
|
|
18
19
|
*/
|
|
19
20
|
export interface TraceRecorder {
|
|
20
21
|
record(trace: ExecutionTrace): void;
|
|
@@ -26,38 +27,13 @@ export declare class ConstraintChecker {
|
|
|
26
27
|
private static instance;
|
|
27
28
|
/** 检查结果缓存(S7:src 扫描等重复 I/O,TTL=1s 防跨测试污染) */
|
|
28
29
|
private cache;
|
|
30
|
+
/** trace 记录器(构造注入;缺省 no-op) */
|
|
31
|
+
private readonly traceRecorder;
|
|
32
|
+
constructor(traceRecorder?: TraceRecorder);
|
|
29
33
|
/**
|
|
30
|
-
*
|
|
31
|
-
* git diff 等命令只执行一次;run 外直接调用私有检查方法时不 memo(恒新鲜)。
|
|
32
|
-
*/
|
|
33
|
-
private runCache;
|
|
34
|
-
/** trace 记录器(注入式;null = 未显式注入,首次记录时惰性接线全局收集器) */
|
|
35
|
-
private traceRecorder;
|
|
36
|
-
private constructor();
|
|
37
|
-
/**
|
|
38
|
-
* 取 trace 记录器:未显式注入时惰性接线全局收集器(幂等,ADR-0003 副作用收敛)
|
|
39
|
-
*/
|
|
40
|
-
private getRecorder;
|
|
41
|
-
/**
|
|
42
|
-
* run 内 memoize;无活动 run 时直接执行(工单 18)
|
|
43
|
-
*/
|
|
44
|
-
private memoRun;
|
|
45
|
-
/**
|
|
46
|
-
* staged 全量 diff(同一次 run 内只执行一次 git 命令,工单 18)
|
|
47
|
-
*/
|
|
48
|
-
private getStagedDiff;
|
|
49
|
-
/**
|
|
50
|
-
* staged 变更文件名列表(同一次 run 内只执行一次 git 命令,工单 18)
|
|
51
|
-
*/
|
|
52
|
-
private getStagedDiffNames;
|
|
53
|
-
/**
|
|
54
|
-
* 获取单例实例
|
|
34
|
+
* 获取单例实例(未接线记录器的默认实例:不写 trace)
|
|
55
35
|
*/
|
|
56
36
|
static getInstance(): ConstraintChecker;
|
|
57
|
-
/**
|
|
58
|
-
* 注入 trace 记录器(测试/定制场景;不调用则首次记录时惰性接线全局收集器)
|
|
59
|
-
*/
|
|
60
|
-
setTraceRecorder(recorder: TraceRecorder): void;
|
|
61
37
|
/**
|
|
62
38
|
* 获取当前的约束集合(内置 + 自定义)
|
|
63
39
|
*
|
|
@@ -73,19 +49,14 @@ export declare class ConstraintChecker {
|
|
|
73
49
|
};
|
|
74
50
|
/**
|
|
75
51
|
* 检查单个约束
|
|
52
|
+
*
|
|
53
|
+
* @param evidence 可选,本 run 的 git 证据实例(#87);不传 = 本次调用独占一份真 git 证据
|
|
76
54
|
*/
|
|
77
|
-
check(constraint: Constraint, context: ConstraintContext): Promise<ConstraintResult>;
|
|
55
|
+
check(constraint: Constraint, context: ConstraintContext, evidence?: GitEvidence): Promise<ConstraintResult>;
|
|
78
56
|
/**
|
|
79
57
|
* 根据约束层级获取严重性
|
|
80
58
|
*/
|
|
81
59
|
private getSeverity;
|
|
82
|
-
/**
|
|
83
|
-
* 判断约束是否匹配当前触发条件
|
|
84
|
-
*
|
|
85
|
-
* context.operation 为主触发条件,context.extraTriggers 为次级推断
|
|
86
|
-
* (ADR-0001:pre-commit 代码变更附加 code_implementation),任一命中即匹配。
|
|
87
|
-
*/
|
|
88
|
-
private matchesTrigger;
|
|
89
60
|
/**
|
|
90
61
|
* 记录约束检查的 trace
|
|
91
62
|
*/
|
|
@@ -95,6 +66,9 @@ export declare class ConstraintChecker {
|
|
|
95
66
|
*
|
|
96
67
|
* 注册表闭环(ADR-0001):kind='check' 未注册 checker 直接抛错,
|
|
97
68
|
* 不再有"未注册默认通过"路径;kind='prompt' 在 check() 入口已短路。
|
|
69
|
+
*
|
|
70
|
+
* git 证据(stagedDiff/stagedDiffNames)单一来源 = GitEvidence adapter(#87):
|
|
71
|
+
* 一次 run 内调用方传同一实例即至多取证一次,run 外调用独占一份。
|
|
98
72
|
*/
|
|
99
73
|
private checkPrecondition;
|
|
100
74
|
/**
|
|
@@ -116,16 +90,20 @@ export declare class ConstraintChecker {
|
|
|
116
90
|
*
|
|
117
91
|
* @param context 约束上下文
|
|
118
92
|
* @param customConfig 可选,per-request 自定义配置(避免多请求间的单例状态污染)
|
|
93
|
+
* @param evidence 可选,本 run 的 git 证据 adapter(#87)。调用方(CLI check)与
|
|
94
|
+
* buildConstraintContext 传同一实例 → 一次 run 内 git 取证单一来源;
|
|
95
|
+
* 不传则本 run 自建一份,run 级 memo 照样生效(memo 在实例层,非隐式全局)。
|
|
119
96
|
*/
|
|
120
|
-
checkConstraints(context: ConstraintContext, customConfig?: MergedConstraintsConfig | null): Promise<ConstraintCheckResult>;
|
|
97
|
+
checkConstraints(context: ConstraintContext, customConfig?: MergedConstraintsConfig | null, evidence?: GitEvidence): Promise<ConstraintCheckResult>;
|
|
121
98
|
/**
|
|
122
99
|
* 执行前检查(仅检查 Iron Laws)
|
|
123
100
|
*
|
|
124
101
|
* @param context 约束上下文
|
|
125
102
|
* @param customConfig 可选,per-request 自定义配置(避免多请求间的单例状态污染)
|
|
103
|
+
* @param evidence 可选,本次检查共用的 git 证据 adapter(#87,同 checkConstraints)
|
|
126
104
|
* @throws ConstraintViolationError 如果有铁律违规
|
|
127
105
|
*/
|
|
128
|
-
beforeExecution(context: ConstraintContext, customConfig?: MergedConstraintsConfig | null): Promise<void>;
|
|
106
|
+
beforeExecution(context: ConstraintContext, customConfig?: MergedConstraintsConfig | null, evidence?: GitEvidence): Promise<void>;
|
|
129
107
|
}
|
|
130
108
|
/**
|
|
131
109
|
* 快捷函数:检查约束
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checker.d.ts","sourceRoot":"","sources":["../../../src/core/constraints/checker.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,
|
|
1
|
+
{"version":3,"file":"checker.d.ts","sourceRoot":"","sources":["../../../src/core/constraints/checker.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,14 +13,15 @@ exports.checkConstraint = checkConstraint;
|
|
|
13
13
|
exports.checkConstraints = checkConstraints;
|
|
14
14
|
exports.checkBeforeExecution = checkBeforeExecution;
|
|
15
15
|
const constraint_1 = require("../../types/constraint");
|
|
16
|
-
const traces_1 = require("../../monitoring/traces");
|
|
17
16
|
const definitions_1 = require("./definitions");
|
|
18
17
|
const exec_1 = require("../../utils/exec");
|
|
19
|
-
const exec_2 = require("../../utils/exec");
|
|
20
18
|
const path_1 = require("path");
|
|
21
19
|
const check_cache_1 = require("./check-cache");
|
|
22
20
|
const file_walk_1 = require("../../utils/file-walk");
|
|
23
21
|
const checkers_1 = require("./checkers");
|
|
22
|
+
const git_evidence_1 = require("./git-evidence");
|
|
23
|
+
/** 未注入时的默认记录器:不记录 */
|
|
24
|
+
const NOOP_TRACE_RECORDER = { record: () => undefined };
|
|
24
25
|
/**
|
|
25
26
|
* 约束检查器
|
|
26
27
|
*/
|
|
@@ -28,50 +29,13 @@ class ConstraintChecker {
|
|
|
28
29
|
static instance;
|
|
29
30
|
/** 检查结果缓存(S7:src 扫描等重复 I/O,TTL=1s 防跨测试污染) */
|
|
30
31
|
cache = new check_cache_1.CheckCache({ ttlMs: 1000 });
|
|
31
|
-
/**
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
runCache = null;
|
|
36
|
-
/** trace 记录器(注入式;null = 未显式注入,首次记录时惰性接线全局收集器) */
|
|
37
|
-
traceRecorder = null;
|
|
38
|
-
constructor() { }
|
|
39
|
-
/**
|
|
40
|
-
* 取 trace 记录器:未显式注入时惰性接线全局收集器(幂等,ADR-0003 副作用收敛)
|
|
41
|
-
*/
|
|
42
|
-
getRecorder() {
|
|
43
|
-
if (!this.traceRecorder) {
|
|
44
|
-
this.traceRecorder = (0, traces_1.getTraceCollector)();
|
|
45
|
-
}
|
|
46
|
-
return this.traceRecorder;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* run 内 memoize;无活动 run 时直接执行(工单 18)
|
|
50
|
-
*/
|
|
51
|
-
memoRun(key, fn) {
|
|
52
|
-
if (!this.runCache)
|
|
53
|
-
return fn();
|
|
54
|
-
let pending = this.runCache.get(key);
|
|
55
|
-
if (!pending) {
|
|
56
|
-
pending = fn();
|
|
57
|
-
this.runCache.set(key, pending);
|
|
58
|
-
}
|
|
59
|
-
return pending;
|
|
32
|
+
/** trace 记录器(构造注入;缺省 no-op) */
|
|
33
|
+
traceRecorder;
|
|
34
|
+
constructor(traceRecorder = NOOP_TRACE_RECORDER) {
|
|
35
|
+
this.traceRecorder = traceRecorder;
|
|
60
36
|
}
|
|
61
37
|
/**
|
|
62
|
-
*
|
|
63
|
-
*/
|
|
64
|
-
getStagedDiff(projectPath) {
|
|
65
|
-
return this.memoRun(`git_diff_staged:${projectPath}`, () => (0, exec_2.runCommand)('git diff --cached', projectPath));
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* staged 变更文件名列表(同一次 run 内只执行一次 git 命令,工单 18)
|
|
69
|
-
*/
|
|
70
|
-
getStagedDiffNames(projectPath) {
|
|
71
|
-
return this.memoRun(`git_diff_staged_names:${projectPath}`, () => (0, exec_2.runCommand)('git diff --cached --name-only', projectPath));
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* 获取单例实例
|
|
38
|
+
* 获取单例实例(未接线记录器的默认实例:不写 trace)
|
|
75
39
|
*/
|
|
76
40
|
static getInstance() {
|
|
77
41
|
if (!ConstraintChecker.instance) {
|
|
@@ -79,12 +43,6 @@ class ConstraintChecker {
|
|
|
79
43
|
}
|
|
80
44
|
return ConstraintChecker.instance;
|
|
81
45
|
}
|
|
82
|
-
/**
|
|
83
|
-
* 注入 trace 记录器(测试/定制场景;不调用则首次记录时惰性接线全局收集器)
|
|
84
|
-
*/
|
|
85
|
-
setTraceRecorder(recorder) {
|
|
86
|
-
this.traceRecorder = recorder;
|
|
87
|
-
}
|
|
88
46
|
/**
|
|
89
47
|
* 获取当前的约束集合(内置 + 自定义)
|
|
90
48
|
*
|
|
@@ -106,8 +64,10 @@ class ConstraintChecker {
|
|
|
106
64
|
}
|
|
107
65
|
/**
|
|
108
66
|
* 检查单个约束
|
|
67
|
+
*
|
|
68
|
+
* @param evidence 可选,本 run 的 git 证据实例(#87);不传 = 本次调用独占一份真 git 证据
|
|
109
69
|
*/
|
|
110
|
-
async check(constraint, context) {
|
|
70
|
+
async check(constraint, context, evidence) {
|
|
111
71
|
// prompt 类约束不参与 checker 执行(ADR-0001:仅参与注入)
|
|
112
72
|
if (constraint.kind === 'prompt') {
|
|
113
73
|
return {
|
|
@@ -119,7 +79,7 @@ class ConstraintChecker {
|
|
|
119
79
|
};
|
|
120
80
|
}
|
|
121
81
|
// 检查前置条件('skip' = 约定未采用/证据未接线:satisfied 置 true 但不计 pass/fail)
|
|
122
|
-
const outcome = await this.checkPrecondition(constraint, context);
|
|
82
|
+
const outcome = await this.checkPrecondition(constraint, context, evidence);
|
|
123
83
|
if (outcome === 'skip') {
|
|
124
84
|
return {
|
|
125
85
|
id: constraint.id,
|
|
@@ -157,22 +117,11 @@ class ConstraintChecker {
|
|
|
157
117
|
return 'warning';
|
|
158
118
|
}
|
|
159
119
|
}
|
|
160
|
-
/**
|
|
161
|
-
* 判断约束是否匹配当前触发条件
|
|
162
|
-
*
|
|
163
|
-
* context.operation 为主触发条件,context.extraTriggers 为次级推断
|
|
164
|
-
* (ADR-0001:pre-commit 代码变更附加 code_implementation),任一命中即匹配。
|
|
165
|
-
*/
|
|
166
|
-
matchesTrigger(constraint, context) {
|
|
167
|
-
const triggers = (0, exec_1.normalizeTriggers)(constraint.trigger);
|
|
168
|
-
const operations = [context.operation, ...(context.extraTriggers ?? [])];
|
|
169
|
-
return operations.some(op => triggers.includes(op));
|
|
170
|
-
}
|
|
171
120
|
/**
|
|
172
121
|
* 记录约束检查的 trace
|
|
173
122
|
*/
|
|
174
|
-
recordTrace(
|
|
175
|
-
|
|
123
|
+
recordTrace(constraint, checkResult, context) {
|
|
124
|
+
this.traceRecorder.record({
|
|
176
125
|
constraintId: constraint.id,
|
|
177
126
|
level: constraint.level,
|
|
178
127
|
timestamp: Date.now(),
|
|
@@ -188,17 +137,21 @@ class ConstraintChecker {
|
|
|
188
137
|
*
|
|
189
138
|
* 注册表闭环(ADR-0001):kind='check' 未注册 checker 直接抛错,
|
|
190
139
|
* 不再有"未注册默认通过"路径;kind='prompt' 在 check() 入口已短路。
|
|
140
|
+
*
|
|
141
|
+
* git 证据(stagedDiff/stagedDiffNames)单一来源 = GitEvidence adapter(#87):
|
|
142
|
+
* 一次 run 内调用方传同一实例即至多取证一次,run 外调用独占一份。
|
|
191
143
|
*/
|
|
192
|
-
async checkPrecondition(constraint, context) {
|
|
144
|
+
async checkPrecondition(constraint, context, evidence) {
|
|
193
145
|
const impl = (0, checkers_1.getConstraintCheck)(constraint.id);
|
|
194
146
|
if (!impl) {
|
|
195
147
|
throw new Error(`[harness] 约束 "${constraint.id}" (kind='check') 未注册 checker,拒绝静默通过。` +
|
|
196
148
|
`请在 checkers/ 注册实现,或将约束改为 kind='prompt'。`);
|
|
197
149
|
}
|
|
198
150
|
const projectPath = context.projectPath || process.cwd();
|
|
151
|
+
const git = evidence ?? (0, git_evidence_1.createGitEvidence)(projectPath);
|
|
199
152
|
const env = (0, checkers_1.buildCheckEnv)(context, {
|
|
200
|
-
stagedDiff: () =>
|
|
201
|
-
stagedDiffNames: () =>
|
|
153
|
+
stagedDiff: async () => git.stagedDiff(),
|
|
154
|
+
stagedDiffNames: async () => git.changedFileNames(true),
|
|
202
155
|
srcScan: (root) => this.cache.getSync(`src_scan_${root}`, projectPath, () => (0, file_walk_1.findTsSourceFiles)((0, path_1.join)(projectPath, root), { skipIndex: true }).map((f) => (0, path_1.relative)(projectPath, f))),
|
|
203
156
|
});
|
|
204
157
|
return await impl.evaluate(env);
|
|
@@ -213,12 +166,7 @@ class ConstraintChecker {
|
|
|
213
166
|
const operations = [context.operation, ...(context.extraTriggers ?? [])];
|
|
214
167
|
const constraints = this.getConstraints(customConfig);
|
|
215
168
|
const filterByTrigger = (constraintSet) => {
|
|
216
|
-
return Object.values(constraintSet).filter(constraint =>
|
|
217
|
-
const triggers = Array.isArray(constraint.trigger)
|
|
218
|
-
? constraint.trigger
|
|
219
|
-
: [constraint.trigger];
|
|
220
|
-
return operations.some(op => triggers.includes(op));
|
|
221
|
-
});
|
|
169
|
+
return Object.values(constraintSet).filter(constraint => (0, exec_1.matchesTrigger)(constraint, operations));
|
|
222
170
|
};
|
|
223
171
|
return {
|
|
224
172
|
ironLaws: filterByTrigger(constraints.ironLaws),
|
|
@@ -234,63 +182,64 @@ class ConstraintChecker {
|
|
|
234
182
|
*
|
|
235
183
|
* @param context 约束上下文
|
|
236
184
|
* @param customConfig 可选,per-request 自定义配置(避免多请求间的单例状态污染)
|
|
185
|
+
* @param evidence 可选,本 run 的 git 证据 adapter(#87)。调用方(CLI check)与
|
|
186
|
+
* buildConstraintContext 传同一实例 → 一次 run 内 git 取证单一来源;
|
|
187
|
+
* 不传则本 run 自建一份,run 级 memo 照样生效(memo 在实例层,非隐式全局)。
|
|
237
188
|
*/
|
|
238
|
-
async checkConstraints(context, customConfig) {
|
|
239
|
-
// run 起始:重置
|
|
189
|
+
async checkConstraints(context, customConfig, evidence) {
|
|
190
|
+
// run 起始:重置 src 扫描缓存(S7);git 证据 = 本 run 独占的 adapter 实例(工单 18 → #87)
|
|
240
191
|
this.cache.invalidate();
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
// 2. Guidelines: 记录警告
|
|
264
|
-
for (const constraint of Object.values(constraints.guidelines)) {
|
|
265
|
-
if (!this.matchesTrigger(constraint, context))
|
|
266
|
-
continue;
|
|
267
|
-
const checkResult = await this.check(constraint, context);
|
|
268
|
-
result.guidelines.push(checkResult);
|
|
269
|
-
this.recordTrace(traceCollector, constraint, checkResult, context);
|
|
270
|
-
if (!checkResult.satisfied) {
|
|
271
|
-
result.warningCount++;
|
|
272
|
-
}
|
|
192
|
+
const run = evidence ?? (0, git_evidence_1.createGitEvidence)(context.projectPath || process.cwd());
|
|
193
|
+
const result = {
|
|
194
|
+
ironLaws: [],
|
|
195
|
+
guidelines: [],
|
|
196
|
+
passed: true,
|
|
197
|
+
warningCount: 0,
|
|
198
|
+
};
|
|
199
|
+
const constraints = this.getConstraints(customConfig);
|
|
200
|
+
// context.operation 为主触发条件,extraTriggers 为次级推断(ADR-0001),任一命中即匹配
|
|
201
|
+
const operations = [context.operation, ...(context.extraTriggers ?? [])];
|
|
202
|
+
// 1. Iron Laws: 必须全部通过
|
|
203
|
+
for (const constraint of Object.values(constraints.ironLaws)) {
|
|
204
|
+
if (!(0, exec_1.matchesTrigger)(constraint, operations))
|
|
205
|
+
continue;
|
|
206
|
+
const checkResult = await this.check(constraint, context, run);
|
|
207
|
+
result.ironLaws.push(checkResult);
|
|
208
|
+
this.recordTrace(constraint, checkResult, context);
|
|
209
|
+
if (!checkResult.satisfied) {
|
|
210
|
+
result.passed = false;
|
|
211
|
+
throw new constraint_1.ConstraintViolationError(checkResult);
|
|
273
212
|
}
|
|
274
|
-
return result;
|
|
275
213
|
}
|
|
276
|
-
|
|
277
|
-
|
|
214
|
+
// 2. Guidelines: 记录警告
|
|
215
|
+
for (const constraint of Object.values(constraints.guidelines)) {
|
|
216
|
+
if (!(0, exec_1.matchesTrigger)(constraint, operations))
|
|
217
|
+
continue;
|
|
218
|
+
const checkResult = await this.check(constraint, context, run);
|
|
219
|
+
result.guidelines.push(checkResult);
|
|
220
|
+
this.recordTrace(constraint, checkResult, context);
|
|
221
|
+
if (!checkResult.satisfied) {
|
|
222
|
+
result.warningCount++;
|
|
223
|
+
}
|
|
278
224
|
}
|
|
225
|
+
return result;
|
|
279
226
|
}
|
|
280
227
|
/**
|
|
281
228
|
* 执行前检查(仅检查 Iron Laws)
|
|
282
229
|
*
|
|
283
230
|
* @param context 约束上下文
|
|
284
231
|
* @param customConfig 可选,per-request 自定义配置(避免多请求间的单例状态污染)
|
|
232
|
+
* @param evidence 可选,本次检查共用的 git 证据 adapter(#87,同 checkConstraints)
|
|
285
233
|
* @throws ConstraintViolationError 如果有铁律违规
|
|
286
234
|
*/
|
|
287
|
-
async beforeExecution(context, customConfig) {
|
|
235
|
+
async beforeExecution(context, customConfig, evidence) {
|
|
236
|
+
const run = evidence ?? (0, git_evidence_1.createGitEvidence)(context.projectPath || process.cwd());
|
|
288
237
|
const constraints = this.getConstraints(customConfig);
|
|
289
238
|
const operations = [context.operation, ...(context.extraTriggers ?? [])];
|
|
290
239
|
for (const constraint of Object.values(constraints.ironLaws)) {
|
|
291
|
-
if (!(0, exec_1.
|
|
240
|
+
if (!(0, exec_1.matchesTrigger)(constraint, operations))
|
|
292
241
|
continue;
|
|
293
|
-
const result = await this.check(constraint, context);
|
|
242
|
+
const result = await this.check(constraint, context, run);
|
|
294
243
|
if (!result.satisfied) {
|
|
295
244
|
throw new constraint_1.ConstraintViolationError(result);
|
|
296
245
|
}
|
|
@@ -349,6 +298,6 @@ async function checkConstraints(context, options) {
|
|
|
349
298
|
async function checkBeforeExecution(context, customConfig) {
|
|
350
299
|
return ConstraintChecker.getInstance().beforeExecution(context, customConfig);
|
|
351
300
|
}
|
|
352
|
-
//
|
|
301
|
+
// 导出单例(未接线记录器:只评估约束,不写 trace;写 trace 由组合根自行 new)
|
|
353
302
|
exports.constraintChecker = ConstraintChecker.getInstance();
|
|
354
303
|
//# sourceMappingURL=checker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checker.js","sourceRoot":"","sources":["../../../src/core/constraints/checker.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;
|
|
1
|
+
{"version":3,"file":"checker.js","sourceRoot":"","sources":["../../../src/core/constraints/checker.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,11 +5,12 @@
|
|
|
5
5
|
* 1. Git diff 增量 — 当前变更的非测试文件是否在文档中有记录
|
|
6
6
|
* 2. 全量扫描 — 源码根下所有源文件是否都在 CAPABILITIES.md 中(T-058)
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
8
|
+
* 覆盖/漏登判定不在本文件实现,统一走 capabilities-reconcile(ADR-0009):
|
|
9
|
+
* 目录条目(以 / 结尾)前缀匹配,文件条目精确匹配或路径边界后缀匹配;
|
|
10
|
+
* module 模式下目录条目参与覆盖,未覆盖文件按源码根下第一级子目录聚合。
|
|
11
11
|
*
|
|
12
12
|
* 清单格式(计数行,mode=listing 或嗅探命中)无文件表可核对,直接放行;
|
|
13
|
+
* 「有表格但零条目」不得放行,无表格的散文文档保持历史放行;
|
|
13
14
|
* 检查异常时 fail-open 但输出 console.warn 保留可观测性。
|
|
14
15
|
*
|
|
15
16
|
* ADR-0001 存在性探测:项目根无 CAPABILITIES.md(未采用该约定)时返回 'skip',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capability-sync.d.ts","sourceRoot":"","sources":["../../../../src/core/constraints/checkers/capability-sync.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"capability-sync.d.ts","sourceRoot":"","sources":["../../../../src/core/constraints/checkers/capability-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAQH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,eAAO,MAAM,cAAc,EAAE,eAuD5B,CAAC"}
|
|
@@ -6,11 +6,12 @@
|
|
|
6
6
|
* 1. Git diff 增量 — 当前变更的非测试文件是否在文档中有记录
|
|
7
7
|
* 2. 全量扫描 — 源码根下所有源文件是否都在 CAPABILITIES.md 中(T-058)
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* 覆盖/漏登判定不在本文件实现,统一走 capabilities-reconcile(ADR-0009):
|
|
10
|
+
* 目录条目(以 / 结尾)前缀匹配,文件条目精确匹配或路径边界后缀匹配;
|
|
11
|
+
* module 模式下目录条目参与覆盖,未覆盖文件按源码根下第一级子目录聚合。
|
|
12
12
|
*
|
|
13
13
|
* 清单格式(计数行,mode=listing 或嗅探命中)无文件表可核对,直接放行;
|
|
14
|
+
* 「有表格但零条目」不得放行,无表格的散文文档保持历史放行;
|
|
14
15
|
* 检查异常时 fail-open 但输出 console.warn 保留可观测性。
|
|
15
16
|
*
|
|
16
17
|
* ADR-0001 存在性探测:项目根无 CAPABILITIES.md(未采用该约定)时返回 'skip',
|
|
@@ -23,20 +24,7 @@ const path_1 = require("path");
|
|
|
23
24
|
const capabilities_parser_1 = require("../capabilities-parser");
|
|
24
25
|
const project_config_loader_1 = require("../../project-config-loader");
|
|
25
26
|
const detect_source_roots_1 = require("../../../utils/detect-source-roots");
|
|
26
|
-
|
|
27
|
-
const TABLE_SEPARATOR_REGEX = /^\s*\|[\s:|-]+\|\s*$/m;
|
|
28
|
-
/**
|
|
29
|
-
* 变更文件是否被条目覆盖
|
|
30
|
-
*
|
|
31
|
-
* 目录条目(以 / 结尾)前缀匹配;文件条目精确匹配或路径边界后缀匹配
|
|
32
|
-
* (兼容 basename 条目,但拒绝 xfoo.ts 命中 foo.ts、docs/src/foo.tsx 命中 src/foo.ts
|
|
33
|
-
* 这类 endsWith/includes 模糊匹配造成的碰撞)
|
|
34
|
-
*/
|
|
35
|
-
function isCoveredBy(entries, changed) {
|
|
36
|
-
return entries.some((listed) => listed.endsWith('/')
|
|
37
|
-
? changed.startsWith(listed)
|
|
38
|
-
: changed === listed || changed.endsWith('/' + listed));
|
|
39
|
-
}
|
|
27
|
+
const capabilities_reconcile_1 = require("../capabilities-reconcile");
|
|
40
28
|
exports.capabilitySync = {
|
|
41
29
|
id: 'capability_sync',
|
|
42
30
|
async evaluate(env) {
|
|
@@ -47,68 +35,40 @@ exports.capabilitySync = {
|
|
|
47
35
|
}
|
|
48
36
|
try {
|
|
49
37
|
const capabilitiesPath = (0, path_1.join)(projectPath, 'CAPABILITIES.md');
|
|
50
|
-
if (!(0, fs_1.existsSync)(capabilitiesPath)) {
|
|
51
|
-
// 检查是否有代码变更,无变更则跳过
|
|
52
|
-
const diff = await env.stagedDiffNames();
|
|
53
|
-
const changedCodeFiles = diff.split('\n').filter((f) => f.endsWith('.ts') || f.endsWith('.tsx') || f.endsWith('.js'));
|
|
54
|
-
return changedCodeFiles.length === 0;
|
|
55
|
-
}
|
|
56
38
|
const content = (0, fs_1.readFileSync)(capabilitiesPath, 'utf-8');
|
|
57
39
|
const capabilitiesMode = (0, project_config_loader_1.getCapabilitiesMode)(projectPath);
|
|
58
40
|
// 清单格式(计数行)没有文件表可核对,计数由 sync-docs 维护,直接放行
|
|
59
41
|
if (capabilitiesMode === 'listing' || (0, capabilities_parser_1.isCapabilityListingFormat)(content)) {
|
|
60
42
|
return true;
|
|
61
43
|
}
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
const hasTable = TABLE_SEPARATOR_REGEX.test(content);
|
|
69
|
-
// ── Step 1: Git diff 增量检查 ──
|
|
70
|
-
const diff = await env.stagedDiffNames();
|
|
71
|
-
const changedCodeFiles = diff.split('\n').filter((f) => f.endsWith('.ts') || f.endsWith('.tsx') || f.endsWith('.js'));
|
|
72
|
-
const significantChanges = changedCodeFiles.filter((f) => !f.includes('__tests__') && !f.includes('.test.') && !f.includes('.spec.'));
|
|
73
|
-
// 每个变更文件都必须被覆盖(every;some 会让一个命中掩盖其余漏网)
|
|
74
|
-
if (significantChanges.length > 0 &&
|
|
75
|
-
(entries.length > 0 || hasTable) &&
|
|
76
|
-
!significantChanges.every((changed) => isCoveredBy(entries, changed))) {
|
|
77
|
-
return false;
|
|
44
|
+
const sourceRoots = (0, detect_source_roots_1.detectSourceRoots)(projectPath);
|
|
45
|
+
const population = [];
|
|
46
|
+
for (const root of sourceRoots) {
|
|
47
|
+
if ((0, fs_1.existsSync)((0, path_1.join)(projectPath, root))) {
|
|
48
|
+
population.push(...env.srcScan(root));
|
|
49
|
+
}
|
|
78
50
|
}
|
|
51
|
+
const diffNames = (await env.stagedDiffNames()).split('\n').filter(Boolean);
|
|
52
|
+
const verdict = (0, capabilities_reconcile_1.reconcileCapabilities)({
|
|
53
|
+
content,
|
|
54
|
+
populationFiles: population,
|
|
55
|
+
changedFiles: (0, capabilities_reconcile_1.significantCodeChanges)(diffNames),
|
|
56
|
+
sourceRoots,
|
|
57
|
+
});
|
|
58
|
+
// 零条目门槛:有表格但什么都没登记时不得直接放行
|
|
59
|
+
const gateOpen = verdict.coverageEntries.length === 0 && !verdict.hasTable;
|
|
60
|
+
if (gateOpen)
|
|
61
|
+
return true;
|
|
62
|
+
// ── Step 1: Git diff 增量检查(每个变更文件都必须被覆盖)──
|
|
63
|
+
if (verdict.uncoveredChanges.length > 0)
|
|
64
|
+
return false;
|
|
79
65
|
// ── Step 2: 全量源码根扫描(T-058 修复核心)──
|
|
80
66
|
if (capabilitiesMode === 'module') {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
if (entries.length > 0 || hasTable) {
|
|
84
|
-
const uncoveredDirs = new Set();
|
|
85
|
-
const sourceRoots = (0, detect_source_roots_1.detectSourceRoots)(projectPath);
|
|
86
|
-
for (const root of sourceRoots) {
|
|
87
|
-
const srcDir = (0, path_1.join)(projectPath, root);
|
|
88
|
-
if ((0, fs_1.existsSync)(srcDir)) {
|
|
89
|
-
for (const file of env.srcScan(root)) {
|
|
90
|
-
if (!isCoveredBy(entries, file)) {
|
|
91
|
-
uncoveredDirs.add((0, capabilities_parser_1.aggregateToSourceSubdir)(root, file));
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
if (uncoveredDirs.size > 0)
|
|
97
|
-
return false;
|
|
98
|
-
}
|
|
67
|
+
if (verdict.uncoveredDirs.length > 0)
|
|
68
|
+
return false;
|
|
99
69
|
}
|
|
100
|
-
else if (
|
|
101
|
-
|
|
102
|
-
for (const root of sourceRoots) {
|
|
103
|
-
const srcDir = (0, path_1.join)(projectPath, root);
|
|
104
|
-
if ((0, fs_1.existsSync)(srcDir)) {
|
|
105
|
-
for (const file of env.srcScan(root)) {
|
|
106
|
-
if (!isCoveredBy(listedFiles, file)) {
|
|
107
|
-
return false;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
}
|
|
70
|
+
else if (verdict.uncoveredFiles.length > 0) {
|
|
71
|
+
return false;
|
|
112
72
|
}
|
|
113
73
|
return true;
|
|
114
74
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capability-sync.js","sourceRoot":"","sources":["../../../../src/core/constraints/checkers/capability-sync.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"capability-sync.js","sourceRoot":"","sources":["../../../../src/core/constraints/checkers/capability-sync.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;;AAEH,2BAA8C;AAC9C,+BAA4B;AAC5B,gEAAmE;AACnE,uEAAkE;AAClE,4EAAuE;AACvE,sEAA0F;AAG7E,QAAA,cAAc,GAAoB;IAC7C,EAAE,EAAE,iBAAiB;IACrB,KAAK,CAAC,QAAQ,CAAC,GAAG;QAChB,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC;QACpC,+DAA+D;QAC/D,IAAI,CAAC,IAAA,eAAU,EAAC,IAAA,WAAI,EAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC;YACtD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,IAAI,CAAC;YACH,MAAM,gBAAgB,GAAG,IAAA,WAAI,EAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;YAC9D,MAAM,OAAO,GAAG,IAAA,iBAAY,EAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;YACxD,MAAM,gBAAgB,GAAG,IAAA,2CAAmB,EAAC,WAAW,CAAC,CAAC;YAE1D,0CAA0C;YAC1C,IAAI,gBAAgB,KAAK,SAAS,IAAI,IAAA,+CAAyB,EAAC,OAAO,CAAC,EAAE,CAAC;gBACzE,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,WAAW,GAAG,IAAA,uCAAiB,EAAC,WAAW,CAAC,CAAC;YACnD,MAAM,UAAU,GAAa,EAAE,CAAC;YAChC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;gBAC/B,IAAI,IAAA,eAAU,EAAC,IAAA,WAAI,EAAC,WAAW,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;oBACxC,UAAU,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;gBACxC,CAAC;YACH,CAAC;YAED,MAAM,SAAS,GAAG,CAAC,MAAM,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC5E,MAAM,OAAO,GAAG,IAAA,8CAAqB,EAAC;gBACpC,OAAO;gBACP,eAAe,EAAE,UAAU;gBAC3B,YAAY,EAAE,IAAA,+CAAsB,EAAC,SAAS,CAAC;gBAC/C,WAAW;aACZ,CAAC,CAAC;YAEH,0BAA0B;YAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC3E,IAAI,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAE1B,2CAA2C;YAC3C,IAAI,OAAO,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC;YAEtD,mCAAmC;YACnC,IAAI,gBAAgB,KAAK,QAAQ,EAAE,CAAC;gBAClC,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;oBAAE,OAAO,KAAK,CAAC;YACrD,CAAC;iBAAM,IAAI,OAAO,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7C,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,8CAA8C;YAC9C,OAAO,CAAC,IAAI,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;YACpD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF,CAAC"}
|