@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,178 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 调 forge archive CLI 把 change 移到 archive/、内部 sync specs/、严格校验 verify+review 标记
|
|
3
|
+
argument-hint: '<change-id> [--force] [--recover]'
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are about to handle `/forge:archive $ARGUMENTS`.
|
|
7
|
+
|
|
8
|
+
## 步骤
|
|
9
|
+
|
|
10
|
+
本命令是 CLI 的薄包装。直接执行:
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
node "${CLAUDE_PLUGIN_ROOT}/scripts/run-forge.mjs" archive $ARGUMENTS
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
(plugin helper 内部 spawn npx 拉 forge CLI,避开 v0.2 P1 全局 PATH 问题。OpenCode/Codex 路径下 commands.md 不可用,走 skill 内嵌路径 — 见 Plan 3 Task 3.3 + skills/finishing-a-development-branch/SKILL.md。)
|
|
17
|
+
|
|
18
|
+
## v1.0 三级分级行为(plan-9e1 落地)
|
|
19
|
+
|
|
20
|
+
archive 阶段在 verify+review marker 严格校验之外,再叠加"三级业务行为"裁决(沿 design §2.4.2):
|
|
21
|
+
|
|
22
|
+
| 状态 | archive 行为 |
|
|
23
|
+
| ---------------------------------------------------------------- | ------------------------------------------------------------ |
|
|
24
|
+
| 全 resolved=true | 通过 |
|
|
25
|
+
| CRITICAL resolved=false | **拒签**(无 ack 出口,exit 1) |
|
|
26
|
+
| WARNING resolved=false + `severity_acked_by` 非空 + ack-log 匹配 | 通过(标 acked-warning archive,handoff 列入 `acked_warnings`) |
|
|
27
|
+
| WARNING resolved=false + `severity_acked_by` 空 | **拒签**(exit 1) |
|
|
28
|
+
| SUGGESTION resolved=false(无论 ack 与否) | **通过**(标 pending-suggestion archive,handoff to backlog) |
|
|
29
|
+
|
|
30
|
+
**强 fence 优势保留**:CRITICAL 永远拒签,无 `--force` 出口(`--force` 仍只覆盖 v0.4 那两类降级 — human-override / 非 git;不扩展到 CRITICAL,沿 design §2.4.6)。
|
|
31
|
+
|
|
32
|
+
`review_outcomes` 端简码 S/C/L 迁移规则(v4 BLOCKER 1 + MAJOR 1 修订,沿 design §2.3.5 line 553-563):
|
|
33
|
+
|
|
34
|
+
| v0.4 简码 | v1.0 映射 | archive 行为 |
|
|
35
|
+
| ------------------ | --------------------- | --------------------------------------------------------------------------------------------------------------- |
|
|
36
|
+
| `S`(critical) | `CRITICAL` 直接映射 | `S + resolved=false` 拒签;`S + resolved=true` 通过 |
|
|
37
|
+
| `L`(low) | `SUGGESTION` 直接映射 | `L + resolved=false` 通过(进 pending_suggestions);`L + resolved=true` 通过 |
|
|
38
|
+
| `C`(clarification) | **不自动映射** | **任何状态**(resolved/accepted/rationale)**全拒签**;必须等 plan-9j 完成跑 `forge upgrade --resign-markers` 迁移 |
|
|
39
|
+
|
|
40
|
+
**重要**:`review_outcomes` 端不存在"`accepted=true + rationale 非空` 等价 ack"路径(v2 文档错误,v4 MAJOR 1 修订删除)— ReviewOutcome 接口本身无 `severity_acked_by` 字段;WARNING ack 必须经 verify_findings 端 CLI ack-log 协议(沿 design §2.3.3)。
|
|
41
|
+
|
|
42
|
+
## archive_summary 输出(plan-9e1 落地)
|
|
43
|
+
|
|
44
|
+
archive 成功后,**新增产物**:`forge/changes/archive/YYYY-MM-DD-<id>/archive_summary.yaml`(给 v1.1 backlog index 入参)。
|
|
45
|
+
|
|
46
|
+
完整 schema 见 [`src/core/schemas/archive-summary.ts`](../src/core/schemas/archive-summary.ts);9 顶级字段:
|
|
47
|
+
|
|
48
|
+
- `schema` literal `forge-archive-summary/v1`
|
|
49
|
+
- `version` semver
|
|
50
|
+
- `archived_at` ISO 8601 UTC
|
|
51
|
+
- `change_id` 字符串
|
|
52
|
+
- `verify_passed` / `review_passed` 摘要
|
|
53
|
+
- `process_evidence_summary`(9e1 placeholder → 9e2 真实统计,沿 plan-9g 14 不变量):
|
|
54
|
+
- `placeholder: false`
|
|
55
|
+
- `invariants_passed: number`(经 mapper 优先级筛选后仍为 status='pass' 的 invariant 数)
|
|
56
|
+
- `invariants_with_warning: number`(WARNING 经 fail/legacy-skip 优先级筛选后仍保留为 status='warning' 的数;legacy 路径下被豁免 invariant 的 WARNING 不计入,沿 master §3.4.4.1 精度损失)
|
|
57
|
+
- `invariants_failed: number`(v1.0 永远 = 0;fence.ok=false 时 archive 直接 exit 1,summary 不写入)
|
|
58
|
+
- `legacy_exempt: number`(`process_evidence_unavailable_legacy: true` 路径下被豁免的 invariant 数;legacy 路径恒 = 10,非 legacy 恒 = 0;flag 取自 verify || review 任一为 true)
|
|
59
|
+
- 不变式:`invariants_passed + invariants_with_warning + invariants_failed + legacy_exempt === 14`(沿 plan-9g FENCE_INVARIANT_NAMES.length)
|
|
60
|
+
- `handoff_to_backlog` 三类聚合(SUGGESTION 持挂 + pause_decisions chosen_option=3 + scope-entries active)
|
|
61
|
+
- `acked_warnings`(WARNING + ack 的引用,给用户回顾)
|
|
62
|
+
- `pending_suggestions`(SUGGESTION + resolved=false 引用,handoff 子集)
|
|
63
|
+
|
|
64
|
+
archive 成功后 stdout 渲染段(沿 design §2.4.4 模板):
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
## Archive Complete
|
|
68
|
+
|
|
69
|
+
**Change:** <change-id>
|
|
70
|
+
**Archived to:** forge/changes/archive/<archive-id>/
|
|
71
|
+
**Specs:** ✓ Synced
|
|
72
|
+
**Security:** [process_evidence:passed=3/warning=1/failed=0/legacy=10]
|
|
73
|
+
|
|
74
|
+
### Acknowledged Warnings (N)
|
|
75
|
+
- [WARNING] verify_findings#<id> (<dimension>/<check_type>)
|
|
76
|
+
Evidence: ...
|
|
77
|
+
Acked by: <user> at <iso>
|
|
78
|
+
Rationale: ...
|
|
79
|
+
|
|
80
|
+
### Pending Suggestions (M) — recorded in archive_summary
|
|
81
|
+
- [SUGGESTION] verify_findings#<id> (<dimension>/<check_type>)
|
|
82
|
+
Source: ...
|
|
83
|
+
Recommendation: ...
|
|
84
|
+
|
|
85
|
+
Review handoff details: cat forge/changes/archive/<archive-id>/archive_summary.yaml
|
|
86
|
+
Cross-change backlog: run `forge backlog list` (see forge/backlog/)
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## --resume-summary 用法(plan-9e1 落地,罕见状态)
|
|
90
|
+
|
|
91
|
+
设计语义:archive 流程"Move 完成 + 在 archive 目录把 `.tmp` rename 为正式名时失败"是极罕见状态(同目录 rename 几乎不会失败)。若发生:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
forge archive --resume-summary 2026-05-12-add-x
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
行为:
|
|
98
|
+
|
|
99
|
+
- archive 目录有 `.tmp` 无正式 `.yaml` → rename(exit 0)
|
|
100
|
+
- 两者都存在(冲突,无法判断 ground truth)→ 拒签 exit 1(用户手动检查后删一个再重跑)
|
|
101
|
+
- 两者都不存在 → 报错 exit 1(状态损坏 / 该 archive 从未生成 summary)
|
|
102
|
+
|
|
103
|
+
`forge validate <change-id>` 会扫描 active change 目录是否残留孤立 `archive_summary.tmp.yaml`,残留时给 WARNING 提示走 `--resume-summary` 或手动 `rm`。
|
|
104
|
+
|
|
105
|
+
## CLI 行为说明(给 AI 理解,不要重复实现)
|
|
106
|
+
|
|
107
|
+
1. **加进程锁** `forge/.cache/archive.lock`(防止并发)
|
|
108
|
+
2. **校验 verify-passed + review-passed 标记存在且合法**:
|
|
109
|
+
- YAML 解析成功 + `schema` 字段值 = `forge-verify/v1` 或 `forge-review/v1`
|
|
110
|
+
- 重算 `tasks_hash` / `content_hash` 必须等于 marker 字段值
|
|
111
|
+
- 重算 git.head + git.diff_hash 必须等于(`is_git_repo: true` 时)
|
|
112
|
+
- `verified_by`/`reviewed_by` 取值 ∈ `{ai-agent, human-override}`
|
|
113
|
+
3. **`--force` 接受这两类降级**:
|
|
114
|
+
- `verified_by`/`reviewed_by` = `human-override`
|
|
115
|
+
- `is_git_repo: false`(非 git 项目)跳过 git 字段
|
|
116
|
+
4. **`--force` 不覆盖**(任一不一致 archive 拒绝):
|
|
117
|
+
- tasks_hash/content_hash 不一致(标记过期或被篡改)
|
|
118
|
+
- evidence log 文件缺失 / log_hash 不匹配 / pass ≠ true
|
|
119
|
+
- review_outcomes 中 accepted=true 但 resolved=false
|
|
120
|
+
- **CRITICAL finding 未 resolve**(三级 fence 强不变量,无 ack 出口;沿 plan-9e1 §三级行为表)
|
|
121
|
+
- **WARNING finding 未 resolve 且缺 ack**(用户必须显式 ack `severity_acked_by`)
|
|
122
|
+
5. **archive 顺序原子化**(沿 design §2.4.5 + spec §3.5):
|
|
123
|
+
- Move 前先写 `archive_summary.tmp.yaml` 到 source 目录
|
|
124
|
+
- Move(rename change → archive)
|
|
125
|
+
- rename `.tmp` → 正式 `archive_summary.yaml`
|
|
126
|
+
- Backup specs/
|
|
127
|
+
- Sync specs/
|
|
128
|
+
- 任一阶段失败按 §2.4.5 表回滚
|
|
129
|
+
6. **`--recover` 子模式**:扫描半归档状态(case A/B/C)并修复(沿 v0.4)
|
|
130
|
+
7. **`--resume-summary <archive-id>` 子模式**(plan-9e1):处理 archive 目录半完成 `.tmp` rename(rename ok / 双份冲突拒签 / 状态损坏报错)
|
|
131
|
+
|
|
132
|
+
## 禁止行为
|
|
133
|
+
|
|
134
|
+
- 不允许手工实现 Move/Sync/Rollback 原子化步骤(那是 CLI 内部实现;AI 只调 CLI,不重现 CLI 行为)
|
|
135
|
+
- 不允许在 archive 失败时绕过 verify+review 标记直接 mv 文件
|
|
136
|
+
- 不允许在 `--force` 不被允许的场景(如 hash 不匹配)主动加 `--force` 试图绕过
|
|
137
|
+
|
|
138
|
+
## AI 后续行为
|
|
139
|
+
|
|
140
|
+
archive 成功后,**调用 `forge:finishing-a-development-branch` skill** 提示用户做 git 层面的合并/PR/清理决策。
|
|
141
|
+
|
|
142
|
+
## 与其他 sub-plan 合并点(参考 master plan §3.5)
|
|
143
|
+
|
|
144
|
+
本文件由多个 sub-plan 共同维护:
|
|
145
|
+
|
|
146
|
+
- **9e1**(本文件落地):三级分级行为表 + archive_summary 输出格式 + --resume-summary 用法
|
|
147
|
+
- **9e2(已完成,plan-9e2)**:`process_evidence_summary` 字段从 placeholder 接 plan-9g 实施的 14 不变量真实统计(4 字段计数:passed / with_warning / failed / legacy_exempt;sum 不变式 = 14)
|
|
148
|
+
- **9g**(process_evidence):在"archive 顺序原子化"步骤中加入 worktree 重跑 + 结构化 reporter parsing(注:9g 实施时 **不动** 9e1 的 .tmp / rename / 三级 fence 步骤,只在 verify markers 阶段之前插入 worktree 阶段)
|
|
149
|
+
|
|
150
|
+
merge 顺序推荐:**9e1 → 9g → 9e2(已完成全链)** — 14 不变量真实统计已接入,placeholder 路径仅 plan-9e1 backward-compat 兼容保留
|
|
151
|
+
|
|
152
|
+
## C 简码迁移协议(plan-9e1 v4 BLOCKER 1 落地 + plan-9j v2 解锁)
|
|
153
|
+
|
|
154
|
+
`review_outcomes[i].severity = 'C'`(v0.4 clarification 简码)在 v1.0 三级体系中**不直接对应**;archive 阶段会**硬拒签**。
|
|
155
|
+
|
|
156
|
+
**plan-9j 落地完成后**:用户工作流解锁路径:
|
|
157
|
+
|
|
158
|
+
1. 跑 `forge upgrade --resign-markers <change-id>` — 若含 C 简码,exit 1 + 写 pending file
|
|
159
|
+
2. 跑 `forge ack confirm <change-id> <findingId> --target-severity <WARNING|SUGGESTION>` — user 判定目标 severity
|
|
160
|
+
3. 重跑 `forge upgrade --resign-markers <change-id>` — confirm 后 marker `severity` 字段改回全名,archive 通过
|
|
161
|
+
|
|
162
|
+
**plan-9j 未完成时**(本 plan 实施期间):archive 含 C 简码 marker 仍是阻塞性硬墙(无 manual edit 出口,沿 v4 BLOCKER 1 三道墙)。
|
|
163
|
+
|
|
164
|
+
## exit code 遗留声明(plan-9e1 v3 MAJOR 1 / v5 MINOR 3 修订:口径统一)
|
|
165
|
+
|
|
166
|
+
`forge archive` 各路径 LockHeldError 的 exit code:
|
|
167
|
+
|
|
168
|
+
| 路径 | exit code | 说明 |
|
|
169
|
+
| ------------------------------------------------------------ | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
170
|
+
| `forge archive <id>`(主路径) | 5 | v0.4 遗留 — **master §3.12.3 将由 plan-9e1 Task 6 Step 4-pre 加 known limitation 注脚**(实施时落地;plan v7 阶段 master 仍是 freeze 表无注脚);由后续 sub-plan(候选:9z release / 单独 cleanup plan)统一全路径 exit 2 |
|
|
171
|
+
| `forge archive --recover` | 5 | 同上 v0.4 遗留 |
|
|
172
|
+
| `forge archive --resume-summary <archive-id>`(plan-9e1 新增) | **2** | 对齐 master §3.12.3 freeze |
|
|
173
|
+
|
|
174
|
+
**v5 口径统一(v10 措辞收干)**:不再说 "9e1 不修留 GH issue 跟进"(原 v3 措辞);改为 reflection **将由 Task 6 Step 4-pre 实施时落到** master plan(沿 v5 选项 C 修订;**实施 plan 阶段** master 仍是 freeze 表无注脚,Task 6 Step 4-pre 实施完成后 master 加 known limitation 注脚)。后续 sub-plan(9z release / cleanup plan)接 master notation 统一全路径 exit 2。
|
|
175
|
+
|
|
176
|
+
## backlog 产物(plan-backlog-registry)
|
|
177
|
+
|
|
178
|
+
archive 成功后,CLI 自动重生成项目级 backlog 注册表 `forge/backlog/{active.md,archived.md}`(跨所有 archived change 聚合未决 scope-entry;首次生成时附带 `README.md`)。backlog 生成失败**不回滚 archive**(archive 主流程已成功,backlog 是衍生产物),仅 stderr WARNING + 提示手动跑 `forge backlog`。详见 `forge backlog` 子命令(`forge backlog` 重生成 / `forge backlog list` 查询 / `forge backlog --check` CI staleness 守门)。
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 把模糊想法转化为 forge/drafts/ 下的结构化 draft,通过强制提问 + 设计探讨完成
|
|
3
|
+
argument-hint: '<topic>'
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are about to handle a `/forge:brainstorm <topic>` invocation. The user typed:
|
|
7
|
+
|
|
8
|
+
```
|
|
9
|
+
/forge:brainstorm $ARGUMENTS
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
Follow these steps strictly. Do NOT skip any:
|
|
13
|
+
|
|
14
|
+
1. **必须先调用 `forge:brainstorming` skill**(用 Skill 工具,skill 名 `forge:brainstorming`)。该 skill 强制提问 / 不允许直接给方案 / 不允许写代码。
|
|
15
|
+
2. 完成 skill 内的全部 checklist(包括"探索项目上下文"、"逐个澄清问题"、"提 2-3 方案"、"分段呈现 design")。
|
|
16
|
+
3. 确认 design 通过用户审阅后,把 draft **保存到 `forge/drafts/<YYYY-MM-DD>-<topic>.md`**(date 用今天,topic 来自用户参数,小写连字符化)。
|
|
17
|
+
4. 若 `forge/drafts/` 目录不存在,先 `mkdir -p forge/drafts/`。
|
|
18
|
+
5. 写完后,提示用户:"draft 保存到 `forge/drafts/<file>`,确认要推进就跑 `/forge:propose <change-id> --from-draft <date>-<topic>`"。
|
|
19
|
+
|
|
20
|
+
## 禁止行为
|
|
21
|
+
|
|
22
|
+
- 不允许直接产出 `forge/changes/<id>/` 任何文件(那是 `/forge:propose` 的工作)
|
|
23
|
+
- 不允许跳过 `forge:brainstorming` skill 的提问环节,即使用户表示"我已经想清楚了"
|
|
24
|
+
- 不允许在 `forge/specs/` 里写任何东西(specs/ 仅由 archive 内部 sync 写入)
|
|
25
|
+
|
|
26
|
+
## (可选)Stage extensions hook — Tier 1 Claude Code only
|
|
27
|
+
|
|
28
|
+
> codex review 集成。AI 主代理在本 stage(`brainstorming`)跑多轮收敛协议。
|
|
29
|
+
> Tier 2/3(Codex/OpenCode)见 [`docs/stage-extensions.md §未来 Tier 2/3 集成`](../docs/stage-extensions.md#未来-tier-23-集成)。
|
|
30
|
+
|
|
31
|
+
**Step A — 检查是否启用**:读 `forge/config.yaml#stage_extensions.brainstorming`。无该字段 / 数组为空 / 全部 entry `enabled: false` → **跳过本段,流程结束**。
|
|
32
|
+
|
|
33
|
+
**Step B — 对每个 `enabled` entry 跑多轮收敛 loop**:
|
|
34
|
+
|
|
35
|
+
初始化 `round = 1`、`threadId = ''`、`roundHistory = []`、`roundLimit = null`(F1-v8 fix:`roundLimit` **不从 config 文件读** —— effective convergence 由 runner 输出,见 Step 3。AI 协议不碰 config 文件解析 / deep-merge,单一数据源是 runner JSON)。循环:
|
|
36
|
+
|
|
37
|
+
1. **跑单轮 runner**:
|
|
38
|
+
```bash
|
|
39
|
+
node "${CLAUDE_PLUGIN_ROOT}/scripts/run-forge.mjs" stage-extensions run \
|
|
40
|
+
--stage brainstorming --change-id <change-id> --extension <entry-name> \
|
|
41
|
+
--round <round>${threadId:+ --thread-id $threadId}
|
|
42
|
+
```
|
|
43
|
+
2. **解析 stdout JSON 的 `kind`**:
|
|
44
|
+
- `converged` → 该 entry 收敛完成,**break loop**(codex 输出 verbatim 透传给用户)
|
|
45
|
+
- `failed` / `config_error` / `no_extension` → 该 entry 放弃,**break loop**(loose,不阻塞主流程)
|
|
46
|
+
- `unconverged` → 继续 3
|
|
47
|
+
3. **从 unconverged JSON 取状态**(F1-v8 fix:effective config 来自 runner 输出,runner 内 `validateStageExtensionsConfig` 已 normalize):
|
|
48
|
+
- `roundHistory.push({ round, block_count: <blockFindings.length> })`;`threadId = <JSON.threadId>`;codex finding verbatim 透传给用户
|
|
49
|
+
- 首轮:`roundLimit = <JSON.effectiveConvergence.max_rounds>`(后续轮 `roundLimit` 已设,不覆盖 —— 选项①的 `roundLimit += N` 增量须保留)
|
|
50
|
+
4. **若 `round >= roundLimit`**(F2-v7 fix:用可增长的 `roundLimit`):
|
|
51
|
+
- 若 `<JSON.effectiveConvergence.max_rounds_on_exceed>` 为 `force_end` → 把 blockFindings 写 `forge/changes/<id>/.evidence/codex-pending-findings.yaml`(backlog),**break loop**
|
|
52
|
+
- 否则跑 `node "${CLAUDE_PLUGIN_ROOT}/scripts/run-forge.mjs" stage-extensions analyze-trend --history '<roundHistory JSON>'` 拿 TrendAdvice,再 `AskUserQuestion` 三选项(默认推 `TrendAdvice.recommended_option`):**①再跑 N 轮**(F2-v7 fix:读用户输入的 `N`,执行 `roundLimit += N`,然后 `round++` 继续 loop —— 后续 `round >= roundLimit` 判定按新上限走,不会立刻又进 Step 4)/ **②放弃 codex**(break loop)/ **③接受当前**(blockFindings 写 backlog,break loop)
|
|
53
|
+
5. **否则(`round < roundLimit`)**:`AskUserQuestion` 三选项(默认推 `<JSON.userInteraction.block_unconverged>`):
|
|
54
|
+
- **①auto_fix** → 用 `Task` 工具 dispatch fresh fix subagent 修 blockFindings → `round++`,继续 loop
|
|
55
|
+
- **②manual_fix** → 等用户改完 → `round++`,继续 loop
|
|
56
|
+
- **③give_up** → break loop
|
|
57
|
+
|
|
58
|
+
**Step C — loose**:本段任何步骤(runner 调用 / AskUserQuestion / fix dispatch)失败都**不阻塞主流程 fence**。runner 永远 exit 0;AskUserQuestion harness 不支持时降级终端 prompt。
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Run codex adversarial review on focus artifact (forge B-full wrapper - AI-invokable; bypasses /codex:adversarial-review disable-model-invocation lock)
|
|
3
|
+
argument-hint: '[focus text or file path]'
|
|
4
|
+
allowed-tools: Read, Bash(codex:*), Bash(node:*), Bash(git:*), Bash(mkdir:*), AskUserQuestion
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
You are about to handle `/forge:codex-adversarial $ARGUMENTS`.
|
|
8
|
+
|
|
9
|
+
## What this command does
|
|
10
|
+
|
|
11
|
+
Run a Codex adversarial review against the user-specified focus. Unlike `/codex:adversarial-review`
|
|
12
|
+
(which has `disable-model-invocation: true` blocking AI auto-invoke), this forge wrapper IS
|
|
13
|
+
invokable by AI agents — enabling automated codex review in forge workflows.
|
|
14
|
+
|
|
15
|
+
**Wrapper status**:**临时(B-full)**。`plan-stage-extensions-framework` 实施完成后,完整
|
|
16
|
+
runner (`forge stage-extensions run --stage <s>`) 会替换本 wrapper(沿 plan §3-§7)。
|
|
17
|
+
|
|
18
|
+
## Step-by-step protocol
|
|
19
|
+
|
|
20
|
+
### Step 1: 解析 $ARGUMENTS
|
|
21
|
+
|
|
22
|
+
$ARGUMENTS 是用户给的 focus 文本或文件路径。例如:
|
|
23
|
+
|
|
24
|
+
- `/forge:codex-adversarial review plan v1 in docs/plans/2026-05-15-plan-stage-extensions-framework.md`
|
|
25
|
+
- `/forge:codex-adversarial`(空 — 默认 review 当前 branch)
|
|
26
|
+
|
|
27
|
+
如果 $ARGUMENTS 包含一个 .md / .ts / .yaml 文件路径,这是 focus artifact;
|
|
28
|
+
否则整个 $ARGUMENTS 作为 user focus 文本。
|
|
29
|
+
|
|
30
|
+
### Step 2: 构造 prompt 文件
|
|
31
|
+
|
|
32
|
+
跑 helper build-prompt 子命令:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
PROMPT_FILE=$(mktemp -t forge-codex-adv-XXXXXX.md)
|
|
36
|
+
node "${CLAUDE_PLUGIN_ROOT}/scripts/codex-review-helper.mjs" build-prompt \
|
|
37
|
+
--template "${CLAUDE_PLUGIN_ROOT}/src/core/codex-review/prompts/adversarial-default.md" \
|
|
38
|
+
--output "$PROMPT_FILE" \
|
|
39
|
+
--user-focus "$ARGUMENTS" \
|
|
40
|
+
--target-label "$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo 'current state')"
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Step 3: 准备 output log 路径
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
LOG_DIR="${PWD}/.forge-codex-logs"
|
|
47
|
+
mkdir -p "$LOG_DIR"
|
|
48
|
+
LOG_FILE="$LOG_DIR/codex-adversarial-$(date +%s).log"
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Step 4: 跑 codex(通过 helper)
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
node "${CLAUDE_PLUGIN_ROOT}/scripts/codex-review-helper.mjs" run \
|
|
55
|
+
--prompt-file "$PROMPT_FILE" \
|
|
56
|
+
--output-log "$LOG_FILE"
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
主代理需要把 codex 的 stdout **verbatim** 透传到会话(沿 codex 协议要求:
|
|
60
|
+
"Return Codex's output verbatim. Do not paraphrase, summarize, or add commentary
|
|
61
|
+
before or after it.")。
|
|
62
|
+
|
|
63
|
+
### Step 5: 清理 + 报告
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
rm -f "$PROMPT_FILE"
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
告诉用户:
|
|
70
|
+
|
|
71
|
+
- codex finding 已 verbatim 透传(上面)
|
|
72
|
+
- log 文件位置 `$LOG_FILE`(用户可后续查)
|
|
73
|
+
|
|
74
|
+
## 错误处理
|
|
75
|
+
|
|
76
|
+
- codex CLI 未装(`codex --version` 失败)→ helper 报错 + 提示用户跑 `codex login` / 装 codex
|
|
77
|
+
- prompt build 失败 → 检查 template 路径
|
|
78
|
+
- codex exit !=0 → 错误透传给用户,**不**自动 retry(B-full 不实现 retry / 多轮 / 僵尸检测 —
|
|
79
|
+
这些是完整 framework 的事)
|
|
80
|
+
|
|
81
|
+
## 禁止行为
|
|
82
|
+
|
|
83
|
+
- ✗ 不允许 paraphrase / summarize codex 输出(沿 codex verbatim 协议)
|
|
84
|
+
- ✗ 不允许自动修复 codex 找到的问题(本命令只跑 review,不动代码)
|
|
85
|
+
- ✗ 不允许跳过 prompt 文件直接 inline prompt(B-full 接口约束)
|
|
86
|
+
|
|
87
|
+
## 已知限制(B-full)
|
|
88
|
+
|
|
89
|
+
- 单轮 review,无多轮收敛(完整 framework 加)
|
|
90
|
+
- 同步阻塞(无 `--background`)— codex 跑完才返回
|
|
91
|
+
- 无僵尸检测(codex 卡住 → 用户 Ctrl+C)
|
|
92
|
+
- 无 `--resume` thread 复用(每次跑都新 thread)
|
|
93
|
+
- 单一模板 `adversarial-default.md`(完整 framework 加 stage-specific 模板)
|
|
94
|
+
|
|
95
|
+
完整能力见 plan `docs/plans/2026-05-15-plan-stage-extensions-framework.md` §3-§7。
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 主动触发非线性思考空间 — 鼓励 ASCII diagram / 选项对比 / 反思 assumption;探索完必须显式收尾 + capture offer 含具体 forge 路径(沿 design §2.5)
|
|
3
|
+
argument-hint: '[<topic> | --change <id>]'
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are about to handle a `/forge:explore [<topic> | --change <id>]` invocation. The user typed:
|
|
7
|
+
|
|
8
|
+
```
|
|
9
|
+
/forge:explore $ARGUMENTS
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
Follow these steps strictly. Do NOT skip any:
|
|
13
|
+
|
|
14
|
+
1. **必须先调用 `forge:exploring` skill**(用 Skill 工具,skill 名 `forge:exploring`)。该 skill 强制显式收尾 + 可执行 capture offer + 禁止 explore 阶段直接写 artifacts(沿 design §2.5.6 反向加固三条)。
|
|
15
|
+
2. **解析参数**:
|
|
16
|
+
- 无参数:开放探索,不绑定具体 change。
|
|
17
|
+
- `--change <id>`:绑定本 change,**读** `forge/changes/<id>/{proposal,design,tasks,specs/*}.md` 作上下文。
|
|
18
|
+
- `<topic>`(自由文本,非 `--` 开头):用户给的探索主题。
|
|
19
|
+
- 在 `/forge:apply` subagent 实施中、检测到唯一未归档 change 时,允许省略 `--change`(沿 v0.4 推断模式)。
|
|
20
|
+
3. 完成 skill 内全部协议步骤(读上下文 → 探索阶段 → `## Exploration Summary` 显式收尾 → Capture offer 给具体 `file:section`)。
|
|
21
|
+
4. **若 Capture offer 被用户明确确认**(明确"yes / 改吧 / capture 吧"),才走对应 capture decisions 表的落地位置(如 `design.md` / `proposal.md` / `tasks.md` / `forge/drafts/`);Write / Edit 前再次反确认具体段落改动。
|
|
22
|
+
|
|
23
|
+
## 禁止行为
|
|
24
|
+
|
|
25
|
+
- 不允许 explore turn 内直接 Write / Edit 修改 `forge/changes/*` artifacts(沿 design §2.5.6 反向加固第三条 + OpenSpec `explore.ts:132` "Don't auto-capture")— 读 Read 允许,写必须经 Capture offer + 用户明确确认两步
|
|
26
|
+
- 不允许"探索完成无结论"— skill 末尾必须显式输出 `## Exploration Summary` 段(沿 §2.5.6 反向加固第一条)
|
|
27
|
+
- 不允许 vague capture offer(如"也许更新 design")— 必须 `file:section` 具体(沿 §2.5.6 反向加固第二条)
|
|
28
|
+
- 不允许触发对 archived change artifacts 的修改 — archived 冻结,引导起新 change supersede(沿 v0.4 archive 不变量 + design §2.5.5 桥接)
|
|
29
|
+
- 不允许在用户已明示"我自己决定"的情况下直接替用户选(沿 OpenSpec `explore.ts:132` "The user decides — Offer and move on")
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** 7 个 slash 命令名(spec §2.2 6 命令表 + plan-9f explore;实际 slash 名为 /forge:<name>) */
|
|
2
|
+
export declare const COMMAND_NAMES: readonly ["brainstorm", "propose", "apply", "review", "verify", "archive", "explore"];
|
|
3
|
+
export type CommandName = (typeof COMMAND_NAMES)[number];
|
|
4
|
+
/** 单 command 内容加载 — 用 import.meta.url 定位,开发与生产路径自适应 */
|
|
5
|
+
export declare function loadCommand(name: CommandName): Promise<string>;
|
|
6
|
+
export interface LoadedCommand {
|
|
7
|
+
name: CommandName;
|
|
8
|
+
content: string;
|
|
9
|
+
}
|
|
10
|
+
/** 全量加载 7 个 slash 命令,失败抛错(说明某个 .md 漏建) */
|
|
11
|
+
export declare function loadAllCommands(): Promise<LoadedCommand[]>;
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/templates/commands/index.ts"],"names":[],"mappings":"AAUA,iFAAiF;AACjF,eAAO,MAAM,aAAa,uFAQhB,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,uDAAuD;AACvD,wBAAsB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAEpE;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,0CAA0C;AAC1C,wBAAsB,eAAe,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAIhE"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// 7 个 slash 命令模板的 registry — Plan 4 + plan-9f
|
|
2
|
+
// 文件实体 .md 由 Task C 逐个填实
|
|
3
|
+
import { readFile } from 'node:fs/promises';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { dirname, join } from 'node:path';
|
|
6
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
7
|
+
const __dirname = dirname(__filename);
|
|
8
|
+
/** 7 个 slash 命令名(spec §2.2 6 命令表 + plan-9f explore;实际 slash 名为 /forge:<name>) */
|
|
9
|
+
export const COMMAND_NAMES = [
|
|
10
|
+
'brainstorm',
|
|
11
|
+
'propose',
|
|
12
|
+
'apply',
|
|
13
|
+
'review',
|
|
14
|
+
'verify',
|
|
15
|
+
'archive',
|
|
16
|
+
'explore', // 9f 新增(沿 design §2.5 + plan-9f;非线性思考空间,非产物驱动)
|
|
17
|
+
];
|
|
18
|
+
/** 单 command 内容加载 — 用 import.meta.url 定位,开发与生产路径自适应 */
|
|
19
|
+
export async function loadCommand(name) {
|
|
20
|
+
return readFile(join(__dirname, `${name}.md`), 'utf8');
|
|
21
|
+
}
|
|
22
|
+
/** 全量加载 7 个 slash 命令,失败抛错(说明某个 .md 漏建) */
|
|
23
|
+
export async function loadAllCommands() {
|
|
24
|
+
return Promise.all(COMMAND_NAMES.map(async (name) => ({ name, content: await loadCommand(name) })));
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/templates/commands/index.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,yBAAyB;AAEzB,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,iFAAiF;AACjF,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,YAAY;IACZ,SAAS;IACT,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,SAAS,EAAE,+CAA+C;CAClD,CAAC;AAIX,uDAAuD;AACvD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAiB;IACjD,OAAO,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;AACzD,CAAC;AAOD,0CAA0C;AAC1C,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,OAAO,OAAO,CAAC,GAAG,CAChB,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAChF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 把 draft(可选)转化为 forge/changes/<id>/ 下的 4 件套(proposal + specs + design + tasks)
|
|
3
|
+
argument-hint: '<change-id> [--from-draft <date-topic>] [--light]'
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are about to handle `/forge:propose $ARGUMENTS`.
|
|
7
|
+
|
|
8
|
+
解析参数:
|
|
9
|
+
|
|
10
|
+
- 第一个 token 是 `<change-id>`(slug,小写连字符)
|
|
11
|
+
- 可选 `--from-draft <date-topic>` 指定要消费的 draft 文件(对应 `forge/drafts/<date-topic>.md`)
|
|
12
|
+
- **可选 `--light`**:强制 writing-plans skill 走 light mode(沿 v0.3 P3)
|
|
13
|
+
|
|
14
|
+
## 前置 — Pending follow-ups 扫描(plan-9b §2.6.5)
|
|
15
|
+
|
|
16
|
+
**在产 proposal/design/tasks 之前**,先扫 archived changes 的 out-of-scope / future-work / non-goal:
|
|
17
|
+
|
|
18
|
+
1. 跑 `node "${CLAUDE_PLUGIN_ROOT}/scripts/run-forge.mjs" scope scan-archived-followups <change-id>`(若 helper 不可用,fallback 调本地 `npx forge scope scan-archived-followups <change-id>`)
|
|
19
|
+
2. 解析 stdout JSON;若 `entries` 为空 → 跳过本段直接进步骤 1
|
|
20
|
+
3. 若非空 → 用 AskUserQuestion 渲染:
|
|
21
|
+
- 按 `category` 分组(future-work / out-of-scope / non-goal),沿 §2.6.5 优先级排序
|
|
22
|
+
- 标题:"## Pending follow-ups from archived changes (N active)"
|
|
23
|
+
- 每个 entry 显示:`[source_change] id — description`
|
|
24
|
+
- 每项 5 选项:`inherit`(本 change 做)/ `acknowledge but defer`(留 active)/ `mark obsolete` / `mark superseded by some other change` / `mark completed`(本 change 已实际完成该 backlog 项)
|
|
25
|
+
4. 用户决策聚合并写入:
|
|
26
|
+
- **`inherit`**:写到本 change 自己的 `## Out of Scope/Future Work` YAML 块成为新 entry,archived 来源用 **`related_change: "<source_change>"`** 字段记录(change 粒度;entry 级精确来源由配套那条 superseding ref 的 `entry_id` 承载)(**勿**写 `triggered_by: {source: "from-archived", ...}` —— `from-archived` 不在 `TriggeredByRef.source` 枚举内,会被严格 validator 拒签);**并且**在 `superseding_entries` 数组写一条 `{source_change, entry_id, new_status: inherited, rationale}` —— 否则被继承的老 entry 不会从 backlog 注册表扣除,造成 double-count(plan-backlog-registry §9a/§9b)。此处 `rationale` 填「从 `<source_change>` 继承至本 change 实施」一类说明,勿留空
|
|
27
|
+
- **`mark obsolete` / `mark superseded` / `mark completed`**:各写一条 `superseding_entries` 项(`{source_change, entry_id, new_status, rationale}`,`new_status` 取 `obsolete` / `superseded` / `completed`)
|
|
28
|
+
5. `acknowledge but defer` 不写(留原 archived entry 仍 active,下次再问)
|
|
29
|
+
|
|
30
|
+
**不强制** — 用户可全跳过 / 部分处理。但**必须**显式提示,不能静默忽略。
|
|
31
|
+
|
|
32
|
+
## 步骤(必须按序)
|
|
33
|
+
|
|
34
|
+
1. **若提供了 `--from-draft <name>`**:
|
|
35
|
+
- 读 `forge/drafts/<name>.md`(若不存在,**报错并停止**:"draft 不存在: forge/drafts/<name>.md。可用 draft: " + 列出 `forge/drafts/*.md`)
|
|
36
|
+
- 把 draft 内容作为后续 writing 的输入上下文
|
|
37
|
+
2. **读 `forge/config.yaml`** 提取 `context`(tech stack)和 `rules.{proposal,specs,design,tasks}`,把这些作为系统提示注入后续 skill。
|
|
38
|
+
3. **必须调用 `forge:writing-plans` skill** 来产出 tasks。
|
|
39
|
+
4. 产出文件到 `forge/changes/<change-id>/`(如目录已存在且非空,**报错并停止**:"change 已存在: forge/changes/<change-id>/。请改 change-id 或删除已有目录"):
|
|
40
|
+
- `proposal.md` — H1 标题 + Why + What + Scope
|
|
41
|
+
- **必须**含 `## Out of Scope {#forge-oos}` 段(沿 plan-9b §2.6.3);若本 change 没有 out-of-scope 项,该段仅占位 anchor 无 YAML 块(合法)
|
|
42
|
+
- **必须**含 `## Non-Goals {#forge-non-goals}` 段(同上)
|
|
43
|
+
- 若上面 §"前置"步骤 4 收集到 `inherit` / `superseding_entries` 决策 → 写入对应段的 `forge-scope-entries/v1` YAML 块(inherit 项带 `related_change`,且必配一条 `new_status: inherited` 的 superseding_entries 项 —— plan-backlog-registry §9a/§9b)
|
|
44
|
+
- `specs/<sub-area>.md` — 每个改动域一个文件,Given/When/Then 三段格式(spec deltas)
|
|
45
|
+
- `design.md` — H1 标题 + 技术方案 + 数据模型 + 接口设计;**必须**含 `## Future Work {#forge-future-work}` 段(同上,可仅占位)
|
|
46
|
+
- `tasks.md` — checkbox 任务列表,粒度 2-5 分钟一步,采用 forge:writing-plans skill 的 task 结构
|
|
47
|
+
5. **若有 `--from-draft`**:把 draft 移到 `forge/drafts/.consumed/<name>.md`(filesystem chmod 444 只读)。
|
|
48
|
+
6. 跑 `node "${CLAUDE_PLUGIN_ROOT}/scripts/run-forge.mjs" validate <change-id>` 确认 4 件套完整 + scope YAML 合规(沿 plan-9b §2.6.8;若 helper 不可用 改用 skill 内嵌 fenced bash 调 helper,见 Plan 3 Task 3.3)。**若 validate 失败,根据错误回去补,不要把不完整产物留下**。
|
|
49
|
+
|
|
50
|
+
## 禁止行为
|
|
51
|
+
|
|
52
|
+
- 不允许跳过 `forge:writing-plans` skill 直接写 tasks.md(skill 内置 self-review,跳过会漏 placeholder 检查)
|
|
53
|
+
- 不允许把任何东西写到 `forge/specs/`(那是 archive 内部 sync 的输出)
|
|
54
|
+
- 不允许在 `forge/changes/<id>/` 之外创建产物文件
|
|
55
|
+
- **不允许省略三段 anchor**(plan-9b §2.6.3):缺 `{#forge-oos}` / `{#forge-non-goals}` / `{#forge-future-work}` 会让 content_hash 把 follow-up 编辑算进 marker 失效,违反 §2.6.3 解耦
|
|
56
|
+
- **不允许把 archived followups 决策静默丢弃**:若 scan 输出非空,必须走 AskUserQuestion 让用户做决策
|
|
57
|
+
|
|
58
|
+
## (可选)Stage extensions hook — Tier 1 Claude Code only
|
|
59
|
+
|
|
60
|
+
> codex review 集成。AI 主代理在本 stage(`propose`)跑多轮收敛协议。
|
|
61
|
+
> Tier 2/3(Codex/OpenCode)见 [`docs/stage-extensions.md §未来 Tier 2/3 集成`](../docs/stage-extensions.md#未来-tier-23-集成)。
|
|
62
|
+
|
|
63
|
+
**Step A — 检查是否启用**:读 `forge/config.yaml#stage_extensions.propose`。无该字段 / 数组为空 / 全部 entry `enabled: false` → **跳过本段,流程结束**。
|
|
64
|
+
|
|
65
|
+
**Step B — 对每个 `enabled` entry 跑多轮收敛 loop**:
|
|
66
|
+
|
|
67
|
+
初始化 `round = 1`、`threadId = ''`、`roundHistory = []`、`roundLimit = null`(F1-v8 fix:`roundLimit` **不从 config 文件读** —— effective convergence 由 runner 输出,见 Step 3。AI 协议不碰 config 文件解析 / deep-merge,单一数据源是 runner JSON)。循环:
|
|
68
|
+
|
|
69
|
+
1. **跑单轮 runner**:
|
|
70
|
+
```bash
|
|
71
|
+
node "${CLAUDE_PLUGIN_ROOT}/scripts/run-forge.mjs" stage-extensions run \
|
|
72
|
+
--stage propose --change-id <change-id> --extension <entry-name> \
|
|
73
|
+
--round <round>${threadId:+ --thread-id $threadId}
|
|
74
|
+
```
|
|
75
|
+
2. **解析 stdout JSON 的 `kind`**:
|
|
76
|
+
- `converged` → 该 entry 收敛完成,**break loop**(codex 输出 verbatim 透传给用户)
|
|
77
|
+
- `failed` / `config_error` / `no_extension` → 该 entry 放弃,**break loop**(loose,不阻塞主流程)
|
|
78
|
+
- `unconverged` → 继续 3
|
|
79
|
+
3. **从 unconverged JSON 取状态**(F1-v8 fix:effective config 来自 runner 输出,runner 内 `validateStageExtensionsConfig` 已 normalize):
|
|
80
|
+
- `roundHistory.push({ round, block_count: <blockFindings.length> })`;`threadId = <JSON.threadId>`;codex finding verbatim 透传给用户
|
|
81
|
+
- 首轮:`roundLimit = <JSON.effectiveConvergence.max_rounds>`(后续轮 `roundLimit` 已设,不覆盖 —— 选项①的 `roundLimit += N` 增量须保留)
|
|
82
|
+
4. **若 `round >= roundLimit`**(F2-v7 fix:用可增长的 `roundLimit`):
|
|
83
|
+
- 若 `<JSON.effectiveConvergence.max_rounds_on_exceed>` 为 `force_end` → 把 blockFindings 写 `forge/changes/<id>/.evidence/codex-pending-findings.yaml`(backlog),**break loop**
|
|
84
|
+
- 否则跑 `node "${CLAUDE_PLUGIN_ROOT}/scripts/run-forge.mjs" stage-extensions analyze-trend --history '<roundHistory JSON>'` 拿 TrendAdvice,再 `AskUserQuestion` 三选项(默认推 `TrendAdvice.recommended_option`):**①再跑 N 轮**(F2-v7 fix:读用户输入的 `N`,执行 `roundLimit += N`,然后 `round++` 继续 loop —— 后续 `round >= roundLimit` 判定按新上限走,不会立刻又进 Step 4)/ **②放弃 codex**(break loop)/ **③接受当前**(blockFindings 写 backlog,break loop)
|
|
85
|
+
5. **否则(`round < roundLimit`)**:`AskUserQuestion` 三选项(默认推 `<JSON.userInteraction.block_unconverged>`):
|
|
86
|
+
- **①auto_fix** → 用 `Task` 工具 dispatch fresh fix subagent 修 blockFindings → `round++`,继续 loop
|
|
87
|
+
- **②manual_fix** → 等用户改完 → `round++`,继续 loop
|
|
88
|
+
- **③give_up** → break loop
|
|
89
|
+
|
|
90
|
+
**Step C — loose**:本段任何步骤(runner 调用 / AskUserQuestion / fix dispatch)失败都**不阻塞主流程 fence**。runner 永远 exit 0;AskUserQuestion harness 不支持时降级终端 prompt。
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 派 review subagent 审 [proposal + specs + design + diff],主代理处理反馈,满足三条件打 review-passed YAML
|
|
3
|
+
argument-hint: '[--change-id <id>]'
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are about to handle `/forge:review $ARGUMENTS`.
|
|
7
|
+
|
|
8
|
+
解析:`--change-id <id>` 默认 `forge/changes/` 下唯一未归档 change。
|
|
9
|
+
|
|
10
|
+
## 步骤
|
|
11
|
+
|
|
12
|
+
1. **必须调用 `forge:requesting-code-review` skill**(主轨)。
|
|
13
|
+
2. **必须调用 `forge:receiving-code-review` skill**(收反馈环节)。
|
|
14
|
+
3. 打包 review 输入:
|
|
15
|
+
- `forge/changes/<id>/proposal.md`
|
|
16
|
+
- `forge/changes/<id>/specs/*.md`
|
|
17
|
+
- `forge/changes/<id>/design.md`
|
|
18
|
+
- `git diff <since-tasks-start>..HEAD`(`since-tasks-start` 取 tasks.md 末尾 `applied_commits` 的第一个 commit 的 parent)
|
|
19
|
+
4. 派 fresh review subagent,产出意见列表(每条带:[严重度:阻塞/关键/可改进/建议]、[文件路径]、[问题描述]、[期望修改])。
|
|
20
|
+
5. 主代理对每条意见 **逐条判断接受/拒绝**(参考 forge:receiving-code-review skill 的"用证据反驳"原则,不机械接受)。
|
|
21
|
+
6. 接受的意见 → append 到 `forge/changes/<id>/tasks.md` 末尾作为新 task 条目。
|
|
22
|
+
7. **仅当满足三条件,才打 `forge/changes/<id>/.review-passed`**:
|
|
23
|
+
a. 无"已用证据反驳但未存档"的拒绝意见
|
|
24
|
+
b. 接受的意见已**全部实现 + 测试通过**(本轮新接受的意见**不算本轮通过**,需下一轮 review)
|
|
25
|
+
c. 满足 a+b 时,本轮 review 无新增 task
|
|
26
|
+
7a. **(本 fix 补缺)调 forge evidence record-review 记录 review 事件证据到 staging**
|
|
27
|
+
|
|
28
|
+
主代理在写完 .review-passed YAML 后、freeze 之前,**必须**先调 record-review:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
forge evidence record-review <changeId> --task <ref> --implementer-commit <sha>
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
这一步把 review 事件(子代理调用 + 主代理 accept/reject outcomes)写入 `.evidence/process-evidence.staging.yaml`(沿 `src/cli/commands/evidence.ts:474`;helper list 权威 `commands/apply.md:179-182`)。
|
|
35
|
+
|
|
36
|
+
7b. **(本 fix 补缺)调 forge evidence freeze 凝固 process_evidence**
|
|
37
|
+
|
|
38
|
+
7a record-review 后,**必须**调:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
forge evidence freeze <changeId> --kind review
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
若漏调 record-review 直接 freeze → exit 1 + 提示 "staging file not found"(代码事实 `evidence.ts:639`)。若漏调 freeze → archive fence 拒签 "[review] v1.0 marker missing process_evidence"(代码事实 `src/core/archive/fence.ts:185`)。
|
|
45
|
+
|
|
46
|
+
8. `.review-passed` YAML schema(spec §3.4)— 含 `pause_decisions` 数组(本 fix 补 lifecycle 注):
|
|
47
|
+
```yaml
|
|
48
|
+
schema: forge-review/v1
|
|
49
|
+
tasks_hash: <sha256(tasks.md 已勾段)>
|
|
50
|
+
content_hash: <sha256(proposal+specs+design)>
|
|
51
|
+
reviewed_by: ai-agent # 或 human-override(需 archive --force)
|
|
52
|
+
git:
|
|
53
|
+
is_git_repo: true
|
|
54
|
+
head: <git rev-parse HEAD>
|
|
55
|
+
diff_hash: <sha256(git diff against forge/config.yaml code_paths)>
|
|
56
|
+
review_outcomes:
|
|
57
|
+
- id: 1
|
|
58
|
+
severity: blocking
|
|
59
|
+
accepted: true
|
|
60
|
+
resolved: true
|
|
61
|
+
resolution_commit: <hash>
|
|
62
|
+
pause_decisions: # apply 阶段累积的 pause 决策在写本 marker 时一并迁移(沿 commands/apply.md "Marker 持久化" 段 lifecycle 说明)
|
|
63
|
+
- id: 1
|
|
64
|
+
# ... 完整 schema 见 commands/apply.md "Marker 持久化" 段
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## 禁止行为
|
|
68
|
+
|
|
69
|
+
- 不允许跳过 review subagent 直接打 review-passed
|
|
70
|
+
- 不允许接受意见但不实现就打 review-passed(违反 b)
|
|
71
|
+
- 非 git 项目跳过 git 字段时,review-passed YAML 必须 `is_git_repo: false`(archive --force 才接受)
|
|
72
|
+
|
|
73
|
+
## (可选)Stage extensions hook — Tier 1 Claude Code only
|
|
74
|
+
|
|
75
|
+
> codex review 集成。AI 主代理在本 stage(`review`)跑多轮收敛协议。
|
|
76
|
+
> Tier 2/3(Codex/OpenCode)见 [`docs/stage-extensions.md §未来 Tier 2/3 集成`](../docs/stage-extensions.md#未来-tier-23-集成)。
|
|
77
|
+
|
|
78
|
+
**Step A — 检查是否启用**:读 `forge/config.yaml#stage_extensions.review`。无该字段 / 数组为空 / 全部 entry `enabled: false` → **跳过本段,流程结束**。
|
|
79
|
+
|
|
80
|
+
**Step B — 对每个 `enabled` entry 跑多轮收敛 loop**:
|
|
81
|
+
|
|
82
|
+
初始化 `round = 1`、`threadId = ''`、`roundHistory = []`、`roundLimit = null`(F1-v8 fix:`roundLimit` **不从 config 文件读** —— effective convergence 由 runner 输出,见 Step 3。AI 协议不碰 config 文件解析 / deep-merge,单一数据源是 runner JSON)。循环:
|
|
83
|
+
|
|
84
|
+
1. **跑单轮 runner**:
|
|
85
|
+
```bash
|
|
86
|
+
node "${CLAUDE_PLUGIN_ROOT}/scripts/run-forge.mjs" stage-extensions run \
|
|
87
|
+
--stage review --change-id <change-id> --extension <entry-name> \
|
|
88
|
+
--round <round>${threadId:+ --thread-id $threadId}
|
|
89
|
+
```
|
|
90
|
+
2. **解析 stdout JSON 的 `kind`**:
|
|
91
|
+
- `converged` → 该 entry 收敛完成,**break loop**(codex 输出 verbatim 透传给用户)
|
|
92
|
+
- `failed` / `config_error` / `no_extension` → 该 entry 放弃,**break loop**(loose,不阻塞主流程)
|
|
93
|
+
- `unconverged` → 继续 3
|
|
94
|
+
3. **从 unconverged JSON 取状态**(F1-v8 fix:effective config 来自 runner 输出,runner 内 `validateStageExtensionsConfig` 已 normalize):
|
|
95
|
+
- `roundHistory.push({ round, block_count: <blockFindings.length> })`;`threadId = <JSON.threadId>`;codex finding verbatim 透传给用户
|
|
96
|
+
- 首轮:`roundLimit = <JSON.effectiveConvergence.max_rounds>`(后续轮 `roundLimit` 已设,不覆盖 —— 选项①的 `roundLimit += N` 增量须保留)
|
|
97
|
+
4. **若 `round >= roundLimit`**(F2-v7 fix:用可增长的 `roundLimit`):
|
|
98
|
+
- 若 `<JSON.effectiveConvergence.max_rounds_on_exceed>` 为 `force_end` → 把 blockFindings 写 `forge/changes/<id>/.evidence/codex-pending-findings.yaml`(backlog),**break loop**
|
|
99
|
+
- 否则跑 `node "${CLAUDE_PLUGIN_ROOT}/scripts/run-forge.mjs" stage-extensions analyze-trend --history '<roundHistory JSON>'` 拿 TrendAdvice,再 `AskUserQuestion` 三选项(默认推 `TrendAdvice.recommended_option`):**①再跑 N 轮**(F2-v7 fix:读用户输入的 `N`,执行 `roundLimit += N`,然后 `round++` 继续 loop —— 后续 `round >= roundLimit` 判定按新上限走,不会立刻又进 Step 4)/ **②放弃 codex**(break loop)/ **③接受当前**(blockFindings 写 backlog,break loop)
|
|
100
|
+
5. **否则(`round < roundLimit`)**:`AskUserQuestion` 三选项(默认推 `<JSON.userInteraction.block_unconverged>`):
|
|
101
|
+
- **①auto_fix** → 用 `Task` 工具 dispatch fresh fix subagent 修 blockFindings → `round++`,继续 loop
|
|
102
|
+
- **②manual_fix** → 等用户改完 → `round++`,继续 loop
|
|
103
|
+
- **③give_up** → break loop
|
|
104
|
+
|
|
105
|
+
**Step C — loose**:本段任何步骤(runner 调用 / AskUserQuestion / fix dispatch)失败都**不阻塞主流程 fence**。runner 永远 exit 0;AskUserQuestion harness 不支持时降级终端 prompt。
|