@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,60 @@
|
|
|
1
|
+
// trend-analyzer.ts — finding 数量趋势分析
|
|
2
|
+
// plan-stage-extensions Task 2.4
|
|
3
|
+
// 分析最近 3 轮的 block_count 变化趋势,给出中文建议与推荐选项
|
|
4
|
+
/**
|
|
5
|
+
* 分析收敛轮次历史,判断 finding 数量变化趋势。
|
|
6
|
+
*
|
|
7
|
+
* 规则(按优先级顺序):
|
|
8
|
+
* 1. 历史 < 3 轮 → data_insufficient,推选项 1
|
|
9
|
+
* 2. 最后 3 轮严格递减(a > b > c) → strict_decrease,推选项 1
|
|
10
|
+
* 3. 最后 3 轮近平(任意相邻差 ≤ 1) → stable,推选项 2
|
|
11
|
+
* 4. 最后 3 轮有上升(任意后轮 > 前轮) → increase,推选项 2
|
|
12
|
+
* 5. 其他(波动) → fluctuate,推选项 3
|
|
13
|
+
*
|
|
14
|
+
* @param roundHistory 按 round 升序排列的历史记录
|
|
15
|
+
*/
|
|
16
|
+
export function analyzeTrend(roundHistory) {
|
|
17
|
+
// 数据不足:历史轮次 < 3
|
|
18
|
+
if (roundHistory.length < 3) {
|
|
19
|
+
return {
|
|
20
|
+
trend: 'data_insufficient',
|
|
21
|
+
recommendation: '数据不足,建议再跑几轮',
|
|
22
|
+
recommended_option: 1,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
// 取最后 3 轮
|
|
26
|
+
const last3 = roundHistory.slice(-3);
|
|
27
|
+
const [a, b, c] = last3;
|
|
28
|
+
// 严格递减:a.block_count > b.block_count > c.block_count
|
|
29
|
+
if (a.block_count > b.block_count && b.block_count > c.block_count) {
|
|
30
|
+
return {
|
|
31
|
+
trend: 'strict_decrease',
|
|
32
|
+
recommendation: '收敛中,建议继续',
|
|
33
|
+
recommended_option: 1,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
// 近平(stable):所有相邻差 ≤ 1(优先于 increase 判断)
|
|
37
|
+
if (Math.abs(b.block_count - a.block_count) <= 1 &&
|
|
38
|
+
Math.abs(c.block_count - b.block_count) <= 1) {
|
|
39
|
+
return {
|
|
40
|
+
trend: 'stable',
|
|
41
|
+
recommendation: '已停滞,建议放弃 codex 介入',
|
|
42
|
+
recommended_option: 2,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
// 上升:任意后轮 > 前轮
|
|
46
|
+
if (b.block_count > a.block_count || c.block_count > b.block_count) {
|
|
47
|
+
return {
|
|
48
|
+
trend: 'increase',
|
|
49
|
+
recommendation: 'finding 数上升,建议放弃',
|
|
50
|
+
recommended_option: 2,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
// 波动(其他情况)
|
|
54
|
+
return {
|
|
55
|
+
trend: 'fluctuate',
|
|
56
|
+
recommendation: '波动,建议接受当前状态计入 backlog',
|
|
57
|
+
recommended_option: 3,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=trend-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trend-analyzer.js","sourceRoot":"","sources":["../../../src/core/stage-extensions/trend-analyzer.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,iCAAiC;AACjC,yCAAyC;AAezC;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,YAAY,CAC1B,YAA2D;IAE3D,gBAAgB;IAChB,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO;YACL,KAAK,EAAE,mBAAmB;YAC1B,cAAc,EAAE,aAAa;YAC7B,kBAAkB,EAAE,CAAC;SACtB,CAAC;IACJ,CAAC;IAED,UAAU;IACV,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,KAIjB,CAAC;IAEF,qDAAqD;IACrD,IAAI,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QACnE,OAAO;YACL,KAAK,EAAE,iBAAiB;YACxB,cAAc,EAAE,UAAU;YAC1B,kBAAkB,EAAE,CAAC;SACtB,CAAC;IACJ,CAAC;IAED,wCAAwC;IACxC,IACE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC;QAC5C,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,EAC5C,CAAC;QACD,OAAO;YACL,KAAK,EAAE,QAAQ;YACf,cAAc,EAAE,mBAAmB;YACnC,kBAAkB,EAAE,CAAC;SACtB,CAAC;IACJ,CAAC;IAED,eAAe;IACf,IAAI,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QACnE,OAAO;YACL,KAAK,EAAE,UAAU;YACjB,cAAc,EAAE,kBAAkB;YAClC,kBAAkB,EAAE,CAAC;SACtB,CAAC;IACJ,CAAC;IAED,WAAW;IACX,OAAO;QACL,KAAK,EAAE,WAAW;QAClB,cAAc,EAAE,uBAAuB;QACvC,kBAAkB,EAAE,CAAC;KACtB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { StageExtensionsDefaults } from '../schema/types.js';
|
|
2
|
+
/** codex severity → forge 4 级映射类型(从 StageExtensionsDefaults 取) */
|
|
3
|
+
export type SeverityMap = StageExtensionsDefaults['severity_map'];
|
|
4
|
+
/**
|
|
5
|
+
* codex review JSON 输出中的单个 finding。
|
|
6
|
+
* 字段与 codex review-output.schema.json 对齐。
|
|
7
|
+
*/
|
|
8
|
+
export interface CodexFinding {
|
|
9
|
+
/** codex 原始 severity */
|
|
10
|
+
severity: 'critical' | 'high' | 'medium' | 'low';
|
|
11
|
+
title: string;
|
|
12
|
+
body: string;
|
|
13
|
+
file: string;
|
|
14
|
+
line_start: number;
|
|
15
|
+
line_end: number;
|
|
16
|
+
/** 置信度 0-1 */
|
|
17
|
+
confidence: number;
|
|
18
|
+
recommendation: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* codex review 完整输出。
|
|
22
|
+
* `thread_id` 不在 codex JSON schema 中 — 由 helper (Task 3) 从 codex session id 附加,可选。
|
|
23
|
+
*/
|
|
24
|
+
export interface CodexReviewOutput {
|
|
25
|
+
verdict: 'approve' | 'needs-attention';
|
|
26
|
+
summary: string;
|
|
27
|
+
findings: CodexFinding[];
|
|
28
|
+
next_steps: string[];
|
|
29
|
+
/** codex session id,由 helper 附加;首轮可能缺失 */
|
|
30
|
+
thread_id?: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* CodexFinding + forge 内部 4 级 severity。
|
|
34
|
+
* convergence-judge 分桶后产出此类型。
|
|
35
|
+
*/
|
|
36
|
+
export interface ForgeFinding extends CodexFinding {
|
|
37
|
+
forge_severity: 'BLOCKER' | 'MAJOR' | 'MINOR' | 'NIT';
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/stage-extensions/types.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAElE,kEAAkE;AAClE,MAAM,MAAM,WAAW,GAAG,uBAAuB,CAAC,cAAc,CAAC,CAAC;AAElE;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,wBAAwB;IACxB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,SAAS,GAAG,iBAAiB,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAa,SAAQ,YAAY;IAChD,cAAc,EAAE,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK,CAAC;CACvD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/stage-extensions/types.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,iCAAiC;AACjC,yEAAyE"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/** lock 文件内容 */
|
|
2
|
+
interface StagingLockData {
|
|
3
|
+
pid: number;
|
|
4
|
+
acquired_at: string;
|
|
5
|
+
}
|
|
6
|
+
/** 当 staging lock 被另一活进程持有时抛出 */
|
|
7
|
+
export declare class StagingLockHeldError extends Error {
|
|
8
|
+
readonly holder: StagingLockData;
|
|
9
|
+
constructor(holder: StagingLockData);
|
|
10
|
+
}
|
|
11
|
+
/** acquireStagingLock 选项 */
|
|
12
|
+
export interface AcquireStagingLockOptions {
|
|
13
|
+
/** 等待 lock 释放的总超时毫秒(默认 5000) */
|
|
14
|
+
timeoutMs?: number;
|
|
15
|
+
/** 重试间隔毫秒(默认 100) */
|
|
16
|
+
retryIntervalMs?: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* acquireStagingLock — 获取 staging 文件锁
|
|
20
|
+
*
|
|
21
|
+
* 路径:<changeRoot>/.evidence/.staging.lock(独立于 archive lock)
|
|
22
|
+
*
|
|
23
|
+
* 流程:
|
|
24
|
+
* 1. O_CREAT|O_EXCL 原子创建 lock 文件
|
|
25
|
+
* 2. 若已存在 — isPidAlive 检测:
|
|
26
|
+
* - dead(stale)→ 删 lock 重试
|
|
27
|
+
* - alive → 等 retryInterval 重试,直到 timeoutMs 超时抛 StagingLockHeldError
|
|
28
|
+
* 3. 成功 → 写 {pid, acquired_at}
|
|
29
|
+
*
|
|
30
|
+
* @param changeRoot change 根目录
|
|
31
|
+
* @param options { timeoutMs, retryIntervalMs }
|
|
32
|
+
* @returns release 函数(幂等)
|
|
33
|
+
*/
|
|
34
|
+
export declare function acquireStagingLock(changeRoot: string, options?: AcquireStagingLockOptions): Promise<() => Promise<void>>;
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=staging-lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"staging-lock.d.ts","sourceRoot":"","sources":["../../src/core/staging-lock.ts"],"names":[],"mappings":"AAeA,gBAAgB;AAChB,UAAU,eAAe;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,iCAAiC;AACjC,qBAAa,oBAAqB,SAAQ,KAAK;aACjB,MAAM,EAAE,eAAe;gBAAvB,MAAM,EAAE,eAAe;CAMpD;AAED,4BAA4B;AAC5B,MAAM,WAAW,yBAAyB;IACxC,gCAAgC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qBAAqB;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAiE9B"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// src/core/staging-lock.ts — plan-9g Task 3.2
|
|
2
|
+
// staging 文件并发保护(brainstorm spec §9.10)
|
|
3
|
+
// 仿 archive lock.ts 模式 — O_CREAT|O_EXCL + isPidAlive stale detection
|
|
4
|
+
//
|
|
5
|
+
// 用途:helper(record-tdd/verify/review)写 staging.yaml 是"读 YAML + 改 array +
|
|
6
|
+
// 重算 hash + 覆写"非原子操作;主代理多 helper 并发(per-task 并行)会 lost update。
|
|
7
|
+
// wrapper read-modify-write 在 acquireStagingLock → releaseStagingLock 内。
|
|
8
|
+
//
|
|
9
|
+
// 语义差异:archive lock 是 fail-immediately;staging lock 是 wait-retry-timeout
|
|
10
|
+
// (合理因 staging 是 short-lived per-call)
|
|
11
|
+
import { readFile, rm } from 'node:fs/promises';
|
|
12
|
+
import { existsSync, openSync, closeSync, writeSync, mkdirSync, constants } from 'node:fs';
|
|
13
|
+
import { join, dirname } from 'node:path';
|
|
14
|
+
/** 当 staging lock 被另一活进程持有时抛出 */
|
|
15
|
+
export class StagingLockHeldError extends Error {
|
|
16
|
+
holder;
|
|
17
|
+
constructor(holder) {
|
|
18
|
+
super(`another evidence helper is writing staging (pid ${holder.pid}, acquired ${holder.acquired_at})`);
|
|
19
|
+
this.holder = holder;
|
|
20
|
+
this.name = 'StagingLockHeldError';
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* acquireStagingLock — 获取 staging 文件锁
|
|
25
|
+
*
|
|
26
|
+
* 路径:<changeRoot>/.evidence/.staging.lock(独立于 archive lock)
|
|
27
|
+
*
|
|
28
|
+
* 流程:
|
|
29
|
+
* 1. O_CREAT|O_EXCL 原子创建 lock 文件
|
|
30
|
+
* 2. 若已存在 — isPidAlive 检测:
|
|
31
|
+
* - dead(stale)→ 删 lock 重试
|
|
32
|
+
* - alive → 等 retryInterval 重试,直到 timeoutMs 超时抛 StagingLockHeldError
|
|
33
|
+
* 3. 成功 → 写 {pid, acquired_at}
|
|
34
|
+
*
|
|
35
|
+
* @param changeRoot change 根目录
|
|
36
|
+
* @param options { timeoutMs, retryIntervalMs }
|
|
37
|
+
* @returns release 函数(幂等)
|
|
38
|
+
*/
|
|
39
|
+
export async function acquireStagingLock(changeRoot, options = {}) {
|
|
40
|
+
const timeoutMs = options.timeoutMs ?? 5000;
|
|
41
|
+
const retryIntervalMs = options.retryIntervalMs ?? 100;
|
|
42
|
+
const lockPath = join(changeRoot, '.evidence', '.staging.lock');
|
|
43
|
+
// 确保 .evidence 目录存在
|
|
44
|
+
mkdirSync(dirname(lockPath), { recursive: true });
|
|
45
|
+
const deadline = Date.now() + timeoutMs;
|
|
46
|
+
let lastHolder = null;
|
|
47
|
+
while (Date.now() < deadline) {
|
|
48
|
+
let fd;
|
|
49
|
+
try {
|
|
50
|
+
// O_CREAT|O_EXCL 原子创建:若文件已存在则抛 EEXIST
|
|
51
|
+
fd = openSync(lockPath, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY, 0o644);
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
if (err.code === 'EEXIST') {
|
|
55
|
+
// lock 已存在;检测 stale
|
|
56
|
+
try {
|
|
57
|
+
const data = JSON.parse(await readFile(lockPath, 'utf8'));
|
|
58
|
+
lastHolder = data;
|
|
59
|
+
if (!isPidAlive(data.pid)) {
|
|
60
|
+
// stale → 删 lock 重试
|
|
61
|
+
await rm(lockPath, { force: true });
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// 坏 lock 文件 → 删除重试
|
|
67
|
+
await rm(lockPath, { force: true });
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
// alive → 等 retryInterval
|
|
71
|
+
await new Promise((r) => setTimeout(r, retryIntervalMs));
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
throw err;
|
|
75
|
+
}
|
|
76
|
+
// 创建成功 → 通过 fd 写内容(round 2 fix I1):
|
|
77
|
+
// - 避免 path-write race window:openSync 后立即用 fd 写,无 empty 中间态
|
|
78
|
+
// - 避免 fd leak:try/finally 保证 closeSync 必走;writeSync 抛错 fd 仍关闭
|
|
79
|
+
const data = {
|
|
80
|
+
pid: process.pid,
|
|
81
|
+
acquired_at: new Date().toISOString(),
|
|
82
|
+
};
|
|
83
|
+
try {
|
|
84
|
+
writeSync(fd, JSON.stringify(data, null, 2));
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
closeSync(fd);
|
|
88
|
+
}
|
|
89
|
+
// 返回幂等 release 函数
|
|
90
|
+
return async () => {
|
|
91
|
+
if (existsSync(lockPath)) {
|
|
92
|
+
await rm(lockPath, { force: true });
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
// 超时 → 抛错(用最后一次读到的 holder 数据)
|
|
97
|
+
if (lastHolder) {
|
|
98
|
+
throw new StagingLockHeldError(lastHolder);
|
|
99
|
+
}
|
|
100
|
+
throw new StagingLockHeldError({ pid: -1, acquired_at: new Date(deadline).toISOString() });
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* isPidAlive — 沿 archive lock.ts 同函数
|
|
104
|
+
*
|
|
105
|
+
* process.kill(pid, 0) 向进程发信号 0(不实际发信号),仅验证进程是否存在。
|
|
106
|
+
* - pid <= 0 永远视为 stale(防御性)
|
|
107
|
+
* - ESRCH:进程不存在 → stale
|
|
108
|
+
* - EPERM:进程存在但无权限 → 视为 alive
|
|
109
|
+
*/
|
|
110
|
+
function isPidAlive(pid) {
|
|
111
|
+
if (pid <= 0)
|
|
112
|
+
return false;
|
|
113
|
+
try {
|
|
114
|
+
process.kill(pid, 0); // 不发实际信号,仅验证存活
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
// ESRCH = 进程不存在;其他错误(EPERM)= 进程存在但无权限
|
|
119
|
+
return err.code !== 'ESRCH';
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=staging-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"staging-lock.js","sourceRoot":"","sources":["../../src/core/staging-lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 主代理读 pending ack file + AskUserQuestion 确认 + 调 forge ack confirm/reject 真正写 marker
|
|
3
|
+
argument-hint: '<change-id> <finding-id>'
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are about to handle `/forge:ack-confirm $ARGUMENTS`。
|
|
7
|
+
|
|
8
|
+
## 步骤(必须按序)
|
|
9
|
+
|
|
10
|
+
1. 解析 `$ARGUMENTS` 为 `<change-id>` `<finding-id>` 两参数(若缺,**报错并停止**)
|
|
11
|
+
2. 列出 `forge/changes/<change-id>/.evidence/pending-acks/<finding-id>-*.yaml`(可能多份,取最新)。**若 0 份,报错**:"No pending ack for finding <finding-id>"
|
|
12
|
+
3. 读 pending file 内容,提取 `action / rationale / target_severity` 等字段
|
|
13
|
+
4. **必须用 AskUserQuestion** 让用户确认:
|
|
14
|
+
- 题目:`Confirm AI ack proposal for finding #<id>`
|
|
15
|
+
- 选项:
|
|
16
|
+
- `confirm`(执行 ack action)
|
|
17
|
+
- `reject`(拒绝 + 让用户写 rationale)
|
|
18
|
+
- `modify-rationale`(用户改 rationale 后再 confirm)
|
|
19
|
+
5. 根据用户选择:
|
|
20
|
+
- `confirm` → 调 `forge ack confirm <change-id> <finding-id>`(CLI 写 marker + ack-log + 删 pending)
|
|
21
|
+
- `reject` → 用 AskUserQuestion 让用户输入 `rejection rationale` → 调 `forge ack reject <change-id> <finding-id> --rationale "<text>"`
|
|
22
|
+
- `modify-rationale` → 用 AskUserQuestion 让用户输入新 rationale → 重写 pending file → 回到 step 4
|
|
23
|
+
|
|
24
|
+
## 禁止行为
|
|
25
|
+
|
|
26
|
+
- 不允许跳过 AskUserQuestion 直接调 confirm(违反 §2.3.3 B 两步协议核心 — user 必须实际看到 + 确认)
|
|
27
|
+
- 不允许在 CI 模式下调用本 slash(CI 应该早在 propose 阶段就被 forge ack propose 拒绝)
|
|
28
|
+
- 不允许直接修改 marker 字段(必须经 forge ack confirm CLI)
|
|
29
|
+
|
|
30
|
+
## 与其他 forge 协议的关系
|
|
31
|
+
|
|
32
|
+
本 slash 是 §2.3.3 B 两步 propose/confirm 协议的第二步;第一步由 AI 在 receiving-code-review / verifying-three-dimensions / Fluid Pause Decision Point 等场景 invoke `forge ack propose`(写 pending file + exit 1)触发。
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 读 tasks.md 派子代理实施每个 task,顺序模式或 --parallel 模式
|
|
3
|
+
argument-hint: '[--parallel] [--change-id <id>]'
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are about to handle `/forge:apply $ARGUMENTS`.
|
|
7
|
+
|
|
8
|
+
解析:
|
|
9
|
+
|
|
10
|
+
- 默认:顺序模式(主工作区直接跑)
|
|
11
|
+
- `--parallel`:并行模式(每个独立 task 一个 worktree;遵循 forge:dispatching-parallel-agents 的 cherry-pick 串行协议)
|
|
12
|
+
- `--change-id <id>`:指定 change(默认为 `forge/changes/` 下唯一未归档的 change;若 >1,**报错并停止**列出选项)
|
|
13
|
+
|
|
14
|
+
## 步骤
|
|
15
|
+
|
|
16
|
+
0. **前置 branch-check**(plan-9h §2.8.3 C):调 `forge preflight branch-check <change-id>`
|
|
17
|
+
- exit 0 → 继续步骤 1
|
|
18
|
+
- exit 2 → **必须停下**,按 stderr 建议切 feature branch(`git checkout -b feature/<change-id>`)或显式传 `--allow-protected-branch`(后者需用户确认 build/CI 风险)
|
|
19
|
+
- 非 git 项目:helper 自动跳过 exit 0(沿 v0.4 graceful 降级)
|
|
20
|
+
1. **必须调用 `forge:subagent-driven-development` skill**(无 inline 模式)。
|
|
21
|
+
2. **必须调用 `forge:test-driven-development` skill** 作为每个 subagent 的实施纲领。
|
|
22
|
+
3. 若 `--parallel`,**追加调用 `forge:dispatching-parallel-agents` 和 `forge:using-git-worktrees`**。
|
|
23
|
+
|
|
24
|
+
3.5. **Critical Plan Review**(主代理 dispatch subagent 前必做,沿 design §2.8.3 A):
|
|
25
|
+
|
|
26
|
+
主代理读 `forge/changes/<id>/{proposal, design, tasks, specs/*}.md` 全套,**按 4 类维度逐条检查**(不允许 vague pass-through,沿反向加固):
|
|
27
|
+
|
|
28
|
+
| 维度 | 检查问题 |
|
|
29
|
+
| ------ | ------------------------------------------------------------------- |
|
|
30
|
+
| 完整性 | tasks 是否覆盖 specs 所有 requirement?(对照 specs requirement 计数) |
|
|
31
|
+
| 顺序 | tasks 依赖关系是否合理?(标 dependency 的 task 是否先于被依赖) |
|
|
32
|
+
| 清晰度 | 是否有 tasks 描述 vague(如"处理边界情况" / "加测试")? |
|
|
33
|
+
| scope | 是否有 tasks 应该是 §2.6 out-of-scope 而非本 change? |
|
|
34
|
+
|
|
35
|
+
- **若有 concerns** → AskUserQuestion 列 concerns,等用户决策:
|
|
36
|
+
- 改 plan(回 propose 修)
|
|
37
|
+
- 接受当前 plan(继续 dispatch)
|
|
38
|
+
- 走 §2.5 explore 重新评估
|
|
39
|
+
- **无 concerns** → 主代理**必须显式输出 4 类维度的结论**(可以是"无问题"但按维度逐条说),然后进步骤 4 dispatch
|
|
40
|
+
|
|
41
|
+
**反向加固**:Critical Plan Review **不允许 vague pass-through** — 主代理必须显式输出 4 类检查结果(可以是"无问题"但必须按维度逐条说),不允许跳过整段 review。
|
|
42
|
+
|
|
43
|
+
4. 读 `forge/changes/<id>/tasks.md`,识别未勾选 tasks。
|
|
44
|
+
5. **顺序模式**:
|
|
45
|
+
- for each task:派 fresh subagent(主工作区),subagent 拿 [task + 相关 specs/<sub-area>.md + design.md] 启动
|
|
46
|
+
- subagent 跑 TDD:red → green → refactor + git commit
|
|
47
|
+
- 主代理 review subagent 的 commit + test 日志,通过则在主工作区 tasks.md 把 `[ ]` 改 `[x]`
|
|
48
|
+
6. **--parallel 模式**:严格遵守 cherry-pick 串行协议(详 forge:dispatching-parallel-agents skill 的"forge --parallel 模式 cherry-pick 串行协议"段)
|
|
49
|
+
7. 全部 task 完成后,在 tasks.md 末尾追加(parallel 多 commit 用列表):
|
|
50
|
+
```yaml
|
|
51
|
+
applied_commits:
|
|
52
|
+
- <task-id-1>: <commit-hash>
|
|
53
|
+
- <task-id-2>: <commit-hash>
|
|
54
|
+
final_head: <git rev-parse HEAD>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Fluid Pause Decision Point(v1.0,沿 design §2.1)
|
|
58
|
+
|
|
59
|
+
> **与 `/forge:explore` 边界提示**(沿 design §2.5.5 + plan-9f):Fluid Pause 是**被动**触发(subagent 报告阻塞型 issue 时主代理进入);若是**开放思考**(非阻塞 issue,如"实施途中想重新评估某个 design 决策"),应主动触发 `/forge:explore --change <id>` 而非 Fluid Pause。两者边界详见 `forge:exploring` skill 的"与 §2.1 Fluid Pause 边界"段。
|
|
60
|
+
|
|
61
|
+
### 触发条件
|
|
62
|
+
|
|
63
|
+
subagent 在 apply 中段报告以下三档之一时,主代理**不直接处理**,改进 Fluid Pause:
|
|
64
|
+
|
|
65
|
+
| Subagent 报告 | 主代理行为 |
|
|
66
|
+
| ------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- |
|
|
67
|
+
| `DONE_WITH_CONCERNS`,concerns 类型 = "correctness or scope"(非 CRITICAL) | 进 Fluid Pause |
|
|
68
|
+
| `BLOCKED` 第 4 项 = "plan itself is wrong" | 进 Fluid Pause |
|
|
69
|
+
| `DESIGN_ISSUE_FOUND`(v1.0 新增第 5 档,沿 subagent-driven-development SKILL.md)— subagent 实施中发现属于本 change 但 spec 未覆盖的需求 | 进 Fluid Pause |
|
|
70
|
+
| **任一 CRITICAL 级问题**(测试 fail / hash mismatch / evidence 丢) | **不进 Fluid Pause** — 走 forge 强 fence 拒签(保留 v0.4 行为) |
|
|
71
|
+
|
|
72
|
+
### 协议流程
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
subagent 报告 → 主代理判定 severity(CRITICAL / WARNING / SUGGESTION,沿 design §2.3)
|
|
76
|
+
↓
|
|
77
|
+
CRITICAL? → yes → 走 forge 强 fence 拒签(原 v0.4 行为)
|
|
78
|
+
→ no → AskUserQuestion 四选项
|
|
79
|
+
↓
|
|
80
|
+
用户选择
|
|
81
|
+
↓
|
|
82
|
+
1=扩本 change scope → 更新 proposal `## What Changes` + subagent 重派
|
|
83
|
+
2=加 task 进本轮 → 主代理 append 新 task 到 tasks.md + subagent 重派
|
|
84
|
+
3=转 out-of-scope → 写到 proposal `## Out of Scope` / design `## Future Work` YAML 块(沿 §2.6)+ subagent 跳过 issue 继续
|
|
85
|
+
4=Other → 用户自由文本描述(必须配 other_rationale + other_acked_by)
|
|
86
|
+
↓
|
|
87
|
+
marker `pause_decisions` YAML 字段记录(沿 design §2.1.5)
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### AskUserQuestion 模板
|
|
91
|
+
|
|
92
|
+
主代理调 AskUserQuestion(harness 不支持时降级为终端 [1]/[2]/[3]/[4] prompt):
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
## Implementation Paused
|
|
96
|
+
|
|
97
|
+
**Change:** <change-id>
|
|
98
|
+
**Task:** <task-id>(<task-summary>)
|
|
99
|
+
**Progress:** N/M tasks complete
|
|
100
|
+
|
|
101
|
+
### Issue Encountered
|
|
102
|
+
<subagent 报告的 issue 描述,从 DONE_WITH_CONCERNS / BLOCKED concerns 字段或 DESIGN_ISSUE_FOUND payload 提取>
|
|
103
|
+
|
|
104
|
+
**Severity:** WARNING | SUGGESTION(主代理初判,沿 design §2.3 分级;CRITICAL 不进本流程)
|
|
105
|
+
|
|
106
|
+
**Options:**
|
|
107
|
+
1. **扩本 change scope** — 把这个 issue 纳入本 change。更新 proposal `## What Changes` 段,重新派 subagent 实施。代价:本 change scope 增大,需要重 review
|
|
108
|
+
2. **加 task 进本轮 tasks.md** — 当成新发现的本 change 必做项。主代理 append 新 task 到 tasks.md,subagent 重派实施。等同 v0.4 行为
|
|
109
|
+
3. **转 out-of-scope**(仅限 issue 不阻断本 task 时可用) — 不在本 change 做,写到 proposal `## Out of Scope` 或 design `## Future Work` 段(YAML 结构化字段,沿 §2.6)。subagent 跳过该 issue 继续当前 task。**v1.1 backlog registry 会从这里读**
|
|
110
|
+
4. **Other** — 自由文本描述。必须配 `other_rationale` + `other_acked_by`(用户在 marker 之外的某处确认)
|
|
111
|
+
|
|
112
|
+
What would you like to do?
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Marker 持久化(沿 design §2.1.5)
|
|
116
|
+
|
|
117
|
+
**Lifecycle 说明**(本 fix 补缺):pause 决策**实际写入** `.verify-passed` / `.review-passed` marker 是在 **verify / review 阶段**(那时 marker 才真正打;沿 `commands/verify.md` step 4.3 + `commands/review.md` step 7);apply **中段** marker 尚不存在,AI 主代理把每次 pause 决策**累积记录在本 change session context** 中,等到 verify / review 时一并迁移到对应 marker 的 `pause_decisions` 数组(沿 `src/cli/commands/archive.ts:411/422` archive fence 同时校验 verify-passed + review-passed 两个 marker 的 pause_decisions,确认这是 additive 模式)。
|
|
118
|
+
|
|
119
|
+
主代理在 verify / review 写 marker 时,**必须**把本 change apply 阶段累积的所有 pause 决策按下面 schema 写入 `pause_decisions` 数组:
|
|
120
|
+
|
|
121
|
+
```yaml
|
|
122
|
+
pause_decisions:
|
|
123
|
+
- id: 1 # 同一 marker 内唯一
|
|
124
|
+
paused_at: 2026-05-12T14:30:00Z # ISO 8601 UTC
|
|
125
|
+
task_ref: tasks.md#task-3 # 关联 task
|
|
126
|
+
issue_summary: 'subagent 发现 specs 没覆盖 OAuth refresh token 过期处理'
|
|
127
|
+
severity: WARNING # 主代理初判(CRITICAL 不进本流程)
|
|
128
|
+
severity_acked_by: msc # WARNING 必须;SUGGESTION 允许 null
|
|
129
|
+
severity_acked_at: 2026-05-12T14:32:00Z
|
|
130
|
+
chosen_option: 3 # 1=扩 scope / 2=加 task / 3=转 out-of-scope / 4=Other
|
|
131
|
+
target_artifact: proposal.md # option=1=proposal.md;option=2=tasks.md;option=3=proposal.md|design.md
|
|
132
|
+
target_anchor: '## Out of Scope' # marker 记录写到哪个段
|
|
133
|
+
non_blocking_rationale: 'subagent 可跳过该 issue 完成本 task 主体功能' # option=3 必填
|
|
134
|
+
other_rationale: null # option=4 必填
|
|
135
|
+
other_acked_by: null # option=4 必填
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Fence 校验(`forge archive` 阶段,本协议反向加固点)
|
|
139
|
+
|
|
140
|
+
`forge archive` 跑 `validatePauseDecisionsFence`(沿 design §2.1.5)— 任一违反拒签 exit 1:
|
|
141
|
+
|
|
142
|
+
- CRITICAL severity → 拒签(CRITICAL 应走 forge 强 fence,不应进 pause)
|
|
143
|
+
- WARNING + (severity_acked_by 空 ∨ severity_acked_at 空)→ 拒签
|
|
144
|
+
- option=1:`target_artifact='proposal.md'` + `target_anchor` 含 `What Changes`
|
|
145
|
+
- option=2:tasks.md 中 `task_ref` 末段对应的行已勾选 `[x]`
|
|
146
|
+
- option=3:proposal/design YAML 块含对应 entry.id + `non_blocking_rationale` 非空
|
|
147
|
+
- option=4:`other_rationale` + `other_acked_by` 非空
|
|
148
|
+
|
|
149
|
+
## 与其他 sub-plan 合并点
|
|
150
|
+
|
|
151
|
+
本 §"Fluid Pause Decision Point" 段(plan-9c)与后续 sub-plan 在 apply.md 有合并点(参考 master plan §3.3 line 272):
|
|
152
|
+
|
|
153
|
+
- **9h(SDD 实施前置纪律加固)**:将在步骤 0 加 `forge preflight branch-check` 调用 + 步骤 3.5 加 §"Critical Plan Review";9c 不动这些位置
|
|
154
|
+
- **9g(process_evidence)**:将在每个 subagent task 完成后加 `forge evidence record-tdd` helper 调用;9c 不动这些位置
|
|
155
|
+
- **推荐 merge 顺序**:9h → 9c → 9g
|
|
156
|
+
|
|
157
|
+
## 禁止行为
|
|
158
|
+
|
|
159
|
+
- 不允许主代理直接写代码 — 所有 task 实施必须通过 subagent
|
|
160
|
+
- 不允许 subagent 改 tasks.md(写入是主代理单点串行职责)
|
|
161
|
+
- 不允许跳过 TDD 的 red 步骤(verify 阶段会发现并 append 修复 task)
|
|
162
|
+
|
|
163
|
+
## 禁止行为(plan-9h §2.8.3 B 主代理 STOP 协议)
|
|
164
|
+
|
|
165
|
+
主代理 dispatch 阶段必须停下问用户的场景(不允许自动绕过 / 不允许重试,沿 `skills/subagent-driven-development/SKILL.md` §"Main Agent STOP Triggers"):
|
|
166
|
+
|
|
167
|
+
- ✗ **不允许"绕过失败 task 跑下一个"**(同 task BLOCKED 后必须 STOP)
|
|
168
|
+
- ✗ **不允许"修改 task 描述让它能过"**(改 task 描述需经 §"Fluid Pause Decision Point" 走选项 1/2)
|
|
169
|
+
- ✗ **不允许"重试同一 task ≥ 3 次不停下"**(verify 命令重试 ≥ 3 次仍失败 / subagent BLOCKED ≥ 2 次 → STOP 问用户,沿 SDD STOP triggers 表)
|
|
170
|
+
|
|
171
|
+
## 禁止行为(plan-9g §2.7 process_evidence 协议)
|
|
172
|
+
|
|
173
|
+
✗ **不允许绕过 forge evidence helper 直接写 process_evidence 字段**:
|
|
174
|
+
|
|
175
|
+
- 不允许 `fs.writeFile .verify-passed` 或 `.review-passed` 含 process_evidence 字段
|
|
176
|
+
- 不允许拼接 YAML 字面塞 process_evidence 到 marker
|
|
177
|
+
- 不允许直接编辑 `.evidence/process-evidence.staging.yaml`
|
|
178
|
+
|
|
179
|
+
✓ **必须**通过 helper 写入:
|
|
180
|
+
|
|
181
|
+
- `forge evidence record-tdd <changeId> --task ... --red-commit ... --green-commit ... ...`(20 options)
|
|
182
|
+
- `forge evidence record-verify <changeId> --task-refs ... --scope ... --report ...`
|
|
183
|
+
- `forge evidence record-review <changeId> --task ... --implementer-commit ...`
|
|
184
|
+
- `forge evidence freeze <changeId> --kind verify|review`(在 marker YAML 写完后调,统一凝固)
|
|
185
|
+
|
|
186
|
+
详细 process_evidence 协议见 `skills/process-evidence/SKILL.md`。
|
|
187
|
+
|
|
188
|
+
## (可选)Stage extensions hook — Tier 1 Claude Code only
|
|
189
|
+
|
|
190
|
+
> codex review 集成。AI 主代理在本 stage(`apply_critical_plan_review`)跑多轮收敛协议。
|
|
191
|
+
> Tier 2/3(Codex/OpenCode)见 [`docs/stage-extensions.md §未来 Tier 2/3 集成`](../docs/stage-extensions.md#未来-tier-23-集成)。
|
|
192
|
+
|
|
193
|
+
**Step A — 检查是否启用**:读 `forge/config.yaml#stage_extensions.apply_critical_plan_review`。无该字段 / 数组为空 / 全部 entry `enabled: false` → **跳过本段,流程结束**。
|
|
194
|
+
|
|
195
|
+
**Step B — 对每个 `enabled` entry 跑多轮收敛 loop**:
|
|
196
|
+
|
|
197
|
+
初始化 `round = 1`、`threadId = ''`、`roundHistory = []`、`roundLimit = null`(F1-v8 fix:`roundLimit` **不从 config 文件读** —— effective convergence 由 runner 输出,见 Step 3。AI 协议不碰 config 文件解析 / deep-merge,单一数据源是 runner JSON)。循环:
|
|
198
|
+
|
|
199
|
+
1. **跑单轮 runner**:
|
|
200
|
+
```bash
|
|
201
|
+
node "${CLAUDE_PLUGIN_ROOT}/scripts/run-forge.mjs" stage-extensions run \
|
|
202
|
+
--stage apply_critical_plan_review --change-id <change-id> --extension <entry-name> \
|
|
203
|
+
--round <round>${threadId:+ --thread-id $threadId}
|
|
204
|
+
```
|
|
205
|
+
2. **解析 stdout JSON 的 `kind`**:
|
|
206
|
+
- `converged` → 该 entry 收敛完成,**break loop**(codex 输出 verbatim 透传给用户)
|
|
207
|
+
- `failed` / `config_error` / `no_extension` → 该 entry 放弃,**break loop**(loose,不阻塞主流程)
|
|
208
|
+
- `unconverged` → 继续 3
|
|
209
|
+
3. **从 unconverged JSON 取状态**(F1-v8 fix:effective config 来自 runner 输出,runner 内 `validateStageExtensionsConfig` 已 normalize):
|
|
210
|
+
- `roundHistory.push({ round, block_count: <blockFindings.length> })`;`threadId = <JSON.threadId>`;codex finding verbatim 透传给用户
|
|
211
|
+
- 首轮:`roundLimit = <JSON.effectiveConvergence.max_rounds>`(后续轮 `roundLimit` 已设,不覆盖 —— 选项①的 `roundLimit += N` 增量须保留)
|
|
212
|
+
4. **若 `round >= roundLimit`**(F2-v7 fix:用可增长的 `roundLimit`):
|
|
213
|
+
- 若 `<JSON.effectiveConvergence.max_rounds_on_exceed>` 为 `force_end` → 把 blockFindings 写 `forge/changes/<id>/.evidence/codex-pending-findings.yaml`(backlog),**break loop**
|
|
214
|
+
- 否则跑 `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)
|
|
215
|
+
5. **否则(`round < roundLimit`)**:`AskUserQuestion` 三选项(默认推 `<JSON.userInteraction.block_unconverged>`):
|
|
216
|
+
- **①auto_fix** → 用 `Task` 工具 dispatch fresh fix subagent 修 blockFindings → `round++`,继续 loop
|
|
217
|
+
- **②manual_fix** → 等用户改完 → `round++`,继续 loop
|
|
218
|
+
- **③give_up** → break loop
|
|
219
|
+
|
|
220
|
+
**Step C — loose**:本段任何步骤(runner 调用 / AskUserQuestion / fix dispatch)失败都**不阻塞主流程 fence**。runner 永远 exit 0;AskUserQuestion harness 不支持时降级终端 prompt。
|