@matteeh/osq 0.1.0 → 0.2.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/README.md +415 -72
- package/dist/cli/approve.d.ts +13 -3
- package/dist/cli/approve.d.ts.map +1 -1
- package/dist/cli/approve.js +59 -4
- package/dist/cli/approve.js.map +1 -1
- package/dist/cli/bin.js +0 -0
- package/dist/cli/confirm.d.ts +21 -0
- package/dist/cli/confirm.d.ts.map +1 -0
- package/dist/cli/confirm.js +28 -0
- package/dist/cli/confirm.js.map +1 -0
- package/dist/cli/doctor.d.ts +13 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +23 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/done.d.ts +12 -0
- package/dist/cli/done.d.ts.map +1 -0
- package/dist/cli/done.js +26 -0
- package/dist/cli/done.js.map +1 -0
- package/dist/cli/inbox.d.ts +22 -0
- package/dist/cli/inbox.d.ts.map +1 -0
- package/dist/cli/inbox.js +41 -0
- package/dist/cli/inbox.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +127 -8
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.d.ts +1 -0
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +9 -3
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/lint.d.ts +26 -0
- package/dist/cli/lint.d.ts.map +1 -0
- package/dist/cli/lint.js +60 -0
- package/dist/cli/lint.js.map +1 -0
- package/dist/cli/migrate.d.ts +18 -0
- package/dist/cli/migrate.d.ts.map +1 -0
- package/dist/cli/migrate.js +42 -0
- package/dist/cli/migrate.js.map +1 -0
- package/dist/cli/new.js +1 -1
- package/dist/cli/new.js.map +1 -1
- package/dist/cli/plan-queue.d.ts +50 -0
- package/dist/cli/plan-queue.d.ts.map +1 -0
- package/dist/cli/plan-queue.js +167 -0
- package/dist/cli/plan-queue.js.map +1 -0
- package/dist/cli/plan.d.ts +35 -0
- package/dist/cli/plan.d.ts.map +1 -0
- package/dist/cli/plan.js +153 -0
- package/dist/cli/plan.js.map +1 -0
- package/dist/cli/queue.d.ts +9 -0
- package/dist/cli/queue.d.ts.map +1 -0
- package/dist/cli/queue.js +24 -0
- package/dist/cli/queue.js.map +1 -0
- package/dist/cli/reject.d.ts +8 -0
- package/dist/cli/reject.d.ts.map +1 -0
- package/dist/cli/reject.js +18 -0
- package/dist/cli/reject.js.map +1 -0
- package/dist/cli/report.d.ts +1 -1
- package/dist/cli/report.d.ts.map +1 -1
- package/dist/cli/report.js +141 -14
- package/dist/cli/report.js.map +1 -1
- package/dist/cli/retry.d.ts +7 -0
- package/dist/cli/retry.d.ts.map +1 -0
- package/dist/cli/retry.js +29 -0
- package/dist/cli/retry.js.map +1 -0
- package/dist/cli/serve.d.ts +30 -0
- package/dist/cli/serve.d.ts.map +1 -0
- package/dist/cli/serve.js +136 -0
- package/dist/cli/serve.js.map +1 -0
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +7 -1
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/show.d.ts +2 -1
- package/dist/cli/show.d.ts.map +1 -1
- package/dist/cli/show.js +20 -3
- package/dist/cli/show.js.map +1 -1
- package/dist/cli/status.d.ts +1 -1
- package/dist/cli/status.d.ts.map +1 -1
- package/dist/cli/status.js +2 -2
- package/dist/cli/status.js.map +1 -1
- package/dist/cli/watch.d.ts +9 -6
- package/dist/cli/watch.d.ts.map +1 -1
- package/dist/cli/watch.js +15 -2
- package/dist/cli/watch.js.map +1 -1
- package/dist/core/foundation/config-codex.d.ts +22 -0
- package/dist/core/foundation/config-codex.d.ts.map +1 -0
- package/dist/core/foundation/config-codex.js +58 -0
- package/dist/core/foundation/config-codex.js.map +1 -0
- package/dist/core/foundation/config-doctor.d.ts +14 -0
- package/dist/core/foundation/config-doctor.d.ts.map +1 -0
- package/dist/core/foundation/config-doctor.js +29 -0
- package/dist/core/foundation/config-doctor.js.map +1 -0
- package/dist/core/foundation/config-env.d.ts +3 -0
- package/dist/core/foundation/config-env.d.ts.map +1 -0
- package/dist/core/foundation/config-env.js +22 -0
- package/dist/core/foundation/config-env.js.map +1 -0
- package/dist/core/foundation/config-gates.d.ts +22 -0
- package/dist/core/foundation/config-gates.d.ts.map +1 -0
- package/dist/core/foundation/config-gates.js +43 -0
- package/dist/core/foundation/config-gates.js.map +1 -0
- package/dist/core/foundation/config-pi.d.ts +64 -0
- package/dist/core/foundation/config-pi.d.ts.map +1 -0
- package/dist/core/foundation/config-pi.js +131 -0
- package/dist/core/foundation/config-pi.js.map +1 -0
- package/dist/core/foundation/config-planning.d.ts +24 -0
- package/dist/core/foundation/config-planning.d.ts.map +1 -0
- package/dist/core/foundation/config-planning.js +60 -0
- package/dist/core/foundation/config-planning.js.map +1 -0
- package/dist/core/foundation/config-queue.d.ts +15 -0
- package/dist/core/foundation/config-queue.d.ts.map +1 -0
- package/dist/core/foundation/config-queue.js +24 -0
- package/dist/core/foundation/config-queue.js.map +1 -0
- package/dist/core/foundation/config-serve.d.ts +20 -0
- package/dist/core/foundation/config-serve.d.ts.map +1 -0
- package/dist/core/foundation/config-serve.js +35 -0
- package/dist/core/foundation/config-serve.js.map +1 -0
- package/dist/core/{config.d.ts → foundation/config.d.ts} +34 -3
- package/dist/core/foundation/config.d.ts.map +1 -0
- package/dist/core/{config.js → foundation/config.js} +35 -18
- package/dist/core/foundation/config.js.map +1 -0
- package/dist/core/foundation/doctor-managed.d.ts +13 -0
- package/dist/core/foundation/doctor-managed.d.ts.map +1 -0
- package/dist/core/foundation/doctor-managed.js +77 -0
- package/dist/core/foundation/doctor-managed.js.map +1 -0
- package/dist/core/foundation/doctor.d.ts +19 -0
- package/dist/core/foundation/doctor.d.ts.map +1 -0
- package/dist/core/foundation/doctor.js +187 -0
- package/dist/core/foundation/doctor.js.map +1 -0
- package/dist/core/foundation/harness-catalog.d.ts +96 -0
- package/dist/core/foundation/harness-catalog.d.ts.map +1 -0
- package/dist/core/foundation/harness-catalog.js +182 -0
- package/dist/core/foundation/harness-catalog.js.map +1 -0
- package/dist/core/foundation/init-blocks.d.ts +33 -0
- package/dist/core/foundation/init-blocks.d.ts.map +1 -0
- package/dist/core/foundation/init-blocks.js +165 -0
- package/dist/core/foundation/init-blocks.js.map +1 -0
- package/dist/core/foundation/init-managed.d.ts +10 -0
- package/dist/core/foundation/init-managed.d.ts.map +1 -0
- package/dist/core/foundation/init-managed.js +115 -0
- package/dist/core/foundation/init-managed.js.map +1 -0
- package/dist/core/foundation/init.d.ts +18 -0
- package/dist/core/foundation/init.d.ts.map +1 -0
- package/dist/core/foundation/init.js +113 -0
- package/dist/core/foundation/init.js.map +1 -0
- package/dist/core/{logger.d.ts → foundation/logger.d.ts} +1 -0
- package/dist/core/foundation/logger.d.ts.map +1 -0
- package/dist/core/{logger.js → foundation/logger.js} +18 -2
- package/dist/core/foundation/logger.js.map +1 -0
- package/dist/core/{new.d.ts → foundation/new.d.ts} +3 -0
- package/dist/core/foundation/new.d.ts.map +1 -0
- package/dist/core/foundation/new.js +206 -0
- package/dist/core/foundation/new.js.map +1 -0
- package/dist/core/foundation/package-root.d.ts +9 -0
- package/dist/core/foundation/package-root.d.ts.map +1 -0
- package/dist/core/foundation/package-root.js +11 -0
- package/dist/core/foundation/package-root.js.map +1 -0
- package/dist/core/lifecycle/done.d.ts +17 -0
- package/dist/core/lifecycle/done.d.ts.map +1 -0
- package/dist/core/lifecycle/done.js +97 -0
- package/dist/core/lifecycle/done.js.map +1 -0
- package/dist/core/lifecycle/reject.d.ts +26 -0
- package/dist/core/lifecycle/reject.d.ts.map +1 -0
- package/dist/core/lifecycle/reject.js +83 -0
- package/dist/core/lifecycle/reject.js.map +1 -0
- package/dist/core/lifecycle/retry-transition.d.ts +23 -0
- package/dist/core/lifecycle/retry-transition.d.ts.map +1 -0
- package/dist/core/lifecycle/retry-transition.js +41 -0
- package/dist/core/lifecycle/retry-transition.js.map +1 -0
- package/dist/core/lifecycle/retry.d.ts +18 -0
- package/dist/core/lifecycle/retry.d.ts.map +1 -0
- package/dist/core/lifecycle/retry.js +179 -0
- package/dist/core/lifecycle/retry.js.map +1 -0
- package/dist/core/report/approval-flags.d.ts +29 -0
- package/dist/core/report/approval-flags.d.ts.map +1 -0
- package/dist/core/report/approval-flags.js +138 -0
- package/dist/core/report/approval-flags.js.map +1 -0
- package/dist/core/report/planning-economics.d.ts +39 -0
- package/dist/core/report/planning-economics.d.ts.map +1 -0
- package/dist/core/report/planning-economics.js +168 -0
- package/dist/core/report/planning-economics.js.map +1 -0
- package/dist/core/report/planning-observed.d.ts +59 -0
- package/dist/core/report/planning-observed.d.ts.map +1 -0
- package/dist/core/report/planning-observed.js +135 -0
- package/dist/core/report/planning-observed.js.map +1 -0
- package/dist/core/report/planning-records.d.ts +69 -0
- package/dist/core/report/planning-records.d.ts.map +1 -0
- package/dist/core/report/planning-records.js +149 -0
- package/dist/core/report/planning-records.js.map +1 -0
- package/dist/core/report/planning-slice-lookup.d.ts +13 -0
- package/dist/core/report/planning-slice-lookup.d.ts.map +1 -0
- package/dist/core/report/planning-slice-lookup.js +146 -0
- package/dist/core/report/planning-slice-lookup.js.map +1 -0
- package/dist/core/report/planning-slice-measures.d.ts +17 -0
- package/dist/core/report/planning-slice-measures.d.ts.map +1 -0
- package/dist/core/report/planning-slice-measures.js +85 -0
- package/dist/core/report/planning-slice-measures.js.map +1 -0
- package/dist/core/report/planning-slice-record.d.ts +4 -0
- package/dist/core/report/planning-slice-record.d.ts.map +1 -0
- package/dist/core/report/planning-slice-record.js +66 -0
- package/dist/core/report/planning-slice-record.js.map +1 -0
- package/dist/core/report/planning-slice-turns.d.ts +13 -0
- package/dist/core/report/planning-slice-turns.d.ts.map +1 -0
- package/dist/core/report/planning-slice-turns.js +41 -0
- package/dist/core/report/planning-slice-turns.js.map +1 -0
- package/dist/core/report/planning-slice.d.ts +70 -0
- package/dist/core/report/planning-slice.d.ts.map +1 -0
- package/dist/core/report/planning-slice.js +147 -0
- package/dist/core/report/planning-slice.js.map +1 -0
- package/dist/core/report/planning.d.ts +31 -0
- package/dist/core/report/planning.d.ts.map +1 -0
- package/dist/core/report/planning.js +75 -0
- package/dist/core/report/planning.js.map +1 -0
- package/dist/core/report/report-events.d.ts +52 -0
- package/dist/core/report/report-events.d.ts.map +1 -0
- package/dist/core/report/report-events.js +198 -0
- package/dist/core/report/report-events.js.map +1 -0
- package/dist/core/report/report-pre-spawn.d.ts +25 -0
- package/dist/core/report/report-pre-spawn.d.ts.map +1 -0
- package/dist/core/report/report-pre-spawn.js +40 -0
- package/dist/core/report/report-pre-spawn.js.map +1 -0
- package/dist/core/report/report-retries.d.ts +30 -0
- package/dist/core/report/report-retries.d.ts.map +1 -0
- package/dist/core/report/report-retries.js +100 -0
- package/dist/core/report/report-retries.js.map +1 -0
- package/dist/core/report/report.d.ts +276 -0
- package/dist/core/report/report.d.ts.map +1 -0
- package/dist/core/report/report.js +1421 -0
- package/dist/core/report/report.js.map +1 -0
- package/dist/core/{lock.d.ts → run/lock.d.ts} +6 -0
- package/dist/core/run/lock.d.ts.map +1 -0
- package/dist/core/{lock.js → run/lock.js} +7 -15
- package/dist/core/run/lock.js.map +1 -0
- package/dist/core/run/manifest.d.ts +39 -0
- package/dist/core/run/manifest.d.ts.map +1 -0
- package/dist/core/run/manifest.js +137 -0
- package/dist/core/run/manifest.js.map +1 -0
- package/dist/core/run/scope-hash.d.ts +71 -0
- package/dist/core/run/scope-hash.d.ts.map +1 -0
- package/dist/core/run/scope-hash.js +177 -0
- package/dist/core/run/scope-hash.js.map +1 -0
- package/dist/core/run/scope.d.ts +30 -0
- package/dist/core/run/scope.d.ts.map +1 -0
- package/dist/core/run/scope.js +193 -0
- package/dist/core/run/scope.js.map +1 -0
- package/dist/core/run/summary.d.ts +8 -0
- package/dist/core/run/summary.d.ts.map +1 -0
- package/dist/core/run/summary.js +25 -0
- package/dist/core/run/summary.js.map +1 -0
- package/dist/core/run/verification.d.ts +23 -0
- package/dist/core/run/verification.d.ts.map +1 -0
- package/dist/core/run/verification.js +78 -0
- package/dist/core/run/verification.js.map +1 -0
- package/dist/core/spec/approve.d.ts +31 -0
- package/dist/core/spec/approve.d.ts.map +1 -0
- package/dist/core/spec/approve.js +111 -0
- package/dist/core/spec/approve.js.map +1 -0
- package/dist/core/spec/delta.d.ts +77 -0
- package/dist/core/spec/delta.d.ts.map +1 -0
- package/dist/core/spec/delta.js +581 -0
- package/dist/core/spec/delta.js.map +1 -0
- package/dist/core/spec/digest-flags.d.ts +21 -0
- package/dist/core/spec/digest-flags.d.ts.map +1 -0
- package/dist/core/spec/digest-flags.js +194 -0
- package/dist/core/spec/digest-flags.js.map +1 -0
- package/dist/core/spec/digest-verify-starts.d.ts +5 -0
- package/dist/core/spec/digest-verify-starts.d.ts.map +1 -0
- package/dist/core/spec/digest-verify-starts.js +31 -0
- package/dist/core/spec/digest-verify-starts.js.map +1 -0
- package/dist/core/spec/digest.d.ts +42 -0
- package/dist/core/spec/digest.d.ts.map +1 -0
- package/dist/core/spec/digest.js +170 -0
- package/dist/core/spec/digest.js.map +1 -0
- package/dist/core/spec/hasher.d.ts +11 -0
- package/dist/core/spec/hasher.d.ts.map +1 -0
- package/dist/core/{hasher.js → spec/hasher.js} +27 -3
- package/dist/core/spec/hasher.js.map +1 -0
- package/dist/core/spec/linter.d.ts +79 -0
- package/dist/core/spec/linter.d.ts.map +1 -0
- package/dist/core/spec/linter.js +826 -0
- package/dist/core/spec/linter.js.map +1 -0
- package/dist/core/spec/migrate.d.ts +54 -0
- package/dist/core/spec/migrate.d.ts.map +1 -0
- package/dist/core/spec/migrate.js +297 -0
- package/dist/core/spec/migrate.js.map +1 -0
- package/dist/core/spec/openspec-version.d.ts +30 -0
- package/dist/core/spec/openspec-version.d.ts.map +1 -0
- package/dist/core/spec/openspec-version.js +118 -0
- package/dist/core/spec/openspec-version.js.map +1 -0
- package/dist/core/spec/parser.d.ts +82 -0
- package/dist/core/spec/parser.d.ts.map +1 -0
- package/dist/core/spec/parser.js +221 -0
- package/dist/core/spec/parser.js.map +1 -0
- package/dist/core/spec/verify-paths.d.ts +18 -0
- package/dist/core/spec/verify-paths.d.ts.map +1 -0
- package/dist/core/spec/verify-paths.js +139 -0
- package/dist/core/spec/verify-paths.js.map +1 -0
- package/dist/core/spec/verify-starts.d.ts +45 -0
- package/dist/core/spec/verify-starts.d.ts.map +1 -0
- package/dist/core/spec/verify-starts.js +61 -0
- package/dist/core/spec/verify-starts.js.map +1 -0
- package/dist/core/status/inbox-cursor.d.ts +10 -0
- package/dist/core/status/inbox-cursor.d.ts.map +1 -0
- package/dist/core/status/inbox-cursor.js +33 -0
- package/dist/core/status/inbox-cursor.js.map +1 -0
- package/dist/core/status/inbox-projection.d.ts +15 -0
- package/dist/core/status/inbox-projection.d.ts.map +1 -0
- package/dist/core/status/inbox-projection.js +20 -0
- package/dist/core/status/inbox-projection.js.map +1 -0
- package/dist/core/status/inbox-text.d.ts +4 -0
- package/dist/core/status/inbox-text.d.ts.map +1 -0
- package/dist/core/status/inbox-text.js +48 -0
- package/dist/core/status/inbox-text.js.map +1 -0
- package/dist/core/status/inbox.d.ts +53 -0
- package/dist/core/status/inbox.d.ts.map +1 -0
- package/dist/core/status/inbox.js +167 -0
- package/dist/core/status/inbox.js.map +1 -0
- package/dist/core/status/layout.d.ts +29 -0
- package/dist/core/status/layout.d.ts.map +1 -0
- package/dist/core/status/layout.js +77 -0
- package/dist/core/status/layout.js.map +1 -0
- package/dist/core/status/queue-parser.d.ts +13 -0
- package/dist/core/status/queue-parser.d.ts.map +1 -0
- package/dist/core/status/queue-parser.js +88 -0
- package/dist/core/status/queue-parser.js.map +1 -0
- package/dist/core/status/queue-planning.d.ts +62 -0
- package/dist/core/status/queue-planning.d.ts.map +1 -0
- package/dist/core/status/queue-planning.js +158 -0
- package/dist/core/status/queue-planning.js.map +1 -0
- package/dist/core/status/queue-report-detail.d.ts +50 -0
- package/dist/core/status/queue-report-detail.d.ts.map +1 -0
- package/dist/core/status/queue-report-detail.js +140 -0
- package/dist/core/status/queue-report-detail.js.map +1 -0
- package/dist/core/status/queue-report.d.ts +14 -0
- package/dist/core/status/queue-report.d.ts.map +1 -0
- package/dist/core/status/queue-report.js +41 -0
- package/dist/core/status/queue-report.js.map +1 -0
- package/dist/core/status/queue-state.d.ts +53 -0
- package/dist/core/status/queue-state.d.ts.map +1 -0
- package/dist/core/status/queue-state.js +167 -0
- package/dist/core/status/queue-state.js.map +1 -0
- package/dist/core/status/queue.d.ts +7 -0
- package/dist/core/status/queue.d.ts.map +1 -0
- package/dist/core/status/queue.js +4 -0
- package/dist/core/status/queue.js.map +1 -0
- package/dist/core/status/show.d.ts +102 -0
- package/dist/core/status/show.d.ts.map +1 -0
- package/dist/core/status/show.js +704 -0
- package/dist/core/status/show.js.map +1 -0
- package/dist/core/status/state.d.ts +56 -0
- package/dist/core/status/state.d.ts.map +1 -0
- package/dist/core/status/state.js +187 -0
- package/dist/core/status/state.js.map +1 -0
- package/dist/core/status/status.d.ts +23 -0
- package/dist/core/status/status.d.ts.map +1 -0
- package/dist/core/status/status.js +173 -0
- package/dist/core/status/status.js.map +1 -0
- package/dist/core/web/web-data-change.d.ts +10 -0
- package/dist/core/web/web-data-change.d.ts.map +1 -0
- package/dist/core/web/web-data-change.js +106 -0
- package/dist/core/web/web-data-change.js.map +1 -0
- package/dist/core/web/web-data-folders.d.ts +39 -0
- package/dist/core/web/web-data-folders.d.ts.map +1 -0
- package/dist/core/web/web-data-folders.js +125 -0
- package/dist/core/web/web-data-folders.js.map +1 -0
- package/dist/core/web/web-data-graph.d.ts +8 -0
- package/dist/core/web/web-data-graph.d.ts.map +1 -0
- package/dist/core/web/web-data-graph.js +113 -0
- package/dist/core/web/web-data-graph.js.map +1 -0
- package/dist/core/web/web-data-lifecycle.d.ts +43 -0
- package/dist/core/web/web-data-lifecycle.d.ts.map +1 -0
- package/dist/core/web/web-data-lifecycle.js +141 -0
- package/dist/core/web/web-data-lifecycle.js.map +1 -0
- package/dist/core/web/web-data-observations.d.ts +30 -0
- package/dist/core/web/web-data-observations.d.ts.map +1 -0
- package/dist/core/web/web-data-observations.js +181 -0
- package/dist/core/web/web-data-observations.js.map +1 -0
- package/dist/core/web/web-data-tokens.d.ts +29 -0
- package/dist/core/web/web-data-tokens.d.ts.map +1 -0
- package/dist/core/web/web-data-tokens.js +62 -0
- package/dist/core/web/web-data-tokens.js.map +1 -0
- package/dist/core/web/web-data-types.d.ts +156 -0
- package/dist/core/web/web-data-types.d.ts.map +1 -0
- package/dist/core/web/web-data-types.js +15 -0
- package/dist/core/web/web-data-types.js.map +1 -0
- package/dist/core/web/web-data.d.ts +10 -0
- package/dist/core/web/web-data.d.ts.map +1 -0
- package/dist/core/web/web-data.js +8 -0
- package/dist/core/web/web-data.js.map +1 -0
- package/dist/core/web/web-events.d.ts +54 -0
- package/dist/core/web/web-events.d.ts.map +1 -0
- package/dist/core/web/web-events.js +162 -0
- package/dist/core/web/web-events.js.map +1 -0
- package/dist/core/web/web-export.d.ts +18 -0
- package/dist/core/web/web-export.d.ts.map +1 -0
- package/dist/core/web/web-export.js +112 -0
- package/dist/core/web/web-export.js.map +1 -0
- package/dist/core/web/web-server.d.ts +34 -0
- package/dist/core/web/web-server.d.ts.map +1 -0
- package/dist/core/web/web-server.js +182 -0
- package/dist/core/web/web-server.js.map +1 -0
- package/dist/core/web/web-static.d.ts +20 -0
- package/dist/core/web/web-static.d.ts.map +1 -0
- package/dist/core/web/web-static.js +104 -0
- package/dist/core/web/web-static.js.map +1 -0
- package/dist/harness/{agy.d.ts → agy/agy.d.ts} +8 -6
- package/dist/harness/agy/agy.d.ts.map +1 -0
- package/dist/harness/{agy.js → agy/agy.js} +49 -34
- package/dist/harness/agy/agy.js.map +1 -0
- package/dist/harness/claude/claude-turns.d.ts +29 -0
- package/dist/harness/claude/claude-turns.d.ts.map +1 -0
- package/dist/harness/claude/claude-turns.js +162 -0
- package/dist/harness/claude/claude-turns.js.map +1 -0
- package/dist/harness/claude/claude-usage.d.ts +12 -0
- package/dist/harness/claude/claude-usage.d.ts.map +1 -0
- package/dist/harness/claude/claude-usage.js +144 -0
- package/dist/harness/claude/claude-usage.js.map +1 -0
- package/dist/harness/codex/codex-observe-usage.d.ts +6 -0
- package/dist/harness/codex/codex-observe-usage.d.ts.map +1 -0
- package/dist/harness/codex/codex-observe-usage.js +215 -0
- package/dist/harness/codex/codex-observe-usage.js.map +1 -0
- package/dist/harness/codex/codex-prompt.d.ts +17 -0
- package/dist/harness/codex/codex-prompt.d.ts.map +1 -0
- package/dist/harness/codex/codex-prompt.js +43 -0
- package/dist/harness/codex/codex-prompt.js.map +1 -0
- package/dist/harness/codex/codex-stream.d.ts +23 -0
- package/dist/harness/codex/codex-stream.d.ts.map +1 -0
- package/dist/harness/codex/codex-stream.js +182 -0
- package/dist/harness/codex/codex-stream.js.map +1 -0
- package/dist/harness/codex/codex-usage.d.ts +26 -0
- package/dist/harness/codex/codex-usage.d.ts.map +1 -0
- package/dist/harness/codex/codex-usage.js +122 -0
- package/dist/harness/codex/codex-usage.js.map +1 -0
- package/dist/harness/codex/codex.d.ts +16 -0
- package/dist/harness/codex/codex.d.ts.map +1 -0
- package/dist/harness/codex/codex.js +92 -0
- package/dist/harness/codex/codex.js.map +1 -0
- package/dist/harness/index.d.ts +11 -2
- package/dist/harness/index.d.ts.map +1 -1
- package/dist/harness/index.js +24 -9
- package/dist/harness/index.js.map +1 -1
- package/dist/harness/mock.d.ts +5 -2
- package/dist/harness/mock.d.ts.map +1 -1
- package/dist/harness/mock.js +10 -11
- package/dist/harness/mock.js.map +1 -1
- package/dist/harness/opencode/opencode-observe-usage.d.ts +4 -0
- package/dist/harness/opencode/opencode-observe-usage.d.ts.map +1 -0
- package/dist/harness/opencode/opencode-observe-usage.js +100 -0
- package/dist/harness/opencode/opencode-observe-usage.js.map +1 -0
- package/dist/harness/opencode/opencode-usage.d.ts +24 -0
- package/dist/harness/opencode/opencode-usage.d.ts.map +1 -0
- package/dist/harness/opencode/opencode-usage.js +181 -0
- package/dist/harness/opencode/opencode-usage.js.map +1 -0
- package/dist/harness/{opencode.d.ts → opencode/opencode.d.ts} +10 -7
- package/dist/harness/opencode/opencode.d.ts.map +1 -0
- package/dist/harness/{opencode.js → opencode/opencode.js} +159 -70
- package/dist/harness/opencode/opencode.js.map +1 -0
- package/dist/harness/pi/pi-args.d.ts +9 -0
- package/dist/harness/pi/pi-args.d.ts.map +1 -0
- package/dist/harness/pi/pi-args.js +33 -0
- package/dist/harness/pi/pi-args.js.map +1 -0
- package/dist/harness/pi/pi-stream.d.ts +27 -0
- package/dist/harness/pi/pi-stream.d.ts.map +1 -0
- package/dist/harness/pi/pi-stream.js +176 -0
- package/dist/harness/pi/pi-stream.js.map +1 -0
- package/dist/harness/pi/pi-tools.d.ts +5 -0
- package/dist/harness/pi/pi-tools.d.ts.map +1 -0
- package/dist/harness/pi/pi-tools.js +31 -0
- package/dist/harness/pi/pi-tools.js.map +1 -0
- package/dist/harness/pi/pi.d.ts +11 -0
- package/dist/harness/pi/pi.d.ts.map +1 -0
- package/dist/harness/pi/pi.js +109 -0
- package/dist/harness/pi/pi.js.map +1 -0
- package/dist/harness/prompt.d.ts +11 -0
- package/dist/harness/prompt.d.ts.map +1 -0
- package/dist/harness/prompt.js +105 -0
- package/dist/harness/prompt.js.map +1 -0
- package/dist/harness/types.d.ts +287 -8
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js +125 -0
- package/dist/harness/types.js.map +1 -1
- package/dist/index.d.ts +13 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/watcher/archive-verify.d.ts +9 -0
- package/dist/watcher/archive-verify.d.ts.map +1 -0
- package/dist/watcher/archive-verify.js +80 -0
- package/dist/watcher/archive-verify.js.map +1 -0
- package/dist/watcher/archiver.d.ts +14 -2
- package/dist/watcher/archiver.d.ts.map +1 -1
- package/dist/watcher/archiver.js +112 -33
- package/dist/watcher/archiver.js.map +1 -1
- package/dist/watcher/attempt.d.ts +19 -0
- package/dist/watcher/attempt.d.ts.map +1 -0
- package/dist/watcher/attempt.js +94 -0
- package/dist/watcher/attempt.js.map +1 -0
- package/dist/watcher/auto-retry.d.ts +11 -0
- package/dist/watcher/auto-retry.d.ts.map +1 -0
- package/dist/watcher/auto-retry.js +180 -0
- package/dist/watcher/auto-retry.js.map +1 -0
- package/dist/watcher/build.d.ts +24 -0
- package/dist/watcher/build.d.ts.map +1 -0
- package/dist/watcher/build.js +169 -0
- package/dist/watcher/build.js.map +1 -0
- package/dist/watcher/change-verify.d.ts +25 -0
- package/dist/watcher/change-verify.d.ts.map +1 -0
- package/dist/watcher/change-verify.js +57 -0
- package/dist/watcher/change-verify.js.map +1 -0
- package/dist/watcher/dev.d.ts +51 -0
- package/dist/watcher/dev.d.ts.map +1 -0
- package/dist/watcher/dev.js +124 -0
- package/dist/watcher/dev.js.map +1 -0
- package/dist/watcher/failure-reason.d.ts +7 -0
- package/dist/watcher/failure-reason.d.ts.map +1 -0
- package/dist/watcher/failure-reason.js +2 -0
- package/dist/watcher/failure-reason.js.map +1 -0
- package/dist/watcher/fingerprint.d.ts +19 -0
- package/dist/watcher/fingerprint.d.ts.map +1 -0
- package/dist/watcher/fingerprint.js +53 -0
- package/dist/watcher/fingerprint.js.map +1 -0
- package/dist/watcher/heartbeat.d.ts +33 -0
- package/dist/watcher/heartbeat.d.ts.map +1 -0
- package/dist/watcher/heartbeat.js +135 -0
- package/dist/watcher/heartbeat.js.map +1 -0
- package/dist/watcher/lock.d.ts +10 -0
- package/dist/watcher/lock.d.ts.map +1 -0
- package/dist/watcher/lock.js +14 -0
- package/dist/watcher/lock.js.map +1 -0
- package/dist/watcher/loop.d.ts +26 -6
- package/dist/watcher/loop.d.ts.map +1 -1
- package/dist/watcher/loop.js +154 -37
- package/dist/watcher/loop.js.map +1 -1
- package/dist/watcher/measures.d.ts +46 -0
- package/dist/watcher/measures.d.ts.map +1 -0
- package/dist/watcher/measures.js +203 -0
- package/dist/watcher/measures.js.map +1 -0
- package/dist/watcher/outcome.d.ts +32 -0
- package/dist/watcher/outcome.d.ts.map +1 -0
- package/dist/watcher/outcome.js +127 -0
- package/dist/watcher/outcome.js.map +1 -0
- package/dist/watcher/regression.d.ts +43 -0
- package/dist/watcher/regression.d.ts.map +1 -0
- package/dist/watcher/regression.js +175 -0
- package/dist/watcher/regression.js.map +1 -0
- package/dist/watcher/runner.d.ts +6 -68
- package/dist/watcher/runner.d.ts.map +1 -1
- package/dist/watcher/runner.js +74 -523
- package/dist/watcher/runner.js.map +1 -1
- package/dist/watcher/spawn.d.ts +48 -0
- package/dist/watcher/spawn.d.ts.map +1 -0
- package/dist/watcher/spawn.js +130 -0
- package/dist/watcher/spawn.js.map +1 -0
- package/dist/watcher/task-verify.d.ts +59 -0
- package/dist/watcher/task-verify.d.ts.map +1 -0
- package/dist/watcher/task-verify.js +108 -0
- package/dist/watcher/task-verify.js.map +1 -0
- package/dist/watcher/verify.d.ts +44 -0
- package/dist/watcher/verify.d.ts.map +1 -0
- package/dist/watcher/verify.js +156 -0
- package/dist/watcher/verify.js.map +1 -0
- package/package.json +21 -9
- package/templates/PLANNER.md +77 -0
- package/templates/openspec/config.yaml +24 -0
- package/templates/openspec/schemas/osq/README.md +30 -0
- package/templates/openspec/schemas/osq/schema.yaml +133 -0
- package/templates/openspec/schemas/osq/templates/proposal.md +66 -0
- package/templates/openspec/schemas/osq/templates/spec.md +13 -0
- package/templates/openspec/schemas/osq/templates/tasks.md +11 -0
- package/templates/proposal.md +66 -0
- package/templates/tasks.md +5 -0
- package/ui/dist/assets/index-CZYeQ8la.js +9 -0
- package/ui/dist/assets/index-D6zVSjO7.css +1 -0
- package/ui/dist/index.html +14 -0
- package/dist/core/approve.d.ts +0 -11
- package/dist/core/approve.d.ts.map +0 -1
- package/dist/core/approve.js +0 -52
- package/dist/core/approve.js.map +0 -1
- package/dist/core/config.d.ts.map +0 -1
- package/dist/core/config.js.map +0 -1
- package/dist/core/hasher.d.ts +0 -4
- package/dist/core/hasher.d.ts.map +0 -1
- package/dist/core/hasher.js.map +0 -1
- package/dist/core/init.d.ts +0 -12
- package/dist/core/init.d.ts.map +0 -1
- package/dist/core/init.js +0 -151
- package/dist/core/init.js.map +0 -1
- package/dist/core/linter.d.ts +0 -8
- package/dist/core/linter.d.ts.map +0 -1
- package/dist/core/linter.js +0 -100
- package/dist/core/linter.js.map +0 -1
- package/dist/core/lock.d.ts.map +0 -1
- package/dist/core/lock.js.map +0 -1
- package/dist/core/logger.d.ts.map +0 -1
- package/dist/core/logger.js.map +0 -1
- package/dist/core/new.d.ts.map +0 -1
- package/dist/core/new.js +0 -79
- package/dist/core/new.js.map +0 -1
- package/dist/core/parser.d.ts +0 -32
- package/dist/core/parser.d.ts.map +0 -1
- package/dist/core/parser.js +0 -87
- package/dist/core/parser.js.map +0 -1
- package/dist/core/report.d.ts +0 -54
- package/dist/core/report.d.ts.map +0 -1
- package/dist/core/report.js +0 -475
- package/dist/core/report.js.map +0 -1
- package/dist/core/show.d.ts +0 -50
- package/dist/core/show.d.ts.map +0 -1
- package/dist/core/show.js +0 -374
- package/dist/core/show.js.map +0 -1
- package/dist/core/state.d.ts +0 -25
- package/dist/core/state.d.ts.map +0 -1
- package/dist/core/state.js +0 -180
- package/dist/core/state.js.map +0 -1
- package/dist/core/status.d.ts +0 -10
- package/dist/core/status.d.ts.map +0 -1
- package/dist/core/status.js +0 -106
- package/dist/core/status.js.map +0 -1
- package/dist/harness/agy.d.ts.map +0 -1
- package/dist/harness/agy.js.map +0 -1
- package/dist/harness/opencode.d.ts.map +0 -1
- package/dist/harness/opencode.js.map +0 -1
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { findSpecFolder } from '../spec/approve.js';
|
|
4
|
+
import { parseTaskList } from '../spec/parser.js';
|
|
5
|
+
import { getChangesDir } from '../status/layout.js';
|
|
6
|
+
const CHECKLIST_LINE_REGEX = /^(\s*-\s+\[)([ xX])(\]\s*)((?:(\d+)[.)]\s+)?)(.*)$/;
|
|
7
|
+
/**
|
|
8
|
+
* Tick `taskNumber`'s checkbox in `tasks.md`, supporting flat and grouped
|
|
9
|
+
* (`## <n>.`) numbering. Pure: returns the input unchanged when nothing matched.
|
|
10
|
+
*/
|
|
11
|
+
function tickTaskCheckboxContent(content, taskNumber) {
|
|
12
|
+
const target = Number.parseInt(taskNumber, 10);
|
|
13
|
+
if (Number.isNaN(target))
|
|
14
|
+
return content;
|
|
15
|
+
const lines = content.split('\n');
|
|
16
|
+
let sectionNumber = null;
|
|
17
|
+
let changed = false;
|
|
18
|
+
const updated = lines.map((line) => {
|
|
19
|
+
const headingMatch = line.match(/^##\s+(\S.*?)\s*$/);
|
|
20
|
+
if (headingMatch) {
|
|
21
|
+
const numeric = headingMatch[1].match(/^(\d+)[.)]?(?:\s|$)/);
|
|
22
|
+
sectionNumber = numeric ? Number.parseInt(numeric[1], 10) : null;
|
|
23
|
+
return line;
|
|
24
|
+
}
|
|
25
|
+
const itemMatch = line.match(CHECKLIST_LINE_REGEX);
|
|
26
|
+
if (!itemMatch)
|
|
27
|
+
return line;
|
|
28
|
+
const [, prefix, mark, close, numberedPrefix, itemNumber, rest] = itemMatch;
|
|
29
|
+
const identifier = itemNumber ? Number.parseInt(itemNumber, 10) : sectionNumber;
|
|
30
|
+
if (identifier !== target || mark.toLowerCase() === 'x')
|
|
31
|
+
return line;
|
|
32
|
+
changed = true;
|
|
33
|
+
return `${prefix}x${close}${numberedPrefix}${rest}`;
|
|
34
|
+
});
|
|
35
|
+
return changed ? updated.join('\n') : content;
|
|
36
|
+
}
|
|
37
|
+
/** A task exists when `tasks/<n>.md` is present or `tasks.md` lists number `<n>`. */
|
|
38
|
+
async function taskExists(folderPath, taskNumber) {
|
|
39
|
+
const taskFile = path.join(folderPath, 'tasks', `${taskNumber}.md`);
|
|
40
|
+
if (await fs.stat(taskFile).then(() => true, () => false))
|
|
41
|
+
return true;
|
|
42
|
+
const tasksMd = await fs.readFile(path.join(folderPath, 'tasks.md'), 'utf8').catch(() => null);
|
|
43
|
+
if (tasksMd === null)
|
|
44
|
+
return false;
|
|
45
|
+
const target = Number.parseInt(taskNumber, 10);
|
|
46
|
+
return parseTaskList(tasksMd).some((item) => item.number === target);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Append the typed `done_manual` lifecycle event. Written directly rather than
|
|
50
|
+
* through the harness layer so `src/core` stays free of cross-tier imports.
|
|
51
|
+
*/
|
|
52
|
+
async function appendDoneManualEvent(folderPath, taskNumber, reason) {
|
|
53
|
+
const eventsDir = path.join(folderPath, '.run', 'events');
|
|
54
|
+
await fs.mkdir(eventsDir, { recursive: true });
|
|
55
|
+
const eventPath = path.join(eventsDir, `${taskNumber}.jsonl`);
|
|
56
|
+
const event = {
|
|
57
|
+
type: 'done_manual',
|
|
58
|
+
timestamp: new Date().toISOString(),
|
|
59
|
+
data: { task: taskNumber, reason },
|
|
60
|
+
};
|
|
61
|
+
await fs.appendFile(eventPath, `${JSON.stringify(event)}\n`, 'utf8');
|
|
62
|
+
return eventPath;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Mark a task done by human decision. Writes `.run/done/<n>` carrying
|
|
66
|
+
* `manual: true` and the justification, appends a `done_manual` event, and ticks
|
|
67
|
+
* the task checkbox in `tasks.md`. This is the sole path for manual completion;
|
|
68
|
+
* archive-time verification still runs the task's `verify` command.
|
|
69
|
+
*/
|
|
70
|
+
export async function markTaskDoneManual(projectRoot, specIdOrPrefix, taskNumber, reason, config) {
|
|
71
|
+
const trimmedReason = reason.trim();
|
|
72
|
+
if (!trimmedReason) {
|
|
73
|
+
throw new Error('a manual completion reason is required');
|
|
74
|
+
}
|
|
75
|
+
const specsDir = getChangesDir(config.paths.openspecRoot, projectRoot);
|
|
76
|
+
const folderPath = await findSpecFolder(specsDir, specIdOrPrefix);
|
|
77
|
+
const folderName = path.basename(folderPath);
|
|
78
|
+
const specId = folderName.match(/^(\d+)/)?.[1] ?? folderName;
|
|
79
|
+
if (!(await taskExists(folderPath, taskNumber))) {
|
|
80
|
+
throw new Error(`Task "${taskNumber}" was not found in ${folderName}`);
|
|
81
|
+
}
|
|
82
|
+
const doneDir = path.join(folderPath, '.run', 'done');
|
|
83
|
+
await fs.mkdir(doneDir, { recursive: true });
|
|
84
|
+
const markerPath = path.join(doneDir, taskNumber);
|
|
85
|
+
const frontmatter = `---\nmanual: true\nreason: ${JSON.stringify(trimmedReason)}\n---\n`;
|
|
86
|
+
await fs.writeFile(markerPath, `${frontmatter}${new Date().toISOString()}\n`, 'utf8');
|
|
87
|
+
const eventPath = await appendDoneManualEvent(folderPath, taskNumber, trimmedReason);
|
|
88
|
+
const tasksMdPath = path.join(folderPath, 'tasks.md');
|
|
89
|
+
const tasksContent = await fs.readFile(tasksMdPath, 'utf8').catch(() => null);
|
|
90
|
+
if (tasksContent !== null) {
|
|
91
|
+
const updated = tickTaskCheckboxContent(tasksContent, taskNumber);
|
|
92
|
+
if (updated !== tasksContent)
|
|
93
|
+
await fs.writeFile(tasksMdPath, updated, 'utf8');
|
|
94
|
+
}
|
|
95
|
+
return { specId, folderName, folderPath, taskNumber, markerPath, eventPath };
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=done.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"done.js","sourceRoot":"","sources":["../../../src/core/lifecycle/done.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { OsqConfig } from '../foundation/config.js';
|
|
2
|
+
/**
|
|
3
|
+
* Explicit rejection transition. An eligible active change is moved intact into
|
|
4
|
+
* `openspec/changes/rejected/<folder>/`; the rejection reason and timestamp are
|
|
5
|
+
* then recorded beside the preserved diagnostics. Eligibility is decided before
|
|
6
|
+
* the single filesystem rename, so a refusal never moves or overwrites anything.
|
|
7
|
+
*/
|
|
8
|
+
export interface RejectResult {
|
|
9
|
+
readonly specId: string;
|
|
10
|
+
readonly folderName: string;
|
|
11
|
+
readonly sourcePath: string;
|
|
12
|
+
readonly destinationPath: string;
|
|
13
|
+
readonly reason: string;
|
|
14
|
+
readonly timestamp: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Move an eligible active change into rejected history.
|
|
18
|
+
*
|
|
19
|
+
* An unapproved active change is eligible. An approved change is eligible only
|
|
20
|
+
* while it has an active failure (a numeric dead or regressed marker, or a
|
|
21
|
+
* change-level regression) and no task is running. Healthy approved, complete,
|
|
22
|
+
* running, archived, already rejected, missing, and destination-colliding
|
|
23
|
+
* changes are refused before the first mutation.
|
|
24
|
+
*/
|
|
25
|
+
export declare function rejectSpec(projectRoot: string, specIdOrPrefix: string, reason: string, config: OsqConfig): Promise<RejectResult>;
|
|
26
|
+
//# sourceMappingURL=reject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reject.d.ts","sourceRoot":"","sources":["../../../src/core/lifecycle/reject.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAKzD;;;;;GAKG;AAEH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAyCD;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAC9B,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,YAAY,CAAC,CAqDvB"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { findSpecFolder } from '../spec/approve.js';
|
|
4
|
+
import { getChangeRunDir, getChangesDir, getRejectedDir } from '../status/layout.js';
|
|
5
|
+
import { deriveSpecState, readChangeFolder } from '../status/state.js';
|
|
6
|
+
async function pathExists(target) {
|
|
7
|
+
return fs.stat(target).then(() => true, () => false);
|
|
8
|
+
}
|
|
9
|
+
/** JSON strings are valid YAML double-quoted scalars, so reasons round-trip safely. */
|
|
10
|
+
function yamlString(value) {
|
|
11
|
+
return JSON.stringify(value);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Append the typed `rejected` event directly rather than through the harness
|
|
15
|
+
* layer so `src/core` stays free of cross-tier imports, mirroring `done_manual`.
|
|
16
|
+
*/
|
|
17
|
+
async function appendRejectedEvent(folderPath, reason, timestamp) {
|
|
18
|
+
const eventsDir = path.join(folderPath, '.run', 'events');
|
|
19
|
+
await fs.mkdir(eventsDir, { recursive: true });
|
|
20
|
+
const event = { type: 'rejected', timestamp, data: { reason } };
|
|
21
|
+
await fs.appendFile(path.join(eventsDir, 'change.jsonl'), `${JSON.stringify(event)}\n`, 'utf8');
|
|
22
|
+
}
|
|
23
|
+
/** Write `.run/rejected.md` carrying the same reason and timestamp as the event. */
|
|
24
|
+
async function writeRejectedMarker(folderPath, reason, timestamp) {
|
|
25
|
+
const runDir = getChangeRunDir(folderPath);
|
|
26
|
+
await fs.mkdir(runDir, { recursive: true });
|
|
27
|
+
const content = `---\nreason: ${yamlString(reason)}\ntimestamp: ${yamlString(timestamp)}\n---\n`;
|
|
28
|
+
await fs.writeFile(path.join(runDir, 'rejected.md'), content, 'utf8');
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Move an eligible active change into rejected history.
|
|
32
|
+
*
|
|
33
|
+
* An unapproved active change is eligible. An approved change is eligible only
|
|
34
|
+
* while it has an active failure (a numeric dead or regressed marker, or a
|
|
35
|
+
* change-level regression) and no task is running. Healthy approved, complete,
|
|
36
|
+
* running, archived, already rejected, missing, and destination-colliding
|
|
37
|
+
* changes are refused before the first mutation.
|
|
38
|
+
*/
|
|
39
|
+
export async function rejectSpec(projectRoot, specIdOrPrefix, reason, config) {
|
|
40
|
+
const trimmedReason = reason.trim();
|
|
41
|
+
if (!trimmedReason) {
|
|
42
|
+
throw new Error('a non-empty rejection reason is required');
|
|
43
|
+
}
|
|
44
|
+
// Resolve only beneath the active changes directory. Archived and rejected
|
|
45
|
+
// folders live elsewhere and therefore never match.
|
|
46
|
+
const specsDir = getChangesDir(config.paths.openspecRoot, projectRoot);
|
|
47
|
+
const sourcePath = await findSpecFolder(specsDir, specIdOrPrefix);
|
|
48
|
+
const folderName = path.basename(sourcePath);
|
|
49
|
+
const specId = folderName.match(/^(\d+)/)?.[1] ?? folderName;
|
|
50
|
+
const rejectedDir = getRejectedDir(config.paths.openspecRoot, projectRoot);
|
|
51
|
+
const destinationPath = path.join(rejectedDir, folderName);
|
|
52
|
+
if (await pathExists(destinationPath)) {
|
|
53
|
+
throw new Error(`Cannot reject ${folderName}: destination "${path.relative(projectRoot, destinationPath) || destinationPath}" already exists.`);
|
|
54
|
+
}
|
|
55
|
+
// Read running markers and approval directly so no state-precedence result
|
|
56
|
+
// can hide a live lock, and so a historical suffixed marker never reads as an
|
|
57
|
+
// active failure.
|
|
58
|
+
const snapshot = await readChangeFolder(projectRoot, sourcePath);
|
|
59
|
+
if (snapshot.runningPids.size > 0) {
|
|
60
|
+
throw new Error(`Change ${folderName} has a running task; rejection is refused.`);
|
|
61
|
+
}
|
|
62
|
+
if (snapshot.approvedHash) {
|
|
63
|
+
const state = deriveSpecState(snapshot);
|
|
64
|
+
if (state.status !== 'dead' && state.status !== 'regressed') {
|
|
65
|
+
throw new Error(`Change ${folderName} is approved and healthy; only a failed change may be rejected.`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// One ISO timestamp is shared by the marker and the event.
|
|
69
|
+
const timestamp = new Date().toISOString();
|
|
70
|
+
await fs.mkdir(rejectedDir, { recursive: true });
|
|
71
|
+
await fs.rename(sourcePath, destinationPath);
|
|
72
|
+
await writeRejectedMarker(destinationPath, trimmedReason, timestamp);
|
|
73
|
+
await appendRejectedEvent(destinationPath, trimmedReason, timestamp);
|
|
74
|
+
return {
|
|
75
|
+
specId,
|
|
76
|
+
folderName,
|
|
77
|
+
sourcePath,
|
|
78
|
+
destinationPath,
|
|
79
|
+
reason: trimmedReason,
|
|
80
|
+
timestamp,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=reject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reject.js","sourceRoot":"","sources":["../../../src/core/lifecycle/reject.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface RetainFailureMarkersOptions {
|
|
2
|
+
readonly runDir: string;
|
|
3
|
+
readonly folderPath: string;
|
|
4
|
+
readonly target: string;
|
|
5
|
+
/** Shared next ordinal across retained dead and regressed failures. */
|
|
6
|
+
readonly ordinal: number;
|
|
7
|
+
readonly hasDead: boolean;
|
|
8
|
+
readonly hasRegressed: boolean;
|
|
9
|
+
/** Retire an active done marker alongside a retained regression. */
|
|
10
|
+
readonly retainDone: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Rename active dead, regressed, and optionally done markers into their
|
|
14
|
+
* attempt-suffixed history. Returns the retained paths relative to the change
|
|
15
|
+
* folder in the established order: regressed, dead, then done.
|
|
16
|
+
*/
|
|
17
|
+
export declare function retainFailureMarkers(options: RetainFailureMarkersOptions): Promise<string[]>;
|
|
18
|
+
/** Append one timestamped target-scoped lifecycle event. */
|
|
19
|
+
export declare function appendTargetEvent(folderPath: string, target: string, event: {
|
|
20
|
+
type: string;
|
|
21
|
+
data: unknown;
|
|
22
|
+
}): Promise<void>;
|
|
23
|
+
//# sourceMappingURL=retry-transition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-transition.d.ts","sourceRoot":"","sources":["../../../src/core/lifecycle/retry-transition.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,uEAAuE;IACvE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,oEAAoE;IACpE,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AASD;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,MAAM,EAAE,CAAC,CAyBnB;AAED,4DAA4D;AAC5D,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GACrC,OAAO,CAAC,IAAI,CAAC,CAKf"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
async function pathExists(target) {
|
|
4
|
+
return fs.stat(target).then(() => true, () => false);
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Rename active dead, regressed, and optionally done markers into their
|
|
8
|
+
* attempt-suffixed history. Returns the retained paths relative to the change
|
|
9
|
+
* folder in the established order: regressed, dead, then done.
|
|
10
|
+
*/
|
|
11
|
+
export async function retainFailureMarkers(options) {
|
|
12
|
+
const { runDir, folderPath, target, ordinal, hasDead, hasRegressed, retainDone } = options;
|
|
13
|
+
const deadDir = path.join(runDir, 'dead');
|
|
14
|
+
const regressedDir = path.join(runDir, 'regressed');
|
|
15
|
+
const retained = [];
|
|
16
|
+
const retain = async (from, to) => {
|
|
17
|
+
await fs.rename(from, to);
|
|
18
|
+
retained.push(path.relative(folderPath, to));
|
|
19
|
+
};
|
|
20
|
+
if (hasRegressed) {
|
|
21
|
+
await retain(path.join(regressedDir, `${target}.md`), path.join(regressedDir, `${target}.${ordinal}.md`));
|
|
22
|
+
}
|
|
23
|
+
if (hasDead) {
|
|
24
|
+
await retain(path.join(deadDir, `${target}.md`), path.join(deadDir, `${target}.${ordinal}.md`));
|
|
25
|
+
}
|
|
26
|
+
if (retainDone) {
|
|
27
|
+
const donePath = path.join(runDir, 'done', target);
|
|
28
|
+
if (await pathExists(donePath)) {
|
|
29
|
+
await retain(donePath, path.join(runDir, 'done', `${target}.${ordinal}`));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return retained;
|
|
33
|
+
}
|
|
34
|
+
/** Append one timestamped target-scoped lifecycle event. */
|
|
35
|
+
export async function appendTargetEvent(folderPath, target, event) {
|
|
36
|
+
const eventsDir = path.join(folderPath, '.run', 'events');
|
|
37
|
+
await fs.mkdir(eventsDir, { recursive: true });
|
|
38
|
+
const line = JSON.stringify({ ...event, timestamp: new Date().toISOString() });
|
|
39
|
+
await fs.appendFile(path.join(eventsDir, `${target}.jsonl`), `${line}\n`, 'utf8');
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=retry-transition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-transition.js","sourceRoot":"","sources":["../../../src/core/lifecycle/retry-transition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAkB7B,KAAK,UAAU,UAAU,CAAC,MAAc;IACtC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CACzB,GAAG,EAAE,CAAC,IAAI,EACV,GAAG,EAAE,CAAC,KAAK,CACZ,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAoC;IAEpC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAC3F,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,KAAK,EAAE,IAAY,EAAE,EAAU,EAAiB,EAAE;QAC/D,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC1B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC;IACF,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,MAAM,CACV,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,MAAM,KAAK,CAAC,EACvC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,MAAM,IAAI,OAAO,KAAK,CAAC,CACnD,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,MAAM,KAAK,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,MAAM,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC;IAClG,CAAC;IACD,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACnD,IAAI,MAAM,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,MAAM,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,4DAA4D;AAC5D,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,UAAkB,EAClB,MAAc,EACd,KAAsC;IAEtC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC1D,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC/E,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,MAAM,QAAQ,CAAC,EAAE,GAAG,IAAI,IAAI,EAAE,MAAM,CAAC,CAAC;AACpF,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { OsqConfig } from '../foundation/config.js';
|
|
2
|
+
export interface RetryResult {
|
|
3
|
+
readonly specId: string;
|
|
4
|
+
readonly folderName: string;
|
|
5
|
+
readonly folderPath: string;
|
|
6
|
+
readonly target: string;
|
|
7
|
+
readonly reason: string;
|
|
8
|
+
/** Following execution attempt; the next started event carries this number. */
|
|
9
|
+
readonly attempt: number;
|
|
10
|
+
readonly retainedMarkers: string[];
|
|
11
|
+
readonly recertification?: 'passed' | 'requeued';
|
|
12
|
+
}
|
|
13
|
+
export interface RetryOptions {
|
|
14
|
+
/** True when the watcher, rather than a human, requested this retry. */
|
|
15
|
+
readonly automatic?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare function retrySpec(projectRoot: string, specIdOrPrefix: string, target: string, config: OsqConfig, options?: RetryOptions): Promise<RetryResult>;
|
|
18
|
+
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../../src/core/lifecycle/retry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAsBzD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,eAAe,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;CAClD;AAED,MAAM,WAAW,YAAY;IAC3B,wEAAwE;IACxE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B;AAkCD,wBAAsB,SAAS,CAC7B,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,EACjB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CAqKtB"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import YAML from 'yaml';
|
|
4
|
+
import { computeTaskScopeHash, readDoneMarker, } from '../run/scope-hash.js';
|
|
5
|
+
import { SCOPE_RESOLVER_VERSION } from '../run/scope.js';
|
|
6
|
+
import { runVerificationCommand } from '../run/verification.js';
|
|
7
|
+
import { findSpecFolder } from '../spec/approve.js';
|
|
8
|
+
import { hashChangeFolder } from '../spec/hasher.js';
|
|
9
|
+
import { parseFrontmatter, parseTaskMd } from '../spec/parser.js';
|
|
10
|
+
import { getChangeRunDir, getChangesDir } from '../status/layout.js';
|
|
11
|
+
import { appendTargetEvent, retainFailureMarkers } from './retry-transition.js';
|
|
12
|
+
// Retry renames active failure markers into attempt-suffixed history; a numeric
|
|
13
|
+
// scope regression with an automated done marker is recertified by re-running
|
|
14
|
+
// its verify without an agent.
|
|
15
|
+
const CHANGE_TARGET = 'change';
|
|
16
|
+
const NUMERIC_TARGET = /^\d+$/;
|
|
17
|
+
const SCOPE_REGRESSION = 'scope_regression';
|
|
18
|
+
async function pathExists(target) {
|
|
19
|
+
return fs.stat(target).then(() => true, () => false);
|
|
20
|
+
}
|
|
21
|
+
async function listDir(dir) {
|
|
22
|
+
return fs.readdir(dir).catch(() => []);
|
|
23
|
+
}
|
|
24
|
+
function retainedOrdinal(entries, target) {
|
|
25
|
+
const escaped = target.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
26
|
+
const pattern = new RegExp(`^${escaped}\\.(\\d+)\\.md$`);
|
|
27
|
+
let highest = 0;
|
|
28
|
+
for (const entry of entries) {
|
|
29
|
+
const match = entry.match(pattern);
|
|
30
|
+
if (!match)
|
|
31
|
+
continue;
|
|
32
|
+
const ordinal = Number.parseInt(match[1], 10);
|
|
33
|
+
if (ordinal > highest)
|
|
34
|
+
highest = ordinal;
|
|
35
|
+
}
|
|
36
|
+
return highest;
|
|
37
|
+
}
|
|
38
|
+
function markerReason(content, fallback) {
|
|
39
|
+
const { data } = parseFrontmatter(content);
|
|
40
|
+
const reason = typeof data.reason === 'string' ? data.reason.trim() : '';
|
|
41
|
+
return reason || fallback;
|
|
42
|
+
}
|
|
43
|
+
// Validate approval, running state, and active failure before verification or
|
|
44
|
+
// mutation, then either recertify a scope regression or preserve the failure.
|
|
45
|
+
export async function retrySpec(projectRoot, specIdOrPrefix, target, config, options = {}) {
|
|
46
|
+
const rawTarget = target.trim();
|
|
47
|
+
if (rawTarget !== CHANGE_TARGET && !NUMERIC_TARGET.test(rawTarget)) {
|
|
48
|
+
throw new Error(`Invalid retry target "${target}": expected a numeric task or "change".`);
|
|
49
|
+
}
|
|
50
|
+
const specsDir = getChangesDir(config.paths.openspecRoot, projectRoot);
|
|
51
|
+
const folderPath = await findSpecFolder(specsDir, specIdOrPrefix);
|
|
52
|
+
const folderName = path.basename(folderPath);
|
|
53
|
+
const specId = folderName.match(/^(\d+)/)?.[1] ?? folderName;
|
|
54
|
+
const runDir = getChangeRunDir(folderPath);
|
|
55
|
+
// Approval integrity is checked before any marker or event is touched.
|
|
56
|
+
const approvedHash = await fs
|
|
57
|
+
.readFile(path.join(runDir, 'approved'), 'utf8')
|
|
58
|
+
.then((value) => value.trim())
|
|
59
|
+
.catch(() => '');
|
|
60
|
+
if (!approvedHash) {
|
|
61
|
+
throw new Error(`Change ${specId} is not approved. Run \`osq approve ${specId}\` before retrying.`);
|
|
62
|
+
}
|
|
63
|
+
if ((await hashChangeFolder(folderPath)) !== approvedHash) {
|
|
64
|
+
throw new Error(`Change ${specId} no longer matches its approved hash. Run \`osq approve ${specId}\` before retrying.`);
|
|
65
|
+
}
|
|
66
|
+
// A running target is never retried; never mutate under a live lock.
|
|
67
|
+
const runningDir = path.join(runDir, 'running');
|
|
68
|
+
if (rawTarget === CHANGE_TARGET) {
|
|
69
|
+
const running = (await listDir(runningDir)).filter((entry) => entry.endsWith('.pid'));
|
|
70
|
+
if (running.length > 0) {
|
|
71
|
+
throw new Error(`Change ${specId} has a running task; retry is refused.`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else if (await pathExists(path.join(runningDir, `${rawTarget}.pid`))) {
|
|
75
|
+
throw new Error(`Task ${rawTarget} is running; retry is refused.`);
|
|
76
|
+
}
|
|
77
|
+
const deadDir = path.join(runDir, 'dead');
|
|
78
|
+
const regressedDir = path.join(runDir, 'regressed');
|
|
79
|
+
const deadEntries = await listDir(deadDir);
|
|
80
|
+
const regressedEntries = await listDir(regressedDir);
|
|
81
|
+
const deadPath = path.join(deadDir, `${rawTarget}.md`);
|
|
82
|
+
const regressedPath = path.join(regressedDir, `${rawTarget}.md`);
|
|
83
|
+
// Only a task can be dead; the change target accepts a change-level regression.
|
|
84
|
+
const hasDead = rawTarget !== CHANGE_TARGET && (await pathExists(deadPath));
|
|
85
|
+
const hasRegressed = await pathExists(regressedPath);
|
|
86
|
+
if (!hasDead && !hasRegressed) {
|
|
87
|
+
const label = rawTarget === CHANGE_TARGET ? 'change-level regression' : `task ${rawTarget}`;
|
|
88
|
+
throw new Error(`No active failure marker for ${label} in ${folderName}; retry is refused.`);
|
|
89
|
+
}
|
|
90
|
+
// Regression takes state precedence over dead for retry context.
|
|
91
|
+
const reason = hasRegressed
|
|
92
|
+
? markerReason(await fs.readFile(regressedPath, 'utf8'), 'regressed')
|
|
93
|
+
: markerReason(await fs.readFile(deadPath, 'utf8'), 'dead');
|
|
94
|
+
const ordinal = Math.max(retainedOrdinal(deadEntries, rawTarget), retainedOrdinal(regressedEntries, rawTarget)) + 1;
|
|
95
|
+
// A scope regression with an automated done marker is recertified from core
|
|
96
|
+
// rather than handing the trusted completion back to an agent.
|
|
97
|
+
const done = rawTarget !== CHANGE_TARGET && hasRegressed && !hasDead && reason === SCOPE_REGRESSION
|
|
98
|
+
? await readDoneMarker(runDir, rawTarget)
|
|
99
|
+
: null;
|
|
100
|
+
let recertification;
|
|
101
|
+
let recertificationEvent;
|
|
102
|
+
if (done) {
|
|
103
|
+
const taskData = parseTaskMd(await fs.readFile(path.join(folderPath, 'tasks', `${rawTarget}.md`), 'utf8'));
|
|
104
|
+
const marker = parseFrontmatter(await fs.readFile(regressedPath, 'utf8'));
|
|
105
|
+
const attribution = Array.isArray(marker.data.attribution)
|
|
106
|
+
? marker.data.attribution
|
|
107
|
+
: [];
|
|
108
|
+
const differingPaths = marker.body
|
|
109
|
+
.split('\n\n')[0]
|
|
110
|
+
.split('\n')
|
|
111
|
+
.filter((line) => line.startsWith('- '))
|
|
112
|
+
.map((line) => line.slice(2).trim());
|
|
113
|
+
const gate = await runVerificationCommand(projectRoot, taskData.verify, config.timeouts.verifyTimeoutSeconds);
|
|
114
|
+
const current = await computeTaskScopeHash(projectRoot, taskData.scope);
|
|
115
|
+
recertification = gate.exitCode === 0 && !gate.error ? 'passed' : 'requeued';
|
|
116
|
+
recertificationEvent = {
|
|
117
|
+
task: rawTarget,
|
|
118
|
+
outcome: recertification,
|
|
119
|
+
differingPaths,
|
|
120
|
+
attribution,
|
|
121
|
+
command: taskData.verify,
|
|
122
|
+
exitCode: gate.exitCode,
|
|
123
|
+
output: gate.output,
|
|
124
|
+
timedOut: gate.timedOut,
|
|
125
|
+
recordedHash: done.scopeHash,
|
|
126
|
+
currentHash: current.hash,
|
|
127
|
+
...(recertification === 'passed' ? {} : { attempt: ordinal + 1, reason: SCOPE_REGRESSION }),
|
|
128
|
+
};
|
|
129
|
+
if (recertification === 'passed') {
|
|
130
|
+
const { data, body } = parseFrontmatter(await fs.readFile(path.join(runDir, 'done', rawTarget), 'utf8'));
|
|
131
|
+
const merged = { ...data };
|
|
132
|
+
if (typeof merged.original_scope_hash !== 'string' || !merged.original_scope_hash) {
|
|
133
|
+
merged.original_scope_hash = done.scopeHash;
|
|
134
|
+
}
|
|
135
|
+
merged.scope_hash = current.hash;
|
|
136
|
+
merged.scope_files = current.fileHashes;
|
|
137
|
+
merged.scope_resolver = SCOPE_RESOLVER_VERSION;
|
|
138
|
+
merged.recertified_at = new Date().toISOString();
|
|
139
|
+
const count = data.recertification_count;
|
|
140
|
+
merged.recertification_count =
|
|
141
|
+
(typeof count === 'number' && Number.isInteger(count) && count > 0 ? count : 0) + 1;
|
|
142
|
+
await fs.writeFile(path.join(runDir, 'done', rawTarget), `---\n${YAML.stringify(merged)}---\n${body}`, 'utf8');
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
const retainedMarkers = await retainFailureMarkers({
|
|
146
|
+
runDir,
|
|
147
|
+
folderPath,
|
|
148
|
+
target: rawTarget,
|
|
149
|
+
ordinal,
|
|
150
|
+
hasDead,
|
|
151
|
+
hasRegressed,
|
|
152
|
+
// A regressed completion is retained unless a pass recertified it in place.
|
|
153
|
+
retainDone: hasRegressed && rawTarget !== CHANGE_TARGET && recertification !== 'passed',
|
|
154
|
+
});
|
|
155
|
+
const attempt = recertification === 'passed' ? ordinal : ordinal + 1;
|
|
156
|
+
const retryData = {
|
|
157
|
+
target: rawTarget,
|
|
158
|
+
reason,
|
|
159
|
+
attempt,
|
|
160
|
+
};
|
|
161
|
+
// Only the watcher's automatic retry carries the marker; a human retry
|
|
162
|
+
// leaves the event without the key, and recertification never carries it.
|
|
163
|
+
if (options.automatic)
|
|
164
|
+
retryData.automatic = true;
|
|
165
|
+
await appendTargetEvent(folderPath, rawTarget, recertificationEvent
|
|
166
|
+
? { type: 'recertification', data: recertificationEvent }
|
|
167
|
+
: { type: 'retry', data: retryData });
|
|
168
|
+
return {
|
|
169
|
+
specId,
|
|
170
|
+
folderName,
|
|
171
|
+
folderPath,
|
|
172
|
+
target: rawTarget,
|
|
173
|
+
reason,
|
|
174
|
+
attempt,
|
|
175
|
+
retainedMarkers,
|
|
176
|
+
...(recertification ? { recertification } : {}),
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../src/core/lifecycle/retry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** The key used for changes whose recorded flag ids are empty. */
|
|
2
|
+
export declare const NO_APPROVAL_FLAGS = "none";
|
|
3
|
+
/** Every reported key, never recomputed: the flag ids then `none`. */
|
|
4
|
+
export declare const APPROVAL_FLAG_KEYS: readonly string[];
|
|
5
|
+
/** Fired and later-troubled counts for one handling mode. */
|
|
6
|
+
export interface ApprovalFlagModeOutcome {
|
|
7
|
+
readonly fired: number;
|
|
8
|
+
readonly troubled: number;
|
|
9
|
+
}
|
|
10
|
+
/** Shown and confirmed outcomes for one reported key. */
|
|
11
|
+
export interface ApprovalFlagOutcome {
|
|
12
|
+
readonly shown: ApprovalFlagModeOutcome;
|
|
13
|
+
readonly confirmed: ApprovalFlagModeOutcome;
|
|
14
|
+
}
|
|
15
|
+
/** Per-key outcomes plus the number of changes that recorded flags. */
|
|
16
|
+
export interface ApprovalFlagOutcomes {
|
|
17
|
+
readonly changes: number;
|
|
18
|
+
readonly byFlag: Record<string, ApprovalFlagOutcome>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Reads recorded `approvalFlags` from every given change folder's manifest and
|
|
22
|
+
* counts, per key and mode, how many changes fired it and how many later had
|
|
23
|
+
* trouble. Folders without a valid recorded field contribute nothing; flags
|
|
24
|
+
* are never recomputed from the authored change.
|
|
25
|
+
*/
|
|
26
|
+
export declare function collectApprovalFlagOutcomes(folders: readonly string[]): Promise<ApprovalFlagOutcomes>;
|
|
27
|
+
/** Render the `Approval flags:` body, one line per key in fixed order. */
|
|
28
|
+
export declare function formatApprovalFlagOutcomes(outcomes: ApprovalFlagOutcomes): string[];
|
|
29
|
+
//# sourceMappingURL=approval-flags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-flags.d.ts","sourceRoot":"","sources":["../../../src/core/report/approval-flags.ts"],"names":[],"mappings":"AAeA,kEAAkE;AAClE,eAAO,MAAM,iBAAiB,SAAS,CAAC;AAExC,sEAAsE;AACtE,eAAO,MAAM,kBAAkB,EAAE,SAAS,MAAM,EAAqC,CAAC;AAEtF,6DAA6D;AAC7D,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,yDAAyD;AACzD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,EAAE,uBAAuB,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,uBAAuB,CAAC;CAC7C;AAED,uEAAuE;AACvE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;CACtD;AAyFD;;;;;GAKG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,OAAO,CAAC,oBAAoB,CAAC,CAyB/B;AAED,0EAA0E;AAC1E,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,EAAE,CAWnF"}
|