@dommaker/harness 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/README.md +0 -2
- package/bin/harness.js +86 -32
- package/dist/cli/command-contract.d.ts +83 -0
- package/dist/cli/command-contract.d.ts.map +1 -0
- package/dist/cli/command-contract.js +66 -0
- package/dist/cli/command-contract.js.map +1 -0
- package/dist/cli/commands/acceptance.d.ts +3 -2
- package/dist/cli/commands/acceptance.d.ts.map +1 -1
- package/dist/cli/commands/acceptance.js +28 -24
- package/dist/cli/commands/acceptance.js.map +1 -1
- package/dist/cli/commands/analyze-sessions.d.ts +2 -1
- package/dist/cli/commands/analyze-sessions.d.ts.map +1 -1
- package/dist/cli/commands/analyze-sessions.js +25 -24
- package/dist/cli/commands/analyze-sessions.js.map +1 -1
- package/dist/cli/commands/check.d.ts +14 -2
- package/dist/cli/commands/check.d.ts.map +1 -1
- package/dist/cli/commands/check.js +76 -61
- package/dist/cli/commands/check.js.map +1 -1
- package/dist/cli/commands/command.d.ts +5 -1
- package/dist/cli/commands/command.d.ts.map +1 -1
- package/dist/cli/commands/command.js +26 -17
- package/dist/cli/commands/command.js.map +1 -1
- package/dist/cli/commands/constraints-report.d.ts +2 -1
- package/dist/cli/commands/constraints-report.d.ts.map +1 -1
- package/dist/cli/commands/constraints-report.js +37 -33
- package/dist/cli/commands/constraints-report.js.map +1 -1
- package/dist/cli/commands/constraints-retire.d.ts +6 -5
- package/dist/cli/commands/constraints-retire.d.ts.map +1 -1
- package/dist/cli/commands/constraints-retire.js +50 -52
- package/dist/cli/commands/constraints-retire.js.map +1 -1
- package/dist/cli/commands/constraints.d.ts +2 -1
- package/dist/cli/commands/constraints.d.ts.map +1 -1
- package/dist/cli/commands/constraints.js +10 -27
- package/dist/cli/commands/constraints.js.map +1 -1
- package/dist/cli/commands/contract.d.ts +3 -2
- package/dist/cli/commands/contract.d.ts.map +1 -1
- package/dist/cli/commands/contract.js +45 -42
- package/dist/cli/commands/contract.js.map +1 -1
- package/dist/cli/commands/definitions.d.ts +11 -11
- package/dist/cli/commands/definitions.d.ts.map +1 -1
- package/dist/cli/commands/definitions.js +29 -214
- package/dist/cli/commands/definitions.js.map +1 -1
- package/dist/cli/commands/failure.d.ts +5 -4
- package/dist/cli/commands/failure.d.ts.map +1 -1
- package/dist/cli/commands/failure.js +31 -25
- package/dist/cli/commands/failure.js.map +1 -1
- package/dist/cli/commands/init.d.ts +7 -5
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +147 -211
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/knowledge.d.ts +21 -15
- package/dist/cli/commands/knowledge.d.ts.map +1 -1
- package/dist/cli/commands/knowledge.js +214 -199
- package/dist/cli/commands/knowledge.js.map +1 -1
- package/dist/cli/commands/passes-gate.d.ts +8 -2
- package/dist/cli/commands/passes-gate.d.ts.map +1 -1
- package/dist/cli/commands/passes-gate.js +44 -66
- package/dist/cli/commands/passes-gate.js.map +1 -1
- package/dist/cli/commands/performance.d.ts +2 -1
- package/dist/cli/commands/performance.d.ts.map +1 -1
- package/dist/cli/commands/performance.js +20 -18
- package/dist/cli/commands/performance.js.map +1 -1
- package/dist/cli/commands/posteval-plan.d.ts +5 -1
- package/dist/cli/commands/posteval-plan.d.ts.map +1 -1
- package/dist/cli/commands/posteval-plan.js +26 -15
- package/dist/cli/commands/posteval-plan.js.map +1 -1
- package/dist/cli/commands/release.d.ts +6 -1
- package/dist/cli/commands/release.d.ts.map +1 -1
- package/dist/cli/commands/release.js +69 -59
- package/dist/cli/commands/release.js.map +1 -1
- package/dist/cli/commands/report.d.ts +2 -1
- package/dist/cli/commands/report.d.ts.map +1 -1
- package/dist/cli/commands/report.js +9 -5
- package/dist/cli/commands/report.js.map +1 -1
- package/dist/cli/commands/review.d.ts +3 -2
- package/dist/cli/commands/review.d.ts.map +1 -1
- package/dist/cli/commands/review.js +33 -29
- package/dist/cli/commands/review.js.map +1 -1
- package/dist/cli/commands/sdd.d.ts +2 -1
- package/dist/cli/commands/sdd.d.ts.map +1 -1
- package/dist/cli/commands/sdd.js +7 -5
- package/dist/cli/commands/sdd.js.map +1 -1
- package/dist/cli/commands/security.d.ts +3 -2
- package/dist/cli/commands/security.d.ts.map +1 -1
- package/dist/cli/commands/security.js +29 -26
- package/dist/cli/commands/security.js.map +1 -1
- package/dist/cli/commands/spec-baseline-check.d.ts +2 -1
- package/dist/cli/commands/spec-baseline-check.d.ts.map +1 -1
- package/dist/cli/commands/spec-baseline-check.js +15 -11
- package/dist/cli/commands/spec-baseline-check.js.map +1 -1
- package/dist/cli/commands/spec.d.ts +7 -2
- package/dist/cli/commands/spec.d.ts.map +1 -1
- package/dist/cli/commands/spec.js +61 -51
- package/dist/cli/commands/spec.js.map +1 -1
- package/dist/cli/commands/status.d.ts +2 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +57 -53
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/sync-docs/agents-syncer.d.ts.map +1 -1
- package/dist/cli/commands/sync-docs/agents-syncer.js +5 -2
- package/dist/cli/commands/sync-docs/agents-syncer.js.map +1 -1
- package/dist/cli/commands/sync-docs/context-syncer.d.ts.map +1 -1
- package/dist/cli/commands/sync-docs/context-syncer.js +3 -2
- package/dist/cli/commands/sync-docs/context-syncer.js.map +1 -1
- package/dist/cli/commands/sync-docs/index.d.ts +2 -1
- package/dist/cli/commands/sync-docs/index.d.ts.map +1 -1
- package/dist/cli/commands/sync-docs/index.js +68 -88
- package/dist/cli/commands/sync-docs/index.js.map +1 -1
- package/dist/cli/commands/sync-docs/project-reader.d.ts +6 -1
- package/dist/cli/commands/sync-docs/project-reader.d.ts.map +1 -1
- package/dist/cli/commands/sync-docs/project-reader.js +14 -16
- package/dist/cli/commands/sync-docs/project-reader.js.map +1 -1
- package/dist/cli/commands/update-user-model.d.ts +2 -1
- package/dist/cli/commands/update-user-model.d.ts.map +1 -1
- package/dist/cli/commands/update-user-model.js +31 -45
- package/dist/cli/commands/update-user-model.js.map +1 -1
- package/dist/cli/commands/validate.d.ts +4 -3
- package/dist/cli/commands/validate.d.ts.map +1 -1
- package/dist/cli/commands/validate.js +28 -26
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/session-mining/transcript.d.ts +7 -1
- package/dist/cli/session-mining/transcript.d.ts.map +1 -1
- package/dist/cli/session-mining/transcript.js +21 -14
- package/dist/cli/session-mining/transcript.js.map +1 -1
- package/dist/context/session-manager.d.ts.map +1 -1
- package/dist/context/session-manager.js +19 -32
- package/dist/context/session-manager.js.map +1 -1
- package/dist/core/constraints/agent-prompt-renderer.d.ts.map +1 -1
- package/dist/core/constraints/agent-prompt-renderer.js +1 -4
- package/dist/core/constraints/agent-prompt-renderer.js.map +1 -1
- package/dist/core/constraints/capabilities-parser.d.ts +24 -7
- package/dist/core/constraints/capabilities-parser.d.ts.map +1 -1
- package/dist/core/constraints/capabilities-parser.js +32 -28
- package/dist/core/constraints/capabilities-parser.js.map +1 -1
- package/dist/core/constraints/capabilities-reconcile.d.ts +67 -0
- package/dist/core/constraints/capabilities-reconcile.d.ts.map +1 -0
- package/dist/core/constraints/capabilities-reconcile.js +105 -0
- package/dist/core/constraints/capabilities-reconcile.js.map +1 -0
- package/dist/core/constraints/checker.d.ts +21 -43
- package/dist/core/constraints/checker.d.ts.map +1 -1
- package/dist/core/constraints/checker.js +64 -115
- package/dist/core/constraints/checker.js.map +1 -1
- package/dist/core/constraints/checkers/capability-sync.d.ts +4 -3
- package/dist/core/constraints/checkers/capability-sync.d.ts.map +1 -1
- package/dist/core/constraints/checkers/capability-sync.js +29 -69
- package/dist/core/constraints/checkers/capability-sync.js.map +1 -1
- package/dist/core/constraints/checkers/context-doc-sync.d.ts +4 -2
- package/dist/core/constraints/checkers/context-doc-sync.d.ts.map +1 -1
- package/dist/core/constraints/checkers/context-doc-sync.js +13 -22
- package/dist/core/constraints/checkers/context-doc-sync.js.map +1 -1
- package/dist/core/constraints/checkers/docs-freshness.d.ts.map +1 -1
- package/dist/core/constraints/checkers/docs-freshness.js +37 -63
- package/dist/core/constraints/checkers/docs-freshness.js.map +1 -1
- package/dist/core/constraints/checkers/governance-presence.d.ts +2 -2
- package/dist/core/constraints/checkers/governance-presence.d.ts.map +1 -1
- package/dist/core/constraints/checkers/governance-presence.js +7 -28
- package/dist/core/constraints/checkers/governance-presence.js.map +1 -1
- package/dist/core/constraints/checkers/no-test-simplification.d.ts.map +1 -1
- package/dist/core/constraints/checkers/no-test-simplification.js +4 -3
- package/dist/core/constraints/checkers/no-test-simplification.js.map +1 -1
- package/dist/core/constraints/checkers/types.d.ts +2 -2
- package/dist/core/constraints/context-builder.d.ts +15 -14
- package/dist/core/constraints/context-builder.d.ts.map +1 -1
- package/dist/core/constraints/context-builder.js +32 -96
- package/dist/core/constraints/context-builder.js.map +1 -1
- package/dist/core/constraints/doc-freshness/runner.d.ts.map +1 -1
- package/dist/core/constraints/doc-freshness/runner.js +2 -1
- package/dist/core/constraints/doc-freshness/runner.js.map +1 -1
- package/dist/core/constraints/git-evidence.d.ts +60 -0
- package/dist/core/constraints/git-evidence.d.ts.map +1 -0
- package/dist/core/constraints/git-evidence.js +88 -0
- package/dist/core/constraints/git-evidence.js.map +1 -0
- package/dist/core/constraints/injection-drift.d.ts +3 -20
- package/dist/core/constraints/injection-drift.d.ts.map +1 -1
- package/dist/core/constraints/injection-drift.js +10 -57
- package/dist/core/constraints/injection-drift.js.map +1 -1
- package/dist/core/constraints/injection-writer.d.ts +113 -0
- package/dist/core/constraints/injection-writer.d.ts.map +1 -0
- package/dist/core/constraints/injection-writer.js +228 -0
- package/dist/core/constraints/injection-writer.js.map +1 -0
- package/dist/core/constraints/usage-report.d.ts +22 -1
- package/dist/core/constraints/usage-report.d.ts.map +1 -1
- package/dist/core/constraints/usage-report.js +27 -20
- package/dist/core/constraints/usage-report.js.map +1 -1
- package/dist/core/index.d.ts +2 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +4 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/project-config-loader.d.ts +32 -1
- package/dist/core/project-config-loader.d.ts.map +1 -1
- package/dist/core/project-config-loader.js +39 -9
- package/dist/core/project-config-loader.js.map +1 -1
- package/dist/core/validators/passes-gate.d.ts +15 -64
- package/dist/core/validators/passes-gate.d.ts.map +1 -1
- package/dist/core/validators/passes-gate.js +84 -222
- package/dist/core/validators/passes-gate.js.map +1 -1
- package/dist/core/validators/test-output.d.ts +58 -0
- package/dist/core/validators/test-output.d.ts.map +1 -0
- package/dist/core/validators/test-output.js +109 -0
- package/dist/core/validators/test-output.js.map +1 -0
- package/dist/failure/recorder.d.ts +6 -0
- package/dist/failure/recorder.d.ts.map +1 -1
- package/dist/failure/recorder.js +12 -8
- package/dist/failure/recorder.js.map +1 -1
- package/dist/gates/acceptance.d.ts +1 -48
- package/dist/gates/acceptance.d.ts.map +1 -1
- package/dist/gates/acceptance.js +6 -38
- package/dist/gates/acceptance.js.map +1 -1
- package/dist/gates/checker-gate.d.ts.map +1 -1
- package/dist/gates/checker-gate.js +6 -11
- package/dist/gates/checker-gate.js.map +1 -1
- package/dist/gates/command.d.ts.map +1 -1
- package/dist/gates/command.js +10 -22
- package/dist/gates/command.js.map +1 -1
- package/dist/gates/contract.d.ts.map +1 -1
- package/dist/gates/contract.js +22 -61
- package/dist/gates/contract.js.map +1 -1
- package/dist/gates/performance.d.ts.map +1 -1
- package/dist/gates/performance.js +13 -31
- package/dist/gates/performance.js.map +1 -1
- package/dist/gates/review.d.ts.map +1 -1
- package/dist/gates/review.js +21 -53
- package/dist/gates/review.js.map +1 -1
- package/dist/gates/security.d.ts.map +1 -1
- package/dist/gates/security.js +14 -32
- package/dist/gates/security.js.map +1 -1
- package/dist/gates/types.d.ts +28 -5
- package/dist/gates/types.d.ts.map +1 -1
- package/dist/gates/types.js +38 -1
- package/dist/gates/types.js.map +1 -1
- package/dist/hooks/bootstrap.d.ts +2 -0
- package/dist/hooks/bootstrap.d.ts.map +1 -1
- package/dist/hooks/bootstrap.js +5 -2
- package/dist/hooks/bootstrap.js.map +1 -1
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/knowledge/audit.d.ts +7 -2
- package/dist/knowledge/audit.d.ts.map +1 -1
- package/dist/knowledge/audit.js +59 -79
- package/dist/knowledge/audit.js.map +1 -1
- package/dist/knowledge/flywheel-metrics.d.ts +39 -0
- package/dist/knowledge/flywheel-metrics.d.ts.map +1 -0
- package/dist/knowledge/flywheel-metrics.js +47 -0
- package/dist/knowledge/flywheel-metrics.js.map +1 -0
- package/dist/knowledge/import.d.ts.map +1 -1
- package/dist/knowledge/import.js +4 -14
- package/dist/knowledge/import.js.map +1 -1
- package/dist/knowledge/index-generator.d.ts.map +1 -1
- package/dist/knowledge/index-generator.js +17 -14
- package/dist/knowledge/index-generator.js.map +1 -1
- package/dist/knowledge/ingest.d.ts.map +1 -1
- package/dist/knowledge/ingest.js +9 -4
- package/dist/knowledge/ingest.js.map +1 -1
- package/dist/knowledge/migration.d.ts.map +1 -1
- package/dist/knowledge/migration.js +11 -8
- package/dist/knowledge/migration.js.map +1 -1
- package/dist/knowledge/reference-tracker.d.ts.map +1 -1
- package/dist/knowledge/reference-tracker.js +12 -9
- package/dist/knowledge/reference-tracker.js.map +1 -1
- package/dist/knowledge/store.d.ts +15 -0
- package/dist/knowledge/store.d.ts.map +1 -1
- package/dist/knowledge/store.js +59 -10
- package/dist/knowledge/store.js.map +1 -1
- package/dist/monitoring/context-tracker.d.ts.map +1 -1
- package/dist/monitoring/context-tracker.js +11 -20
- package/dist/monitoring/context-tracker.js.map +1 -1
- package/dist/monitoring/index.d.ts +1 -1
- package/dist/monitoring/index.d.ts.map +1 -1
- package/dist/monitoring/index.js +1 -2
- package/dist/monitoring/index.js.map +1 -1
- package/dist/monitoring/trace-analyzer.d.ts +15 -0
- package/dist/monitoring/trace-analyzer.d.ts.map +1 -1
- package/dist/monitoring/trace-analyzer.js +19 -2
- package/dist/monitoring/trace-analyzer.js.map +1 -1
- package/dist/monitoring/traces.d.ts +21 -2
- package/dist/monitoring/traces.d.ts.map +1 -1
- package/dist/monitoring/traces.js +38 -29
- package/dist/monitoring/traces.js.map +1 -1
- package/dist/release/index.d.ts +2 -2
- package/dist/release/index.d.ts.map +1 -1
- package/dist/release/index.js +1 -5
- package/dist/release/index.js.map +1 -1
- package/dist/sdd/index-generator.js +10 -11
- package/dist/sdd/index-generator.js.map +1 -1
- package/dist/test-setup/project-fixture.d.ts +48 -0
- package/dist/test-setup/project-fixture.d.ts.map +1 -0
- package/dist/test-setup/project-fixture.js +106 -0
- package/dist/test-setup/project-fixture.js.map +1 -0
- package/dist/types/constraint.d.ts +0 -18
- package/dist/types/constraint.d.ts.map +1 -1
- package/dist/types/constraint.js.map +1 -1
- package/dist/types/passes-gate.d.ts +10 -25
- package/dist/types/passes-gate.d.ts.map +1 -1
- package/dist/types/project-config.d.ts +1 -1
- package/dist/types/session.d.ts +6 -5
- package/dist/types/session.d.ts.map +1 -1
- package/dist/utils/exec.d.ts +10 -0
- package/dist/utils/exec.d.ts.map +1 -1
- package/dist/utils/exec.js +12 -0
- package/dist/utils/exec.js.map +1 -1
- package/dist/utils/file-walk.d.ts +9 -1
- package/dist/utils/file-walk.d.ts.map +1 -1
- package/dist/utils/file-walk.js +10 -1
- package/dist/utils/file-walk.js.map +1 -1
- package/dist/utils/frontmatter.d.ts +73 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +141 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/jsonl.d.ts +92 -0
- package/dist/utils/jsonl.d.ts.map +1 -0
- package/dist/utils/jsonl.js +166 -0
- package/dist/utils/jsonl.js.map +1 -0
- package/dist/utils/package-version.d.ts +16 -0
- package/dist/utils/package-version.d.ts.map +1 -0
- package/dist/utils/package-version.js +63 -0
- package/dist/utils/package-version.js.map +1 -0
- package/package.json +1 -1
- package/src/CONTEXT.md +7 -2
- package/src/__tests__/acceptance-gate.test.ts +3 -1
- package/src/__tests__/checker-extra.test.ts +7 -1218
- package/src/__tests__/context-files-resolution.test.ts +116 -0
- package/src/__tests__/effective-constraints.test.ts +10 -13
- package/src/__tests__/exec.test.ts +35 -1
- package/src/__tests__/layering.test.ts +152 -0
- package/src/__tests__/passes-gate-extra.test.ts +0 -145
- package/src/__tests__/passes-gate.test.ts +142 -106
- package/src/__tests__/skip-semantics.test.ts +5 -9
- package/src/cli/__tests__/command-contract.test.ts +170 -0
- package/src/cli/command-contract.ts +108 -0
- package/src/cli/commands/CONTEXT.md +22 -7
- package/src/cli/commands/__tests__/acceptance.test.ts +40 -33
- package/src/cli/commands/__tests__/analyze-sessions.test.ts +35 -29
- package/src/cli/commands/__tests__/bin-exit-mapping.test.ts +101 -0
- package/src/cli/commands/__tests__/check-drift.test.ts +27 -34
- package/src/cli/commands/__tests__/check-skip-output.test.ts +21 -24
- package/src/cli/commands/__tests__/check.test.ts +378 -382
- package/src/cli/commands/__tests__/command.test.ts +85 -70
- package/src/cli/commands/__tests__/constraints-report.test.ts +100 -71
- package/src/cli/commands/__tests__/constraints-retire.test.ts +152 -95
- package/src/cli/commands/__tests__/contract.test.ts +27 -34
- package/src/cli/commands/__tests__/failure.test.ts +31 -34
- package/src/cli/commands/__tests__/init-injection.test.ts +58 -28
- package/src/cli/commands/__tests__/init.test.ts +77 -48
- package/src/cli/commands/__tests__/knowledge-flywheel-consistency.test.ts +108 -0
- package/src/cli/commands/__tests__/knowledge.test.ts +69 -43
- package/src/cli/commands/__tests__/passes-gate.test.ts +43 -45
- package/src/cli/commands/__tests__/performance.test.ts +22 -23
- package/src/cli/commands/__tests__/posteval-plan.test.ts +39 -38
- package/src/cli/commands/__tests__/project-path-anchoring.test.ts +157 -0
- package/src/cli/commands/__tests__/project-path-convention.test.ts +169 -0
- package/src/cli/commands/__tests__/registry.test.ts +69 -35
- package/src/cli/commands/__tests__/release.test.ts +209 -80
- package/src/cli/commands/__tests__/report-extra.test.ts +16 -16
- package/src/cli/commands/__tests__/report.test.ts +25 -25
- package/src/cli/commands/__tests__/review.test.ts +33 -31
- package/src/cli/commands/__tests__/security.test.ts +23 -27
- package/src/cli/commands/__tests__/spec-baseline-check.test.ts +20 -20
- package/src/cli/commands/__tests__/spec.test.ts +41 -29
- package/src/cli/commands/__tests__/status-extra.test.ts +18 -18
- package/src/cli/commands/__tests__/status-skipped-lines.test.ts +72 -0
- package/src/cli/commands/__tests__/status.test.ts +34 -34
- package/src/cli/commands/__tests__/sync-docs-agents.test.ts +77 -78
- package/src/cli/commands/__tests__/sync-docs.test.ts +72 -74
- package/src/cli/commands/__tests__/update-user-model.test.ts +62 -33
- package/src/cli/commands/__tests__/validate.test.ts +27 -29
- package/src/cli/commands/acceptance.ts +35 -24
- package/src/cli/commands/analyze-sessions.ts +25 -24
- package/src/cli/commands/check.ts +88 -65
- package/src/cli/commands/command.ts +30 -17
- package/src/cli/commands/constraints-report.ts +37 -34
- package/src/cli/commands/constraints-retire.ts +58 -55
- package/src/cli/commands/constraints.ts +10 -27
- package/src/cli/commands/contract.ts +51 -42
- package/src/cli/commands/definitions.ts +36 -222
- package/src/cli/commands/failure.ts +33 -26
- package/src/cli/commands/init.ts +166 -220
- package/src/cli/commands/knowledge.ts +225 -203
- package/src/cli/commands/passes-gate.ts +58 -68
- package/src/cli/commands/performance.ts +23 -18
- package/src/cli/commands/posteval-plan.ts +29 -15
- package/src/cli/commands/release.ts +70 -59
- package/src/cli/commands/report.ts +9 -5
- package/src/cli/commands/review.ts +39 -29
- package/src/cli/commands/sdd.ts +7 -5
- package/src/cli/commands/security.ts +35 -26
- package/src/cli/commands/spec-baseline-check.ts +16 -11
- package/src/cli/commands/spec.ts +66 -53
- package/src/cli/commands/status.ts +59 -53
- package/src/cli/commands/sync-docs/agents-syncer.ts +5 -2
- package/src/cli/commands/sync-docs/context-syncer.ts +3 -2
- package/src/cli/commands/sync-docs/index.ts +73 -100
- package/src/cli/commands/sync-docs/project-reader.ts +17 -18
- package/src/cli/commands/update-user-model.ts +33 -45
- package/src/cli/commands/validate.ts +31 -25
- package/src/cli/session-mining/__tests__/transcript.test.ts +118 -0
- package/src/cli/session-mining/transcript.ts +26 -8
- package/src/context/session-manager.ts +19 -33
- package/src/core/CONTEXT.md +9 -6
- package/src/core/constraints/__tests__/capabilities-reconcile.test.ts +200 -0
- package/src/core/constraints/__tests__/capability-counts.test.ts +94 -0
- package/src/core/constraints/__tests__/git-evidence.test.ts +208 -0
- package/src/core/constraints/__tests__/injection-drift.test.ts +3 -10
- package/src/core/constraints/__tests__/injection-writer.test.ts +231 -0
- package/src/core/constraints/__tests__/trace-injection.test.ts +71 -0
- package/src/core/constraints/__tests__/usage-report.test.ts +112 -0
- package/src/core/constraints/agent-prompt-renderer.ts +2 -6
- package/src/core/constraints/capabilities-parser.ts +53 -35
- package/src/core/constraints/capabilities-reconcile.ts +166 -0
- package/src/core/constraints/checker.ts +75 -130
- package/src/core/constraints/checkers/__tests__/capability-sync.test.ts +214 -0
- package/src/core/constraints/checkers/__tests__/context-doc-sync.test.ts +77 -0
- package/src/core/constraints/checkers/__tests__/docs-freshness.test.ts +117 -0
- package/src/{__tests__ → core/constraints/checkers/__tests__}/governance-presence.test.ts +83 -9
- package/src/core/constraints/checkers/__tests__/iron-flags.test.ts +50 -0
- package/src/core/constraints/checkers/__tests__/no-bypass-checkpoint.test.ts +76 -0
- package/src/{__tests__ → core/constraints/checkers/__tests__}/no-hardcoded-credentials.test.ts +4 -3
- package/src/core/constraints/checkers/__tests__/no-test-simplification.test.ts +58 -0
- package/src/core/constraints/checkers/__tests__/three-state-consistency.test.ts +145 -0
- package/src/core/constraints/checkers/capability-sync.ts +29 -88
- package/src/core/constraints/checkers/context-doc-sync.ts +15 -25
- package/src/core/constraints/checkers/docs-freshness.ts +40 -69
- package/src/core/constraints/checkers/governance-presence.ts +7 -25
- package/src/core/constraints/checkers/no-test-simplification.ts +4 -3
- package/src/core/constraints/checkers/types.ts +2 -2
- package/src/core/constraints/context-builder.ts +39 -91
- package/src/core/constraints/doc-freshness/runner.ts +2 -1
- package/src/core/constraints/git-evidence.ts +120 -0
- package/src/core/constraints/injection-drift.ts +13 -60
- package/src/core/constraints/injection-writer.ts +212 -0
- package/src/core/constraints/usage-report.ts +36 -17
- package/src/core/index.ts +4 -2
- package/src/core/project-config-loader.ts +49 -9
- package/src/core/validators/__tests__/passes-gate.test.ts +2 -56
- package/src/core/validators/__tests__/test-output.test.ts +372 -0
- package/src/core/validators/passes-gate.ts +86 -248
- package/src/core/validators/test-output.ts +128 -0
- package/src/failure/__tests__/recorder.test.ts +168 -0
- package/src/failure/recorder.ts +12 -10
- package/src/gates/CONTEXT.md +6 -3
- package/src/gates/__tests__/acceptance-types-single-source.test.ts +68 -0
- package/src/gates/__tests__/acceptance.test.ts +4 -86
- package/src/gates/__tests__/effective-gates.test.ts +3 -8
- package/src/gates/__tests__/test-verdict-consistency.test.ts +140 -0
- package/src/gates/acceptance.ts +19 -84
- package/src/gates/checker-gate.ts +8 -7
- package/src/gates/command.ts +10 -16
- package/src/gates/contract.ts +22 -61
- package/src/gates/performance.ts +10 -22
- package/src/gates/review.ts +21 -41
- package/src/gates/security.ts +10 -22
- package/src/gates/types.ts +70 -5
- package/src/hooks/CONTEXT.md +1 -1
- package/src/hooks/bootstrap.ts +5 -2
- package/src/index.ts +0 -4
- package/src/knowledge/CONTEXT.md +8 -3
- package/src/knowledge/__tests__/audit-labels.test.ts +44 -0
- package/src/knowledge/__tests__/flywheel-metrics.test.ts +135 -0
- package/src/knowledge/__tests__/import.test.ts +44 -0
- package/src/knowledge/__tests__/index-generator.test.ts +53 -0
- package/src/knowledge/__tests__/ingest.test.ts +85 -0
- package/src/knowledge/__tests__/migration.test.ts +47 -0
- package/src/knowledge/__tests__/reference-tracker.test.ts +16 -0
- package/src/knowledge/__tests__/store.test.ts +194 -0
- package/src/knowledge/audit.ts +67 -71
- package/src/knowledge/flywheel-metrics.ts +71 -0
- package/src/knowledge/import.ts +4 -18
- package/src/knowledge/index-generator.ts +19 -14
- package/src/knowledge/ingest.ts +9 -4
- package/src/knowledge/migration.ts +11 -8
- package/src/knowledge/reference-tracker.ts +12 -8
- package/src/knowledge/store.ts +64 -11
- package/src/monitoring/CONTEXT.md +8 -3
- package/src/monitoring/__tests__/skipped-lines-report.test.ts +178 -0
- package/src/monitoring/__tests__/traces.test.ts +57 -0
- package/src/monitoring/context-tracker.ts +11 -23
- package/src/monitoring/index.ts +1 -1
- package/src/monitoring/trace-analyzer.ts +21 -2
- package/src/monitoring/traces.ts +39 -36
- package/src/release/CONTEXT.md +1 -0
- package/src/release/__tests__/barrel.test.ts +60 -0
- package/src/release/index.ts +2 -13
- package/src/sdd/__tests__/index-generator.test.ts +71 -0
- package/src/sdd/index-generator.ts +9 -9
- package/src/test-setup/__tests__/project-fixture.test.ts +178 -0
- package/src/test-setup/project-fixture.ts +87 -0
- package/src/tools/CONTEXT.md +6 -0
- package/src/tools/__tests__/registry.test.ts +221 -0
- package/src/types/__tests__/types.test.ts +4 -5
- package/src/types/constraint.ts +0 -25
- package/src/types/passes-gate.ts +10 -30
- package/src/types/project-config.ts +1 -1
- package/src/types/session.ts +5 -5
- package/src/utils/__tests__/frontmatter.test.ts +206 -0
- package/src/utils/__tests__/jsonl-skip-disposition.test.ts +175 -0
- package/src/utils/__tests__/jsonl.test.ts +187 -0
- package/src/utils/__tests__/package-version.test.ts +97 -0
- package/src/utils/exec.ts +15 -0
- package/src/utils/file-walk.ts +11 -2
- package/src/utils/frontmatter.ts +121 -0
- package/src/utils/jsonl.ts +167 -0
- package/src/utils/package-version.ts +27 -0
- package/dist/cli/commands/doc-freshness-check.d.ts +0 -53
- package/dist/cli/commands/doc-freshness-check.d.ts.map +0 -1
- package/dist/cli/commands/doc-freshness-check.js +0 -352
- package/dist/cli/commands/doc-freshness-check.js.map +0 -1
- package/dist/types/index.d.ts +0 -14
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -39
- package/dist/types/index.js.map +0 -1
- package/src/__tests__/long-running.test.ts +0 -17
- package/src/__tests__/passes-gate-extension.test.ts +0 -151
- package/src/cli/commands/__tests__/doc-freshness-check.test.ts +0 -168
- package/src/cli/commands/doc-freshness-check.ts +0 -386
- package/src/spec/CONTEXT.md +0 -11
- package/src/types/index.ts +0 -47
package/dist/utils/exec.js
CHANGED
|
@@ -42,6 +42,7 @@ exports.execAsync = void 0;
|
|
|
42
42
|
exports.runCommand = runCommand;
|
|
43
43
|
exports.isCommandAvailable = isCommandAvailable;
|
|
44
44
|
exports.normalizeTriggers = normalizeTriggers;
|
|
45
|
+
exports.matchesTrigger = matchesTrigger;
|
|
45
46
|
exports.delay = delay;
|
|
46
47
|
const child_process_1 = require("child_process");
|
|
47
48
|
const util_1 = require("util");
|
|
@@ -87,6 +88,17 @@ function normalizeTriggers(value, fallback = []) {
|
|
|
87
88
|
return fallback;
|
|
88
89
|
return Array.isArray(value) ? value : [value];
|
|
89
90
|
}
|
|
91
|
+
/**
|
|
92
|
+
* 判断约束是否匹配当前操作集合(#105:trigger 匹配语义单一来源)
|
|
93
|
+
*
|
|
94
|
+
* 语义 = normalizeTriggers(undefined → [] 不匹配任何操作)+ 交集判定,
|
|
95
|
+
* 任一 operation 命中任一 trigger 即匹配。checker 与 prompt 渲染共用本函数,
|
|
96
|
+
* 禁止就地重写。
|
|
97
|
+
*/
|
|
98
|
+
function matchesTrigger(constraint, operations) {
|
|
99
|
+
const triggers = normalizeTriggers(constraint.trigger);
|
|
100
|
+
return operations.some(op => triggers.includes(op));
|
|
101
|
+
}
|
|
90
102
|
/**
|
|
91
103
|
* 异步延迟
|
|
92
104
|
*/
|
package/dist/utils/exec.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/utils/exec.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaH,gCAUC;AAKD,gDAUC;AAKD,8CAMC;AAKD,sBAEC;
|
|
1
|
+
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/utils/exec.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaH,gCAUC;AAKD,gDAUC;AAKD,8CAMC;AASD,wCAMC;AAKD,sBAEC;AArED,iDAAqC;AACrC,+BAAiC;AAEjC;;GAEG;AACU,QAAA,SAAS,GAAG,IAAA,gBAAS,EAAC,oBAAI,CAAC,CAAC;AAEzC;;GAEG;AACI,KAAK,UAAU,UAAU,CAAC,OAAe,EAAE,GAAY;IAC5D,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,iBAAS,EAAC,OAAO,EAAE;YAC1C,GAAG;YACH,SAAS,EAAE,IAAI,GAAG,IAAI,EAAE,aAAa;SACtC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,kBAAkB,CAAC,OAAe;IACtD,IAAI,CAAC;QACH,mCAAmC;QACnC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,wDAAa,eAAe,GAAC,CAAC;QAC/D,MAAM,aAAa,GAAG,IAAA,gBAAS,EAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,aAAa,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAC/B,KAA0B,EAC1B,WAAgB,EAAE;IAElB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,QAAQ,CAAC;IAC3D,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAChD,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,cAAc,CAC5B,UAA4C,EAC5C,UAAe;IAEf,MAAM,QAAQ,GAAG,iBAAiB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACvD,OAAO,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,SAAgB,KAAK,CAAC,EAAU;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -18,12 +18,20 @@ export interface FileWalkOptions {
|
|
|
18
18
|
* 目录不可读时静默跳过(与原各处实现行为一致)。
|
|
19
19
|
*/
|
|
20
20
|
export declare function walkFiles(root: string, options?: FileWalkOptions): string[];
|
|
21
|
+
/**
|
|
22
|
+
* 目录遍历默认跳过名单:依赖 / 旁测目录 / 构建产物。
|
|
23
|
+
*
|
|
24
|
+
* 遍历跳过口径的正本——chain 式判断(sync-docs 的 readdir 循环)与
|
|
25
|
+
* findTsSourceFiles 的 skipDirs 默认值同源,禁止再各处手抄三段 `===`。
|
|
26
|
+
* 各调用方自有的更广名单(如 AGENTS.md 目录表跳过 build/out/coverage)不并入。
|
|
27
|
+
*/
|
|
28
|
+
export declare const DEFAULT_SKIP_DIRS: string[];
|
|
21
29
|
export interface TsSourceWalkOptions {
|
|
22
30
|
/** 是否跳过 barrel 文件 index.ts,默认 false */
|
|
23
31
|
skipIndex?: boolean;
|
|
24
32
|
/** 是否同时收集 .tsx 文件,默认 false(只收集 .ts) */
|
|
25
33
|
includeTsx?: boolean;
|
|
26
|
-
/** 跳过的目录名,默认
|
|
34
|
+
/** 跳过的目录名,默认 DEFAULT_SKIP_DIRS */
|
|
27
35
|
skipDirs?: string[];
|
|
28
36
|
/** 是否跳过 `.` 开头的条目,默认 false */
|
|
29
37
|
skipHidden?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-walk.d.ts","sourceRoot":"","sources":["../../src/utils/file-walk.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,eAAe;IAC9B,uBAAuB;IACvB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,8BAA8B;IAC9B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gCAAgC;IAChC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;CAC1D;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,MAAM,EAAE,CA0B/E;AAED,MAAM,WAAW,mBAAmB;IAClC,uCAAuC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,uCAAuC;IACvC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,
|
|
1
|
+
{"version":3,"file":"file-walk.d.ts","sourceRoot":"","sources":["../../src/utils/file-walk.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,eAAe;IAC9B,uBAAuB;IACvB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,8BAA8B;IAC9B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gCAAgC;IAChC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;CAC1D;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,MAAM,EAAE,CA0B/E;AAED;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,UAAwC,CAAC;AAEvE,MAAM,WAAW,mBAAmB;IAClC,uCAAuC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,uCAAuC;IACvC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,8BAA8B;IAC9B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GAC1D,OAAO,CAOT;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,MAAM,EAAE,CAa3F"}
|
package/dist/utils/file-walk.js
CHANGED
|
@@ -39,6 +39,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
39
39
|
};
|
|
40
40
|
})();
|
|
41
41
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.DEFAULT_SKIP_DIRS = void 0;
|
|
42
43
|
exports.walkFiles = walkFiles;
|
|
43
44
|
exports.isTsSourceFile = isTsSourceFile;
|
|
44
45
|
exports.findTsSourceFiles = findTsSourceFiles;
|
|
@@ -76,6 +77,14 @@ function walkFiles(root, options = {}) {
|
|
|
76
77
|
}
|
|
77
78
|
return results;
|
|
78
79
|
}
|
|
80
|
+
/**
|
|
81
|
+
* 目录遍历默认跳过名单:依赖 / 旁测目录 / 构建产物。
|
|
82
|
+
*
|
|
83
|
+
* 遍历跳过口径的正本——chain 式判断(sync-docs 的 readdir 循环)与
|
|
84
|
+
* findTsSourceFiles 的 skipDirs 默认值同源,禁止再各处手抄三段 `===`。
|
|
85
|
+
* 各调用方自有的更广名单(如 AGENTS.md 目录表跳过 build/out/coverage)不并入。
|
|
86
|
+
*/
|
|
87
|
+
exports.DEFAULT_SKIP_DIRS = ['node_modules', '__tests__', 'dist'];
|
|
79
88
|
/**
|
|
80
89
|
* 文件名是否为 TypeScript 源文件(includeTsx 时含 .tsx,排除 .d.ts 与可选 barrel index)
|
|
81
90
|
*
|
|
@@ -92,7 +101,7 @@ function isTsSourceFile(name, options = {}) {
|
|
|
92
101
|
* 递归收集 TypeScript 源文件(.ts,includeTsx 时含 .tsx,排除 .d.ts)
|
|
93
102
|
*/
|
|
94
103
|
function findTsSourceFiles(root, options = {}) {
|
|
95
|
-
const { skipIndex = false, includeTsx = false, skipDirs =
|
|
104
|
+
const { skipIndex = false, includeTsx = false, skipDirs = exports.DEFAULT_SKIP_DIRS, skipHidden = false, } = options;
|
|
96
105
|
return walkFiles(root, {
|
|
97
106
|
skipDirs,
|
|
98
107
|
skipHidden,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-walk.js","sourceRoot":"","sources":["../../src/utils/file-walk.ts"],"names":[],"mappings":";AAAA;;;;;GAKG
|
|
1
|
+
{"version":3,"file":"file-walk.js","sourceRoot":"","sources":["../../src/utils/file-walk.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBH,8BA0BC;AA4BD,wCAUC;AAKD,8CAaC;AAnGD,uCAAyB;AACzB,2CAA6B;AAW7B;;;;GAIG;AACH,SAAgB,SAAS,CAAC,IAAY,EAAE,UAA2B,EAAE;IACnE,MAAM,EAAE,QAAQ,GAAG,EAAE,EAAE,UAAU,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC9D,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,IAAI,OAAoB,CAAC;IACzB,IAAI,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QACvD,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,SAAS;QAE5C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QAChD,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1B,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;gBAC5C,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACU,QAAA,iBAAiB,GAAG,CAAC,cAAc,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;AAavE;;;;;GAKG;AACH,SAAgB,cAAc,CAC5B,IAAY,EACZ,UAAyD,EAAE;IAE3D,MAAM,EAAE,SAAS,GAAG,KAAK,EAAE,UAAU,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAC1D,OAAO,CACL,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/D,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QACvB,CAAC,CAAC,SAAS,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,WAAW,CAAC,CAAC,CAC9D,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,IAAY,EAAE,UAA+B,EAAE;IAC/E,MAAM,EACJ,SAAS,GAAG,KAAK,EACjB,UAAU,GAAG,KAAK,EAClB,QAAQ,GAAG,yBAAiB,EAC5B,UAAU,GAAG,KAAK,GACnB,GAAG,OAAO,CAAC;IAEZ,OAAO,SAAS,CAAC,IAAI,EAAE;QACrB,QAAQ;QACR,UAAU;QACV,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;KAClE,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* markdown frontmatter 解析/序列化正本(harness#89,架构评审 2026-09-02 候选10)
|
|
3
|
+
*
|
|
4
|
+
* `---\n<yaml>\n---\n<body>` 这一种语法此前在 knowledge 域 5 个文件里手写了 7 遍,
|
|
5
|
+
* 失败语义三派并存(store 静默丢条目 / migration 记 errors / index-generator 走
|
|
6
|
+
* best-effort / sdd 不要求闭合行完整 / ingest 只 strip 会把正文 `---` 误吞)。
|
|
7
|
+
* 语法与失败走法在此一处定义,仓内不允许存在第二份副本。
|
|
8
|
+
*
|
|
9
|
+
* 语法(唯一解释):
|
|
10
|
+
* - 开界:偏移 0 处必须正好是一行 `---`(前面有空白行则不算 frontmatter)
|
|
11
|
+
* - 闭界:其后第一个**独立成行**的 `---`(`---x`、`----`、缩进 `---` 均不作闭合)
|
|
12
|
+
* - body:闭合行之后全部内容,紧随的一个空行被吃掉(与 join 的 `---\n\n` 包裹严格对称,
|
|
13
|
+
* 保证已落盘条目 load→save 字节稳定)
|
|
14
|
+
* - meta:闭合前的行经 YAML 解析,必须是 mapping
|
|
15
|
+
* - CRLF 文件不按 frontmatter 处理(与收口前各消费方一致,本 module 不新增解释)
|
|
16
|
+
*
|
|
17
|
+
* 三种畸形输入的走法(裁决 2,用例固定在 utils/__tests__/frontmatter.test.ts):
|
|
18
|
+
* - 缺 frontmatter(无开界)→ 'absent'
|
|
19
|
+
* - 空 meta(闭合前只有空白,含零宽块)→ 'absent'——零宽元数据块不承载信息,
|
|
20
|
+
* 与「没有 frontmatter」同走一支,消费方按无元数据路径处理(store 视为非条目、
|
|
21
|
+
* index-generator 走 best-effort),无需上报
|
|
22
|
+
* - 未闭合(有开无闭 / 闭合行不完整)→ 'malformed' + reason 'unterminated'
|
|
23
|
+
* - meta 不是合法 YAML mapping(语法错、显式 null、标量或数组)→ 'malformed' + reason 'invalid-yaml'
|
|
24
|
+
*
|
|
25
|
+
* 消费方统一口径(裁决 2:不允许两派并存):'malformed' 两支必须**显式上报**,
|
|
26
|
+
* 禁止静默丢数据;恢复动作按消费方语义选择并在代码里写明——
|
|
27
|
+
* 有结构化报告面的写报告(migration → result.errors),
|
|
28
|
+
* 纯扫描型的打一行 stderr(前缀 `[harness]`,与 failure/recorder.ts 的坏行告警同构)
|
|
29
|
+
* 后跳过或走 best-effort。'absent' 是合法输入,不上报。
|
|
30
|
+
*
|
|
31
|
+
* 序列化(裁决 3:收格式不收字段排序策略):join 只负责包裹与 YAML dump 参数
|
|
32
|
+
* (lineWidth 120,与收口前 store/migration 逐字一致);canonical 字段序是 store 的
|
|
33
|
+
* 私有策略,留在 store.toFrontmatter。
|
|
34
|
+
*
|
|
35
|
+
* 机械核查(期望命中数,均已实测):
|
|
36
|
+
* grep -rnE '/\^---' src --include='*.ts' | grep -v __tests__
|
|
37
|
+
* → 期望 0 处:手写开界正则归零
|
|
38
|
+
* grep -rn "'---'" src --include='*.ts' | grep -v __tests__
|
|
39
|
+
* → 期望 1 处:本文件 DELIMITER
|
|
40
|
+
* grep -rn "yaml.load(metaText)\|yaml.dump(meta," src --include='*.ts' | grep -v __tests__
|
|
41
|
+
* → 期望 2 处:本文件 split 的 load + join 的 dump
|
|
42
|
+
* 豁免清单(不属 frontmatter,不改):markdown 生成物里的 `---` 分隔线与表格分隔行
|
|
43
|
+
* (init / sync-docs / report / constraints-report 模板)、doc-freshness 的章节定位正则
|
|
44
|
+
* (`\n---` 是章节边界)、config.yml 与 checkpoint/tasks/progress 的 yaml.dump(单 YAML/JSON 文档)。
|
|
45
|
+
*/
|
|
46
|
+
/** 'malformed' 的两支:消费方必须逐支显式处理(口径见文件头) */
|
|
47
|
+
export type FrontmatterMalformedReason = 'unterminated' | 'invalid-yaml';
|
|
48
|
+
/** frontmatter 元数据(已由 split 保证是 YAML mapping) */
|
|
49
|
+
export type FrontmatterMeta = Record<string, unknown>;
|
|
50
|
+
export type FrontmatterSplit = {
|
|
51
|
+
state: 'ok';
|
|
52
|
+
meta: FrontmatterMeta;
|
|
53
|
+
body: string;
|
|
54
|
+
} | {
|
|
55
|
+
state: 'absent';
|
|
56
|
+
} | {
|
|
57
|
+
state: 'malformed';
|
|
58
|
+
reason: FrontmatterMalformedReason;
|
|
59
|
+
detail: string;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* 解析 markdown 的 YAML frontmatter。
|
|
63
|
+
*
|
|
64
|
+
* 不抛:三种畸形输入与 YAML 非法都体现在返回值 state/reason 上,由消费方按口径处置。
|
|
65
|
+
*/
|
|
66
|
+
export declare function splitFrontmatter(raw: string): FrontmatterSplit;
|
|
67
|
+
/**
|
|
68
|
+
* 序列化为 `---\n<yaml>---\n\n<body>`(包裹格式与收口前 store/migration 逐字一致)。
|
|
69
|
+
*
|
|
70
|
+
* meta 的键序由调用方决定(store 保 canonical 序);本函数只做包裹与 dump 参数。
|
|
71
|
+
*/
|
|
72
|
+
export declare function joinFrontmatter(meta: FrontmatterMeta, body: string): string;
|
|
73
|
+
//# sourceMappingURL=frontmatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../../src/utils/frontmatter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAUH,0CAA0C;AAC1C,MAAM,MAAM,0BAA0B,GAAG,cAAc,GAAG,cAAc,CAAC;AAEzE,iDAAiD;AACjD,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEtD,MAAM,MAAM,gBAAgB,GACxB;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,eAAe,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,KAAK,EAAE,QAAQ,CAAA;CAAE,GACnB;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,0BAA0B,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/E;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAyC9D;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3E"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* markdown frontmatter 解析/序列化正本(harness#89,架构评审 2026-09-02 候选10)
|
|
4
|
+
*
|
|
5
|
+
* `---\n<yaml>\n---\n<body>` 这一种语法此前在 knowledge 域 5 个文件里手写了 7 遍,
|
|
6
|
+
* 失败语义三派并存(store 静默丢条目 / migration 记 errors / index-generator 走
|
|
7
|
+
* best-effort / sdd 不要求闭合行完整 / ingest 只 strip 会把正文 `---` 误吞)。
|
|
8
|
+
* 语法与失败走法在此一处定义,仓内不允许存在第二份副本。
|
|
9
|
+
*
|
|
10
|
+
* 语法(唯一解释):
|
|
11
|
+
* - 开界:偏移 0 处必须正好是一行 `---`(前面有空白行则不算 frontmatter)
|
|
12
|
+
* - 闭界:其后第一个**独立成行**的 `---`(`---x`、`----`、缩进 `---` 均不作闭合)
|
|
13
|
+
* - body:闭合行之后全部内容,紧随的一个空行被吃掉(与 join 的 `---\n\n` 包裹严格对称,
|
|
14
|
+
* 保证已落盘条目 load→save 字节稳定)
|
|
15
|
+
* - meta:闭合前的行经 YAML 解析,必须是 mapping
|
|
16
|
+
* - CRLF 文件不按 frontmatter 处理(与收口前各消费方一致,本 module 不新增解释)
|
|
17
|
+
*
|
|
18
|
+
* 三种畸形输入的走法(裁决 2,用例固定在 utils/__tests__/frontmatter.test.ts):
|
|
19
|
+
* - 缺 frontmatter(无开界)→ 'absent'
|
|
20
|
+
* - 空 meta(闭合前只有空白,含零宽块)→ 'absent'——零宽元数据块不承载信息,
|
|
21
|
+
* 与「没有 frontmatter」同走一支,消费方按无元数据路径处理(store 视为非条目、
|
|
22
|
+
* index-generator 走 best-effort),无需上报
|
|
23
|
+
* - 未闭合(有开无闭 / 闭合行不完整)→ 'malformed' + reason 'unterminated'
|
|
24
|
+
* - meta 不是合法 YAML mapping(语法错、显式 null、标量或数组)→ 'malformed' + reason 'invalid-yaml'
|
|
25
|
+
*
|
|
26
|
+
* 消费方统一口径(裁决 2:不允许两派并存):'malformed' 两支必须**显式上报**,
|
|
27
|
+
* 禁止静默丢数据;恢复动作按消费方语义选择并在代码里写明——
|
|
28
|
+
* 有结构化报告面的写报告(migration → result.errors),
|
|
29
|
+
* 纯扫描型的打一行 stderr(前缀 `[harness]`,与 failure/recorder.ts 的坏行告警同构)
|
|
30
|
+
* 后跳过或走 best-effort。'absent' 是合法输入,不上报。
|
|
31
|
+
*
|
|
32
|
+
* 序列化(裁决 3:收格式不收字段排序策略):join 只负责包裹与 YAML dump 参数
|
|
33
|
+
* (lineWidth 120,与收口前 store/migration 逐字一致);canonical 字段序是 store 的
|
|
34
|
+
* 私有策略,留在 store.toFrontmatter。
|
|
35
|
+
*
|
|
36
|
+
* 机械核查(期望命中数,均已实测):
|
|
37
|
+
* grep -rnE '/\^---' src --include='*.ts' | grep -v __tests__
|
|
38
|
+
* → 期望 0 处:手写开界正则归零
|
|
39
|
+
* grep -rn "'---'" src --include='*.ts' | grep -v __tests__
|
|
40
|
+
* → 期望 1 处:本文件 DELIMITER
|
|
41
|
+
* grep -rn "yaml.load(metaText)\|yaml.dump(meta," src --include='*.ts' | grep -v __tests__
|
|
42
|
+
* → 期望 2 处:本文件 split 的 load + join 的 dump
|
|
43
|
+
* 豁免清单(不属 frontmatter,不改):markdown 生成物里的 `---` 分隔线与表格分隔行
|
|
44
|
+
* (init / sync-docs / report / constraints-report 模板)、doc-freshness 的章节定位正则
|
|
45
|
+
* (`\n---` 是章节边界)、config.yml 与 checkpoint/tasks/progress 的 yaml.dump(单 YAML/JSON 文档)。
|
|
46
|
+
*/
|
|
47
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
48
|
+
if (k2 === undefined) k2 = k;
|
|
49
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
50
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
51
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
52
|
+
}
|
|
53
|
+
Object.defineProperty(o, k2, desc);
|
|
54
|
+
}) : (function(o, m, k, k2) {
|
|
55
|
+
if (k2 === undefined) k2 = k;
|
|
56
|
+
o[k2] = m[k];
|
|
57
|
+
}));
|
|
58
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
59
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
60
|
+
}) : function(o, v) {
|
|
61
|
+
o["default"] = v;
|
|
62
|
+
});
|
|
63
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
64
|
+
var ownKeys = function(o) {
|
|
65
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
66
|
+
var ar = [];
|
|
67
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
68
|
+
return ar;
|
|
69
|
+
};
|
|
70
|
+
return ownKeys(o);
|
|
71
|
+
};
|
|
72
|
+
return function (mod) {
|
|
73
|
+
if (mod && mod.__esModule) return mod;
|
|
74
|
+
var result = {};
|
|
75
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
76
|
+
__setModuleDefault(result, mod);
|
|
77
|
+
return result;
|
|
78
|
+
};
|
|
79
|
+
})();
|
|
80
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
81
|
+
exports.splitFrontmatter = splitFrontmatter;
|
|
82
|
+
exports.joinFrontmatter = joinFrontmatter;
|
|
83
|
+
const yaml = __importStar(require("js-yaml"));
|
|
84
|
+
/** frontmatter 界符(整行) */
|
|
85
|
+
const DELIMITER = '---';
|
|
86
|
+
/** 与收口前 store/migration 逐字一致的 YAML dump 行宽 */
|
|
87
|
+
const DUMP_LINE_WIDTH = 120;
|
|
88
|
+
/**
|
|
89
|
+
* 解析 markdown 的 YAML frontmatter。
|
|
90
|
+
*
|
|
91
|
+
* 不抛:三种畸形输入与 YAML 非法都体现在返回值 state/reason 上,由消费方按口径处置。
|
|
92
|
+
*/
|
|
93
|
+
function splitFrontmatter(raw) {
|
|
94
|
+
const lines = raw.split('\n');
|
|
95
|
+
if (lines[0] !== DELIMITER)
|
|
96
|
+
return { state: 'absent' };
|
|
97
|
+
const closeIndex = lines.indexOf(DELIMITER, 1);
|
|
98
|
+
if (closeIndex === -1) {
|
|
99
|
+
return {
|
|
100
|
+
state: 'malformed',
|
|
101
|
+
reason: 'unterminated',
|
|
102
|
+
detail: `开界之后缺少独立成行的 ${DELIMITER} 闭合行`,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
const metaLines = lines.slice(1, closeIndex);
|
|
106
|
+
if (metaLines.every(line => line.trim().length === 0))
|
|
107
|
+
return { state: 'absent' };
|
|
108
|
+
const metaText = metaLines.join('\n');
|
|
109
|
+
let parsed;
|
|
110
|
+
try {
|
|
111
|
+
parsed = yaml.load(metaText);
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
return {
|
|
115
|
+
state: 'malformed',
|
|
116
|
+
reason: 'invalid-yaml',
|
|
117
|
+
// js-yaml 的 message 带多行代码片段,detail 只取首行描述——消费方要嵌进单行报告/stderr
|
|
118
|
+
detail: (error instanceof Error ? error.message : String(error)).split('\n')[0],
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
122
|
+
return {
|
|
123
|
+
state: 'malformed',
|
|
124
|
+
reason: 'invalid-yaml',
|
|
125
|
+
detail: `frontmatter 必须是 YAML mapping,实际是 ${Array.isArray(parsed) ? 'array' : typeof parsed}`,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
let bodyStart = closeIndex + 1;
|
|
129
|
+
if (lines[bodyStart] === '')
|
|
130
|
+
bodyStart++;
|
|
131
|
+
return { state: 'ok', meta: parsed, body: lines.slice(bodyStart).join('\n') };
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* 序列化为 `---\n<yaml>---\n\n<body>`(包裹格式与收口前 store/migration 逐字一致)。
|
|
135
|
+
*
|
|
136
|
+
* meta 的键序由调用方决定(store 保 canonical 序);本函数只做包裹与 dump 参数。
|
|
137
|
+
*/
|
|
138
|
+
function joinFrontmatter(meta, body) {
|
|
139
|
+
return `${DELIMITER}\n${yaml.dump(meta, { lineWidth: DUMP_LINE_WIDTH })}${DELIMITER}\n\n${body}`;
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=frontmatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/utils/frontmatter.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BH,4CAyCC;AAOD,0CAEC;AA1ED,8CAAgC;AAEhC,yBAAyB;AACzB,MAAM,SAAS,GAAG,KAAK,CAAC;AAExB,8CAA8C;AAC9C,MAAM,eAAe,GAAG,GAAG,CAAC;AAa5B;;;;GAIG;AACH,SAAgB,gBAAgB,CAAC,GAAW;IAC1C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAEvD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAC/C,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;QACtB,OAAO;YACL,KAAK,EAAE,WAAW;YAClB,MAAM,EAAE,cAAc;YACtB,MAAM,EAAE,eAAe,SAAS,MAAM;SACvC,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAC7C,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAElF,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,KAAK,EAAE,WAAW;YAClB,MAAM,EAAE,cAAc;YACtB,6DAA6D;YAC7D,MAAM,EAAE,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SAChF,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3E,OAAO;YACL,KAAK,EAAE,WAAW;YAClB,MAAM,EAAE,cAAc;YACtB,MAAM,EAAE,oCAAoC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,MAAM,EAAE;SAC9F,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,GAAG,UAAU,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,CAAC;IAEzC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAyB,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACnG,CAAC;AAED;;;;GAIG;AACH,SAAgB,eAAe,CAAC,IAAqB,EAAE,IAAY;IACjE,OAAO,GAAG,SAAS,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,GAAG,SAAS,OAAO,IAAI,EAAE,CAAC;AACnG,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* append-only JSONL 日志读写正本(harness#82,架构评审 2026-09-02 候选3)
|
|
3
|
+
*
|
|
4
|
+
* 全仓 append-only JSONL(traces.log / failures.log / context-tracker.log /
|
|
5
|
+
* references.jsonl / sessions/<id>/events.jsonl / 外部 transcript .jsonl)的
|
|
6
|
+
* exists → read → split → parse → filter 读链与 ensureDir + append 写链
|
|
7
|
+
* 收口于此,仓内不允许存在第二份副本。
|
|
8
|
+
*
|
|
9
|
+
* 坏行策略(harness#82 裁决 1):读入口 policy 为显式必填参数,类型层面无缺省,
|
|
10
|
+
* 每个调用点必须逐一声明 'skip' | 'throw'——既不让「静默丢数据」成为框架缺省,
|
|
11
|
+
* 也不反转既有容错调用点的语义。坏行指非空但 JSON.parse 失败的行
|
|
12
|
+
* (半写入截断、手工编辑、磁盘满等)。
|
|
13
|
+
*
|
|
14
|
+
* tail / head:只解析尾部 / 头部 N 个非空行(文件仍全量读取,parse 才是大头),
|
|
15
|
+
* 供「只看最近 K 条」的调用点避免全量 parse(check 等热路径)。
|
|
16
|
+
* countJsonlLines 供纯计数消费方(完全不 parse)。
|
|
17
|
+
*
|
|
18
|
+
* 计数去向(harness#100):本模块是坏行计数的唯一正本,但正本≠终点——凡以 'skip'
|
|
19
|
+
* 策略读,调用点必须把 skippedLines 带到该消费面的用户可见输出(CLI 走 stderr,
|
|
20
|
+
* 结构化输出与 API 走字段),或显式记名豁免并写明理由。机器可检面:
|
|
21
|
+
* `src/utils/__tests__/jsonl-skip-disposition.test.ts`(冻结站点集合 + 要求每个读点
|
|
22
|
+
* 上方声明 `计数去向:`)。
|
|
23
|
+
*
|
|
24
|
+
* 豁免清单与机械核查(期望命中数):
|
|
25
|
+
* grep -rnE "JSON\.parse\((line|trimmed|l)\b" src --include='*.ts' | grep -v __tests__
|
|
26
|
+
* → 期望 1 处:本文件 readJsonl(读链正本本体)
|
|
27
|
+
* grep -rn "map(JSON.parse" src --include='*.ts' | grep -v __tests__
|
|
28
|
+
* → 期望 0 处
|
|
29
|
+
* __tests__ 下的坏行 fixture 不在核查范围。
|
|
30
|
+
* 其余裁决豁免:readIfExists(injection-writer,string|null 形态不同,#82 裁决 3);
|
|
31
|
+
* FailureRecorder 轮换链(文件生命周期不变量,裁决 2);
|
|
32
|
+
* 单 JSON 文档读取(package.json / .state.json / checkpoint.json / summary 等非 JSONL)。
|
|
33
|
+
*/
|
|
34
|
+
/**
|
|
35
|
+
* 坏行策略
|
|
36
|
+
*
|
|
37
|
+
* - 'skip':跳过损坏行,继续解析;skippedLines 计数
|
|
38
|
+
* - 'throw':损坏行直接上抛(沿用原抛语义的调用点显式选择)
|
|
39
|
+
*/
|
|
40
|
+
export type JsonlBadLinePolicy = 'skip' | 'throw';
|
|
41
|
+
export interface JsonlReadResult<T> {
|
|
42
|
+
records: T[];
|
|
43
|
+
/**
|
|
44
|
+
* 被跳过的坏行数('throw' 策略下恒为 0)
|
|
45
|
+
*
|
|
46
|
+
* 拿到它不等于告知:skip 读点必须把它带到消费面的用户可见输出或记名豁免(harness#100)
|
|
47
|
+
*/
|
|
48
|
+
skippedLines: number;
|
|
49
|
+
}
|
|
50
|
+
export interface JsonlReadOptions {
|
|
51
|
+
/** 只解析最后 N 个非空行(尾部读取) */
|
|
52
|
+
tail?: number;
|
|
53
|
+
/** 只解析前 N 个非空行(头部读取) */
|
|
54
|
+
head?: number;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* 读取 JSONL 文件:exists → read → split → parse → filter(正本读链)
|
|
58
|
+
*
|
|
59
|
+
* policy 必填无缺省(裁决 1);缺文件返回空结果,不抛。
|
|
60
|
+
*/
|
|
61
|
+
export declare function readJsonl<T>(filePath: string, policy: JsonlBadLinePolicy, options?: JsonlReadOptions): JsonlReadResult<T>;
|
|
62
|
+
/**
|
|
63
|
+
* 统计非空行数(含坏行,完全不 parse)
|
|
64
|
+
*
|
|
65
|
+
* 供只关心记录条数的调用点(如 check 智能提示)避免全量 parse;
|
|
66
|
+
* 缺文件返回 0。
|
|
67
|
+
*/
|
|
68
|
+
export declare function countJsonlLines(filePath: string): number;
|
|
69
|
+
export interface JsonlEndsResult<T> {
|
|
70
|
+
/** 原始非空行数(合法 + 坏行),与 records.length + skippedLines 同口径 */
|
|
71
|
+
totalLines: number;
|
|
72
|
+
/** 自首向尾第一条合法记录;无合法记录为 undefined */
|
|
73
|
+
first?: T;
|
|
74
|
+
/** 自尾向首第一条合法记录;无合法记录为 undefined */
|
|
75
|
+
last?: T;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* 只取首尾:首/末条合法记录 + 原始行数,parse 停在两端首个合法行
|
|
79
|
+
*
|
|
80
|
+
* 供只要「总数 + 首末记录」的调用点(如 TraceCollector.getStats)避免全量
|
|
81
|
+
* parse;行文本仍整读(10MB 级文本读廉价,JSON.parse 才是成本)。坏行策略
|
|
82
|
+
* 同 readJsonl:'skip' 跳过继续找,'throw' 遇坏行上抛。缺文件返回
|
|
83
|
+
* { totalLines: 0 }。
|
|
84
|
+
*/
|
|
85
|
+
export declare function readJsonlEnds<T>(filePath: string, policy: JsonlBadLinePolicy): JsonlEndsResult<T>;
|
|
86
|
+
/**
|
|
87
|
+
* 追加一条 JSONL 记录:ensureDir + append(正本写链)
|
|
88
|
+
*
|
|
89
|
+
* 目录不存在时递归创建;value 序列化为单行 JSON + 换行。
|
|
90
|
+
*/
|
|
91
|
+
export declare function appendJsonl(filePath: string, value: unknown): void;
|
|
92
|
+
//# sourceMappingURL=jsonl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonl.d.ts","sourceRoot":"","sources":["../../src/utils/jsonl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAKH;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,OAAO,CAAC;AAElD,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,OAAO,EAAE,CAAC,EAAE,CAAC;IACb;;;;OAIG;IACH,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,yBAAyB;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wBAAwB;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAWD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,CAAC,EACzB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,kBAAkB,EAC1B,OAAO,CAAC,EAAE,gBAAgB,GACzB,eAAe,CAAC,CAAC,CAAC,CAoBpB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,KAAK,CAAC,EAAE,CAAC,CAAC;IACV,mCAAmC;IACnC,IAAI,CAAC,EAAE,CAAC,CAAC;CACV;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,eAAe,CAAC,CAAC,CAAC,CAwBjG;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAMlE"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* append-only JSONL 日志读写正本(harness#82,架构评审 2026-09-02 候选3)
|
|
4
|
+
*
|
|
5
|
+
* 全仓 append-only JSONL(traces.log / failures.log / context-tracker.log /
|
|
6
|
+
* references.jsonl / sessions/<id>/events.jsonl / 外部 transcript .jsonl)的
|
|
7
|
+
* exists → read → split → parse → filter 读链与 ensureDir + append 写链
|
|
8
|
+
* 收口于此,仓内不允许存在第二份副本。
|
|
9
|
+
*
|
|
10
|
+
* 坏行策略(harness#82 裁决 1):读入口 policy 为显式必填参数,类型层面无缺省,
|
|
11
|
+
* 每个调用点必须逐一声明 'skip' | 'throw'——既不让「静默丢数据」成为框架缺省,
|
|
12
|
+
* 也不反转既有容错调用点的语义。坏行指非空但 JSON.parse 失败的行
|
|
13
|
+
* (半写入截断、手工编辑、磁盘满等)。
|
|
14
|
+
*
|
|
15
|
+
* tail / head:只解析尾部 / 头部 N 个非空行(文件仍全量读取,parse 才是大头),
|
|
16
|
+
* 供「只看最近 K 条」的调用点避免全量 parse(check 等热路径)。
|
|
17
|
+
* countJsonlLines 供纯计数消费方(完全不 parse)。
|
|
18
|
+
*
|
|
19
|
+
* 计数去向(harness#100):本模块是坏行计数的唯一正本,但正本≠终点——凡以 'skip'
|
|
20
|
+
* 策略读,调用点必须把 skippedLines 带到该消费面的用户可见输出(CLI 走 stderr,
|
|
21
|
+
* 结构化输出与 API 走字段),或显式记名豁免并写明理由。机器可检面:
|
|
22
|
+
* `src/utils/__tests__/jsonl-skip-disposition.test.ts`(冻结站点集合 + 要求每个读点
|
|
23
|
+
* 上方声明 `计数去向:`)。
|
|
24
|
+
*
|
|
25
|
+
* 豁免清单与机械核查(期望命中数):
|
|
26
|
+
* grep -rnE "JSON\.parse\((line|trimmed|l)\b" src --include='*.ts' | grep -v __tests__
|
|
27
|
+
* → 期望 1 处:本文件 readJsonl(读链正本本体)
|
|
28
|
+
* grep -rn "map(JSON.parse" src --include='*.ts' | grep -v __tests__
|
|
29
|
+
* → 期望 0 处
|
|
30
|
+
* __tests__ 下的坏行 fixture 不在核查范围。
|
|
31
|
+
* 其余裁决豁免:readIfExists(injection-writer,string|null 形态不同,#82 裁决 3);
|
|
32
|
+
* FailureRecorder 轮换链(文件生命周期不变量,裁决 2);
|
|
33
|
+
* 单 JSON 文档读取(package.json / .state.json / checkpoint.json / summary 等非 JSONL)。
|
|
34
|
+
*/
|
|
35
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
36
|
+
if (k2 === undefined) k2 = k;
|
|
37
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
38
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
39
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
40
|
+
}
|
|
41
|
+
Object.defineProperty(o, k2, desc);
|
|
42
|
+
}) : (function(o, m, k, k2) {
|
|
43
|
+
if (k2 === undefined) k2 = k;
|
|
44
|
+
o[k2] = m[k];
|
|
45
|
+
}));
|
|
46
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
47
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
48
|
+
}) : function(o, v) {
|
|
49
|
+
o["default"] = v;
|
|
50
|
+
});
|
|
51
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
52
|
+
var ownKeys = function(o) {
|
|
53
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
54
|
+
var ar = [];
|
|
55
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
56
|
+
return ar;
|
|
57
|
+
};
|
|
58
|
+
return ownKeys(o);
|
|
59
|
+
};
|
|
60
|
+
return function (mod) {
|
|
61
|
+
if (mod && mod.__esModule) return mod;
|
|
62
|
+
var result = {};
|
|
63
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
64
|
+
__setModuleDefault(result, mod);
|
|
65
|
+
return result;
|
|
66
|
+
};
|
|
67
|
+
})();
|
|
68
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
69
|
+
exports.readJsonl = readJsonl;
|
|
70
|
+
exports.countJsonlLines = countJsonlLines;
|
|
71
|
+
exports.readJsonlEnds = readJsonlEnds;
|
|
72
|
+
exports.appendJsonl = appendJsonl;
|
|
73
|
+
const fs = __importStar(require("fs"));
|
|
74
|
+
const path = __importStar(require("path"));
|
|
75
|
+
/** exists → read → split → filter 空行的公共前缀(正本唯一一份) */
|
|
76
|
+
function readNonEmptyLines(filePath) {
|
|
77
|
+
if (!fs.existsSync(filePath))
|
|
78
|
+
return [];
|
|
79
|
+
return fs
|
|
80
|
+
.readFileSync(filePath, 'utf-8')
|
|
81
|
+
.split('\n')
|
|
82
|
+
.filter(line => line.trim().length > 0);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* 读取 JSONL 文件:exists → read → split → parse → filter(正本读链)
|
|
86
|
+
*
|
|
87
|
+
* policy 必填无缺省(裁决 1);缺文件返回空结果,不抛。
|
|
88
|
+
*/
|
|
89
|
+
function readJsonl(filePath, policy, options) {
|
|
90
|
+
let lines = readNonEmptyLines(filePath);
|
|
91
|
+
if (options?.head !== undefined) {
|
|
92
|
+
lines = options.head > 0 ? lines.slice(0, options.head) : [];
|
|
93
|
+
}
|
|
94
|
+
if (options?.tail !== undefined) {
|
|
95
|
+
lines = options.tail > 0 ? lines.slice(-options.tail) : [];
|
|
96
|
+
}
|
|
97
|
+
const records = [];
|
|
98
|
+
let skippedLines = 0;
|
|
99
|
+
for (const line of lines) {
|
|
100
|
+
try {
|
|
101
|
+
records.push(JSON.parse(line));
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
if (policy === 'throw')
|
|
105
|
+
throw error;
|
|
106
|
+
skippedLines++;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return { records, skippedLines };
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* 统计非空行数(含坏行,完全不 parse)
|
|
113
|
+
*
|
|
114
|
+
* 供只关心记录条数的调用点(如 check 智能提示)避免全量 parse;
|
|
115
|
+
* 缺文件返回 0。
|
|
116
|
+
*/
|
|
117
|
+
function countJsonlLines(filePath) {
|
|
118
|
+
return readNonEmptyLines(filePath).length;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* 只取首尾:首/末条合法记录 + 原始行数,parse 停在两端首个合法行
|
|
122
|
+
*
|
|
123
|
+
* 供只要「总数 + 首末记录」的调用点(如 TraceCollector.getStats)避免全量
|
|
124
|
+
* parse;行文本仍整读(10MB 级文本读廉价,JSON.parse 才是成本)。坏行策略
|
|
125
|
+
* 同 readJsonl:'skip' 跳过继续找,'throw' 遇坏行上抛。缺文件返回
|
|
126
|
+
* { totalLines: 0 }。
|
|
127
|
+
*/
|
|
128
|
+
function readJsonlEnds(filePath, policy) {
|
|
129
|
+
const lines = readNonEmptyLines(filePath);
|
|
130
|
+
let first;
|
|
131
|
+
for (let i = 0; i < lines.length; i++) {
|
|
132
|
+
try {
|
|
133
|
+
first = JSON.parse(lines[i]);
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
if (policy === 'throw')
|
|
138
|
+
throw error;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
let last;
|
|
142
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
143
|
+
try {
|
|
144
|
+
last = JSON.parse(lines[i]);
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
if (policy === 'throw')
|
|
149
|
+
throw error;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return { totalLines: lines.length, first, last };
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* 追加一条 JSONL 记录:ensureDir + append(正本写链)
|
|
156
|
+
*
|
|
157
|
+
* 目录不存在时递归创建;value 序列化为单行 JSON + 换行。
|
|
158
|
+
*/
|
|
159
|
+
function appendJsonl(filePath, value) {
|
|
160
|
+
const dir = path.dirname(filePath);
|
|
161
|
+
if (!fs.existsSync(dir)) {
|
|
162
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
163
|
+
}
|
|
164
|
+
fs.appendFileSync(filePath, JSON.stringify(value) + '\n', 'utf-8');
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=jsonl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonl.js","sourceRoot":"","sources":["../../src/utils/jsonl.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CH,8BAwBC;AAQD,0CAEC;AAmBD,sCAwBC;AAOD,kCAMC;AApID,uCAAyB;AACzB,2CAA6B;AA2B7B,qDAAqD;AACrD,SAAS,iBAAiB,CAAC,QAAgB;IACzC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,OAAO,EAAE;SACN,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC;SAC/B,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,SAAgB,SAAS,CACvB,QAAgB,EAChB,MAA0B,EAC1B,OAA0B;IAE1B,IAAI,KAAK,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,OAAO,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;QAChC,KAAK,GAAG,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/D,CAAC;IACD,IAAI,OAAO,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;QAChC,KAAK,GAAG,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,CAAC;IAED,MAAM,OAAO,GAAQ,EAAE,CAAC;IACxB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,MAAM,KAAK,OAAO;gBAAE,MAAM,KAAK,CAAC;YACpC,YAAY,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;AACnC,CAAC;AAED;;;;;GAKG;AACH,SAAgB,eAAe,CAAC,QAAgB;IAC9C,OAAO,iBAAiB,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;AAC5C,CAAC;AAWD;;;;;;;GAOG;AACH,SAAgB,aAAa,CAAI,QAAgB,EAAE,MAA0B;IAC3E,MAAM,KAAK,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAE1C,IAAI,KAAoB,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAM,CAAC;YAClC,MAAM;QACR,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,MAAM,KAAK,OAAO;gBAAE,MAAM,KAAK,CAAC;QACtC,CAAC;IACH,CAAC;IAED,IAAI,IAAmB,CAAC;IACxB,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAM,CAAC;YACjC,MAAM;QACR,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,MAAM,KAAK,OAAO;gBAAE,MAAM,KAAK,CAAC;QACtC,CAAC;IACH,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACnD,CAAC;AAED;;;;GAIG;AACH,SAAgB,WAAW,CAAC,QAAgB,EAAE,KAAc;IAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* harness 包版本读取正本(#102,架构评审 A3)
|
|
3
|
+
*
|
|
4
|
+
* 「harness 包版本」此前散在四处五种写法(constraints.ts 带 cwd 兜底、init.ts
|
|
5
|
+
* require 与内联各一份、injection-drift.ts / constraints-retire.ts __dirname
|
|
6
|
+
* 相对路径)。其中 cwd 兜底在 harness 装进消费者 node_modules 且相对路径失败时
|
|
7
|
+
* 会读到**消费者自己的版本号**——这是本模块要消灭的 bug。语义在此一处定义:
|
|
8
|
+
*
|
|
9
|
+
* - 只读本模块自身的 package.json(__dirname 相对;src 与 dist 目录深度一致,
|
|
10
|
+
* 两种加载方式命中同一份清单);
|
|
11
|
+
* - 无 cwd 兜底——cwd 的 package.json 是消费者项目的,不是 harness 的;
|
|
12
|
+
* - 清单缺失/损坏/无 version 字段 → 'unknown'(沿用收口前各处一致语义)。
|
|
13
|
+
*/
|
|
14
|
+
/** 读取 harness 包版本;读不到(缺失/损坏/无 version 字段)返回 'unknown' */
|
|
15
|
+
export declare function getHarnessPackageVersion(): string;
|
|
16
|
+
//# sourceMappingURL=package-version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-version.d.ts","sourceRoot":"","sources":["../../src/utils/package-version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,yDAAyD;AACzD,wBAAgB,wBAAwB,IAAI,MAAM,CAQjD"}
|