@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,33 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
/**
|
|
6
|
+
* Per-project last-look cursor location and reading. Both the CLI and the
|
|
7
|
+
* read-only web transport consume these helpers; only the CLI advances the
|
|
8
|
+
* cursor.
|
|
9
|
+
*/
|
|
10
|
+
/** Per-project cursor path: `~/.osq/last-look/<sha256(realpath(root))>.json`. */
|
|
11
|
+
export async function resolveLastLookPath(projectRoot, home = os.homedir()) {
|
|
12
|
+
const real = await fs.realpath(projectRoot).catch(() => path.resolve(projectRoot));
|
|
13
|
+
const hash = createHash('sha256').update(real, 'utf8').digest('hex');
|
|
14
|
+
return path.join(home, '.osq', 'last-look', `${hash}.json`);
|
|
15
|
+
}
|
|
16
|
+
/** Read the cursor as epoch milliseconds; missing, malformed, or invalid => null. */
|
|
17
|
+
export async function readLastLook(projectRoot, home = os.homedir()) {
|
|
18
|
+
const cursorPath = await resolveLastLookPath(projectRoot, home);
|
|
19
|
+
const content = await fs.readFile(cursorPath, 'utf8').catch(() => null);
|
|
20
|
+
if (content === null)
|
|
21
|
+
return null;
|
|
22
|
+
try {
|
|
23
|
+
const parsed = JSON.parse(content);
|
|
24
|
+
if (typeof parsed.lastLook !== 'string')
|
|
25
|
+
return null;
|
|
26
|
+
const ms = Date.parse(parsed.lastLook);
|
|
27
|
+
return Number.isFinite(ms) ? ms : null;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=inbox-cursor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbox-cursor.js","sourceRoot":"","sources":["../../../src/core/status/inbox-cursor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;GAIG;AAEH,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,WAAmB,EACnB,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE;IAEnB,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IACnF,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;AAC9D,CAAC;AAED,qFAAqF;AACrF,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,WAAmB,EACnB,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE;IAEnB,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACxE,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA2B,CAAC;QAC7D,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACrD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvC,OAAO,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type OsqConfig } from '../foundation/config.js';
|
|
2
|
+
import { type Inbox } from './inbox.js';
|
|
3
|
+
/** Injectable clock, config, and home root for the read-only projection. */
|
|
4
|
+
export interface ReadInboxOptions {
|
|
5
|
+
readonly config?: OsqConfig;
|
|
6
|
+
readonly now?: Date;
|
|
7
|
+
readonly home?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Derives the stable inbox object without mutating any file. Both the CLI and
|
|
11
|
+
* the read-only HTTP transport consume it, so a contemporaneous invocation and
|
|
12
|
+
* request observe the same groups while only the CLI advances the cursor.
|
|
13
|
+
*/
|
|
14
|
+
export declare function readInbox(projectRoot: string, options?: ReadInboxOptions): Promise<Inbox>;
|
|
15
|
+
//# sourceMappingURL=inbox-projection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbox-projection.d.ts","sourceRoot":"","sources":["../../../src/core/status/inbox-projection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzE,OAAO,EAAE,KAAK,KAAK,EAAoC,MAAM,YAAY,CAAC;AAI1E,4EAA4E;AAC5E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;IAC5B,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,KAAK,CAAC,CAQhB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { DEFAULT_CONFIG } from '../foundation/config.js';
|
|
2
|
+
import { readLastLook } from './inbox-cursor.js';
|
|
3
|
+
import { collectLandedItems, projectInbox } from './inbox.js';
|
|
4
|
+
import { getArchiveDir } from './layout.js';
|
|
5
|
+
import { getStatusOverview } from './status.js';
|
|
6
|
+
/**
|
|
7
|
+
* Derives the stable inbox object without mutating any file. Both the CLI and
|
|
8
|
+
* the read-only HTTP transport consume it, so a contemporaneous invocation and
|
|
9
|
+
* request observe the same groups while only the CLI advances the cursor.
|
|
10
|
+
*/
|
|
11
|
+
export async function readInbox(projectRoot, options = {}) {
|
|
12
|
+
const config = options.config ?? DEFAULT_CONFIG;
|
|
13
|
+
const now = options.now ?? new Date();
|
|
14
|
+
const overview = await getStatusOverview(projectRoot, config);
|
|
15
|
+
const lastLookMs = await readLastLook(projectRoot, options.home);
|
|
16
|
+
const archiveDir = getArchiveDir(config.paths.openspecRoot, projectRoot);
|
|
17
|
+
const landed = await collectLandedItems(archiveDir, lastLookMs);
|
|
18
|
+
return projectInbox(overview, landed, now.getTime());
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=inbox-projection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbox-projection.js","sourceRoot":"","sources":["../../../src/core/status/inbox-projection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAkB,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAc,kBAAkB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAShD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,WAAmB,EACnB,UAA4B,EAAE;IAE9B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,cAAc,CAAC;IAChD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IACtC,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IACzE,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAChE,OAAO,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbox-text.d.ts","sourceRoot":"","sources":["../../../src/core/status/inbox-text.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAuD,MAAM,YAAY,CAAC;AAuB7F,wDAAwD;AACxD,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAmBpD"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { formatDuration } from '../report/report.js';
|
|
2
|
+
const REJECT_HINT = '--reason <text>';
|
|
3
|
+
function needsYouLine(item) {
|
|
4
|
+
const head = ` ${item.change.id}: ${item.change.title}`;
|
|
5
|
+
if (item.kind === 'approval')
|
|
6
|
+
return `${head} — ${item.command}`;
|
|
7
|
+
if (item.kind === 'change-regressed')
|
|
8
|
+
return `${head} — change regressed — ${item.command}`;
|
|
9
|
+
const task = item.task;
|
|
10
|
+
const row = `${head} — task ${task.number}: ${task.title}`;
|
|
11
|
+
if (!item.stuck)
|
|
12
|
+
return `${row} — ${item.command}`;
|
|
13
|
+
return `${row} — stuck: same failure twice; amend the spec or osq reject ${item.change.id} ${REJECT_HINT} — ${item.command}`;
|
|
14
|
+
}
|
|
15
|
+
function runningLine(item) {
|
|
16
|
+
const duration = formatDuration(item.elapsedSeconds * 1000);
|
|
17
|
+
return ` ${item.change.id}: ${item.change.title} — task ${item.task.number}: ${item.task.title} — ${duration} — ${item.command}`;
|
|
18
|
+
}
|
|
19
|
+
function landedLine(item) {
|
|
20
|
+
return ` ${item.change.id}: ${item.change.title} — archived ${item.archivedAt} — ${item.command}`;
|
|
21
|
+
}
|
|
22
|
+
/** Concise text rendering of the three inbox groups. */
|
|
23
|
+
export function formatInboxText(inbox) {
|
|
24
|
+
const { needsYou, running, landed } = inbox;
|
|
25
|
+
if (needsYou.length === 0 && running.length === 0 && landed.length === 0) {
|
|
26
|
+
return 'Inbox empty.';
|
|
27
|
+
}
|
|
28
|
+
const lines = ['Needs you'];
|
|
29
|
+
if (needsYou.length === 0)
|
|
30
|
+
lines.push(' (none)');
|
|
31
|
+
else
|
|
32
|
+
for (const item of needsYou)
|
|
33
|
+
lines.push(needsYouLine(item));
|
|
34
|
+
lines.push('Running');
|
|
35
|
+
if (running.length === 0)
|
|
36
|
+
lines.push(' (none)');
|
|
37
|
+
else
|
|
38
|
+
for (const item of running)
|
|
39
|
+
lines.push(runningLine(item));
|
|
40
|
+
lines.push('Landed since last look');
|
|
41
|
+
if (landed.length === 0)
|
|
42
|
+
lines.push(' (none)');
|
|
43
|
+
else
|
|
44
|
+
for (const item of landed)
|
|
45
|
+
lines.push(landedLine(item));
|
|
46
|
+
return lines.join('\n');
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=inbox-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbox-text.js","sourceRoot":"","sources":["../../../src/core/status/inbox-text.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { StatusOverview } from './status.js';
|
|
2
|
+
export { formatInboxText } from './inbox-text.js';
|
|
3
|
+
export type NeedsYouKind = 'approval' | 'task-dead' | 'task-regressed' | 'change-regressed';
|
|
4
|
+
export interface InboxChangeRef {
|
|
5
|
+
readonly id: string;
|
|
6
|
+
readonly title: string;
|
|
7
|
+
}
|
|
8
|
+
export interface InboxTaskRef {
|
|
9
|
+
readonly number: string;
|
|
10
|
+
readonly title: string;
|
|
11
|
+
}
|
|
12
|
+
export interface NeedsYouItem {
|
|
13
|
+
readonly kind: NeedsYouKind;
|
|
14
|
+
readonly change: InboxChangeRef;
|
|
15
|
+
readonly task: InboxTaskRef | null;
|
|
16
|
+
readonly command: string;
|
|
17
|
+
readonly stuck?: {
|
|
18
|
+
readonly fingerprint: string;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export interface RunningItem {
|
|
22
|
+
readonly change: InboxChangeRef;
|
|
23
|
+
readonly task: InboxTaskRef;
|
|
24
|
+
readonly pid: number;
|
|
25
|
+
readonly startedAt: string;
|
|
26
|
+
readonly elapsedSeconds: number;
|
|
27
|
+
readonly command: string;
|
|
28
|
+
}
|
|
29
|
+
export interface LandedItem {
|
|
30
|
+
readonly change: InboxChangeRef;
|
|
31
|
+
readonly archivedAt: string;
|
|
32
|
+
readonly command: string;
|
|
33
|
+
}
|
|
34
|
+
export interface Inbox {
|
|
35
|
+
readonly needsYou: NeedsYouItem[];
|
|
36
|
+
readonly running: RunningItem[];
|
|
37
|
+
readonly landed: LandedItem[];
|
|
38
|
+
}
|
|
39
|
+
/** Fallback number of archives surfaced when the per-project cursor is unusable. */
|
|
40
|
+
export declare const LANDED_FALLBACK_LIMIT = 10;
|
|
41
|
+
/** Project active changes into deterministic attention items. */
|
|
42
|
+
export declare function projectNeedsYou(overview: StatusOverview): NeedsYouItem[];
|
|
43
|
+
/** Project derived running tasks whose parsed lock PID is live at `nowMs`. */
|
|
44
|
+
export declare function projectRunning(overview: StatusOverview, nowMs: number): RunningItem[];
|
|
45
|
+
/**
|
|
46
|
+
* Landed changes from authoritative `archived` events. A valid cursor selects
|
|
47
|
+
* only strictly later archives; otherwise the newest {@link LANDED_FALLBACK_LIMIT}
|
|
48
|
+
* are returned. Nothing is inferred from directory metadata.
|
|
49
|
+
*/
|
|
50
|
+
export declare function collectLandedItems(archiveDir: string, lastLookMs: number | null, limit?: number): Promise<LandedItem[]>;
|
|
51
|
+
/** Assemble the three deterministic inbox groups from one status snapshot. */
|
|
52
|
+
export declare function projectInbox(overview: StatusOverview, landed: LandedItem[], nowMs: number): Inbox;
|
|
53
|
+
//# sourceMappingURL=inbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbox.d.ts","sourceRoot":"","sources":["../../../src/core/status/inbox.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,WAAW,GAAG,gBAAgB,GAAG,kBAAkB,CAAC;AAC5F,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AACD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AACD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CACnD;AACD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AACD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AACD,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,QAAQ,EAAE,YAAY,EAAE,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;CAC/B;AACD,oFAAoF;AACpF,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAmBxC,iEAAiE;AACjE,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc,GAAG,YAAY,EAAE,CA+BxE;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE,CAqBrF;AA4CD;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,KAAK,SAAwB,GAC5B,OAAO,CAAC,UAAU,EAAE,CAAC,CAiCvB;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAMjG"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { isPidRunning } from '../run/lock.js';
|
|
4
|
+
import { parseSpecMd, resolveChangeDoc } from '../spec/parser.js';
|
|
5
|
+
import { compareNumericPrefix } from './state.js';
|
|
6
|
+
export { formatInboxText } from './inbox-text.js';
|
|
7
|
+
/** Fallback number of archives surfaced when the per-project cursor is unusable. */
|
|
8
|
+
export const LANDED_FALLBACK_LIMIT = 10;
|
|
9
|
+
const CHANGE_REG_RETRY = '--reason <text>';
|
|
10
|
+
function changeRef(spec) {
|
|
11
|
+
return { id: spec.id, title: spec.title };
|
|
12
|
+
}
|
|
13
|
+
function taskTitle(taskNumber, title, fileName) {
|
|
14
|
+
return title || fileName || taskNumber;
|
|
15
|
+
}
|
|
16
|
+
function changeId(folderName) {
|
|
17
|
+
return folderName.match(/^(\d+)/)?.[1] ?? folderName;
|
|
18
|
+
}
|
|
19
|
+
function showCommand(id) {
|
|
20
|
+
return `osq show ${id}`;
|
|
21
|
+
}
|
|
22
|
+
/** Project active changes into deterministic attention items. */
|
|
23
|
+
export function projectNeedsYou(overview) {
|
|
24
|
+
const items = [];
|
|
25
|
+
for (const spec of overview.specs) {
|
|
26
|
+
const change = changeRef(spec);
|
|
27
|
+
if (spec.approvedHash === null && spec.hasProposal !== false) {
|
|
28
|
+
items.push({ kind: 'approval', change, task: null, command: `osq approve ${spec.id}` });
|
|
29
|
+
}
|
|
30
|
+
if (spec.changeRegressed) {
|
|
31
|
+
items.push({
|
|
32
|
+
kind: 'change-regressed',
|
|
33
|
+
change,
|
|
34
|
+
task: null,
|
|
35
|
+
command: `osq reject ${spec.id} ${CHANGE_REG_RETRY}`,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
for (const task of spec.tasks) {
|
|
39
|
+
if (task.status !== 'dead' && task.status !== 'regressed')
|
|
40
|
+
continue;
|
|
41
|
+
const stuck = task.status === 'dead' && task.stuck ? { fingerprint: task.stuck } : undefined;
|
|
42
|
+
items.push({
|
|
43
|
+
kind: task.status === 'dead' ? 'task-dead' : 'task-regressed',
|
|
44
|
+
change,
|
|
45
|
+
task: {
|
|
46
|
+
number: task.taskNumber,
|
|
47
|
+
title: taskTitle(task.taskNumber, task.title, task.fileName),
|
|
48
|
+
},
|
|
49
|
+
command: `osq retry ${spec.id} ${task.taskNumber}`,
|
|
50
|
+
...(stuck ? { stuck } : {}),
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return items;
|
|
55
|
+
}
|
|
56
|
+
/** Project derived running tasks whose parsed lock PID is live at `nowMs`. */
|
|
57
|
+
export function projectRunning(overview, nowMs) {
|
|
58
|
+
const items = [];
|
|
59
|
+
for (const spec of overview.specs) {
|
|
60
|
+
for (const task of spec.tasks) {
|
|
61
|
+
const lock = task.lock;
|
|
62
|
+
if (task.status !== 'running' || !lock || !isPidRunning(lock.pid))
|
|
63
|
+
continue;
|
|
64
|
+
const elapsed = Math.round((nowMs - lock.startedAt) / 1000);
|
|
65
|
+
items.push({
|
|
66
|
+
change: changeRef(spec),
|
|
67
|
+
task: {
|
|
68
|
+
number: task.taskNumber,
|
|
69
|
+
title: taskTitle(task.taskNumber, task.title, task.fileName),
|
|
70
|
+
},
|
|
71
|
+
pid: lock.pid,
|
|
72
|
+
startedAt: new Date(lock.startedAt).toISOString(),
|
|
73
|
+
elapsedSeconds: Math.max(0, elapsed),
|
|
74
|
+
command: showCommand(spec.id),
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return items;
|
|
79
|
+
}
|
|
80
|
+
function parseEventLines(content) {
|
|
81
|
+
const events = [];
|
|
82
|
+
for (const line of content.split('\n')) {
|
|
83
|
+
const trimmed = line.trim();
|
|
84
|
+
if (!trimmed)
|
|
85
|
+
continue;
|
|
86
|
+
try {
|
|
87
|
+
const parsed = JSON.parse(trimmed);
|
|
88
|
+
if (parsed !== null && typeof parsed === 'object')
|
|
89
|
+
events.push(parsed);
|
|
90
|
+
}
|
|
91
|
+
catch { }
|
|
92
|
+
}
|
|
93
|
+
return events;
|
|
94
|
+
}
|
|
95
|
+
/** Authoritative archive time from the change-level `archived` event, if any. */
|
|
96
|
+
async function readArchivedAt(folderPath) {
|
|
97
|
+
const content = await fs
|
|
98
|
+
.readFile(path.join(folderPath, '.run', 'events', 'change.jsonl'), 'utf8')
|
|
99
|
+
.catch(() => null);
|
|
100
|
+
if (content === null)
|
|
101
|
+
return null;
|
|
102
|
+
let found = null;
|
|
103
|
+
for (const event of parseEventLines(content)) {
|
|
104
|
+
if (event.type !== 'archived' || typeof event.timestamp !== 'string')
|
|
105
|
+
continue;
|
|
106
|
+
if (Number.isFinite(Date.parse(event.timestamp)))
|
|
107
|
+
found = event.timestamp;
|
|
108
|
+
}
|
|
109
|
+
return found;
|
|
110
|
+
}
|
|
111
|
+
/** Archived change title, preferring the OpenSpec change document. */
|
|
112
|
+
async function readArchivedTitle(folderPath, folderName) {
|
|
113
|
+
const resolved = await resolveChangeDoc(folderPath).catch(() => null);
|
|
114
|
+
if (!resolved)
|
|
115
|
+
return folderName;
|
|
116
|
+
const content = await fs.readFile(resolved.path, 'utf8').catch(() => null);
|
|
117
|
+
if (content === null)
|
|
118
|
+
return folderName;
|
|
119
|
+
const title = parseSpecMd(content).title;
|
|
120
|
+
return title || folderName;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Landed changes from authoritative `archived` events. A valid cursor selects
|
|
124
|
+
* only strictly later archives; otherwise the newest {@link LANDED_FALLBACK_LIMIT}
|
|
125
|
+
* are returned. Nothing is inferred from directory metadata.
|
|
126
|
+
*/
|
|
127
|
+
export async function collectLandedItems(archiveDir, lastLookMs, limit = LANDED_FALLBACK_LIMIT) {
|
|
128
|
+
let entries = [];
|
|
129
|
+
try {
|
|
130
|
+
entries = await fs.readdir(archiveDir);
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return [];
|
|
134
|
+
}
|
|
135
|
+
const items = [];
|
|
136
|
+
for (const entry of entries) {
|
|
137
|
+
if (entry.startsWith('.') || entry.startsWith('_'))
|
|
138
|
+
continue;
|
|
139
|
+
const folderPath = path.join(archiveDir, entry);
|
|
140
|
+
const stat = await fs.stat(folderPath).catch(() => null);
|
|
141
|
+
if (!stat?.isDirectory())
|
|
142
|
+
continue;
|
|
143
|
+
const archivedAt = await readArchivedAt(folderPath);
|
|
144
|
+
if (archivedAt === null)
|
|
145
|
+
continue;
|
|
146
|
+
if (lastLookMs !== null && Date.parse(archivedAt) <= lastLookMs)
|
|
147
|
+
continue;
|
|
148
|
+
const id = changeId(entry);
|
|
149
|
+
items.push({
|
|
150
|
+
change: { id, title: await readArchivedTitle(folderPath, entry) },
|
|
151
|
+
archivedAt,
|
|
152
|
+
command: showCommand(id),
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
items.sort((a, b) => Date.parse(b.archivedAt) - Date.parse(a.archivedAt) ||
|
|
156
|
+
compareNumericPrefix(a.change.id, b.change.id));
|
|
157
|
+
return lastLookMs === null ? items.slice(0, limit) : items;
|
|
158
|
+
}
|
|
159
|
+
/** Assemble the three deterministic inbox groups from one status snapshot. */
|
|
160
|
+
export function projectInbox(overview, landed, nowMs) {
|
|
161
|
+
return {
|
|
162
|
+
needsYou: projectNeedsYou(overview),
|
|
163
|
+
running: projectRunning(overview, nowMs),
|
|
164
|
+
landed,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=inbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../../src/core/status/inbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** `<openspecRoot>/changes`, optionally anchored to a project root. */
|
|
2
|
+
export declare function getChangesDir(openspecRoot: string, projectRoot?: string): string;
|
|
3
|
+
/** `<openspecRoot>/changes/archive`, optionally anchored to a project root. */
|
|
4
|
+
export declare function getArchiveDir(openspecRoot: string, projectRoot?: string): string;
|
|
5
|
+
/** `<openspecRoot>/changes/rejected`, optionally anchored to a project root. */
|
|
6
|
+
export declare function getRejectedDir(openspecRoot: string, projectRoot?: string): string;
|
|
7
|
+
/** `<openspecRoot>/specs`, optionally anchored to a project root. */
|
|
8
|
+
export declare function getSpecsDir(openspecRoot: string, projectRoot?: string): string;
|
|
9
|
+
/** `<changeFolder>/.run`. */
|
|
10
|
+
export declare function getChangeRunDir(changeFolder: string): string;
|
|
11
|
+
/** `<changeFolder>/tasks`. */
|
|
12
|
+
export declare function getChangeTasksDir(changeFolder: string): string;
|
|
13
|
+
/** `<changeFolder>/.run/approved`. */
|
|
14
|
+
export declare function getApprovedMarkerPath(changeFolder: string): string;
|
|
15
|
+
/** `<changeFolder>/.run/done/<task>`. */
|
|
16
|
+
export declare function getDoneMarkerPath(changeFolder: string, task: string): string;
|
|
17
|
+
/** `<changeFolder>/.run/running/<task>.pid`. */
|
|
18
|
+
export declare function getRunningPidPath(changeFolder: string, task: string): string;
|
|
19
|
+
/** `<changeFolder>/.run/results/<task>.md`. */
|
|
20
|
+
export declare function getResultPath(changeFolder: string, task: string): string;
|
|
21
|
+
/** `<changeFolder>/.run/dead/<task>.md`. */
|
|
22
|
+
export declare function getDeadMarkerPath(changeFolder: string, task: string): string;
|
|
23
|
+
/** `<changeFolder>/.run/regressed/<target>.md`. */
|
|
24
|
+
export declare function getRegressedMarkerPath(changeFolder: string, target: string): string;
|
|
25
|
+
/** `<changeFolder>/.run/events/<task>.jsonl`. */
|
|
26
|
+
export declare function getEventsPath(changeFolder: string, task: string): string;
|
|
27
|
+
/** `<changeFolder>/.run/rejected.md`. */
|
|
28
|
+
export declare function getRejectedMarkerPath(changeFolder: string): string;
|
|
29
|
+
//# sourceMappingURL=layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/core/status/layout.ts"],"names":[],"mappings":"AAuBA,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,SAAK,GAAG,MAAM,CAE5E;AAED,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,SAAK,GAAG,MAAM,CAE5E;AAED,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,SAAK,GAAG,MAAM,CAE7E;AAED,qEAAqE;AACrE,wBAAgB,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,SAAK,GAAG,MAAM,CAE1E;AAED,6BAA6B;AAC7B,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,8BAA8B;AAC9B,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,sCAAsC;AACtC,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,yCAAyC;AACzC,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED,gDAAgD;AAChD,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED,+CAA+C;AAC/C,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAExE;AAED,4CAA4C;AAC5C,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED,mDAAmD;AACnD,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEnF;AAED,iDAAiD;AACjD,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAExE;AAED,yCAAyC;AACzC,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAElE"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
/**
|
|
3
|
+
* Canonical OpenSpec path layout.
|
|
4
|
+
*
|
|
5
|
+
* Change folders and `.run/` artifacts derive from a single configurable
|
|
6
|
+
* `openspecRoot`; no independent specs or archive overrides exist.
|
|
7
|
+
*/
|
|
8
|
+
const RUN_DIR = '.run';
|
|
9
|
+
const CHANGES_DIR = 'changes';
|
|
10
|
+
const ARCHIVE_DIR = 'archive';
|
|
11
|
+
const REJECTED_DIR = 'rejected';
|
|
12
|
+
const SPECS_DIR = 'specs';
|
|
13
|
+
const TASKS_DIR = 'tasks';
|
|
14
|
+
const DONE_DIR = 'done';
|
|
15
|
+
const DEAD_DIR = 'dead';
|
|
16
|
+
const REGRESSED_DIR = 'regressed';
|
|
17
|
+
const EVENTS_DIR = 'events';
|
|
18
|
+
const RUNNING_DIR = 'running';
|
|
19
|
+
const RESULTS_DIR = 'results';
|
|
20
|
+
const APPROVED_MARKER = 'approved';
|
|
21
|
+
/** `<openspecRoot>/changes`, optionally anchored to a project root. */
|
|
22
|
+
export function getChangesDir(openspecRoot, projectRoot = '') {
|
|
23
|
+
return path.join(projectRoot, openspecRoot, CHANGES_DIR);
|
|
24
|
+
}
|
|
25
|
+
/** `<openspecRoot>/changes/archive`, optionally anchored to a project root. */
|
|
26
|
+
export function getArchiveDir(openspecRoot, projectRoot = '') {
|
|
27
|
+
return path.join(projectRoot, openspecRoot, CHANGES_DIR, ARCHIVE_DIR);
|
|
28
|
+
}
|
|
29
|
+
/** `<openspecRoot>/changes/rejected`, optionally anchored to a project root. */
|
|
30
|
+
export function getRejectedDir(openspecRoot, projectRoot = '') {
|
|
31
|
+
return path.join(projectRoot, openspecRoot, CHANGES_DIR, REJECTED_DIR);
|
|
32
|
+
}
|
|
33
|
+
/** `<openspecRoot>/specs`, optionally anchored to a project root. */
|
|
34
|
+
export function getSpecsDir(openspecRoot, projectRoot = '') {
|
|
35
|
+
return path.join(projectRoot, openspecRoot, SPECS_DIR);
|
|
36
|
+
}
|
|
37
|
+
/** `<changeFolder>/.run`. */
|
|
38
|
+
export function getChangeRunDir(changeFolder) {
|
|
39
|
+
return path.join(changeFolder, RUN_DIR);
|
|
40
|
+
}
|
|
41
|
+
/** `<changeFolder>/tasks`. */
|
|
42
|
+
export function getChangeTasksDir(changeFolder) {
|
|
43
|
+
return path.join(changeFolder, TASKS_DIR);
|
|
44
|
+
}
|
|
45
|
+
/** `<changeFolder>/.run/approved`. */
|
|
46
|
+
export function getApprovedMarkerPath(changeFolder) {
|
|
47
|
+
return path.join(changeFolder, RUN_DIR, APPROVED_MARKER);
|
|
48
|
+
}
|
|
49
|
+
/** `<changeFolder>/.run/done/<task>`. */
|
|
50
|
+
export function getDoneMarkerPath(changeFolder, task) {
|
|
51
|
+
return path.join(changeFolder, RUN_DIR, DONE_DIR, task);
|
|
52
|
+
}
|
|
53
|
+
/** `<changeFolder>/.run/running/<task>.pid`. */
|
|
54
|
+
export function getRunningPidPath(changeFolder, task) {
|
|
55
|
+
return path.join(changeFolder, RUN_DIR, RUNNING_DIR, `${task}.pid`);
|
|
56
|
+
}
|
|
57
|
+
/** `<changeFolder>/.run/results/<task>.md`. */
|
|
58
|
+
export function getResultPath(changeFolder, task) {
|
|
59
|
+
return path.join(changeFolder, RUN_DIR, RESULTS_DIR, `${task}.md`);
|
|
60
|
+
}
|
|
61
|
+
/** `<changeFolder>/.run/dead/<task>.md`. */
|
|
62
|
+
export function getDeadMarkerPath(changeFolder, task) {
|
|
63
|
+
return path.join(changeFolder, RUN_DIR, DEAD_DIR, `${task}.md`);
|
|
64
|
+
}
|
|
65
|
+
/** `<changeFolder>/.run/regressed/<target>.md`. */
|
|
66
|
+
export function getRegressedMarkerPath(changeFolder, target) {
|
|
67
|
+
return path.join(changeFolder, RUN_DIR, REGRESSED_DIR, `${target}.md`);
|
|
68
|
+
}
|
|
69
|
+
/** `<changeFolder>/.run/events/<task>.jsonl`. */
|
|
70
|
+
export function getEventsPath(changeFolder, task) {
|
|
71
|
+
return path.join(changeFolder, RUN_DIR, EVENTS_DIR, `${task}.jsonl`);
|
|
72
|
+
}
|
|
73
|
+
/** `<changeFolder>/.run/rejected.md`. */
|
|
74
|
+
export function getRejectedMarkerPath(changeFolder) {
|
|
75
|
+
return path.join(changeFolder, RUN_DIR, 'rejected.md');
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../src/core/status/layout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type OsqConfig } from '../foundation/config.js';
|
|
2
|
+
export interface QueueItem {
|
|
3
|
+
readonly slug: string;
|
|
4
|
+
readonly title: string;
|
|
5
|
+
readonly dependsOn: readonly string[];
|
|
6
|
+
readonly body: string;
|
|
7
|
+
readonly hash: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function getQueuePath(projectRoot: string, config?: OsqConfig): string;
|
|
10
|
+
export declare function parseQueue(content: string, queuePath?: string): QueueItem[];
|
|
11
|
+
/** Read and parse `<openspecRoot>/queue.md`; throws when it is missing. */
|
|
12
|
+
export declare function readQueue(projectRoot: string, config?: OsqConfig): Promise<QueueItem[]>;
|
|
13
|
+
//# sourceMappingURL=queue-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue-parser.d.ts","sourceRoot":"","sources":["../../../src/core/status/queue-parser.ts"],"names":[],"mappings":"AAGA,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzE,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAOD,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,GAAE,SAA0B,GAAG,MAAM,CAE5F;AAiDD,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,SAAsB,GAAG,SAAS,EAAE,CAYxF;AAED,2EAA2E;AAC3E,wBAAsB,SAAS,CAC7B,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,SAA0B,GACjC,OAAO,CAAC,SAAS,EAAE,CAAC,CAKtB"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { DEFAULT_CONFIG } from '../foundation/config.js';
|
|
5
|
+
const SLUG_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
6
|
+
const HEADING_RE = /^##[ \t]+\[([^\]\r\n]+)\][ \t]+(\S.*?)[ \t\r]*$/;
|
|
7
|
+
const ITEM_LIKE_RE = /^##[ \t]*\[.*$/gm;
|
|
8
|
+
const DEP_LINE_RE = /^Depends on:[ \t]*(.*?)[ \t\r]*$/;
|
|
9
|
+
export function getQueuePath(projectRoot, config = DEFAULT_CONFIG) {
|
|
10
|
+
return path.join(projectRoot, config.paths.openspecRoot, 'queue.md');
|
|
11
|
+
}
|
|
12
|
+
function parseSection(raw, queuePath, seen) {
|
|
13
|
+
const fail = (detail) => new Error(`${queuePath}: ${detail}`);
|
|
14
|
+
const lines = raw.split('\n');
|
|
15
|
+
const heading = lines[0].replace(/\r$/, '');
|
|
16
|
+
const match = HEADING_RE.exec(heading);
|
|
17
|
+
if (!match)
|
|
18
|
+
throw fail(`malformed queue item heading ${JSON.stringify(heading.trim())}`);
|
|
19
|
+
const slug = match[1].trim();
|
|
20
|
+
if (!SLUG_RE.test(slug))
|
|
21
|
+
throw fail(`invalid queue item slug ${JSON.stringify(slug)}`);
|
|
22
|
+
const title = match[2].trim();
|
|
23
|
+
if (!title)
|
|
24
|
+
throw fail(`queue item "${slug}" has an empty title`);
|
|
25
|
+
if (seen.has(slug))
|
|
26
|
+
throw fail(`duplicate queue item slug "${slug}"`);
|
|
27
|
+
const depIndex = lines.findIndex((line, index) => index > 0 && line.trim() !== '');
|
|
28
|
+
if (depIndex === -1)
|
|
29
|
+
throw fail(`queue item "${slug}" is missing its Depends on: line`);
|
|
30
|
+
const depMatch = DEP_LINE_RE.exec(lines[depIndex].replace(/\r$/, ''));
|
|
31
|
+
if (!depMatch)
|
|
32
|
+
throw fail(`queue item "${slug}" has a malformed dependency line`);
|
|
33
|
+
const depValue = depMatch[1].trim();
|
|
34
|
+
if (!depValue)
|
|
35
|
+
throw fail(`queue item "${slug}" has an empty dependency line`);
|
|
36
|
+
const dependsOn = [];
|
|
37
|
+
const seenDeps = new Set();
|
|
38
|
+
if (depValue !== 'nothing') {
|
|
39
|
+
for (const token of depValue.split(',').map((entry) => entry.trim())) {
|
|
40
|
+
if (!SLUG_RE.test(token)) {
|
|
41
|
+
throw fail(`queue item "${slug}" has an invalid dependency ${JSON.stringify(token)}`);
|
|
42
|
+
}
|
|
43
|
+
if (seenDeps.has(token))
|
|
44
|
+
throw fail(`queue item "${slug}" repeats dependency "${token}"`);
|
|
45
|
+
seenDeps.add(token);
|
|
46
|
+
if (token === slug || !seen.has(token)) {
|
|
47
|
+
throw fail(`queue item "${slug}" dependency "${token}" must reference an earlier item`);
|
|
48
|
+
}
|
|
49
|
+
dependsOn.push(token);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const depLineEnd = lines.slice(0, depIndex + 1).reduce((sum, line) => sum + line.length + 1, 0);
|
|
53
|
+
const body = raw.slice(depLineEnd).trim();
|
|
54
|
+
if (!body)
|
|
55
|
+
throw fail(`queue item "${slug}" has an empty brief body`);
|
|
56
|
+
if (/^\s*Depends on:/m.test(body)) {
|
|
57
|
+
throw fail(`queue item "${slug}" has more than one Depends on: line`);
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
slug,
|
|
61
|
+
title,
|
|
62
|
+
dependsOn,
|
|
63
|
+
body,
|
|
64
|
+
hash: `sha256:${createHash('sha256').update(raw, 'utf8').digest('hex')}`,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export function parseQueue(content, queuePath = 'openspec/queue.md') {
|
|
68
|
+
const headings = [...content.matchAll(ITEM_LIKE_RE)];
|
|
69
|
+
const items = [];
|
|
70
|
+
const seen = new Set();
|
|
71
|
+
for (const [index, heading] of headings.entries()) {
|
|
72
|
+
const start = heading.index;
|
|
73
|
+
const end = headings[index + 1]?.index ?? content.length;
|
|
74
|
+
const item = parseSection(content.slice(start, end), queuePath, seen);
|
|
75
|
+
seen.add(item.slug);
|
|
76
|
+
items.push(item);
|
|
77
|
+
}
|
|
78
|
+
return items;
|
|
79
|
+
}
|
|
80
|
+
/** Read and parse `<openspecRoot>/queue.md`; throws when it is missing. */
|
|
81
|
+
export async function readQueue(projectRoot, config = DEFAULT_CONFIG) {
|
|
82
|
+
const queuePath = getQueuePath(projectRoot, config);
|
|
83
|
+
const content = await fs.readFile(queuePath, 'utf8').catch(() => null);
|
|
84
|
+
if (content === null)
|
|
85
|
+
throw new Error(`Queue file not found: ${queuePath}`);
|
|
86
|
+
return parseQueue(content, queuePath);
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=queue-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue-parser.js","sourceRoot":"","sources":["../../../src/core/status/queue-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAkB,MAAM,yBAAyB,CAAC;AAUzE,MAAM,OAAO,GAAG,4BAA4B,CAAC;AAC7C,MAAM,UAAU,GAAG,iDAAiD,CAAC;AACrE,MAAM,YAAY,GAAG,kBAAkB,CAAC;AACxC,MAAM,WAAW,GAAG,kCAAkC,CAAC;AAEvD,MAAM,UAAU,YAAY,CAAC,WAAmB,EAAE,SAAoB,cAAc;IAClF,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,YAAY,CAAC,GAAW,EAAE,SAAiB,EAAE,IAAyB;IAC7E,MAAM,IAAI,GAAG,CAAC,MAAc,EAAS,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,SAAS,KAAK,MAAM,EAAE,CAAC,CAAC;IAC7E,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,CAAC,gCAAgC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IACzF,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,CAAC,2BAA2B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvF,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,CAAC,eAAe,IAAI,sBAAsB,CAAC,CAAC;IAClE,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,CAAC,8BAA8B,IAAI,GAAG,CAAC,CAAC;IACtE,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACnF,IAAI,QAAQ,KAAK,CAAC,CAAC;QAAE,MAAM,IAAI,CAAC,eAAe,IAAI,mCAAmC,CAAC,CAAC;IACxF,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;IACtE,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,CAAC,eAAe,IAAI,mCAAmC,CAAC,CAAC;IAClF,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,CAAC,eAAe,IAAI,gCAAgC,CAAC,CAAC;IAC/E,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YACrE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,CAAC,eAAe,IAAI,+BAA+B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACxF,CAAC;YACD,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,MAAM,IAAI,CAAC,eAAe,IAAI,yBAAyB,KAAK,GAAG,CAAC,CAAC;YAC1F,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvC,MAAM,IAAI,CAAC,eAAe,IAAI,iBAAiB,KAAK,kCAAkC,CAAC,CAAC;YAC1F,CAAC;YACD,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAChG,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,CAAC,eAAe,IAAI,2BAA2B,CAAC,CAAC;IACtE,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,CAAC,eAAe,IAAI,sCAAsC,CAAC,CAAC;IACxE,CAAC;IACD,OAAO;QACL,IAAI;QACJ,KAAK;QACL,SAAS;QACT,IAAI;QACJ,IAAI,EAAE,UAAU,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;KACzE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe,EAAE,SAAS,GAAG,mBAAmB;IACzE,MAAM,QAAQ,GAAG,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;IACrD,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;QAClD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAe,CAAC;QACtC,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;QACzD,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QACtE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,2EAA2E;AAC3E,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,WAAmB,EACnB,SAAoB,cAAc;IAElC,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACvE,IAAI,OAAO,KAAK,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,SAAS,EAAE,CAAC,CAAC;IAC5E,OAAO,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AACxC,CAAC"}
|