@matteeh/osq 0.1.0 → 0.2.1
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-capability.d.ts +17 -0
- package/dist/core/spec/digest-capability.d.ts.map +1 -0
- package/dist/core/spec/digest-capability.js +89 -0
- package/dist/core/spec/digest-capability.js.map +1 -0
- package/dist/core/spec/digest-flags.d.ts +22 -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 +43 -0
- package/dist/core/spec/digest.d.ts.map +1 -0
- package/dist/core/spec/digest.js +175 -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 +289 -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-project.d.ts +11 -0
- package/dist/watcher/build-project.d.ts.map +1 -0
- package/dist/watcher/build-project.js +36 -0
- package/dist/watcher/build-project.js.map +1 -0
- package/dist/watcher/build.d.ts +27 -0
- package/dist/watcher/build.d.ts.map +1 -0
- package/dist/watcher/build.js +165 -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 +82 -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 +34 -0
- package/dist/watcher/outcome.d.ts.map +1 -0
- package/dist/watcher/outcome.js +131 -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 +178 -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 +135 -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,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capability name resemblance and living-capability discovery for the approval
|
|
3
|
+
* digest. A new capability resembles a living one when their names are equal
|
|
4
|
+
* once hyphens and underscores are removed, when one name's words all appear
|
|
5
|
+
* among the other's, or when both are long enough and their edit distance is
|
|
6
|
+
* small.
|
|
7
|
+
*/
|
|
8
|
+
import fs from 'node:fs/promises';
|
|
9
|
+
import path from 'node:path';
|
|
10
|
+
const MIN_EDIT_DISTANCE_LENGTH = 5;
|
|
11
|
+
const MAX_EDIT_DISTANCE = 2;
|
|
12
|
+
function compareText(a, b) {
|
|
13
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
14
|
+
}
|
|
15
|
+
/** Words of a name, split on hyphens and underscores. */
|
|
16
|
+
function words(name) {
|
|
17
|
+
return name.split(/[-_]+/).filter((word) => word !== '');
|
|
18
|
+
}
|
|
19
|
+
function stripSeparators(name) {
|
|
20
|
+
return name.replace(/[-_]/g, '');
|
|
21
|
+
}
|
|
22
|
+
function isSubset(a, b) {
|
|
23
|
+
const other = new Set(b);
|
|
24
|
+
return a.every((word) => other.has(word));
|
|
25
|
+
}
|
|
26
|
+
/** Levenshtein edit distance between two names. */
|
|
27
|
+
function editDistance(a, b) {
|
|
28
|
+
const previous = [];
|
|
29
|
+
for (let j = 0; j <= b.length; j += 1)
|
|
30
|
+
previous.push(j);
|
|
31
|
+
for (let i = 1; i <= a.length; i += 1) {
|
|
32
|
+
let diagonal = previous[0];
|
|
33
|
+
previous[0] = i;
|
|
34
|
+
for (let j = 1; j <= b.length; j += 1) {
|
|
35
|
+
const saved = previous[j];
|
|
36
|
+
const cost = a[i - 1] === b[j - 1] ? 0 : 1;
|
|
37
|
+
previous[j] = Math.min(previous[j] + 1, previous[j - 1] + 1, diagonal + cost);
|
|
38
|
+
diagonal = saved;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return previous[b.length];
|
|
42
|
+
}
|
|
43
|
+
/** True when two capability names resemble each other. */
|
|
44
|
+
export function namesResemble(name, other) {
|
|
45
|
+
if (stripSeparators(name) === stripSeparators(other))
|
|
46
|
+
return true;
|
|
47
|
+
const nameWords = words(name);
|
|
48
|
+
const otherWords = words(other);
|
|
49
|
+
if (nameWords.length > 0 && otherWords.length > 0) {
|
|
50
|
+
if (isSubset(nameWords, otherWords) || isSubset(otherWords, nameWords))
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
if (name.length >= MIN_EDIT_DISTANCE_LENGTH && other.length >= MIN_EDIT_DISTANCE_LENGTH) {
|
|
54
|
+
return editDistance(name, other) <= MAX_EDIT_DISTANCE;
|
|
55
|
+
}
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
/** The first living name, in name order, that `name` resembles, or null. */
|
|
59
|
+
export function resemblingCapability(name, living) {
|
|
60
|
+
const ordered = [...living].sort(compareText);
|
|
61
|
+
return ordered.find((candidate) => namesResemble(name, candidate)) ?? null;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Living capability names: the directories under `<openspecRoot>/specs` that
|
|
65
|
+
* hold a `spec.md`, in name order.
|
|
66
|
+
*/
|
|
67
|
+
export async function readLivingCapabilityNames(projectRoot, openspecRoot) {
|
|
68
|
+
const specsDir = path.join(projectRoot, openspecRoot, 'specs');
|
|
69
|
+
let entries = [];
|
|
70
|
+
try {
|
|
71
|
+
entries = await fs.readdir(specsDir, { withFileTypes: true });
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return [];
|
|
75
|
+
}
|
|
76
|
+
const names = [];
|
|
77
|
+
for (const entry of entries) {
|
|
78
|
+
if (!entry.isDirectory())
|
|
79
|
+
continue;
|
|
80
|
+
const exists = await fs
|
|
81
|
+
.stat(path.join(specsDir, entry.name, 'spec.md'))
|
|
82
|
+
.then(() => true)
|
|
83
|
+
.catch(() => false);
|
|
84
|
+
if (exists)
|
|
85
|
+
names.push(entry.name);
|
|
86
|
+
}
|
|
87
|
+
return names.sort(compareText);
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=digest-capability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"digest-capability.js","sourceRoot":"","sources":["../../../src/core/spec/digest-capability.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ApprovalDigestCapability, ApprovalFlag } from './digest.js';
|
|
2
|
+
import type { VerifyStarts } from './parser.js';
|
|
3
|
+
/** One task projection: identity, verify, declared scope, and resolved scope paths. */
|
|
4
|
+
export interface ApprovalFlagTask {
|
|
5
|
+
readonly number: string;
|
|
6
|
+
readonly verify: string;
|
|
7
|
+
readonly verifyStarts: VerifyStarts;
|
|
8
|
+
readonly scope: readonly string[];
|
|
9
|
+
readonly paths: readonly string[];
|
|
10
|
+
}
|
|
11
|
+
/** Everything the flag rules need from the digested change and its project. */
|
|
12
|
+
export interface ApprovalFlagInput {
|
|
13
|
+
readonly projectRoot: string;
|
|
14
|
+
readonly openspecRoot: string;
|
|
15
|
+
readonly proposalVerify: string;
|
|
16
|
+
readonly tasks: readonly ApprovalFlagTask[];
|
|
17
|
+
readonly capabilities: readonly ApprovalDigestCapability[];
|
|
18
|
+
readonly livingCapabilities: readonly string[];
|
|
19
|
+
}
|
|
20
|
+
/** Build every approval flag in the fixed id order, then task-number or name order. */
|
|
21
|
+
export declare function buildApprovalFlags(input: ApprovalFlagInput): Promise<ApprovalFlag[]>;
|
|
22
|
+
//# sourceMappingURL=digest-flags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"digest-flags.d.ts","sourceRoot":"","sources":["../../../src/core/spec/digest-flags.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,wBAAwB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,uFAAuF;AACvF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,+EAA+E;AAC/E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC5C,QAAQ,CAAC,YAAY,EAAE,SAAS,wBAAwB,EAAE,CAAC;IAC3D,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;CAChD;AAgMD,uFAAuF;AACvF,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAa1F"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { CLAUDE_PLAN_COMMAND_PATH } from '../foundation/init-blocks.js';
|
|
3
|
+
import { resemblingCapability } from './digest-capability.js';
|
|
4
|
+
import { verifyStartsConflictFlags } from './digest-verify-starts.js';
|
|
5
|
+
const SENSITIVE_KINDS = [
|
|
6
|
+
'package manifest',
|
|
7
|
+
'lockfile',
|
|
8
|
+
'CI workflow',
|
|
9
|
+
'osq config',
|
|
10
|
+
'OpenSpec config',
|
|
11
|
+
'managed instructions',
|
|
12
|
+
'env file',
|
|
13
|
+
];
|
|
14
|
+
const PACKAGE_MANIFEST_BASENAMES = new Set('package.json pnpm-workspace.yaml pyproject.toml Cargo.toml go.mod'.split(' '));
|
|
15
|
+
const LOCKFILE_BASENAMES = new Set('pnpm-lock.yaml package-lock.json npm-shrinkwrap.json yarn.lock bun.lock bun.lockb poetry.lock uv.lock Cargo.lock go.sum'.split(' '));
|
|
16
|
+
const OSQ_CONFIG_BASENAMES = new Set('osq.config.ts osq.config.js osq.config.mjs'.split(' '));
|
|
17
|
+
const MANAGED_INSTRUCTION_BASENAMES = new Set('AGENTS.md PLANNER.md CLAUDE.md'.split(' '));
|
|
18
|
+
const ENV_TEMPLATE_BASENAMES = new Set('.env.example .env.sample .env.template'.split(' '));
|
|
19
|
+
const ENV_FILE_REGEX = /^\.env(?:\..+)?$/;
|
|
20
|
+
const RUNNER_MARKERS = ['--test', 'vitest', 'jest', 'mocha', 'pytest', 'go test', 'cargo test'];
|
|
21
|
+
const PACKAGE_RUNNER_REGEX = /\b(?:pnpm|npm|yarn|bun)\s+(?:run\s+)?(?:test|verify)\b/;
|
|
22
|
+
function basename(relativePath) {
|
|
23
|
+
const index = relativePath.lastIndexOf('/');
|
|
24
|
+
return index === -1 ? relativePath : relativePath.slice(index + 1);
|
|
25
|
+
}
|
|
26
|
+
function compareText(a, b) {
|
|
27
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
28
|
+
}
|
|
29
|
+
function compareTaskNumbers(a, b) {
|
|
30
|
+
const numA = Number.parseInt(a, 10);
|
|
31
|
+
const numB = Number.parseInt(b, 10);
|
|
32
|
+
if (!Number.isNaN(numA) && !Number.isNaN(numB) && numA !== numB)
|
|
33
|
+
return numA - numB;
|
|
34
|
+
return compareText(a, b);
|
|
35
|
+
}
|
|
36
|
+
function taskPhrase(numbers) {
|
|
37
|
+
const sorted = [...numbers].sort(compareTaskNumbers);
|
|
38
|
+
return sorted.length === 1 ? `task ${sorted[0]}` : `tasks ${sorted.join(', ')}`;
|
|
39
|
+
}
|
|
40
|
+
/** One flag per task pair sharing any resolved scope path. */
|
|
41
|
+
function sharedFileFlags(tasks) {
|
|
42
|
+
const ordered = [...tasks].sort((a, b) => compareTaskNumbers(a.number, b.number));
|
|
43
|
+
const flags = [];
|
|
44
|
+
for (let left = 0; left < ordered.length; left += 1) {
|
|
45
|
+
for (let right = left + 1; right < ordered.length; right += 1) {
|
|
46
|
+
const first = ordered[left];
|
|
47
|
+
const second = ordered[right];
|
|
48
|
+
const other = new Set(second.paths);
|
|
49
|
+
const shared = first.paths.filter((entry) => other.has(entry)).sort(compareText);
|
|
50
|
+
if (shared.length === 0)
|
|
51
|
+
continue;
|
|
52
|
+
flags.push({
|
|
53
|
+
id: 'shared_file',
|
|
54
|
+
label: `shared files in tasks ${first.number} and ${second.number}`,
|
|
55
|
+
excerpt: `${shared.join(', ')}; the watcher will halt for recertification when task ${second.number} changes them`,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return flags;
|
|
60
|
+
}
|
|
61
|
+
/** The first sensitive kind a resolved path matches, or null. */
|
|
62
|
+
function sensitiveKindOf(relativePath, openspecRoot) {
|
|
63
|
+
const name = basename(relativePath);
|
|
64
|
+
if (PACKAGE_MANIFEST_BASENAMES.has(name))
|
|
65
|
+
return 'package manifest';
|
|
66
|
+
if (LOCKFILE_BASENAMES.has(name))
|
|
67
|
+
return 'lockfile';
|
|
68
|
+
if (relativePath.startsWith('.github/workflows/') || relativePath === '.gitlab-ci.yml') {
|
|
69
|
+
return 'CI workflow';
|
|
70
|
+
}
|
|
71
|
+
if (OSQ_CONFIG_BASENAMES.has(name))
|
|
72
|
+
return 'osq config';
|
|
73
|
+
if (relativePath === `${openspecRoot}/config.yaml`)
|
|
74
|
+
return 'OpenSpec config';
|
|
75
|
+
const claudePath = CLAUDE_PLAN_COMMAND_PATH.split(path.sep).join('/');
|
|
76
|
+
if (MANAGED_INSTRUCTION_BASENAMES.has(name) ||
|
|
77
|
+
relativePath === claudePath ||
|
|
78
|
+
relativePath.startsWith('.opencode/agent/')) {
|
|
79
|
+
return 'managed instructions';
|
|
80
|
+
}
|
|
81
|
+
if (ENV_FILE_REGEX.test(name) && !ENV_TEMPLATE_BASENAMES.has(name))
|
|
82
|
+
return 'env file';
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
/** One flag per sensitive kind present, naming each path and its tasks. */
|
|
86
|
+
function sensitivePathFlags(tasks, openspecRoot) {
|
|
87
|
+
const byKind = new Map();
|
|
88
|
+
for (const task of tasks) {
|
|
89
|
+
for (const relativePath of task.paths) {
|
|
90
|
+
const kind = sensitiveKindOf(relativePath, openspecRoot);
|
|
91
|
+
if (kind === null)
|
|
92
|
+
continue;
|
|
93
|
+
const paths = byKind.get(kind) ?? new Map();
|
|
94
|
+
const numbers = paths.get(relativePath) ?? new Set();
|
|
95
|
+
numbers.add(task.number);
|
|
96
|
+
paths.set(relativePath, numbers);
|
|
97
|
+
byKind.set(kind, paths);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const flags = [];
|
|
101
|
+
for (const kind of SENSITIVE_KINDS) {
|
|
102
|
+
const paths = byKind.get(kind);
|
|
103
|
+
if (!paths || paths.size === 0)
|
|
104
|
+
continue;
|
|
105
|
+
const excerpt = [...paths.entries()]
|
|
106
|
+
.sort((a, b) => compareText(a[0], b[0]))
|
|
107
|
+
.map(([relativePath, numbers]) => `${relativePath} in ${taskPhrase([...numbers])}`)
|
|
108
|
+
.join('; ');
|
|
109
|
+
flags.push({ id: 'sensitive_path', label: `${kind} in scope`, excerpt });
|
|
110
|
+
}
|
|
111
|
+
return flags;
|
|
112
|
+
}
|
|
113
|
+
/** True when a command names neither a test file nor a recognized runner. */
|
|
114
|
+
function verifyLacksTest(command) {
|
|
115
|
+
const trimmed = command.trim();
|
|
116
|
+
if (trimmed === '')
|
|
117
|
+
return false;
|
|
118
|
+
if (trimmed.includes('.test.') || trimmed.includes('.spec.'))
|
|
119
|
+
return false;
|
|
120
|
+
if (/(?:^|[\s/])(?:tests?|__tests__)\//.test(trimmed))
|
|
121
|
+
return false;
|
|
122
|
+
if (RUNNER_MARKERS.some((marker) => trimmed.includes(marker)))
|
|
123
|
+
return false;
|
|
124
|
+
return !PACKAGE_RUNNER_REGEX.test(trimmed);
|
|
125
|
+
}
|
|
126
|
+
/** One flag per task and proposal verify that names no test file or runner. */
|
|
127
|
+
function verifyWithoutTestFlags(tasks, proposalVerify) {
|
|
128
|
+
const ordered = [...tasks].sort((a, b) => compareTaskNumbers(a.number, b.number));
|
|
129
|
+
const flags = [];
|
|
130
|
+
for (const task of ordered) {
|
|
131
|
+
if (verifyLacksTest(task.verify)) {
|
|
132
|
+
flags.push({
|
|
133
|
+
id: 'verify_without_test',
|
|
134
|
+
label: `verify without a test in task ${task.number}`,
|
|
135
|
+
excerpt: task.verify,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (verifyLacksTest(proposalVerify)) {
|
|
140
|
+
flags.push({
|
|
141
|
+
id: 'verify_without_test',
|
|
142
|
+
label: 'verify without a test in the proposal',
|
|
143
|
+
excerpt: proposalVerify,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
return flags;
|
|
147
|
+
}
|
|
148
|
+
/** One flag per capability whose delta removes requirements. */
|
|
149
|
+
function removedRequirementFlags(capabilities) {
|
|
150
|
+
return [...capabilities]
|
|
151
|
+
.filter((capability) => capability.removed.length > 0)
|
|
152
|
+
.sort((a, b) => compareText(a.name, b.name))
|
|
153
|
+
.map((capability) => ({
|
|
154
|
+
id: 'removed_requirement',
|
|
155
|
+
label: `removes ${capability.removed.length} requirements from ${capability.name}`,
|
|
156
|
+
excerpt: capability.removed.join(', '),
|
|
157
|
+
}));
|
|
158
|
+
}
|
|
159
|
+
/** One flag per delta capability that has no living spec and is not deliberately created. */
|
|
160
|
+
function unknownCapabilityFlags(input) {
|
|
161
|
+
const flags = [];
|
|
162
|
+
const living = input.livingCapabilities;
|
|
163
|
+
const ordered = [...input.capabilities].sort((a, b) => compareText(a.name, b.name));
|
|
164
|
+
for (const capability of ordered) {
|
|
165
|
+
if (living.includes(capability.name) || capability.creates)
|
|
166
|
+
continue;
|
|
167
|
+
const resembles = resemblingCapability(capability.name, living);
|
|
168
|
+
const label = resembles === null
|
|
169
|
+
? `unknown capability ${capability.name} without a Purpose`
|
|
170
|
+
: `unknown capability ${capability.name} resembles ${resembles}`;
|
|
171
|
+
flags.push({
|
|
172
|
+
id: 'unknown_capability',
|
|
173
|
+
label,
|
|
174
|
+
excerpt: `no living spec at ${input.openspecRoot}/specs/${capability.name}/spec.md`,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
return flags;
|
|
178
|
+
}
|
|
179
|
+
/** Build every approval flag in the fixed id order, then task-number or name order. */
|
|
180
|
+
export async function buildApprovalFlags(input) {
|
|
181
|
+
const openspecRoot = input.openspecRoot
|
|
182
|
+
.replace(/\\/g, '/')
|
|
183
|
+
.replace(/^\.\/+/, '')
|
|
184
|
+
.replace(/\/+$/, '');
|
|
185
|
+
return [
|
|
186
|
+
...sharedFileFlags(input.tasks),
|
|
187
|
+
...sensitivePathFlags(input.tasks, openspecRoot),
|
|
188
|
+
...verifyWithoutTestFlags(input.tasks, input.proposalVerify),
|
|
189
|
+
...removedRequirementFlags(input.capabilities),
|
|
190
|
+
...unknownCapabilityFlags(input),
|
|
191
|
+
...(await verifyStartsConflictFlags(input.projectRoot, input.tasks)),
|
|
192
|
+
];
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=digest-flags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"digest-flags.js","sourceRoot":"","sources":["../../../src/core/spec/digest-flags.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ApprovalFlagTask } from './digest-flags.js';
|
|
2
|
+
import type { ApprovalFlag } from './digest.js';
|
|
3
|
+
/** One flag per task that declares `green` or `any` while creating its own named path. */
|
|
4
|
+
export declare function verifyStartsConflictFlags(projectRoot: string, tasks: readonly ApprovalFlagTask[]): Promise<ApprovalFlag[]>;
|
|
5
|
+
//# sourceMappingURL=digest-verify-starts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"digest-verify-starts.d.ts","sourceRoot":"","sources":["../../../src/core/spec/digest-verify-starts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAgBhD,0FAA0F;AAC1F,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,SAAS,gBAAgB,EAAE,GACjC,OAAO,CAAC,YAAY,EAAE,CAAC,CAezB"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { analyzeVerifyStarts } from './verify-starts.js';
|
|
2
|
+
/**
|
|
3
|
+
* Turns each verify start contradiction found by the shared rule in
|
|
4
|
+
* `verify-starts.ts` into one approval flag. Lint and the digest consume the
|
|
5
|
+
* same rule so their diagnostics agree.
|
|
6
|
+
*/
|
|
7
|
+
function compareTaskNumbers(a, b) {
|
|
8
|
+
const numA = Number.parseInt(a, 10);
|
|
9
|
+
const numB = Number.parseInt(b, 10);
|
|
10
|
+
if (!Number.isNaN(numA) && !Number.isNaN(numB) && numA !== numB)
|
|
11
|
+
return numA - numB;
|
|
12
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
13
|
+
}
|
|
14
|
+
/** One flag per task that declares `green` or `any` while creating its own named path. */
|
|
15
|
+
export async function verifyStartsConflictFlags(projectRoot, tasks) {
|
|
16
|
+
const ruleTasks = tasks.map((task) => ({
|
|
17
|
+
taskNumber: task.number,
|
|
18
|
+
verify: task.verify,
|
|
19
|
+
verifyStarts: task.verifyStarts,
|
|
20
|
+
scope: task.scope,
|
|
21
|
+
}));
|
|
22
|
+
const report = await analyzeVerifyStarts(projectRoot, ruleTasks);
|
|
23
|
+
return [...report.contradictions]
|
|
24
|
+
.sort((a, b) => compareTaskNumbers(a.taskNumber, b.taskNumber) || (a.path < b.path ? -1 : 1))
|
|
25
|
+
.map((contradiction) => ({
|
|
26
|
+
id: 'verify_starts_conflict',
|
|
27
|
+
label: `verify starts conflict in task ${contradiction.taskNumber}`,
|
|
28
|
+
excerpt: `${contradiction.path} is named by the verify but created by this task, which declares verify_starts: ${contradiction.start}`,
|
|
29
|
+
}));
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=digest-verify-starts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"digest-verify-starts.js","sourceRoot":"","sources":["../../../src/core/spec/digest-verify-starts.ts"],"names":[],"mappings":"AAEA,OAAO,EAAwB,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE/E;;;;GAIG;AAEH,SAAS,kBAAkB,CAAC,CAAS,EAAE,CAAS;IAC9C,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,GAAG,IAAI,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,0FAA0F;AAC1F,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,WAAmB,EACnB,KAAkC;IAElC,MAAM,SAAS,GAAsB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACxD,UAAU,EAAE,IAAI,CAAC,MAAM;QACvB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC,CAAC,CAAC;IACJ,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,MAAM,CAAC,cAAc,CAAC;SAC9B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAC5F,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QACvB,EAAE,EAAE,wBAAiC;QACrC,KAAK,EAAE,kCAAkC,aAAa,CAAC,UAAU,EAAE;QACnE,OAAO,EAAE,GAAG,aAAa,CAAC,IAAI,mFAAmF,aAAa,CAAC,KAAK,EAAE;KACvI,CAAC,CAAC,CAAC;AACR,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { OsqConfig } from '../foundation/config.js';
|
|
2
|
+
/** Approval flag ids, in the fixed order their flags are emitted. */
|
|
3
|
+
export type ApprovalFlagId = 'shared_file' | 'sensitive_path' | 'verify_without_test' | 'removed_requirement' | 'unknown_capability' | 'verify_starts_conflict';
|
|
4
|
+
export interface ApprovalFlag {
|
|
5
|
+
readonly id: ApprovalFlagId;
|
|
6
|
+
readonly label: string;
|
|
7
|
+
readonly excerpt: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ApprovalDigestTask {
|
|
10
|
+
readonly number: string;
|
|
11
|
+
readonly title: string;
|
|
12
|
+
readonly scopeFiles: number;
|
|
13
|
+
readonly testsModify: boolean;
|
|
14
|
+
readonly existingTests: readonly string[];
|
|
15
|
+
}
|
|
16
|
+
export interface ApprovalDigestCapability {
|
|
17
|
+
readonly name: string;
|
|
18
|
+
readonly added: readonly string[];
|
|
19
|
+
readonly modified: readonly string[];
|
|
20
|
+
readonly removed: readonly string[];
|
|
21
|
+
readonly creates: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface ApprovalDigest {
|
|
24
|
+
readonly change: string;
|
|
25
|
+
readonly goal: string;
|
|
26
|
+
readonly tasks: readonly ApprovalDigestTask[];
|
|
27
|
+
readonly capabilities: readonly ApprovalDigestCapability[];
|
|
28
|
+
readonly humanSteps: string;
|
|
29
|
+
readonly flags: readonly ApprovalFlag[];
|
|
30
|
+
}
|
|
31
|
+
/** Collapse every whitespace run, including newlines, to one space. */
|
|
32
|
+
export declare function collapseWhitespace(text: string): string;
|
|
33
|
+
/** The first two sentences of a goal, whitespace-collapsed. */
|
|
34
|
+
export declare function firstTwoSentences(goal: string): string;
|
|
35
|
+
/** Summarize a change from its authored files into the approval digest. */
|
|
36
|
+
export declare function buildApprovalDigest(projectRoot: string, changeFolder: string, config: OsqConfig): Promise<ApprovalDigest>;
|
|
37
|
+
/** Render the digest body, without flags. */
|
|
38
|
+
export declare function formatApprovalDigest(digest: ApprovalDigest): string;
|
|
39
|
+
/** One `Flag: <label> — <excerpt>` line per flag. */
|
|
40
|
+
export declare function formatApprovalFlags(flags: readonly ApprovalFlag[]): string[];
|
|
41
|
+
/** `<n> flag(s): <label>, <label>`, or an empty string with no flags. */
|
|
42
|
+
export declare function summarizeApprovalFlags(flags: readonly ApprovalFlag[]): string;
|
|
43
|
+
//# sourceMappingURL=digest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"digest.d.ts","sourceRoot":"","sources":["../../../src/core/spec/digest.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAczD,qEAAqE;AACrE,MAAM,MAAM,cAAc,GACtB,aAAa,GACb,gBAAgB,GAChB,qBAAqB,GACrB,qBAAqB,GACrB,oBAAoB,GACpB,wBAAwB,CAAC;AAE7B,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3C;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAC9C,QAAQ,CAAC,YAAY,EAAE,SAAS,wBAAwB,EAAE,CAAC;IAC3D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;CACzC;AA4BD,uEAAuE;AACvE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,+DAA+D;AAC/D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOtD;AAmDD,2EAA2E;AAC3E,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,cAAc,CAAC,CAmDzB;AAED,6CAA6C;AAC7C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CA2BnE;AAED,qDAAqD;AACrD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,GAAG,MAAM,EAAE,CAE5E;AAED,yEAAyE;AACzE,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,GAAG,MAAM,CAI7E"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { resolveScope } from '../run/scope.js';
|
|
4
|
+
import { parseDelta } from './delta.js';
|
|
5
|
+
import { readLivingCapabilityNames, resemblingCapability } from './digest-capability.js';
|
|
6
|
+
import { buildApprovalFlags } from './digest-flags.js';
|
|
7
|
+
import { extractSection, parseFrontmatter, parseSpecMd, parseTaskMd, resolveChangeDoc, } from './parser.js';
|
|
8
|
+
function compareText(a, b) {
|
|
9
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
10
|
+
}
|
|
11
|
+
function compareTaskNumbers(a, b) {
|
|
12
|
+
const numA = Number.parseInt(a, 10);
|
|
13
|
+
const numB = Number.parseInt(b, 10);
|
|
14
|
+
if (!Number.isNaN(numA) && !Number.isNaN(numB) && numA !== numB)
|
|
15
|
+
return numA - numB;
|
|
16
|
+
return compareText(a, b);
|
|
17
|
+
}
|
|
18
|
+
/** Collapse every whitespace run, including newlines, to one space. */
|
|
19
|
+
export function collapseWhitespace(text) {
|
|
20
|
+
return text.replace(/\s+/g, ' ').trim();
|
|
21
|
+
}
|
|
22
|
+
/** The first two sentences of a goal, whitespace-collapsed. */
|
|
23
|
+
export function firstTwoSentences(goal) {
|
|
24
|
+
const collapsed = collapseWhitespace(goal);
|
|
25
|
+
if (collapsed === '')
|
|
26
|
+
return '';
|
|
27
|
+
return collapsed
|
|
28
|
+
.split(/(?<=[.!?])\s+/)
|
|
29
|
+
.slice(0, 2)
|
|
30
|
+
.join(' ');
|
|
31
|
+
}
|
|
32
|
+
function isTestPath(relativePath) {
|
|
33
|
+
return relativePath === 'tests' || relativePath.startsWith('tests/');
|
|
34
|
+
}
|
|
35
|
+
async function resolveTasks(projectRoot, changeFolder) {
|
|
36
|
+
const tasksDir = path.join(changeFolder, 'tasks');
|
|
37
|
+
const files = (await fs.readdir(tasksDir).catch(() => []))
|
|
38
|
+
.filter((entry) => entry.endsWith('.md'))
|
|
39
|
+
.sort((a, b) => compareTaskNumbers(a.replace(/\.md$/, ''), b.replace(/\.md$/, '')));
|
|
40
|
+
const tasks = [];
|
|
41
|
+
for (const file of files) {
|
|
42
|
+
const content = await fs.readFile(path.join(tasksDir, file), 'utf8');
|
|
43
|
+
const task = parseTaskMd(content);
|
|
44
|
+
const entries = task.scope.length > 0 ? await resolveScope(projectRoot, task.scope) : [];
|
|
45
|
+
tasks.push({
|
|
46
|
+
number: file.replace(/\.md$/, ''),
|
|
47
|
+
title: task.title,
|
|
48
|
+
verify: task.verify,
|
|
49
|
+
verifyStarts: task.verifyStarts,
|
|
50
|
+
scope: task.scope,
|
|
51
|
+
testsModify: task.testsModify,
|
|
52
|
+
entries,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
return tasks;
|
|
56
|
+
}
|
|
57
|
+
async function readCapabilities(changeFolder) {
|
|
58
|
+
const specsDir = path.join(changeFolder, 'specs');
|
|
59
|
+
let entries = [];
|
|
60
|
+
try {
|
|
61
|
+
entries = await fs.readdir(specsDir, { withFileTypes: true });
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return [];
|
|
65
|
+
}
|
|
66
|
+
const names = entries
|
|
67
|
+
.filter((entry) => entry.isDirectory())
|
|
68
|
+
.map((entry) => entry.name)
|
|
69
|
+
.sort(compareText);
|
|
70
|
+
const capabilities = [];
|
|
71
|
+
for (const name of names) {
|
|
72
|
+
const content = await fs
|
|
73
|
+
.readFile(path.join(specsDir, name, 'spec.md'), 'utf8')
|
|
74
|
+
.catch(() => null);
|
|
75
|
+
if (content !== null)
|
|
76
|
+
capabilities.push({ name, delta: parseDelta(content) });
|
|
77
|
+
}
|
|
78
|
+
return capabilities;
|
|
79
|
+
}
|
|
80
|
+
/** Summarize a change from its authored files into the approval digest. */
|
|
81
|
+
export async function buildApprovalDigest(projectRoot, changeFolder, config) {
|
|
82
|
+
const resolvedDoc = await resolveChangeDoc(changeFolder);
|
|
83
|
+
const content = resolvedDoc ? await fs.readFile(resolvedDoc.path, 'utf8') : '';
|
|
84
|
+
const spec = parseSpecMd(content);
|
|
85
|
+
const body = resolvedDoc ? parseFrontmatter(content).body : '';
|
|
86
|
+
const tasks = await resolveTasks(projectRoot, changeFolder);
|
|
87
|
+
const changeCapabilities = await readCapabilities(changeFolder);
|
|
88
|
+
const living = await readLivingCapabilityNames(projectRoot, config.paths.openspecRoot);
|
|
89
|
+
const capabilities = changeCapabilities.map(({ name, delta }) => ({
|
|
90
|
+
name,
|
|
91
|
+
added: delta.added.map((requirement) => requirement.name),
|
|
92
|
+
modified: delta.modified.map((requirement) => requirement.name),
|
|
93
|
+
removed: delta.removed.map((requirement) => requirement.name),
|
|
94
|
+
creates: !living.includes(name) && delta.purpose !== '' && resemblingCapability(name, living) === null,
|
|
95
|
+
}));
|
|
96
|
+
const flagTasks = tasks.map((task) => ({
|
|
97
|
+
number: task.number,
|
|
98
|
+
verify: task.verify,
|
|
99
|
+
verifyStarts: task.verifyStarts,
|
|
100
|
+
scope: task.scope,
|
|
101
|
+
paths: task.entries.map((entry) => entry.relativePath),
|
|
102
|
+
}));
|
|
103
|
+
const flags = await buildApprovalFlags({
|
|
104
|
+
projectRoot,
|
|
105
|
+
openspecRoot: config.paths.openspecRoot,
|
|
106
|
+
proposalVerify: spec.verify,
|
|
107
|
+
tasks: flagTasks,
|
|
108
|
+
capabilities,
|
|
109
|
+
livingCapabilities: living,
|
|
110
|
+
});
|
|
111
|
+
return {
|
|
112
|
+
change: path.basename(changeFolder),
|
|
113
|
+
goal: firstTwoSentences(spec.goal),
|
|
114
|
+
tasks: tasks.map((task) => {
|
|
115
|
+
const existing = task.entries.filter((entry) => entry.absolutePath !== null);
|
|
116
|
+
return {
|
|
117
|
+
number: task.number,
|
|
118
|
+
title: task.title,
|
|
119
|
+
scopeFiles: existing.length,
|
|
120
|
+
testsModify: task.testsModify,
|
|
121
|
+
existingTests: existing
|
|
122
|
+
.map((entry) => entry.relativePath)
|
|
123
|
+
.filter(isTestPath)
|
|
124
|
+
.sort(compareText),
|
|
125
|
+
};
|
|
126
|
+
}),
|
|
127
|
+
capabilities,
|
|
128
|
+
humanSteps: extractSection(body, 'Human steps'),
|
|
129
|
+
flags,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/** Render the digest body, without flags. */
|
|
133
|
+
export function formatApprovalDigest(digest) {
|
|
134
|
+
const lines = [`Change: ${digest.change}`];
|
|
135
|
+
if (digest.goal)
|
|
136
|
+
lines.push(`Goal: ${digest.goal}`);
|
|
137
|
+
lines.push('Tasks:');
|
|
138
|
+
for (const task of digest.tasks) {
|
|
139
|
+
const suffix = task.scopeFiles === 1 ? 'scope file' : 'scope files';
|
|
140
|
+
lines.push(` ${task.number}. ${task.title} (${task.scopeFiles} ${suffix})`);
|
|
141
|
+
if (task.testsModify) {
|
|
142
|
+
const tests = task.existingTests.length > 0 ? task.existingTests.join(', ') : '(none)';
|
|
143
|
+
lines.push(` tests.modify: existing tests in scope: ${tests}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
lines.push('Capabilities:');
|
|
147
|
+
if (digest.capabilities.length === 0)
|
|
148
|
+
lines.push(' (none)');
|
|
149
|
+
for (const capability of digest.capabilities) {
|
|
150
|
+
const creation = capability.creates ? ' (new capability)' : '';
|
|
151
|
+
lines.push(` ${capability.name}${creation}:`);
|
|
152
|
+
for (const kind of ['added', 'modified', 'removed']) {
|
|
153
|
+
const names = capability[kind];
|
|
154
|
+
lines.push(` ${kind}: ${names.length > 0 ? names.join(', ') : '(none)'}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
if (digest.humanSteps) {
|
|
158
|
+
lines.push('Human steps:');
|
|
159
|
+
for (const line of digest.humanSteps.split('\n'))
|
|
160
|
+
lines.push(` ${line.trim()}`);
|
|
161
|
+
}
|
|
162
|
+
return lines.join('\n');
|
|
163
|
+
}
|
|
164
|
+
/** One `Flag: <label> — <excerpt>` line per flag. */
|
|
165
|
+
export function formatApprovalFlags(flags) {
|
|
166
|
+
return flags.map((flag) => `Flag: ${flag.label} \u2014 ${flag.excerpt}`);
|
|
167
|
+
}
|
|
168
|
+
/** `<n> flag(s): <label>, <label>`, or an empty string with no flags. */
|
|
169
|
+
export function summarizeApprovalFlags(flags) {
|
|
170
|
+
if (flags.length === 0)
|
|
171
|
+
return '';
|
|
172
|
+
const labels = flags.map((flag) => flag.label).join(', ');
|
|
173
|
+
return `${flags.length} flag${flags.length === 1 ? '' : 's'}: ${labels}`;
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=digest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"digest.js","sourceRoot":"","sources":["../../../src/core/spec/digest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The single root-relative exclusion predicate shared by hashing and linting.
|
|
3
|
+
* `relPath` is a project-folder-relative POSIX path such as `.run/done/1` or
|
|
4
|
+
* `plan-prompt.md`. Nested runtime directories stay excluded, but a transient
|
|
5
|
+
* file is only transient at the change folder root.
|
|
6
|
+
*/
|
|
7
|
+
export declare function isExcludedChangePath(relPath: string): boolean;
|
|
8
|
+
export declare function normalizeTasksMd(content: string): string;
|
|
9
|
+
export declare function hashChangeFolder(folderPath: string): Promise<string>;
|
|
10
|
+
export declare function verifyFolderHash(folderPath: string, expectedHash: string): Promise<boolean>;
|
|
11
|
+
//# sourceMappingURL=hasher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hasher.d.ts","sourceRoot":"","sources":["../../../src/core/spec/hasher.ts"],"names":[],"mappings":"AAiBA;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAM7D;AAwBD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGxD;AAED,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAsB1E;AAED,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGjG"}
|