@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,194 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { CLAUDE_PLAN_COMMAND_PATH } from '../foundation/init-blocks.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 whose living spec file does not exist. */
|
|
160
|
+
async function unknownCapabilityFlags(input) {
|
|
161
|
+
const flags = [];
|
|
162
|
+
const ordered = [...input.capabilities].sort((a, b) => compareText(a.name, b.name));
|
|
163
|
+
for (const capability of ordered) {
|
|
164
|
+
const specPath = path.join(input.projectRoot, input.openspecRoot, 'specs', capability.name, 'spec.md');
|
|
165
|
+
const exists = await fs
|
|
166
|
+
.stat(specPath)
|
|
167
|
+
.then(() => true)
|
|
168
|
+
.catch(() => false);
|
|
169
|
+
if (!exists) {
|
|
170
|
+
flags.push({
|
|
171
|
+
id: 'unknown_capability',
|
|
172
|
+
label: `unknown capability ${capability.name}`,
|
|
173
|
+
excerpt: `no living spec at ${input.openspecRoot}/specs/${capability.name}/spec.md`,
|
|
174
|
+
});
|
|
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
|
+
...(await 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,42 @@
|
|
|
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
|
+
}
|
|
22
|
+
export interface ApprovalDigest {
|
|
23
|
+
readonly change: string;
|
|
24
|
+
readonly goal: string;
|
|
25
|
+
readonly tasks: readonly ApprovalDigestTask[];
|
|
26
|
+
readonly capabilities: readonly ApprovalDigestCapability[];
|
|
27
|
+
readonly humanSteps: string;
|
|
28
|
+
readonly flags: readonly ApprovalFlag[];
|
|
29
|
+
}
|
|
30
|
+
/** Collapse every whitespace run, including newlines, to one space. */
|
|
31
|
+
export declare function collapseWhitespace(text: string): string;
|
|
32
|
+
/** The first two sentences of a goal, whitespace-collapsed. */
|
|
33
|
+
export declare function firstTwoSentences(goal: string): string;
|
|
34
|
+
/** Summarize a change from its authored files into the approval digest. */
|
|
35
|
+
export declare function buildApprovalDigest(projectRoot: string, changeFolder: string, config: OsqConfig): Promise<ApprovalDigest>;
|
|
36
|
+
/** Render the digest body, without flags. */
|
|
37
|
+
export declare function formatApprovalDigest(digest: ApprovalDigest): string;
|
|
38
|
+
/** One `Flag: <label> — <excerpt>` line per flag. */
|
|
39
|
+
export declare function formatApprovalFlags(flags: readonly ApprovalFlag[]): string[];
|
|
40
|
+
/** `<n> flag(s): <label>, <label>`, or an empty string with no flags. */
|
|
41
|
+
export declare function summarizeApprovalFlags(flags: readonly ApprovalFlag[]): string;
|
|
42
|
+
//# 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;AAazD,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;CACrC;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,CA+CzB;AAED,6CAA6C;AAC7C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CA0BnE;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,170 @@
|
|
|
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 { buildApprovalFlags } from './digest-flags.js';
|
|
6
|
+
import { extractSection, parseFrontmatter, parseSpecMd, parseTaskMd, resolveChangeDoc, } from './parser.js';
|
|
7
|
+
function compareText(a, b) {
|
|
8
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
9
|
+
}
|
|
10
|
+
function compareTaskNumbers(a, b) {
|
|
11
|
+
const numA = Number.parseInt(a, 10);
|
|
12
|
+
const numB = Number.parseInt(b, 10);
|
|
13
|
+
if (!Number.isNaN(numA) && !Number.isNaN(numB) && numA !== numB)
|
|
14
|
+
return numA - numB;
|
|
15
|
+
return compareText(a, b);
|
|
16
|
+
}
|
|
17
|
+
/** Collapse every whitespace run, including newlines, to one space. */
|
|
18
|
+
export function collapseWhitespace(text) {
|
|
19
|
+
return text.replace(/\s+/g, ' ').trim();
|
|
20
|
+
}
|
|
21
|
+
/** The first two sentences of a goal, whitespace-collapsed. */
|
|
22
|
+
export function firstTwoSentences(goal) {
|
|
23
|
+
const collapsed = collapseWhitespace(goal);
|
|
24
|
+
if (collapsed === '')
|
|
25
|
+
return '';
|
|
26
|
+
return collapsed
|
|
27
|
+
.split(/(?<=[.!?])\s+/)
|
|
28
|
+
.slice(0, 2)
|
|
29
|
+
.join(' ');
|
|
30
|
+
}
|
|
31
|
+
function isTestPath(relativePath) {
|
|
32
|
+
return relativePath === 'tests' || relativePath.startsWith('tests/');
|
|
33
|
+
}
|
|
34
|
+
async function resolveTasks(projectRoot, changeFolder) {
|
|
35
|
+
const tasksDir = path.join(changeFolder, 'tasks');
|
|
36
|
+
const files = (await fs.readdir(tasksDir).catch(() => []))
|
|
37
|
+
.filter((entry) => entry.endsWith('.md'))
|
|
38
|
+
.sort((a, b) => compareTaskNumbers(a.replace(/\.md$/, ''), b.replace(/\.md$/, '')));
|
|
39
|
+
const tasks = [];
|
|
40
|
+
for (const file of files) {
|
|
41
|
+
const content = await fs.readFile(path.join(tasksDir, file), 'utf8');
|
|
42
|
+
const task = parseTaskMd(content);
|
|
43
|
+
const entries = task.scope.length > 0 ? await resolveScope(projectRoot, task.scope) : [];
|
|
44
|
+
tasks.push({
|
|
45
|
+
number: file.replace(/\.md$/, ''),
|
|
46
|
+
title: task.title,
|
|
47
|
+
verify: task.verify,
|
|
48
|
+
verifyStarts: task.verifyStarts,
|
|
49
|
+
scope: task.scope,
|
|
50
|
+
testsModify: task.testsModify,
|
|
51
|
+
entries,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
return tasks;
|
|
55
|
+
}
|
|
56
|
+
async function readCapabilities(changeFolder) {
|
|
57
|
+
const specsDir = path.join(changeFolder, 'specs');
|
|
58
|
+
let entries = [];
|
|
59
|
+
try {
|
|
60
|
+
entries = await fs.readdir(specsDir, { withFileTypes: true });
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return [];
|
|
64
|
+
}
|
|
65
|
+
const names = entries
|
|
66
|
+
.filter((entry) => entry.isDirectory())
|
|
67
|
+
.map((entry) => entry.name)
|
|
68
|
+
.sort(compareText);
|
|
69
|
+
const capabilities = [];
|
|
70
|
+
for (const name of names) {
|
|
71
|
+
const content = await fs
|
|
72
|
+
.readFile(path.join(specsDir, name, 'spec.md'), 'utf8')
|
|
73
|
+
.catch(() => null);
|
|
74
|
+
if (content !== null)
|
|
75
|
+
capabilities.push({ name, delta: parseDelta(content) });
|
|
76
|
+
}
|
|
77
|
+
return capabilities;
|
|
78
|
+
}
|
|
79
|
+
/** Summarize a change from its authored files into the approval digest. */
|
|
80
|
+
export async function buildApprovalDigest(projectRoot, changeFolder, config) {
|
|
81
|
+
const resolvedDoc = await resolveChangeDoc(changeFolder);
|
|
82
|
+
const content = resolvedDoc ? await fs.readFile(resolvedDoc.path, 'utf8') : '';
|
|
83
|
+
const spec = parseSpecMd(content);
|
|
84
|
+
const body = resolvedDoc ? parseFrontmatter(content).body : '';
|
|
85
|
+
const tasks = await resolveTasks(projectRoot, changeFolder);
|
|
86
|
+
const changeCapabilities = await readCapabilities(changeFolder);
|
|
87
|
+
const capabilities = changeCapabilities.map(({ name, delta }) => ({
|
|
88
|
+
name,
|
|
89
|
+
added: delta.added.map((requirement) => requirement.name),
|
|
90
|
+
modified: delta.modified.map((requirement) => requirement.name),
|
|
91
|
+
removed: delta.removed.map((requirement) => requirement.name),
|
|
92
|
+
}));
|
|
93
|
+
const flagTasks = tasks.map((task) => ({
|
|
94
|
+
number: task.number,
|
|
95
|
+
verify: task.verify,
|
|
96
|
+
verifyStarts: task.verifyStarts,
|
|
97
|
+
scope: task.scope,
|
|
98
|
+
paths: task.entries.map((entry) => entry.relativePath),
|
|
99
|
+
}));
|
|
100
|
+
const flags = await buildApprovalFlags({
|
|
101
|
+
projectRoot,
|
|
102
|
+
openspecRoot: config.paths.openspecRoot,
|
|
103
|
+
proposalVerify: spec.verify,
|
|
104
|
+
tasks: flagTasks,
|
|
105
|
+
capabilities,
|
|
106
|
+
});
|
|
107
|
+
return {
|
|
108
|
+
change: path.basename(changeFolder),
|
|
109
|
+
goal: firstTwoSentences(spec.goal),
|
|
110
|
+
tasks: tasks.map((task) => {
|
|
111
|
+
const existing = task.entries.filter((entry) => entry.absolutePath !== null);
|
|
112
|
+
return {
|
|
113
|
+
number: task.number,
|
|
114
|
+
title: task.title,
|
|
115
|
+
scopeFiles: existing.length,
|
|
116
|
+
testsModify: task.testsModify,
|
|
117
|
+
existingTests: existing
|
|
118
|
+
.map((entry) => entry.relativePath)
|
|
119
|
+
.filter(isTestPath)
|
|
120
|
+
.sort(compareText),
|
|
121
|
+
};
|
|
122
|
+
}),
|
|
123
|
+
capabilities,
|
|
124
|
+
humanSteps: extractSection(body, 'Human steps'),
|
|
125
|
+
flags,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
/** Render the digest body, without flags. */
|
|
129
|
+
export function formatApprovalDigest(digest) {
|
|
130
|
+
const lines = [`Change: ${digest.change}`];
|
|
131
|
+
if (digest.goal)
|
|
132
|
+
lines.push(`Goal: ${digest.goal}`);
|
|
133
|
+
lines.push('Tasks:');
|
|
134
|
+
for (const task of digest.tasks) {
|
|
135
|
+
const suffix = task.scopeFiles === 1 ? 'scope file' : 'scope files';
|
|
136
|
+
lines.push(` ${task.number}. ${task.title} (${task.scopeFiles} ${suffix})`);
|
|
137
|
+
if (task.testsModify) {
|
|
138
|
+
const tests = task.existingTests.length > 0 ? task.existingTests.join(', ') : '(none)';
|
|
139
|
+
lines.push(` tests.modify: existing tests in scope: ${tests}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
lines.push('Capabilities:');
|
|
143
|
+
if (digest.capabilities.length === 0)
|
|
144
|
+
lines.push(' (none)');
|
|
145
|
+
for (const capability of digest.capabilities) {
|
|
146
|
+
lines.push(` ${capability.name}:`);
|
|
147
|
+
for (const kind of ['added', 'modified', 'removed']) {
|
|
148
|
+
const names = capability[kind];
|
|
149
|
+
lines.push(` ${kind}: ${names.length > 0 ? names.join(', ') : '(none)'}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
if (digest.humanSteps) {
|
|
153
|
+
lines.push('Human steps:');
|
|
154
|
+
for (const line of digest.humanSteps.split('\n'))
|
|
155
|
+
lines.push(` ${line.trim()}`);
|
|
156
|
+
}
|
|
157
|
+
return lines.join('\n');
|
|
158
|
+
}
|
|
159
|
+
/** One `Flag: <label> — <excerpt>` line per flag. */
|
|
160
|
+
export function formatApprovalFlags(flags) {
|
|
161
|
+
return flags.map((flag) => `Flag: ${flag.label} \u2014 ${flag.excerpt}`);
|
|
162
|
+
}
|
|
163
|
+
/** `<n> flag(s): <label>, <label>`, or an empty string with no flags. */
|
|
164
|
+
export function summarizeApprovalFlags(flags) {
|
|
165
|
+
if (flags.length === 0)
|
|
166
|
+
return '';
|
|
167
|
+
const labels = flags.map((flag) => flag.label).join(', ');
|
|
168
|
+
return `${flags.length} flag${flags.length === 1 ? '' : 's'}: ${labels}`;
|
|
169
|
+
}
|
|
170
|
+
//# 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"}
|
|
@@ -1,20 +1,44 @@
|
|
|
1
1
|
import crypto from 'node:crypto';
|
|
2
2
|
import fs from 'node:fs/promises';
|
|
3
3
|
import path from 'node:path';
|
|
4
|
+
/**
|
|
5
|
+
* Directory or metadata names excluded from every authored-content view of a
|
|
6
|
+
* change folder, at any depth. These mirror the runtime state the engine owns
|
|
7
|
+
* rather than the author's specification.
|
|
8
|
+
*/
|
|
9
|
+
const CHANGE_FOLDER_EXCLUDED_SEGMENTS = new Set(['.run', '.git', '.DS_Store']);
|
|
10
|
+
/**
|
|
11
|
+
* Transient files owned by the engine at a change folder's root only. A nested
|
|
12
|
+
* file with the same name is authored content and stays covered.
|
|
13
|
+
*/
|
|
14
|
+
const CHANGE_FOLDER_TRANSIENT_FILES = new Set(['plan-prompt.md']);
|
|
15
|
+
/**
|
|
16
|
+
* The single root-relative exclusion predicate shared by hashing and linting.
|
|
17
|
+
* `relPath` is a project-folder-relative POSIX path such as `.run/done/1` or
|
|
18
|
+
* `plan-prompt.md`. Nested runtime directories stay excluded, but a transient
|
|
19
|
+
* file is only transient at the change folder root.
|
|
20
|
+
*/
|
|
21
|
+
export function isExcludedChangePath(relPath) {
|
|
22
|
+
const normalized = relPath.replace(/\\/g, '/');
|
|
23
|
+
if (CHANGE_FOLDER_TRANSIENT_FILES.has(normalized)) {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
return normalized.split('/').some((segment) => CHANGE_FOLDER_EXCLUDED_SEGMENTS.has(segment));
|
|
27
|
+
}
|
|
4
28
|
async function collectFiles(dir, baseDir) {
|
|
5
29
|
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
6
30
|
const files = [];
|
|
7
31
|
for (const entry of entries) {
|
|
8
|
-
|
|
32
|
+
const fullPath = path.join(dir, entry.name);
|
|
33
|
+
const relPath = path.relative(baseDir, fullPath).replace(/\\/g, '/');
|
|
34
|
+
if (isExcludedChangePath(relPath)) {
|
|
9
35
|
continue;
|
|
10
36
|
}
|
|
11
|
-
const fullPath = path.join(dir, entry.name);
|
|
12
37
|
if (entry.isDirectory()) {
|
|
13
38
|
const nested = await collectFiles(fullPath, baseDir);
|
|
14
39
|
files.push(...nested);
|
|
15
40
|
}
|
|
16
41
|
else if (entry.isFile()) {
|
|
17
|
-
const relPath = path.relative(baseDir, fullPath).replace(/\\/g, '/');
|
|
18
42
|
files.push(relPath);
|
|
19
43
|
}
|
|
20
44
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hasher.js","sourceRoot":"","sources":["../../../src/core/spec/hasher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { OsqConfig } from '../foundation/config.js';
|
|
2
|
+
import { OPENSPEC_EXPECTED_VERSION } from './openspec-version.js';
|
|
3
|
+
export { OPENSPEC_EXPECTED_VERSION };
|
|
4
|
+
/** Prefix applied to every finding surfaced by the OpenSpec validator. */
|
|
5
|
+
export declare const OPENSPEC_ERROR_PREFIX = "openspec:";
|
|
6
|
+
export interface LintLogger {
|
|
7
|
+
info(msg: string): void;
|
|
8
|
+
verbose(msg: string): void;
|
|
9
|
+
warn(msg: string): void;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* The outcome of analyzing one verify command. Every field is derived without
|
|
13
|
+
* executing or shell-expanding the command.
|
|
14
|
+
*/
|
|
15
|
+
export interface VerifyCommandAnalysis {
|
|
16
|
+
/** The command is the template sentinel or a normalized equivalent. */
|
|
17
|
+
readonly placeholder: boolean;
|
|
18
|
+
/** The recognized package script name, when the command invokes one. */
|
|
19
|
+
readonly packageScript: string | null;
|
|
20
|
+
/** The recognized package script name that the root manifest lacks. */
|
|
21
|
+
readonly missingScript: string | null;
|
|
22
|
+
/** No existing repository path and no recognized package script was named. */
|
|
23
|
+
readonly unresolved: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Analyze one verify command read-only: detect the template sentinel, resolve a
|
|
27
|
+
* recognized package script against the root manifest, or fall back to an
|
|
28
|
+
* unresolved-target warning when no existing path or script is named.
|
|
29
|
+
*/
|
|
30
|
+
export declare function analyzeVerifyCommand(projectRoot: string, command: string, packageScripts: ReadonlySet<string>): Promise<VerifyCommandAnalysis>;
|
|
31
|
+
export interface LintResult {
|
|
32
|
+
readonly valid: boolean;
|
|
33
|
+
readonly errors: string[];
|
|
34
|
+
readonly warnings: string[];
|
|
35
|
+
}
|
|
36
|
+
export interface LintOptions {
|
|
37
|
+
readonly logger?: LintLogger;
|
|
38
|
+
}
|
|
39
|
+
export interface OpenSpecFindings {
|
|
40
|
+
readonly errors: string[];
|
|
41
|
+
readonly warnings: string[];
|
|
42
|
+
}
|
|
43
|
+
export interface OpenSpecValidationOutcome extends OpenSpecFindings {
|
|
44
|
+
readonly ran: boolean;
|
|
45
|
+
readonly bin: string | null;
|
|
46
|
+
readonly version: string | null;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Resolves the project-local OpenSpec binary. Only a binary inside the
|
|
50
|
+
* project's own `node_modules/.bin` (or an explicitly configured absolute
|
|
51
|
+
* path) is used; missing installs resolve to `null` so linting degrades
|
|
52
|
+
* gracefully rather than failing on projects without OpenSpec.
|
|
53
|
+
*/
|
|
54
|
+
export declare function resolveOpenSpecBin(projectRoot: string, config: OsqConfig): Promise<string | null>;
|
|
55
|
+
/** Reads the resolved `@fission-ai/openspec` version from the local install. */
|
|
56
|
+
export declare function resolveOpenSpecVersion(projectRoot: string): Promise<string | null>;
|
|
57
|
+
/**
|
|
58
|
+
* Tolerantly extracts validation findings from `openspec validate --json`.
|
|
59
|
+
* Accepts a top-level array or an object exposing `issues`/`errors`/`warnings`
|
|
60
|
+
* (or similar) and classifies each finding by its error/warning severity.
|
|
61
|
+
*/
|
|
62
|
+
export declare function parseOpenSpecFindings(output: string): OpenSpecFindings;
|
|
63
|
+
/**
|
|
64
|
+
* Runs the local OpenSpec validator for changes and specs. Validation failures
|
|
65
|
+
* are returned prefixed with `openspec:`. A missing binary or a version outside
|
|
66
|
+
* the declared peer range is an error that cites ADR 004 and the install
|
|
67
|
+
* command; a version inside the range that differs from the pin warns and cites
|
|
68
|
+
* ADR 005. Linting fails closed rather than silently degrading.
|
|
69
|
+
*/
|
|
70
|
+
export declare function validateWithOpenSpec(projectRoot: string, config: OsqConfig, options?: LintOptions): Promise<OpenSpecValidationOutcome>;
|
|
71
|
+
/**
|
|
72
|
+
* Verifies that every delta operation targeting a requirement resolves against
|
|
73
|
+
* the living base spec at `openspec/specs/<capability>/spec.md`. Applying the
|
|
74
|
+
* delta through the deterministic merge engine reports unmatched MODIFIED,
|
|
75
|
+
* REMOVED, or RENAMED targets; ADDED-only deltas may create a new capability.
|
|
76
|
+
*/
|
|
77
|
+
export declare function verifyDeltaTargets(projectRoot: string, folderPath: string, config: OsqConfig): Promise<string[]>;
|
|
78
|
+
export declare function lintChangeFolder(projectRoot: string, folderPath: string, config: OsqConfig, options?: LintOptions): Promise<LintResult>;
|
|
79
|
+
//# sourceMappingURL=linter.d.ts.map
|