@dommaker/harness 1.6.0 → 1.8.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 +52 -0
- package/bin/harness.js +17 -1
- package/dist/agents/index.d.ts +6 -2
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +6 -16
- package/dist/agents/index.js.map +1 -1
- package/dist/cli/commands/__tests__/gate-decision.d.ts +18 -0
- package/dist/cli/commands/__tests__/gate-decision.d.ts.map +1 -0
- package/dist/cli/commands/__tests__/gate-decision.js +26 -0
- package/dist/cli/commands/__tests__/gate-decision.js.map +1 -0
- package/dist/cli/commands/acceptance.d.ts.map +1 -1
- package/dist/cli/commands/acceptance.js +17 -28
- package/dist/cli/commands/acceptance.js.map +1 -1
- package/dist/cli/commands/check.d.ts +11 -3
- package/dist/cli/commands/check.d.ts.map +1 -1
- package/dist/cli/commands/check.js +26 -11
- package/dist/cli/commands/check.js.map +1 -1
- package/dist/cli/commands/command.d.ts +0 -1
- package/dist/cli/commands/command.d.ts.map +1 -1
- package/dist/cli/commands/command.js +8 -6
- package/dist/cli/commands/command.js.map +1 -1
- package/dist/cli/commands/constraints-retire.d.ts.map +1 -1
- package/dist/cli/commands/constraints-retire.js +36 -57
- package/dist/cli/commands/constraints-retire.js.map +1 -1
- package/dist/cli/commands/contract.d.ts.map +1 -1
- package/dist/cli/commands/contract.js +36 -42
- package/dist/cli/commands/contract.js.map +1 -1
- package/dist/cli/commands/definitions.d.ts +2 -0
- package/dist/cli/commands/definitions.d.ts.map +1 -1
- package/dist/cli/commands/definitions.js +11 -6
- package/dist/cli/commands/definitions.js.map +1 -1
- package/dist/cli/commands/failure.d.ts.map +1 -1
- package/dist/cli/commands/failure.js +16 -2
- package/dist/cli/commands/failure.js.map +1 -1
- package/dist/cli/commands/init.d.ts +14 -8
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +172 -364
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/knowledge-view.d.ts +90 -0
- package/dist/cli/commands/knowledge-view.d.ts.map +1 -0
- package/dist/cli/commands/knowledge-view.js +198 -0
- package/dist/cli/commands/knowledge-view.js.map +1 -0
- package/dist/cli/commands/knowledge.d.ts +137 -52
- package/dist/cli/commands/knowledge.d.ts.map +1 -1
- package/dist/cli/commands/knowledge.js +534 -400
- package/dist/cli/commands/knowledge.js.map +1 -1
- package/dist/cli/commands/passes-gate.d.ts +4 -1
- package/dist/cli/commands/passes-gate.d.ts.map +1 -1
- package/dist/cli/commands/passes-gate.js +11 -2
- package/dist/cli/commands/passes-gate.js.map +1 -1
- package/dist/cli/commands/performance.d.ts.map +1 -1
- package/dist/cli/commands/performance.js +19 -31
- package/dist/cli/commands/performance.js.map +1 -1
- package/dist/cli/commands/report.d.ts.map +1 -1
- package/dist/cli/commands/report.js +2 -1
- package/dist/cli/commands/report.js.map +1 -1
- package/dist/cli/commands/review.d.ts.map +1 -1
- package/dist/cli/commands/review.js +13 -25
- package/dist/cli/commands/review.js.map +1 -1
- package/dist/cli/commands/scaffold-templates.d.ts +73 -0
- package/dist/cli/commands/scaffold-templates.d.ts.map +1 -0
- package/dist/cli/commands/scaffold-templates.js +424 -0
- package/dist/cli/commands/scaffold-templates.js.map +1 -0
- package/dist/cli/commands/scaffold.d.ts +105 -0
- package/dist/cli/commands/scaffold.d.ts.map +1 -0
- package/dist/cli/commands/scaffold.js +263 -0
- package/dist/cli/commands/scaffold.js.map +1 -0
- package/dist/cli/commands/security.d.ts.map +1 -1
- package/dist/cli/commands/security.js +22 -24
- package/dist/cli/commands/security.js.map +1 -1
- package/dist/cli/commands/spec-baseline-check.d.ts +43 -0
- package/dist/cli/commands/spec-baseline-check.d.ts.map +1 -1
- package/dist/cli/commands/spec-baseline-check.js +109 -34
- package/dist/cli/commands/spec-baseline-check.js.map +1 -1
- package/dist/cli/commands/sync-docs/context-syncer.d.ts +21 -2
- package/dist/cli/commands/sync-docs/context-syncer.d.ts.map +1 -1
- package/dist/cli/commands/sync-docs/context-syncer.js +112 -28
- package/dist/cli/commands/sync-docs/context-syncer.js.map +1 -1
- package/dist/cli/commands/sync-docs/index.d.ts +1 -1
- package/dist/cli/commands/sync-docs/index.d.ts.map +1 -1
- package/dist/cli/commands/sync-docs/index.js +86 -27
- package/dist/cli/commands/sync-docs/index.js.map +1 -1
- package/dist/cli/commands/sync-docs/project-reader.d.ts +24 -1
- package/dist/cli/commands/sync-docs/project-reader.d.ts.map +1 -1
- package/dist/cli/commands/sync-docs/project-reader.js +33 -7
- package/dist/cli/commands/sync-docs/project-reader.js.map +1 -1
- package/dist/cli/commands/validate.d.ts +0 -16
- package/dist/cli/commands/validate.d.ts.map +1 -1
- package/dist/cli/commands/validate.js +2 -97
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/gate-command.d.ts +37 -0
- package/dist/cli/gate-command.d.ts.map +1 -0
- package/dist/cli/gate-command.js +64 -0
- package/dist/cli/gate-command.js.map +1 -0
- package/dist/completion-checkers/index.d.ts +1 -1
- package/dist/completion-checkers/index.d.ts.map +1 -1
- package/dist/completion-checkers/index.js +0 -15
- package/dist/completion-checkers/index.js.map +1 -1
- package/dist/context/knowledge-injector.d.ts +4 -2
- package/dist/context/knowledge-injector.d.ts.map +1 -1
- package/dist/context/knowledge-injector.js +13 -6
- package/dist/context/knowledge-injector.js.map +1 -1
- package/dist/core/constraints/agent-prompt-renderer.js +2 -2
- package/dist/core/constraints/agent-prompt-renderer.js.map +1 -1
- package/dist/core/constraints/capabilities-reconcile.d.ts +20 -0
- package/dist/core/constraints/capabilities-reconcile.d.ts.map +1 -1
- package/dist/core/constraints/capabilities-reconcile.js +26 -4
- package/dist/core/constraints/capabilities-reconcile.js.map +1 -1
- package/dist/core/constraints/check-cache.d.ts +1 -1
- package/dist/core/constraints/check-cache.js +1 -1
- package/dist/core/constraints/checker.d.ts +8 -3
- package/dist/core/constraints/checker.d.ts.map +1 -1
- package/dist/core/constraints/checker.js +30 -19
- package/dist/core/constraints/checker.js.map +1 -1
- package/dist/core/constraints/checkers/capability-sync.d.ts +3 -1
- package/dist/core/constraints/checkers/capability-sync.d.ts.map +1 -1
- package/dist/core/constraints/checkers/capability-sync.js +17 -24
- package/dist/core/constraints/checkers/capability-sync.js.map +1 -1
- package/dist/core/constraints/checkers/context-doc-sync.d.ts +1 -1
- package/dist/core/constraints/checkers/context-doc-sync.d.ts.map +1 -1
- package/dist/core/constraints/checkers/context-doc-sync.js +9 -6
- 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 +24 -30
- package/dist/core/constraints/checkers/docs-freshness.js.map +1 -1
- package/dist/core/constraints/checkers/governance-presence.d.ts.map +1 -1
- package/dist/core/constraints/checkers/governance-presence.js +10 -4
- package/dist/core/constraints/checkers/governance-presence.js.map +1 -1
- package/dist/core/constraints/checkers/types.d.ts +10 -6
- package/dist/core/constraints/checkers/types.d.ts.map +1 -1
- package/dist/core/constraints/checkers/types.js +7 -3
- package/dist/core/constraints/checkers/types.js.map +1 -1
- package/dist/core/constraints/context-builder.d.ts +11 -10
- package/dist/core/constraints/context-builder.d.ts.map +1 -1
- package/dist/core/constraints/context-builder.js +31 -27
- package/dist/core/constraints/context-builder.js.map +1 -1
- package/dist/core/constraints/context-reconcile.d.ts +75 -0
- package/dist/core/constraints/context-reconcile.d.ts.map +1 -0
- package/dist/core/constraints/context-reconcile.js +161 -0
- package/dist/core/constraints/context-reconcile.js.map +1 -0
- package/dist/core/constraints/doc-freshness/runner.d.ts +7 -0
- package/dist/core/constraints/doc-freshness/runner.d.ts.map +1 -1
- package/dist/core/constraints/doc-freshness/runner.js +8 -3
- package/dist/core/constraints/doc-freshness/runner.js.map +1 -1
- package/dist/core/constraints/git-evidence.js +1 -1
- package/dist/core/constraints/git-evidence.js.map +1 -1
- package/dist/core/constraints/injection-drift.d.ts +7 -2
- package/dist/core/constraints/injection-drift.d.ts.map +1 -1
- package/dist/core/constraints/injection-drift.js +13 -7
- package/dist/core/constraints/injection-drift.js.map +1 -1
- package/dist/core/constraints/run-env.d.ts +92 -0
- package/dist/core/constraints/run-env.d.ts.map +1 -0
- package/dist/core/constraints/run-env.js +175 -0
- package/dist/core/constraints/run-env.js.map +1 -0
- package/dist/core/constraints/triggers.d.ts +22 -0
- package/dist/core/constraints/triggers.d.ts.map +1 -0
- package/dist/core/constraints/triggers.js +31 -0
- package/dist/core/constraints/triggers.js.map +1 -0
- package/dist/core/effective-constraints.d.ts +13 -4
- package/dist/core/effective-constraints.d.ts.map +1 -1
- package/dist/core/effective-constraints.js +16 -6
- package/dist/core/effective-constraints.js.map +1 -1
- package/dist/core/effective-set.d.ts +8 -15
- package/dist/core/effective-set.d.ts.map +1 -1
- package/dist/core/effective-set.js +7 -12
- package/dist/core/effective-set.js.map +1 -1
- package/dist/core/index.d.ts +2 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/project-config-loader.d.ts +39 -17
- package/dist/core/project-config-loader.d.ts.map +1 -1
- package/dist/core/project-config-loader.js +51 -122
- package/dist/core/project-config-loader.js.map +1 -1
- package/dist/core/validators/check-handlers/http.d.ts +2 -2
- package/dist/core/validators/check-handlers/http.d.ts.map +1 -1
- package/dist/core/validators/check-handlers/http.js +12 -7
- package/dist/core/validators/check-handlers/http.js.map +1 -1
- package/dist/core/validators/index.d.ts +1 -1
- package/dist/core/validators/index.d.ts.map +1 -1
- package/dist/core/validators/passes-gate.d.ts.map +1 -1
- package/dist/core/validators/passes-gate.js +2 -2
- package/dist/core/validators/passes-gate.js.map +1 -1
- package/dist/failure/classifier.d.ts +1 -1
- package/dist/failure/classifier.d.ts.map +1 -1
- package/dist/failure/classifier.js +8 -8
- package/dist/failure/classifier.js.map +1 -1
- package/dist/failure/index.d.ts +2 -1
- package/dist/failure/index.d.ts.map +1 -1
- package/dist/failure/index.js +9 -17
- package/dist/failure/index.js.map +1 -1
- package/dist/failure/recorder.d.ts +1 -1
- package/dist/failure/recorder.d.ts.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 +3 -2
- package/dist/gates/checker-gate.js.map +1 -1
- package/dist/gates/command.d.ts +10 -4
- package/dist/gates/command.d.ts.map +1 -1
- package/dist/gates/command.js +36 -62
- package/dist/gates/command.js.map +1 -1
- package/dist/gates/contract.d.ts.map +1 -1
- package/dist/gates/contract.js +0 -4
- package/dist/gates/contract.js.map +1 -1
- package/dist/gates/definitions.d.ts +2 -1
- package/dist/gates/definitions.d.ts.map +1 -1
- package/dist/gates/definitions.js +6 -5
- package/dist/gates/definitions.js.map +1 -1
- package/dist/gates/index.d.ts +0 -4
- package/dist/gates/index.d.ts.map +1 -1
- package/dist/gates/index.js +1 -6
- package/dist/gates/index.js.map +1 -1
- package/dist/gates/performance.d.ts.map +1 -1
- package/dist/gates/performance.js +0 -4
- package/dist/gates/performance.js.map +1 -1
- package/dist/gates/runner.d.ts +1 -1
- package/dist/gates/runner.js +1 -1
- package/dist/gates/security.d.ts +1 -1
- package/dist/gates/security.d.ts.map +1 -1
- package/dist/gates/security.js +5 -6
- package/dist/gates/security.js.map +1 -1
- package/dist/gates/types.d.ts +14 -17
- package/dist/gates/types.d.ts.map +1 -1
- package/dist/gates/types.js.map +1 -1
- package/dist/hooks/bootstrap.d.ts +6 -4
- package/dist/hooks/bootstrap.d.ts.map +1 -1
- package/dist/hooks/bootstrap.js +25 -13
- package/dist/hooks/bootstrap.js.map +1 -1
- package/dist/hooks/config.d.ts +6 -2
- package/dist/hooks/config.d.ts.map +1 -1
- package/dist/hooks/config.js +5 -1
- package/dist/hooks/config.js.map +1 -1
- package/dist/hooks/index.d.ts +1 -1
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +0 -15
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/pipeline.d.ts.map +1 -1
- package/dist/hooks/pipeline.js +2 -4
- package/dist/hooks/pipeline.js.map +1 -1
- package/dist/hooks/registry.d.ts +11 -8
- package/dist/hooks/registry.d.ts.map +1 -1
- package/dist/hooks/registry.js +22 -7
- package/dist/hooks/registry.js.map +1 -1
- package/dist/hooks/types.d.ts +23 -7
- package/dist/hooks/types.d.ts.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -4
- package/dist/index.js.map +1 -1
- package/dist/knowledge/audit-scoring.d.ts +87 -0
- package/dist/knowledge/audit-scoring.d.ts.map +1 -0
- package/dist/knowledge/audit-scoring.js +470 -0
- package/dist/knowledge/audit-scoring.js.map +1 -0
- package/dist/knowledge/audit.d.ts +11 -59
- package/dist/knowledge/audit.d.ts.map +1 -1
- package/dist/knowledge/audit.js +47 -522
- package/dist/knowledge/audit.js.map +1 -1
- package/dist/knowledge/import.d.ts.map +1 -1
- package/dist/knowledge/import.js +2 -0
- package/dist/knowledge/import.js.map +1 -1
- package/dist/knowledge/index-generator.d.ts.map +1 -1
- package/dist/knowledge/index-generator.js +4 -5
- package/dist/knowledge/index-generator.js.map +1 -1
- package/dist/knowledge/index.d.ts +3 -2
- package/dist/knowledge/index.d.ts.map +1 -1
- package/dist/knowledge/index.js +3 -16
- package/dist/knowledge/index.js.map +1 -1
- package/dist/knowledge/ingest.js +1 -1
- package/dist/knowledge/ingest.js.map +1 -1
- package/dist/knowledge/lifecycle.d.ts.map +1 -1
- package/dist/knowledge/lifecycle.js +4 -2
- package/dist/knowledge/lifecycle.js.map +1 -1
- package/dist/knowledge/migration.d.ts +3 -0
- package/dist/knowledge/migration.d.ts.map +1 -1
- package/dist/knowledge/migration.js +8 -2
- package/dist/knowledge/migration.js.map +1 -1
- package/dist/knowledge/query.d.ts +6 -0
- package/dist/knowledge/query.d.ts.map +1 -1
- package/dist/knowledge/query.js +8 -2
- package/dist/knowledge/query.js.map +1 -1
- package/dist/knowledge/reference-tracker.d.ts.map +1 -1
- package/dist/knowledge/reference-tracker.js +4 -6
- package/dist/knowledge/reference-tracker.js.map +1 -1
- package/dist/knowledge/store.d.ts +22 -16
- package/dist/knowledge/store.d.ts.map +1 -1
- package/dist/knowledge/store.js +53 -12
- package/dist/knowledge/store.js.map +1 -1
- package/dist/knowledge/tree-walker.d.ts +19 -0
- package/dist/knowledge/tree-walker.d.ts.map +1 -0
- package/dist/knowledge/tree-walker.js +30 -0
- package/dist/knowledge/tree-walker.js.map +1 -0
- package/dist/knowledge/types.d.ts +16 -0
- package/dist/knowledge/types.d.ts.map +1 -1
- package/dist/monitoring/traces.d.ts +5 -3
- package/dist/monitoring/traces.d.ts.map +1 -1
- package/dist/monitoring/traces.js +19 -5
- package/dist/monitoring/traces.js.map +1 -1
- package/dist/test-setup/jsonl-fake-fs.d.ts +30 -0
- package/dist/test-setup/jsonl-fake-fs.d.ts.map +1 -0
- package/dist/test-setup/jsonl-fake-fs.js +49 -0
- package/dist/test-setup/jsonl-fake-fs.js.map +1 -0
- package/dist/tools/index.d.ts +4 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +7 -15
- package/dist/tools/index.js.map +1 -1
- package/dist/types/checkpoint.d.ts +5 -0
- package/dist/types/checkpoint.d.ts.map +1 -1
- package/dist/types/passes-gate.d.ts +0 -13
- package/dist/types/passes-gate.d.ts.map +1 -1
- package/dist/types/project-config.d.ts +18 -0
- package/dist/types/project-config.d.ts.map +1 -1
- package/dist/types/trace.d.ts +13 -4
- package/dist/types/trace.d.ts.map +1 -1
- package/dist/types/trace.js +4 -3
- package/dist/types/trace.js.map +1 -1
- package/dist/utils/exec.d.ts +4 -27
- package/dist/utils/exec.d.ts.map +1 -1
- package/dist/utils/exec.js +4 -94
- package/dist/utils/exec.js.map +1 -1
- package/dist/utils/jsonl.d.ts +17 -7
- package/dist/utils/jsonl.d.ts.map +1 -1
- package/dist/utils/jsonl.js +144 -17
- package/dist/utils/jsonl.js.map +1 -1
- package/dist/utils/numeric-flag.d.ts +44 -0
- package/dist/utils/numeric-flag.d.ts.map +1 -0
- package/dist/utils/numeric-flag.js +62 -0
- package/dist/utils/numeric-flag.js.map +1 -0
- package/package.json +1 -1
- package/src/CONTEXT.md +5 -2
- package/src/__tests__/acceptance-gate.test.ts +7 -4
- package/src/__tests__/checker-extra.test.ts +3 -2
- package/src/__tests__/checker.test.ts +4 -3
- package/src/__tests__/checkpoint.test.ts +26 -9
- package/src/__tests__/context-files-resolution.test.ts +29 -15
- package/src/__tests__/contract-gate.test.ts +19 -40
- package/src/__tests__/error-classifier.test.ts +1 -1
- package/src/__tests__/exec.test.ts +45 -107
- package/src/__tests__/failure-recorder.test.ts +7 -5
- package/src/__tests__/hooks-pipeline.test.ts +34 -47
- package/src/__tests__/layering.test.ts +217 -25
- package/src/__tests__/passes-gate.test.ts +9 -4
- package/src/__tests__/performance-gate.test.ts +3 -15
- package/src/__tests__/project-config-loader-extra.test.ts +31 -57
- package/src/__tests__/project-config-loader.test.ts +6 -3
- package/src/__tests__/public-exports.test.ts +27 -6
- package/src/__tests__/public-type-surface.test.ts +360 -0
- package/src/__tests__/public-value-surface.test.ts +182 -0
- package/src/__tests__/review-gate.test.ts +4 -6
- package/src/__tests__/security-gate.test.ts +5 -20
- package/src/__tests__/skip-semantics.test.ts +5 -3
- package/src/__tests__/spec-validator.test.ts +3 -2
- package/src/__tests__/sub-barrels-explicit.test.ts +87 -0
- package/src/__tests__/test-fixture-hygiene.test.ts +53 -0
- package/src/__tests__/trace-analyzer-extra.test.ts +5 -3
- package/src/__tests__/trace-analyzer.test.ts +5 -3
- package/src/__tests__/trace-collector.test.ts +5 -3
- package/src/agents/index.ts +13 -2
- package/src/cli/__tests__/gate-command.test.ts +162 -0
- package/src/cli/commands/CONTEXT.md +29 -5
- package/src/cli/commands/__tests__/acceptance.test.ts +24 -25
- package/src/cli/commands/__tests__/bin-exit-mapping.test.ts +15 -0
- package/src/cli/commands/__tests__/check-drift.test.ts +42 -1
- package/src/cli/commands/__tests__/check-read-count.test.ts +167 -0
- package/src/cli/commands/__tests__/check-skip-output.test.ts +4 -1
- package/src/cli/commands/__tests__/check.test.ts +43 -36
- package/src/cli/commands/__tests__/command-gate-dead-options.test.ts +60 -0
- package/src/cli/commands/__tests__/command.test.ts +33 -17
- package/src/cli/commands/__tests__/constraints-retire.test.ts +52 -0
- package/src/cli/commands/__tests__/context-syncer.test.ts +141 -0
- package/src/cli/commands/__tests__/contract.test.ts +20 -20
- package/src/cli/commands/__tests__/failure.test.ts +5 -4
- package/src/cli/commands/__tests__/gate-decision.ts +30 -0
- package/src/cli/commands/__tests__/init-dead-options.test.ts +50 -0
- package/src/cli/commands/__tests__/init-governance-io.test.ts +139 -0
- package/src/cli/commands/__tests__/init-injection.test.ts +3 -3
- package/src/cli/commands/__tests__/init-ondisk.test.ts +867 -0
- package/src/cli/commands/__tests__/init.test.ts +82 -6
- package/src/cli/commands/__tests__/knowledge-audit-threshold.test.ts +146 -0
- package/src/cli/commands/__tests__/knowledge-flywheel-consistency.test.ts +1 -1
- package/src/cli/commands/__tests__/knowledge-tone-mapping.test.ts +244 -0
- package/src/cli/commands/__tests__/knowledge-view.test.ts +839 -0
- package/src/cli/commands/__tests__/knowledge.test.ts +33 -15
- package/src/cli/commands/__tests__/numeric-flag-assembly.test.ts +368 -0
- package/src/cli/commands/__tests__/passes-gate-dead-options.test.ts +89 -1
- package/src/cli/commands/__tests__/performance.test.ts +19 -21
- package/src/cli/commands/__tests__/posteval-plan.test.ts +5 -3
- package/src/cli/commands/__tests__/pre-push-hook.test.ts +181 -0
- package/src/cli/commands/__tests__/project-path-anchoring.test.ts +95 -2
- package/src/cli/commands/__tests__/project-path-convention.test.ts +103 -25
- package/src/cli/commands/__tests__/registry.test.ts +2 -0
- package/src/cli/commands/__tests__/report.test.ts +23 -1
- package/src/cli/commands/__tests__/review.test.ts +10 -17
- package/src/cli/commands/__tests__/scaffold.test.ts +505 -0
- package/src/cli/commands/__tests__/security-default-scan.test.ts +75 -0
- package/src/cli/commands/__tests__/security.test.ts +21 -24
- package/src/cli/commands/__tests__/spec-baseline-check.test.ts +3 -2
- package/src/cli/commands/__tests__/spec-baseline-index-cap.test.ts +131 -0
- package/src/cli/commands/__tests__/spec-baseline-read-count.test.ts +325 -0
- package/src/cli/commands/__tests__/sync-docs-agents.test.ts +19 -4
- package/src/cli/commands/__tests__/sync-docs-context-drift.test.ts +232 -0
- package/src/cli/commands/__tests__/sync-docs-module-order.test.ts +111 -0
- package/src/cli/commands/__tests__/sync-docs-read-count.test.ts +192 -0
- package/src/cli/commands/__tests__/sync-docs.test.ts +3 -2
- package/src/cli/commands/__tests__/validate.test.ts +1 -48
- package/src/cli/commands/acceptance.ts +24 -29
- package/src/cli/commands/check.ts +40 -17
- package/src/cli/commands/command.ts +9 -8
- package/src/cli/commands/constraints-retire.ts +57 -70
- package/src/cli/commands/contract.ts +44 -47
- package/src/cli/commands/definitions.ts +12 -6
- package/src/cli/commands/failure.ts +16 -3
- package/src/cli/commands/init.ts +242 -389
- package/src/cli/commands/knowledge-view.ts +224 -0
- package/src/cli/commands/knowledge.ts +643 -448
- package/src/cli/commands/passes-gate.ts +12 -3
- package/src/cli/commands/performance.ts +31 -38
- package/src/cli/commands/report.ts +3 -2
- package/src/cli/commands/review.ts +22 -28
- package/src/cli/commands/scaffold-templates.ts +406 -0
- package/src/cli/commands/scaffold.ts +302 -0
- package/src/cli/commands/security.ts +27 -23
- package/src/cli/commands/spec-baseline-check.ts +158 -33
- package/src/cli/commands/sync-docs/__tests__/context-export-surface.test.ts +102 -0
- package/src/cli/commands/sync-docs/__tests__/module-descriptions.test.ts +196 -0
- package/src/cli/commands/sync-docs/context-syncer.ts +137 -31
- package/src/cli/commands/sync-docs/index.ts +103 -28
- package/src/cli/commands/sync-docs/project-reader.ts +51 -7
- package/src/cli/commands/validate.ts +1 -104
- package/src/cli/gate-command.ts +87 -0
- package/src/completion-checkers/index.ts +10 -1
- package/src/context/CONTEXT.md +2 -1
- package/src/context/__tests__/knowledge-injector.test.ts +27 -0
- package/src/context/__tests__/session-manager.test.ts +19 -12
- package/src/context/knowledge-injector.ts +14 -7
- package/src/core/CONTEXT.md +10 -7
- package/src/core/__tests__/effective-set.test.ts +36 -60
- package/src/core/constraints/__tests__/context-reconcile.test.ts +246 -0
- package/src/core/constraints/__tests__/run-env.test.ts +377 -0
- package/src/core/constraints/__tests__/triggers.test.ts +70 -0
- package/src/core/constraints/agent-prompt-renderer.ts +1 -1
- package/src/core/constraints/capabilities-reconcile.ts +28 -4
- package/src/core/constraints/check-cache.ts +1 -1
- package/src/core/constraints/checker.ts +30 -14
- package/src/core/constraints/checkers/__tests__/context-doc-sync.test.ts +8 -3
- package/src/core/constraints/checkers/__tests__/governance-presence.test.ts +16 -7
- package/src/core/constraints/checkers/__tests__/no-hardcoded-credentials.test.ts +2 -1
- package/src/core/constraints/checkers/capability-sync.ts +27 -28
- package/src/core/constraints/checkers/context-doc-sync.ts +9 -7
- package/src/core/constraints/checkers/docs-freshness.ts +28 -33
- package/src/core/constraints/checkers/governance-presence.ts +10 -6
- package/src/core/constraints/checkers/types.ts +14 -8
- package/src/core/constraints/context-builder.ts +35 -26
- package/src/core/constraints/context-reconcile.ts +200 -0
- package/src/core/constraints/doc-freshness/__tests__/runner.test.ts +25 -0
- package/src/core/constraints/doc-freshness/runner.ts +18 -4
- package/src/core/constraints/git-evidence.ts +1 -1
- package/src/core/constraints/injection-drift.ts +19 -8
- package/src/core/constraints/run-env.ts +207 -0
- package/src/core/constraints/triggers.ts +33 -0
- package/src/core/effective-constraints.ts +17 -6
- package/src/core/effective-set.ts +8 -24
- package/src/core/index.ts +2 -1
- package/src/core/project-config-loader.ts +54 -102
- package/src/core/validators/__tests__/http-retry-sleep.test.ts +231 -0
- package/src/core/validators/check-handlers/http.ts +18 -7
- package/src/core/validators/index.ts +0 -1
- package/src/core/validators/passes-gate.ts +2 -3
- package/src/failure/CONTEXT.md +2 -1
- package/src/failure/classifier.ts +2 -2
- package/src/failure/index.ts +14 -2
- package/src/failure/recorder.ts +1 -1
- package/src/gates/CONTEXT.md +13 -7
- package/src/gates/__tests__/checker-gate.test.ts +1 -1
- package/src/gates/__tests__/command-single-predicate.test.ts +135 -0
- package/src/gates/__tests__/command.test.ts +8 -15
- package/src/gates/__tests__/contract.test.ts +5 -5
- package/src/gates/__tests__/gate-interface.test.ts +0 -17
- package/src/gates/__tests__/performance.test.ts +0 -13
- package/src/gates/__tests__/review.test.ts +0 -1
- package/src/gates/__tests__/runner.test.ts +1 -1
- package/src/gates/__tests__/security-default-scan.test.ts +97 -0
- package/src/gates/__tests__/security.test.ts +0 -13
- package/src/gates/checker-gate.ts +3 -2
- package/src/gates/command.ts +51 -74
- package/src/gates/contract.ts +0 -5
- package/src/gates/definitions.ts +6 -5
- package/src/gates/index.ts +0 -5
- package/src/gates/performance.ts +1 -6
- package/src/gates/runner.ts +1 -1
- package/src/gates/security.ts +9 -11
- package/src/gates/types.ts +20 -23
- package/src/hooks/CONTEXT.md +10 -9
- package/src/hooks/__tests__/bootstrap.test.ts +29 -6
- package/src/hooks/__tests__/pipeline.test.ts +28 -17
- package/src/hooks/__tests__/registry.test.ts +51 -3
- package/src/hooks/bootstrap.ts +35 -15
- package/src/hooks/config.ts +6 -2
- package/src/hooks/index.ts +10 -1
- package/src/hooks/pipeline.ts +4 -6
- package/src/hooks/registry.ts +31 -12
- package/src/hooks/types.ts +24 -7
- package/src/index.ts +1 -3
- package/src/knowledge/CONTEXT.md +14 -7
- package/src/knowledge/__tests__/audit-labels.test.ts +8 -5
- package/src/knowledge/__tests__/audit-scoring.test.ts +230 -0
- package/src/knowledge/__tests__/audit-write-count.test.ts +131 -0
- package/src/knowledge/__tests__/audit.test.ts +291 -208
- package/src/knowledge/__tests__/doctor.test.ts +3 -2
- package/src/knowledge/__tests__/ingest.test.ts +3 -2
- package/src/knowledge/__tests__/lifecycle.test.ts +57 -2
- package/src/knowledge/__tests__/migration.test.ts +35 -6
- package/src/knowledge/__tests__/query.test.ts +3 -2
- package/src/knowledge/__tests__/reference-tracker.test.ts +23 -2
- package/src/knowledge/__tests__/store.test.ts +149 -4
- package/src/knowledge/__tests__/tree-walker.test.ts +132 -0
- package/src/knowledge/audit-scoring.ts +589 -0
- package/src/knowledge/audit.ts +55 -599
- package/src/knowledge/import.ts +2 -0
- package/src/knowledge/index-generator.ts +4 -6
- package/src/knowledge/index.ts +27 -2
- package/src/knowledge/ingest.ts +1 -1
- package/src/knowledge/lifecycle.ts +5 -2
- package/src/knowledge/migration.ts +8 -2
- package/src/knowledge/query.ts +8 -1
- package/src/knowledge/reference-tracker.ts +5 -7
- package/src/knowledge/store.ts +75 -16
- package/src/knowledge/tree-walker.ts +29 -0
- package/src/knowledge/types.ts +19 -0
- package/src/monitoring/CONTEXT.md +5 -2
- package/src/monitoring/__tests__/context-tracker.test.ts +16 -8
- package/src/monitoring/__tests__/trace-file-anchoring.test.ts +80 -0
- package/src/monitoring/traces.ts +19 -5
- package/src/release/CONTEXT.md +1 -1
- package/src/release/__tests__/integrity.test.ts +21 -12
- package/src/test-setup/__tests__/jsonl-fake-fs.test.ts +98 -0
- package/src/test-setup/jsonl-fake-fs.ts +59 -0
- package/src/tools/index.ts +5 -1
- package/src/types/checkpoint.ts +6 -0
- package/src/types/passes-gate.ts +0 -17
- package/src/types/project-config.ts +21 -0
- package/src/types/trace.ts +14 -4
- package/src/utils/__tests__/file-walk.test.ts +3 -2
- package/src/utils/__tests__/jsonl-bounded-read.test.ts +106 -0
- package/src/utils/__tests__/jsonl-skip-disposition.test.ts +10 -6
- package/src/utils/__tests__/jsonl.test.ts +61 -14
- package/src/utils/__tests__/numeric-flag.test.ts +80 -0
- package/src/utils/__tests__/package-version.test.ts +2 -2
- package/src/utils/exec.ts +4 -64
- package/src/utils/jsonl.ts +159 -20
- package/src/utils/numeric-flag.ts +64 -0
- package/dist/failure/types.d.ts +0 -9
- package/dist/failure/types.d.ts.map +0 -1
- package/dist/failure/types.js +0 -25
- package/dist/failure/types.js.map +0 -1
- package/dist/gates/effective-gates.d.ts +0 -30
- package/dist/gates/effective-gates.d.ts.map +0 -1
- package/dist/gates/effective-gates.js +0 -81
- package/dist/gates/effective-gates.js.map +0 -1
- package/src/failure/types.ts +0 -9
- package/src/gates/__tests__/effective-gates.test.ts +0 -77
- package/src/gates/effective-gates.ts +0 -99
|
@@ -12,6 +12,7 @@ exports.formatEvidence = formatEvidence;
|
|
|
12
12
|
exports.normalizeCheckOutcome = normalizeCheckOutcome;
|
|
13
13
|
exports.contextFlag = contextFlag;
|
|
14
14
|
exports.contextEvidenceFlag = contextEvidenceFlag;
|
|
15
|
+
const run_env_1 = require("../run-env");
|
|
15
16
|
/**
|
|
16
17
|
* 构造 CheckEnv:生产侧唯一构造点
|
|
17
18
|
*
|
|
@@ -19,21 +20,24 @@ exports.contextEvidenceFlag = contextEvidenceFlag;
|
|
|
19
20
|
* - 'none' = 显式不接证据:证据函数返回空;evidence flag 未接线的
|
|
20
21
|
* checker 按契约返回 'skip'(见 contextEvidenceFlag),直接读空
|
|
21
22
|
* 证据的 checker 在自然输入下判定
|
|
23
|
+
* - runEnv = 本 run 的运行级观察面(ADR-0023):传入即与 context-builder 及
|
|
24
|
+
* 其余 checker 共用同一份上行数据读取;不传则自造一枚,只服务本次调用
|
|
22
25
|
*
|
|
23
26
|
* studio 侧若需 git 证据(#129),传真实 providers 即可。
|
|
24
27
|
*/
|
|
25
|
-
function buildCheckEnv(context, evidence) {
|
|
28
|
+
function buildCheckEnv(context, evidence, runEnv) {
|
|
26
29
|
const projectPath = context.projectPath || process.cwd();
|
|
30
|
+
const run = runEnv ?? (0, run_env_1.createRunEnv)(projectPath);
|
|
27
31
|
if (evidence === 'none') {
|
|
28
32
|
return {
|
|
33
|
+
...run,
|
|
29
34
|
context,
|
|
30
|
-
projectPath,
|
|
31
35
|
stagedDiff: async () => '',
|
|
32
36
|
stagedDiffNames: async () => '',
|
|
33
37
|
srcScan: () => [],
|
|
34
38
|
};
|
|
35
39
|
}
|
|
36
|
-
return {
|
|
40
|
+
return { ...run, context, ...evidence };
|
|
37
41
|
}
|
|
38
42
|
/** 证据条数上限:trace 是 JSONL,缺口上百项时不能整仓落盘 */
|
|
39
43
|
exports.MAX_EVIDENCE_ITEMS = 10;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/constraints/checkers/types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/constraints/checkers/types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAoDH,sCAiBC;AA6CD,wCAIC;AAOD,sDAQC;AAeD,kCAKC;AASD,kDAYC;AA3KD,wCAAuD;AAqCvD;;;;;;;;;;;GAWG;AACH,SAAgB,aAAa,CAC3B,OAA0B,EAC1B,QAAoC,EACpC,MAAe;IAEf,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzD,MAAM,GAAG,GAAG,MAAM,IAAI,IAAA,sBAAY,EAAC,WAAW,CAAC,CAAC;IAChD,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,OAAO;YACL,GAAG,GAAG;YACN,OAAO;YACP,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE;YAC1B,eAAe,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE;YAC/B,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE;SAClB,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAC;AAC1C,CAAC;AAmCD,wCAAwC;AAC3B,QAAA,kBAAkB,GAAG,EAAE,CAAC;AAErC;;;;;;GAMG;AACH,SAAgB,cAAc,CAAC,OAAe,EAAE,KAAe;IAC7D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,0BAAkB,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9F,CAAC;AAED;;;;GAIG;AACH,SAAgB,qBAAqB,CAAC,OAAqB;IACzD,IAAI,OAAO,KAAK,MAAM;QAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAChF,IAAI,OAAO,OAAO,KAAK,SAAS;QAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC9F,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,IAAI;QACvB,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;KACjC,CAAC;AACJ,CAAC;AAYD;;GAEG;AACH,SAAgB,WAAW,CACzB,EAAU,EACV,SAAkD;IAElD,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;AAC3D,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,mBAAmB,CACjC,EAAU,EACV,IAAyD;IAEzD,OAAO;QACL,EAAE;QACF,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;YAChB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAChC,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,MAAM,CAAC;YACvC,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -8,7 +8,13 @@
|
|
|
8
8
|
* 架构评审 #87:本模块只做装配不做取证——git 证据一律经 git-evidence
|
|
9
9
|
* adapter 取(缺省真 git adapter,调用方可注入与 checker 层同源的那一份),
|
|
10
10
|
* 因此此处不再有 child_process / raw execSync。
|
|
11
|
+
*
|
|
12
|
+
* ADR-0023:同理,trace 记录与源码根探测改经运行级观察面 `RunEnv` 取——
|
|
13
|
+
* 此前本模块的两个证据探测各自整读一次 traces.log、detectTrigger 与 checker 层
|
|
14
|
+
* 各探一次源码根,同一次运行内重复读同一批文件。缺省自造一份 env,调用方(CLI check)
|
|
15
|
+
* 注入即全 run 共用。
|
|
11
16
|
*/
|
|
17
|
+
import { type RunEnv } from './run-env';
|
|
12
18
|
import type { ConstraintContext, ConstraintTrigger } from '../../types/constraint';
|
|
13
19
|
import { type GitEvidence } from './git-evidence';
|
|
14
20
|
/**
|
|
@@ -30,22 +36,14 @@ export declare function detectTrigger(changedFiles: string[], options: {
|
|
|
30
36
|
trigger?: ConstraintTrigger;
|
|
31
37
|
projectPath?: string;
|
|
32
38
|
evidence?: GitEvidence;
|
|
39
|
+
/** 运行级观察面(ADR-0023):注入即与其余消费方共用同一份源根探测 */
|
|
40
|
+
runEnv?: RunEnv;
|
|
33
41
|
}): ConstraintTrigger | ConstraintTrigger[];
|
|
34
|
-
/**
|
|
35
|
-
* 检测是否有失败的测试记录
|
|
36
|
-
* 扫描 trace 文件(DEFAULT_TRACE_FILE)中最近的记录
|
|
37
|
-
*/
|
|
38
|
-
export declare function detectFailingTest(projectPath: string): Promise<boolean>;
|
|
39
42
|
/**
|
|
40
43
|
* 检测是否有根因分析文档
|
|
41
44
|
* 检查 ROOT_CAUSE.md、.harness/diagnoses/、或 git commit 消息
|
|
42
45
|
*/
|
|
43
46
|
export declare function detectRootCauseInvestigation(projectPath: string): boolean;
|
|
44
|
-
/**
|
|
45
|
-
* 检测是否有验证证据
|
|
46
|
-
* 检查 trace 文件(DEFAULT_TRACE_FILE)中最近的成功验证记录
|
|
47
|
-
*/
|
|
48
|
-
export declare function detectVerificationEvidence(projectPath: string): Promise<boolean>;
|
|
49
47
|
/**
|
|
50
48
|
* 检测是否有需求来源
|
|
51
49
|
* 检查 CLAUDE.md、README.md、specs/、docs/specs/ 等
|
|
@@ -61,11 +59,14 @@ export declare function detectReuseCheck(projectPath: string): boolean;
|
|
|
61
59
|
*
|
|
62
60
|
* options.evidence(#87):git 证据适配器。调用方(CLI check)注入同一实例给
|
|
63
61
|
* checkConstraints,即可让 context-builder 与 checker 层共用同一证据来源。
|
|
62
|
+
* options.runEnv(ADR-0023):运行级观察面。注入即本函数内的源根探测与两处 trace
|
|
63
|
+
* 证据探测与其余消费方共用同一份读取,缺省自造一份(只服务本次调用)。
|
|
64
64
|
*/
|
|
65
65
|
export declare function buildConstraintContext(options: {
|
|
66
66
|
projectPath?: string;
|
|
67
67
|
staged: boolean;
|
|
68
68
|
trigger?: ConstraintTrigger;
|
|
69
69
|
evidence?: GitEvidence;
|
|
70
|
+
runEnv?: RunEnv;
|
|
70
71
|
}): Promise<ConstraintContext>;
|
|
71
72
|
//# sourceMappingURL=context-builder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-builder.d.ts","sourceRoot":"","sources":["../../../src/core/constraints/context-builder.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"context-builder.d.ts","sourceRoot":"","sources":["../../../src/core/constraints/context-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,EAAmC,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACnF,OAAO,EAAqC,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAErF;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGtF;AASD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,YAAY,EAAE,MAAM,EAAE,EACtB,OAAO,EAAE;IACP,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACA,iBAAiB,GAAG,iBAAiB,EAAE,CA8BzC;AAgBD;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAgBzE;AAmBD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAqB9D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAY7D;AAED;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAyB7B"}
|
|
@@ -9,6 +9,11 @@
|
|
|
9
9
|
* 架构评审 #87:本模块只做装配不做取证——git 证据一律经 git-evidence
|
|
10
10
|
* adapter 取(缺省真 git adapter,调用方可注入与 checker 层同源的那一份),
|
|
11
11
|
* 因此此处不再有 child_process / raw execSync。
|
|
12
|
+
*
|
|
13
|
+
* ADR-0023:同理,trace 记录与源码根探测改经运行级观察面 `RunEnv` 取——
|
|
14
|
+
* 此前本模块的两个证据探测各自整读一次 traces.log、detectTrigger 与 checker 层
|
|
15
|
+
* 各探一次源码根,同一次运行内重复读同一批文件。缺省自造一份 env,调用方(CLI check)
|
|
16
|
+
* 注入即全 run 共用。
|
|
12
17
|
*/
|
|
13
18
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
19
|
if (k2 === undefined) k2 = k;
|
|
@@ -46,17 +51,13 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
46
51
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
52
|
exports.isNewDirectory = isNewDirectory;
|
|
48
53
|
exports.detectTrigger = detectTrigger;
|
|
49
|
-
exports.detectFailingTest = detectFailingTest;
|
|
50
54
|
exports.detectRootCauseInvestigation = detectRootCauseInvestigation;
|
|
51
|
-
exports.detectVerificationEvidence = detectVerificationEvidence;
|
|
52
55
|
exports.detectRequirement = detectRequirement;
|
|
53
56
|
exports.detectReuseCheck = detectReuseCheck;
|
|
54
57
|
exports.buildConstraintContext = buildConstraintContext;
|
|
55
58
|
const fs = __importStar(require("fs"));
|
|
56
59
|
const path = __importStar(require("path"));
|
|
57
|
-
const
|
|
58
|
-
const jsonl_1 = require("../../utils/jsonl");
|
|
59
|
-
const trace_1 = require("../../types/trace");
|
|
60
|
+
const run_env_1 = require("./run-env");
|
|
60
61
|
const git_evidence_1 = require("./git-evidence");
|
|
61
62
|
/**
|
|
62
63
|
* 检查文件所在目录是否在 git HEAD 中不存在(即新目录)
|
|
@@ -91,7 +92,7 @@ function detectTrigger(changedFiles, options) {
|
|
|
91
92
|
// pre-commit 场景下变更含代码文件 → 附加 code_implementation 推断
|
|
92
93
|
const hasCodeChange = changedFiles.some(f => CODE_FILE_REGEX.test(f));
|
|
93
94
|
const projectPath = options.projectPath || process.cwd();
|
|
94
|
-
const sourceRoots = (0,
|
|
95
|
+
const sourceRoots = (options.runEnv ?? (0, run_env_1.createRunEnv)(projectPath)).sourceRoots();
|
|
95
96
|
const hasModuleChange = changedFiles.some(f => sourceRoots.some(root => f.startsWith(root + '/') || f.startsWith(root + '\\')) && !f.includes('__tests__'));
|
|
96
97
|
// 工单 18 的批量语义保留在 adapter 层:一次 ls-tree,且仅在有模块变更时才取证
|
|
97
98
|
const headDirs = hasModuleChange
|
|
@@ -111,17 +112,14 @@ function detectTrigger(changedFiles, options) {
|
|
|
111
112
|
return hasCodeChange ? [primary, 'code_implementation'] : primary;
|
|
112
113
|
}
|
|
113
114
|
/**
|
|
114
|
-
*
|
|
115
|
-
* 扫描 trace 文件(DEFAULT_TRACE_FILE)中最近的记录
|
|
115
|
+
* 检测是否有失败的测试记录(取运行级观察面的最近 20 条)
|
|
116
116
|
*/
|
|
117
|
-
async function detectFailingTest(
|
|
117
|
+
async function detectFailingTest(env) {
|
|
118
118
|
try {
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
const { records } = (0, jsonl_1.readJsonl)(traceFile, 'skip', { tail: 20 });
|
|
124
|
-
return records.some(trace => trace.result === 'fail');
|
|
119
|
+
// 坏行策略与计数去向见 run-env 的读点(ADR-0023 合并两处独立 tail 读为一份窗口)
|
|
120
|
+
return env
|
|
121
|
+
.traceTail(run_env_1.TRACE_TAIL_WINDOW)
|
|
122
|
+
.records.some(trace => trace.result === 'fail');
|
|
125
123
|
}
|
|
126
124
|
catch {
|
|
127
125
|
return false;
|
|
@@ -149,19 +147,17 @@ function detectRootCauseInvestigation(projectPath) {
|
|
|
149
147
|
}
|
|
150
148
|
return false;
|
|
151
149
|
}
|
|
150
|
+
/** 验证证据的尾部窗口(工单 23 原口径:只看最近 10 条) */
|
|
151
|
+
const VERIFICATION_EVIDENCE_TAIL = 10;
|
|
152
152
|
/**
|
|
153
|
-
*
|
|
154
|
-
* 检查 trace 文件(DEFAULT_TRACE_FILE)中最近的成功验证记录
|
|
153
|
+
* 检测是否有验证证据(取运行级观察面的最近 10 条)
|
|
155
154
|
*/
|
|
156
|
-
async function detectVerificationEvidence(
|
|
155
|
+
async function detectVerificationEvidence(env) {
|
|
157
156
|
try {
|
|
158
|
-
const traceFile = path.join(projectPath, trace_1.DEFAULT_TRACE_FILE);
|
|
159
|
-
// 坏行策略:skip(原逐行 catch→false 语义不变);只 parse 最近 10 行
|
|
160
157
|
// tail 在 parse 之前截断 → 坏行会占用尾部槽位(#82 裁决范围外的既有口径,本票不改)
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
return records.some(trace => trace.result === 'pass');
|
|
158
|
+
return env
|
|
159
|
+
.traceTail(VERIFICATION_EVIDENCE_TAIL)
|
|
160
|
+
.records.some(trace => trace.result === 'pass');
|
|
165
161
|
}
|
|
166
162
|
catch {
|
|
167
163
|
return false;
|
|
@@ -216,12 +212,20 @@ function detectReuseCheck(projectPath) {
|
|
|
216
212
|
*
|
|
217
213
|
* options.evidence(#87):git 证据适配器。调用方(CLI check)注入同一实例给
|
|
218
214
|
* checkConstraints,即可让 context-builder 与 checker 层共用同一证据来源。
|
|
215
|
+
* options.runEnv(ADR-0023):运行级观察面。注入即本函数内的源根探测与两处 trace
|
|
216
|
+
* 证据探测与其余消费方共用同一份读取,缺省自造一份(只服务本次调用)。
|
|
219
217
|
*/
|
|
220
218
|
async function buildConstraintContext(options) {
|
|
221
219
|
const projectPath = options.projectPath || process.cwd();
|
|
220
|
+
const runEnv = options.runEnv ?? (0, run_env_1.createRunEnv)(projectPath);
|
|
222
221
|
const evidence = options.evidence ?? (0, git_evidence_1.createGitEvidence)(projectPath);
|
|
223
222
|
const changedFiles = (0, git_evidence_1.splitFileNames)(evidence.changedFileNames(options.staged));
|
|
224
|
-
const inferred = detectTrigger(changedFiles, {
|
|
223
|
+
const inferred = detectTrigger(changedFiles, {
|
|
224
|
+
trigger: options.trigger,
|
|
225
|
+
projectPath,
|
|
226
|
+
evidence,
|
|
227
|
+
runEnv,
|
|
228
|
+
});
|
|
225
229
|
const triggers = Array.isArray(inferred) ? inferred : [inferred];
|
|
226
230
|
return {
|
|
227
231
|
operation: triggers[0],
|
|
@@ -229,9 +233,9 @@ async function buildConstraintContext(options) {
|
|
|
229
233
|
projectPath,
|
|
230
234
|
changedFiles,
|
|
231
235
|
hasTest: changedFiles.some(f => f.includes('.test.') || f.includes('.spec.')),
|
|
232
|
-
hasFailingTest: await detectFailingTest(
|
|
236
|
+
hasFailingTest: await detectFailingTest(runEnv),
|
|
233
237
|
hasRootCauseInvestigation: detectRootCauseInvestigation(projectPath),
|
|
234
|
-
hasVerificationEvidence: await detectVerificationEvidence(
|
|
238
|
+
hasVerificationEvidence: await detectVerificationEvidence(runEnv),
|
|
235
239
|
hasReuseCheck: detectReuseCheck(projectPath),
|
|
236
240
|
hasRequirement: detectRequirement(projectPath),
|
|
237
241
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-builder.js","sourceRoot":"","sources":["../../../src/core/constraints/context-builder.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"context-builder.js","sourceRoot":"","sources":["../../../src/core/constraints/context-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CONTEXT.md「核心导出」节与目录导出面的对照判定(harness#142 / ADR-0025)
|
|
3
|
+
*
|
|
4
|
+
* 纯判定 module:吃「CONTEXT.md 正文 + 目录导出面清单(+ barrel 值符号清单)」,
|
|
5
|
+
* 一次产出双向判定;不做任何 fs IO——文件遍历、正文读取、`export *` 目标解析
|
|
6
|
+
* 全在调用方(cli 侧),与 ADR-0009 的 capabilities-reconcile 同一套组装形状。
|
|
7
|
+
*
|
|
8
|
+
* 方向(语义与 capabilities-reconcile 对齐:幽灵 = 文档说谎,未登记 = 代码有而文档漏):
|
|
9
|
+
* 文档→代码 ghosts(「核心导出」节声明的符号在目录导出面里不存在)
|
|
10
|
+
* 代码→文档 unlistedBarrelExports(index.ts 再导出的值符号未出现在该节)
|
|
11
|
+
*
|
|
12
|
+
* 口径(ADR-0025,两条都是「可操作」而非「越严越好」的取舍):
|
|
13
|
+
* - 声明只取 bullet **行首**的反引号标识符(`/` 连接的多符号逐个取,形参列表与
|
|
14
|
+
* `(type)`注解剥掉)。行首不是标识符的 bullet 是模块/目录条目
|
|
15
|
+
* (`types.ts`、`audit-scoring`、`constraints/`),不属符号声明面,整条跳过。
|
|
16
|
+
* - 覆盖方向只管 barrel 的**值**符号:类型面(interface/type)不要求逐个登记
|
|
17
|
+
* ——否则每次加一个公开类型都要回灌文档,正是本闸要避免的「连注释都要改」。
|
|
18
|
+
* 类型-only 的剔除在采集侧(读得懂 `export type { }` 与声明关键字的那一层)。
|
|
19
|
+
* - 「出现在该节」按标识符边界匹配(inline 提及即算登记),bullet 行首之外的正文同样参与,
|
|
20
|
+
* 但**其它 `## ` 节**的正文不参与——绕过闸需要把符号塞进「核心导出」节,而不是塞满全文件。
|
|
21
|
+
*/
|
|
22
|
+
export interface ExportedSymbol {
|
|
23
|
+
/** 导出名(`a as b` 取 b) */
|
|
24
|
+
name: string;
|
|
25
|
+
/** 来源侧的本名(`a as b` 取 a;自身声明与无别名再导出时等于 name)——调用方按它核对正本是否真有此物 */
|
|
26
|
+
localName: string;
|
|
27
|
+
/** 类型-only(interface/type 声明、`export type { }` 块、逐项 `type` 标记) */
|
|
28
|
+
typeOnly: boolean;
|
|
29
|
+
/** 再导出的来源 spec(`from './x'`),模块自身声明为 undefined */
|
|
30
|
+
from?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface ExportStatementParse {
|
|
33
|
+
symbols: ExportedSymbol[];
|
|
34
|
+
/** 待调用方解析的 `export *` 目标 spec(fs 侧才知道文件在不在) */
|
|
35
|
+
starFrom: string[];
|
|
36
|
+
}
|
|
37
|
+
export interface ContextReconcileInput {
|
|
38
|
+
/** CONTEXT.md 全文 */
|
|
39
|
+
contextMdContent: string;
|
|
40
|
+
/** 目录导出面全集:目录内所有 .ts 导出的符号名(值 + 类型,含 barrel 与内部 seam) */
|
|
41
|
+
exportSurface: string[];
|
|
42
|
+
/** index.ts barrel 再导出的**值**符号清单;无 index.ts 的目录不传(跳过覆盖方向) */
|
|
43
|
+
barrelExports?: string[];
|
|
44
|
+
}
|
|
45
|
+
export interface ContextVerdict {
|
|
46
|
+
/** 文档是否含「## 核心导出」节;无节 = 两方向都不参与判定 */
|
|
47
|
+
hasCoreExportsSection: boolean;
|
|
48
|
+
/** 该节解析出的符号声明(去重、按出现序) */
|
|
49
|
+
declaredSymbols: string[];
|
|
50
|
+
/** 幽灵:声明了但目录导出面没有 */
|
|
51
|
+
ghosts: string[];
|
|
52
|
+
/** 未登记:barrel 值符号未出现在该节 */
|
|
53
|
+
unlistedBarrelExports: string[];
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 取「## 核心导出」节正文(不含标题行),到下一个二级标题为止。
|
|
57
|
+
* 无该节 → null。
|
|
58
|
+
*/
|
|
59
|
+
export declare function parseCoreExportsSection(content: string): string | null;
|
|
60
|
+
/**
|
|
61
|
+
* 解析「## 核心导出」节的符号声明:只认 bullet 行首的反引号标识符
|
|
62
|
+
* (`/` 连接视为多个声明,其后的散文与 inline 提及不参与幽灵判定)。
|
|
63
|
+
*/
|
|
64
|
+
export declare function parseDeclaredExportSymbols(content: string): string[];
|
|
65
|
+
/**
|
|
66
|
+
* 解析单个源文件的导出面(口径正本,采集侧与测试共用):
|
|
67
|
+
* 声明形、`export { }` 列表形(含别名与逐项 `type`)、`export default`、`export *`。
|
|
68
|
+
* 只做正则解析,不解析 spec 指向谁——那是调用方的 fs 活。
|
|
69
|
+
*/
|
|
70
|
+
export declare function parseExportStatements(source: string): ExportStatementParse;
|
|
71
|
+
/**
|
|
72
|
+
* CONTEXT.md 与目录导出面的双向判定(唯一真相源,sync-docs 与任何后续消费方共用)。
|
|
73
|
+
*/
|
|
74
|
+
export declare function reconcileContext(input: ContextReconcileInput): ContextVerdict;
|
|
75
|
+
//# sourceMappingURL=context-reconcile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-reconcile.d.ts","sourceRoot":"","sources":["../../../src/core/constraints/context-reconcile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAuBH,MAAM,WAAW,cAAc;IAC7B,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,QAAQ,EAAE,OAAO,CAAC;IAClB,kDAAkD;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,oBAAoB;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,6DAA6D;IAC7D,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,qBAAqB,EAAE,OAAO,CAAC;IAC/B,0BAA0B;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,qBAAqB;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,2BAA2B;IAC3B,qBAAqB,EAAE,MAAM,EAAE,CAAC;CACjC;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWtE;AASD;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CA0BpE;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,CAkC1E;AAQD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,cAAc,CAa7E"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CONTEXT.md「核心导出」节与目录导出面的对照判定(harness#142 / ADR-0025)
|
|
4
|
+
*
|
|
5
|
+
* 纯判定 module:吃「CONTEXT.md 正文 + 目录导出面清单(+ barrel 值符号清单)」,
|
|
6
|
+
* 一次产出双向判定;不做任何 fs IO——文件遍历、正文读取、`export *` 目标解析
|
|
7
|
+
* 全在调用方(cli 侧),与 ADR-0009 的 capabilities-reconcile 同一套组装形状。
|
|
8
|
+
*
|
|
9
|
+
* 方向(语义与 capabilities-reconcile 对齐:幽灵 = 文档说谎,未登记 = 代码有而文档漏):
|
|
10
|
+
* 文档→代码 ghosts(「核心导出」节声明的符号在目录导出面里不存在)
|
|
11
|
+
* 代码→文档 unlistedBarrelExports(index.ts 再导出的值符号未出现在该节)
|
|
12
|
+
*
|
|
13
|
+
* 口径(ADR-0025,两条都是「可操作」而非「越严越好」的取舍):
|
|
14
|
+
* - 声明只取 bullet **行首**的反引号标识符(`/` 连接的多符号逐个取,形参列表与
|
|
15
|
+
* `(type)`注解剥掉)。行首不是标识符的 bullet 是模块/目录条目
|
|
16
|
+
* (`types.ts`、`audit-scoring`、`constraints/`),不属符号声明面,整条跳过。
|
|
17
|
+
* - 覆盖方向只管 barrel 的**值**符号:类型面(interface/type)不要求逐个登记
|
|
18
|
+
* ——否则每次加一个公开类型都要回灌文档,正是本闸要避免的「连注释都要改」。
|
|
19
|
+
* 类型-only 的剔除在采集侧(读得懂 `export type { }` 与声明关键字的那一层)。
|
|
20
|
+
* - 「出现在该节」按标识符边界匹配(inline 提及即算登记),bullet 行首之外的正文同样参与,
|
|
21
|
+
* 但**其它 `## ` 节**的正文不参与——绕过闸需要把符号塞进「核心导出」节,而不是塞满全文件。
|
|
22
|
+
*/
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.parseCoreExportsSection = parseCoreExportsSection;
|
|
25
|
+
exports.parseDeclaredExportSymbols = parseDeclaredExportSymbols;
|
|
26
|
+
exports.parseExportStatements = parseExportStatements;
|
|
27
|
+
exports.reconcileContext = reconcileContext;
|
|
28
|
+
/** markdown「## 核心导出」节标题(其后括注允许,如 `## 核心导出 (dist/)`) */
|
|
29
|
+
const SECTION_HEADING_REGEX = /^##\s*核心导出/;
|
|
30
|
+
/** 任意二级标题:节的终点(三级标题属节内子结构,不终止) */
|
|
31
|
+
const H2_HEADING_REGEX = /^##\s/;
|
|
32
|
+
/** bullet 行 */
|
|
33
|
+
const BULLET_REGEX = /^\s*[-*]\s*(.*)$/;
|
|
34
|
+
/** bullet 行首(及 `/` 连接的后续)反引号片段 */
|
|
35
|
+
const LEADING_BACKTICK_REGEX = /^`([^`]+)`/;
|
|
36
|
+
/** token 间的 `/` 分隔(可含空白)+ 下一个反引号起点 */
|
|
37
|
+
const NEXT_TOKEN_REGEX = /^(?:\s*\/\s*)?\s*`/;
|
|
38
|
+
/** 合法导出标识符 */
|
|
39
|
+
const IDENTIFIER_REGEX = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
|
|
40
|
+
/** 源码导出声明:`export [默认] [形式] 名字` 与 `export { … } [from '…']` */
|
|
41
|
+
const DECLARATION_REGEX = /^export\s+(?:declare\s+)?(?:abstract\s+)?(?:async\s+)?(function|const|let|var|class|interface|type|enum)\s+([A-Za-z_$][\w$]*)/gm;
|
|
42
|
+
/** `export { … }` / `export type { … }`(可带 from) */
|
|
43
|
+
const EXPORT_LIST_REGEX = /^export\s+(type\s+)?\{([^}]*)\}(?:\s*from\s*['"]([^'"]+)['"])?/gm;
|
|
44
|
+
/** `export * from '…'` / `export * as ns from '…'` */
|
|
45
|
+
const STAR_EXPORT_REGEX = /^export\s+\*\s*(?:as\s+[A-Za-z_$][\w$]*\s*)?from\s*['"]([^'"]+)['"]/gm;
|
|
46
|
+
/**
|
|
47
|
+
* 取「## 核心导出」节正文(不含标题行),到下一个二级标题为止。
|
|
48
|
+
* 无该节 → null。
|
|
49
|
+
*/
|
|
50
|
+
function parseCoreExportsSection(content) {
|
|
51
|
+
const lines = content.split(/\r?\n/);
|
|
52
|
+
const start = lines.findIndex((line) => SECTION_HEADING_REGEX.test(line));
|
|
53
|
+
if (start === -1)
|
|
54
|
+
return null;
|
|
55
|
+
const body = [];
|
|
56
|
+
for (let i = start + 1; i < lines.length; i++) {
|
|
57
|
+
if (H2_HEADING_REGEX.test(lines[i]))
|
|
58
|
+
break;
|
|
59
|
+
body.push(lines[i]);
|
|
60
|
+
}
|
|
61
|
+
return body.join('\n');
|
|
62
|
+
}
|
|
63
|
+
/** 反引号片段 → 导出符号名;剥形参列表与 `type` 关键字前缀,非标识符返回 null */
|
|
64
|
+
function toSymbolName(token) {
|
|
65
|
+
const bare = token.replace(/[((].*$/, '').trim();
|
|
66
|
+
const withoutKeyword = /^type\s+/.test(bare) ? bare.replace(/^type\s+/, '').trim() : bare;
|
|
67
|
+
return IDENTIFIER_REGEX.test(withoutKeyword) ? withoutKeyword : null;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 解析「## 核心导出」节的符号声明:只认 bullet 行首的反引号标识符
|
|
71
|
+
* (`/` 连接视为多个声明,其后的散文与 inline 提及不参与幽灵判定)。
|
|
72
|
+
*/
|
|
73
|
+
function parseDeclaredExportSymbols(content) {
|
|
74
|
+
const section = parseCoreExportsSection(content);
|
|
75
|
+
if (section === null)
|
|
76
|
+
return [];
|
|
77
|
+
const out = [];
|
|
78
|
+
const seen = new Set();
|
|
79
|
+
for (const line of section.split(/\r?\n/)) {
|
|
80
|
+
const bullet = BULLET_REGEX.exec(line);
|
|
81
|
+
if (!bullet)
|
|
82
|
+
continue;
|
|
83
|
+
let rest = bullet[1];
|
|
84
|
+
for (;;) {
|
|
85
|
+
const token = LEADING_BACKTICK_REGEX.exec(rest);
|
|
86
|
+
if (!token)
|
|
87
|
+
break;
|
|
88
|
+
const name = toSymbolName(token[1]);
|
|
89
|
+
if (name && !seen.has(name)) {
|
|
90
|
+
seen.add(name);
|
|
91
|
+
out.push(name);
|
|
92
|
+
}
|
|
93
|
+
rest = rest.slice(token[0].length);
|
|
94
|
+
const separator = NEXT_TOKEN_REGEX.exec(rest);
|
|
95
|
+
if (!separator)
|
|
96
|
+
break;
|
|
97
|
+
rest = rest.slice(separator[0].length - 1);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return out;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* 解析单个源文件的导出面(口径正本,采集侧与测试共用):
|
|
104
|
+
* 声明形、`export { }` 列表形(含别名与逐项 `type`)、`export default`、`export *`。
|
|
105
|
+
* 只做正则解析,不解析 spec 指向谁——那是调用方的 fs 活。
|
|
106
|
+
*/
|
|
107
|
+
function parseExportStatements(source) {
|
|
108
|
+
const symbols = [];
|
|
109
|
+
for (const match of source.matchAll(DECLARATION_REGEX)) {
|
|
110
|
+
symbols.push({
|
|
111
|
+
name: match[2],
|
|
112
|
+
localName: match[2],
|
|
113
|
+
typeOnly: match[1] === 'interface' || match[1] === 'type',
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
for (const match of source.matchAll(EXPORT_LIST_REGEX)) {
|
|
117
|
+
const blockIsType = Boolean(match[1]);
|
|
118
|
+
const from = match[3];
|
|
119
|
+
for (const part of match[2].split(',')) {
|
|
120
|
+
const specifier = part.trim();
|
|
121
|
+
if (!specifier || specifier === 'default')
|
|
122
|
+
continue;
|
|
123
|
+
const typeOnly = blockIsType || /^type\s+/.test(specifier);
|
|
124
|
+
const cleaned = specifier.replace(/^type\s+/, '').trim();
|
|
125
|
+
const aliased = /^([A-Za-z_$][\w$]*)\s+as\s+([A-Za-z_$][\w$]*)$/.exec(cleaned);
|
|
126
|
+
const single = /^([A-Za-z_$][\w$]*)$/.exec(cleaned);
|
|
127
|
+
if (aliased)
|
|
128
|
+
symbols.push({ name: aliased[2], localName: aliased[1], typeOnly, ...(from ? { from } : {}) });
|
|
129
|
+
else if (single)
|
|
130
|
+
symbols.push({ name: single[1], localName: single[1], typeOnly, ...(from ? { from } : {}) });
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (/^export\s+default\b/m.test(source)) {
|
|
134
|
+
symbols.push({ name: 'default', localName: 'default', typeOnly: false });
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
symbols,
|
|
138
|
+
starFrom: [...source.matchAll(STAR_EXPORT_REGEX)].map((m) => m[1]),
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
/** 符号是否在该节正文中出现(标识符边界匹配) */
|
|
142
|
+
function mentionedInSection(section, symbol) {
|
|
143
|
+
const escaped = symbol.replace(/[$]/g, '\\$');
|
|
144
|
+
return new RegExp(`(?<![\\w$])${escaped}(?![\\w$])`).test(section);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* CONTEXT.md 与目录导出面的双向判定(唯一真相源,sync-docs 与任何后续消费方共用)。
|
|
148
|
+
*/
|
|
149
|
+
function reconcileContext(input) {
|
|
150
|
+
const section = parseCoreExportsSection(input.contextMdContent);
|
|
151
|
+
const hasCoreExportsSection = section !== null && section.trim() !== '';
|
|
152
|
+
const declaredSymbols = parseDeclaredExportSymbols(input.contextMdContent);
|
|
153
|
+
const surface = new Set(input.exportSurface);
|
|
154
|
+
const ghosts = declaredSymbols.filter((symbol) => !surface.has(symbol));
|
|
155
|
+
const barrelExports = [...new Set(input.barrelExports ?? [])];
|
|
156
|
+
const unlistedBarrelExports = hasCoreExportsSection
|
|
157
|
+
? barrelExports.filter((symbol) => !mentionedInSection(section, symbol))
|
|
158
|
+
: [];
|
|
159
|
+
return { hasCoreExportsSection, declaredSymbols, ghosts, unlistedBarrelExports };
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=context-reconcile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-reconcile.js","sourceRoot":"","sources":["../../../src/core/constraints/context-reconcile.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,6 +27,12 @@ interface RunContext {
|
|
|
27
27
|
projectPath: string;
|
|
28
28
|
/** 外部提供的 required_dirs(来自 governance.context_files,用于 context_docs 检查的默认 dirs) */
|
|
29
29
|
requiredDirs?: string[];
|
|
30
|
+
/**
|
|
31
|
+
* 源码根的**懒取**提供者(ADR-0023 决策 4):只在 doc_dir_check 从文档目录
|
|
32
|
+
* 推断不出根时用到。调用方传 `() => env.sourceRoots()` 即与本 run 其余消费方
|
|
33
|
+
* 共用一次探测;不传(sync-docs 等一次性调用方)则本模块自探一次。
|
|
34
|
+
*/
|
|
35
|
+
sourceRoots?: () => string[];
|
|
30
36
|
/** 外部提供的约束计数(用于内置 harner harness 的 doc_regex_count) */
|
|
31
37
|
constraintCounts?: {
|
|
32
38
|
ironLaws?: number;
|
|
@@ -42,6 +48,7 @@ export declare class FreshnessRunner {
|
|
|
42
48
|
*/
|
|
43
49
|
runAll(config: DocFreshnessConfig, projectPath: string, ctx?: {
|
|
44
50
|
requiredDirs?: string[];
|
|
51
|
+
sourceRoots?: () => string[];
|
|
45
52
|
constraintCounts?: {
|
|
46
53
|
ironLaws?: number;
|
|
47
54
|
guidelines?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../../src/core/constraints/doc-freshness/runner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAKnB,MAAM,+BAA+B,CAAC;AAEvC;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,aAAa;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,IAAI,EAAE,OAAO,CAAC;IACd,aAAa;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW;IACX,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,UAAU,UAAU;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,uDAAuD;IACvD,gBAAgB,CAAC,EAAE;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B;;OAEG;IACH,MAAM,CACJ,MAAM,EAAE,kBAAkB,EAC1B,WAAW,EAAE,MAAM,EACnB,GAAG,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../../src/core/constraints/doc-freshness/runner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAKnB,MAAM,+BAA+B,CAAC;AAEvC;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,aAAa;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,IAAI,EAAE,OAAO,CAAC;IACd,aAAa;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW;IACX,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,UAAU,UAAU;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,MAAM,EAAE,CAAC;IAC7B,uDAAuD;IACvD,gBAAgB,CAAC,EAAE;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B;;OAEG;IACH,MAAM,CACJ,MAAM,EAAE,kBAAkB,EAC1B,WAAW,EAAE,MAAM,EACnB,GAAG,CAAC,EAAE;QACJ,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QACxB,WAAW,CAAC,EAAE,MAAM,MAAM,EAAE,CAAC;QAC7B,gBAAgB,CAAC,EAAE;YAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KAC/D,GACA,oBAAoB,EAAE;IAczB;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,UAAU,GAAG,oBAAoB;IAsB9E,OAAO,CAAC,qBAAqB;IA0C7B,OAAO,CAAC,gBAAgB;IA+BxB,OAAO,CAAC,WAAW;IAiHnB;;;OAGG;IACH,OAAO,CAAC,aAAa;IAoCrB,OAAO,CAAC,kBAAkB;IA0E1B;;OAEG;IACH,YAAY,CACV,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EAAE,EACjB,WAAW,EAAE,MAAM,GAClB,MAAM;IA6BT;;OAEG;IACH,aAAa,CACX,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,MAAM;IAyCT,OAAO,CAAC,YAAY;CAGrB"}
|
|
@@ -26,6 +26,7 @@ class FreshnessRunner {
|
|
|
26
26
|
const context = {
|
|
27
27
|
projectPath,
|
|
28
28
|
requiredDirs: ctx?.requiredDirs,
|
|
29
|
+
sourceRoots: ctx?.sourceRoots,
|
|
29
30
|
constraintCounts: ctx?.constraintCounts,
|
|
30
31
|
};
|
|
31
32
|
return config.checks.map(check => this.runSingle(check, context));
|
|
@@ -163,7 +164,7 @@ class FreshnessRunner {
|
|
|
163
164
|
// 2. fs → doc: 每个实际目录必须在文档中被覆盖
|
|
164
165
|
if (!check.skip_reverse_check) {
|
|
165
166
|
// 从文档目录中推断要扫描的根目录集
|
|
166
|
-
const rootDirs = this.inferRootDirs(docDirs, ctx
|
|
167
|
+
const rootDirs = this.inferRootDirs(docDirs, ctx);
|
|
167
168
|
const excludeSet = new Set(check.exclude || file_walk_1.DEFAULT_SKIP_DIRS);
|
|
168
169
|
for (const rootDir of rootDirs) {
|
|
169
170
|
const absRoot = (0, path_1.join)(ctx.projectPath, rootDir);
|
|
@@ -214,7 +215,7 @@ class FreshnessRunner {
|
|
|
214
215
|
* 从文档目录集合推断要扫描的根目录
|
|
215
216
|
* 例如 ["src/core", "src/cli/commands"] → ["src"]
|
|
216
217
|
*/
|
|
217
|
-
inferRootDirs(docDirs,
|
|
218
|
+
inferRootDirs(docDirs, ctx) {
|
|
218
219
|
const roots = new Set();
|
|
219
220
|
for (const dir of docDirs) {
|
|
220
221
|
// 取第一个路径段之前的公共部分
|
|
@@ -239,7 +240,11 @@ class FreshnessRunner {
|
|
|
239
240
|
merged.add(root);
|
|
240
241
|
}
|
|
241
242
|
}
|
|
242
|
-
|
|
243
|
+
if (merged.size > 0)
|
|
244
|
+
return [...merged];
|
|
245
|
+
// 兜底 = 文档一个目录条目都没登记:按项目实际源码根全量比对(删掉它等于静默放行空文档)。
|
|
246
|
+
// 取根优先用调用方注入的懒取 provider(与本 run 其余消费方共用一次探测,ADR-0023 决策 4)
|
|
247
|
+
return ctx.sourceRoots ? ctx.sourceRoots() : (0, detect_source_roots_1.detectSourceRoots)(ctx.projectPath);
|
|
243
248
|
}
|
|
244
249
|
// ── doc_regex_count ──────────────────────────────────────────────
|
|
245
250
|
checkDocRegexCount(check, ctx) {
|