@accelerator-mzq/forge 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/LICENSE +21 -0
- package/LICENSE-THIRD-PARTY.md +50 -0
- package/README.md +159 -0
- package/dist/cli/commands/ack.d.ts +7 -0
- package/dist/cli/commands/ack.d.ts.map +1 -0
- package/dist/cli/commands/ack.js +223 -0
- package/dist/cli/commands/ack.js.map +1 -0
- package/dist/cli/commands/archive.d.ts +44 -0
- package/dist/cli/commands/archive.d.ts.map +1 -0
- package/dist/cli/commands/archive.js +689 -0
- package/dist/cli/commands/archive.js.map +1 -0
- package/dist/cli/commands/backlog.d.ts +3 -0
- package/dist/cli/commands/backlog.d.ts.map +1 -0
- package/dist/cli/commands/backlog.js +55 -0
- package/dist/cli/commands/backlog.js.map +1 -0
- package/dist/cli/commands/config.d.ts +3 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +107 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/evidence.d.ts +7 -0
- package/dist/cli/commands/evidence.d.ts.map +1 -0
- package/dist/cli/commands/evidence.js +662 -0
- package/dist/cli/commands/evidence.js.map +1 -0
- package/dist/cli/commands/finding.d.ts +3 -0
- package/dist/cli/commands/finding.d.ts.map +1 -0
- package/dist/cli/commands/finding.js +93 -0
- package/dist/cli/commands/finding.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +126 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/legacy-bridge.d.ts +11 -0
- package/dist/cli/commands/legacy-bridge.d.ts.map +1 -0
- package/dist/cli/commands/legacy-bridge.js +586 -0
- package/dist/cli/commands/legacy-bridge.js.map +1 -0
- package/dist/cli/commands/migrate.d.ts +3 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -0
- package/dist/cli/commands/migrate.js +34 -0
- package/dist/cli/commands/migrate.js.map +1 -0
- package/dist/cli/commands/monitor.d.ts +3 -0
- package/dist/cli/commands/monitor.d.ts.map +1 -0
- package/dist/cli/commands/monitor.js +113 -0
- package/dist/cli/commands/monitor.js.map +1 -0
- package/dist/cli/commands/preflight.d.ts +7 -0
- package/dist/cli/commands/preflight.d.ts.map +1 -0
- package/dist/cli/commands/preflight.js +63 -0
- package/dist/cli/commands/preflight.js.map +1 -0
- package/dist/cli/commands/scope.d.ts +3 -0
- package/dist/cli/commands/scope.d.ts.map +1 -0
- package/dist/cli/commands/scope.js +32 -0
- package/dist/cli/commands/scope.js.map +1 -0
- package/dist/cli/commands/stage-extensions.d.ts +45 -0
- package/dist/cli/commands/stage-extensions.d.ts.map +1 -0
- package/dist/cli/commands/stage-extensions.js +590 -0
- package/dist/cli/commands/stage-extensions.js.map +1 -0
- package/dist/cli/commands/update.d.ts +3 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +98 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/commands/upgrade.d.ts +3 -0
- package/dist/cli/commands/upgrade.d.ts.map +1 -0
- package/dist/cli/commands/upgrade.js +277 -0
- package/dist/cli/commands/upgrade.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +3 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +66 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +69 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/ack-log.d.ts +107 -0
- package/dist/core/ack-log.d.ts.map +1 -0
- package/dist/core/ack-log.js +197 -0
- package/dist/core/ack-log.js.map +1 -0
- package/dist/core/archive/ack-log-consistency.d.ts +15 -0
- package/dist/core/archive/ack-log-consistency.d.ts.map +1 -0
- package/dist/core/archive/ack-log-consistency.js +164 -0
- package/dist/core/archive/ack-log-consistency.js.map +1 -0
- package/dist/core/archive/fence.d.ts +66 -0
- package/dist/core/archive/fence.d.ts.map +1 -0
- package/dist/core/archive/fence.js +218 -0
- package/dist/core/archive/fence.js.map +1 -0
- package/dist/core/archive/index.d.ts +4 -0
- package/dist/core/archive/index.d.ts.map +1 -0
- package/dist/core/archive/index.js +6 -0
- package/dist/core/archive/index.js.map +1 -0
- package/dist/core/archive/legacy-exemption.d.ts +14 -0
- package/dist/core/archive/legacy-exemption.d.ts.map +1 -0
- package/dist/core/archive/legacy-exemption.js +82 -0
- package/dist/core/archive/legacy-exemption.js.map +1 -0
- package/dist/core/archive/lock.d.ts +46 -0
- package/dist/core/archive/lock.d.ts.map +1 -0
- package/dist/core/archive/lock.js +98 -0
- package/dist/core/archive/lock.js.map +1 -0
- package/dist/core/archive/pause-decisions-fence.d.ts +13 -0
- package/dist/core/archive/pause-decisions-fence.d.ts.map +1 -0
- package/dist/core/archive/pause-decisions-fence.js +384 -0
- package/dist/core/archive/pause-decisions-fence.js.map +1 -0
- package/dist/core/archive/process-evidence-fence.d.ts +110 -0
- package/dist/core/archive/process-evidence-fence.d.ts.map +1 -0
- package/dist/core/archive/process-evidence-fence.js +449 -0
- package/dist/core/archive/process-evidence-fence.js.map +1 -0
- package/dist/core/archive/process-evidence-rerun.d.ts +9 -0
- package/dist/core/archive/process-evidence-rerun.d.ts.map +1 -0
- package/dist/core/archive/process-evidence-rerun.js +238 -0
- package/dist/core/archive/process-evidence-rerun.js.map +1 -0
- package/dist/core/archive/recover-prompt.d.ts +10 -0
- package/dist/core/archive/recover-prompt.d.ts.map +1 -0
- package/dist/core/archive/recover-prompt.js +29 -0
- package/dist/core/archive/recover-prompt.js.map +1 -0
- package/dist/core/archive/recover.d.ts +83 -0
- package/dist/core/archive/recover.d.ts.map +1 -0
- package/dist/core/archive/recover.js +219 -0
- package/dist/core/archive/recover.js.map +1 -0
- package/dist/core/archive/resume-summary.d.ts +22 -0
- package/dist/core/archive/resume-summary.d.ts.map +1 -0
- package/dist/core/archive/resume-summary.js +82 -0
- package/dist/core/archive/resume-summary.js.map +1 -0
- package/dist/core/archive/summary-builder.d.ts +28 -0
- package/dist/core/archive/summary-builder.d.ts.map +1 -0
- package/dist/core/archive/summary-builder.js +287 -0
- package/dist/core/archive/summary-builder.js.map +1 -0
- package/dist/core/archive/summary-render.d.ts +8 -0
- package/dist/core/archive/summary-render.d.ts.map +1 -0
- package/dist/core/archive/summary-render.js +64 -0
- package/dist/core/archive/summary-render.js.map +1 -0
- package/dist/core/archive/three-level-fence.d.ts +10 -0
- package/dist/core/archive/three-level-fence.d.ts.map +1 -0
- package/dist/core/archive/three-level-fence.js +93 -0
- package/dist/core/archive/three-level-fence.js.map +1 -0
- package/dist/core/archive/transaction.d.ts +41 -0
- package/dist/core/archive/transaction.d.ts.map +1 -0
- package/dist/core/archive/transaction.js +184 -0
- package/dist/core/archive/transaction.js.map +1 -0
- package/dist/core/archive/verify-findings-fence.d.ts +11 -0
- package/dist/core/archive/verify-findings-fence.d.ts.map +1 -0
- package/dist/core/archive/verify-findings-fence.js +80 -0
- package/dist/core/archive/verify-findings-fence.js.map +1 -0
- package/dist/core/archive/version-retrograde-fence.d.ts +10 -0
- package/dist/core/archive/version-retrograde-fence.d.ts.map +1 -0
- package/dist/core/archive/version-retrograde-fence.js +103 -0
- package/dist/core/archive/version-retrograde-fence.js.map +1 -0
- package/dist/core/artifact-graph/builder.d.ts +16 -0
- package/dist/core/artifact-graph/builder.d.ts.map +1 -0
- package/dist/core/artifact-graph/builder.js +32 -0
- package/dist/core/artifact-graph/builder.js.map +1 -0
- package/dist/core/artifact-graph/index.d.ts +3 -0
- package/dist/core/artifact-graph/index.d.ts.map +1 -0
- package/dist/core/artifact-graph/index.js +4 -0
- package/dist/core/artifact-graph/index.js.map +1 -0
- package/dist/core/artifact-graph/types.d.ts +14 -0
- package/dist/core/artifact-graph/types.d.ts.map +1 -0
- package/dist/core/artifact-graph/types.js +2 -0
- package/dist/core/artifact-graph/types.js.map +1 -0
- package/dist/core/backlog/assets/backlog-readme.md +11 -0
- package/dist/core/backlog/index.d.ts +20 -0
- package/dist/core/backlog/index.d.ts.map +1 -0
- package/dist/core/backlog/index.js +60 -0
- package/dist/core/backlog/index.js.map +1 -0
- package/dist/core/backlog/render.d.ts +51 -0
- package/dist/core/backlog/render.d.ts.map +1 -0
- package/dist/core/backlog/render.js +196 -0
- package/dist/core/backlog/render.js.map +1 -0
- package/dist/core/bootstrap/index.d.ts +2 -0
- package/dist/core/bootstrap/index.d.ts.map +1 -0
- package/dist/core/bootstrap/index.js +5 -0
- package/dist/core/bootstrap/index.js.map +1 -0
- package/dist/core/canonical-json.d.ts +11 -0
- package/dist/core/canonical-json.d.ts.map +1 -0
- package/dist/core/canonical-json.js +43 -0
- package/dist/core/canonical-json.js.map +1 -0
- package/dist/core/git/utils.d.ts +27 -0
- package/dist/core/git/utils.d.ts.map +1 -0
- package/dist/core/git/utils.js +53 -0
- package/dist/core/git/utils.js.map +1 -0
- package/dist/core/harness-adapters/claude.d.ts +13 -0
- package/dist/core/harness-adapters/claude.d.ts.map +1 -0
- package/dist/core/harness-adapters/claude.js +53 -0
- package/dist/core/harness-adapters/claude.js.map +1 -0
- package/dist/core/harness-adapters/codex.d.ts +14 -0
- package/dist/core/harness-adapters/codex.d.ts.map +1 -0
- package/dist/core/harness-adapters/codex.js +60 -0
- package/dist/core/harness-adapters/codex.js.map +1 -0
- package/dist/core/harness-adapters/detector.d.ts +15 -0
- package/dist/core/harness-adapters/detector.d.ts.map +1 -0
- package/dist/core/harness-adapters/detector.js +45 -0
- package/dist/core/harness-adapters/detector.js.map +1 -0
- package/dist/core/harness-adapters/hash-compare.d.ts +21 -0
- package/dist/core/harness-adapters/hash-compare.d.ts.map +1 -0
- package/dist/core/harness-adapters/hash-compare.js +49 -0
- package/dist/core/harness-adapters/hash-compare.js.map +1 -0
- package/dist/core/harness-adapters/index.d.ts +8 -0
- package/dist/core/harness-adapters/index.d.ts.map +1 -0
- package/dist/core/harness-adapters/index.js +8 -0
- package/dist/core/harness-adapters/index.js.map +1 -0
- package/dist/core/harness-adapters/interface.d.ts +52 -0
- package/dist/core/harness-adapters/interface.d.ts.map +1 -0
- package/dist/core/harness-adapters/interface.js +3 -0
- package/dist/core/harness-adapters/interface.js.map +1 -0
- package/dist/core/harness-adapters/legacy-detector.d.ts +14 -0
- package/dist/core/harness-adapters/legacy-detector.d.ts.map +1 -0
- package/dist/core/harness-adapters/legacy-detector.js +83 -0
- package/dist/core/harness-adapters/legacy-detector.js.map +1 -0
- package/dist/core/harness-adapters/transaction.d.ts +12 -0
- package/dist/core/harness-adapters/transaction.d.ts.map +1 -0
- package/dist/core/harness-adapters/transaction.js +113 -0
- package/dist/core/harness-adapters/transaction.js.map +1 -0
- package/dist/core/harness-adapters/types.d.ts +45 -0
- package/dist/core/harness-adapters/types.d.ts.map +1 -0
- package/dist/core/harness-adapters/types.js +3 -0
- package/dist/core/harness-adapters/types.js.map +1 -0
- package/dist/core/hash/content.d.ts +10 -0
- package/dist/core/hash/content.d.ts.map +1 -0
- package/dist/core/hash/content.js +131 -0
- package/dist/core/hash/content.js.map +1 -0
- package/dist/core/hash/diff.d.ts +26 -0
- package/dist/core/hash/diff.d.ts.map +1 -0
- package/dist/core/hash/diff.js +40 -0
- package/dist/core/hash/diff.js.map +1 -0
- package/dist/core/hash/index.d.ts +6 -0
- package/dist/core/hash/index.d.ts.map +1 -0
- package/dist/core/hash/index.js +7 -0
- package/dist/core/hash/index.js.map +1 -0
- package/dist/core/hash/log.d.ts +7 -0
- package/dist/core/hash/log.d.ts.map +1 -0
- package/dist/core/hash/log.js +14 -0
- package/dist/core/hash/log.js.map +1 -0
- package/dist/core/hash/tasks.d.ts +9 -0
- package/dist/core/hash/tasks.d.ts.map +1 -0
- package/dist/core/hash/tasks.js +20 -0
- package/dist/core/hash/tasks.js.map +1 -0
- package/dist/core/legacy-bridge/ack.d.ts +30 -0
- package/dist/core/legacy-bridge/ack.d.ts.map +1 -0
- package/dist/core/legacy-bridge/ack.js +133 -0
- package/dist/core/legacy-bridge/ack.js.map +1 -0
- package/dist/core/legacy-bridge/anchors.d.ts +15 -0
- package/dist/core/legacy-bridge/anchors.d.ts.map +1 -0
- package/dist/core/legacy-bridge/anchors.js +119 -0
- package/dist/core/legacy-bridge/anchors.js.map +1 -0
- package/dist/core/legacy-bridge/budget.d.ts +39 -0
- package/dist/core/legacy-bridge/budget.d.ts.map +1 -0
- package/dist/core/legacy-bridge/budget.js +83 -0
- package/dist/core/legacy-bridge/budget.js.map +1 -0
- package/dist/core/legacy-bridge/conflict.d.ts +44 -0
- package/dist/core/legacy-bridge/conflict.d.ts.map +1 -0
- package/dist/core/legacy-bridge/conflict.js +105 -0
- package/dist/core/legacy-bridge/conflict.js.map +1 -0
- package/dist/core/legacy-bridge/diff-report.d.ts +14 -0
- package/dist/core/legacy-bridge/diff-report.d.ts.map +1 -0
- package/dist/core/legacy-bridge/diff-report.js +105 -0
- package/dist/core/legacy-bridge/diff-report.js.map +1 -0
- package/dist/core/legacy-bridge/encoding.d.ts +42 -0
- package/dist/core/legacy-bridge/encoding.d.ts.map +1 -0
- package/dist/core/legacy-bridge/encoding.js +104 -0
- package/dist/core/legacy-bridge/encoding.js.map +1 -0
- package/dist/core/legacy-bridge/excel.d.ts +32 -0
- package/dist/core/legacy-bridge/excel.d.ts.map +1 -0
- package/dist/core/legacy-bridge/excel.js +124 -0
- package/dist/core/legacy-bridge/excel.js.map +1 -0
- package/dist/core/legacy-bridge/hash-anchor.d.ts +23 -0
- package/dist/core/legacy-bridge/hash-anchor.d.ts.map +1 -0
- package/dist/core/legacy-bridge/hash-anchor.js +55 -0
- package/dist/core/legacy-bridge/hash-anchor.js.map +1 -0
- package/dist/core/legacy-bridge/indexer.d.ts +28 -0
- package/dist/core/legacy-bridge/indexer.d.ts.map +1 -0
- package/dist/core/legacy-bridge/indexer.js +145 -0
- package/dist/core/legacy-bridge/indexer.js.map +1 -0
- package/dist/core/legacy-bridge/mapper.d.ts +40 -0
- package/dist/core/legacy-bridge/mapper.d.ts.map +1 -0
- package/dist/core/legacy-bridge/mapper.js +241 -0
- package/dist/core/legacy-bridge/mapper.js.map +1 -0
- package/dist/core/legacy-bridge/quality-judge.d.ts +65 -0
- package/dist/core/legacy-bridge/quality-judge.d.ts.map +1 -0
- package/dist/core/legacy-bridge/quality-judge.js +277 -0
- package/dist/core/legacy-bridge/quality-judge.js.map +1 -0
- package/dist/core/legacy-bridge/redact.d.ts +28 -0
- package/dist/core/legacy-bridge/redact.d.ts.map +1 -0
- package/dist/core/legacy-bridge/redact.js +121 -0
- package/dist/core/legacy-bridge/redact.js.map +1 -0
- package/dist/core/legacy-bridge/regenerator.d.ts +50 -0
- package/dist/core/legacy-bridge/regenerator.d.ts.map +1 -0
- package/dist/core/legacy-bridge/regenerator.js +193 -0
- package/dist/core/legacy-bridge/regenerator.js.map +1 -0
- package/dist/core/legacy-bridge/resolve.d.ts +28 -0
- package/dist/core/legacy-bridge/resolve.d.ts.map +1 -0
- package/dist/core/legacy-bridge/resolve.js +75 -0
- package/dist/core/legacy-bridge/resolve.js.map +1 -0
- package/dist/core/legacy-bridge/sync-check.d.ts +47 -0
- package/dist/core/legacy-bridge/sync-check.d.ts.map +1 -0
- package/dist/core/legacy-bridge/sync-check.js +198 -0
- package/dist/core/legacy-bridge/sync-check.js.map +1 -0
- package/dist/core/legacy-bridge/types.d.ts +114 -0
- package/dist/core/legacy-bridge/types.d.ts.map +1 -0
- package/dist/core/legacy-bridge/types.js +4 -0
- package/dist/core/legacy-bridge/types.js.map +1 -0
- package/dist/core/markers/index.d.ts +3 -0
- package/dist/core/markers/index.d.ts.map +1 -0
- package/dist/core/markers/index.js +3 -0
- package/dist/core/markers/index.js.map +1 -0
- package/dist/core/markers/parse.d.ts +12 -0
- package/dist/core/markers/parse.d.ts.map +1 -0
- package/dist/core/markers/parse.js +31 -0
- package/dist/core/markers/parse.js.map +1 -0
- package/dist/core/markers/types.d.ts +142 -0
- package/dist/core/markers/types.d.ts.map +1 -0
- package/dist/core/markers/types.js +3 -0
- package/dist/core/markers/types.js.map +1 -0
- package/dist/core/migrate/ack.d.ts +13 -0
- package/dist/core/migrate/ack.d.ts.map +1 -0
- package/dist/core/migrate/ack.js +62 -0
- package/dist/core/migrate/ack.js.map +1 -0
- package/dist/core/migrate/archive-detect.d.ts +19 -0
- package/dist/core/migrate/archive-detect.d.ts.map +1 -0
- package/dist/core/migrate/archive-detect.js +89 -0
- package/dist/core/migrate/archive-detect.js.map +1 -0
- package/dist/core/migrate/budget.d.ts +7 -0
- package/dist/core/migrate/budget.d.ts.map +1 -0
- package/dist/core/migrate/budget.js +25 -0
- package/dist/core/migrate/budget.js.map +1 -0
- package/dist/core/migrate/conflict.d.ts +49 -0
- package/dist/core/migrate/conflict.d.ts.map +1 -0
- package/dist/core/migrate/conflict.js +99 -0
- package/dist/core/migrate/conflict.js.map +1 -0
- package/dist/core/migrate/index.d.ts +7 -0
- package/dist/core/migrate/index.d.ts.map +1 -0
- package/dist/core/migrate/index.js +389 -0
- package/dist/core/migrate/index.js.map +1 -0
- package/dist/core/migrate/markdown-aware.d.ts +27 -0
- package/dist/core/migrate/markdown-aware.d.ts.map +1 -0
- package/dist/core/migrate/markdown-aware.js +112 -0
- package/dist/core/migrate/markdown-aware.js.map +1 -0
- package/dist/core/migrate/quality.d.ts +66 -0
- package/dist/core/migrate/quality.d.ts.map +1 -0
- package/dist/core/migrate/quality.js +302 -0
- package/dist/core/migrate/quality.js.map +1 -0
- package/dist/core/migrate/regenerate.d.ts +24 -0
- package/dist/core/migrate/regenerate.d.ts.map +1 -0
- package/dist/core/migrate/regenerate.js +145 -0
- package/dist/core/migrate/regenerate.js.map +1 -0
- package/dist/core/migrate/report.d.ts +36 -0
- package/dist/core/migrate/report.d.ts.map +1 -0
- package/dist/core/migrate/report.js +154 -0
- package/dist/core/migrate/report.js.map +1 -0
- package/dist/core/migrate/sources/index.d.ts +4 -0
- package/dist/core/migrate/sources/index.d.ts.map +1 -0
- package/dist/core/migrate/sources/index.js +17 -0
- package/dist/core/migrate/sources/index.js.map +1 -0
- package/dist/core/migrate/sources/openspec.d.ts +14 -0
- package/dist/core/migrate/sources/openspec.d.ts.map +1 -0
- package/dist/core/migrate/sources/openspec.js +453 -0
- package/dist/core/migrate/sources/openspec.js.map +1 -0
- package/dist/core/migrate/sources/superpowers.d.ts +12 -0
- package/dist/core/migrate/sources/superpowers.d.ts.map +1 -0
- package/dist/core/migrate/sources/superpowers.js +310 -0
- package/dist/core/migrate/sources/superpowers.js.map +1 -0
- package/dist/core/migrate/types.d.ts +183 -0
- package/dist/core/migrate/types.d.ts.map +1 -0
- package/dist/core/migrate/types.js +5 -0
- package/dist/core/migrate/types.js.map +1 -0
- package/dist/core/migrate/utils.d.ts +2 -0
- package/dist/core/migrate/utils.d.ts.map +1 -0
- package/dist/core/migrate/utils.js +28 -0
- package/dist/core/migrate/utils.js.map +1 -0
- package/dist/core/monitor/artifact-observer.d.ts +9 -0
- package/dist/core/monitor/artifact-observer.d.ts.map +1 -0
- package/dist/core/monitor/artifact-observer.js +180 -0
- package/dist/core/monitor/artifact-observer.js.map +1 -0
- package/dist/core/monitor/config.d.ts +16 -0
- package/dist/core/monitor/config.d.ts.map +1 -0
- package/dist/core/monitor/config.js +48 -0
- package/dist/core/monitor/config.js.map +1 -0
- package/dist/core/monitor/divergence-map.d.ts +5 -0
- package/dist/core/monitor/divergence-map.d.ts.map +1 -0
- package/dist/core/monitor/divergence-map.js +92 -0
- package/dist/core/monitor/divergence-map.js.map +1 -0
- package/dist/core/monitor/exit-handler.d.ts +6 -0
- package/dist/core/monitor/exit-handler.d.ts.map +1 -0
- package/dist/core/monitor/exit-handler.js +27 -0
- package/dist/core/monitor/exit-handler.js.map +1 -0
- package/dist/core/monitor/health-verdict.d.ts +9 -0
- package/dist/core/monitor/health-verdict.d.ts.map +1 -0
- package/dist/core/monitor/health-verdict.js +55 -0
- package/dist/core/monitor/health-verdict.js.map +1 -0
- package/dist/core/monitor/report-renderer.d.ts +4 -0
- package/dist/core/monitor/report-renderer.d.ts.map +1 -0
- package/dist/core/monitor/report-renderer.js +82 -0
- package/dist/core/monitor/report-renderer.js.map +1 -0
- package/dist/core/monitor/trace-store.d.ts +39 -0
- package/dist/core/monitor/trace-store.d.ts.map +1 -0
- package/dist/core/monitor/trace-store.js +130 -0
- package/dist/core/monitor/trace-store.js.map +1 -0
- package/dist/core/monitor/types.d.ts +63 -0
- package/dist/core/monitor/types.d.ts.map +1 -0
- package/dist/core/monitor/types.js +26 -0
- package/dist/core/monitor/types.js.map +1 -0
- package/dist/core/parse/design.d.ts +14 -0
- package/dist/core/parse/design.d.ts.map +1 -0
- package/dist/core/parse/design.js +17 -0
- package/dist/core/parse/design.js.map +1 -0
- package/dist/core/parse/fenced-yaml.d.ts +18 -0
- package/dist/core/parse/fenced-yaml.d.ts.map +1 -0
- package/dist/core/parse/fenced-yaml.js +45 -0
- package/dist/core/parse/fenced-yaml.js.map +1 -0
- package/dist/core/parse/index.d.ts +7 -0
- package/dist/core/parse/index.d.ts.map +1 -0
- package/dist/core/parse/index.js +8 -0
- package/dist/core/parse/index.js.map +1 -0
- package/dist/core/parse/markdown.d.ts +30 -0
- package/dist/core/parse/markdown.d.ts.map +1 -0
- package/dist/core/parse/markdown.js +66 -0
- package/dist/core/parse/markdown.js.map +1 -0
- package/dist/core/parse/proposal.d.ts +18 -0
- package/dist/core/parse/proposal.d.ts.map +1 -0
- package/dist/core/parse/proposal.js +22 -0
- package/dist/core/parse/proposal.js.map +1 -0
- package/dist/core/parse/specs.d.ts +25 -0
- package/dist/core/parse/specs.d.ts.map +1 -0
- package/dist/core/parse/specs.js +58 -0
- package/dist/core/parse/specs.js.map +1 -0
- package/dist/core/parse/tasks.d.ts +33 -0
- package/dist/core/parse/tasks.d.ts.map +1 -0
- package/dist/core/parse/tasks.js +82 -0
- package/dist/core/parse/tasks.js.map +1 -0
- package/dist/core/parse/yaml.d.ts +13 -0
- package/dist/core/parse/yaml.d.ts.map +1 -0
- package/dist/core/parse/yaml.js +39 -0
- package/dist/core/parse/yaml.js.map +1 -0
- package/dist/core/process-evidence-freeze-warnings.d.ts +24 -0
- package/dist/core/process-evidence-freeze-warnings.d.ts.map +1 -0
- package/dist/core/process-evidence-freeze-warnings.js +153 -0
- package/dist/core/process-evidence-freeze-warnings.js.map +1 -0
- package/dist/core/schema/index.d.ts +5 -0
- package/dist/core/schema/index.d.ts.map +1 -0
- package/dist/core/schema/index.js +6 -0
- package/dist/core/schema/index.js.map +1 -0
- package/dist/core/schema/model-tiers-config.d.ts +41 -0
- package/dist/core/schema/model-tiers-config.d.ts.map +1 -0
- package/dist/core/schema/model-tiers-config.js +85 -0
- package/dist/core/schema/model-tiers-config.js.map +1 -0
- package/dist/core/schema/process-verification-config.d.ts +18 -0
- package/dist/core/schema/process-verification-config.d.ts.map +1 -0
- package/dist/core/schema/process-verification-config.js +74 -0
- package/dist/core/schema/process-verification-config.js.map +1 -0
- package/dist/core/schema/stage-extensions-config.d.ts +28 -0
- package/dist/core/schema/stage-extensions-config.d.ts.map +1 -0
- package/dist/core/schema/stage-extensions-config.js +228 -0
- package/dist/core/schema/stage-extensions-config.js.map +1 -0
- package/dist/core/schema/types.d.ts +262 -0
- package/dist/core/schema/types.d.ts.map +1 -0
- package/dist/core/schema/types.js +51 -0
- package/dist/core/schema/types.js.map +1 -0
- package/dist/core/schema/writing-plans-config.d.ts +11 -0
- package/dist/core/schema/writing-plans-config.d.ts.map +1 -0
- package/dist/core/schema/writing-plans-config.js +40 -0
- package/dist/core/schema/writing-plans-config.js.map +1 -0
- package/dist/core/schemas/archive-summary.d.ts +131 -0
- package/dist/core/schemas/archive-summary.d.ts.map +1 -0
- package/dist/core/schemas/archive-summary.js +31 -0
- package/dist/core/schemas/archive-summary.js.map +1 -0
- package/dist/core/schemas/process-evidence.d.ts +156 -0
- package/dist/core/schemas/process-evidence.d.ts.map +1 -0
- package/dist/core/schemas/process-evidence.js +12 -0
- package/dist/core/schemas/process-evidence.js.map +1 -0
- package/dist/core/schemas/scope-entries.d.ts +68 -0
- package/dist/core/schemas/scope-entries.d.ts.map +1 -0
- package/dist/core/schemas/scope-entries.js +47 -0
- package/dist/core/schemas/scope-entries.js.map +1 -0
- package/dist/core/schemas/severity.d.ts +58 -0
- package/dist/core/schemas/severity.d.ts.map +1 -0
- package/dist/core/schemas/severity.js +26 -0
- package/dist/core/schemas/severity.js.map +1 -0
- package/dist/core/scope/aggregator.d.ts +49 -0
- package/dist/core/scope/aggregator.d.ts.map +1 -0
- package/dist/core/scope/aggregator.js +141 -0
- package/dist/core/scope/aggregator.js.map +1 -0
- package/dist/core/scope/index.d.ts +2 -0
- package/dist/core/scope/index.d.ts.map +1 -0
- package/dist/core/scope/index.js +2 -0
- package/dist/core/scope/index.js.map +1 -0
- package/dist/core/specs-sync/apply.d.ts +8 -0
- package/dist/core/specs-sync/apply.d.ts.map +1 -0
- package/dist/core/specs-sync/apply.js +26 -0
- package/dist/core/specs-sync/apply.js.map +1 -0
- package/dist/core/specs-sync/deltas.d.ts +15 -0
- package/dist/core/specs-sync/deltas.d.ts.map +1 -0
- package/dist/core/specs-sync/deltas.js +27 -0
- package/dist/core/specs-sync/deltas.js.map +1 -0
- package/dist/core/specs-sync/index.d.ts +3 -0
- package/dist/core/specs-sync/index.d.ts.map +1 -0
- package/dist/core/specs-sync/index.js +4 -0
- package/dist/core/specs-sync/index.js.map +1 -0
- package/dist/core/stage-extensions/convergence-judge.d.ts +35 -0
- package/dist/core/stage-extensions/convergence-judge.d.ts.map +1 -0
- package/dist/core/stage-extensions/convergence-judge.js +47 -0
- package/dist/core/stage-extensions/convergence-judge.js.map +1 -0
- package/dist/core/stage-extensions/index.d.ts +13 -0
- package/dist/core/stage-extensions/index.d.ts.map +1 -0
- package/dist/core/stage-extensions/index.js +11 -0
- package/dist/core/stage-extensions/index.js.map +1 -0
- package/dist/core/stage-extensions/output-watcher.d.ts +93 -0
- package/dist/core/stage-extensions/output-watcher.d.ts.map +1 -0
- package/dist/core/stage-extensions/output-watcher.js +163 -0
- package/dist/core/stage-extensions/output-watcher.js.map +1 -0
- package/dist/core/stage-extensions/severity-mapper.d.ts +21 -0
- package/dist/core/stage-extensions/severity-mapper.d.ts.map +1 -0
- package/dist/core/stage-extensions/severity-mapper.js +26 -0
- package/dist/core/stage-extensions/severity-mapper.js.map +1 -0
- package/dist/core/stage-extensions/state-machine.d.ts +43 -0
- package/dist/core/stage-extensions/state-machine.d.ts.map +1 -0
- package/dist/core/stage-extensions/state-machine.js +19 -0
- package/dist/core/stage-extensions/state-machine.js.map +1 -0
- package/dist/core/stage-extensions/thread-map.d.ts +60 -0
- package/dist/core/stage-extensions/thread-map.d.ts.map +1 -0
- package/dist/core/stage-extensions/thread-map.js +107 -0
- package/dist/core/stage-extensions/thread-map.js.map +1 -0
- package/dist/core/stage-extensions/trend-analyzer.d.ts +29 -0
- package/dist/core/stage-extensions/trend-analyzer.d.ts.map +1 -0
- package/dist/core/stage-extensions/trend-analyzer.js +60 -0
- package/dist/core/stage-extensions/trend-analyzer.js.map +1 -0
- package/dist/core/stage-extensions/types.d.ts +39 -0
- package/dist/core/stage-extensions/types.d.ts.map +1 -0
- package/dist/core/stage-extensions/types.js +5 -0
- package/dist/core/stage-extensions/types.js.map +1 -0
- package/dist/core/staging-lock.d.ts +36 -0
- package/dist/core/staging-lock.d.ts.map +1 -0
- package/dist/core/staging-lock.js +122 -0
- package/dist/core/staging-lock.js.map +1 -0
- package/dist/core/templates/commands/ack-confirm.md +32 -0
- package/dist/core/templates/commands/apply.md +220 -0
- package/dist/core/templates/commands/archive.md +178 -0
- package/dist/core/templates/commands/brainstorm.md +58 -0
- package/dist/core/templates/commands/codex-adversarial.md +95 -0
- package/dist/core/templates/commands/explore.md +29 -0
- package/dist/core/templates/commands/index.d.ts +12 -0
- package/dist/core/templates/commands/index.d.ts.map +1 -0
- package/dist/core/templates/commands/index.js +26 -0
- package/dist/core/templates/commands/index.js.map +1 -0
- package/dist/core/templates/commands/propose.md +90 -0
- package/dist/core/templates/commands/review.md +105 -0
- package/dist/core/templates/commands/upgrade.md +58 -0
- package/dist/core/templates/commands/verify.md +186 -0
- package/dist/core/templates/index.d.ts +3 -0
- package/dist/core/templates/index.d.ts.map +1 -0
- package/dist/core/templates/index.js +5 -0
- package/dist/core/templates/index.js.map +1 -0
- package/dist/core/templates/skills/_shared/scope-category-guidance.md +40 -0
- package/dist/core/templates/skills/brainstorming.md +161 -0
- package/dist/core/templates/skills/dispatching-parallel-agents.md +209 -0
- package/dist/core/templates/skills/exploring.md +476 -0
- package/dist/core/templates/skills/finishing-a-development-branch.md +251 -0
- package/dist/core/templates/skills/index.d.ts +17 -0
- package/dist/core/templates/skills/index.d.ts.map +1 -0
- package/dist/core/templates/skills/index.js +53 -0
- package/dist/core/templates/skills/index.js.map +1 -0
- package/dist/core/templates/skills/process-evidence.md +146 -0
- package/dist/core/templates/skills/receiving-code-review.md +294 -0
- package/dist/core/templates/skills/requesting-code-review.md +108 -0
- package/dist/core/templates/skills/subagent-driven-development.md +405 -0
- package/dist/core/templates/skills/subagent-driven-discipline/references/codex-tools.md +72 -0
- package/dist/core/templates/skills/subagent-driven-discipline/references/opencode-tools.md +104 -0
- package/dist/core/templates/skills/subagent-driven-discipline.md +725 -0
- package/dist/core/templates/skills/systematic-debugging.md +297 -0
- package/dist/core/templates/skills/test-driven-development.md +402 -0
- package/dist/core/templates/skills/using-forge.md +163 -0
- package/dist/core/templates/skills/using-git-worktrees.md +229 -0
- package/dist/core/templates/skills/verification-before-completion.md +175 -0
- package/dist/core/templates/skills/verifying-three-dimensions.md +245 -0
- package/dist/core/templates/skills/writing-plans.md +259 -0
- package/dist/core/templates/skills/writing-skills.md +214 -0
- package/dist/core/test-reporters/index.d.ts +41 -0
- package/dist/core/test-reporters/index.d.ts.map +1 -0
- package/dist/core/test-reporters/index.js +39 -0
- package/dist/core/test-reporters/index.js.map +1 -0
- package/dist/core/test-reporters/junit.d.ts +8 -0
- package/dist/core/test-reporters/junit.d.ts.map +1 -0
- package/dist/core/test-reporters/junit.js +94 -0
- package/dist/core/test-reporters/junit.js.map +1 -0
- package/dist/core/test-reporters/tap.d.ts +18 -0
- package/dist/core/test-reporters/tap.d.ts.map +1 -0
- package/dist/core/test-reporters/tap.js +73 -0
- package/dist/core/test-reporters/tap.js.map +1 -0
- package/dist/core/test-reporters/vitest-json.d.ts +8 -0
- package/dist/core/test-reporters/vitest-json.d.ts.map +1 -0
- package/dist/core/test-reporters/vitest-json.js +56 -0
- package/dist/core/test-reporters/vitest-json.js.map +1 -0
- package/dist/core/upgrade/resign-markers.d.ts +14 -0
- package/dist/core/upgrade/resign-markers.d.ts.map +1 -0
- package/dist/core/upgrade/resign-markers.js +245 -0
- package/dist/core/upgrade/resign-markers.js.map +1 -0
- package/dist/core/validate/archive-summary-schema.d.ts +8 -0
- package/dist/core/validate/archive-summary-schema.d.ts.map +1 -0
- package/dist/core/validate/archive-summary-schema.js +186 -0
- package/dist/core/validate/archive-summary-schema.js.map +1 -0
- package/dist/core/validate/auto-findings.d.ts +36 -0
- package/dist/core/validate/auto-findings.d.ts.map +1 -0
- package/dist/core/validate/auto-findings.js +38 -0
- package/dist/core/validate/auto-findings.js.map +1 -0
- package/dist/core/validate/candidate-validators.d.ts +22 -0
- package/dist/core/validate/candidate-validators.d.ts.map +1 -0
- package/dist/core/validate/candidate-validators.js +46 -0
- package/dist/core/validate/candidate-validators.js.map +1 -0
- package/dist/core/validate/change.d.ts +3 -0
- package/dist/core/validate/change.d.ts.map +1 -0
- package/dist/core/validate/change.js +205 -0
- package/dist/core/validate/change.js.map +1 -0
- package/dist/core/validate/coverage-gap.d.ts +37 -0
- package/dist/core/validate/coverage-gap.d.ts.map +1 -0
- package/dist/core/validate/coverage-gap.js +181 -0
- package/dist/core/validate/coverage-gap.js.map +1 -0
- package/dist/core/validate/finding-hash.d.ts +14 -0
- package/dist/core/validate/finding-hash.d.ts.map +1 -0
- package/dist/core/validate/finding-hash.js +29 -0
- package/dist/core/validate/finding-hash.js.map +1 -0
- package/dist/core/validate/index.d.ts +15 -0
- package/dist/core/validate/index.d.ts.map +1 -0
- package/dist/core/validate/index.js +19 -0
- package/dist/core/validate/index.js.map +1 -0
- package/dist/core/validate/marker-integrity.d.ts +28 -0
- package/dist/core/validate/marker-integrity.d.ts.map +1 -0
- package/dist/core/validate/marker-integrity.js +170 -0
- package/dist/core/validate/marker-integrity.js.map +1 -0
- package/dist/core/validate/marker-schema.d.ts +10 -0
- package/dist/core/validate/marker-schema.d.ts.map +1 -0
- package/dist/core/validate/marker-schema.js +661 -0
- package/dist/core/validate/marker-schema.js.map +1 -0
- package/dist/core/validate/orphan-tmp.d.ts +13 -0
- package/dist/core/validate/orphan-tmp.d.ts.map +1 -0
- package/dist/core/validate/orphan-tmp.js +49 -0
- package/dist/core/validate/orphan-tmp.js.map +1 -0
- package/dist/core/validate/proposal.d.ts +4 -0
- package/dist/core/validate/proposal.d.ts.map +1 -0
- package/dist/core/validate/proposal.js +40 -0
- package/dist/core/validate/proposal.js.map +1 -0
- package/dist/core/validate/scope-entries.d.ts +23 -0
- package/dist/core/validate/scope-entries.d.ts.map +1 -0
- package/dist/core/validate/scope-entries.js +108 -0
- package/dist/core/validate/scope-entries.js.map +1 -0
- package/dist/core/validate/specs.d.ts +4 -0
- package/dist/core/validate/specs.d.ts.map +1 -0
- package/dist/core/validate/specs.js +74 -0
- package/dist/core/validate/specs.js.map +1 -0
- package/dist/core/validate/tasks.d.ts +4 -0
- package/dist/core/validate/tasks.d.ts.map +1 -0
- package/dist/core/validate/tasks.js +48 -0
- package/dist/core/validate/tasks.js.map +1 -0
- package/dist/core/validate/test-failure-stub.d.ts +23 -0
- package/dist/core/validate/test-failure-stub.d.ts.map +1 -0
- package/dist/core/validate/test-failure-stub.js +21 -0
- package/dist/core/validate/test-failure-stub.js.map +1 -0
- package/dist/core/validate/types.d.ts +33 -0
- package/dist/core/validate/types.d.ts.map +1 -0
- package/dist/core/validate/types.js +20 -0
- package/dist/core/validate/types.js.map +1 -0
- package/dist/core/worktree.d.ts +52 -0
- package/dist/core/worktree.d.ts.map +1 -0
- package/dist/core/worktree.js +145 -0
- package/dist/core/worktree.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
// src/core/migrate/report.ts
|
|
2
|
+
// journal NDJSON + 末态 fs.rename + reader 优先级 — Plan 8d Task 4.4
|
|
3
|
+
// Spec §3.4 trace 格式 + journal 流程 v4
|
|
4
|
+
import { existsSync } from 'node:fs';
|
|
5
|
+
import { open, rename, unlink, writeFile, readFile } from 'node:fs/promises';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
// 三个 trace 文件名常量
|
|
8
|
+
const NDJSON_NAME = 'migrate-trace.json.ndjson';
|
|
9
|
+
const TMP_NAME = 'migrate-trace.json.tmp';
|
|
10
|
+
const FINAL_NAME = 'migrate-trace.json';
|
|
11
|
+
/**
|
|
12
|
+
* Journal:NDJSON 行式写入 + 每步 fsync
|
|
13
|
+
* crash 时半完成 ops 仍可被 readTrace 重建
|
|
14
|
+
*/
|
|
15
|
+
export class Journal {
|
|
16
|
+
fh;
|
|
17
|
+
constructor(fh) {
|
|
18
|
+
this.fh = fh;
|
|
19
|
+
}
|
|
20
|
+
/** 打开 journal 文件(append 模式) */
|
|
21
|
+
static async open(filePath) {
|
|
22
|
+
const fh = await open(filePath, 'a'); // append 模式:crash 安全
|
|
23
|
+
return new Journal(fh);
|
|
24
|
+
}
|
|
25
|
+
/** 追加一个 op,立即 fsync 防 crash 丢数据 */
|
|
26
|
+
async append(op) {
|
|
27
|
+
const line = JSON.stringify(op) + '\n';
|
|
28
|
+
await this.fh.write(line, null, 'utf8');
|
|
29
|
+
await this.fh.sync(); // fsync — crash safety 关键步骤
|
|
30
|
+
}
|
|
31
|
+
/** 关闭文件句柄 */
|
|
32
|
+
async close() {
|
|
33
|
+
await this.fh.close();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* reader 优先级:.json > .ndjson(重建)> .tmp(忽略,返 null)
|
|
38
|
+
* 说明:
|
|
39
|
+
* - .json 是末态原子 rename 写成的,可信
|
|
40
|
+
* - .ndjson 是 crash 半完成态,可重建 ops
|
|
41
|
+
* - .tmp 是崩溃中的写入,不可读(可能不完整)
|
|
42
|
+
*/
|
|
43
|
+
export async function readTrace(dir) {
|
|
44
|
+
const finalPath = join(dir, FINAL_NAME);
|
|
45
|
+
const ndjsonPath = join(dir, NDJSON_NAME);
|
|
46
|
+
// 优先级 1:.json 存在且可解析
|
|
47
|
+
if (existsSync(finalPath)) {
|
|
48
|
+
try {
|
|
49
|
+
const content = await readFile(finalPath, 'utf8');
|
|
50
|
+
return JSON.parse(content);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// .json 损坏(极少见)→ fallback 到 ndjson
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// 优先级 2:.ndjson 存在 → 逐行重建 ops
|
|
57
|
+
if (existsSync(ndjsonPath)) {
|
|
58
|
+
const content = await readFile(ndjsonPath, 'utf8');
|
|
59
|
+
const ops = [];
|
|
60
|
+
for (const line of content.split('\n')) {
|
|
61
|
+
if (!line.trim())
|
|
62
|
+
continue;
|
|
63
|
+
try {
|
|
64
|
+
ops.push(JSON.parse(line));
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// 容忍最后一行 truncate(crash 中途写入)
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// 注意:.ndjson 行只含 TraceOp 字段,不含 source/sourceRoot/ts/cleanupHint 等 meta;
|
|
71
|
+
// 此处用占位值('openspec' / '' 等),P5 crash 恢复若需要这些 meta,应从 opts/detect 重新传入
|
|
72
|
+
// 而非依赖 readTrace 的 ndjson 重建路径。
|
|
73
|
+
return {
|
|
74
|
+
version: 1,
|
|
75
|
+
source: 'openspec',
|
|
76
|
+
sourceRoot: '',
|
|
77
|
+
ts: '',
|
|
78
|
+
ops,
|
|
79
|
+
conflicts: [],
|
|
80
|
+
downgrades: [],
|
|
81
|
+
cleanupHint: '',
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
// 优先级 3(最低):.tmp 只有或全无 → 崩溃中,不读
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* 末态原子 rename 三步走:
|
|
89
|
+
* 1. 写 .tmp(完整 final trace JSON)
|
|
90
|
+
* 2. fs.rename .tmp → .json(POSIX 原子)
|
|
91
|
+
* 3. 删 .ndjson(若存在)
|
|
92
|
+
*/
|
|
93
|
+
export async function finalizeAndRename(dir, finalTrace) {
|
|
94
|
+
const tmpPath = join(dir, TMP_NAME);
|
|
95
|
+
const finalPath = join(dir, FINAL_NAME);
|
|
96
|
+
const ndjsonPath = join(dir, NDJSON_NAME);
|
|
97
|
+
// 步骤 1:写 .tmp
|
|
98
|
+
await writeFile(tmpPath, JSON.stringify(finalTrace, null, 2), 'utf8');
|
|
99
|
+
// 步骤 2:原子 rename .tmp → .json
|
|
100
|
+
await rename(tmpPath, finalPath);
|
|
101
|
+
// 步骤 3:删 .ndjson(仅在存在时)
|
|
102
|
+
if (existsSync(ndjsonPath)) {
|
|
103
|
+
await unlink(ndjsonPath);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* 写 migrate-report.md(spec §3.4)
|
|
108
|
+
* 磁盘满或写入失败时:降级 stderr 输出全文(spec §3.1)
|
|
109
|
+
*/
|
|
110
|
+
export async function writeReportMd(dir, finalTrace) {
|
|
111
|
+
const lines = [];
|
|
112
|
+
lines.push(`# Migration Report — ${finalTrace.source} @ ${finalTrace.ts}`);
|
|
113
|
+
lines.push('');
|
|
114
|
+
lines.push('## Summary');
|
|
115
|
+
lines.push(`- Source: ${finalTrace.source} (rootPath: ${finalTrace.sourceRoot})`);
|
|
116
|
+
lines.push(`- Total ops: ${finalTrace.ops.length}`);
|
|
117
|
+
lines.push(`- Conflicts: ${finalTrace.conflicts.length}`);
|
|
118
|
+
lines.push(`- Downgrades: ${finalTrace.downgrades.length}`);
|
|
119
|
+
lines.push('');
|
|
120
|
+
lines.push('## Plan');
|
|
121
|
+
lines.push('| From | To | Kind | Validate |');
|
|
122
|
+
lines.push('| ---- | -- | ---- | -------- |');
|
|
123
|
+
for (const op of finalTrace.ops) {
|
|
124
|
+
lines.push(`| ${op.from ?? '(missing)'} | ${op.to} | ${op.kind} | ${op.validate} |`);
|
|
125
|
+
}
|
|
126
|
+
// 冲突表(可选)
|
|
127
|
+
if (finalTrace.conflicts.length > 0) {
|
|
128
|
+
lines.push('');
|
|
129
|
+
lines.push('## Conflicts');
|
|
130
|
+
for (const c of finalTrace.conflicts) {
|
|
131
|
+
lines.push(`- ${c.target} → ${c.rename}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// 降级表(可选)
|
|
135
|
+
if (finalTrace.downgrades.length > 0) {
|
|
136
|
+
lines.push('');
|
|
137
|
+
lines.push('## Downgrades(M13)');
|
|
138
|
+
for (const d of finalTrace.downgrades) {
|
|
139
|
+
lines.push(`- ${d.change}: ${d.from} → ${d.to}(reason: ${d.reason})`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
lines.push('');
|
|
143
|
+
lines.push('## Cleanup');
|
|
144
|
+
lines.push(finalTrace.cleanupHint);
|
|
145
|
+
try {
|
|
146
|
+
await writeFile(join(dir, 'migrate-report.md'), lines.join('\n'), 'utf8');
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
// 磁盘满降级:stderr 输出(spec §3.1)
|
|
150
|
+
console.error('[migrate] report.md 写入失败,降级 stderr 输出:');
|
|
151
|
+
console.error(lines.join('\n'));
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/core/migrate/report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/migrate/sources/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAI3D,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,aAAa,CAGnD,CAAC;AAEF,wBAAgB,SAAS,CAAC,EAAE,EAAE,QAAQ,GAAG,aAAa,CAMrD"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// src/core/migrate/sources/index.ts
|
|
2
|
+
// source registry — Plan 8a Task 1.3
|
|
3
|
+
// P2 在 openspec.ts 实施后注册 OpenSpecSource;P3 同理 SuperpowersSource
|
|
4
|
+
import { OpenSpecSource } from './openspec.js';
|
|
5
|
+
import { SuperpowersSource } from './superpowers.js';
|
|
6
|
+
export const SOURCES = {
|
|
7
|
+
openspec: new OpenSpecSource(),
|
|
8
|
+
superpowers: new SuperpowersSource(),
|
|
9
|
+
};
|
|
10
|
+
export function getSource(id) {
|
|
11
|
+
const s = SOURCES[id];
|
|
12
|
+
if (!s) {
|
|
13
|
+
throw new Error(`unknown migrate source id: ${id}`);
|
|
14
|
+
}
|
|
15
|
+
return s;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/migrate/sources/index.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,qCAAqC;AACrC,gEAAgE;AAGhE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,CAAC,MAAM,OAAO,GAAoC;IACtD,QAAQ,EAAE,IAAI,cAAc,EAAE;IAC9B,WAAW,EAAE,IAAI,iBAAiB,EAAE;CACrC,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,EAAY;IACpC,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;IACtB,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,8BAA8B,EAAE,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { MigrateSource, DetectResult, ScanResult, ClassificationPlan, ClassifyCtx, CopyOp, ArtifactKind, MissingArtifact } from '../types.js';
|
|
2
|
+
export declare class OpenSpecSource implements MigrateSource {
|
|
3
|
+
readonly id: "openspec";
|
|
4
|
+
detect(cwd: string): Promise<DetectResult>;
|
|
5
|
+
scan(rootPath: string): Promise<ScanResult>;
|
|
6
|
+
classify(scan: ScanResult, _ctx: ClassifyCtx): Promise<ClassificationPlan>;
|
|
7
|
+
prepareCopy(plan: ClassificationPlan, target: string): CopyOp[];
|
|
8
|
+
transform(content: string, kind: ArtifactKind): string;
|
|
9
|
+
private transformSpec;
|
|
10
|
+
private transformProposal;
|
|
11
|
+
private transformTasks;
|
|
12
|
+
listMissingArtifacts(plan: ClassificationPlan): MissingArtifact[];
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=openspec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openspec.d.ts","sourceRoot":"","sources":["../../../../src/core/migrate/sources/openspec.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,WAAW,EACX,MAAM,EACN,YAAY,EACZ,eAAe,EAMhB,MAAM,aAAa,CAAC;AA4DrB,qBAAa,cAAe,YAAW,aAAa;IAClD,QAAQ,CAAC,EAAE,EAAG,UAAU,CAAU;IAE5B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAY1C,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IA+F3C,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAqFhF,WAAW,CAAC,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IAmE/D,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,MAAM;IAStD,OAAO,CAAC,aAAa;IAoDrB,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,cAAc;IAatB,oBAAoB,CAAC,IAAI,EAAE,kBAAkB,GAAG,eAAe,EAAE;CAqDlE"}
|
|
@@ -0,0 +1,453 @@
|
|
|
1
|
+
// src/core/migrate/sources/openspec.ts
|
|
2
|
+
// OpenSpecSource detect/scan/classify/prepareCopy 实施 — Plan 8b Task 2.2-2.5
|
|
3
|
+
// 实际 transform/listMissingArtifacts 由 P2/P5 继续落实
|
|
4
|
+
import { walkLines } from '../markdown-aware.js';
|
|
5
|
+
import { detectEncoding } from '../utils.js';
|
|
6
|
+
import { existsSync } from 'node:fs';
|
|
7
|
+
import { readdir, stat } from 'node:fs/promises';
|
|
8
|
+
import { join, posix as posixPath } from 'node:path';
|
|
9
|
+
// 处理 change 子目录:把 proposal.md / tasks.md / design.md / specs/*.md 加入列表
|
|
10
|
+
async function addChangeFiles(absDir, relDir, out) {
|
|
11
|
+
const SCALAR_FILES = [
|
|
12
|
+
{ name: 'proposal.md', kind: 'proposal' },
|
|
13
|
+
{ name: 'tasks.md', kind: 'tasks' },
|
|
14
|
+
{ name: 'design.md', kind: 'design' },
|
|
15
|
+
];
|
|
16
|
+
for (const { name, kind } of SCALAR_FILES) {
|
|
17
|
+
const absPath = join(absDir, name);
|
|
18
|
+
if (!existsSync(absPath))
|
|
19
|
+
continue;
|
|
20
|
+
const stats = await stat(absPath);
|
|
21
|
+
out.push({
|
|
22
|
+
absPath,
|
|
23
|
+
// relPath 必须 posix slash(逻辑路径 key,classify 阶段会按 '/' 切分)
|
|
24
|
+
relPath: posixPath.join(relDir, name),
|
|
25
|
+
kind,
|
|
26
|
+
size: stats.size,
|
|
27
|
+
mtime: stats.mtime.toISOString(),
|
|
28
|
+
encoding: await detectEncoding(absPath),
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
// specs/<area>.md
|
|
32
|
+
const specsSubDir = join(absDir, 'specs');
|
|
33
|
+
if (existsSync(specsSubDir)) {
|
|
34
|
+
const entries = await readdir(specsSubDir, { withFileTypes: true });
|
|
35
|
+
for (const e of entries) {
|
|
36
|
+
if (e.isDirectory() || !e.name.endsWith('.md'))
|
|
37
|
+
continue;
|
|
38
|
+
const absPath = join(specsSubDir, e.name);
|
|
39
|
+
const stats = await stat(absPath);
|
|
40
|
+
out.push({
|
|
41
|
+
absPath,
|
|
42
|
+
// relPath 必须 posix slash(逻辑路径 key)
|
|
43
|
+
relPath: posixPath.join(relDir, 'specs', e.name),
|
|
44
|
+
kind: 'spec',
|
|
45
|
+
size: stats.size,
|
|
46
|
+
mtime: stats.mtime.toISOString(),
|
|
47
|
+
encoding: await detectEncoding(absPath),
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// 保留的 slug 列表 — classify 阶段跳过这些
|
|
53
|
+
const RESERVED_SLUGS = new Set(['.cache', '.forge-trash', '.forge-ack', 'archive']);
|
|
54
|
+
// 判断 slug 是否不安全
|
|
55
|
+
function isUnsafeSlug(slug) {
|
|
56
|
+
if (slug === '..' || slug === '.')
|
|
57
|
+
return true;
|
|
58
|
+
if (RESERVED_SLUGS.has(slug))
|
|
59
|
+
return true;
|
|
60
|
+
if (slug.includes('/') || slug.includes('\\'))
|
|
61
|
+
return true;
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
export class OpenSpecSource {
|
|
65
|
+
id = 'openspec';
|
|
66
|
+
async detect(cwd) {
|
|
67
|
+
// detect 阶段:检查 openspec/ 是否存在
|
|
68
|
+
const root = join(cwd, 'openspec');
|
|
69
|
+
if (!existsSync(root)) {
|
|
70
|
+
return {
|
|
71
|
+
found: false,
|
|
72
|
+
message: `<cwd>/openspec/ 不存在;预期路径:${root}`,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
return { found: true, rootPath: root };
|
|
76
|
+
}
|
|
77
|
+
async scan(rootPath) {
|
|
78
|
+
// scan 阶段:枚举源目录产物(specs / changes / explorations / config.yaml)
|
|
79
|
+
const files = [];
|
|
80
|
+
// 1. specs/<n>/spec.md
|
|
81
|
+
const specsDir = join(rootPath, 'specs');
|
|
82
|
+
if (existsSync(specsDir)) {
|
|
83
|
+
const dirs = await readdir(specsDir, { withFileTypes: true });
|
|
84
|
+
for (const d of dirs) {
|
|
85
|
+
if (!d.isDirectory())
|
|
86
|
+
continue;
|
|
87
|
+
const specPath = join(specsDir, d.name, 'spec.md');
|
|
88
|
+
if (!existsSync(specPath))
|
|
89
|
+
continue;
|
|
90
|
+
const stats = await stat(specPath);
|
|
91
|
+
const encoding = await detectEncoding(specPath);
|
|
92
|
+
files.push({
|
|
93
|
+
absPath: specPath,
|
|
94
|
+
// relPath 必须 posix slash(逻辑路径 key)
|
|
95
|
+
relPath: posixPath.join('specs', d.name, 'spec.md'),
|
|
96
|
+
kind: 'spec',
|
|
97
|
+
size: stats.size,
|
|
98
|
+
mtime: stats.mtime.toISOString(),
|
|
99
|
+
encoding,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// 2. changes/<n>/(active 与 archive)
|
|
104
|
+
const changesDir = join(rootPath, 'changes');
|
|
105
|
+
if (existsSync(changesDir)) {
|
|
106
|
+
const entries = await readdir(changesDir, { withFileTypes: true });
|
|
107
|
+
for (const e of entries) {
|
|
108
|
+
if (!e.isDirectory())
|
|
109
|
+
continue;
|
|
110
|
+
const changeName = e.name;
|
|
111
|
+
const isArchive = changeName === 'archive';
|
|
112
|
+
const changeRoot = join(changesDir, changeName);
|
|
113
|
+
if (isArchive) {
|
|
114
|
+
// archive 子目录:再 readdir 一层
|
|
115
|
+
const archiveEntries = await readdir(changeRoot, {
|
|
116
|
+
withFileTypes: true,
|
|
117
|
+
});
|
|
118
|
+
for (const ae of archiveEntries) {
|
|
119
|
+
if (!ae.isDirectory())
|
|
120
|
+
continue;
|
|
121
|
+
await addChangeFiles(join(changeRoot, ae.name),
|
|
122
|
+
// relDir 走 posix(addChangeFiles 内会继续 posix 拼接)
|
|
123
|
+
posixPath.join('changes', 'archive', ae.name), files);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
// relDir 走 posix(addChangeFiles 内会继续 posix 拼接)
|
|
128
|
+
await addChangeFiles(changeRoot, posixPath.join('changes', changeName), files);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// 3. explorations/*.md
|
|
133
|
+
const explorationsDir = join(rootPath, 'explorations');
|
|
134
|
+
if (existsSync(explorationsDir)) {
|
|
135
|
+
const entries = await readdir(explorationsDir, { withFileTypes: true });
|
|
136
|
+
for (const e of entries) {
|
|
137
|
+
if (e.isDirectory() || !e.name.endsWith('.md'))
|
|
138
|
+
continue;
|
|
139
|
+
const absPath = join(explorationsDir, e.name);
|
|
140
|
+
const stats = await stat(absPath);
|
|
141
|
+
const encoding = await detectEncoding(absPath);
|
|
142
|
+
files.push({
|
|
143
|
+
absPath,
|
|
144
|
+
// relPath 必须 posix slash(逻辑路径 key)
|
|
145
|
+
relPath: posixPath.join('explorations', e.name),
|
|
146
|
+
kind: 'draft',
|
|
147
|
+
size: stats.size,
|
|
148
|
+
mtime: stats.mtime.toISOString(),
|
|
149
|
+
encoding,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// 4. config.yaml
|
|
154
|
+
const configPath = join(rootPath, 'config.yaml');
|
|
155
|
+
if (existsSync(configPath)) {
|
|
156
|
+
const stats = await stat(configPath);
|
|
157
|
+
files.push({
|
|
158
|
+
absPath: configPath,
|
|
159
|
+
relPath: 'config.yaml',
|
|
160
|
+
kind: 'config',
|
|
161
|
+
size: stats.size,
|
|
162
|
+
mtime: stats.mtime.toISOString(),
|
|
163
|
+
encoding: await detectEncoding(configPath),
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
return { isEmpty: files.length === 0, files };
|
|
167
|
+
}
|
|
168
|
+
async classify(scan, _ctx) {
|
|
169
|
+
// classify 阶段:为 scan 结果分类并判定目标位置
|
|
170
|
+
const changesMap = new Map();
|
|
171
|
+
const specs = [];
|
|
172
|
+
const drafts = [];
|
|
173
|
+
const configFiles = [];
|
|
174
|
+
const skipped = [];
|
|
175
|
+
for (const f of scan.files) {
|
|
176
|
+
// 编码检查:非 UTF-8 直接跳过
|
|
177
|
+
if (f.encoding === 'non-utf8') {
|
|
178
|
+
skipped.push({ source: f.relPath, reason: '[skip:encoding-not-utf8]' });
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
// spec 顶层(specs/<n>/spec.md)
|
|
182
|
+
if (f.kind === 'spec' && f.relPath.startsWith('specs/')) {
|
|
183
|
+
specs.push({
|
|
184
|
+
relPath: f.relPath.replace(/^specs\//, ''),
|
|
185
|
+
source: f,
|
|
186
|
+
});
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
// change(active 或 archive)
|
|
190
|
+
if (f.relPath.startsWith('changes/')) {
|
|
191
|
+
const parts = f.relPath.split('/');
|
|
192
|
+
const isArchive = parts[1] === 'archive';
|
|
193
|
+
const slug = isArchive ? parts[2] : parts[1];
|
|
194
|
+
if (!slug)
|
|
195
|
+
continue;
|
|
196
|
+
if (isUnsafeSlug(slug)) {
|
|
197
|
+
skipped.push({
|
|
198
|
+
source: f.relPath,
|
|
199
|
+
reason: `[unsafe-slug: ${slug}]`,
|
|
200
|
+
});
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
let change = changesMap.get(slug);
|
|
204
|
+
if (!change) {
|
|
205
|
+
change = {
|
|
206
|
+
slug,
|
|
207
|
+
classification: isArchive ? 'archive' : 'active',
|
|
208
|
+
artifacts: {},
|
|
209
|
+
};
|
|
210
|
+
changesMap.set(slug, change);
|
|
211
|
+
}
|
|
212
|
+
// spec 文件累积到数组(支持多 area.md);其余 kind 单文件赋值
|
|
213
|
+
if (f.kind === 'spec') {
|
|
214
|
+
change.artifacts.specs = [...(change.artifacts.specs ?? []), f];
|
|
215
|
+
}
|
|
216
|
+
else if (f.kind === 'proposal' || f.kind === 'tasks' || f.kind === 'design') {
|
|
217
|
+
change.artifacts[f.kind] = f;
|
|
218
|
+
}
|
|
219
|
+
// config / draft 的 kind 不进 change.artifacts
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
// draft(explorations/)
|
|
223
|
+
if (f.kind === 'draft') {
|
|
224
|
+
drafts.push({
|
|
225
|
+
targetName: f.relPath.replace(/^explorations\//, ''),
|
|
226
|
+
source: f,
|
|
227
|
+
});
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
// config.yaml
|
|
231
|
+
if (f.kind === 'config') {
|
|
232
|
+
configFiles.push({
|
|
233
|
+
source: f,
|
|
234
|
+
strategy: 'fresh',
|
|
235
|
+
targetName: 'config.yaml',
|
|
236
|
+
});
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return {
|
|
241
|
+
changes: Array.from(changesMap.values()),
|
|
242
|
+
specs,
|
|
243
|
+
drafts,
|
|
244
|
+
configFiles,
|
|
245
|
+
skipped,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
prepareCopy(plan, target) {
|
|
249
|
+
// prepareCopy 阶段:计划 → 具体复制操作
|
|
250
|
+
const ops = [];
|
|
251
|
+
// changes(分 active 与 archive)
|
|
252
|
+
for (const c of plan.changes) {
|
|
253
|
+
const baseDir = c.classification === 'archive'
|
|
254
|
+
? join(target, 'changes', 'archive', c.slug)
|
|
255
|
+
: join(target, 'changes', c.slug);
|
|
256
|
+
// proposal / tasks / design 单文件各自 kind.md
|
|
257
|
+
for (const kind of ['proposal', 'tasks', 'design']) {
|
|
258
|
+
const f = c.artifacts[kind];
|
|
259
|
+
if (!f)
|
|
260
|
+
continue;
|
|
261
|
+
ops.push({
|
|
262
|
+
source: f.absPath,
|
|
263
|
+
target: join(baseDir, `${kind}.md`),
|
|
264
|
+
kind,
|
|
265
|
+
changeSlug: c.slug,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
// specs 多文件:relPath 是 posix slash,split('/').pop() 安全取文件名
|
|
269
|
+
if (c.artifacts.specs) {
|
|
270
|
+
for (const f of c.artifacts.specs) {
|
|
271
|
+
const fileName = f.relPath.split('/').pop() ?? 'spec.md';
|
|
272
|
+
ops.push({
|
|
273
|
+
source: f.absPath,
|
|
274
|
+
target: join(baseDir, 'specs', fileName),
|
|
275
|
+
kind: 'spec',
|
|
276
|
+
changeSlug: c.slug,
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
// specs
|
|
282
|
+
for (const s of plan.specs) {
|
|
283
|
+
ops.push({
|
|
284
|
+
source: s.source.absPath,
|
|
285
|
+
target: join(target, 'specs', s.relPath),
|
|
286
|
+
kind: 'spec',
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
// drafts
|
|
290
|
+
for (const d of plan.drafts) {
|
|
291
|
+
ops.push({
|
|
292
|
+
source: d.source.absPath,
|
|
293
|
+
target: join(target, 'drafts', d.targetName),
|
|
294
|
+
kind: 'draft',
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
// config
|
|
298
|
+
for (const cf of plan.configFiles) {
|
|
299
|
+
ops.push({
|
|
300
|
+
source: cf.source.absPath,
|
|
301
|
+
target: join(target, cf.targetName),
|
|
302
|
+
kind: 'config',
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
return ops;
|
|
306
|
+
}
|
|
307
|
+
transform(content, kind) {
|
|
308
|
+
// Task 2.6-2.8 实施三套规则 transform
|
|
309
|
+
if (kind === 'spec')
|
|
310
|
+
return this.transformSpec(content);
|
|
311
|
+
if (kind === 'proposal')
|
|
312
|
+
return this.transformProposal(content);
|
|
313
|
+
if (kind === 'tasks')
|
|
314
|
+
return this.transformTasks(content);
|
|
315
|
+
return content; // design / config / draft 不 transform
|
|
316
|
+
}
|
|
317
|
+
// Task 2.6 spec.md 规则:### Requirement → ## Requirement / #### Scenario → ## Scenario / list-prefix WHEN/THEN/GIVEN → **When**/... / 多行续行合并
|
|
318
|
+
transformSpec(content) {
|
|
319
|
+
// 第一步:单次 walker 收集每行的 (line, ctx) 信息数组,后续 stage 复用
|
|
320
|
+
const rows = [];
|
|
321
|
+
walkLines(content, (line, ctx) => {
|
|
322
|
+
rows.push({ line, inFenced: ctx.inFenced, isTableRow: ctx.isTableRow });
|
|
323
|
+
});
|
|
324
|
+
// 第二步:stage1 行替换(只在 !inFenced && !isTableRow 行)
|
|
325
|
+
const stage1Lines = rows.map((r) => {
|
|
326
|
+
if (r.inFenced || r.isTableRow)
|
|
327
|
+
return r.line;
|
|
328
|
+
let l = r.line;
|
|
329
|
+
// ### Requirement → ## Requirement
|
|
330
|
+
l = l.replace(/^### Requirement:/, '## Requirement:');
|
|
331
|
+
// #### Scenario → ## Scenario
|
|
332
|
+
l = l.replace(/^#### Scenario:/, '## Scenario:');
|
|
333
|
+
// list-prefix WHEN/THEN/GIVEN/AND/BUT → **When**/**Then**/...
|
|
334
|
+
const m = l.match(/^(\s*)- \*\*(WHEN|THEN|GIVEN|AND|BUT)\*\*\s+(.+)$/i);
|
|
335
|
+
if (m) {
|
|
336
|
+
const [, indent, kw, rest] = m;
|
|
337
|
+
// 标题大小写:首字母大写,其余小写
|
|
338
|
+
const titleCase = (kw ?? '').charAt(0).toUpperCase() + (kw ?? '').slice(1).toLowerCase();
|
|
339
|
+
l = `${indent ?? ''}**${titleCase}** ${rest ?? ''}`;
|
|
340
|
+
}
|
|
341
|
+
return l;
|
|
342
|
+
});
|
|
343
|
+
// 第三步:fence-aware 多行续行合并 — fenced 内不合并(C #1 fix)
|
|
344
|
+
const out = [];
|
|
345
|
+
for (let i = 0; i < stage1Lines.length; i++) {
|
|
346
|
+
const cur = stage1Lines[i] ?? '';
|
|
347
|
+
const isFenced = rows[i]?.inFenced;
|
|
348
|
+
const isStep = !isFenced && /^(\s*)\*\*(When|Then|Given|And|But)\*\*\s/.test(cur);
|
|
349
|
+
if (isStep) {
|
|
350
|
+
let merged = cur;
|
|
351
|
+
// 续行:2+ 空格缩进 + 非 `-` 起始 + 非 heading + 非空 + 非 fenced
|
|
352
|
+
while (i + 1 < stage1Lines.length) {
|
|
353
|
+
const next = stage1Lines[i + 1] ?? '';
|
|
354
|
+
const nextFenced = rows[i + 1]?.inFenced;
|
|
355
|
+
if (!nextFenced && /^\s{2,}[^-#\s]/.test(next) && next.trim().length > 0) {
|
|
356
|
+
merged += ' ' + next.trim();
|
|
357
|
+
i++;
|
|
358
|
+
}
|
|
359
|
+
else
|
|
360
|
+
break;
|
|
361
|
+
}
|
|
362
|
+
out.push(merged);
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
out.push(cur);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
return out.join('\n');
|
|
369
|
+
}
|
|
370
|
+
// Task 2.7 proposal.md 规则:## Problem → ## Why / ## Proposed Solution → ## What
|
|
371
|
+
transformProposal(content) {
|
|
372
|
+
// 加 isTableRow 检查,与 transformSpec / transformTasks 保持一致(spec §2.5 / Minor 7 fix)
|
|
373
|
+
return walkLines(content, (line, ctx) => {
|
|
374
|
+
if (ctx.inFenced || ctx.isTableRow)
|
|
375
|
+
return;
|
|
376
|
+
if (line === '## Problem')
|
|
377
|
+
return '## Why';
|
|
378
|
+
if (line === '## Proposed Solution')
|
|
379
|
+
return '## What';
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
// Task 2.8 tasks.md 规则:数字编号 → task-N: / 三层 1.2.3 → task-1-2-3:
|
|
383
|
+
transformTasks(content) {
|
|
384
|
+
return walkLines(content, (line, ctx) => {
|
|
385
|
+
if (ctx.inFenced || ctx.isTableRow)
|
|
386
|
+
return;
|
|
387
|
+
// 匹配 `- [x] N.M.K. text` 格式(最多三层编号)
|
|
388
|
+
const m = line.match(/^(\s*)- \[([ x])\] (\d+(?:\.\d+){0,2})\.\s+(.+)$/);
|
|
389
|
+
if (!m)
|
|
390
|
+
return;
|
|
391
|
+
const [, indent, checked, num, rest] = m;
|
|
392
|
+
// 将 `1.2.3` 变为 `task-1-2-3`
|
|
393
|
+
const taskId = `task-${(num ?? '').replace(/\./g, '-')}`;
|
|
394
|
+
return `${indent ?? ''}- [${checked ?? ' '}] ${taskId}: ${rest ?? ''}`;
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
listMissingArtifacts(plan) {
|
|
398
|
+
// 枚举 Plan 中缺件的 artifacts;for each change,检查 proposal + spec(specs) 是否齐全
|
|
399
|
+
// C2 修:用目标分桶(proposal 优先 design,fallback tasks/'self';specs 优先 tasks,fallback design/'self')
|
|
400
|
+
const missing = [];
|
|
401
|
+
for (const c of plan.changes) {
|
|
402
|
+
const archivePrefix = c.classification === 'archive' ? 'archive/' : '';
|
|
403
|
+
// 检查 proposal — facts source 优先 design,fallback tasks,最后 self(附 sourceAbsPath)
|
|
404
|
+
if (!c.artifacts.proposal) {
|
|
405
|
+
let factsSource;
|
|
406
|
+
let sourceAbsPath;
|
|
407
|
+
if (c.artifacts.design) {
|
|
408
|
+
factsSource = 'design';
|
|
409
|
+
}
|
|
410
|
+
else if (c.artifacts.tasks) {
|
|
411
|
+
factsSource = 'tasks';
|
|
412
|
+
}
|
|
413
|
+
else {
|
|
414
|
+
// 都没有 — 用 specs 数组第一个(若有)作 self 路径
|
|
415
|
+
factsSource = 'self';
|
|
416
|
+
sourceAbsPath = c.artifacts.specs?.[0]?.absPath;
|
|
417
|
+
}
|
|
418
|
+
missing.push({
|
|
419
|
+
changeSlug: c.slug,
|
|
420
|
+
kind: 'proposal',
|
|
421
|
+
targetPath: `forge/changes/${archivePrefix}${c.slug}/proposal.md`,
|
|
422
|
+
factsSource,
|
|
423
|
+
sourceAbsPath,
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
// 检查 specs 数组 — facts source 优先 tasks,fallback design,最后 self(附 sourceAbsPath)
|
|
427
|
+
if (!c.artifacts.specs || c.artifacts.specs.length === 0) {
|
|
428
|
+
let factsSource;
|
|
429
|
+
let sourceAbsPath;
|
|
430
|
+
if (c.artifacts.tasks) {
|
|
431
|
+
factsSource = 'tasks';
|
|
432
|
+
}
|
|
433
|
+
else if (c.artifacts.design) {
|
|
434
|
+
factsSource = 'design';
|
|
435
|
+
}
|
|
436
|
+
else {
|
|
437
|
+
// 都没有 — 用 proposal(若有)作 self 路径
|
|
438
|
+
factsSource = 'self';
|
|
439
|
+
sourceAbsPath = c.artifacts.proposal?.absPath;
|
|
440
|
+
}
|
|
441
|
+
missing.push({
|
|
442
|
+
changeSlug: c.slug,
|
|
443
|
+
kind: 'specs',
|
|
444
|
+
targetPath: `forge/changes/${archivePrefix}${c.slug}/specs/${c.slug}.md`,
|
|
445
|
+
factsSource,
|
|
446
|
+
sourceAbsPath,
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
return missing;
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
//# sourceMappingURL=openspec.js.map
|