okstra 0.186.7 → 0.187.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.
Files changed (541) hide show
  1. package/README.md +1 -1
  2. package/dist/cli-registry.d.mts +88 -1
  3. package/dist/cli-registry.mjs +68 -111
  4. package/dist/cli-registry.mjs.map +1 -1
  5. package/dist/commands/execute/render-bundle.mjs +0 -1
  6. package/dist/commands/execute/render-bundle.mjs.map +1 -1
  7. package/dist/commands/execute/run.mjs +8 -3
  8. package/dist/commands/execute/run.mjs.map +1 -1
  9. package/dist/commands/lifecycle/check-project.mjs +1 -14
  10. package/dist/commands/lifecycle/check-project.mjs.map +1 -1
  11. package/dist/commands/lifecycle/config.mjs +38 -40
  12. package/dist/commands/lifecycle/config.mjs.map +1 -1
  13. package/dist/commands/lifecycle/doctor.d.mts +22 -7
  14. package/dist/commands/lifecycle/doctor.mjs +77 -49
  15. package/dist/commands/lifecycle/doctor.mjs.map +1 -1
  16. package/dist/commands/lifecycle/install.d.mts +12 -10
  17. package/dist/commands/lifecycle/install.mjs +104 -39
  18. package/dist/commands/lifecycle/install.mjs.map +1 -1
  19. package/dist/commands/lifecycle/paths.mjs +8 -3
  20. package/dist/commands/lifecycle/paths.mjs.map +1 -1
  21. package/dist/commands/lifecycle/preflight.mjs +2 -1
  22. package/dist/commands/lifecycle/preflight.mjs.map +1 -1
  23. package/dist/commands/lifecycle/setup.mjs +22 -36
  24. package/dist/commands/lifecycle/setup.mjs.map +1 -1
  25. package/dist/commands/lifecycle/uninstall.d.mts +4 -2
  26. package/dist/commands/lifecycle/uninstall.mjs +59 -15
  27. package/dist/commands/lifecycle/uninstall.mjs.map +1 -1
  28. package/dist/commands/memory/memory.mjs +7 -1
  29. package/dist/commands/memory/memory.mjs.map +1 -1
  30. package/dist/lib/helper-scripts.d.mts +1 -1
  31. package/dist/lib/helper-scripts.mjs +10 -18
  32. package/dist/lib/helper-scripts.mjs.map +1 -1
  33. package/dist/lib/host-config.d.mts +72 -0
  34. package/dist/lib/host-config.mjs +404 -0
  35. package/dist/lib/host-config.mjs.map +1 -0
  36. package/dist/lib/host-registry-client.d.mts +2 -2
  37. package/dist/lib/host-registry-client.mjs +0 -3
  38. package/dist/lib/host-registry-client.mjs.map +1 -1
  39. package/dist/lib/install-assets.d.mts +1 -0
  40. package/dist/lib/install-assets.mjs +4 -0
  41. package/dist/lib/install-assets.mjs.map +1 -1
  42. package/dist/lib/proc.d.mts +2 -0
  43. package/dist/lib/proc.mjs +12 -0
  44. package/dist/lib/proc.mjs.map +1 -1
  45. package/dist/lib/python-command.d.mts +2 -0
  46. package/dist/lib/python-command.mjs +52 -0
  47. package/dist/lib/python-command.mjs.map +1 -0
  48. package/dist/lib/python-helper.d.mts +2 -5
  49. package/dist/lib/python-helper.mjs +3 -52
  50. package/dist/lib/python-helper.mjs.map +1 -1
  51. package/dist/lib/runtime-payload.d.mts +23 -0
  52. package/dist/lib/runtime-payload.mjs +57 -0
  53. package/dist/lib/runtime-payload.mjs.map +1 -0
  54. package/dist/lib/types.d.mts +24 -13
  55. package/docs/architecture/storage-model.md +21 -5
  56. package/docs/architecture.md +37 -36
  57. package/docs/cli.md +55 -76
  58. package/docs/coding-rules.md +295 -0
  59. package/docs/container.md +10 -36
  60. package/docs/contributor-change-matrix.md +1 -1
  61. package/docs/for-ai/skills/okstra-code-review.md +0 -1
  62. package/docs/for-ai/skills/okstra-container-build.md +8 -41
  63. package/docs/for-ai/skills/okstra-inspect.md +4 -4
  64. package/docs/for-ai/skills/okstra-manager.md +2 -2
  65. package/docs/for-ai/skills/okstra-rollup.md +0 -1
  66. package/docs/for-ai/skills/okstra-run.md +3 -3
  67. package/docs/for-ai/skills/okstra-user-response.md +0 -1
  68. package/docs/performance-improvement-plan-v2.md +1 -1
  69. package/docs/project-structure-overview.md +62 -62
  70. package/docs/task-process/README.md +3 -3
  71. package/docs/task-process/common-flow.md +1 -1
  72. package/docs/task-process/error-analysis.md +3 -3
  73. package/docs/task-process/implementation-planning.md +3 -1
  74. package/docs/task-process/release-handoff.md +1 -1
  75. package/package.json +3 -2
  76. package/runtime/BUILD.json +2 -2
  77. package/runtime/agents/workers/claude-worker.md +6 -11
  78. package/runtime/agents/workers/report-writer-worker.md +1 -1
  79. package/runtime/bin/lib/okstra/cli.sh +4 -0
  80. package/runtime/bin/lib/okstra/globals.sh +2 -0
  81. package/runtime/bin/lib/okstra/interactive.sh +26 -173
  82. package/runtime/bin/lib/okstra/project-resolver.sh +23 -61
  83. package/runtime/bin/lib/okstra/usage.sh +3 -3
  84. package/runtime/bin/okstra-compact-reminder.sh +1 -5
  85. package/runtime/bin/okstra-error-log.py +19 -2
  86. package/runtime/bin/okstra-import-check.py +26 -0
  87. package/runtime/bin/okstra-inject-report-index.py +5 -4
  88. package/runtime/bin/okstra-provider-exec.py +22 -17
  89. package/runtime/bin/okstra-render-final-report.py +16 -6
  90. package/runtime/bin/okstra-render-report-views.py +25 -18
  91. package/runtime/bin/okstra-report-translate.py +30 -18
  92. package/runtime/bin/okstra-spawn-followups.py +4 -0
  93. package/runtime/bin/okstra-token-usage.py +3 -0
  94. package/runtime/bin/okstra.sh +4 -2
  95. package/runtime/bin/okstra_bootstrap.py +58 -0
  96. package/runtime/prompts/coding-preflight/overview.md +1 -1
  97. package/runtime/prompts/duties/planning-worker.md +1 -1
  98. package/runtime/prompts/launch.template.md +35 -9
  99. package/runtime/prompts/lead/convergence.md +96 -87
  100. package/runtime/prompts/lead/okstra-lead-contract.md +63 -12
  101. package/runtime/prompts/lead/plan-body-verification.md +65 -46
  102. package/runtime/prompts/lead/report-writer.md +34 -4
  103. package/runtime/prompts/lead/team-contract.md +4 -1
  104. package/runtime/prompts/profiles/_clarification-recommendation.md +2 -1
  105. package/runtime/prompts/profiles/_coding-conventions-preflight.md +1 -1
  106. package/runtime/prompts/profiles/_common-contract.md +3 -3
  107. package/runtime/prompts/profiles/_coverage-critic.md +1 -1
  108. package/runtime/prompts/profiles/_implementation-deliverable.md +2 -2
  109. package/runtime/prompts/profiles/_implementation-executor.md +3 -1
  110. package/runtime/prompts/profiles/_implementation-verifier.md +16 -2
  111. package/runtime/prompts/profiles/error-analysis.md +4 -3
  112. package/runtime/prompts/profiles/final-verification.md +2 -2
  113. package/runtime/prompts/profiles/implementation-planning.md +22 -17
  114. package/runtime/prompts/profiles/implementation.md +3 -2
  115. package/runtime/prompts/profiles/requirements-discovery.md +2 -1
  116. package/runtime/prompts/wizard/prompts.ko.json +29 -8
  117. package/runtime/python/okstra_ctl/__init__.py +6 -27
  118. package/runtime/python/okstra_ctl/adapters/hosts/claude-code/relay.md +4 -5
  119. package/runtime/python/okstra_ctl/adapters/hosts/codex/adapter.py +21 -2
  120. package/runtime/python/okstra_ctl/adapters/hosts/external/adapter.py +3 -12
  121. package/runtime/python/okstra_ctl/adapters/providers/antigravity/adapter.py +40 -22
  122. package/runtime/python/okstra_ctl/adapters/providers/claude/adapter.py +14 -21
  123. package/runtime/python/okstra_ctl/adapters/providers/codex/adapter.py +37 -20
  124. package/runtime/python/okstra_ctl/adapters/providers/grok/adapter.py +86 -14
  125. package/runtime/python/okstra_ctl/adapters/providers/kimi/adapter.py +12 -12
  126. package/runtime/python/okstra_ctl/adapters/runtime/cmux.py +4 -7
  127. package/runtime/python/okstra_ctl/agent/__init__.py +1 -0
  128. package/runtime/python/okstra_ctl/{agent_activity.py → agent/activity.py} +12 -1
  129. package/runtime/python/okstra_ctl/{agent_invocation.py → agent/invocation.py} +34 -5
  130. package/runtime/python/okstra_ctl/agent/prompt_cli/__init__.py +19 -0
  131. package/runtime/python/okstra_ctl/agent/prompt_cli/__main__.py +11 -0
  132. package/runtime/python/okstra_ctl/agent/prompt_cli/cli.py +215 -0
  133. package/runtime/python/okstra_ctl/agent/prompt_cli/dynamic_verifier.py +155 -0
  134. package/runtime/python/okstra_ctl/agent/prompt_cli/emit.py +66 -0
  135. package/runtime/python/okstra_ctl/agent/prompt_cli/inputs.py +138 -0
  136. package/runtime/python/okstra_ctl/agent/prompt_cli/materialize.py +408 -0
  137. package/runtime/python/okstra_ctl/agent/prompt_cli/results.py +197 -0
  138. package/runtime/python/okstra_ctl/agent/prompt_cli/run_identity.py +107 -0
  139. package/runtime/python/okstra_ctl/analysis_packet.py +47 -4
  140. package/runtime/python/okstra_ctl/approval_decisions.py +260 -8
  141. package/runtime/python/okstra_ctl/assignment_resolver.py +0 -12
  142. package/runtime/python/okstra_ctl/attempt_evidence.py +12 -24
  143. package/runtime/python/okstra_ctl/blocking_checks.py +251 -0
  144. package/runtime/python/okstra_ctl/brief_frontmatter.py +0 -7
  145. package/runtime/python/okstra_ctl/clarification_items/__init__.py +102 -0
  146. package/runtime/python/okstra_ctl/clarification_items/carry.py +224 -0
  147. package/runtime/python/okstra_ctl/clarification_items/dispositions.py +135 -0
  148. package/runtime/python/okstra_ctl/clarification_items/parsing.py +253 -0
  149. package/runtime/python/okstra_ctl/clarification_items/rows.py +115 -0
  150. package/runtime/python/okstra_ctl/clarification_items/scan.py +215 -0
  151. package/runtime/python/okstra_ctl/clarification_items/sidecars.py +211 -0
  152. package/runtime/python/okstra_ctl/cmux.py +38 -31
  153. package/runtime/python/okstra_ctl/code_review_target.py +163 -1
  154. package/runtime/python/okstra_ctl/conformance.py +23 -0
  155. package/runtime/python/okstra_ctl/container.py +38 -421
  156. package/runtime/python/okstra_ctl/context_cost.py +16 -2
  157. package/runtime/python/okstra_ctl/contract_graph_cli.py +7 -0
  158. package/runtime/python/okstra_ctl/convergence.py +101 -15
  159. package/runtime/python/okstra_ctl/convergence_critic_prompt.py +345 -0
  160. package/runtime/python/okstra_ctl/convergence_engine.py +382 -70
  161. package/runtime/python/okstra_ctl/convergence_store.py +5 -29
  162. package/runtime/python/okstra_ctl/design_prep.py +108 -12
  163. package/runtime/python/okstra_ctl/design_snapshot.py +11 -1
  164. package/runtime/python/okstra_ctl/design_surfaces.py +29 -2
  165. package/runtime/python/okstra_ctl/dispatch_core.py +102 -25
  166. package/runtime/python/okstra_ctl/dispatch_state.py +268 -39
  167. package/runtime/python/okstra_ctl/doctor_cli.py +48 -0
  168. package/runtime/python/okstra_ctl/domain/worker_exec.py +10 -5
  169. package/runtime/python/okstra_ctl/domain/worker_presentation.py +21 -1
  170. package/runtime/python/okstra_ctl/domain/worker_stream.py +52 -21
  171. package/runtime/python/okstra_ctl/domain/write_policy.py +219 -0
  172. package/runtime/python/okstra_ctl/entrypoints/hosts.py +9 -2
  173. package/runtime/python/okstra_ctl/error_log_core.py +1 -1
  174. package/runtime/python/okstra_ctl/error_report.py +14 -0
  175. package/runtime/python/okstra_ctl/error_zip.py +18 -2
  176. package/runtime/python/okstra_ctl/execution_identity.py +100 -7
  177. package/runtime/python/okstra_ctl/execution_manifest.py +67 -20
  178. package/runtime/python/okstra_ctl/execution_mutation_audit.py +90 -8
  179. package/runtime/python/okstra_ctl/final_report_paths.py +17 -0
  180. package/runtime/python/okstra_ctl/final_report_schema.py +90 -16
  181. package/runtime/python/okstra_ctl/git_reconcile.py +22 -2
  182. package/runtime/python/okstra_ctl/handoff.py +24 -1
  183. package/runtime/python/okstra_ctl/ids.py +6 -16
  184. package/runtime/python/okstra_ctl/implementation_direction.py +142 -33
  185. package/runtime/python/okstra_ctl/implementation_options.py +25 -11
  186. package/runtime/python/okstra_ctl/implementation_outcome.py +5 -2
  187. package/runtime/python/okstra_ctl/improvement_lenses.py +0 -14
  188. package/runtime/python/okstra_ctl/incremental_carry.py +69 -8
  189. package/runtime/python/okstra_ctl/incremental_scope.py +173 -12
  190. package/runtime/python/okstra_ctl/index.py +2 -2
  191. package/runtime/python/okstra_ctl/initial_prompt_materialization.py +48 -8
  192. package/runtime/python/okstra_ctl/interactive_cli.py +223 -0
  193. package/runtime/python/okstra_ctl/json_boundary.py +10 -0
  194. package/runtime/python/okstra_ctl/listing.py +0 -91
  195. package/runtime/python/okstra_ctl/locks.py +5 -19
  196. package/runtime/python/okstra_ctl/log_report.py +14 -0
  197. package/runtime/python/okstra_ctl/manager_cli.py +22 -3
  198. package/runtime/python/okstra_ctl/manager_launch.py +4 -8
  199. package/runtime/python/okstra_ctl/material.py +2 -2
  200. package/runtime/python/okstra_ctl/migrate.py +23 -1
  201. package/runtime/python/okstra_ctl/model_cli.py +19 -5
  202. package/runtime/python/okstra_ctl/model_discovery.py +46 -47
  203. package/runtime/python/okstra_ctl/model_io/__init__.py +1 -0
  204. package/runtime/python/okstra_ctl/model_io/lines.py +163 -0
  205. package/runtime/python/okstra_ctl/model_io/references.py +370 -0
  206. package/runtime/python/okstra_ctl/model_io/renderers.py +498 -0
  207. package/runtime/python/okstra_ctl/model_io_cli.py +30 -945
  208. package/runtime/python/okstra_ctl/model_pool.py +10 -6
  209. package/runtime/python/okstra_ctl/models.py +8 -8
  210. package/runtime/python/okstra_ctl/mutation_recovery.py +5 -63
  211. package/runtime/python/okstra_ctl/next_phase.py +121 -69
  212. package/runtime/python/okstra_ctl/pane_reclaim.py +23 -0
  213. package/runtime/python/okstra_ctl/pane_title.py +11 -8
  214. package/runtime/python/okstra_ctl/path_hints.py +36 -11
  215. package/runtime/python/okstra_ctl/paths.py +76 -8
  216. package/runtime/python/okstra_ctl/plan_items.py +132 -16
  217. package/runtime/python/okstra_ctl/plan_items_cli.py +486 -36
  218. package/runtime/python/okstra_ctl/plan_run_root.py +1 -1
  219. package/runtime/python/okstra_ctl/plan_validate_cli.py +51 -0
  220. package/runtime/python/okstra_ctl/plan_verify_cli.py +80 -0
  221. package/runtime/python/okstra_ctl/prepare_error.py +20 -0
  222. package/runtime/python/okstra_ctl/prior_planning.py +157 -0
  223. package/runtime/python/okstra_ctl/profile_show.py +18 -1
  224. package/runtime/python/okstra_ctl/project_setup_cli.py +140 -0
  225. package/runtime/python/okstra_ctl/recap.py +22 -1
  226. package/runtime/python/okstra_ctl/reconcile.py +84 -0
  227. package/runtime/python/okstra_ctl/registry/host_registry.py +18 -1
  228. package/runtime/python/okstra_ctl/render.py +98 -32
  229. package/runtime/python/okstra_ctl/render_final_report.py +3 -7
  230. package/runtime/python/okstra_ctl/report_assembly.py +297 -7
  231. package/runtime/python/okstra_ctl/report_contract.py +30 -7
  232. package/runtime/python/okstra_ctl/report_finalize.py +206 -15
  233. package/runtime/python/okstra_ctl/report_html/common.py +2 -2
  234. package/runtime/python/okstra_ctl/report_html/render.py +8 -12
  235. package/runtime/python/okstra_ctl/report_language.py +8 -4
  236. package/runtime/python/okstra_ctl/report_narrative.py +90 -3
  237. package/runtime/python/okstra_ctl/report_projections.py +8 -2
  238. package/runtime/python/okstra_ctl/report_synthesis_packet.py +258 -1
  239. package/runtime/python/okstra_ctl/report_translation.py +2 -35
  240. package/runtime/python/okstra_ctl/report_views.py +4 -22
  241. package/runtime/python/okstra_ctl/resolve_task_key.py +13 -0
  242. package/runtime/python/okstra_ctl/rollup.py +13 -0
  243. package/runtime/python/okstra_ctl/run.py +639 -138
  244. package/runtime/python/okstra_ctl/run_audit.py +13 -0
  245. package/runtime/python/okstra_ctl/run_index_row.py +0 -12
  246. package/runtime/python/okstra_ctl/seeding.py +21 -11
  247. package/runtime/python/okstra_ctl/sequence.py +1 -1
  248. package/runtime/python/okstra_ctl/session.py +64 -14
  249. package/runtime/python/okstra_ctl/set_work_status.py +18 -0
  250. package/runtime/python/okstra_ctl/stage_integrate.py +15 -1
  251. package/runtime/python/okstra_ctl/stage_ledger.py +1 -1
  252. package/runtime/python/okstra_ctl/stage_map.py +57 -11
  253. package/runtime/python/okstra_ctl/stage_map_cli.py +83 -0
  254. package/runtime/python/okstra_ctl/stage_map_view.py +65 -0
  255. package/runtime/python/okstra_ctl/stage_targets.py +3 -12
  256. package/runtime/python/okstra_ctl/task_list_cli.py +138 -0
  257. package/runtime/python/okstra_ctl/task_show_cli.py +66 -0
  258. package/runtime/python/okstra_ctl/task_target.py +4 -16
  259. package/runtime/python/okstra_ctl/team.py +49 -2
  260. package/runtime/python/okstra_ctl/time_report.py +17 -2
  261. package/runtime/python/okstra_ctl/usage_report.py +11 -0
  262. package/runtime/python/okstra_ctl/user_response.py +55 -218
  263. package/runtime/python/okstra_ctl/user_response_values.py +242 -0
  264. package/runtime/python/okstra_ctl/validation_contract.py +3 -0
  265. package/runtime/python/okstra_ctl/verification_target.py +68 -0
  266. package/runtime/python/okstra_ctl/wizard.py +457 -92
  267. package/runtime/python/okstra_ctl/worker_artifacts.py +75 -16
  268. package/runtime/python/okstra_ctl/worker_audit_check.py +22 -0
  269. package/runtime/python/okstra_ctl/worker_dispatch.py +21 -0
  270. package/runtime/python/okstra_ctl/worker_liveness.py +33 -0
  271. package/runtime/python/okstra_ctl/worker_prompt_body.py +15 -2
  272. package/runtime/python/okstra_ctl/worker_prompt_contract.py +98 -7
  273. package/runtime/python/okstra_ctl/worker_prompt_headers.py +24 -2
  274. package/runtime/python/okstra_ctl/worker_prompt_policy.py +18 -3
  275. package/runtime/python/okstra_ctl/worker_request.py +2 -1
  276. package/runtime/python/okstra_ctl/worker_runner.py +16 -9
  277. package/runtime/python/okstra_ctl/worker_state.py +16 -1
  278. package/runtime/python/okstra_ctl/workflow.py +18 -1
  279. package/runtime/python/okstra_ctl/worktree/__init__.py +92 -0
  280. package/runtime/python/okstra_ctl/worktree/cleanliness.py +89 -0
  281. package/runtime/python/okstra_ctl/worktree/decisions.py +127 -0
  282. package/runtime/python/okstra_ctl/worktree/git_ops.py +165 -0
  283. package/runtime/python/okstra_ctl/worktree/linking.py +249 -0
  284. package/runtime/python/okstra_ctl/worktree/naming.py +91 -0
  285. package/runtime/python/okstra_ctl/worktree/provision.py +385 -0
  286. package/runtime/python/okstra_ctl/worktree/sync_config.py +181 -0
  287. package/runtime/python/okstra_ctl/worktree_cli.py +75 -0
  288. package/runtime/python/okstra_ctl/worktree_lookup_cli.py +39 -0
  289. package/runtime/python/okstra_ctl/worktree_registry.py +7 -0
  290. package/runtime/python/okstra_ctl/worktree_status_cli.py +53 -0
  291. package/runtime/python/okstra_ctl/write_policy.py +90 -213
  292. package/runtime/python/okstra_project/__init__.py +0 -4
  293. package/runtime/python/okstra_project/dirs.py +2 -2
  294. package/runtime/python/okstra_project/phase_pointer.py +84 -0
  295. package/runtime/python/okstra_project/slug.py +24 -0
  296. package/runtime/python/okstra_project/state.py +22 -230
  297. package/runtime/python/okstra_token_usage/claude.py +9 -1
  298. package/runtime/python/okstra_token_usage/cli.py +3 -1
  299. package/runtime/python/okstra_token_usage/collect.py +71 -10
  300. package/runtime/python/okstra_token_usage/cursor.py +2 -0
  301. package/runtime/python/okstra_token_usage/grok.py +1 -5
  302. package/runtime/python/okstra_token_usage/paths.py +26 -0
  303. package/runtime/python/okstra_token_usage/pricing.py +19 -7
  304. package/runtime/schemas/convergence-critic-results-v1.0.schema.json +5 -0
  305. package/runtime/schemas/execution-manifest-v2.schema.json +10 -10
  306. package/runtime/schemas/final-report-v2.0.schema.json +9 -26
  307. package/runtime/schemas/final-report-v3.0.schema.json +173 -41
  308. package/runtime/schemas/report-narrative-v3.0.schema.json +3 -2
  309. package/runtime/skills/okstra-brief-gen/SKILL.md +35 -2
  310. package/runtime/skills/okstra-container-build/SKILL.md +16 -47
  311. package/runtime/skills/okstra-inspect/facets/history.md +1 -1
  312. package/runtime/skills/okstra-inspect/facets/status.md +7 -6
  313. package/runtime/skills/okstra-pr-gen/SKILL.md +1 -1
  314. package/runtime/skills/okstra-run/SKILL.md +7 -5
  315. package/runtime/templates/report-writer-prompt-preamble.md +1 -1
  316. package/runtime/templates/reports/brief.template.md +6 -2
  317. package/runtime/templates/reports/error-analysis-input.template.md +2 -0
  318. package/runtime/templates/reports/final-verification-input.template.md +2 -0
  319. package/runtime/templates/reports/implementation-input.template.md +7 -1
  320. package/runtime/templates/reports/implementation-planning-input.template.md +4 -0
  321. package/runtime/templates/reports/quick-input.template.md +2 -0
  322. package/runtime/templates/reports/release-handoff-input.template.md +6 -1
  323. package/runtime/templates/reports/report.js +20 -3
  324. package/runtime/templates/reports/schedule.template.md +2 -0
  325. package/runtime/templates/reports/settings.template.json +0 -10
  326. package/runtime/templates/reports/task-brief.template.md +3 -0
  327. package/runtime/templates/reports/user-response.template.md +7 -3
  328. package/runtime/validators/checks/fixtures-01.py +57 -0
  329. package/runtime/validators/checks/fixtures-02.py +565 -0
  330. package/runtime/validators/checks/runners-01.py +108 -0
  331. package/runtime/validators/checks/validate-assets-01.py +60 -0
  332. package/runtime/validators/checks/validate-prompt-metadata-01.py +261 -0
  333. package/runtime/validators/checks/validate-tasks-01.py +46 -0
  334. package/runtime/validators/checks/validate-tasks-02.py +85 -0
  335. package/runtime/validators/checks/validate-tasks-03.py +61 -0
  336. package/runtime/validators/checks/validate-tasks-04.py +118 -0
  337. package/runtime/validators/forbidden_actions.py +73 -3
  338. package/runtime/validators/lib/common.sh +5 -0
  339. package/runtime/validators/lib/fixtures.sh +7 -591
  340. package/runtime/validators/lib/paths.sh +13 -0
  341. package/runtime/validators/lib/runners.sh +6 -104
  342. package/runtime/validators/lib/summary.sh +1 -1
  343. package/runtime/validators/lib/validate-assets.sh +6 -56
  344. package/runtime/validators/lib/validate-prompt-metadata.sh +6 -257
  345. package/runtime/validators/lib/validate-tasks.sh +9 -294
  346. package/runtime/validators/validate-implementation-plan-stages.py +4 -4
  347. package/runtime/validators/validate-run.py +1369 -2654
  348. package/runtime/validators/validate-workflow.sh +56 -16
  349. package/runtime/validators/validate_improvement_report.py +2 -1
  350. package/runtime/validators/validate_session_conformance.py +295 -49
  351. package/dist/commands/execute/agent-prompt.d.mts +0 -1
  352. package/dist/commands/execute/agent-prompt.mjs +0 -24
  353. package/dist/commands/execute/agent-prompt.mjs.map +0 -1
  354. package/dist/commands/execute/codex-dispatch.d.mts +0 -3
  355. package/dist/commands/execute/codex-dispatch.mjs +0 -6
  356. package/dist/commands/execute/codex-dispatch.mjs.map +0 -1
  357. package/dist/commands/execute/codex-run.d.mts +0 -3
  358. package/dist/commands/execute/codex-run.mjs +0 -62
  359. package/dist/commands/execute/codex-run.mjs.map +0 -1
  360. package/dist/commands/execute/convergence.d.mts +0 -1
  361. package/dist/commands/execute/convergence.mjs +0 -38
  362. package/dist/commands/execute/convergence.mjs.map +0 -1
  363. package/dist/commands/execute/error-log.d.mts +0 -1
  364. package/dist/commands/execute/error-log.mjs +0 -18
  365. package/dist/commands/execute/error-log.mjs.map +0 -1
  366. package/dist/commands/execute/git-reconcile.d.mts +0 -1
  367. package/dist/commands/execute/git-reconcile.mjs +0 -30
  368. package/dist/commands/execute/git-reconcile.mjs.map +0 -1
  369. package/dist/commands/execute/handoff.d.mts +0 -1
  370. package/dist/commands/execute/handoff.mjs +0 -31
  371. package/dist/commands/execute/handoff.mjs.map +0 -1
  372. package/dist/commands/execute/incremental-carry.d.mts +0 -1
  373. package/dist/commands/execute/incremental-carry.mjs +0 -20
  374. package/dist/commands/execute/incremental-carry.mjs.map +0 -1
  375. package/dist/commands/execute/incremental-scope.d.mts +0 -1
  376. package/dist/commands/execute/incremental-scope.mjs +0 -29
  377. package/dist/commands/execute/incremental-scope.mjs.map +0 -1
  378. package/dist/commands/execute/integrate-stages.d.mts +0 -1
  379. package/dist/commands/execute/integrate-stages.mjs +0 -24
  380. package/dist/commands/execute/integrate-stages.mjs.map +0 -1
  381. package/dist/commands/execute/pane-title.d.mts +0 -1
  382. package/dist/commands/execute/pane-title.mjs +0 -20
  383. package/dist/commands/execute/pane-title.mjs.map +0 -1
  384. package/dist/commands/execute/plan-items.d.mts +0 -1
  385. package/dist/commands/execute/plan-items.mjs +0 -9
  386. package/dist/commands/execute/plan-items.mjs.map +0 -1
  387. package/dist/commands/execute/plan-validate.d.mts +0 -1
  388. package/dist/commands/execute/plan-validate.mjs +0 -68
  389. package/dist/commands/execute/plan-validate.mjs.map +0 -1
  390. package/dist/commands/execute/plan-verify.d.mts +0 -1
  391. package/dist/commands/execute/plan-verify.mjs +0 -43
  392. package/dist/commands/execute/plan-verify.mjs.map +0 -1
  393. package/dist/commands/execute/spawn-followups.d.mts +0 -1
  394. package/dist/commands/execute/spawn-followups.mjs +0 -22
  395. package/dist/commands/execute/spawn-followups.mjs.map +0 -1
  396. package/dist/commands/execute/team.d.mts +0 -3
  397. package/dist/commands/execute/team.mjs +0 -66
  398. package/dist/commands/execute/team.mjs.map +0 -1
  399. package/dist/commands/execute/token-usage.d.mts +0 -1
  400. package/dist/commands/execute/token-usage.mjs +0 -19
  401. package/dist/commands/execute/token-usage.mjs.map +0 -1
  402. package/dist/commands/execute/worker-audit-check.d.mts +0 -1
  403. package/dist/commands/execute/worker-audit-check.mjs +0 -34
  404. package/dist/commands/execute/worker-audit-check.mjs.map +0 -1
  405. package/dist/commands/execute/worker-dispatch.d.mts +0 -7
  406. package/dist/commands/execute/worker-dispatch.mjs +0 -64
  407. package/dist/commands/execute/worker-dispatch.mjs.map +0 -1
  408. package/dist/commands/execute/worker-state.d.mts +0 -1
  409. package/dist/commands/execute/worker-state.mjs +0 -28
  410. package/dist/commands/execute/worker-state.mjs.map +0 -1
  411. package/dist/commands/execute/worktree-lookup.d.mts +0 -1
  412. package/dist/commands/execute/worktree-lookup.mjs +0 -92
  413. package/dist/commands/execute/worktree-lookup.mjs.map +0 -1
  414. package/dist/commands/execute/worktree-status.d.mts +0 -1
  415. package/dist/commands/execute/worktree-status.mjs +0 -121
  416. package/dist/commands/execute/worktree-status.mjs.map +0 -1
  417. package/dist/commands/inspect/code-review.d.mts +0 -1
  418. package/dist/commands/inspect/code-review.mjs +0 -32
  419. package/dist/commands/inspect/code-review.mjs.map +0 -1
  420. package/dist/commands/inspect/container.d.mts +0 -1
  421. package/dist/commands/inspect/container.mjs +0 -25
  422. package/dist/commands/inspect/container.mjs.map +0 -1
  423. package/dist/commands/inspect/context-cost.d.mts +0 -1
  424. package/dist/commands/inspect/context-cost.mjs +0 -25
  425. package/dist/commands/inspect/context-cost.mjs.map +0 -1
  426. package/dist/commands/inspect/design-prep.d.mts +0 -1
  427. package/dist/commands/inspect/design-prep.mjs +0 -22
  428. package/dist/commands/inspect/design-prep.mjs.map +0 -1
  429. package/dist/commands/inspect/error-report.d.mts +0 -1
  430. package/dist/commands/inspect/error-report.mjs +0 -25
  431. package/dist/commands/inspect/error-report.mjs.map +0 -1
  432. package/dist/commands/inspect/error-zip.d.mts +0 -1
  433. package/dist/commands/inspect/error-zip.mjs +0 -24
  434. package/dist/commands/inspect/error-zip.mjs.map +0 -1
  435. package/dist/commands/inspect/log-report.d.mts +0 -1
  436. package/dist/commands/inspect/log-report.mjs +0 -26
  437. package/dist/commands/inspect/log-report.mjs.map +0 -1
  438. package/dist/commands/inspect/model-io.d.mts +0 -1
  439. package/dist/commands/inspect/model-io.mjs +0 -25
  440. package/dist/commands/inspect/model-io.mjs.map +0 -1
  441. package/dist/commands/inspect/profile-show.d.mts +0 -1
  442. package/dist/commands/inspect/profile-show.mjs +0 -28
  443. package/dist/commands/inspect/profile-show.mjs.map +0 -1
  444. package/dist/commands/inspect/recap.d.mts +0 -1
  445. package/dist/commands/inspect/recap.mjs +0 -30
  446. package/dist/commands/inspect/recap.mjs.map +0 -1
  447. package/dist/commands/inspect/resolve-task-key.d.mts +0 -1
  448. package/dist/commands/inspect/resolve-task-key.mjs +0 -24
  449. package/dist/commands/inspect/resolve-task-key.mjs.map +0 -1
  450. package/dist/commands/inspect/rollup.d.mts +0 -1
  451. package/dist/commands/inspect/rollup.mjs +0 -25
  452. package/dist/commands/inspect/rollup.mjs.map +0 -1
  453. package/dist/commands/inspect/run-audit.d.mts +0 -1
  454. package/dist/commands/inspect/run-audit.mjs +0 -25
  455. package/dist/commands/inspect/run-audit.mjs.map +0 -1
  456. package/dist/commands/inspect/set-work-status.d.mts +0 -1
  457. package/dist/commands/inspect/set-work-status.mjs +0 -29
  458. package/dist/commands/inspect/set-work-status.mjs.map +0 -1
  459. package/dist/commands/inspect/stage-map.d.mts +0 -1
  460. package/dist/commands/inspect/stage-map.mjs +0 -131
  461. package/dist/commands/inspect/stage-map.mjs.map +0 -1
  462. package/dist/commands/inspect/task-list.d.mts +0 -1
  463. package/dist/commands/inspect/task-list.mjs +0 -149
  464. package/dist/commands/inspect/task-list.mjs.map +0 -1
  465. package/dist/commands/inspect/task-show.d.mts +0 -1
  466. package/dist/commands/inspect/task-show.mjs +0 -108
  467. package/dist/commands/inspect/task-show.mjs.map +0 -1
  468. package/dist/commands/inspect/time-report.d.mts +0 -1
  469. package/dist/commands/inspect/time-report.mjs +0 -24
  470. package/dist/commands/inspect/time-report.mjs.map +0 -1
  471. package/dist/commands/inspect/usage-report.d.mts +0 -1
  472. package/dist/commands/inspect/usage-report.mjs +0 -23
  473. package/dist/commands/inspect/usage-report.mjs.map +0 -1
  474. package/dist/commands/inspect/user-response.d.mts +0 -1
  475. package/dist/commands/inspect/user-response.mjs +0 -35
  476. package/dist/commands/inspect/user-response.mjs.map +0 -1
  477. package/dist/commands/inspect/worker-liveness.d.mts +0 -1
  478. package/dist/commands/inspect/worker-liveness.mjs +0 -45
  479. package/dist/commands/inspect/worker-liveness.mjs.map +0 -1
  480. package/dist/commands/lifecycle/contract-check.d.mts +0 -1
  481. package/dist/commands/lifecycle/contract-check.mjs +0 -18
  482. package/dist/commands/lifecycle/contract-check.mjs.map +0 -1
  483. package/dist/commands/lifecycle/migrate.d.mts +0 -1
  484. package/dist/commands/lifecycle/migrate.mjs +0 -30
  485. package/dist/commands/lifecycle/migrate.mjs.map +0 -1
  486. package/dist/commands/lifecycle/model.d.mts +0 -1
  487. package/dist/commands/lifecycle/model.mjs +0 -22
  488. package/dist/commands/lifecycle/model.mjs.map +0 -1
  489. package/dist/commands/manager.d.mts +0 -3
  490. package/dist/commands/manager.mjs +0 -50
  491. package/dist/commands/manager.mjs.map +0 -1
  492. package/dist/commands/report/agent-activity.d.mts +0 -1
  493. package/dist/commands/report/agent-activity.mjs +0 -20
  494. package/dist/commands/report/agent-activity.mjs.map +0 -1
  495. package/dist/commands/report/approval-decision.d.mts +0 -1
  496. package/dist/commands/report/approval-decision.mjs +0 -21
  497. package/dist/commands/report/approval-decision.mjs.map +0 -1
  498. package/dist/commands/report/design-snapshot.d.mts +0 -1
  499. package/dist/commands/report/design-snapshot.mjs +0 -19
  500. package/dist/commands/report/design-snapshot.mjs.map +0 -1
  501. package/dist/commands/report/finalize.d.mts +0 -4
  502. package/dist/commands/report/finalize.mjs +0 -64
  503. package/dist/commands/report/finalize.mjs.map +0 -1
  504. package/dist/commands/report/inject-report-index.d.mts +0 -1
  505. package/dist/commands/report/inject-report-index.mjs +0 -21
  506. package/dist/commands/report/inject-report-index.mjs.map +0 -1
  507. package/dist/commands/report/render-final-report.d.mts +0 -1
  508. package/dist/commands/report/render-final-report.mjs +0 -23
  509. package/dist/commands/report/render-final-report.mjs.map +0 -1
  510. package/dist/commands/report/render-views.d.mts +0 -1
  511. package/dist/commands/report/render-views.mjs +0 -27
  512. package/dist/commands/report/render-views.mjs.map +0 -1
  513. package/dist/commands/report/translate.d.mts +0 -1
  514. package/dist/commands/report/translate.mjs +0 -33
  515. package/dist/commands/report/translate.mjs.map +0 -1
  516. package/runtime/bin/lib/okstra/tmux-pane.sh +0 -40
  517. package/runtime/bin/lib/okstra-ctl/cmd-batch.sh +0 -59
  518. package/runtime/bin/lib/okstra-ctl/cmd-list.sh +0 -35
  519. package/runtime/bin/lib/okstra-ctl/cmd-open.sh +0 -36
  520. package/runtime/bin/lib/okstra-ctl/cmd-projects.sh +0 -26
  521. package/runtime/bin/lib/okstra-ctl/cmd-reconcile.sh +0 -29
  522. package/runtime/bin/lib/okstra-ctl/cmd-reindex.sh +0 -38
  523. package/runtime/bin/lib/okstra-ctl/cmd-rerun.sh +0 -345
  524. package/runtime/bin/lib/okstra-ctl/cmd-show.sh +0 -27
  525. package/runtime/bin/lib/okstra-ctl/cmd-tail.sh +0 -92
  526. package/runtime/bin/lib/okstra-ctl/main.sh +0 -41
  527. package/runtime/bin/lib/okstra-ctl/prepare.sh +0 -31
  528. package/runtime/bin/lib/okstra-ctl/usage.sh +0 -23
  529. package/runtime/bin/okstra-central.sh +0 -152
  530. package/runtime/bin/okstra-incremental-carry.py +0 -10
  531. package/runtime/bin/okstra-incremental-scope.py +0 -10
  532. package/runtime/bin/okstra-team-reconcile.sh +0 -36
  533. package/runtime/python/okstra_ctl/agent_prompt_cli.py +0 -1156
  534. package/runtime/python/okstra_ctl/batch.py +0 -60
  535. package/runtime/python/okstra_ctl/clarification_items.py +0 -1050
  536. package/runtime/python/okstra_ctl/container_registry.py +0 -72
  537. package/runtime/python/okstra_ctl/improvement_assignment.py +0 -61
  538. package/runtime/python/okstra_ctl/resolver.py +0 -54
  539. package/runtime/python/okstra_ctl/team_reconcile.py +0 -275
  540. package/runtime/python/okstra_ctl/tmux.py +0 -134
  541. package/runtime/python/okstra_ctl/worktree.py +0 -1099
@@ -1,21 +0,0 @@
1
- import { runInstalledScript } from "../../lib/python-helper.mjs";
2
- const USAGE = `okstra inject-report-index — add the top-of-report Index + scroll anchors to a report
3
-
4
- Wraps the python helper (\`okstra-inject-report-index.py\`) installed under
5
- \`~/.okstra/bin/\` so skills call \`okstra inject-report-index\` instead of
6
- emitting a \`python3 "$HOME/..."\` invocation (which breaks \`Bash(okstra:*)\`
7
- permission matching and prompts on every call).
8
-
9
- Usage:
10
- okstra inject-report-index <markdown-path> [--report-language <en|ko>]
11
-
12
- All arguments are forwarded verbatim to the python helper.
13
- `;
14
- export async function run(args) {
15
- return runInstalledScript({
16
- scriptName: "okstra-inject-report-index.py",
17
- args,
18
- usage: USAGE,
19
- });
20
- }
21
- //# sourceMappingURL=inject-report-index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"inject-report-index.mjs","sourceRoot":"","sources":["../../../src/commands/report/inject-report-index.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,MAAM,KAAK,GAAG;;;;;;;;;;;CAWb,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAuB;IAC/C,OAAO,kBAAkB,CAAC;QACxB,UAAU,EAAE,+BAA+B;QAC3C,IAAI;QACJ,KAAK,EAAE,KAAK;KACb,CAAC,CAAC;AACL,CAAC"}
@@ -1 +0,0 @@
1
- export declare function run(args: readonly string[]): Promise<number>;
@@ -1,23 +0,0 @@
1
- import { runInstalledScript } from "../../lib/python-helper.mjs";
2
- const USAGE = `okstra render-final-report — render the full reading copy sibling of final-report data.json
3
-
4
- Wraps the python helper (\`okstra-render-final-report.py\`) installed under
5
- \`~/.okstra/bin/\` so skills call \`okstra render-final-report\` instead of
6
- emitting a \`python3 "$HOME/..."\` invocation (which breaks \`Bash(okstra:*)\`
7
- permission matching and prompts on every call).
8
-
9
- Usage:
10
- okstra render-final-report <path-to-final-report.data.json>
11
-
12
- The argument is forwarded verbatim to the Python helper. schemaVersion 1.0
13
- keeps the legacy Markdown template; schemaVersion 2.0 selects the full reading
14
- copy template. Human HTML is rendered separately from the same data.json.
15
- `;
16
- export async function run(args) {
17
- return runInstalledScript({
18
- scriptName: "okstra-render-final-report.py",
19
- args,
20
- usage: USAGE,
21
- });
22
- }
23
- //# sourceMappingURL=render-final-report.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"render-final-report.mjs","sourceRoot":"","sources":["../../../src/commands/report/render-final-report.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,MAAM,KAAK,GAAG;;;;;;;;;;;;;CAab,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAuB;IAC/C,OAAO,kBAAkB,CAAC;QACxB,UAAU,EAAE,+BAA+B;QAC3C,IAAI;QACJ,KAAK,EAAE,KAAK;KACb,CAAC,CAAC;AACL,CAAC"}
@@ -1 +0,0 @@
1
- export declare function run(args: readonly string[]): Promise<number>;
@@ -1,27 +0,0 @@
1
- import { runInstalledScript } from "../../lib/python-helper.mjs";
2
- const USAGE = `okstra render-views — render the self-contained HTML view of a final-report
3
-
4
- A thin spawn shim over \`scripts/okstra-render-report-views.py\` (installed
5
- at \`$HOME/.okstra/bin/okstra-render-report-views.py\`). Resolves the final-
6
- report data and Markdown pair, then writes a single sibling:
7
-
8
- <stem>.html — single-file self-contained human view; schema v2 is
9
- always generated, while v1/quick remains conditional
10
-
11
- Usage:
12
- okstra render-views <path-to-final-report.data.json|path-to-final-report.md>
13
- [--task-key <key>] [--task-type <type>] [--seq <NNN>]
14
- [--source-report <project-relative-path>]
15
-
16
- Schema v2 data is rendered directly into its task-specific HTML view and is
17
- always generated. Schema v1 and quick reports keep the legacy conditional
18
- Markdown view. Optional flags override inferred report metadata.
19
- `;
20
- export async function run(args) {
21
- return runInstalledScript({
22
- scriptName: "okstra-render-report-views.py",
23
- args,
24
- usage: USAGE,
25
- });
26
- }
27
- //# sourceMappingURL=render-views.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"render-views.mjs","sourceRoot":"","sources":["../../../src/commands/report/render-views.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;CAiBb,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAuB;IAC/C,OAAO,kBAAkB,CAAC;QACxB,UAAU,EAAE,+BAA+B;QAC3C,IAAI;QACJ,KAAK,EAAE,KAAK;KACb,CAAC,CAAC;AACL,CAAC"}
@@ -1 +0,0 @@
1
- export declare function run(args: readonly string[]): Promise<number>;
@@ -1,33 +0,0 @@
1
- import { runInstalledScript } from "../../lib/python-helper.mjs";
2
- const USAGE = `okstra report-translate — build and verify a final-report translation sidecar
3
-
4
- A thin spawn shim over \`scripts/okstra-report-translate.py\` (installed at
5
- \`$HOME/.okstra/bin/okstra-report-translate.py\`).
6
-
7
- The final-report data.json is authored in English and stays the SSOT. When the
8
- resolved report language is not English, Phase 7 dispatches a translator that
9
- writes a sidecar beside the report; \`render-views\` overlays it so only the
10
- human HTML is localized.
11
-
12
- Usage:
13
- okstra report-translate extract <path-to-final-report.data.json>
14
- okstra report-translate source --run-manifest <path>
15
- okstra report-translate write --run-manifest <path> --source-digest <sha256> --translations <markdown>
16
- okstra report-translate check-data --run-manifest <path>
17
- Write <stem>.translation-source.json — every pointer the report holds a
18
- translatable string at, paired with its English text. The translator
19
- fills in the values, so a sidecar cannot cite a path the report lacks.
20
-
21
- okstra report-translate check <path-to-final-report.i18n.<lang>.json>
22
- Resolve every pointer in a filled sidecar against the report it names
23
- and report what is still English. Exits non-zero on a pointer that
24
- resolves nowhere — the translator's own gate before it returns.
25
- `;
26
- export async function run(args) {
27
- return runInstalledScript({
28
- scriptName: "okstra-report-translate.py",
29
- args,
30
- usage: USAGE,
31
- });
32
- }
33
- //# sourceMappingURL=translate.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"translate.mjs","sourceRoot":"","sources":["../../../src/commands/report/translate.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;CAuBb,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAuB;IAC/C,OAAO,kBAAkB,CAAC;QACxB,UAAU,EAAE,4BAA4B;QACxC,IAAI;QACJ,KAAK,EAAE,KAAK;KACb,CAAC,CAAC;AACL,CAAC"}
@@ -1,40 +0,0 @@
1
- #!/usr/bin/env bash
2
- # Resolve the tmux pane that the CURRENT process actually runs in.
3
- #
4
- # Why this exists: Claude Code's Bash tool strips $TMUX and $TMUX_PANE, so a
5
- # bare `tmux display-message -p '#{pane_id}'` does NOT return the caller's pane
6
- # — it returns the pane of the most-recently-active tmux *client*, which (when
7
- # the user has several attached sessions) is frequently a DIFFERENT session
8
- # than the one the okstra run lives in. Earlier trace-pane fixes all trusted
9
- # `display-message` and therefore mis-placed (or dropped) the tail pane.
10
- #
11
- # This resolver instead walks the process's own ancestor PIDs and matches them
12
- # against the tmux server's pane_pids. That is deterministic and correct
13
- # regardless of $TMUX/$TMUX_PANE or which client is active: when the process is
14
- # a descendant of a tmux pane's shell it finds exactly that pane; when it is not
15
- # inside any tmux pane (e.g. Claude launched from the macOS GUI app) no ancestor
16
- # matches and the function prints nothing.
17
- #
18
- # Usage: pane="$(okstra_resolve_caller_pane)" # empty => not in a tmux pane
19
- # Optional arg: a starting PID (defaults to $$) — used by the regression test.
20
- # bash 3.2 safe (no associative arrays).
21
- okstra_resolve_caller_pane() {
22
- command -v tmux >/dev/null 2>&1 || return 0
23
- local panes
24
- panes="$(tmux list-panes -a -F '#{pane_pid} #{pane_id}' 2>/dev/null)" || return 0
25
- [ -n "$panes" ] || return 0
26
-
27
- local pid="${1:-$$}"
28
- local depth=0
29
- local hit
30
- while [ -n "$pid" ] && [ "$pid" != "0" ] && [ "$depth" -lt 16 ]; do
31
- hit="$(printf '%s\n' "$panes" | awk -v p="$pid" '$1==p {print $2; exit}')"
32
- if [ -n "$hit" ]; then
33
- printf '%s\n' "$hit"
34
- return 0
35
- fi
36
- pid="$(ps -o ppid= -p "$pid" 2>/dev/null | tr -d ' ')"
37
- depth=$((depth + 1))
38
- done
39
- return 0
40
- }
@@ -1,59 +0,0 @@
1
- # shellcheck shell=bash
2
-
3
- _okstra_ctl_batch() {
4
- if [[ $# -lt 1 ]]; then
5
- printf 'batch: missing subcommand (list|status)\n' >&2; exit 2
6
- fi
7
- local sub="$1"; shift
8
- case "$sub" in
9
- list)
10
- OKSTRA_HOME_RESOLVED="$(okstra_central_home)" python3 - <<'PY'
11
- import json, os
12
- from pathlib import Path
13
- home = Path(os.environ["OKSTRA_HOME_RESOLVED"])
14
- batches = sorted((home / "batches").glob("*.json"))
15
- print(f"{'BATCH-ID':<24} {'CREATED':<22} {'SPAWNED':>7} {'SKIPPED':>7}")
16
- for b in batches:
17
- m = json.loads(b.read_text())
18
- s = m.get("summary", {})
19
- print(f"{m['batchId']:<24} {m['createdAt']:<22} "
20
- f"{s.get('spawned', 0):>7} {s.get('skipped', 0):>7}")
21
- PY
22
- ;;
23
- status)
24
- if [[ $# -lt 1 ]]; then
25
- printf 'batch status: missing <batch-id>\n' >&2; exit 2
26
- fi
27
- OKSTRA_HOME_RESOLVED="$(okstra_central_home)" \
28
- OKSTRA_CTL_LIB_DIR="$SCRIPT_DIR" \
29
- OK_BID="$1" python3 - <<'PY'
30
- import json, os, sys
31
- sys.path.insert(0, os.environ["OKSTRA_CTL_LIB_DIR"])
32
- from pathlib import Path
33
- from okstra_ctl import find_row_by_run_id
34
- home = Path(os.environ["OKSTRA_HOME_RESOLVED"])
35
- target = home / "batches" / f"{os.environ['OK_BID']}.json"
36
- if not target.is_file():
37
- print(f"batch: not found: {os.environ['OK_BID']}", file=sys.stderr); sys.exit(2)
38
- m = json.loads(target.read_text())
39
- print(f"batchId : {m['batchId']}")
40
- print(f"createdAt : {m['createdAt']}")
41
- print(f"summary : {m['summary']}")
42
- print()
43
- print(f"{'SPAWN':<10} {'LIVE':<11} {'NEW-RUN-ID':<55} {'SESSION-NAME'}")
44
- for it in m["items"]:
45
- spawn_status = it["status"]
46
- new_run_id = it.get("newRunId") or "-"
47
- # 현재 인덱스(active+recent+archive)에서 live 상태를 조회한다.
48
- live = "-"
49
- if it.get("newRunId"):
50
- live_row = find_row_by_run_id(home, it["newRunId"])
51
- if live_row is not None:
52
- live = live_row.get("status", "-")
53
- print(f"{spawn_status:<10} {live:<11} "
54
- f"{new_run_id:<55} {it.get('sessionName') or '-'}")
55
- PY
56
- ;;
57
- *) printf 'batch: unknown subcommand: %s\n' "$sub" >&2; exit 2 ;;
58
- esac
59
- }
@@ -1,35 +0,0 @@
1
- # shellcheck shell=bash
2
-
3
- _okstra_ctl_list() {
4
- local project="all" task_group="all" status="all" since="" limit="0"
5
- local include_archive="false"
6
- while [[ $# -gt 0 ]]; do
7
- case "$1" in
8
- --project) project="$2"; shift 2 ;;
9
- --task-group) task_group="$2"; shift 2 ;;
10
- --status) status="$2"; shift 2 ;;
11
- --since) since="$2"; shift 2 ;;
12
- --limit) limit="$2"; shift 2 ;;
13
- --include-archive) include_archive="true"; shift ;;
14
- *) printf 'list: unknown option: %s\n' "$1" >&2; exit 2 ;;
15
- esac
16
- done
17
- OKSTRA_HOME_RESOLVED="$(okstra_central_home)" \
18
- OKSTRA_CTL_LIB_DIR="$SCRIPT_DIR" \
19
- OK_PROJECT="$project" OK_TG="$task_group" OK_STATUS="$status" \
20
- OK_SINCE="$since" OK_LIMIT="$limit" OK_ARC="$include_archive" \
21
- python3 - <<'PY'
22
- import os, sys
23
- sys.path.insert(0, os.environ["OKSTRA_CTL_LIB_DIR"])
24
- from pathlib import Path
25
- from okstra_ctl import list_runs, format_runs_table
26
- rows = list_runs(
27
- Path(os.environ["OKSTRA_HOME_RESOLVED"]),
28
- project=os.environ["OK_PROJECT"], task_group=os.environ["OK_TG"],
29
- status=os.environ["OK_STATUS"], since=os.environ["OK_SINCE"],
30
- limit=int(os.environ["OK_LIMIT"]),
31
- include_archive=os.environ["OK_ARC"] == "true",
32
- )
33
- print(format_runs_table(rows), end="")
34
- PY
35
- }
@@ -1,36 +0,0 @@
1
- # shellcheck shell=bash
2
-
3
- _okstra_ctl_open() {
4
- if [[ $# -lt 1 ]]; then
5
- printf 'open: missing <runId-or-prefix>\n' >&2; exit 2
6
- fi
7
- local resolved
8
- resolved="$(OKSTRA_HOME_RESOLVED="$(okstra_central_home)" \
9
- OKSTRA_CTL_LIB_DIR="$SCRIPT_DIR" \
10
- OK_QUERY="$1" python3 - <<'PY'
11
- import os, sys
12
- sys.path.insert(0, os.environ["OKSTRA_CTL_LIB_DIR"])
13
- from pathlib import Path
14
- from okstra_ctl import resolve_run_id, find_row_by_run_id, absolute_final_report_path, ResolveError
15
- home = Path(os.environ["OKSTRA_HOME_RESOLVED"])
16
- try:
17
- rid = resolve_run_id(home, os.environ["OK_QUERY"])
18
- except ResolveError as e:
19
- print(f"open: {e}", file=sys.stderr); sys.exit(2)
20
- row = find_row_by_run_id(home, rid)
21
- abs_path = absolute_final_report_path(row) if row else None
22
- if abs_path is None or not abs_path.is_file():
23
- print(f"open: final report not found", file=sys.stderr); sys.exit(2)
24
- print(str(abs_path))
25
- PY
26
- )"
27
- if [[ -z "$resolved" ]]; then exit 2; fi
28
- # $EDITOR 가 설정되어 있으면 그것으로 열고, 없으면 경로만 출력한다.
29
- # EDITOR 는 보통 'code -w' 처럼 인자를 포함할 수 있어 단어 분리해
30
- # exec 해야 한다(따옴표 안에 두면 단일 명령어로 잘못 해석됨).
31
- if [[ -n "${EDITOR:-}" ]]; then
32
- # shellcheck disable=SC2086
33
- exec ${EDITOR} "$resolved"
34
- fi
35
- printf '%s\n' "$resolved"
36
- }
@@ -1,26 +0,0 @@
1
- # shellcheck shell=bash
2
-
3
- _okstra_ctl_projects() {
4
- local sort_by="recent" only_active="false"
5
- while [[ $# -gt 0 ]]; do
6
- case "$1" in
7
- --sort) sort_by="$2"; shift 2 ;;
8
- --active) only_active="true"; shift ;;
9
- *) printf 'projects: unknown option: %s\n' "$1" >&2; exit 2 ;;
10
- esac
11
- done
12
- OKSTRA_HOME_RESOLVED="$(okstra_central_home)" \
13
- OKSTRA_CTL_LIB_DIR="$SCRIPT_DIR" \
14
- OKSTRA_SORT_BY="$sort_by" \
15
- OKSTRA_ONLY_ACTIVE="$only_active" \
16
- python3 - <<'PY'
17
- import os, sys
18
- sys.path.insert(0, os.environ["OKSTRA_CTL_LIB_DIR"])
19
- from pathlib import Path
20
- from okstra_ctl import list_projects, format_projects_table
21
- items = list_projects(Path(os.environ["OKSTRA_HOME_RESOLVED"]),
22
- only_active=os.environ["OKSTRA_ONLY_ACTIVE"] == "true",
23
- sort_by=os.environ["OKSTRA_SORT_BY"])
24
- print(format_projects_table(items), end="")
25
- PY
26
- }
@@ -1,29 +0,0 @@
1
- # shellcheck shell=bash
2
-
3
- _okstra_ctl_reconcile() {
4
- # `okstra-ctl reconcile [--project <id|all>]`. dispatcher 가 이미 호출한
5
- # _okstra_ctl_prepare 의 reconcile 은 unscoped 이므로, 여기서는 사용자
6
- # --project 필터를 적용해 한 번 더 호출한다.
7
- local project="all"
8
- while [[ $# -gt 0 ]]; do
9
- case "$1" in
10
- --project) project="$2"; shift 2 ;;
11
- *) printf 'reconcile: unknown option: %s\n' "$1" >&2; exit 2 ;;
12
- esac
13
- done
14
- OKSTRA_HOME_RESOLVED="$(okstra_central_home)" \
15
- OKSTRA_CTL_LIB_DIR="$SCRIPT_DIR" \
16
- OK_PROJECT="$project" \
17
- python3 - <<'PY'
18
- import os, sys
19
- sys.path.insert(0, os.environ["OKSTRA_CTL_LIB_DIR"])
20
- from pathlib import Path
21
- from okstra_ctl import reconcile_active, reconcile_recent
22
- target = os.environ["OK_PROJECT"]
23
- home = Path(os.environ["OKSTRA_HOME_RESOLVED"])
24
- scope = None if target == "all" else target
25
- reconcile_active(home, project=scope)
26
- reconcile_recent(home, project=scope)
27
- PY
28
- printf 'reconcile complete\n'
29
- }
@@ -1,38 +0,0 @@
1
- # shellcheck shell=bash
2
-
3
- _okstra_ctl_reindex() {
4
- local project="all"
5
- while [[ $# -gt 0 ]]; do
6
- case "$1" in
7
- --project) project="$2"; shift 2 ;;
8
- *) printf 'reindex: unknown option: %s\n' "$1" >&2; exit 2 ;;
9
- esac
10
- done
11
- OKSTRA_HOME_RESOLVED="$(okstra_central_home)" \
12
- OKSTRA_CTL_LIB_DIR="$SCRIPT_DIR" \
13
- OK_PROJECT="$project" \
14
- python3 - <<'PY'
15
- import os, sys
16
- sys.path.insert(0, os.environ["OKSTRA_CTL_LIB_DIR"])
17
- from pathlib import Path
18
- from okstra_ctl import (discover_project_roots, backfill_project,
19
- mark_backfilled, central_lock)
20
- home = Path(os.environ["OKSTRA_HOME_RESOLVED"])
21
- target = os.environ["OK_PROJECT"]
22
- total = 0
23
- # 중앙 락으로 보호 — record_start/reconcile 와 같은 lock 위에서 직렬화하여
24
- # projects/<id>/meta.json 의 read-modify-write 가 손실되지 않게 한다.
25
- with central_lock(home):
26
- # 신규 모델: discover_project_roots 는 ~/.okstra/projects/*/meta.json 을
27
- # 스캔한다(과거 examples/projects/*.conf.sh 모델 폐기).
28
- for pid, root in discover_project_roots(home):
29
- if target != "all" and pid != target:
30
- continue
31
- n = backfill_project(home, pid, Path(root))
32
- print(f"{pid}: {n} new run(s) backfilled")
33
- total += n
34
- if target == "all":
35
- mark_backfilled(home)
36
- print(f"total: {total}")
37
- PY
38
- }