@dommaker/harness 1.7.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 +37 -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 +1 -0
- 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/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 +3 -3
- 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/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 +0 -1
- package/src/__tests__/public-type-surface.test.ts +5 -4
- 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__/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 -0
- 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/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 -2
- 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/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
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* 支持按阶段预算、类型过滤、去重
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import { KnowledgeQuery } from '../knowledge/query';
|
|
8
|
+
import { KnowledgeQuery, EXTERNAL_SOURCE_MARKER } from '../knowledge/query';
|
|
9
9
|
import { TokenEstimator } from './token-budget';
|
|
10
10
|
import type { KnowledgeEntry, KnowledgeSubsystem } from '../knowledge/types';
|
|
11
11
|
import type { ContextSource } from './types';
|
|
@@ -81,7 +81,7 @@ export class KnowledgeInjector {
|
|
|
81
81
|
id: `knowledge-summary-${entry.id}`,
|
|
82
82
|
content: summary,
|
|
83
83
|
priority: 3,
|
|
84
|
-
metadata: { entryId: entry.id, isSummary: true },
|
|
84
|
+
metadata: { entryId: entry.id, isSummary: true, origin: entry.origin },
|
|
85
85
|
});
|
|
86
86
|
tokensUsed += summaryTokens;
|
|
87
87
|
entriesSummarized++;
|
|
@@ -101,7 +101,7 @@ export class KnowledgeInjector {
|
|
|
101
101
|
id: `knowledge-${entry.id}`,
|
|
102
102
|
content: formatted,
|
|
103
103
|
priority: 3,
|
|
104
|
-
metadata: { entryId: entry.id, maturity: entry.maturity },
|
|
104
|
+
metadata: { entryId: entry.id, maturity: entry.maturity, origin: entry.origin },
|
|
105
105
|
});
|
|
106
106
|
tokensUsed += entryTokens;
|
|
107
107
|
entriesIncluded++;
|
|
@@ -116,7 +116,7 @@ export class KnowledgeInjector {
|
|
|
116
116
|
id: `knowledge-summary-${entry.id}`,
|
|
117
117
|
content: summary,
|
|
118
118
|
priority: 3,
|
|
119
|
-
metadata: { entryId: entry.id, isSummary: true },
|
|
119
|
+
metadata: { entryId: entry.id, isSummary: true, origin: entry.origin },
|
|
120
120
|
});
|
|
121
121
|
tokensUsed += summaryTokens;
|
|
122
122
|
entriesSummarized++;
|
|
@@ -134,11 +134,17 @@ export class KnowledgeInjector {
|
|
|
134
134
|
}
|
|
135
135
|
|
|
136
136
|
/**
|
|
137
|
-
*
|
|
137
|
+
* 将知识条目格式化为上下文内容。
|
|
138
|
+
* 外部来源条目带 EXTERNAL_SOURCE_MARKER 前缀(harness#161:
|
|
139
|
+
* 三层防御第二层 retrieval marking 的正本接线,标记唯一来源是 knowledge/query)。
|
|
138
140
|
*/
|
|
139
141
|
formatEntry(entry: KnowledgeEntry): string {
|
|
140
142
|
const parts: string[] = [];
|
|
141
143
|
|
|
144
|
+
if (entry.origin === 'external') {
|
|
145
|
+
parts.push(EXTERNAL_SOURCE_MARKER);
|
|
146
|
+
}
|
|
147
|
+
|
|
142
148
|
parts.push(`## [${entry.type.toUpperCase()}] ${entry.title}`);
|
|
143
149
|
parts.push(`ID: ${entry.id} | 成熟度: ${entry.maturity} | 层级: ${entry.layer}`);
|
|
144
150
|
|
|
@@ -153,10 +159,11 @@ export class KnowledgeInjector {
|
|
|
153
159
|
}
|
|
154
160
|
|
|
155
161
|
/**
|
|
156
|
-
*
|
|
162
|
+
* 将知识条目格式化为摘要(一行);外部来源条目同样带来源标记前缀
|
|
157
163
|
*/
|
|
158
164
|
formatEntrySummary(entry: KnowledgeEntry): string {
|
|
159
|
-
|
|
165
|
+
const prefix = entry.origin === 'external' ? `${EXTERNAL_SOURCE_MARKER} ` : '';
|
|
166
|
+
return `${prefix}[${entry.id}] ${entry.title} (${entry.maturity}) — ${entry.content.slice(0, 100)}${entry.content.length > 100 ? '...' : ''}`;
|
|
160
167
|
}
|
|
161
168
|
|
|
162
169
|
/**
|
package/src/core/CONTEXT.md
CHANGED
|
@@ -4,20 +4,23 @@
|
|
|
4
4
|
约束引擎核心:check/prompt 二元约束系统(ADR-0001)、生效集合并(effective-constraints)、检查点验证器(CSO/passes-gate)、Spec 验证器、项目配置加载。
|
|
5
5
|
|
|
6
6
|
## 核心导出
|
|
7
|
-
- `constraints/` — 约束定义(IRON_LAWS/GUIDELINES/PROMPTS) + 检查引擎(ConstraintChecker,拦截统一由 checkBeforeExecution 承担,ADR-0004) + 缓存(CheckCache:TTL 缓存 + 计数采样,H6/G5 起公开导出) + 注入渲染(injection-renderer) + 落点写入器(injection-writer:「声明→对照→幂等替换」中 marker-range 替换的唯一 writer——replaceStandaloneRange/replaceEnclosedRange/cutMarkerBlock + 半标记守护;落点路由读写两侧同住此模块 resolveInjectionTarget(CLAUDE.md 有标记段优先、否则 AGENTS.md PRESERVE:governance,studio #307)/resolveGovernanceLanding(init 写侧,含旧版无标记 Governance Rules 块豁免),ADR-0011) + Agent prompt 渲染(agent-prompt-renderer:trigger 参数化分组渲染,role 路由留 studio,H6/G6)/漂移校验(injection-drift:纯检测只读,路由消费 injection-writer)/使用统计(usage-report:constraints report·retire 的只读数据层,读 trace 两个入口——`readProjectTracesReport()` 带 `skippedLines`、`readProjectTraces()` 兼容包装丢计数;报告模型 `ConstraintsUsageReport` 的降级位 = `traceFileExists` + `skippedLines`,harness#100)/清单对照(capabilities-reconcile:CAPABILITIES.md 与代码实况的覆盖/幽灵判定唯一实现,capability_sync·docs_freshness·sync-docs 共消费,ADR-0009);CheckEnv 生产侧唯一构造点 `buildCheckEnv(context, providers|'none')`(checkers/types.ts:providers = 证据接线,git 两项绑 GitEvidence 实例,'none' = 显式不接 → evidence flag checker 按契约 skip);判定接缝 `CheckOutcome = boolean | 'skip' | CheckDetail{pass, evidence}`(harness#119/ADR-0016)——编排层与 `gates/checker-gate` 一律经唯一归一点 `normalizeCheckOutcome()` 取三态 + 证据,不各自 `=== false`(对新形状会误判);证据行由 checker 自行措辞(自描述、不带缩进),组装与截断策略单点在 `formatEvidence()`/`MAX_EVIDENCE_ITEMS`(同住 checkers/types.ts);证据四出口 = `ConstraintResult.evidence` → CLI 结论块/提示块、`ExecutionTrace.evidence`、铁律 `ConstraintViolationError.message`(铁律违规直接 throw,异常文案是其证据唯一外溢面);检查引擎双出口——`checkConstraints`(block:首个铁律违规即抛,throw 契约不动)与 `collectConstraints`(collect:共享检查体、不抛、全量收集,report 的不抛出口,架构评审候选1)
|
|
7
|
+
- `constraints/` — 约束定义(IRON_LAWS/GUIDELINES/PROMPTS) + 检查引擎(ConstraintChecker,拦截统一由 checkBeforeExecution 承担,ADR-0004) + 缓存(CheckCache:TTL 缓存 + 计数采样,H6/G5 起公开导出) + 注入渲染(injection-renderer) + 落点写入器(injection-writer:「声明→对照→幂等替换」中 marker-range 替换的唯一 writer——replaceStandaloneRange/replaceEnclosedRange/cutMarkerBlock + 半标记守护;落点路由读写两侧同住此模块 resolveInjectionTarget(CLAUDE.md 有标记段优先、否则 AGENTS.md PRESERVE:governance,studio #307)/resolveGovernanceLanding(init 写侧,含旧版无标记 Governance Rules 块豁免),ADR-0011) + Agent prompt 渲染(agent-prompt-renderer:trigger 参数化分组渲染,role 路由留 studio,H6/G6;其 trigger 归一与匹配谓词单点在 `constraints/triggers.ts`——harness#105 定语义,harness#137 自 `utils/exec.ts` 归位,约束域谓词不住 utils 层)/漂移校验(injection-drift:纯检测只读,路由消费 injection-writer;期望段可吃调用方传入的本 run 生效集,缺省自取)/使用统计(usage-report:constraints report·retire 的只读数据层,读 trace 两个入口——`readProjectTracesReport()` 带 `skippedLines`、`readProjectTraces()` 兼容包装丢计数;报告模型 `ConstraintsUsageReport` 的降级位 = `traceFileExists` + `skippedLines`,harness#100)/清单对照(capabilities-reconcile:CAPABILITIES.md 与代码实况的覆盖/幽灵判定唯一实现,capability_sync·docs_freshness·sync-docs 共消费,ADR-0009;一次 check run 内该判定只算一次并由 `RunEnv.capabilities()` 供给两 checker,ADR-0023 决策 4——增量那一维由 capability_sync 用导出的唯一覆盖规则 `isCoveredByEntries` 自算,代码实况清单的唯一取法是 `collectPopulationFiles`);CheckEnv 生产侧唯一构造点 `buildCheckEnv(context, providers|'none', runEnv?)`(checkers/types.ts:CheckEnv `extends RunEnv`,runEnv 注入即与 context-builder 共用同一份上行数据读取、不传则自造一枚;providers = 证据接线,git 两项绑 GitEvidence 实例,'none' = 显式不接 → evidence flag checker 按契约 skip);判定接缝 `CheckOutcome = boolean | 'skip' | CheckDetail{pass, evidence}`(harness#119/ADR-0016)——编排层与 `gates/checker-gate` 一律经唯一归一点 `normalizeCheckOutcome()` 取三态 + 证据,不各自 `=== false`(对新形状会误判);证据行由 checker 自行措辞(自描述、不带缩进),组装与截断策略单点在 `formatEvidence()`/`MAX_EVIDENCE_ITEMS`(同住 checkers/types.ts);证据四出口 = `ConstraintResult.evidence` → CLI 结论块/提示块、`ExecutionTrace.evidence`、铁律 `ConstraintViolationError.message`(铁律违规直接 throw,异常文案是其证据唯一外溢面);检查引擎双出口——`checkConstraints`(block:首个铁律违规即抛,throw 契约不动)与 `collectConstraints`(collect:共享检查体、不抛、全量收集,report 的不抛出口,架构评审候选1)
|
|
8
|
+
- `constraints/context-reconcile.ts` — CONTEXT.md「核心导出」节与目录导出面的**幽灵/未登记**判定唯一实现(harness#142 / ADR-0025,与 `capabilities-reconcile` 同一套覆盖/幽灵语义,不另造第二套对照逻辑):`reconcileContext({ contextMdContent, exportSurface, barrelExports? })` → `{ declaredSymbols, ghosts, unlistedBarrelExports, hasCoreExportsSection }`;配套两个口径正本也是纯函数——`parseDeclaredExportSymbols`(只认 bullet 行首反引号标识符,`/` 连接视为多声明,形参与 `(type)`注解剥掉,非标识符的模块名 bullet 整条跳过)与 `parseExportStatements`(声明形 / `export { a, b as c }` / 逐项与块级 `type` / `export default` / `export *` 的待解析 spec)。零 fs IO:文件遍历与 `export *` 目标解析在调用方(`cli/commands/sync-docs/context-syncer.ts` 的 `collectContextExportSurface`);覆盖方向只判 barrel 的**值**符号(类型面豁免),mtime 判定就此降级为本地提示。本层 checker 暂无消费方
|
|
8
9
|
- `git-evidence.ts` — check 链路的 git 取证唯一接缝(#87,范围按 ADR-0021 收窄;`spec/validator` 的 staged 列表同型复用):`createGitEvidence(projectPath, run?)` 返回 `GitEvidence{stagedDiff, changedFileNames(staged), headDirs}`,seam 上两个真 adapter(缺省 `realGitCommandRunner` 走真 git / 注入 runner 供计数与替身)。命令级 memo 落在此实例(含失败结果),实例生命周期 = 一次 check run,故 context-builder 与 ConstraintChecker 传同一实例即共用证据;判定语义与迁移前一致(diff 取证失败 → 空串,`git ls-tree` 失败 → null = 所有目录视为新);`parseHeadDirs`/`splitFileNames` 是配套纯函数
|
|
9
|
-
- `constraints/context-builder.ts` — 只装配不取证:`buildConstraintContext(options.evidence?)` 与 `detectTrigger(options.
|
|
10
|
-
- `
|
|
11
|
-
- `effective-
|
|
12
|
-
- `
|
|
10
|
+
- `constraints/context-builder.ts` — 只装配不取证:`buildConstraintContext(options.evidence?, options.runEnv?)` 与 `detectTrigger(…, options.runEnv?)` 经 GitEvidence 取 git 事实(不传 = 自建真 adapter),本模块无 child_process import;上行数据(源码根、trace 记录)经 `RunEnv` 取(ADR-0023),其余证据标志(ROOT_CAUSE/reuse/需求文档标记)仍为本地探测;`detectFailingTest`/`detectVerificationEvidence` 是模块私有的布尔投影(除本模块外零消费者,收私依 ADR-0022 同判据)
|
|
11
|
+
- `constraints/run-env.ts` — 一次 check 的运行级观察面(ADR-0023):`createRunEnv(projectPath)` 返回 `RunEnv{projectPath, traceTail(limit), sourceRoots(), rawConfig(), customConstraints(fileName), capabilities(populationFiles)}`,懒建 + run 内 memo,同一份文件一次运行至多读一次。与 git-evidence 同一形状:一次 run 一份、沿调用链显式传递(CLI check 入口 → 生效集 / buildConstraintContext / checkConstraints / 漂移检测),不做模块级全局。为何是两个类型而不是一个:`CheckEnv` 含 `context`,而 `context` 正是本对象读文件算出来的产物——同一对象不能既是构造者的输入又是其产物;故这里只放「不需要 context 就能造」的那半,`CheckEnv` 以 `extends RunEnv` 从它派生(`buildCheckEnv(context, evidence, runEnv?)` 第三参注入,不传 = 自造一枚一次性观察面)。配置两口的口径:`rawConfig()` 缺失 → undefined、空文件 → `{}`、YAML 解析失败**照抛**(兜与否属消费方判定);`customConstraints(file)` 取 `custom_constraints` 段、缺失 → `{}`,「哪个文件名算数」仍由 ProjectConfigLoader 决定,读面不掺判定。`capabilities(population)` 一次读文档 + 一次 `reconcileCapabilities`(带存在性 oracle;不收 git 增量,`verdict.uncoveredChanges` 在此恒空),**memo 只记第一次传入的清单**——两消费方一律经 `collectPopulationFiles` 取数以由构造保证同形;源根 memo 与它共用。`traceTail(limit)` 底层是 `jsonl.readJsonlWindow`(一次分块读尾部行文本、按不同 limit 反复截窗),**先截行文本再 parse** 才与「各读一遍」逐字同口径(坏行占槽位不占 records 名额);请求超出窗口上限直接抛,不静默少给。`RunTarget = RunEnv | 项目根路径` 与 `resolveRunEnv()` 是这套入参形状的归一点:传路径 = 一次性读取语义(每次调用读当下内容)
|
|
12
|
+
- `effective-constraints.ts` — `getEffectiveConstraints(target, {preset?})`:全仓唯一生效集来源(内置 → preset → config.yml 禁用(内置与 custom 同效)→ custom 追加(禁用/已退役的不追加)→ scenes 过滤);`constraintsFromMerged(merged)`:从已算好的合并配置取清单(推导单点,`getEffectiveConstraints` 也走它);`getMergedConstraintsConfig(target, {preset?})`:同链路的完整 MergedConstraintsConfig 形状(含 disabled/custom/unknownIds),内置工单 23 优先级规则(**只有显式传 preset 才覆盖 config.yml**,CLI 不给缺省值,ADR-0023 步骤 4.5),check 命令经此入口并把算好的一份清单转交漂移检测 → 一次运行只算一遍;三个入口的 `target` = `RunTarget`(传 RunEnv 即与 checker、漂移检测共用同一份配置读取,ADR-0023 决策 2);`lintEffectiveConfig` 配置诊断
|
|
13
|
+
- `effective-set.ts` — `filterEnabledEntries(knownIds, entries)`:config 条目筛选器唯一实现,语义单一——未知 id 静默忽略并收集进 `unknownIds` 供诊断(历史配置可能残留已移除条目的禁用键,故不抛错)。唯一生产调用方是约束侧 `mergeConstraints`;曾按语义分 `'collect'`/`'throw'` 两模式,throw 侧唯一调用方 `getEffectiveGates` 随 ADR-0002「后续变更」收缩后,该模式按 ADR-0022 判据删除(harness#141)
|
|
14
|
+
- `validators/` — checkpoints、passes-gate、CSO 验证器;`test-output.ts` —「测试产物解读」唯一实现:`extractFailures` 提取函数 + `judgeTestRun` 判定入口(退出码为主 + 行首锚定的文本失败信号交叉否决;文本救不回非零退出,`allowPartialPass` 只作用于文本否决那一维),passes-gate 与 `gates/acceptance` 的结论一律从它取、各自体内不写判定 `if`(解析收口 ADR-0012,判定依据 ADR-0014);**不读覆盖率**——harness 核心判定对覆盖率不取数不执法,判覆盖率的两处(CLI `passes-gate --coverage`、`gates/performance`)各自读 json-summary,`extractCoverage` 与 `TaskTestResult.coverage` 已随 ADR-0015 删除;`PassesGate.runTests(workDir)` 的执行与证据落盘根是**必传形参**,本层不再取 cwd(harness#95,约定正本见 `src/cli/commands/CONTEXT.md`);`detectTestCommand` 是测试命令探测唯一正本(模块级导出:test:ci → test 排 echo 占位 → test:e2e → test:coverage → Python 标记 pyproject.toml/pytest.ini → go.mod,探不到返回 undefined,兜底归调用方——CLI 映射 skip、PassesGate 内部 fail-closed,不再兜底 'npm test';CLI 本地版已删,架构评审 A2);PassesGate 扩展注册表(registerExtension/unregisterExtension/getExtensionNames/runAllTests/checkAllPasses + PassesGateExtension/ExtensionTestResult 两类型与包根导出)已整段删除——零 adapter 假想 seam 且扩展结果本就不参与 allowed 判定,需要扩展测试类型时按 ADR-0014 判例在 `judgeTestRun` 层加,不恢复旧 seam(harness#104,架构评审 B1);PassesGate 公开面 = `check()` + `runTests()` 两个真实消费点,`setPasses`/`getTestResult`/`checkTestFileChanges` 三方法与死数据 `PROTECTED_TEST_PATTERNS`、私有 `testResults` 缓存已随 ADR-0022(双仓零消费者)删除,历史 AC-007「保留 setPasses 向后兼容」同案推翻;`runTest` 的 `_task` 形参与其类型 `DynamicTask` 是同批漏收的第三处死面(二次复审 B1)——setPasses 删除后只剩这个从不读取的私有形参在供养它,而包根 `DynamicTask` 取自 `./types/passes-gate`,故它是**公开的**死类型;随 A1/A2 同判据删除,`runTest` 签名收为 `(workDir, command?)`,类型面钉子同 `PassesGateResult` 手法(`src/__tests__/public-exports.test.ts`);包内模块,不进 `src/index.ts` 导出面;`check-handlers/` 各族处理器统一签名 `(check, context)`,context 即既有注入车辆(`customHandlers` 同形)——`http_*` 族的重试退避等待经 `CheckpointContext.sleep` 注入(工单 #136),缺省 = 真定时器且退避公式与重试次数逐字不变,测试据此断言尝试次数与退避序列而不必真等;新增等待类副作用按同形收进 context,不再内联进处理器
|
|
13
15
|
- `spec/validator` — SpecValidator
|
|
14
|
-
- `project-config-loader` —
|
|
16
|
+
- `project-config-loader` — 项目配置解读 + 约束合并(mergeConstraints 内含 preset 裁剪:presets/ 纯数据 + 未知名回落 standard,禁用到未知 id 经 effective-set 共享筛选器收集(未知 id 不抛错、进 `unknownIds` 供诊断));**退役判定单点 `isConstraintRetired(customDef, disabled)`**(harness#137)= 「禁用 或 custom 条目带 `retired` 元数据」(studio#82 D6 两个落点合成一条规则),`mergeConstraints` 的 custom 追加跳过与 `cli/commands/constraints-retire` 的 already_retired 共用它——后者此前是这条规则的手写复印;`disabled` 由调用方给(merge 侧含 preset 裁剪,retire 侧只看 config.yml),`retired` 按 truthiness 判;同批删掉 `isConstraintEnabled()`/`getConstraintSource()` 两个平行复印(双仓零消费者,生效集判定唯一来源是 mergeConstraints → getEffectiveConstraints);**本模块不碰文件系统**:config.yml 与自定义约束文件的读取在 `constraints/run-env.ts`(ADR-0023 决策 2 撤销了工单 16 的进程级 `rawConfigCache` + mtime 指纹,改为一次运行一份快照);访问器族(`loadRawProjectConfig`/`getGovernanceConfig`/`resolveContextFiles`/`getCapabilitiesMode`)与 `ProjectConfigLoader` 构造器的入参形状 = `RunTarget`(传项目根路径 = 一次性读取,传 RunEnv = 与本 run 其余消费方共用同一份);`getGovernanceConfig` 是全仓唯一允许手写钻取 `config.governance` 的点(工单 84),消费方一律经它或经 `resolveContextFiles`(三态:unconfigured / enabled-empty / enabled,dirs 元素类型在此收口)取数据,不得再自己 cast `Record<string, unknown>`;checker 对前两态一律 skip,自动探测回落只属于 init/扫描类工具流调用方
|
|
17
|
+
- `index.ts` barrel 公开面(子路径 `@dommaker/harness/core`,ADR-0003 显式清单、禁 `export *`)——定义取数 `getAllConstraints()` / `getConstraint(id)` / `findConstraintsByTrigger(trigger)`(正本 `constraints/definitions.ts`);判定出口 `checkConstraints()` / `checkConstraint()` / `checkBeforeExecution()` 与未接线默认实例 `constraintChecker`(= `ConstraintChecker.getInstance()`,不写 trace,正本 `constraints/checker.ts`);治理注入段标记常量 `CONSTRAINTS_START_MARKER` / `CONSTRAINTS_END_MARKER` 与 `renderConstraintsSection(constraints, version)`(正本 `constraints/injection-renderer.ts`)、按 trigger 分组渲染 `renderConstraintsByTrigger()`(正本 `constraints/agent-prompt-renderer.ts`);验证器 `CheckpointValidator` / `CSOValidator`(两者私有构造 + `static getInstance()` 单例出口)与 `PassesGate` + 工厂 `createPassesGate(config?)`(`Partial<PassesGateConfig>`,正本 `validators/`)
|
|
15
18
|
|
|
16
19
|
## 依赖关系
|
|
17
20
|
- 被所有模块依赖(基础层,无上层依赖)
|
|
18
21
|
- 依赖 `src/types/` 类型定义
|
|
19
22
|
- 依赖 `src/utils/` 工具函数
|
|
20
|
-
- 对 `cli/`、`gates/`、`monitoring/` **零值导入**(type-only 允许):方向由 eslint.config.mjs 的 `@typescript-eslint/no-restricted-imports`(error 级)锁死,守卫测试见 `src/__tests__/layering.test.ts`(harness#88
|
|
23
|
+
- 对 `cli/`、`gates/`、`monitoring/` **零值导入**(type-only 允许):方向由 eslint.config.mjs 的 `@typescript-eslint/no-restricted-imports`(error 级)锁死,守卫测试见 `src/__tests__/layering.test.ts`(harness#88;harness#137 起该守卫已参数化成「每个顶层单元声明允许的下行集合」,core 的这条边只是其中一个条目)
|
|
21
24
|
|
|
22
25
|
## 约定
|
|
23
26
|
- 约束定义在 `constraints/definitions/{iron-laws,guidelines,prompts}.ts`,不在运行时代码中定义
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* effective-set 共享筛选器测试
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* 筛选语义单一(未知 id 静默忽略并收集进 unknownIds);「新形状钉」一组钉住 throw 模式已删除。
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import { filterEnabledEntries } from '../effective-set';
|
|
@@ -9,72 +9,48 @@ import { filterEnabledEntries } from '../effective-set';
|
|
|
9
9
|
const KNOWN = new Set(['a', 'b', 'c']);
|
|
10
10
|
|
|
11
11
|
describe('filterEnabledEntries', () => {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
{ onUnknownId: 'collect' }
|
|
18
|
-
);
|
|
19
|
-
expect(result.disabledIds).toEqual(['a']);
|
|
20
|
-
expect(result.unknownIds).toEqual([]);
|
|
12
|
+
it('已知 id 全部通过,enabled:false 收进 disabledIds', () => {
|
|
13
|
+
const result = filterEnabledEntries(KNOWN, {
|
|
14
|
+
a: { enabled: false },
|
|
15
|
+
b: { enabled: true },
|
|
16
|
+
c: {},
|
|
21
17
|
});
|
|
18
|
+
expect(result.disabledIds).toEqual(['a']);
|
|
19
|
+
expect(result.unknownIds).toEqual([]);
|
|
20
|
+
});
|
|
22
21
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
expect(result.unknownIds).toEqual(['ghost']);
|
|
30
|
-
// 未知 id 带 enabled:false 同样计入 disabledIds(历史行为:delete 空桶为 no-op)
|
|
31
|
-
expect(result.disabledIds).toEqual(['ghost']);
|
|
32
|
-
});
|
|
22
|
+
it('未知 id 静默忽略并收集进 unknownIds', () => {
|
|
23
|
+
const result = filterEnabledEntries(KNOWN, { a: {}, ghost: { enabled: false } });
|
|
24
|
+
expect(result.unknownIds).toEqual(['ghost']);
|
|
25
|
+
// 未知 id 带 enabled:false 同样计入 disabledIds(历史行为:delete 空桶为 no-op)
|
|
26
|
+
expect(result.disabledIds).toEqual(['ghost']);
|
|
27
|
+
});
|
|
33
28
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
);
|
|
40
|
-
expect(result.unknownIds).toEqual(['ghost']);
|
|
41
|
-
expect(result.disabledIds).toEqual([]);
|
|
42
|
-
});
|
|
29
|
+
it('未知 id 无 enabled 标记时只收集不进 disabledIds', () => {
|
|
30
|
+
const result = filterEnabledEntries(KNOWN, { ghost: {} });
|
|
31
|
+
expect(result.unknownIds).toEqual(['ghost']);
|
|
32
|
+
expect(result.disabledIds).toEqual([]);
|
|
33
|
+
});
|
|
43
34
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
});
|
|
35
|
+
it('空 entries → 空结果', () => {
|
|
36
|
+
const result = filterEnabledEntries(KNOWN, {});
|
|
37
|
+
expect(result).toEqual({ disabledIds: [], unknownIds: [] });
|
|
48
38
|
});
|
|
39
|
+
});
|
|
49
40
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
).toThrow(/未注册的 id "nope"/);
|
|
55
|
-
});
|
|
41
|
+
describe('新形状钉(throw 模式已按 ADR-0022 判据删除,harness#141)', () => {
|
|
42
|
+
it('形参只有 knownIds/entries 两个(运行期钉)', () => {
|
|
43
|
+
expect(filterEnabledEntries.length).toBe(2);
|
|
44
|
+
});
|
|
56
45
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
{ nope: {} },
|
|
62
|
-
{
|
|
63
|
-
onUnknownId: 'throw',
|
|
64
|
-
unknownIdError: id => `gates.${id} 引用了未注册的门禁。可用门禁: a, b, c。`,
|
|
65
|
-
}
|
|
66
|
-
)
|
|
67
|
-
).toThrow(/gates\.nope 引用了未注册的门禁/);
|
|
68
|
-
});
|
|
46
|
+
it('选项参数不再是合法入参(编译期钉)', () => {
|
|
47
|
+
// @ts-expect-error onUnknownId/unknownIdError 随 throw 模式一并删除,调用面不接收第三参数
|
|
48
|
+
filterEnabledEntries(KNOWN, { nope: {} }, { onUnknownId: 'throw' });
|
|
49
|
+
});
|
|
69
50
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
{ onUnknownId: 'throw' }
|
|
75
|
-
);
|
|
76
|
-
expect(result.disabledIds).toEqual(['a']);
|
|
77
|
-
expect(result.unknownIds).toEqual([]);
|
|
78
|
-
});
|
|
51
|
+
it('FilterEnabledEntriesOptions 不再是可导入类型(编译期钉)', () => {
|
|
52
|
+
// @ts-expect-error 选项类型随其唯一成员(onUnknownId)一并消失
|
|
53
|
+
const removed: import('../effective-set').FilterEnabledEntriesOptions | undefined = undefined;
|
|
54
|
+
expect(removed).toBeUndefined();
|
|
79
55
|
});
|
|
80
56
|
});
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* context-reconcile 纯判定测试(harness#142 / ADR-0025)
|
|
3
|
+
*
|
|
4
|
+
* interface 即测试面(对位 ADR-0009):喂 CONTEXT.md 正文 + 目录导出面清单,
|
|
5
|
+
* 断言双向判定;零 fs fixture。夹具取仓内真实写法(hooks 的 `/` 连接多符号、
|
|
6
|
+
* release 的节首散文 + 带参反引号、knowledge 的模块名 bullet、monitoring 的行首单符号)。
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import {
|
|
10
|
+
reconcileContext,
|
|
11
|
+
parseExportStatements,
|
|
12
|
+
parseDeclaredExportSymbols,
|
|
13
|
+
} from '../context-reconcile';
|
|
14
|
+
|
|
15
|
+
const SECTION_HEAD = '## 核心导出\n';
|
|
16
|
+
|
|
17
|
+
function contextDoc(sectionBody: string, tailSection = '## 约定\n- 随便写点别的\n'): string {
|
|
18
|
+
return `# 模块\n\n${SECTION_HEAD}${sectionBody}\n${tailSection}`;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
describe('parseDeclaredExportSymbols — 「核心导出」节声明解析', () => {
|
|
22
|
+
it('行首反引号标识符是声明;节外(其它 ## 节 / 节首散文)不算', () => {
|
|
23
|
+
const doc = contextDoc(
|
|
24
|
+
[
|
|
25
|
+
'下列符号都由 `integrity.ts` 就地导出;散文段落里的 `NotADeclaration` 不参与。',
|
|
26
|
+
'- `getCriticalArtifacts` — 公开 API',
|
|
27
|
+
'- `EXTRA_CRITICAL_ARTIFACTS`——常量',
|
|
28
|
+
].join('\n')
|
|
29
|
+
);
|
|
30
|
+
expect(parseDeclaredExportSymbols(doc)).toEqual(['getCriticalArtifacts', 'EXTRA_CRITICAL_ARTIFACTS']);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('`/` 连接的行首多符号逐个取(hooks 写法),并跳过括号形参(release 写法)', () => {
|
|
34
|
+
const doc = contextDoc(
|
|
35
|
+
[
|
|
36
|
+
'- `bootstrapHarness` / `bootstrapHarnessSync` — 启动引导',
|
|
37
|
+
'- `deriveCriticalArtifacts(manifest)`(`integrity.ts`)——纯函数',
|
|
38
|
+
'- `getCriticalArtifacts(pkgRoot?)` / `verifyReleaseArtifacts(pkgRoot?)`——公开 API',
|
|
39
|
+
].join('\n')
|
|
40
|
+
);
|
|
41
|
+
expect(parseDeclaredExportSymbols(doc)).toEqual([
|
|
42
|
+
'bootstrapHarness',
|
|
43
|
+
'bootstrapHarnessSync',
|
|
44
|
+
'deriveCriticalArtifacts',
|
|
45
|
+
'getCriticalArtifacts',
|
|
46
|
+
'verifyReleaseArtifacts',
|
|
47
|
+
]);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('类型注解与模块名 bullet:`HookConfig`(type)取符号,`types.ts`/`audit-scoring`/`constraints/` 整条跳过', () => {
|
|
51
|
+
const doc = contextDoc(
|
|
52
|
+
[
|
|
53
|
+
'- `HookConfig`(type)— per-hook 配置声明',
|
|
54
|
+
'- `type HarnessBootstrap` — 把关键字写进反引号里的另一种类型注解形',
|
|
55
|
+
'- `types.ts` — 类型定义文件',
|
|
56
|
+
'- `audit-scoring`(包内,不进导出面)— 打分纯模块',
|
|
57
|
+
'- `constraints/` — 子目录条目',
|
|
58
|
+
].join('\n')
|
|
59
|
+
);
|
|
60
|
+
expect(parseDeclaredExportSymbols(doc)).toEqual(['HookConfig', 'HarnessBootstrap']);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it('bullet 行首不是反引号(gates 的「统一协议:`Gate{…}`」形)不取声明;bullet 中段反引号不取', () => {
|
|
64
|
+
const doc = contextDoc(
|
|
65
|
+
[
|
|
66
|
+
'- 统一协议:`Gate{id, order}` → `GateDecision{status}`(`types.ts`)',
|
|
67
|
+
'- `TraceCollector` — 读入口 `readReport(filter?)` 与 `read()` 兼容包装',
|
|
68
|
+
].join('\n')
|
|
69
|
+
);
|
|
70
|
+
expect(parseDeclaredExportSymbols(doc)).toEqual(['TraceCollector']);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('无「核心导出」节 → 空清单(散文式 CONTEXT.md 不参与内容判定)', () => {
|
|
74
|
+
expect(parseDeclaredExportSymbols('# 模块\n\n## 职责\n- `Whatever`\n')).toEqual([]);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
describe('parseExportStatements — 源码导出面解析口径', () => {
|
|
79
|
+
it('声明形:function/async function/const/class/interface/type/enum 各取符号并分型', () => {
|
|
80
|
+
const src = [
|
|
81
|
+
'export function f() {}',
|
|
82
|
+
'export async function g() {}',
|
|
83
|
+
'export const A = 1;',
|
|
84
|
+
'export let B = 2;',
|
|
85
|
+
'export class C {}',
|
|
86
|
+
'export abstract class D {}',
|
|
87
|
+
'export interface I {}',
|
|
88
|
+
'export type T = string;',
|
|
89
|
+
'export enum E {}',
|
|
90
|
+
'const notExported = 0;',
|
|
91
|
+
].join('\n');
|
|
92
|
+
const { symbols } = parseExportStatements(src);
|
|
93
|
+
const asMap = Object.fromEntries(symbols.map((entry) => [entry.name, entry.typeOnly]));
|
|
94
|
+
expect(asMap).toEqual({
|
|
95
|
+
f: false,
|
|
96
|
+
g: false,
|
|
97
|
+
A: false,
|
|
98
|
+
B: false,
|
|
99
|
+
C: false,
|
|
100
|
+
D: false,
|
|
101
|
+
I: true,
|
|
102
|
+
T: true,
|
|
103
|
+
E: false,
|
|
104
|
+
});
|
|
105
|
+
expect(symbols.map((s) => s.name)).not.toContain('notExported');
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it('`export { a, b as c }` 取导出名(别名后名),块级与逐项 `type` 标记都判为类型', () => {
|
|
109
|
+
const src = [
|
|
110
|
+
"export { Alpha, Beta as Gamma } from './alpha';",
|
|
111
|
+
"export type { Delta } from './alpha';",
|
|
112
|
+
"export { Epsilon, type Zeta } from './epsilon';",
|
|
113
|
+
].join('\n');
|
|
114
|
+
const { symbols } = parseExportStatements(src);
|
|
115
|
+
expect(symbols).toEqual([
|
|
116
|
+
{ name: 'Alpha', localName: 'Alpha', typeOnly: false, from: './alpha' },
|
|
117
|
+
{ name: 'Gamma', localName: 'Beta', typeOnly: false, from: './alpha' },
|
|
118
|
+
{ name: 'Delta', localName: 'Delta', typeOnly: true, from: './alpha' },
|
|
119
|
+
{ name: 'Epsilon', localName: 'Epsilon', typeOnly: false, from: './epsilon' },
|
|
120
|
+
{ name: 'Zeta', localName: 'Zeta', typeOnly: true, from: './epsilon' },
|
|
121
|
+
]);
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it('列表里的空项与裸 `default` 说明符不成符号(尾逗号与整体默认导出不混为一谈)', () => {
|
|
125
|
+
const src = ["export { Alpha, , default } from './x';", "export { Beta as default } from './y';"].join('\n');
|
|
126
|
+
const { symbols } = parseExportStatements(src);
|
|
127
|
+
expect(symbols).toEqual([
|
|
128
|
+
{ name: 'Alpha', localName: 'Alpha', typeOnly: false, from: './x' },
|
|
129
|
+
{ name: 'default', localName: 'Beta', typeOnly: false, from: './y' },
|
|
130
|
+
]);
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
it('`export *` 只报待解析的相对 spec;非相对 spec 由调用方跳过', () => {
|
|
134
|
+
const src = ["export * from './types';", "export * as ns from './other';", "export * from 'chalk';"].join('\n');
|
|
135
|
+
expect(parseExportStatements(src).starFrom).toEqual(['./types', './other', 'chalk']);
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
it('export default 记为 `default`;注释内的伪 export 不取', () => {
|
|
139
|
+
const src = ['export default 42;', '// export const commented = 1;', '/* export const blocked = 2; */'].join('\n');
|
|
140
|
+
const names = parseExportStatements(src).symbols.map((s) => s.name);
|
|
141
|
+
expect(names).toEqual(['default']);
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
describe('reconcileContext — 幽灵方向(文档→代码)', () => {
|
|
146
|
+
const doc = contextDoc(['- `TraceCollector` — 收集', '- `ContextTracker` — 快照'].join('\n'));
|
|
147
|
+
|
|
148
|
+
it('声明的符号在导出面中不存在 → 报幽灵并指名符号', () => {
|
|
149
|
+
const v = reconcileContext({
|
|
150
|
+
contextMdContent: doc,
|
|
151
|
+
exportSurface: ['TraceCollector'],
|
|
152
|
+
});
|
|
153
|
+
expect(v.declaredSymbols).toEqual(['TraceCollector', 'ContextTracker']);
|
|
154
|
+
expect(v.ghosts).toEqual(['ContextTracker']);
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
it('导出面含同名符号(含类型符号)→ 零幽灵', () => {
|
|
158
|
+
expect(
|
|
159
|
+
reconcileContext({
|
|
160
|
+
contextMdContent: doc,
|
|
161
|
+
exportSurface: ['TraceCollector', 'ContextTracker'],
|
|
162
|
+
}).ghosts
|
|
163
|
+
).toEqual([]);
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
it('无「核心导出」节的文档不产幽灵,也不把 barrel 全量判成未登记', () => {
|
|
167
|
+
const v = reconcileContext({
|
|
168
|
+
contextMdContent: '# 模块\n\n只有散文\n',
|
|
169
|
+
exportSurface: [],
|
|
170
|
+
barrelExports: ['Anything'],
|
|
171
|
+
});
|
|
172
|
+
expect(v.hasCoreExportsSection).toBe(false);
|
|
173
|
+
expect(v.ghosts).toEqual([]);
|
|
174
|
+
expect(v.unlistedBarrelExports).toEqual([]);
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
describe('reconcileContext — 覆盖方向(代码→文档,barrel 值符号)', () => {
|
|
179
|
+
const doc = contextDoc(
|
|
180
|
+
[
|
|
181
|
+
'- `TraceCollector` — 执行追踪收集(`readReport(filter?)`)',
|
|
182
|
+
'- `TraceAnalyzer` — 统计分析,另有 `createAnalyzer` 工厂',
|
|
183
|
+
].join('\n')
|
|
184
|
+
);
|
|
185
|
+
|
|
186
|
+
it('barrel 再导出的值符号未出现在「核心导出」节 → 未登记;inline 提及即算登记', () => {
|
|
187
|
+
const v = reconcileContext({
|
|
188
|
+
contextMdContent: doc,
|
|
189
|
+
exportSurface: ['TraceCollector', 'TraceAnalyzer', 'createAnalyzer', 'configureTraceCollector'],
|
|
190
|
+
barrelExports: ['TraceCollector', 'TraceAnalyzer', 'createAnalyzer', 'configureTraceCollector'],
|
|
191
|
+
});
|
|
192
|
+
expect(v.unlistedBarrelExports).toEqual(['configureTraceCollector']);
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
it('无 barrel 的目录(barrelExports 不传/空)跳过覆盖方向', () => {
|
|
196
|
+
const v = reconcileContext({
|
|
197
|
+
contextMdContent: contextDoc('- `COMMAND_DEFINITIONS` — 定义表'),
|
|
198
|
+
exportSurface: ['COMMAND_DEFINITIONS', 'syncDocs'],
|
|
199
|
+
barrelExports: [],
|
|
200
|
+
});
|
|
201
|
+
expect(v.unlistedBarrelExports).toEqual([]);
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
it('名称匹配按标识符边界:`Gate` 不因文档里有 `GateResult` 而算登记', () => {
|
|
205
|
+
const v = reconcileContext({
|
|
206
|
+
contextMdContent: contextDoc('- `GateResult` — 报告结构'),
|
|
207
|
+
exportSurface: ['GateResult', 'Gate'],
|
|
208
|
+
barrelExports: ['Gate', 'GateResult'],
|
|
209
|
+
});
|
|
210
|
+
expect(v.unlistedBarrelExports).toEqual(['Gate']);
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
it('节外正文(其它 ## 节)里的同名句子不救 barrel 未登记', () => {
|
|
214
|
+
const v = reconcileContext({
|
|
215
|
+
contextMdContent: contextDoc('- `TraceCollector` — 收集', '## 约定\n- `configureTraceCollector` 只在组合根用\n'),
|
|
216
|
+
exportSurface: ['TraceCollector', 'configureTraceCollector'],
|
|
217
|
+
barrelExports: ['TraceCollector', 'configureTraceCollector'],
|
|
218
|
+
});
|
|
219
|
+
expect(v.unlistedBarrelExports).toEqual(['configureTraceCollector']);
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
describe('reconcileContext — 两方向同输入对撞', () => {
|
|
224
|
+
it('改符号名(代码改名不回灌文档)同时撞出幽灵与未登记', () => {
|
|
225
|
+
const doc = contextDoc('- `TraceCollector` — 收集\n');
|
|
226
|
+
const v = reconcileContext({
|
|
227
|
+
contextMdContent: doc,
|
|
228
|
+
exportSurface: ['TraceSink', 'configureTraceCollector'],
|
|
229
|
+
barrelExports: ['TraceSink'],
|
|
230
|
+
});
|
|
231
|
+
expect(v.ghosts).toEqual(['TraceCollector']);
|
|
232
|
+
expect(v.unlistedBarrelExports).toEqual(['TraceSink']);
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
it('两侧一致 → 干净(判定不制造存量噪音)', () => {
|
|
236
|
+
const doc = contextDoc('- `TraceCollector` — 收集\n- `configureTraceCollector` — 单例装配\n');
|
|
237
|
+
const v = reconcileContext({
|
|
238
|
+
contextMdContent: doc,
|
|
239
|
+
exportSurface: ['TraceCollector', 'configureTraceCollector'],
|
|
240
|
+
barrelExports: ['TraceCollector', 'configureTraceCollector'],
|
|
241
|
+
});
|
|
242
|
+
expect(v.ghosts).toEqual([]);
|
|
243
|
+
expect(v.unlistedBarrelExports).toEqual([]);
|
|
244
|
+
expect(v.hasCoreExportsSection).toBe(true);
|
|
245
|
+
});
|
|
246
|
+
});
|