@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,180 @@
|
|
|
1
|
+
// src/core/monitor/artifact-observer.ts — 把 forge 常规产物反推成 CLI 层 trace 事件(spec §3 / §3.2)
|
|
2
|
+
import { existsSync, readFileSync, readdirSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { parse as parseYAML } from 'yaml';
|
|
5
|
+
import { parseMarker } from '../markers/parse.js';
|
|
6
|
+
import { validateMarkerSchema } from '../validate/marker-schema.js';
|
|
7
|
+
import { validateArchiveSummarySchema } from '../validate/archive-summary-schema.js';
|
|
8
|
+
/** marker 文件名 → 监控阶段(以 Step 1 确认的实际文件名为准) */
|
|
9
|
+
const MARKER_FILES = {
|
|
10
|
+
'.verify-passed': 'verify',
|
|
11
|
+
'.verify-failed': 'verify',
|
|
12
|
+
'.review-passed': 'review',
|
|
13
|
+
'.review-failed': 'review',
|
|
14
|
+
};
|
|
15
|
+
function mkEvent(changeId, stage, event, data, ts) {
|
|
16
|
+
return {
|
|
17
|
+
// 优先用产物自带时间戳;缺失才回退观察时刻 —— 报告时间线才不乱序(Codex 计划审查第 4 轮 检查点 3)
|
|
18
|
+
ts: ts ?? new Date().toISOString(),
|
|
19
|
+
schema: 'forge-monitor-trace/v1',
|
|
20
|
+
change_id: changeId,
|
|
21
|
+
stage,
|
|
22
|
+
layer: 'cli',
|
|
23
|
+
event,
|
|
24
|
+
data,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/** 扫一个目录里的 4 个 marker 文件,产出 marker_observed / record_error 事件 */
|
|
28
|
+
function observeMarkers(dir, relBase, changeId) {
|
|
29
|
+
const events = [];
|
|
30
|
+
for (const [fileName, stage] of Object.entries(MARKER_FILES)) {
|
|
31
|
+
const markerPath = join(dir, fileName);
|
|
32
|
+
if (!existsSync(markerPath))
|
|
33
|
+
continue;
|
|
34
|
+
const relPath = join(relBase, fileName);
|
|
35
|
+
try {
|
|
36
|
+
const marker = parseMarker(readFileSync(markerPath, 'utf8'));
|
|
37
|
+
// marker 是 union 类型;失败类 marker 无 hash 字段,转 record 安全取值
|
|
38
|
+
const obj = marker;
|
|
39
|
+
const validation = validateMarkerSchema(marker, markerPath);
|
|
40
|
+
// 事件 ts 取 marker 自带时间戳(verify→verified_at / review→reviewed_at / failed→failed_at);
|
|
41
|
+
// 报告「阶段时间线」按真实时序排序才有意义(Codex 计划审查第 4 轮 检查点 3)。
|
|
42
|
+
// 用 typeof runtime guard 而非 as 断言 —— schema-invalid marker 的时间戳字段可能不是 string,
|
|
43
|
+
// as 会让非 string 值漏进 TraceEvent.ts,致 Task 11 排序 localeCompare 崩溃(第 5 轮 Finding 1)
|
|
44
|
+
const markerTs = typeof obj.verified_at === 'string'
|
|
45
|
+
? obj.verified_at
|
|
46
|
+
: typeof obj.reviewed_at === 'string'
|
|
47
|
+
? obj.reviewed_at
|
|
48
|
+
: typeof obj.failed_at === 'string'
|
|
49
|
+
? obj.failed_at
|
|
50
|
+
: undefined;
|
|
51
|
+
events.push(mkEvent(changeId, stage, 'marker_observed', {
|
|
52
|
+
marker_schema: marker.schema,
|
|
53
|
+
path: relPath,
|
|
54
|
+
hashes: { tasks_hash: obj.tasks_hash, content_hash: obj.content_hash },
|
|
55
|
+
ok: validation.valid, // spec §3.2:ok = marker schema 校验是否通过
|
|
56
|
+
observed_at: new Date().toISOString(), // observer 实际跑的时刻,与 ts 区分
|
|
57
|
+
}, markerTs));
|
|
58
|
+
// I-2(spec §3.2):verify/review fence_observed —— 从 marker findings 抽未决项。
|
|
59
|
+
// findings 数组字段名按 marker 类型不同:verify(pass/fail)用 verify_findings;
|
|
60
|
+
// review-passed 用 review_outcomes;review-failed 用 unresolved_outcomes。
|
|
61
|
+
// 一个 marker 至多含其一,逐个探测取首个数组。
|
|
62
|
+
let rawFindings = [];
|
|
63
|
+
for (const key of ['verify_findings', 'review_outcomes', 'unresolved_outcomes']) {
|
|
64
|
+
if (Array.isArray(obj[key])) {
|
|
65
|
+
rawFindings = obj[key];
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
const blockedFindings = rawFindings
|
|
70
|
+
.filter((f) => f.resolved === false)
|
|
71
|
+
.map((f, i) => ({ id: f.id ?? i, severity: f.severity ?? null, dimension: f.dimension }));
|
|
72
|
+
// 'S' 是 review_outcomes 的 CRITICAL 简码(verify_findings 不用简码)
|
|
73
|
+
const fenceOk = !blockedFindings.some((b) => b.severity === 'CRITICAL' || b.severity === 'S');
|
|
74
|
+
events.push(mkEvent(changeId, stage, 'fence_observed', { level: stage, ok: fenceOk, blocked_findings: blockedFindings, path: relPath }, markerTs));
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
events.push(mkEvent(changeId, stage, 'record_error', { path: relPath, error: err.message }));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return events;
|
|
81
|
+
}
|
|
82
|
+
/** 读一个 change 目录的 .evidence/ack-log.jsonl,对每条 ack entry 产 ack_observed 事件(spec §3.2) */
|
|
83
|
+
function observeAckLog(dir, changeId) {
|
|
84
|
+
const events = [];
|
|
85
|
+
const logPath = join(dir, '.evidence', 'ack-log.jsonl');
|
|
86
|
+
if (!existsSync(logPath))
|
|
87
|
+
return events;
|
|
88
|
+
let lines;
|
|
89
|
+
try {
|
|
90
|
+
lines = readFileSync(logPath, 'utf8').split(/\r?\n/);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return events; // 读失败 → 跳过,never-throw
|
|
94
|
+
}
|
|
95
|
+
for (const line of lines) {
|
|
96
|
+
if (!line.trim())
|
|
97
|
+
continue;
|
|
98
|
+
try {
|
|
99
|
+
const entry = JSON.parse(line);
|
|
100
|
+
if (entry.kind !== 'ack')
|
|
101
|
+
continue; // 只记 ack entry,跳过 evidence-helper
|
|
102
|
+
events.push(mkEvent(changeId, 'ack-confirm', 'ack_observed', {
|
|
103
|
+
action: entry.action ?? null,
|
|
104
|
+
finding_id: entry.finding_id ?? null,
|
|
105
|
+
severity: entry.target_severity ?? null,
|
|
106
|
+
user: entry.user ?? null,
|
|
107
|
+
}, typeof entry.timestamp === 'string' ? entry.timestamp : undefined));
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
/* 坏 JSON 行跳过 */
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return events;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* 扫描某 change 的产物,反推 CLI 层事件(spec §3 / §3.2)。
|
|
117
|
+
* 同时扫 active 目录 forge/changes/<id>/ 与 archive 目录 forge/changes/archive/<id>/
|
|
118
|
+
* —— 产物是 forge 常规输出、与监控开关无关,故可回溯 enable 之前的阶段(spec §2.4)。
|
|
119
|
+
* 单个产物解析失败不抛,产出一条 record_error 事件。
|
|
120
|
+
*/
|
|
121
|
+
export function observeArtifacts(projectRoot, changeId) {
|
|
122
|
+
const events = [];
|
|
123
|
+
// 1. active change 目录的 marker + ack-log
|
|
124
|
+
const activeDir = join(projectRoot, 'forge', 'changes', changeId);
|
|
125
|
+
if (existsSync(activeDir)) {
|
|
126
|
+
events.push(...observeMarkers(activeDir, join('forge', 'changes', changeId), changeId));
|
|
127
|
+
events.push(...observeAckLog(activeDir, changeId));
|
|
128
|
+
}
|
|
129
|
+
// 2. archive 目录 —— archive 成功后 change 移到 forge/changes/archive/<YYYY-MM-DD>-<changeId>/
|
|
130
|
+
// (transaction.ts:56 给目录名加 archiveDate 前缀;monitor 不知 archiveDate,按正则反解;
|
|
131
|
+
// Codex 计划审查第 2 轮 F-2 / 新-1 / 新-3)
|
|
132
|
+
const archiveRoot = join(projectRoot, 'forge', 'changes', 'archive');
|
|
133
|
+
if (existsSync(archiveRoot)) {
|
|
134
|
+
try {
|
|
135
|
+
for (const entry of readdirSync(archiveRoot, { withFileTypes: true })) {
|
|
136
|
+
if (!entry.isDirectory())
|
|
137
|
+
continue;
|
|
138
|
+
// 目录名 = <YYYY-MM-DD>-<changeId>;剥一层日期前缀,余下须严格等于 changeId
|
|
139
|
+
const m = /^\d{4}-\d{2}-\d{2}-(.+)$/.exec(entry.name);
|
|
140
|
+
if (!m || m[1] !== changeId)
|
|
141
|
+
continue;
|
|
142
|
+
const archiveDir = join(archiveRoot, entry.name);
|
|
143
|
+
const archiveRel = join('forge', 'changes', 'archive', entry.name);
|
|
144
|
+
events.push(...observeMarkers(archiveDir, archiveRel, changeId));
|
|
145
|
+
events.push(...observeAckLog(archiveDir, changeId));
|
|
146
|
+
// archive_summary.yaml —— 三级 fence 的 archive 侧裁决产物(spec §3.2)
|
|
147
|
+
const summaryPath = join(archiveDir, 'archive_summary.yaml');
|
|
148
|
+
if (!existsSync(summaryPath))
|
|
149
|
+
continue;
|
|
150
|
+
const summaryRel = join(archiveRel, 'archive_summary.yaml');
|
|
151
|
+
try {
|
|
152
|
+
const summary = parseYAML(readFileSync(summaryPath, 'utf8'));
|
|
153
|
+
// Codex 计划审查第 2 轮 新-2:用完整 schema 校验定 ok,而非浅守卫 looksLikeArchiveSummary
|
|
154
|
+
const validation = validateArchiveSummarySchema(summary, summaryPath);
|
|
155
|
+
const s = (summary ?? {});
|
|
156
|
+
events.push(mkEvent(changeId, 'archive', 'fence_observed', {
|
|
157
|
+
level: 'archive',
|
|
158
|
+
ok: validation.valid,
|
|
159
|
+
path: summaryRel,
|
|
160
|
+
verify_passed: s.verify_passed,
|
|
161
|
+
review_passed: s.review_passed,
|
|
162
|
+
process_evidence_summary: s.process_evidence_summary,
|
|
163
|
+
observed_at: new Date().toISOString(),
|
|
164
|
+
}, typeof s.archived_at === 'string' ? s.archived_at : undefined));
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
events.push(mkEvent(changeId, 'archive', 'record_error', {
|
|
168
|
+
path: summaryRel,
|
|
169
|
+
error: err.message,
|
|
170
|
+
}));
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
// archive 目录读取失败(并发删除/权限)→ 跳过 archive 扫描,不破坏 active 事件契约
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return events;
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=artifact-observer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact-observer.js","sourceRoot":"","sources":["../../../src/core/monitor/artifact-observer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** forge/config.yaml 的绝对路径(cwd=项目根约定,对齐 config 命令,spec §9 G-9) */
|
|
2
|
+
export declare function monitorConfigPath(projectRoot: string): string;
|
|
3
|
+
/**
|
|
4
|
+
* 读路径:任何异常(缺失 / 损坏 / 缺段)一律返回 false,绝不抛(spec §3.1)。
|
|
5
|
+
* 同步实现 —— exit 处理器与 CLI 子命令都可调。
|
|
6
|
+
*/
|
|
7
|
+
export declare function isMonitorEnabled(projectRoot: string): boolean;
|
|
8
|
+
/**
|
|
9
|
+
* 写路径:fail-fast(spec §3.1 G-8)。
|
|
10
|
+
* - config 不存在 → 报错提示先 forge init(不自行造 config)。
|
|
11
|
+
* - config 损坏 → 报错 abort(不静默覆盖损坏文件)。
|
|
12
|
+
* 正常路径 read-modify-write,保留其它字段值(注释/格式不保留,与 `forge config set` 一致)。
|
|
13
|
+
* monitor 段内部也走 spread 合并,保留 monitor 对象的其它字段。
|
|
14
|
+
*/
|
|
15
|
+
export declare function setMonitorEnabled(projectRoot: string, enabled: boolean): void;
|
|
16
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/core/monitor/config.ts"],"names":[],"mappings":"AAOA,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAS7D;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAa7E"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// src/core/monitor/config.ts — monitor 开关读写(spec §3.1)
|
|
2
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { stringify as stringifyYAML } from 'yaml';
|
|
5
|
+
import { parseConfig } from '../parse/index.js';
|
|
6
|
+
/** forge/config.yaml 的绝对路径(cwd=项目根约定,对齐 config 命令,spec §9 G-9) */
|
|
7
|
+
export function monitorConfigPath(projectRoot) {
|
|
8
|
+
return join(projectRoot, 'forge', 'config.yaml');
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* 读路径:任何异常(缺失 / 损坏 / 缺段)一律返回 false,绝不抛(spec §3.1)。
|
|
12
|
+
* 同步实现 —— exit 处理器与 CLI 子命令都可调。
|
|
13
|
+
*/
|
|
14
|
+
export function isMonitorEnabled(projectRoot) {
|
|
15
|
+
try {
|
|
16
|
+
const path = monitorConfigPath(projectRoot);
|
|
17
|
+
if (!existsSync(path))
|
|
18
|
+
return false;
|
|
19
|
+
const config = parseConfig(readFileSync(path, 'utf8'));
|
|
20
|
+
return config.monitor?.enabled === true;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 写路径:fail-fast(spec §3.1 G-8)。
|
|
28
|
+
* - config 不存在 → 报错提示先 forge init(不自行造 config)。
|
|
29
|
+
* - config 损坏 → 报错 abort(不静默覆盖损坏文件)。
|
|
30
|
+
* 正常路径 read-modify-write,保留其它字段值(注释/格式不保留,与 `forge config set` 一致)。
|
|
31
|
+
* monitor 段内部也走 spread 合并,保留 monitor 对象的其它字段。
|
|
32
|
+
*/
|
|
33
|
+
export function setMonitorEnabled(projectRoot, enabled) {
|
|
34
|
+
const path = monitorConfigPath(projectRoot);
|
|
35
|
+
if (!existsSync(path)) {
|
|
36
|
+
throw new Error(`forge/config.yaml 不存在(${path})—— 先跑 \`forge init\` 初始化项目`);
|
|
37
|
+
}
|
|
38
|
+
let config;
|
|
39
|
+
try {
|
|
40
|
+
config = parseConfig(readFileSync(path, 'utf8'));
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
throw new Error(`forge/config.yaml 解析失败,拒绝覆盖:${err.message}`);
|
|
44
|
+
}
|
|
45
|
+
config.monitor = { ...config.monitor, enabled };
|
|
46
|
+
writeFileSync(path, stringifyYAML(config), 'utf8');
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/monitor/config.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,MAAM,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,kEAAkE;AAClE,MAAM,UAAU,iBAAiB,CAAC,WAAmB;IACnD,OAAO,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;AACnD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAC5C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QACpC,MAAM,MAAM,GAAG,WAAW,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACvD,OAAO,MAAM,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,WAAmB,EAAE,OAAgB;IACrE,MAAM,IAAI,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC5C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,6BAA6B,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,MAAmB,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,GAAG,WAAW,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,+BAAgC,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,MAAM,CAAC,OAAO,GAAG,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;IAChD,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { DivergenceMap, DivergenceScenario } from './types.js';
|
|
2
|
+
export declare const DIVERGENCE_MAP: DivergenceMap;
|
|
3
|
+
/** 按 scenario_id 查询 */
|
|
4
|
+
export declare function findScenario(id: string): DivergenceScenario | undefined;
|
|
5
|
+
//# sourceMappingURL=divergence-map.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"divergence-map.d.ts","sourceRoot":"","sources":["../../../src/core/monitor/divergence-map.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEpE,eAAO,MAAM,cAAc,EAAE,aA0G5B,CAAC;AAEF,uBAAuB;AACvB,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAEvE"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
export const DIVERGENCE_MAP = {
|
|
2
|
+
meta: {
|
|
3
|
+
schema: 'forge-monitor-divergence-map/v1',
|
|
4
|
+
// 挖掘时两上游仓的实际 commit(git -C ../OpenSpec / ../superpowers rev-parse --short HEAD)
|
|
5
|
+
synced_against: { openspec: '435458b', superpowers: 'e7a2d16' },
|
|
6
|
+
synced_at: '2026-05-16',
|
|
7
|
+
},
|
|
8
|
+
scenarios: [
|
|
9
|
+
// ── brainstorm ────────────────────────────────────────────────────────
|
|
10
|
+
{
|
|
11
|
+
stage: 'brainstorm',
|
|
12
|
+
scenario_id: 'brainstorm-one-line-need',
|
|
13
|
+
desc: '用户给一句话需求(如「加个 todo list」),要不要先问澄清问题再动手?',
|
|
14
|
+
openspec: 'openspec change new 仅 scaffold 出 change 目录骨架,无强制澄清问答,直接进产物起草',
|
|
15
|
+
superpowers: 'brainstorming skill 有 HARD-GATE + 逐个澄清问答 checklist,但属 skill 行为约束,无机器 fence 兜底',
|
|
16
|
+
forge: 'forge:brainstorming skill 强制逐个提问 + 「禁止行为」明令即使用户说「我想清楚了」也不许跳过问答,产物只能落 forge/drafts/',
|
|
17
|
+
rationale: '反向加固 —— 防 AI 拿一句话需求当完整 spec、跳过澄清直接写代码',
|
|
18
|
+
regression_signal: 'brainstorm 阶段 trace 无 clarifying-question 事件、直接出现 draft/artifact 写入 → forge 塌回 OpenSpec 无澄清基线',
|
|
19
|
+
},
|
|
20
|
+
// ── propose ───────────────────────────────────────────────────────────
|
|
21
|
+
{
|
|
22
|
+
stage: 'propose',
|
|
23
|
+
scenario_id: 'propose-artifact-completeness',
|
|
24
|
+
desc: 'proposal 写完了,specs/design/tasks 还没补齐,要不要就这样进 apply?',
|
|
25
|
+
openspec: 'openspec 产物按 artifact-graph 逐件生成,validate 做结构校验但不阻塞流程推进,缺件可继续',
|
|
26
|
+
superpowers: 'writing-plans skill 产计划文档并自检 placeholder,但无四件套强校验,scope 解耦靠人把关',
|
|
27
|
+
forge: 'propose 末尾强制跑 forge validate <id> 校验 proposal+specs+design+tasks 四件套齐全 + 三段 scope anchor,失败回补不留半成品',
|
|
28
|
+
rationale: '反向加固 —— 防 AI 只写 proposal 就推进、留不完整产物拖到后续阶段',
|
|
29
|
+
regression_signal: 'propose 阶段 trace 无 forge-validate 通过事件、或 validate exit_code≠0 仍进 apply → forge 塌回 OpenSpec 弱校验基线',
|
|
30
|
+
},
|
|
31
|
+
// ── apply ─────────────────────────────────────────────────────────────
|
|
32
|
+
{
|
|
33
|
+
stage: 'apply',
|
|
34
|
+
scenario_id: 'apply-out-of-scope-finding',
|
|
35
|
+
desc: '子代理实施中发现一个本 change 没覆盖、但相关的需求,要不要顺手做掉?',
|
|
36
|
+
openspec: 'openspec 无子代理派发协议,实施由单一代理顺序跑,scope 外发现多半被就地吸收进当前改动',
|
|
37
|
+
superpowers: 'subagent-driven-development 派 fresh 子代理逐 task 实施,但 scope 外发现的处置靠主代理判断,无强制四选项',
|
|
38
|
+
forge: 'apply 的 Fluid Pause:子代理报非 CRITICAL concern 时主代理停下走 AskUserQuestion 四选项(扩 scope/加 task/转 out-of-scope/Other),决策写 marker pause_decisions',
|
|
39
|
+
rationale: '反向加固 —— 防 AI 子代理擅自扩 scope、把计划外改动悄悄塞进当前 change',
|
|
40
|
+
regression_signal: 'apply 阶段 trace 出现 scope 外 commit 但无 fluid-pause / pause_decision 事件 → forge 塌回 superpowers 无强制暂停基线',
|
|
41
|
+
},
|
|
42
|
+
// ── review ────────────────────────────────────────────────────────────
|
|
43
|
+
{
|
|
44
|
+
stage: 'review',
|
|
45
|
+
scenario_id: 'review-finding-severity-ack',
|
|
46
|
+
desc: 'review 子代理报了一条意见,主代理觉得不重要,要不要直接略过?',
|
|
47
|
+
openspec: 'openspec 无独立 review 阶段,正确性靠 validate + 人工把关,review finding 无 severity 分级与签收',
|
|
48
|
+
superpowers: 'requesting-code-review 派 code-reviewer 子代理并分 Critical/Important/Minor,但接受/反驳由主代理自由裁量,无存档强制',
|
|
49
|
+
forge: 'review finding 带严重度分级,主代理逐条判接受/拒绝,拒绝须证据存档;仅「无未存档拒绝 + 接受项全实现测试通过 + 本轮无新 task」三条件齐才打 .review-passed',
|
|
50
|
+
rationale: '反向加固 —— 防 AI 主代理无证据略过 review 意见、草率打 review-passed marker',
|
|
51
|
+
regression_signal: 'review 阶段 trace 有 reviewer finding 但无对应 accept/reject 记录,或 .review-passed 在仍有 finding 未处置时落地 → forge 塌回 superpowers 自由裁量基线',
|
|
52
|
+
},
|
|
53
|
+
// ── verify ────────────────────────────────────────────────────────────
|
|
54
|
+
{
|
|
55
|
+
stage: 'verify',
|
|
56
|
+
scenario_id: 'verify-tests-green',
|
|
57
|
+
desc: '测试全 pass,要不要继续深挖?',
|
|
58
|
+
openspec: '无强 verify 阶段,验证靠 review,≈ 弱/无对应',
|
|
59
|
+
superpowers: 'verification-before-completion:跑验证命令、确认输出;pass 即可声明完成',
|
|
60
|
+
forge: 'verifying-three-dimensions:测试 pass 只是 Correctness 一维;还需 Completeness + Coherence',
|
|
61
|
+
rationale: '反向加固 —— 防 AI 拿「测试绿」当完工',
|
|
62
|
+
regression_signal: 'verify 阶段 trace 只有 Correctness 维度 record,缺 Completeness/Coherence → forge 塌回 superpowers 基线',
|
|
63
|
+
},
|
|
64
|
+
// ── archive ───────────────────────────────────────────────────────────
|
|
65
|
+
{
|
|
66
|
+
stage: 'archive',
|
|
67
|
+
scenario_id: 'archive-unresolved-warning',
|
|
68
|
+
desc: 'review 留了个未解决 WARNING,要不要归档?',
|
|
69
|
+
openspec: 'openspec archive 无 severity 分级 fence → 多半放行',
|
|
70
|
+
superpowers: 'finishing-a-development-branch:给 merge/PR/cleanup 选项,不强制 finding 解决',
|
|
71
|
+
forge: '三级 fence:WARNING 未 resolve 且无 ack → 拒签 exit 1',
|
|
72
|
+
rationale: '反向加固 —— 强 fence 防偷懒归档',
|
|
73
|
+
regression_signal: 'archive 在有未 ack WARNING 时 cli_exit.exit_code=0 → 回归',
|
|
74
|
+
},
|
|
75
|
+
// ── explore ───────────────────────────────────────────────────────────
|
|
76
|
+
{
|
|
77
|
+
stage: 'explore',
|
|
78
|
+
scenario_id: 'explore-capture-conclusion',
|
|
79
|
+
desc: '一轮探索想出了结论,要不要顺手把结论写进 design/proposal 产物?',
|
|
80
|
+
openspec: 'openspec 探索能力弱,无显式 explore 阶段;探索心得多半直接被吸收进产物或散落上下文',
|
|
81
|
+
superpowers: 'superpowers 无 exploring skill,非线性探索靠 brainstorming/systematic-debugging 边角覆盖,结论落点无约束',
|
|
82
|
+
forge: 'forge:exploring skill 强制末尾输出 ## Exploration Summary 收尾、capture offer 必须给具体 file:section,且禁止 explore turn 内直接 Write/Edit 改 forge/changes/* 产物',
|
|
83
|
+
rationale: '反向加固 —— 防 AI 探索完无结论、或绕开用户确认直接把探索改动塞进产物',
|
|
84
|
+
regression_signal: 'explore 阶段 trace 出现 forge/changes/* 产物写入但无 capture-offer + 用户确认事件,或无 exploration-summary 收尾 → forge 塌回上游无约束基线',
|
|
85
|
+
},
|
|
86
|
+
],
|
|
87
|
+
};
|
|
88
|
+
/** 按 scenario_id 查询 */
|
|
89
|
+
export function findScenario(id) {
|
|
90
|
+
return DIVERGENCE_MAP.scenarios.find((s) => s.scenario_id === id);
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=divergence-map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"divergence-map.js","sourceRoot":"","sources":["../../../src/core/monitor/divergence-map.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,cAAc,GAAkB;IAC3C,IAAI,EAAE;QACJ,MAAM,EAAE,iCAAiC;QACzC,gFAAgF;QAChF,cAAc,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE;QAC/D,SAAS,EAAE,YAAY;KACxB;IACD,SAAS,EAAE;QACT,yEAAyE;QACzE;YACE,KAAK,EAAE,YAAY;YACnB,WAAW,EAAE,0BAA0B;YACvC,IAAI,EAAE,yCAAyC;YAC/C,QAAQ,EAAE,8DAA8D;YACxE,WAAW,EACT,+EAA+E;YACjF,KAAK,EACH,oFAAoF;YACtF,SAAS,EAAE,uCAAuC;YAClD,iBAAiB,EACf,+FAA+F;SAClG;QACD,yEAAyE;QACzE;YACE,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,+BAA+B;YAC5C,IAAI,EAAE,qDAAqD;YAC3D,QAAQ,EACN,+DAA+D;YACjE,WAAW,EACT,gEAAgE;YAClE,KAAK,EACH,oGAAoG;YACtG,SAAS,EAAE,2CAA2C;YACtD,iBAAiB,EACf,kGAAkG;SACrG;QACD,yEAAyE;QACzE;YACE,KAAK,EAAE,OAAO;YACd,WAAW,EAAE,4BAA4B;YACzC,IAAI,EAAE,wCAAwC;YAC9C,QAAQ,EACN,oDAAoD;YACtD,WAAW,EACT,8EAA8E;YAChF,KAAK,EACH,wIAAwI;YAC1I,SAAS,EAAE,+CAA+C;YAC1D,iBAAiB,EACf,oGAAoG;SACvG;QACD,yEAAyE;QACzE;YACE,KAAK,EAAE,QAAQ;YACf,WAAW,EAAE,6BAA6B;YAC1C,IAAI,EAAE,oCAAoC;YAC1C,QAAQ,EACN,6EAA6E;YAC/E,WAAW,EACT,4FAA4F;YAC9F,KAAK,EACH,mGAAmG;YACrG,SAAS,EAAE,0DAA0D;YACrE,iBAAiB,EACf,4HAA4H;SAC/H;QACD,yEAAyE;QACzE;YACE,KAAK,EAAE,QAAQ;YACf,WAAW,EAAE,oBAAoB;YACjC,IAAI,EAAE,mBAAmB;YACzB,QAAQ,EAAE,iCAAiC;YAC3C,WAAW,EAAE,uDAAuD;YACpE,KAAK,EACH,kFAAkF;YACpF,SAAS,EAAE,wBAAwB;YACnC,iBAAiB,EACf,6FAA6F;SAChG;QACD,yEAAyE;QACzE;YACE,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,4BAA4B;YACzC,IAAI,EAAE,8BAA8B;YACpC,QAAQ,EAAE,6CAA6C;YACvD,WAAW,EAAE,qEAAqE;YAClF,KAAK,EAAE,+CAA+C;YACtD,SAAS,EAAE,uBAAuB;YAClC,iBAAiB,EAAE,qDAAqD;SACzE;QACD,yEAAyE;QACzE;YACE,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,4BAA4B;YACzC,IAAI,EAAE,0CAA0C;YAChD,QAAQ,EAAE,oDAAoD;YAC9D,WAAW,EACT,sFAAsF;YACxF,KAAK,EACH,8IAA8I;YAChJ,SAAS,EAAE,wCAAwC;YACnD,iBAAiB,EACf,+GAA+G;SAClH;KACF;CACF,CAAC;AAEF,uBAAuB;AACvB,MAAM,UAAU,YAAY,CAAC,EAAU;IACrC,OAAO,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,EAAE,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exit-handler.d.ts","sourceRoot":"","sources":["../../../src/core/monitor/exit-handler.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAc9F"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// src/core/monitor/exit-handler.ts — exit 处理器逻辑(spec §4)
|
|
2
|
+
import { isMonitorEnabled } from './config.js';
|
|
3
|
+
import { recordCliExit } from './trace-store.js';
|
|
4
|
+
/**
|
|
5
|
+
* exit 处理器的可测逻辑:config 守卫 + 跳过自身 + 绝不抛(spec §4 约束 1/3/4)。
|
|
6
|
+
* `process.on('exit')` 注册体只调本函数。
|
|
7
|
+
*/
|
|
8
|
+
export function maybeRecordCliExit(projectRoot, argv, exitCode) {
|
|
9
|
+
try {
|
|
10
|
+
if (!Array.isArray(argv))
|
|
11
|
+
return;
|
|
12
|
+
if (argv[0] === 'monitor')
|
|
13
|
+
return; // 跳过自身,避免噪声/递归
|
|
14
|
+
if (!isMonitorEnabled(projectRoot))
|
|
15
|
+
return; // config 守卫:关闭即返回
|
|
16
|
+
recordCliExit(projectRoot, {
|
|
17
|
+
ts: new Date().toISOString(),
|
|
18
|
+
command: argv,
|
|
19
|
+
cwd: projectRoot,
|
|
20
|
+
exit_code: exitCode,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// 绝不抛 —— 'exit' 处理器抛异常会污染进程退出
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=exit-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exit-handler.js","sourceRoot":"","sources":["../../../src/core/monitor/exit-handler.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,WAAmB,EAAE,IAAc,EAAE,QAAgB;IACtF,IAAI,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,OAAO;QACjC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS;YAAE,OAAO,CAAC,eAAe;QAClD,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC;YAAE,OAAO,CAAC,kBAAkB;QAC9D,aAAa,CAAC,WAAW,EAAE;YACzB,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,OAAO,EAAE,IAAI;YACb,GAAG,EAAE,WAAW;YAChB,SAAS,EAAE,QAAQ;SACpB,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,8BAA8B;IAChC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type TraceEvent, type HealthVerdict } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* 计算健康裁决。只做 spec §10.1 列的「可机检」项:
|
|
4
|
+
* - regression:hardening_step.executed === false(加固步骤未执行)。
|
|
5
|
+
* - anomaly:某阶段有 CLI 事件但完全无 AI stage_enter(AI trace 缺该阶段)。
|
|
6
|
+
* 语义细微的 regression_signal 不在此机评,交报告并排呈现给人判。
|
|
7
|
+
*/
|
|
8
|
+
export declare function computeVerdict(events: TraceEvent[]): HealthVerdict;
|
|
9
|
+
//# sourceMappingURL=health-verdict.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-verdict.d.ts","sourceRoot":"","sources":["../../../src/core/monitor/health-verdict.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,aAAa,EAGnB,MAAM,YAAY,CAAC;AAKpB;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,aAAa,CA2ClE"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// src/core/monitor/health-verdict.ts — 健康裁决(spec §10.1:只做可机检的判定)
|
|
2
|
+
import { COMPARABLE_STAGES, } from './types.js';
|
|
3
|
+
/** 可对比阶段集合 —— check 2 只对它们判 AI trace 缺失(forge 专属阶段 CLI-only,不判) */
|
|
4
|
+
const COMPARABLE_STAGE_SET = new Set(COMPARABLE_STAGES);
|
|
5
|
+
/**
|
|
6
|
+
* 计算健康裁决。只做 spec §10.1 列的「可机检」项:
|
|
7
|
+
* - regression:hardening_step.executed === false(加固步骤未执行)。
|
|
8
|
+
* - anomaly:某阶段有 CLI 事件但完全无 AI stage_enter(AI trace 缺该阶段)。
|
|
9
|
+
* 语义细微的 regression_signal 不在此机评,交报告并排呈现给人判。
|
|
10
|
+
*/
|
|
11
|
+
export function computeVerdict(events) {
|
|
12
|
+
const items = [];
|
|
13
|
+
// 检查 1:加固步骤未执行 → regression
|
|
14
|
+
for (const e of events) {
|
|
15
|
+
if (e.layer === 'ai' && e.event === 'hardening_step' && e.data.executed === false) {
|
|
16
|
+
items.push({
|
|
17
|
+
kind: 'regression',
|
|
18
|
+
stage: e.stage,
|
|
19
|
+
detail: `加固步骤未执行:${String(e.data.step ?? '(未命名)')}`,
|
|
20
|
+
evidence: `trace ${e.ts} hardening_step executed=false`,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
// 检查 2:某阶段有 CLI 事件但无 AI stage_enter → anomaly
|
|
25
|
+
const stagesWithCli = new Set();
|
|
26
|
+
const stagesWithAiEnter = new Set();
|
|
27
|
+
for (const e of events) {
|
|
28
|
+
if (e.layer === 'cli')
|
|
29
|
+
stagesWithCli.add(e.stage);
|
|
30
|
+
if (e.layer === 'ai' && e.event === 'stage_enter')
|
|
31
|
+
stagesWithAiEnter.add(e.stage);
|
|
32
|
+
}
|
|
33
|
+
for (const stage of stagesWithCli) {
|
|
34
|
+
// 只对可对比阶段判 AI trace 缺失;forge 专属阶段(ack-confirm/upgrade/codex-adversarial)
|
|
35
|
+
// 按 spec §1.3 本就 CLI-only、注入内容不要求 AI record,跳过避免假阳性(M-3)
|
|
36
|
+
if (!COMPARABLE_STAGE_SET.has(stage))
|
|
37
|
+
continue;
|
|
38
|
+
if (!stagesWithAiEnter.has(stage)) {
|
|
39
|
+
items.push({
|
|
40
|
+
kind: 'anomaly',
|
|
41
|
+
stage,
|
|
42
|
+
detail: `${stage} 阶段有 CLI 事件但缺 AI stage_enter record`,
|
|
43
|
+
evidence: `${stage} AI trace 不完整(可能漏记或中途启用)`,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// 计算最终 level:如果有 regression 则为 regression,否则有 items 就 anomaly,都没有就 ok
|
|
48
|
+
const level = items.some((i) => i.kind === 'regression')
|
|
49
|
+
? 'regression'
|
|
50
|
+
: items.length > 0
|
|
51
|
+
? 'anomaly'
|
|
52
|
+
: 'ok';
|
|
53
|
+
return { level, items };
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=health-verdict.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-verdict.js","sourceRoot":"","sources":["../../../src/core/monitor/health-verdict.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,OAAO,EACL,iBAAiB,GAKlB,MAAM,YAAY,CAAC;AAEpB,mEAAmE;AACnE,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAe,iBAAiB,CAAC,CAAC;AAEtE;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,MAAoB;IACjD,MAAM,KAAK,GAAkB,EAAE,CAAC;IAEhC,4BAA4B;IAC5B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,gBAAgB,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;YAClF,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,YAAY;gBAClB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,MAAM,EAAE,WAAW,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,EAAE;gBACnD,QAAQ,EAAE,SAAS,CAAC,CAAC,EAAE,gCAAgC;aACxD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,MAAM,aAAa,GAAG,IAAI,GAAG,EAAgB,CAAC;IAC9C,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAgB,CAAC;IAClD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK;YAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAClD,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,aAAa;YAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACpF,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,yEAAyE;QACzE,yDAAyD;QACzD,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,SAAS;QAC/C,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,SAAS;gBACf,KAAK;gBACL,MAAM,EAAE,GAAG,KAAK,qCAAqC;gBACrD,QAAQ,EAAE,GAAG,KAAK,0BAA0B;aAC7C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,sEAAsE;IACtE,MAAM,KAAK,GAA2B,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC;QAC9E,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;YAChB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,IAAI,CAAC;IACX,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { TraceEvent, CliExitRecord } from './types.js';
|
|
2
|
+
/** 渲染某 change 的完整监控报告 markdown */
|
|
3
|
+
export declare function renderReport(changeId: string, events: TraceEvent[], cliExits: CliExitRecord[], now?: string): string;
|
|
4
|
+
//# sourceMappingURL=report-renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-renderer.d.ts","sourceRoot":"","sources":["../../../src/core/monitor/report-renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAS5D,kCAAkC;AAClC,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,UAAU,EAAE,EACpB,QAAQ,EAAE,aAAa,EAAE,EACzB,GAAG,GAAE,MAAiC,GACrC,MAAM,CAmFR"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { computeVerdict } from './health-verdict.js';
|
|
2
|
+
import { DIVERGENCE_MAP, findScenario } from './divergence-map.js';
|
|
3
|
+
/** 净化 markdown 表格单元格:转义管道符、压平换行(防 AI 自由文本破坏表格) */
|
|
4
|
+
function sanitizeCell(s) {
|
|
5
|
+
return s.replace(/\|/g, '\\|').replace(/\r?\n/g, ' ');
|
|
6
|
+
}
|
|
7
|
+
/** 渲染某 change 的完整监控报告 markdown */
|
|
8
|
+
export function renderReport(changeId, events, cliExits, now = new Date().toISOString()) {
|
|
9
|
+
const verdict = computeVerdict(events);
|
|
10
|
+
const lines = [];
|
|
11
|
+
lines.push(`# Forge 工作流监控报告 — ${changeId}`, '');
|
|
12
|
+
lines.push(`生成时间:${now}`);
|
|
13
|
+
lines.push(`差异映射表同步于:${DIVERGENCE_MAP.meta.synced_at}`, '');
|
|
14
|
+
// ── 1. 健康裁决 ──
|
|
15
|
+
lines.push('## 1. 健康裁决', '');
|
|
16
|
+
const levelText = { ok: '✓ OK', regression: '✗ 检出回归', anomaly: '⚠ 检出异常' }[verdict.level];
|
|
17
|
+
lines.push(`整体:${levelText}`, '');
|
|
18
|
+
if (verdict.items.length === 0) {
|
|
19
|
+
lines.push('无命中项。', '');
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
for (const it of verdict.items) {
|
|
23
|
+
const tag = it.kind === 'regression' ? '回归' : '异常';
|
|
24
|
+
lines.push(`- [${tag}] (${it.stage}) ${it.detail}`);
|
|
25
|
+
lines.push(` 证据:${it.evidence}`);
|
|
26
|
+
}
|
|
27
|
+
lines.push('');
|
|
28
|
+
}
|
|
29
|
+
// ── 2. 阶段时间线 ──
|
|
30
|
+
lines.push('## 2. 阶段时间线', '');
|
|
31
|
+
// §2.4:分维度覆盖标注 —— 中途启用监控时各维度覆盖范围不同,如实呈现、不假装完整
|
|
32
|
+
const markerStages = [...new Set(events.filter((e) => e.layer === 'cli').map((e) => e.stage))];
|
|
33
|
+
const aiStages = [...new Set(events.filter((e) => e.layer === 'ai').map((e) => e.stage))];
|
|
34
|
+
const exitCmds = [...new Set(cliExits.map((c) => c.command[0] ?? '?'))];
|
|
35
|
+
if (events.length > 0 || cliExits.length > 0) {
|
|
36
|
+
lines.push(`维度覆盖 —— CLI 产物观察: ${markerStages.join(', ') || '(无)'};` +
|
|
37
|
+
` AI trace: ${aiStages.join(', ') || '(无)'};` +
|
|
38
|
+
` CLI exit: ${exitCmds.join(', ') || '(无)'}`, '');
|
|
39
|
+
}
|
|
40
|
+
if (events.length === 0) {
|
|
41
|
+
lines.push('(无 trace 事件)', '');
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
lines.push('| 时间 | 阶段 | 层 | 事件 |', '| --- | --- | --- | --- |');
|
|
45
|
+
for (const e of events) {
|
|
46
|
+
lines.push(`| ${e.ts} | ${e.stage} | ${e.layer} | ${sanitizeCell(e.event)} |`);
|
|
47
|
+
}
|
|
48
|
+
lines.push('');
|
|
49
|
+
}
|
|
50
|
+
if (cliExits.length > 0) {
|
|
51
|
+
lines.push('CLI exit 记录:');
|
|
52
|
+
for (const c of cliExits) {
|
|
53
|
+
lines.push(`- ${c.ts} \`forge ${c.command.join(' ')}\` → exit ${c.exit_code}`);
|
|
54
|
+
}
|
|
55
|
+
lines.push('');
|
|
56
|
+
}
|
|
57
|
+
// ── 3. 三方对比表 ──
|
|
58
|
+
lines.push('## 3. 三方对比表(Forge vs OpenSpec vs Superpowers)', '');
|
|
59
|
+
lines.push('| scenario | forge 实际走法 | openspec | superpowers | 加固守住? |', '| --- | --- | --- | --- | --- |');
|
|
60
|
+
const decisions = events.filter((e) => e.layer === 'ai' && e.event === 'decision');
|
|
61
|
+
if (decisions.length === 0) {
|
|
62
|
+
lines.push('| (无 decision record) | — | — | — | — |');
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
for (const d of decisions) {
|
|
66
|
+
const sidRaw = String(d.data.scenario_id ?? '');
|
|
67
|
+
const chosen = sanitizeCell(String(d.data.chosen ?? '(未记录)'));
|
|
68
|
+
const sc = findScenario(sidRaw);
|
|
69
|
+
lines.push(`| ${sanitizeCell(sidRaw)} | ${chosen} | ${sanitizeCell(sc?.openspec ?? '?')} | ${sanitizeCell(sc?.superpowers ?? '?')} | ? |`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
lines.push('');
|
|
73
|
+
lines.push('> `加固守住?` 列填 `?` 的需人工对照 `regression_signal` 判定(spec §10.1)。', '');
|
|
74
|
+
// ── 4. 附录 ──
|
|
75
|
+
lines.push('## 4. 附录:原始 trace', '');
|
|
76
|
+
lines.push('```jsonl');
|
|
77
|
+
for (const e of events)
|
|
78
|
+
lines.push(JSON.stringify(e));
|
|
79
|
+
lines.push('```', '');
|
|
80
|
+
return lines.join('\n');
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=report-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-renderer.js","sourceRoot":"","sources":["../../../src/core/monitor/report-renderer.ts"],"names":[],"mappings":"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"}
|