okstra 0.174.0 → 0.176.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 +18 -9
- package/bin/okstra +8 -4
- package/dist/cli-registry.d.mts +16 -0
- package/dist/cli-registry.mjs +560 -0
- package/dist/cli-registry.mjs.map +1 -0
- package/dist/commands/execute/agent-prompt.d.mts +1 -0
- package/{src → dist}/commands/execute/agent-prompt.mjs +10 -11
- package/dist/commands/execute/agent-prompt.mjs.map +1 -0
- package/dist/commands/execute/codex-dispatch.d.mts +3 -0
- package/dist/commands/execute/codex-dispatch.mjs +6 -0
- package/dist/commands/execute/codex-dispatch.mjs.map +1 -0
- package/dist/commands/execute/codex-run.d.mts +3 -0
- package/{src → dist}/commands/execute/codex-run.mjs +30 -37
- package/dist/commands/execute/codex-run.mjs.map +1 -0
- package/dist/commands/execute/convergence.d.mts +1 -0
- package/{src → dist}/commands/execute/convergence.mjs +15 -16
- package/dist/commands/execute/convergence.mjs.map +1 -0
- package/dist/commands/execute/error-log.d.mts +1 -0
- package/{src → dist}/commands/execute/error-log.mjs +2 -3
- package/dist/commands/execute/error-log.mjs.map +1 -0
- package/dist/commands/execute/git-reconcile.d.mts +1 -0
- package/{src → dist}/commands/execute/git-reconcile.mjs +10 -11
- package/dist/commands/execute/git-reconcile.mjs.map +1 -0
- package/dist/commands/execute/handoff.d.mts +1 -0
- package/{src → dist}/commands/execute/handoff.mjs +10 -11
- package/dist/commands/execute/handoff.mjs.map +1 -0
- package/dist/commands/execute/incremental-carry.d.mts +1 -0
- package/{src → dist}/commands/execute/incremental-carry.mjs +2 -3
- package/dist/commands/execute/incremental-carry.mjs.map +1 -0
- package/dist/commands/execute/incremental-scope.d.mts +1 -0
- package/{src → dist}/commands/execute/incremental-scope.mjs +2 -3
- package/dist/commands/execute/incremental-scope.mjs.map +1 -0
- package/dist/commands/execute/integrate-stages.d.mts +1 -0
- package/{src → dist}/commands/execute/integrate-stages.mjs +10 -11
- package/dist/commands/execute/integrate-stages.mjs.map +1 -0
- package/dist/commands/execute/pane-title.d.mts +1 -0
- package/dist/commands/execute/pane-title.mjs +20 -0
- package/dist/commands/execute/pane-title.mjs.map +1 -0
- package/dist/commands/execute/plan-items.d.mts +1 -0
- package/dist/commands/execute/plan-items.mjs +9 -0
- package/dist/commands/execute/plan-items.mjs.map +1 -0
- package/dist/commands/execute/plan-validate.d.mts +1 -0
- package/dist/commands/execute/plan-validate.mjs +68 -0
- package/dist/commands/execute/plan-validate.mjs.map +1 -0
- package/dist/commands/execute/plan-verify.d.mts +1 -0
- package/{src → dist}/commands/execute/plan-verify.mjs +13 -16
- package/dist/commands/execute/plan-verify.mjs.map +1 -0
- package/dist/commands/execute/render-bundle.d.mts +3 -0
- package/{src → dist}/commands/execute/render-bundle.mjs +65 -61
- package/dist/commands/execute/render-bundle.mjs.map +1 -0
- package/dist/commands/execute/run.d.mts +24 -0
- package/dist/commands/execute/run.mjs +196 -0
- package/dist/commands/execute/run.mjs.map +1 -0
- package/dist/commands/execute/spawn-followups.d.mts +1 -0
- package/{src → dist}/commands/execute/spawn-followups.mjs +6 -7
- package/dist/commands/execute/spawn-followups.mjs.map +1 -0
- package/dist/commands/execute/team.d.mts +3 -0
- package/{src → dist}/commands/execute/team.mjs +29 -36
- package/dist/commands/execute/team.mjs.map +1 -0
- package/dist/commands/execute/token-usage.d.mts +1 -0
- package/{src → dist}/commands/execute/token-usage.mjs +2 -3
- package/dist/commands/execute/token-usage.mjs.map +1 -0
- package/dist/commands/execute/wizard.d.mts +8 -0
- package/dist/commands/execute/wizard.mjs +191 -0
- package/dist/commands/execute/wizard.mjs.map +1 -0
- package/dist/commands/execute/worker-audit-check.d.mts +1 -0
- package/{src → dist}/commands/execute/worker-audit-check.mjs +11 -12
- package/dist/commands/execute/worker-audit-check.mjs.map +1 -0
- package/dist/commands/execute/worker-dispatch.d.mts +7 -0
- package/{src → dist}/commands/execute/worker-dispatch.mjs +34 -46
- package/dist/commands/execute/worker-dispatch.mjs.map +1 -0
- package/dist/commands/execute/worker-state.d.mts +1 -0
- package/{src → dist}/commands/execute/worker-state.mjs +15 -16
- package/dist/commands/execute/worker-state.mjs.map +1 -0
- package/dist/commands/execute/worktree-lookup.d.mts +1 -0
- package/{src → dist}/commands/execute/worktree-lookup.mjs +38 -37
- package/dist/commands/execute/worktree-lookup.mjs.map +1 -0
- package/dist/commands/execute/worktree-status.d.mts +1 -0
- package/{src → dist}/commands/execute/worktree-status.mjs +52 -46
- package/dist/commands/execute/worktree-status.mjs.map +1 -0
- package/dist/commands/inspect/code-review.d.mts +1 -0
- package/{src → dist}/commands/inspect/code-review.mjs +16 -19
- package/dist/commands/inspect/code-review.mjs.map +1 -0
- package/dist/commands/inspect/container.d.mts +1 -0
- package/{src → dist}/commands/inspect/container.mjs +11 -13
- package/dist/commands/inspect/container.mjs.map +1 -0
- package/dist/commands/inspect/context-cost.d.mts +1 -0
- package/{src → dist}/commands/inspect/context-cost.mjs +11 -13
- package/dist/commands/inspect/context-cost.mjs.map +1 -0
- package/dist/commands/inspect/design-prep.d.mts +1 -0
- package/{src → dist}/commands/inspect/design-prep.mjs +10 -11
- package/dist/commands/inspect/design-prep.mjs.map +1 -0
- package/dist/commands/inspect/error-report.d.mts +1 -0
- package/{src → dist}/commands/inspect/error-report.mjs +11 -13
- package/dist/commands/inspect/error-report.mjs.map +1 -0
- package/dist/commands/inspect/error-zip.d.mts +1 -0
- package/{src → dist}/commands/inspect/error-zip.mjs +11 -12
- package/dist/commands/inspect/error-zip.mjs.map +1 -0
- package/dist/commands/inspect/log-report.d.mts +1 -0
- package/{src → dist}/commands/inspect/log-report.mjs +11 -13
- package/dist/commands/inspect/log-report.mjs.map +1 -0
- package/dist/commands/inspect/profile-show.d.mts +1 -0
- package/{src → dist}/commands/inspect/profile-show.mjs +10 -11
- package/dist/commands/inspect/profile-show.mjs.map +1 -0
- package/dist/commands/inspect/recap.d.mts +1 -0
- package/{src → dist}/commands/inspect/recap.mjs +11 -13
- package/dist/commands/inspect/recap.mjs.map +1 -0
- package/dist/commands/inspect/resolve-task-key.d.mts +1 -0
- package/{src → dist}/commands/inspect/resolve-task-key.mjs +11 -13
- package/dist/commands/inspect/resolve-task-key.mjs.map +1 -0
- package/dist/commands/inspect/rollup.d.mts +1 -0
- package/{src → dist}/commands/inspect/rollup.mjs +11 -13
- package/dist/commands/inspect/rollup.mjs.map +1 -0
- package/dist/commands/inspect/run-audit.d.mts +1 -0
- package/{src → dist}/commands/inspect/run-audit.mjs +11 -12
- package/dist/commands/inspect/run-audit.mjs.map +1 -0
- package/dist/commands/inspect/set-work-status.d.mts +1 -0
- package/{src → dist}/commands/inspect/set-work-status.mjs +11 -13
- package/dist/commands/inspect/set-work-status.mjs.map +1 -0
- package/dist/commands/inspect/stage-map.d.mts +1 -0
- package/dist/commands/inspect/stage-map.mjs +110 -0
- package/dist/commands/inspect/stage-map.mjs.map +1 -0
- package/dist/commands/inspect/task-list.d.mts +1 -0
- package/dist/commands/inspect/task-list.mjs +103 -0
- package/dist/commands/inspect/task-list.mjs.map +1 -0
- package/dist/commands/inspect/task-show.d.mts +1 -0
- package/dist/commands/inspect/task-show.mjs +108 -0
- package/dist/commands/inspect/task-show.mjs.map +1 -0
- package/dist/commands/inspect/time-report.d.mts +1 -0
- package/{src → dist}/commands/inspect/time-report.mjs +11 -13
- package/dist/commands/inspect/time-report.mjs.map +1 -0
- package/dist/commands/inspect/usage-report.d.mts +1 -0
- package/{src → dist}/commands/inspect/usage-report.mjs +11 -13
- package/dist/commands/inspect/usage-report.mjs.map +1 -0
- package/dist/commands/inspect/user-response.d.mts +1 -0
- package/{src → dist}/commands/inspect/user-response.mjs +10 -11
- package/dist/commands/inspect/user-response.mjs.map +1 -0
- package/dist/commands/inspect/worker-liveness.d.mts +1 -0
- package/{src → dist}/commands/inspect/worker-liveness.mjs +11 -13
- package/dist/commands/inspect/worker-liveness.mjs.map +1 -0
- package/dist/commands/lifecycle/check-project.d.mts +21 -0
- package/dist/commands/lifecycle/check-project.mjs +175 -0
- package/dist/commands/lifecycle/check-project.mjs.map +1 -0
- package/dist/commands/lifecycle/config.d.mts +1 -0
- package/dist/commands/lifecycle/config.mjs +369 -0
- package/dist/commands/lifecycle/config.mjs.map +1 -0
- package/dist/commands/lifecycle/doctor.d.mts +10 -0
- package/dist/commands/lifecycle/doctor.mjs +317 -0
- package/dist/commands/lifecycle/doctor.mjs.map +1 -0
- package/dist/commands/lifecycle/install.d.mts +17 -0
- package/dist/commands/lifecycle/install.mjs +1077 -0
- package/dist/commands/lifecycle/install.mjs.map +1 -0
- package/dist/commands/lifecycle/migrate.d.mts +1 -0
- package/{src → dist}/commands/lifecycle/migrate.mjs +10 -11
- package/dist/commands/lifecycle/migrate.mjs.map +1 -0
- package/dist/commands/lifecycle/model.d.mts +1 -0
- package/dist/commands/lifecycle/model.mjs +22 -0
- package/dist/commands/lifecycle/model.mjs.map +1 -0
- package/dist/commands/lifecycle/paths.d.mts +1 -0
- package/dist/commands/lifecycle/paths.mjs +102 -0
- package/dist/commands/lifecycle/paths.mjs.map +1 -0
- package/dist/commands/lifecycle/preflight.d.mts +1 -0
- package/dist/commands/lifecycle/preflight.mjs +124 -0
- package/dist/commands/lifecycle/preflight.mjs.map +1 -0
- package/dist/commands/lifecycle/setup.d.mts +1 -0
- package/dist/commands/lifecycle/setup.mjs +297 -0
- package/dist/commands/lifecycle/setup.mjs.map +1 -0
- package/dist/commands/lifecycle/uninstall.d.mts +4 -0
- package/dist/commands/lifecycle/uninstall.mjs +262 -0
- package/dist/commands/lifecycle/uninstall.mjs.map +1 -0
- package/dist/commands/manager.d.mts +3 -0
- package/{src → dist}/commands/manager.mjs +25 -32
- package/dist/commands/manager.mjs.map +1 -0
- package/dist/commands/memory/memory.d.mts +1 -0
- package/dist/commands/memory/memory.mjs +569 -0
- package/dist/commands/memory/memory.mjs.map +1 -0
- package/dist/commands/pr/pr.d.mts +33 -0
- package/dist/commands/pr/pr.mjs +296 -0
- package/dist/commands/pr/pr.mjs.map +1 -0
- package/dist/commands/report/agent-activity.d.mts +1 -0
- package/{src → dist}/commands/report/agent-activity.mjs +11 -12
- package/dist/commands/report/agent-activity.mjs.map +1 -0
- package/dist/commands/report/finalize.d.mts +4 -0
- package/{src → dist}/commands/report/finalize.mjs +25 -32
- package/dist/commands/report/finalize.mjs.map +1 -0
- package/dist/commands/report/inject-report-index.d.mts +1 -0
- package/{src → dist}/commands/report/inject-report-index.mjs +6 -7
- package/dist/commands/report/inject-report-index.mjs.map +1 -0
- package/dist/commands/report/render-final-report.d.mts +1 -0
- package/{src → dist}/commands/report/render-final-report.mjs +6 -7
- package/dist/commands/report/render-final-report.mjs.map +1 -0
- package/dist/commands/report/render-views.d.mts +1 -0
- package/{src → dist}/commands/report/render-views.mjs +6 -7
- package/dist/commands/report/render-views.mjs.map +1 -0
- package/dist/commands/report/translate.d.mts +1 -0
- package/{src → dist}/commands/report/translate.mjs +6 -7
- package/dist/commands/report/translate.mjs.map +1 -0
- package/dist/lib/helper-scripts.d.mts +3 -0
- package/{src → dist}/lib/helper-scripts.mjs +11 -14
- package/dist/lib/helper-scripts.mjs.map +1 -0
- package/dist/lib/host-registry-client.d.mts +25 -0
- package/dist/lib/host-registry-client.mjs +152 -0
- package/dist/lib/host-registry-client.mjs.map +1 -0
- package/dist/lib/install-assets.d.mts +8 -0
- package/{src → dist}/lib/install-assets.mjs +17 -20
- package/dist/lib/install-assets.mjs.map +1 -0
- package/dist/lib/okstra-dirs.d.mts +4 -0
- package/{src → dist}/lib/okstra-dirs.mjs +3 -6
- package/dist/lib/okstra-dirs.mjs.map +1 -0
- package/dist/lib/paths.d.mts +4 -0
- package/dist/lib/paths.mjs +78 -0
- package/dist/lib/paths.mjs.map +1 -0
- package/dist/lib/proc.d.mts +3 -0
- package/dist/lib/proc.mjs +31 -0
- package/dist/lib/proc.mjs.map +1 -0
- package/dist/lib/python-helper.d.mts +8 -0
- package/dist/lib/python-helper.mjs +123 -0
- package/dist/lib/python-helper.mjs.map +1 -0
- package/dist/lib/runtime-manifest.d.mts +7 -0
- package/dist/lib/runtime-manifest.mjs +73 -0
- package/dist/lib/runtime-manifest.mjs.map +1 -0
- package/dist/lib/skill-catalog.d.mts +4 -0
- package/dist/lib/skill-catalog.mjs +50 -0
- package/dist/lib/skill-catalog.mjs.map +1 -0
- package/dist/lib/types.d.mts +129 -0
- package/dist/lib/types.mjs +2 -0
- package/dist/lib/types.mjs.map +1 -0
- package/dist/lib/version.d.mts +2 -0
- package/dist/lib/version.mjs +27 -0
- package/dist/lib/version.mjs.map +1 -0
- package/docs/architecture/storage-model.md +6 -2
- package/docs/architecture.md +29 -20
- package/docs/cli.md +40 -16
- package/docs/contributor-change-matrix.md +2 -2
- package/docs/for-ai/skills/okstra-inspect.md +2 -3
- package/docs/for-ai/skills/okstra-rollup.md +1 -0
- package/docs/project-structure-overview.md +72 -62
- package/docs/task-process/README.md +12 -8
- package/docs/task-process/common-flow.md +13 -16
- package/docs/task-process/error-analysis.md +9 -10
- package/docs/task-process/final-verification.md +7 -7
- package/docs/task-process/implementation-planning.md +9 -9
- package/docs/task-process/implementation.md +6 -6
- package/docs/task-process/release-handoff.md +8 -7
- package/docs/task-process/requirements-discovery.md +8 -8
- package/package.json +11 -5
- package/runtime/BUILD.json +2 -2
- package/runtime/agents/workers/claude-worker.md +2 -1
- package/runtime/agents/workers/report-writer-worker.md +3 -1
- package/runtime/agents/workers/translator-worker.md +3 -1
- package/runtime/bin/lib/okstra/cli.sh +12 -0
- package/runtime/bin/lib/okstra/globals.sh +3 -0
- package/runtime/bin/lib/okstra/interactive.sh +12 -6
- package/runtime/bin/lib/okstra/usage.sh +7 -6
- package/runtime/bin/okstra-error-log.py +27 -0
- package/runtime/bin/okstra-provider-exec.py +217 -5
- package/runtime/bin/okstra-spawn-followups.py +4 -2
- package/runtime/bin/okstra.sh +10 -0
- package/runtime/prompts/launch.template.md +2 -2
- package/runtime/prompts/lead/context-loader.md +1 -2
- package/runtime/prompts/lead/convergence.md +27 -18
- package/runtime/prompts/lead/okstra-lead-contract.md +6 -5
- package/runtime/prompts/lead/plan-body-verification.md +10 -3
- package/runtime/prompts/lead/report-writer.md +15 -1
- package/runtime/prompts/lead/team-contract.md +17 -13
- package/runtime/prompts/profiles/_implementation-deliverable.md +1 -1
- package/runtime/prompts/profiles/_implementation-executor.md +0 -3
- package/runtime/prompts/profiles/_implementation-verifier.md +3 -7
- package/runtime/prompts/profiles/change-impact-analysis.md +20 -0
- package/runtime/prompts/profiles/error-analysis.md +27 -1
- package/runtime/prompts/profiles/feature-analysis.md +20 -0
- package/runtime/prompts/profiles/final-verification.md +20 -1
- package/runtime/prompts/profiles/implementation-option-selection.md +20 -0
- package/runtime/prompts/profiles/implementation-planning.md +26 -0
- package/runtime/prompts/profiles/implementation.md +19 -0
- package/runtime/prompts/profiles/improvement-discovery.md +21 -1
- package/runtime/prompts/profiles/project-analysis.md +20 -0
- package/runtime/prompts/profiles/release-handoff.md +4 -0
- package/runtime/prompts/profiles/requirements-discovery.md +27 -1
- package/runtime/prompts/wizard/prompts.ko.json +35 -0
- package/runtime/python/okstra_ctl/adapters/dispatch/cli_wrapper.py +8 -0
- package/runtime/python/okstra_ctl/adapters/dispatch/cmux.py +8 -0
- package/runtime/python/okstra_ctl/adapters/dispatch/native_team.py +13 -0
- package/runtime/python/okstra_ctl/adapters/hosts/antigravity/adapter.py +2 -2
- package/runtime/python/okstra_ctl/adapters/hosts/claude-code/adapter.py +25 -5
- package/runtime/python/okstra_ctl/adapters/hosts/codex/adapter.py +2 -2
- package/runtime/python/okstra_ctl/adapters/hosts/external/adapter.py +4 -1
- package/runtime/python/okstra_ctl/adapters/hosts/grok/adapter.py +2 -2
- package/runtime/python/okstra_ctl/adapters/hosts/kimi/adapter.py +2 -2
- package/runtime/python/okstra_ctl/adapters/providers/antigravity/adapter.py +79 -11
- package/runtime/python/okstra_ctl/adapters/providers/claude/adapter.py +95 -25
- package/runtime/python/okstra_ctl/adapters/providers/codex/adapter.py +59 -14
- package/runtime/python/okstra_ctl/adapters/providers/grok/adapter.py +55 -9
- package/runtime/python/okstra_ctl/adapters/providers/kimi/adapter.py +51 -12
- package/runtime/python/okstra_ctl/adapters/runtime/__init__.py +1 -0
- package/runtime/python/okstra_ctl/adapters/runtime/assembly.py +27 -0
- package/runtime/python/okstra_ctl/adapters/runtime/cli_wrapper.py +49 -0
- package/runtime/python/okstra_ctl/adapters/runtime/cmux.py +74 -0
- package/runtime/python/okstra_ctl/agent_activity.py +5 -1
- package/runtime/python/okstra_ctl/agent_invocation.py +608 -14
- package/runtime/python/okstra_ctl/agent_prompt_cli.py +249 -50
- package/runtime/python/okstra_ctl/application/open_worker.py +29 -0
- package/runtime/python/okstra_ctl/application/resolve_assignment.py +53 -12
- package/runtime/python/okstra_ctl/assignment_environment.py +102 -0
- package/runtime/python/okstra_ctl/assignment_resolver.py +790 -0
- package/runtime/python/okstra_ctl/attempt_evidence.py +342 -0
- package/runtime/python/okstra_ctl/convergence.py +409 -3
- package/runtime/python/okstra_ctl/convergence_engine.py +248 -15
- package/runtime/python/okstra_ctl/convergence_store.py +170 -1
- package/runtime/python/okstra_ctl/dispatch_core.py +1204 -155
- package/runtime/python/okstra_ctl/dispatch_state.py +696 -11
- package/runtime/python/okstra_ctl/doctor.py +14 -0
- package/runtime/python/okstra_ctl/domain/host.py +34 -1
- package/runtime/python/okstra_ctl/domain/provider.py +212 -6
- package/runtime/python/okstra_ctl/domain/role.py +125 -0
- package/runtime/python/okstra_ctl/domain/wizard/interaction.py +18 -0
- package/runtime/python/okstra_ctl/domain/worker_exec.py +34 -1
- package/runtime/python/okstra_ctl/domain/worker_role.py +13 -3
- package/runtime/python/okstra_ctl/domain/worker_runtime.py +44 -0
- package/runtime/python/okstra_ctl/domain/worker_stream.py +24 -0
- package/runtime/python/okstra_ctl/error_log_write.py +9 -0
- package/runtime/python/okstra_ctl/error_report.py +21 -1
- package/runtime/python/okstra_ctl/execution_identity.py +529 -0
- package/runtime/python/okstra_ctl/execution_manifest.py +1281 -0
- package/runtime/python/okstra_ctl/execution_mutation_audit.py +619 -0
- package/runtime/python/okstra_ctl/implementation_outcome.py +21 -5
- package/runtime/python/okstra_ctl/index.py +6 -2
- package/runtime/python/okstra_ctl/initial_prompt_materialization.py +43 -3
- package/runtime/python/okstra_ctl/legacy_model_selection.py +578 -0
- package/runtime/python/okstra_ctl/manager_sync.py +4 -1
- package/runtime/python/okstra_ctl/model_cli.py +278 -0
- package/runtime/python/okstra_ctl/model_defaults.py +46 -0
- package/runtime/python/okstra_ctl/model_discovery.py +26 -7
- package/runtime/python/okstra_ctl/model_pool.py +501 -0
- package/runtime/python/okstra_ctl/models.py +47 -27
- package/runtime/python/okstra_ctl/mutation_recovery.py +293 -0
- package/runtime/python/okstra_ctl/next_phase.py +236 -0
- package/runtime/python/okstra_ctl/pane_title.py +151 -0
- package/runtime/python/okstra_ctl/ports/host_model.py +48 -17
- package/runtime/python/okstra_ctl/ports/worker_dispatch.py +4 -0
- package/runtime/python/okstra_ctl/ports/worker_runtime.py +26 -0
- package/runtime/python/okstra_ctl/recap.py +4 -1
- package/runtime/python/okstra_ctl/registry/provider_registry.py +8 -4
- package/runtime/python/okstra_ctl/render.py +124 -57
- package/runtime/python/okstra_ctl/render_final_report.py +19 -0
- package/runtime/python/okstra_ctl/report_contract.py +39 -0
- package/runtime/python/okstra_ctl/report_finalize.py +16 -0
- package/runtime/python/okstra_ctl/report_html/render.py +1 -0
- package/runtime/python/okstra_ctl/role_requirements.py +210 -0
- package/runtime/python/okstra_ctl/rollup.py +4 -1
- package/runtime/python/okstra_ctl/run.py +1210 -258
- package/runtime/python/okstra_ctl/run_index_row.py +7 -1
- package/runtime/python/okstra_ctl/stage_fix_carry.py +17 -1
- package/runtime/python/okstra_ctl/team.py +14 -18
- package/runtime/python/okstra_ctl/time_report.py +38 -4
- package/runtime/python/okstra_ctl/usage_identity.py +86 -0
- package/runtime/python/okstra_ctl/usage_report.py +15 -3
- package/runtime/python/okstra_ctl/wizard.py +1449 -66
- package/runtime/python/okstra_ctl/worker_audit_ledger.py +68 -65
- package/runtime/python/okstra_ctl/worker_prompt_body.py +18 -2
- package/runtime/python/okstra_ctl/worker_prompt_contract.py +40 -9
- package/runtime/python/okstra_ctl/worker_prompt_headers.py +16 -1
- package/runtime/python/okstra_ctl/worker_request.py +7 -1
- package/runtime/python/okstra_ctl/worker_runner.py +130 -5
- package/runtime/python/okstra_ctl/workers.py +7 -5
- package/runtime/python/okstra_ctl/workflow.py +18 -32
- package/runtime/python/okstra_ctl/worktree.py +3 -3
- package/runtime/python/okstra_ctl/worktree_registry.py +5 -4
- package/runtime/python/okstra_ctl/write_policy.py +571 -0
- package/runtime/python/okstra_project/state.py +54 -6
- package/runtime/schemas/convergence-groups-v2.0.schema.json +128 -0
- package/runtime/schemas/execution-manifest-v2.schema.json +340 -0
- package/runtime/schemas/final-report-v2.0.schema.json +68 -5
- package/runtime/skills/okstra-inspect/facets/recap.md +2 -0
- package/runtime/skills/okstra-inspect/facets/report.md +1 -1
- package/runtime/skills/okstra-inspect/facets/status.md +15 -13
- package/runtime/skills/okstra-rollup/SKILL.md +1 -0
- package/runtime/skills/okstra-run/SKILL.md +14 -14
- package/runtime/templates/implementation-worker-preamble.md +3 -18
- package/runtime/templates/project-docs/task-index.template.md +0 -1
- package/runtime/templates/report-writer-prompt-preamble.md +2 -0
- package/runtime/templates/reports/final-report-v2.template.md +7 -1
- package/runtime/templates/reports/html/base.template.html +21 -0
- package/runtime/templates/reports/html/i18n/en.json +4 -0
- package/runtime/templates/reports/html/i18n/ko.json +4 -0
- package/runtime/templates/reports/html/macros/forms.html +5 -4
- package/runtime/templates/reports/html/tasks/final-verification.template.html +1 -1
- package/runtime/templates/reports/html/tasks/implementation.template.html +1 -1
- package/runtime/templates/worker-prompt-preamble.md +6 -35
- package/runtime/validators/lib/fixtures.sh +49 -16
- package/runtime/validators/validate-run.py +486 -134
- package/runtime/validators/validate_session_conformance.py +25 -7
- package/src/cli-registry.mjs +0 -539
- package/src/commands/execute/codex-dispatch.mjs +0 -10
- package/src/commands/execute/plan-items.mjs +0 -9
- package/src/commands/execute/plan-validate.mjs +0 -68
- package/src/commands/execute/run.mjs +0 -208
- package/src/commands/execute/wizard.mjs +0 -167
- package/src/commands/inspect/stage-map.mjs +0 -98
- package/src/commands/inspect/task-list.mjs +0 -97
- package/src/commands/inspect/task-show.mjs +0 -100
- package/src/commands/lifecycle/check-project.mjs +0 -187
- package/src/commands/lifecycle/config.mjs +0 -385
- package/src/commands/lifecycle/doctor.mjs +0 -308
- package/src/commands/lifecycle/install.mjs +0 -1170
- package/src/commands/lifecycle/paths.mjs +0 -104
- package/src/commands/lifecycle/preflight.mjs +0 -125
- package/src/commands/lifecycle/setup.mjs +0 -333
- package/src/commands/lifecycle/uninstall.mjs +0 -279
- package/src/commands/memory/memory.mjs +0 -524
- package/src/commands/pr/pr.mjs +0 -261
- package/src/lib/host-registry-client.mjs +0 -176
- package/src/lib/paths.mjs +0 -86
- package/src/lib/proc.mjs +0 -31
- package/src/lib/python-helper.mjs +0 -142
- package/src/lib/runtime-manifest.mjs +0 -70
- package/src/lib/skill-catalog.mjs +0 -53
- package/src/lib/version.mjs +0 -20
- /package/{src → dist}/commands/pr/default.md +0 -0
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import { createInterface } from "node:readline";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { join, resolve as resolvePath } from "node:path";
|
|
5
|
+
import { buildPythonpath, resolvePaths } from "../../lib/paths.mjs";
|
|
6
|
+
import { fileExists, runProcess } from "../../lib/proc.mjs";
|
|
7
|
+
const USAGE = `okstra setup — register the current project with okstra
|
|
8
|
+
|
|
9
|
+
Writes <PROJECT_ROOT>/.okstra/project.json. This is the
|
|
10
|
+
project-level companion to 'okstra install' (which is machine-level).
|
|
11
|
+
Inside a Claude Code session this is also exposed as the /okstra-setup
|
|
12
|
+
slash command.
|
|
13
|
+
|
|
14
|
+
Usage:
|
|
15
|
+
okstra setup --project-id <id> Register with explicit projectId
|
|
16
|
+
okstra setup Use existing project.json or
|
|
17
|
+
prompt for projectId (TTY only)
|
|
18
|
+
okstra setup --project-root <path> Override PROJECT_ROOT resolution
|
|
19
|
+
okstra setup --yes Skip prompts; require all inputs
|
|
20
|
+
on the command line
|
|
21
|
+
|
|
22
|
+
Behavior:
|
|
23
|
+
- If project.json already exists, the projectId must match (okstra refuses
|
|
24
|
+
to silently rename a project). Delete the file manually if you really
|
|
25
|
+
want to change projectId.
|
|
26
|
+
- If --project-id is omitted and stdin is a TTY, you are prompted.
|
|
27
|
+
- If --project-id is omitted and stdin is not a TTY, the command exits
|
|
28
|
+
with an error (use --project-id for CI / scripts).
|
|
29
|
+
|
|
30
|
+
Exit codes:
|
|
31
|
+
0 project.json present and valid after the run
|
|
32
|
+
1 I/O / python failure or projectId mismatch
|
|
33
|
+
2 PROJECT_ROOT could not be resolved
|
|
34
|
+
`;
|
|
35
|
+
function parseArgs(args) {
|
|
36
|
+
const opts = {
|
|
37
|
+
projectId: null,
|
|
38
|
+
projectRoot: null,
|
|
39
|
+
yes: false,
|
|
40
|
+
};
|
|
41
|
+
for (let i = 0; i < args.length; i++) {
|
|
42
|
+
const a = args[i];
|
|
43
|
+
if (a === "--yes" || a === "-y")
|
|
44
|
+
opts.yes = true;
|
|
45
|
+
else if (a === "--project-id") {
|
|
46
|
+
const next = args[i + 1];
|
|
47
|
+
if (!next || next.startsWith("--"))
|
|
48
|
+
throw new Error("--project-id requires a value");
|
|
49
|
+
opts.projectId = next;
|
|
50
|
+
i++;
|
|
51
|
+
}
|
|
52
|
+
else if (a === "--project-root") {
|
|
53
|
+
const next = args[i + 1];
|
|
54
|
+
if (!next || next.startsWith("--"))
|
|
55
|
+
throw new Error("--project-root requires a path");
|
|
56
|
+
opts.projectRoot = next;
|
|
57
|
+
i++;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
throw new Error(`unknown argument '${a}'`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return opts;
|
|
64
|
+
}
|
|
65
|
+
function prompt(question) {
|
|
66
|
+
return new Promise((resolve) => {
|
|
67
|
+
const rl = createInterface({ input: process.stdin, output: process.stderr });
|
|
68
|
+
rl.question(question, (answer) => {
|
|
69
|
+
rl.close();
|
|
70
|
+
resolve(answer.trim());
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
function validateProjectId(id) {
|
|
75
|
+
if (!id)
|
|
76
|
+
return "project-id is empty";
|
|
77
|
+
if (!/[A-Za-z0-9]/.test(id))
|
|
78
|
+
return "project-id must contain at least one alphanumeric character";
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
async function resolveProjectRoot(paths, explicit) {
|
|
82
|
+
const probe = await runProcess("python3", [
|
|
83
|
+
"-c",
|
|
84
|
+
[
|
|
85
|
+
"import sys",
|
|
86
|
+
"from okstra_project import resolve_project_root, project_json_path, ResolverError",
|
|
87
|
+
"try:",
|
|
88
|
+
" pr = resolve_project_root(explicit_root=sys.argv[1], cwd=sys.argv[2])",
|
|
89
|
+
" print('PROJECT_ROOT', pr)",
|
|
90
|
+
" print('PROJECT_JSON', project_json_path(pr))",
|
|
91
|
+
"except ResolverError as e:",
|
|
92
|
+
" print('RESOLVER_ERROR', e)",
|
|
93
|
+
].join("\n"),
|
|
94
|
+
explicit || "",
|
|
95
|
+
process.cwd(),
|
|
96
|
+
], { PYTHONPATH: buildPythonpath(paths) });
|
|
97
|
+
if (probe.code !== 0) {
|
|
98
|
+
throw new Error(`python invocation failed: ${probe.stderr.trim() || probe.stdout.trim()}`);
|
|
99
|
+
}
|
|
100
|
+
const lines = probe.stdout.trim().split("\n");
|
|
101
|
+
const tagOf = (key) => lines
|
|
102
|
+
.find((l) => l.startsWith(key + " "))
|
|
103
|
+
?.slice(key.length + 1)
|
|
104
|
+
.trim() ?? null;
|
|
105
|
+
const resolverError = tagOf("RESOLVER_ERROR");
|
|
106
|
+
if (resolverError) {
|
|
107
|
+
throw Object.assign(new Error(resolverError), { code: "RESOLVER" });
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
projectRoot: tagOf("PROJECT_ROOT"),
|
|
111
|
+
projectJsonPath: tagOf("PROJECT_JSON"),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
async function upsert(paths, projectRoot, projectId) {
|
|
115
|
+
const probe = await runProcess("python3", [
|
|
116
|
+
"-c",
|
|
117
|
+
[
|
|
118
|
+
"import json, sys",
|
|
119
|
+
"from pathlib import Path",
|
|
120
|
+
"from okstra_project import upsert_project_json, ResolverError",
|
|
121
|
+
"try:",
|
|
122
|
+
" result = upsert_project_json(Path(sys.argv[1]), sys.argv[2])",
|
|
123
|
+
" print('OK', json.dumps(result))",
|
|
124
|
+
"except ResolverError as e:",
|
|
125
|
+
" print('ERROR', e)",
|
|
126
|
+
].join("\n"),
|
|
127
|
+
projectRoot,
|
|
128
|
+
projectId,
|
|
129
|
+
], { PYTHONPATH: buildPythonpath(paths) });
|
|
130
|
+
if (probe.code !== 0) {
|
|
131
|
+
throw new Error(`python invocation failed: ${probe.stderr.trim() || probe.stdout.trim()}`);
|
|
132
|
+
}
|
|
133
|
+
const out = probe.stdout.trim();
|
|
134
|
+
if (out.startsWith("OK ")) {
|
|
135
|
+
return JSON.parse(out.slice(3));
|
|
136
|
+
}
|
|
137
|
+
if (out.startsWith("ERROR ")) {
|
|
138
|
+
throw new Error(out.slice(6));
|
|
139
|
+
}
|
|
140
|
+
throw new Error(`unexpected upsert output: ${out}`);
|
|
141
|
+
}
|
|
142
|
+
export async function run(args) {
|
|
143
|
+
if (args.includes("--help") || args.includes("-h")) {
|
|
144
|
+
process.stdout.write(USAGE);
|
|
145
|
+
return 0;
|
|
146
|
+
}
|
|
147
|
+
let opts;
|
|
148
|
+
try {
|
|
149
|
+
opts = parseArgs(args);
|
|
150
|
+
}
|
|
151
|
+
catch (err) {
|
|
152
|
+
process.stderr.write(`error: ${err.message}\n\n${USAGE}`);
|
|
153
|
+
return 1;
|
|
154
|
+
}
|
|
155
|
+
const paths = await resolvePaths();
|
|
156
|
+
let resolved;
|
|
157
|
+
try {
|
|
158
|
+
resolved = await resolveProjectRoot(paths, opts.projectRoot);
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
if (err.code === "RESOLVER") {
|
|
162
|
+
const cwd = resolvePath(process.cwd());
|
|
163
|
+
const home = resolvePath(homedir());
|
|
164
|
+
const inHome = cwd === home;
|
|
165
|
+
process.stderr.write("error: 'okstra setup' registers the CURRENT directory as an okstra project,\n" +
|
|
166
|
+
" but no project root could be resolved from here.\n" +
|
|
167
|
+
` cwd: ${cwd}\n` +
|
|
168
|
+
(inHome
|
|
169
|
+
? " (this looks like your home directory — setup is project-level, not machine-level;\n" +
|
|
170
|
+
" machine-level install is 'okstra install', which you've likely already done.)\n"
|
|
171
|
+
: "") +
|
|
172
|
+
"\nFix one of:\n" +
|
|
173
|
+
" 1. cd into the project you want to register, then re-run:\n" +
|
|
174
|
+
" cd <your project> && okstra setup --project-id <id>\n" +
|
|
175
|
+
" 2. pass an explicit path:\n" +
|
|
176
|
+
" okstra setup --project-root <abs-path> --project-id <id>\n" +
|
|
177
|
+
" 3. run from inside any git working tree (the toplevel becomes PROJECT_ROOT).\n" +
|
|
178
|
+
`\n(underlying error: ${err.message})\n`);
|
|
179
|
+
return 2;
|
|
180
|
+
}
|
|
181
|
+
// Non-RESOLVER path: typically python invocation failure (PYTHONPATH wrong,
|
|
182
|
+
// ~/.okstra missing, python3 not on PATH, okstra_project module missing).
|
|
183
|
+
// The user can't fix this by adjusting setup arguments — it's a runtime
|
|
184
|
+
// health issue, not a PROJECT_ROOT issue. Reword accordingly.
|
|
185
|
+
const looksLikePythonFailure = /python invocation failed|ModuleNotFoundError|No module named/.test(err.message);
|
|
186
|
+
if (looksLikePythonFailure) {
|
|
187
|
+
process.stderr.write("error: 'okstra setup' could not start because the okstra runtime is not\n" +
|
|
188
|
+
" reachable from this process. This is almost always a stale or\n" +
|
|
189
|
+
" incomplete install, not a problem with your setup arguments.\n" +
|
|
190
|
+
"\nFix:\n" +
|
|
191
|
+
" 1. run 'okstra doctor' to see exactly what is missing\n" +
|
|
192
|
+
" 2. run 'okstra ensure-installed' (or 'npx -y okstra@latest install')\n" +
|
|
193
|
+
" to repair the runtime\n" +
|
|
194
|
+
" 3. retry: okstra setup --project-id <id>\n" +
|
|
195
|
+
`\n(underlying error: ${err.message})\n`);
|
|
196
|
+
return 1;
|
|
197
|
+
}
|
|
198
|
+
process.stderr.write(`error: could not resolve PROJECT_ROOT: ${err.message}\n`);
|
|
199
|
+
return 1;
|
|
200
|
+
}
|
|
201
|
+
const { projectRoot, projectJsonPath } = resolved;
|
|
202
|
+
let existing = null;
|
|
203
|
+
if (await fileExists(projectJsonPath)) {
|
|
204
|
+
try {
|
|
205
|
+
existing = JSON.parse(await fs.readFile(projectJsonPath, "utf8"));
|
|
206
|
+
}
|
|
207
|
+
catch (err) {
|
|
208
|
+
process.stderr.write(`error: failed to parse ${projectJsonPath}: ${err.message}\n`);
|
|
209
|
+
return 1;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
let projectId = opts.projectId;
|
|
213
|
+
if (!projectId && existing?.projectId) {
|
|
214
|
+
projectId = existing.projectId;
|
|
215
|
+
}
|
|
216
|
+
if (!projectId) {
|
|
217
|
+
if (opts.yes || !process.stdin.isTTY) {
|
|
218
|
+
process.stderr.write(`error: --project-id is required (no existing project.json, not a TTY)\n`);
|
|
219
|
+
return 1;
|
|
220
|
+
}
|
|
221
|
+
process.stderr.write(`PROJECT_ROOT: ${projectRoot}\n`);
|
|
222
|
+
const answer = await prompt("project-id (e.g. INV-1234, my-app): ");
|
|
223
|
+
projectId = answer;
|
|
224
|
+
}
|
|
225
|
+
const invalid = validateProjectId(projectId);
|
|
226
|
+
if (invalid) {
|
|
227
|
+
process.stderr.write(`error: ${invalid}\n`);
|
|
228
|
+
return 1;
|
|
229
|
+
}
|
|
230
|
+
let result;
|
|
231
|
+
try {
|
|
232
|
+
result = await upsert(paths, projectRoot, projectId);
|
|
233
|
+
}
|
|
234
|
+
catch (err) {
|
|
235
|
+
process.stderr.write(`error: ${err.message}\n`);
|
|
236
|
+
return 1;
|
|
237
|
+
}
|
|
238
|
+
let settingsSymlink = null;
|
|
239
|
+
try {
|
|
240
|
+
settingsSymlink = await ensureProjectSettingsSymlink(projectRoot);
|
|
241
|
+
}
|
|
242
|
+
catch (err) {
|
|
243
|
+
process.stderr.write(`warning: failed to provision .claude/settings.local.json symlink — ` +
|
|
244
|
+
`host Claude Code sessions in this project may need to add wrapper permissions manually. (${err.message})\n`);
|
|
245
|
+
}
|
|
246
|
+
process.stdout.write(JSON.stringify({
|
|
247
|
+
ok: true,
|
|
248
|
+
...result,
|
|
249
|
+
projectJsonPath,
|
|
250
|
+
settingsLocalJson: settingsSymlink,
|
|
251
|
+
}, null, 2) + "\n");
|
|
252
|
+
return 0;
|
|
253
|
+
}
|
|
254
|
+
async function ensureProjectSettingsSymlink(projectRoot) {
|
|
255
|
+
const template = join(homedir(), ".okstra", "templates", "settings.local.json");
|
|
256
|
+
try {
|
|
257
|
+
await fs.access(template);
|
|
258
|
+
}
|
|
259
|
+
catch {
|
|
260
|
+
return null; // install hasn't provisioned the template yet (pre-0.14 install)
|
|
261
|
+
}
|
|
262
|
+
const claudeDir = join(projectRoot, ".claude");
|
|
263
|
+
const target = join(claudeDir, "settings.local.json");
|
|
264
|
+
await fs.mkdir(claudeDir, { recursive: true });
|
|
265
|
+
let existingStat;
|
|
266
|
+
try {
|
|
267
|
+
existingStat = await fs.lstat(target);
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
existingStat = null;
|
|
271
|
+
}
|
|
272
|
+
if (existingStat?.isSymbolicLink()) {
|
|
273
|
+
const current = await fs.readlink(target);
|
|
274
|
+
const resolved = current.startsWith("/") ? current : join(claudeDir, current);
|
|
275
|
+
if (resolved === template)
|
|
276
|
+
return target;
|
|
277
|
+
await backupAndReplace(target, template);
|
|
278
|
+
return target;
|
|
279
|
+
}
|
|
280
|
+
if (existingStat) {
|
|
281
|
+
await backupAndReplace(target, template);
|
|
282
|
+
return target;
|
|
283
|
+
}
|
|
284
|
+
await fs.symlink(template, target);
|
|
285
|
+
return target;
|
|
286
|
+
}
|
|
287
|
+
async function backupAndReplace(target, template) {
|
|
288
|
+
const stamp = new Date()
|
|
289
|
+
.toISOString()
|
|
290
|
+
.replace(/[-:]/g, "")
|
|
291
|
+
.replace(/\..*/, "")
|
|
292
|
+
.replace("T", "-");
|
|
293
|
+
const backup = `${target}.bak.${stamp}`;
|
|
294
|
+
await fs.rename(target, backup);
|
|
295
|
+
await fs.symlink(template, target);
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=setup.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.mjs","sourceRoot":"","sources":["../../../src/commands/lifecycle/setup.mts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { resolvePaths } from "../../lib/paths.mjs";
|
|
5
|
+
import { RUNTIMES_MANIFEST_REL, runtimeManifestIncludesClaudeAssets, } from "../../lib/runtime-manifest.mjs";
|
|
6
|
+
import { OBSOLETE_SKILL_NAMES, USER_SKILL_NAMES } from "../../lib/skill-catalog.mjs";
|
|
7
|
+
import { AGENTS_MANIFEST_REL, INSTALLED_FILES, INSTALLED_TREES, LEGACY_TRANSPORT_AGENT_NAMES, SKILLS_MANIFEST_REL, } from "../../lib/install-assets.mjs";
|
|
8
|
+
// Manifest-less uninstall must clean out every okstra skill directory — the
|
|
9
|
+
// live names AND every former/renamed one. Both sets are the single source of
|
|
10
|
+
// truth in skill-catalog.mjs (install prunes OBSOLETE_SKILL_NAMES from each
|
|
11
|
+
// skill home), so deriving the fallback from their union keeps uninstall from
|
|
12
|
+
// drifting behind skill additions or renames.
|
|
13
|
+
export const FALLBACK_SKILL_NAMES = [
|
|
14
|
+
...new Set([...USER_SKILL_NAMES, ...OBSOLETE_SKILL_NAMES]),
|
|
15
|
+
];
|
|
16
|
+
export const FALLBACK_AGENT_NAMES = [
|
|
17
|
+
"claude-worker.md",
|
|
18
|
+
"report-writer-worker.md",
|
|
19
|
+
"translator-worker.md",
|
|
20
|
+
...LEGACY_TRANSPORT_AGENT_NAMES,
|
|
21
|
+
];
|
|
22
|
+
const USER_HOME = homedir();
|
|
23
|
+
const CLAUDE_HOME = join(USER_HOME, ".claude");
|
|
24
|
+
const AGENTS_HOME = join(USER_HOME, ".agents");
|
|
25
|
+
const CLAUDE_SKILLS_DIR = join(CLAUDE_HOME, "skills");
|
|
26
|
+
const AGENTS_SKILLS_DIR = join(AGENTS_HOME, "skills");
|
|
27
|
+
const CLAUDE_AGENTS_DIR = join(CLAUDE_HOME, "agents");
|
|
28
|
+
const FALLBACK_SKILL_ROOTS = [
|
|
29
|
+
CLAUDE_SKILLS_DIR,
|
|
30
|
+
AGENTS_SKILLS_DIR,
|
|
31
|
+
];
|
|
32
|
+
const USAGE = `okstra uninstall — remove installed runtime and okstra skills
|
|
33
|
+
|
|
34
|
+
Usage:
|
|
35
|
+
okstra uninstall Remove ~/.okstra/{lib (python + validators),
|
|
36
|
+
bin, schemas, templates, version,
|
|
37
|
+
dev-link, installed-runtimes.json,
|
|
38
|
+
installed-skills.json, installed-agents.json} AND
|
|
39
|
+
every skill target recorded in
|
|
40
|
+
installed-skills.json
|
|
41
|
+
(~/.claude/skills or ~/.agents/skills).
|
|
42
|
+
Claude worker agents are
|
|
43
|
+
removed from ~/.claude/agents when installed.
|
|
44
|
+
Missing manifests fall back to hard-coded
|
|
45
|
+
Claude okstra-* / *-worker.md names.
|
|
46
|
+
Preserves user data: recent.jsonl,
|
|
47
|
+
active.jsonl, projects/, archive/,
|
|
48
|
+
state.json, .locks/
|
|
49
|
+
Per-project artifacts created by 'okstra setup'
|
|
50
|
+
(<PROJECT>/.claude/settings.local.json symlink)
|
|
51
|
+
are NOT touched — remove them manually if needed.
|
|
52
|
+
okstra uninstall --purge Remove the entire ~/.okstra directory AND
|
|
53
|
+
okstra skills in Claude/Agent homes AND
|
|
54
|
+
~/.claude/agents/<*-worker.md> (DESTRUCTIVE).
|
|
55
|
+
Requires -y or an interactive confirmation
|
|
56
|
+
okstra uninstall --dry-run Print the plan without touching disk
|
|
57
|
+
okstra uninstall -y Skip confirmation prompt for --purge
|
|
58
|
+
`;
|
|
59
|
+
async function pathExists(p) {
|
|
60
|
+
try {
|
|
61
|
+
await fs.lstat(p);
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async function removePath(p, opts) {
|
|
69
|
+
const { dryRun = false, quiet = false } = opts ?? {};
|
|
70
|
+
if (!(await pathExists(p))) {
|
|
71
|
+
if (!quiet)
|
|
72
|
+
process.stdout.write(` not present: ${p}\n`);
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
if (dryRun) {
|
|
76
|
+
process.stdout.write(`[dry-run] rm ${p}\n`);
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
await fs.rm(p, { recursive: true, force: true });
|
|
80
|
+
if (!quiet)
|
|
81
|
+
process.stdout.write(` removed: ${p}\n`);
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
async function promptConfirm(question) {
|
|
85
|
+
if (!process.stdin.isTTY)
|
|
86
|
+
return false;
|
|
87
|
+
process.stdout.write(`${question} [y/N] `);
|
|
88
|
+
return await new Promise((resolveP) => {
|
|
89
|
+
process.stdin.setEncoding("utf8");
|
|
90
|
+
process.stdin.once("data", (chunk) => {
|
|
91
|
+
const answer = chunk.toString().trim().toLowerCase();
|
|
92
|
+
resolveP(answer === "y" || answer === "yes");
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
export async function runUninstall(args) {
|
|
97
|
+
if (args.includes("--help") || args.includes("-h")) {
|
|
98
|
+
process.stdout.write(USAGE);
|
|
99
|
+
return 0;
|
|
100
|
+
}
|
|
101
|
+
const opts = {
|
|
102
|
+
dryRun: args.includes("--dry-run"),
|
|
103
|
+
quiet: args.includes("-q") || args.includes("--quiet"),
|
|
104
|
+
purge: args.includes("--purge"),
|
|
105
|
+
yes: args.includes("-y") || args.includes("--yes"),
|
|
106
|
+
};
|
|
107
|
+
const paths = await resolvePaths();
|
|
108
|
+
if (!(await pathExists(paths.home))) {
|
|
109
|
+
if (!opts.quiet)
|
|
110
|
+
process.stdout.write(`okstra not installed (no ${paths.home})\n`);
|
|
111
|
+
return 0;
|
|
112
|
+
}
|
|
113
|
+
if (opts.purge) {
|
|
114
|
+
if (!opts.yes && !opts.dryRun) {
|
|
115
|
+
const ok = await promptConfirm(`purge entire ${paths.home} AND okstra skills in Claude/Agent homes? user data will be lost.`);
|
|
116
|
+
if (!ok) {
|
|
117
|
+
process.stdout.write("aborted.\n");
|
|
118
|
+
return 1;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (!opts.quiet)
|
|
122
|
+
process.stdout.write(`purging ${paths.home}\n`);
|
|
123
|
+
await removePath(paths.home, opts);
|
|
124
|
+
// Skills and worker agents live outside ~/.okstra — purge those too.
|
|
125
|
+
for (const root of FALLBACK_SKILL_ROOTS) {
|
|
126
|
+
for (const name of FALLBACK_SKILL_NAMES) {
|
|
127
|
+
await removePath(join(root, name), opts);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
for (const name of FALLBACK_AGENT_NAMES) {
|
|
131
|
+
await removePath(join(CLAUDE_AGENTS_DIR, name), opts);
|
|
132
|
+
}
|
|
133
|
+
return 0;
|
|
134
|
+
}
|
|
135
|
+
if (!opts.quiet) {
|
|
136
|
+
process.stdout.write(`uninstalling okstra runtime\n`);
|
|
137
|
+
process.stdout.write(` home: ${paths.home}\n`);
|
|
138
|
+
}
|
|
139
|
+
// Every tree the install writes, read from the list install itself copies
|
|
140
|
+
// from. A per-name list here drifts behind additions the moment one lands on
|
|
141
|
+
// the install side only — which is how a stale validator, a stale schema and
|
|
142
|
+
// a stale prompts tree each survived uninstall→reinstall in turn, one bug
|
|
143
|
+
// report at a time.
|
|
144
|
+
for (const tree of INSTALLED_TREES) {
|
|
145
|
+
await removePath(join(paths.home, ...tree.to), opts);
|
|
146
|
+
}
|
|
147
|
+
// Clean now-empty lib parent (best-effort) — the trees above were the only
|
|
148
|
+
// okstra-owned children.
|
|
149
|
+
const libDir = join(paths.home, "lib");
|
|
150
|
+
if (await pathExists(libDir)) {
|
|
151
|
+
try {
|
|
152
|
+
const entries = await fs.readdir(libDir);
|
|
153
|
+
if (entries.length === 0) {
|
|
154
|
+
if (!opts.dryRun)
|
|
155
|
+
await fs.rmdir(libDir);
|
|
156
|
+
if (!opts.quiet)
|
|
157
|
+
process.stdout.write(` removed empty: ${libDir}\n`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
/* ignore */
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Remove the skills we own. Manifest v2 records every target root; legacy
|
|
165
|
+
// manifests fall back to Claude-only names when the runtime manifest says
|
|
166
|
+
// Claude assets may have been installed.
|
|
167
|
+
const runtimeManifest = await readRuntimeManifest(paths.home);
|
|
168
|
+
const skillTargets = await readSkillsManifest(paths.home, runtimeManifest);
|
|
169
|
+
for (const target of skillTargets) {
|
|
170
|
+
if (!opts.quiet) {
|
|
171
|
+
process.stdout.write(` skills: removing ${target.skills.length} entries from ${target.root}\n`);
|
|
172
|
+
}
|
|
173
|
+
for (const name of target.skills) {
|
|
174
|
+
await removePath(join(target.root, name), opts);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
await removePath(join(paths.home, SKILLS_MANIFEST_REL), opts);
|
|
178
|
+
// Remove worker agents we own. Agents only live in Claude Code's agent home.
|
|
179
|
+
const shouldRemoveClaudeAgents = skillTargets.some((target) => target.provider === "claude") ||
|
|
180
|
+
shouldUseClaudeAssetFallback(runtimeManifest);
|
|
181
|
+
const agentNames = shouldRemoveClaudeAgents ? await readAgentsManifest(paths.home) : [];
|
|
182
|
+
if (!opts.quiet) {
|
|
183
|
+
process.stdout.write(` agents: removing ${agentNames.length} entries from ${CLAUDE_AGENTS_DIR}\n`);
|
|
184
|
+
}
|
|
185
|
+
for (const name of agentNames) {
|
|
186
|
+
await removePath(join(CLAUDE_AGENTS_DIR, name), opts);
|
|
187
|
+
}
|
|
188
|
+
// Per-project <PROJECT>/.claude/settings.local.json symlinks are NOT removed
|
|
189
|
+
// here — uninstall is machine-level and does not know which projects opted
|
|
190
|
+
// in. They will dangle until the user removes them manually or re-runs
|
|
191
|
+
// okstra install + okstra setup.
|
|
192
|
+
// Stamps and manifests, last: the skill/agent removal above reads two of them.
|
|
193
|
+
for (const name of INSTALLED_FILES) {
|
|
194
|
+
await removePath(join(paths.home, name), opts);
|
|
195
|
+
}
|
|
196
|
+
if (!opts.quiet) {
|
|
197
|
+
process.stdout.write("done. user data preserved (recent.jsonl, projects/, archive/, ...).\n");
|
|
198
|
+
}
|
|
199
|
+
return 0;
|
|
200
|
+
}
|
|
201
|
+
async function readRuntimeManifest(home) {
|
|
202
|
+
try {
|
|
203
|
+
const raw = await fs.readFile(join(home, RUNTIMES_MANIFEST_REL), "utf8");
|
|
204
|
+
const data = JSON.parse(raw);
|
|
205
|
+
return data && typeof data === "object" ? data : null;
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
export function shouldUseClaudeAssetFallback(runtimeManifest) {
|
|
212
|
+
if (runtimeManifest === null)
|
|
213
|
+
return true;
|
|
214
|
+
return runtimeManifestIncludesClaudeAssets(runtimeManifest);
|
|
215
|
+
}
|
|
216
|
+
function normalizeSkillTargets(data) {
|
|
217
|
+
if (Array.isArray(data?.targets)) {
|
|
218
|
+
return data.targets
|
|
219
|
+
.filter((target) => typeof target?.root === "string" && Array.isArray(target?.skills))
|
|
220
|
+
.map((target) => ({
|
|
221
|
+
provider: typeof target.provider === "string" ? target.provider : "unknown",
|
|
222
|
+
root: target.root,
|
|
223
|
+
skills: target.skills.filter((name) => typeof name === "string"),
|
|
224
|
+
}));
|
|
225
|
+
}
|
|
226
|
+
if (Array.isArray(data?.skills)) {
|
|
227
|
+
return [{
|
|
228
|
+
provider: "claude",
|
|
229
|
+
root: CLAUDE_SKILLS_DIR,
|
|
230
|
+
skills: data.skills.filter((name) => typeof name === "string"),
|
|
231
|
+
}];
|
|
232
|
+
}
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
235
|
+
async function readSkillsManifest(home, runtimeManifest) {
|
|
236
|
+
try {
|
|
237
|
+
const raw = await fs.readFile(join(home, SKILLS_MANIFEST_REL), "utf8");
|
|
238
|
+
const data = JSON.parse(raw);
|
|
239
|
+
const targets = normalizeSkillTargets(data);
|
|
240
|
+
if (targets !== null)
|
|
241
|
+
return targets;
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
/* fall through */
|
|
245
|
+
}
|
|
246
|
+
return shouldUseClaudeAssetFallback(runtimeManifest)
|
|
247
|
+
? [{ provider: "claude", root: CLAUDE_SKILLS_DIR, skills: FALLBACK_SKILL_NAMES }]
|
|
248
|
+
: [];
|
|
249
|
+
}
|
|
250
|
+
async function readAgentsManifest(home) {
|
|
251
|
+
try {
|
|
252
|
+
const raw = await fs.readFile(join(home, AGENTS_MANIFEST_REL), "utf8");
|
|
253
|
+
const data = JSON.parse(raw);
|
|
254
|
+
if (Array.isArray(data?.agents))
|
|
255
|
+
return data.agents;
|
|
256
|
+
}
|
|
257
|
+
catch {
|
|
258
|
+
/* fall through */
|
|
259
|
+
}
|
|
260
|
+
return FALLBACK_AGENT_NAMES;
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=uninstall.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.mjs","sourceRoot":"","sources":["../../../src/commands/lifecycle/uninstall.mts"],"names":[],"mappings":"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"}
|