okstra 0.102.1 → 0.102.2

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.kr.md CHANGED
@@ -76,8 +76,7 @@ okstra/ npm 패키지 = repo 루트
76
76
  └── .locks/ central/task mutex 파일
77
77
 
78
78
  ~/.claude/skills/ Claude Code 가 자동 인식 (`~/.claude` 가 있을 때)
79
- ~/.agent/skills/ Agent 호환 host 가 인식 (`~/.agent` 있을 때)
80
- ~/.omp/agent/skills/ 둘 다 없을 때 OMP-native fallback skill target
79
+ ~/.agent/skills/ Agent 호환 host 가 인식 (`install` 생성)
81
80
  └── okstra-*/SKILL.md 사용자 노출 스킬 7종만 (setup/brief/run/memory/inspect/schedule/container)
82
81
 
83
82
  ~/.claude/agents/ Claude Code 가 자동 인식 (`~/.claude` 가 있을 때)
@@ -98,7 +97,7 @@ okstra/ npm 패키지 = repo 루트
98
97
  |---|---|---|
99
98
  | 런타임 코드 (python + bash) | `~/.okstra/{lib/python, bin}` | `okstra install` |
100
99
  | agents/prompts/schemas/templates/validators | npm 패키지의 `runtime/` | `okstra` 패키지 자체 (`okstra paths` 로 해석) |
101
- | 스킬 마크다운 | `~/.claude/skills`, `~/.agent/skills`, 또는 `~/.omp/agent/skills` | `okstra install` (`installed-skills.json` 에 target별 트래킹) |
100
+ | 스킬 마크다운 | `~/.claude/skills` 또는 `~/.agent/skills` | `okstra install` (`installed-skills.json` 에 target별 트래킹) |
102
101
  | 워커 에이전트 마크다운 | `~/.claude/agents/<worker>.md` | `~/.claude` 가 있을 때 `okstra install` (`installed-agents.json` 에 트래킹) |
103
102
  | 프로젝트 메타데이터 | `<project>/.okstra/` | `/okstra-setup` + 프로젝트 자체 |
104
103
  | Run 인덱스 | `~/.okstra/{recent,active}.jsonl` | `prepare_task_bundle` |
@@ -111,7 +110,7 @@ okstra/ npm 패키지 = repo 루트
111
110
  npx -y okstra@latest install
112
111
  ```
113
112
 
114
- `~/.okstra/{lib/python, bin, templates, prompts, version}` 과 `~/.okstra/` 의 설치 asset manifest 를 생성합니다. 스킬 설치는 host home 기준입니다. `~/.claude` 가 있으면 public skill 을 `~/.claude/skills/` 에, worker agent 를 `~/.claude/agents/` 에 설치하고, `~/.agent` 가 있으면 public skill 을 `~/.agent/skills/` 에도 설치합니다. 없고 `~/.omp/agent` 있으면 public skill 을 `~/.omp/agent/skills/` 에 설치합니다. 사용자 진입점 스킬만 목록에 보이고, lead/support 운영 계약은 `~/.okstra/prompts/` 아래 runtime resource 로 설치되어 skill discovery 대상이 아닙니다. 재실행은 idempotent — 파일별 hash 를 비교하고 바뀐 파일만 갱신합니다.
113
+ `~/.okstra/{lib/python, bin, templates, prompts, version}` 과 `~/.okstra/` 의 설치 asset manifest 를 생성합니다. 스킬 설치는 host home 기준입니다. `~/.claude` 가 있으면 public skill 을 `~/.claude/skills/` 에, worker agent 를 `~/.claude/agents/` 에 설치하고, `~/.agent/skills/` 항상 생성해 Agent 호환 host public skill 을 설치합니다. 사용자 진입점 스킬만 목록에 보이고, lead/support 운영 계약은 `~/.okstra/prompts/` 아래 runtime resource 로 설치되어 skill discovery 대상이 아닙니다. 재실행은 idempotent — 파일별 hash 를 비교하고 바뀐 파일만 갱신합니다.
115
114
 
116
115
  검증:
117
116
 
@@ -131,7 +130,7 @@ okstra --version # CLI 가 PATH 에 잡혔는지 확인
131
130
  okstra install # 'npx -y okstra@latest install' 과 동일
132
131
  ```
133
132
 
134
- 글로벌 설치는 Node CLI 를 PATH 에 등록할 뿐입니다. 런타임(`~/.okstra/`) 과 host skill directory(`~/.claude/skills/`, `~/.agent/skills/`, 또는 `~/.omp/agent/skills/`) 는 여전히 `okstra install` 이 생성합니다 — `npm i -g` 에 포함되지 않습니다. 이후 업그레이드: `npm i -g okstra@latest && okstra install`. 글로벌 바이너리 제거: `npm uninstall -g okstra` (`~/.okstra/` 는 그대로; 그것까지 지우려면 `okstra uninstall`).
133
+ 글로벌 설치는 Node CLI 를 PATH 에 등록할 뿐입니다. 런타임(`~/.okstra/`) 과 host skill directory(`~/.claude/skills/` 또는 `~/.agent/skills/`) 는 여전히 `okstra install` 이 생성합니다 — `npm i -g` 에 포함되지 않습니다. 이후 업그레이드: `npm i -g okstra@latest && okstra install`. 글로벌 바이너리 제거: `npm uninstall -g okstra` (`~/.okstra/` 는 그대로; 그것까지 지우려면 `okstra uninstall`).
135
134
 
136
135
  **글로벌 설치 시 스킬 동작.** 모든 okstra 스킬은 PATH 에 잡힌 `okstra` 를 자동 감지하여 `npx -y okstra@latest` 대신 우선 사용합니다. 즉 글로벌 설치를 해두면 매 스킬 호출(`okstra-run`, `okstra-inspect`, `okstra-schedule`, `okstra-setup` Step 2 의 Step 0) 마다 npx 가 패키지 fetch / 버전 체크하던 비용이 사라집니다. 스킬이 본인이 설치한 버전을 그대로 쓰므로 **업그레이드 타이밍은 사용자가 통제** 합니다 — 더 이상 호출마다 `@latest` 가 강제되지 않습니다. 새 릴리스를 받으려면 원하는 시점에 `npm i -g okstra@latest && okstra install` 을 실행하세요. `okstra` 가 PATH 에 없으면 스킬은 자동으로 npx fallback 으로 동작하므로 글로벌 설치가 없는 환경에서도 변경 없이 그대로 동작합니다.
137
136
 
package/README.md CHANGED
@@ -74,8 +74,7 @@ okstra/ npm package = repo root
74
74
  └── .locks/ central/task mutex files
75
75
 
76
76
  ~/.claude/skills/ discovered automatically by Claude Code (if ~/.claude exists)
77
- ~/.agent/skills/ discovered by Agent-compatible hosts (if ~/.agent exists)
78
- ~/.omp/agent/skills/ fallback OMP-native skill target when neither exists
77
+ ~/.agent/skills/ discovered by Agent-compatible hosts (created by install)
79
78
  └── okstra-*/SKILL.md user-facing skills only (setup/brief/run/memory/inspect/schedule/container)
80
79
 
81
80
  ~/.claude/agents/ discovered automatically by Claude Code (if ~/.claude exists)
@@ -96,7 +95,7 @@ okstra/ npm package = repo root
96
95
  |---|---|---|
97
96
  | Runtime code (python + bash) | `~/.okstra/{lib/python, bin}` | `okstra install` |
98
97
  | agents/prompts/schemas/templates/validators | npm package's `runtime/` | the `okstra` package (resolved via `okstra paths`) |
99
- | Skill markdown | `~/.claude/skills`, `~/.agent/skills`, or `~/.omp/agent/skills` | `okstra install` (tracked per target in `installed-skills.json`) |
98
+ | Skill markdown | `~/.claude/skills` or `~/.agent/skills` | `okstra install` (tracked per target in `installed-skills.json`) |
100
99
  | Worker agent markdown | `~/.claude/agents/<worker>.md` | `okstra install` when `~/.claude` exists (tracked in `installed-agents.json`) |
101
100
  | Project metadata | `<project>/.okstra/` | `/okstra-setup` + the project itself |
102
101
  | Run index | `~/.okstra/{recent,active}.jsonl` | `prepare_task_bundle` |
@@ -109,7 +108,7 @@ okstra/ npm package = repo root
109
108
  npx -y okstra@latest install
110
109
  ```
111
110
 
112
- Provisions `~/.okstra/{lib/python, bin, templates, prompts, version}` and the installed-asset manifests in `~/.okstra/`. Skill installation is host-home driven: if `~/.claude` exists, okstra copies public skills to `~/.claude/skills/` and worker agents to `~/.claude/agents/`; if `~/.agent` exists, it also copies public skills to `~/.agent/skills/`; if neither exists and `~/.omp/agent` exists, it copies public skills to `~/.omp/agent/skills/`. Lead/support contracts ship as runtime resources under `~/.okstra/prompts/` and are not agent skills. Re-running is idempotent — per-file hashes are compared and only changed files are touched.
111
+ Provisions `~/.okstra/{lib/python, bin, templates, prompts, version}` and the installed-asset manifests in `~/.okstra/`. Skill installation is host-home driven: if `~/.claude` exists, okstra copies public skills to `~/.claude/skills/` and worker agents to `~/.claude/agents/`; it always creates `~/.agent/skills/` and copies public skills there for Agent-compatible hosts. Lead/support contracts ship as runtime resources under `~/.okstra/prompts/` and are not agent skills. Re-running is idempotent — per-file hashes are compared and only changed files are touched.
113
112
 
114
113
  Verify:
115
114
 
@@ -129,7 +128,7 @@ okstra --version # confirm the CLI is on PATH
129
128
  okstra install # same as 'npx -y okstra@latest install'
130
129
  ```
131
130
 
132
- The global install only registers the Node CLI on your PATH. The runtime (`~/.okstra/`) and host skill directories (`~/.claude/skills/`, `~/.agent/skills/`, or `~/.omp/agent/skills/`) are still provisioned by `okstra install` — they are not part of `npm i -g`. To upgrade later: `npm i -g okstra@latest && okstra install`. To remove the global binary: `npm uninstall -g okstra` (leaves `~/.okstra/` untouched; remove that with `okstra uninstall`).
131
+ The global install only registers the Node CLI on your PATH. The runtime (`~/.okstra/`) and host skill directories (`~/.claude/skills/` or `~/.agent/skills/`) are still provisioned by `okstra install` — they are not part of `npm i -g`. To upgrade later: `npm i -g okstra@latest && okstra install`. To remove the global binary: `npm uninstall -g okstra` (leaves `~/.okstra/` untouched; remove that with `okstra uninstall`).
133
132
 
134
133
  **Skill behaviour with a global install.** All okstra skills auto-detect a PATH-resolved `okstra` and prefer it over `npx -y okstra@latest`. That means a global install removes the per-call npx fetch / version-check from every skill invocation (Step 0 of `okstra-run`, `okstra-inspect`, `okstra-schedule`, `okstra-setup` Step 2). Since the skill uses your globally installed version directly, *you* control upgrade timing — `@latest` is no longer forced on each call. Run `npm i -g okstra@latest && okstra install` whenever you want to pull a new release. If `okstra` is not on PATH the skill silently falls back to npx, so machines without a global install keep working unchanged.
135
134
 
@@ -113,7 +113,7 @@ scripts/okstra.sh workflow가 사용하는 project-local Claude assets는 아래
113
113
  - `.okstra/discovery/latest-task.json`: 현재 프로젝트에서 가장 최근에 준비된 okstra task bundle을 가리키는 current-task convenience pointer
114
114
  - `.okstra/discovery/task-catalog.json`: 현재 프로젝트에 준비된 okstra task bundle 목록을 `taskKey`, `taskGroup`, `taskId` 기준으로 유지하는 canonical project-level catalog
115
115
  - `instruction-set/reference-expectations.md`: 현재 task가 참조해야 할 config files, deployment manifests, expected values를 task-level canonical artifact로 정리한 파일
116
- - `~/.claude/skills/okstra-*/...`, `~/.agent/skills/okstra-*/...`, `~/.omp/agent/skills/okstra-*/...`, `~/.claude/agents/...`: `okstra install` 이 사용자 홈에 seed하는 skill/agent asset (project-local 시딩은 더 이상 발생하지 않음 — `okstra install --refresh` 로 갱신)
116
+ - `~/.claude/skills/okstra-*/...`, `~/.agent/skills/okstra-*/...`, `~/.claude/agents/...`: `okstra install` 이 사용자 홈에 seed하는 skill/agent asset (project-local 시딩은 더 이상 발생하지 않음 — `okstra install --refresh` 로 갱신)
117
117
 
118
118
  이전의 아래 파일들은 더 이상 okstra 생성 대상이 아닙니다.
119
119
 
@@ -18,7 +18,7 @@
18
18
  - **Single python authority**: 모든 prepare wiring(profile/workers/model 해소, path 계산, render, central record_start)이 [`okstra_ctl.run.prepare_task_bundle()`](../../scripts/okstra_ctl/run.py) 한 함수에 모여 있습니다. `okstra.sh` 와 `okstra-run` skill 은 같은 함수를 호출하는 thin caller 이며, 환경 변수로 상태를 전달하지 않습니다 — task 정체성·경로·workflow 상태는 모두 디스크 권위 파일에서 매번 계산됩니다.
19
19
  - **Claude handoff (두 모드)**: (a) `okstra.sh` 가 새 `claude` 프로세스를 띄우는 전통 방식, (b) `okstra-run` skill 이 현재 claude 세션 안에서 prepare 후 lead 역할을 그대로 인계받는 in-session 모드. 둘 다 `prepare_task_bundle` 의 산출물(instruction-set 등)을 그대로 사용합니다.
20
20
  - **Required team contract**: 각 phase profile의 `Required workers:` 블록이 roster의 권위입니다. 일반 분석 phase는 Claude/Codex analyser + report-writer를 기본으로 하고, Antigravity는 profile과 `--workers`가 허용할 때만 포함됩니다. `release-handoff`처럼 lead-only에 가까운 phase는 별도 roster를 가집니다.
21
- - **User-home install + project-local task bundles**: `npx okstra@latest install` 한 명령이 런타임(`~/.okstra/{lib/python, bin, templates, prompts}`)을 설치하고, 존재하는 agent home public skill 만 복사합니다. `~/.claude` 가 있으면 Claude skills + worker agent 4종(`~/.claude/agents/*-worker.md`), `~/.agent` 가 있으면 Agent skills, 둘 다 없고 `~/.omp/agent` 가 있으면 OMP-native skills 를 설치합니다. 사용자 진입점 스킬만 목록에 노출되고 lead/support 운영 계약은 `~/.okstra/prompts/` 아래 runtime resource 로 설치되어 skill discovery 대상이 아닙니다. 전역 대화 메모리는 프로젝트와 분리된 `~/.okstra/memory-book/` 에 저장됩니다. 대상 프로젝트에는 task bundle 과 discovery metadata 가 `.okstra/` 아래 저장되고, **추가로 `<PROJECT_ROOT>/.claude/settings.local.json` 이 `~/.okstra/templates/settings.local.json` 을 가리키는 symlink 로 provisioning** 됩니다 (`okstra setup` 또는 `okstra-ctl` prepare 가 idempotent 하게 관리; 기존에 일반 파일이 있었다면 `.bak.<timestamp>` 로 보존 후 교체).
21
+ - **User-home install + project-local task bundles**: `npx okstra@latest install` 한 명령이 런타임(`~/.okstra/{lib/python, bin, templates, prompts}`)을 설치하고, public skill 을 `~/.agent/skills/`기본 설치합니다. `~/.claude` 가 있으면 Claude skills + worker agent 4종(`~/.claude/agents/*-worker.md`) 함께 설치합니다. 사용자 진입점 스킬만 목록에 노출되고 lead/support 운영 계약은 `~/.okstra/prompts/` 아래 runtime resource 로 설치되어 skill discovery 대상이 아닙니다. 전역 대화 메모리는 프로젝트와 분리된 `~/.okstra/memory-book/` 에 저장됩니다. 대상 프로젝트에는 task bundle 과 discovery metadata 가 `.okstra/` 아래 저장되고, **추가로 `<PROJECT_ROOT>/.claude/settings.local.json` 이 `~/.okstra/templates/settings.local.json` 을 가리키는 symlink 로 provisioning** 됩니다 (`okstra setup` 또는 `okstra-ctl` prepare 가 idempotent 하게 관리; 기존에 일반 파일이 있었다면 `.bak.<timestamp>` 로 보존 후 교체).
22
22
  - **Resume and clarification**: `--task-key`, `--resume-clarification`, `--clarification-response`로 같은 task 재개와 lead의 추가 질문 응답 흐름을 지원합니다.
23
23
  - **Derived views and telemetry**: final-report data.json → Markdown → slim MD / self-contained HTML view, worker error sidecar, wrapper log sidecar, token usage / cost accounting을 제공합니다.
24
24
 
@@ -149,7 +149,7 @@ okstra 의 prepare 책임은 단일 python 진입점 [`okstra_ctl.run.prepare_ta
149
149
  - 사용자 호출 가능 스킬은 `skills/okstra-setup/SKILL.md`, `skills/okstra-brief/SKILL.md`, `skills/okstra-run/SKILL.md`, `skills/okstra-memory/SKILL.md`, `skills/okstra-inspect/SKILL.md`, `skills/okstra-schedule/SKILL.md`, `skills/okstra-container-build/SKILL.md` 7종뿐이며, 이것만 agent skill home 으로 복사됩니다 — brief 작성, phase 진행, 전역 Memory Book 저장/검색, status/history/report/time/logs/cost/errors/recap read-side, schedule 보조, 그리고 `okstra-container-build` 는 검증 완료된 task 코드를 docker compose 그룹으로 배포하고 컨테이너별 watcher 로 감시하는 비선형(PHASE_SEQUENCE 외부) 컨테이너 배포/감시 스킬. `okstra-inspect` 의 read-side facet 은 `skills/okstra-inspect/SKILL.md` 의 sub-command 표가 정본인 8종입니다. `okstra-inspect logs` 는 codex/antigravity wrapper 가 매 dispatch 마다 `runs/<task-type>/prompts/<worker>-prompt-<phase>-<seq>.log` 로 남기는 live-log sidecar 의 인벤토리·정리 안내(read-only), `okstra-inspect cost` 는 `okstra context-cost` 결과 요약, `okstra-inspect errors` 는 task 의 okstra-run 에러 로그를 타임스탬프 markdown error-report 로 모아 렌더하고 요약을 출력, `okstra-inspect recap` 은 task 의 run 간 phase 전·후 요약에 더해 `.okstra` 산출물에 대한 자유 Q&A 까지 답합니다.
150
150
  - 내부 운영 계약 — `context-loader` / `team-contract` / `convergence` / `report-writer` 와 lead 계약 — 은 `prompts/lead/*.md` 로, 구현/검증 워커의 언어별 coding preflight 는 `prompts/coding-preflight/*` (overview 라우터 + clean-code + languages/frameworks/architectures 3단계 선택) 로 이동했습니다. 모두 `~/.okstra/prompts/` 에 설치되는 런타임 리소스이며 skill discovery 대상이 아닙니다. generated launch prompt 가 lead 에게 절대 경로를 제공하고, 재설치 시 과거 `okstra-context-loader` / `okstra-team-contract` / `okstra-convergence` / `okstra-report-writer` / `okstra-coding-preflight` / `okstra` skill 디렉터리는 exact-name prune 됩니다.
151
151
  - 플러그인 매니페스트: [`../../.claude-plugin/plugin.json`](../../.claude-plugin/plugin.json) — `npx skills@latest add Devonshin/okstra` 보조 채널이 참조. 일반 셋업에는 `npx okstra@latest install` 을 사용한다. 플러그인 매니페스트는 사용자 진입점 7개(`okstra-setup`, `okstra-brief`, `okstra-run`, `okstra-memory`, `okstra-inspect`, `okstra-schedule`, `okstra-container-build`)만 노출한다.
152
- - 설치 위치: `~/.claude/skills/<name>/SKILL.md`, `~/.agent/skills/<name>/SKILL.md`, 또는 fallback `~/.omp/agent/skills/<name>/SKILL.md`.
152
+ - 설치 위치: `~/.claude/skills/<name>/SKILL.md` 또는 `~/.agent/skills/<name>/SKILL.md`.
153
153
  - 릴리스 절차: [`../../RELEASING.md`](../../RELEASING.md) — npm publish 흐름과 release-please / manual fallback.
154
154
 
155
155
  ## Architecture: python authority + thin callers
@@ -737,8 +737,8 @@ phase 산출물의 출고 가능 여부를 강제하는 진입점:
737
737
  - Executor 별 worktree cwd 주입: codex / antigravity executor 는 wrapper(`okstra-codex-exec.sh -C` / `okstra-antigravity-exec.sh --include-directories`) 가 CLI layer 에서 cwd 를 worktree 로 고정합니다. Claude executor 는 Bash tool 에 per-call cwd 인자가 없어 cwd 민감 toolchain (`cargo`/`npm`/`pnpm`/`bun`/`pytest`/`make`/`go`) 호출을 같은 Bash invocation 안에서 `cd {{EXECUTOR_WORKTREE_PATH}} && <cmd>` 로 prefix 합니다 — `bash -lc`/`bash -c` 래핑은 금지되며 (`cd` leading token 이 가려져 permission auto-allow 우회 실패), 작업 디렉터리 플래그 (`git -C`, `cargo --manifest-path` 등) 가 있으면 그것을 우선합니다. 자세한 규약은 `prompts/profiles/implementation.md` 의 *Executor Worktree* 블록과 `agents/workers/claude-worker.md` 의 Executor exception 항목 참고.
738
738
  - project-level current-task convenience pointer는 `.okstra/discovery/latest-task.json`입니다.
739
739
  - project-level canonical task inventory는 `.okstra/discovery/task-catalog.json`입니다.
740
- - okstra skill asset은 `okstra install` 시점에 존재하는 agent home 기준으로 seed됩니다: `~/.claude/skills/` + `~/.claude/agents/`, `~/.agent/skills/`, 또는 fallback `~/.omp/agent/skills/` (per-project seeding은 더 이상 수행되지 않음).
741
- - seeded okstra Claude assets는 세션의 implicit team 에 `Agent(name: ...)` 로 워커를 dispatch 하는 규칙을 Claude에게 제공합니다(v2.1.178 이 `TeamCreate`/`TeamDelete` 제거). Codex/OMP targets 는 skill markdown 만 받습니다.
740
+ - okstra skill asset은 `okstra install` 시점에 `~/.agent/skills/` 기본 seed 되고, `~/.claude` 가 있으면 `~/.claude/skills/` + `~/.claude/agents/` 함께 seed 됩니다(per-project seeding은 더 이상 수행되지 않음).
741
+ - seeded okstra Claude assets는 세션의 implicit team 에 `Agent(name: ...)` 로 워커를 dispatch 하는 규칙을 Claude에게 제공합니다(v2.1.178 이 `TeamCreate`/`TeamDelete` 제거). Agent targets 는 skill markdown 만 받습니다.
742
742
  - 최종 판단은 스크립트가 아니라 Claude가 수행합니다.
743
743
  - stable task key를 유지해야 이후 bug 추적, 재수정, 재검증이 가능합니다.
744
744
  - 워커 에러는 옵션 sidecar `runs/<task-type>/logs/errors-<task-type>-<seq>.jsonl`로 수집되며 lead가 단독 writer입니다. 진입점 helper는 `scripts/okstra-error-log.py`입니다.
package/docs/kr/cli.md CHANGED
@@ -320,7 +320,7 @@ Lead runtime independence boundary:
320
320
  - `codex`: Codex lead adapter 용 runtime marker 입니다. `okstra codex-run` 이 `--render-only --lead-runtime codex` 를 소유해 task bundle 을 준비하고, 준비된 run manifest 는 `okstra codex-dispatch` 로 CLI-backed worker 실행에 넘길 수 있습니다.
321
321
  - `external`: Claude Code Teams 없이 `--render-only --lead-runtime external` 로 task bundle 과 external lead prompt 를 준비하고, lead 는 `okstra team dispatch` / `okstra team await` / `okstra team teardown` 으로 tmux-pane worker lifecycle 을 관리합니다. 이 path 는 `TeamCreate` / `Agent(...)` 를 쓰지 않고 artifact-only accounting 을 사용합니다.
322
322
 
323
- 현재 Claude Code 독립 범위는 external lead prompt + `okstra team *` worker dispatch 입니다. non-render `okstra_ctl.run --lead-runtime external` remains blocked; 완전한 external lead driver 는 아직 별도 구현 대상입니다. `--runtime external` 은 runtime adapter 선택만 의미하며, 스킬 설치 여부는 `~/.claude` / `~/.agent` / `~/.omp/agent` home 존재 여부가 결정합니다. `claude` worker 선택은 여전히 local Claude CLI wrapper 를 필요로 합니다.
323
+ 현재 Claude Code 독립 범위는 external lead prompt + `okstra team *` worker dispatch 입니다. non-render `okstra_ctl.run --lead-runtime external` remains blocked; 완전한 external lead driver 는 아직 별도 구현 대상입니다. `--runtime external` 은 runtime adapter 선택만 의미하며, `okstra install` `~/.agent/skills/` 를 기본 생성하고 `~/.claude` 있으면 Claude skill/agent 설치합니다. `claude` worker 선택은 여전히 local Claude CLI wrapper 를 필요로 합니다.
324
324
 
325
325
  ### Runtime auto-detection (`auto`)
326
326
 
@@ -330,9 +330,9 @@ Lead runtime independence boundary:
330
330
  - Codex host: `okstra run` 이 `codex-run` -> `codex-dispatch` 를 orchestration 합니다.
331
331
  - generic terminal + tmux: `okstra run` 이 `render-bundle --lead-runtime external` -> `okstra team dispatch` -> `okstra team await` 를 orchestration 합니다.
332
332
 
333
- `doctor` / `render-bundle` 도 `auto` 를 기본값으로 받지만, host signal 이 없는 plain terminal 에서는 host 지정이 필요합니다. `okstra install` / `ensure-installed` 는 예외입니다. 설치는 runtime host 가 아니라 agent home 기준으로 공유 runtime 과 skill target 을 배치하므로, host signal 이 없어도 `auto` 요청과 미해결 상태를 manifest 에 기록하고 설치를 계속합니다. 스킬 복사 대상은 runtime resolution 이 아니라 agent home 존재 여부입니다. Claude Code skill 들은 `--runtime claude-code` / `--lead-runtime claude-code` 를 명시하므로 실행 단계에서 host auto-detection 에 의존하지 않습니다. `~/.claude` 와 `~/.agent` 가 있으면 둘 다 설치하고, 둘 다 없을 때만 `~/.omp/agent` 를 fallback 으로 사용합니다.
333
+ `doctor` / `render-bundle` 도 `auto` 를 기본값으로 받지만, host signal 이 없는 plain terminal 에서는 host 지정이 필요합니다. `okstra install` / `ensure-installed` 는 예외입니다. 설치는 runtime host 가 아니라 agent home 기준으로 공유 runtime 과 skill target 을 배치하므로, host signal 이 없어도 `auto` 요청과 미해결 상태를 manifest 에 기록하고 설치를 계속합니다. 스킬 복사 대상은 runtime resolution 이 아니라 agent home 존재 여부와 기본 Agent target 정책입니다. `~/.agent/skills/` 는 항상 생성하고, `~/.claude` 가 있으면 Claude skills/agents 도 설치합니다. Claude Code skill 들은 `--runtime claude-code` / `--lead-runtime claude-code` 를 명시하므로 실행 단계에서 host auto-detection 에 의존하지 않습니다.
334
334
 
335
- `installed-runtimes.json` 은 schemaVersion 2 로 `installRequest`, `runtimeResolution`, `installedRuntimes`, `installedAssets` 를 분리합니다. `installed-skills.json` 은 schemaVersion 2 target 목록(`provider`, `root`, `skills`)으로 Claude/Codex/OMP skill target 을 기록하며, uninstall 은 이 target 목록을 기준으로 제거합니다. 이전 `codexAdapter` / `externalAdapter` 는 v1 manifest read 호환 경로에서만 해석됩니다.
335
+ `installed-runtimes.json` 은 schemaVersion 2 로 `installRequest`, `runtimeResolution`, `installedRuntimes`, `installedAssets` 를 분리합니다. `installed-skills.json` 은 schemaVersion 2 target 목록(`provider`, `root`, `skills`)으로 Claude/Agent skill target 을 기록하며, uninstall 은 이 target 목록을 기준으로 제거합니다. 이전 `codexAdapter` / `externalAdapter` 는 v1 manifest read 호환 경로에서만 해석됩니다.
336
336
 
337
337
  Codex lead dry-run 은 `okstra codex-run <args...>` 를 쓰면 됩니다. 이 명령은 `--render-only --lead-runtime codex` 를 직접 붙이고, worker dispatch 없이 준비된 task bundle 과 lead prompt 를 출력합니다.
338
338
  생성된 team-state / run-manifest / task-manifest 는 `leadEventsPath` 로 `runs/<task-type>/state/lead-events-<task-type>-<seq>.jsonl` 를 가리키며, render 단계는 `bundle-prepared` event 를 기록합니다.
@@ -625,8 +625,8 @@ chmod +x ~/.local/bin/okstra-ctl
625
625
  | 명령 | 용도 |
626
626
  |---|---|
627
627
  | `okstra paths [--field <name>\|--shell]` | package/runtime/home/bin/pythonpath/version 경로 출력 |
628
- | `okstra install [--runtime claude-code\|codex\|external\|all] [--refresh\|--dry-run\|--link <repo>]` | runtime, templates, skills, agents 설치/갱신. 기본 runtime 은 `auto`; 스킬 대상은 runtime 이 아니라 기존 home 기준이다. `~/.claude` 가 있으면 Claude skills + agents, `~/.agent` 가 있으면 Agent skills, 둘 다 없고 `~/.omp/agent` 가 있으면 OMP skills 를 설치한다 |
629
- | `okstra ensure-installed [--runtime claude-code\|codex\|external\|all] [-q]` | 설치 상태 확인, stale이면 같은 runtime 으로 재설치. 기본 `auto` 는 host signal 이 없어도 설치를 계속하며, 존재하는 skill target 의 drift 검사한다 |
628
+ | `okstra install [--runtime claude-code\|codex\|external\|all] [--refresh\|--dry-run\|--link <repo>]` | runtime, templates, skills, agents 설치/갱신. 기본 runtime 은 `auto`; 스킬 대상은 runtime 이 아니다. `~/.agent/skills/` 항상 생성하고, `~/.claude` 가 있으면 Claude skills + agents 설치한다 |
629
+ | `okstra ensure-installed [--runtime claude-code\|codex\|external\|all] [-q]` | 설치 상태 확인, stale이면 같은 runtime 으로 재설치. 기본 `auto` 는 host signal 이 없어도 설치를 계속하며, Agent skill target 과 존재하는 Claude target 의 drift 검사한다 |
630
630
  | `okstra uninstall [--purge -y]` | 설치 자산 제거. 기본값은 `installed-skills.json` target 목록과 `installed-agents.json` 기준으로 제거하고 사용자 데이터는 보존 |
631
631
  | `okstra doctor [--runtime claude-code\|codex\|external\|all] [--phase <phase>] [--json]` | runtime + Python import + skill/agent 설치 진단. `codex` / `external` runtime 은 Claude skill checks 를 제외한다. `--phase` 는 `implementation`, `final-verification`, `release-handoff`, `improvement-discovery` 실행 전 readiness 체크를 추가한다 |
632
632
  | `okstra setup --project-id <id>` | 현재 프로젝트의 `.okstra/project.json` 생성/갱신 |
@@ -124,7 +124,7 @@ Runtime/install asset changes follow this checklist:
124
124
  - `runtime/python/*` → `~/.okstra/lib/python/`
125
125
  - `runtime/bin/*` → `~/.okstra/bin/`
126
126
  - `runtime/templates/*` → `~/.okstra/templates/`
127
- - `runtime/skills/<name>` (the seven user-facing skills only) → existing skill homes: `~/.claude/skills`, `~/.agent/skills`, or fallback `~/.omp/agent/skills`
127
+ - `runtime/skills/<name>` (the seven user-facing skills only) → `~/.agent/skills` always, plus `~/.claude/skills` when `~/.claude` exists
128
128
  - `runtime/prompts/*` → `~/.okstra/prompts/` (lead contracts under `prompts/lead/`, coding-preflight pack under `prompts/coding-preflight/`)
129
129
  - `runtime/agents/workers/*.md` → `~/.claude/agents/*-worker.md` when `~/.claude` exists
130
130
  - install manifests → `~/.okstra/installed-skills.json` (target-aware), `~/.okstra/installed-agents.json`
@@ -132,7 +132,7 @@ Runtime/install asset changes follow this checklist:
132
132
 
133
133
  `--link <repo>` mode is for development and symlinks installed files back to repo sources.
134
134
 
135
- `src/lib/runtime-resolver.mjs` is the single reference point for runtime auto-detection. `okstra install` defaults to `--runtime auto`, records the request and any successful resolution in `installed-runtimes.json` schemaVersion 2, and still copies the shared runtime payload from the installed package `runtime/` tree even when host detection is unavailable. Skill targets are discovered from existing agent homes: `~/.claude` and `~/.agent` are both populated when present; `~/.omp/agent` is the fallback only when neither exists. Dynamic capabilities such as `tmux` and `codex` CLI availability are checked by `doctor` and `run`, not frozen into the install manifest. Claude Code skills pass explicit `--runtime claude-code` / `--lead-runtime claude-code` so they never depend on host auto-detection.
135
+ `src/lib/runtime-resolver.mjs` is the single reference point for runtime auto-detection. `okstra install` defaults to `--runtime auto`, records the request and any successful resolution in `installed-runtimes.json` schemaVersion 2, and still copies the shared runtime payload from the installed package `runtime/` tree even when host detection is unavailable. Skill targets always include the default Agent-compatible `~/.agent/skills` target, with `~/.claude/skills` also populated when `~/.claude` exists. Dynamic capabilities such as `tmux` and `codex` CLI availability are checked by `doctor` and `run`, not frozen into the install manifest. Claude Code skills pass explicit `--runtime claude-code` / `--lead-runtime claude-code` so they never depend on host auto-detection.
136
136
 
137
137
  ---
138
138
 
@@ -293,9 +293,9 @@ test("install prunes obsolete internal skill directories from prior installs", (
293
293
  });
294
294
  ```
295
295
 
296
- - [ ] **Step 7: Update OMP fallback test**
296
+ - [ ] **Step 7: Remove legacy fallback skill target test**
297
297
 
298
- Change the OMP test to assert `okstra-run` exists and `okstra-team-contract` does not exist.
298
+ Remove the obsolete fallback-target test; supported skill homes are Claude and Agent only.
299
299
 
300
300
  - [ ] **Step 8: Run targeted install/uninstall tests**
301
301
 
@@ -16,7 +16,7 @@ okstra core 는 이미 비교적 하네스 중립적이다(선행 §1). 문제
16
16
  | `claude-code` | 네이티브 `TeamCreate`/`Agent(...)` ([agents/SKILL.md:212](../../../agents/SKILL.md:212)) | result-file 폴링([team-contract:124](../../../skills/okstra-team-contract/SKILL.md:124)) | Claude Teams split-pane + okstra trace pane |
17
17
  | `codex` | 동기 `subprocess.run(worker.command)` ([codex_dispatch.py:1033](../../../scripts/okstra_ctl/codex_dispatch.py:1033)), render-only 게이트([run.py:2057](../../../scripts/okstra_ctl/run.py:2057)) | `returncode==0 and not missing_paths` ([codex_dispatch.py:213](../../../scripts/okstra_ctl/codex_dispatch.py:213)) | okstra trace pane 만, **순차** |
18
18
 
19
- 사용자 목표: **tmux 세션이기만 하면 어떤 하네스(Claude Code / Codex / pi / omp / …)에서든, 사용자가 모든 worker pane 을 보면서 lead+worker 가 도는 중립 team layer.**
19
+ 사용자 목표: **tmux 세션이기만 하면 어떤 하네스(Claude Code / Codex / pi / generic external CLI / …)에서든, 사용자가 모든 worker pane 을 보면서 lead+worker 가 도는 중립 team layer.**
20
20
 
21
21
  검토(2026-06-13)에서 확인한 현황:
22
22
 
@@ -40,7 +40,7 @@ okstra core 는 이미 비교적 하네스 중립적이다(선행 §1). 문제
40
40
  | `leadRuntime` | `claude-code` · `codex` · **`external`(신규)** | lead 정체성·라벨·lead 회계·conformance source | manifest / team-state |
41
41
  | **worker dispatch backend** | `team`(Claude Teams) · `cli-wrapper`/`mixed`(codex 현행) · **`tmux-pane`(신규)** | worker 를 어떻게 spawn·표시·완료판정 하는가 | `team_state.dispatchMode` + `workers[].backendType` (기존 필드 재사용) |
42
42
 
43
- 두 축은 **직교**한다: `(codex, tmux-pane)`(codex lead + 보이는 pane), `(external, tmux-pane)`(pi/omp lead + pane), 나아가 `(claude-code, tmux-pane)`(Claude lead 가 Teams 대신 okstra pane 선택)도 표현 가능. 첫 cut 의 타깃은 `(external, tmux-pane)` 이고, 나머지 조합은 축 분리의 공짜 부산물로 두되 우선 구현하지 않는다.
43
+ 두 축은 **직교**한다: `(codex, tmux-pane)`(codex lead + 보이는 pane), `(external, tmux-pane)`(generic external lead + pane), 나아가 `(claude-code, tmux-pane)`(Claude lead 가 Teams 대신 okstra pane 선택)도 표현 가능. 첫 cut 의 타깃은 `(external, tmux-pane)` 이고, 나머지 조합은 축 분리의 공짜 부산물로 두되 우선 구현하지 않는다.
44
44
 
45
45
  > 단일-참조 주: 별도 `teamBackend` 필드를 새로 만들지 않고 **기존 `team_state.dispatchMode`/`workers[].backendType`** ([codex_dispatch.py:29-30](../../../scripts/okstra_ctl/codex_dispatch.py:29), `BACKEND_CLI_WRAPPER`/`BACKEND_MIXED`)에 값 `tmux-pane` 을 추가한다. `leadAdapter.dispatchMode`(render.py, `render-only`/`team`)는 lead 가 dispatch 하느냐 여부를 가리키는 **다른** 필드임에 유의 — 이 모호성도 본 설계가 §6.1 에서 정리한다.
46
46
 
@@ -170,7 +170,7 @@ lead 는 "백그라운드 폴 → 완료시 깨어남" 으로 완료를 감지
170
170
  | 하네스 | primitive |
171
171
  |---|---|
172
172
  | Claude Code | `Bash(run_in_background:true)` + auto-resume |
173
- | omp / pi | `bash(async:true)` + 자동 결과 전달 / `job poll` |
173
+ | pi / generic external CLI | `bash(async:true)` + 자동 결과 전달 / `job poll` |
174
174
  | Codex | (자체 비동기 메커니즘) |
175
175
 
176
176
  - `okstra team await --run-dir <dir>` 가 §6.4 폴링을 수행하고, 하네스는 이를 자기 비동기 primitive 로 감싼다. okstra 는 폴링 로직(공통)만 소유, "백그라운드로 띄우는 법" 1줄만 lead 프롬프트가 하네스별로 지시.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "okstra",
3
- "version": "0.102.1",
3
+ "version": "0.102.2",
4
4
  "description": "Multi-agent cross-verification orchestrator runtime + Claude Code skills.",
5
5
  "license": "MIT",
6
6
  "author": "devonshin",
@@ -1,5 +1,5 @@
1
1
  {
2
- "package": "0.102.1",
3
- "builtAt": "2026-06-24T14:07:45.289Z",
2
+ "package": "0.102.2",
3
+ "builtAt": "2026-06-24T14:47:45.768Z",
4
4
  "repoRoot": "/home/runner/work/okstra/okstra"
5
5
  }
@@ -6,7 +6,7 @@ export const COMMAND_REGISTRY = [
6
6
  module: "./commands/lifecycle/install.mjs",
7
7
  export: "runInstall",
8
8
  category: "admin",
9
- summary: ["Install runtime; seed skills into existing agent homes"],
9
+ summary: ["Install runtime; seed skills into Agent and Claude homes"],
10
10
  },
11
11
  {
12
12
  name: "ensure-installed",
@@ -14,10 +14,8 @@ const AGENTS_MANIFEST_REL = "installed-agents.json";
14
14
  const USER_HOME = homedir();
15
15
  const CLAUDE_HOME = join(USER_HOME, ".claude");
16
16
  const AGENT_HOME = join(USER_HOME, ".agent");
17
- const OMP_AGENT_HOME = join(USER_HOME, ".omp", "agent");
18
17
  const CLAUDE_SKILLS_DIR = join(CLAUDE_HOME, "skills");
19
18
  const AGENT_SKILLS_DIR = join(AGENT_HOME, "skills");
20
- const OMP_SKILLS_DIR = join(OMP_AGENT_HOME, "skills");
21
19
  const CLAUDE_AGENTS_DIR = join(CLAUDE_HOME, "agents");
22
20
 
23
21
  // Source template (relative to runtime root in copy mode, or repo root in link mode).
@@ -82,8 +80,7 @@ Effect (copy mode):
82
80
  ${"$HOME"}/.okstra/prompts <- runtime/prompts (lead contracts + coding-preflight pack)
83
81
  ${"$HOME"}/.okstra/templates/settings.local.json <- runtime/templates/reports/settings.template.json
84
82
  ${"$HOME"}/.claude/skills/<name> <- skills when ${"$HOME"}/.claude exists
85
- ${"$HOME"}/.agent/skills/<name> <- skills when ${"$HOME"}/.agent exists
86
- ${"$HOME"}/.omp/agent/skills/<name> <- skills fallback when Claude/Agent homes are absent
83
+ ${"$HOME"}/.agent/skills/<name> <- skills (created when needed)
87
84
  ${"$HOME"}/.claude/agents/<worker>.md <- worker agents when ${"$HOME"}/.claude exists
88
85
  ${"$HOME"}/.okstra/installed-runtimes.json <- install request/resolution manifest
89
86
  ${"$HOME"}/.okstra/installed-skills.json <- target-aware manifest of installed skills
@@ -96,8 +93,7 @@ Effect (link mode):
96
93
  ${"$HOME"}/.okstra/prompts -> <repo>/prompts
97
94
  ${"$HOME"}/.okstra/templates/settings.local.json -> <repo>/templates/reports/settings.template.json
98
95
  ${"$HOME"}/.claude/skills/<name> -> <repo>/skills/<name> when ${"$HOME"}/.claude exists
99
- ${"$HOME"}/.agent/skills/<name> -> <repo>/skills/<name> when ${"$HOME"}/.agent exists
100
- ${"$HOME"}/.omp/agent/skills/<name> -> <repo>/skills/<name> fallback
96
+ ${"$HOME"}/.agent/skills/<name> -> <repo>/skills/<name> (created when needed)
101
97
  ${"$HOME"}/.claude/agents/<worker>.md -> <repo>/agents/workers/<worker>.md when ${"$HOME"}/.claude exists
102
98
  ${"$HOME"}/.okstra/dev-link <- <repo> path stamp
103
99
  ${"$HOME"}/.okstra/version <- installed package version stamp
@@ -109,10 +105,10 @@ worker wrapper scripts without modifying the user's global settings.
109
105
 
110
106
  Worker agent definitions are installed into ${"$HOME"}/.claude/agents/ only
111
107
  when ${"$HOME"}/.claude exists, so Claude Code's subagent discovery can pick
112
- them up. Codex/OMP skill targets receive skill markdown only.
108
+ them up. Agent skill targets receive skill markdown only.
113
109
 
114
110
  Default auto runtime installation does not require host detection; it still
115
- installs shared runtime files and any agent-home skill targets it finds.
111
+ installs shared runtime files, the Agent skill target, and any Claude home it finds.
116
112
  `;
117
113
 
118
114
  const ENSURE_USAGE = `okstra ensure-installed — idempotent install check
@@ -401,16 +397,11 @@ async function installLinkMode(repoPath, paths, opts) {
401
397
 
402
398
  async function detectSkillTargets() {
403
399
  const targets = [];
404
- const [hasClaude, hasAgent] = await Promise.all([dirExists(CLAUDE_HOME), dirExists(AGENT_HOME)]);
400
+ const hasClaude = await dirExists(CLAUDE_HOME);
405
401
  if (hasClaude) {
406
402
  targets.push({ provider: "claude", home: CLAUDE_HOME, skillsDir: CLAUDE_SKILLS_DIR });
407
403
  }
408
- if (hasAgent) {
409
- targets.push({ provider: "agent", home: AGENT_HOME, skillsDir: AGENT_SKILLS_DIR });
410
- }
411
- if (targets.length === 0 && (await dirExists(OMP_AGENT_HOME))) {
412
- targets.push({ provider: "omp", home: OMP_AGENT_HOME, skillsDir: OMP_SKILLS_DIR });
413
- }
404
+ targets.push({ provider: "agent", home: AGENT_HOME, skillsDir: AGENT_SKILLS_DIR });
414
405
  return targets;
415
406
  }
416
407
 
@@ -428,7 +419,6 @@ function installedAssetOverrides(skillTargets, agentNames) {
428
419
  claudeSkills: providers.has("claude"),
429
420
  claudeAgents: agentNames.length > 0,
430
421
  codexSkills: providers.has("codex"),
431
- ompSkills: providers.has("omp"),
432
422
  skillTargets: Array.from(providers).sort(),
433
423
  };
434
424
  }
@@ -682,7 +672,7 @@ async function pruneObsoleteSkills(target, opts) {
682
672
 
683
673
  async function installSkillTargetsCopy(runtimeRoot, targets, opts) {
684
674
  if (targets.length === 0) {
685
- if (!opts.quiet) process.stdout.write(" skills: no Claude, Agent, or OMP agent home found — skipped\n");
675
+ if (!opts.quiet) process.stdout.write(" skills: no skill target found — skipped\n");
686
676
  return [];
687
677
  }
688
678
  return await Promise.all(targets.map((target) => installSkillsCopy(runtimeRoot, target, opts)));
@@ -690,7 +680,7 @@ async function installSkillTargetsCopy(runtimeRoot, targets, opts) {
690
680
 
691
681
  async function installSkillTargetsLink(repoAbs, targets, opts) {
692
682
  if (targets.length === 0) {
693
- if (!opts.quiet) process.stdout.write(" skills: no Claude, Agent, or OMP agent home found — skipped\n");
683
+ if (!opts.quiet) process.stdout.write(" skills: no skill target found — skipped\n");
694
684
  return [];
695
685
  }
696
686
  return await Promise.all(targets.map((target) => installSkillsLink(repoAbs, target, opts)));
@@ -41,15 +41,12 @@ const FALLBACK_AGENT_NAMES = [
41
41
  const USER_HOME = homedir();
42
42
  const CLAUDE_HOME = join(USER_HOME, ".claude");
43
43
  const AGENT_HOME = join(USER_HOME, ".agent");
44
- const OMP_AGENT_HOME = join(USER_HOME, ".omp", "agent");
45
44
  const CLAUDE_SKILLS_DIR = join(CLAUDE_HOME, "skills");
46
45
  const AGENT_SKILLS_DIR = join(AGENT_HOME, "skills");
47
- const OMP_SKILLS_DIR = join(OMP_AGENT_HOME, "skills");
48
46
  const CLAUDE_AGENTS_DIR = join(CLAUDE_HOME, "agents");
49
47
  const FALLBACK_SKILL_ROOTS = [
50
48
  CLAUDE_SKILLS_DIR,
51
49
  AGENT_SKILLS_DIR,
52
- OMP_SKILLS_DIR,
53
50
  ];
54
51
  const SKILLS_MANIFEST_REL = "installed-skills.json";
55
52
  const AGENTS_MANIFEST_REL = "installed-agents.json";
@@ -63,8 +60,8 @@ Usage:
63
60
  installed-skills.json, installed-agents.json} AND
64
61
  every skill target recorded in
65
62
  installed-skills.json
66
- (~/.claude/skills, ~/.agent/skills, or
67
- ~/.omp/agent/skills). Claude worker agents are
63
+ (~/.claude/skills or ~/.agent/skills).
64
+ Claude worker agents are
68
65
  removed from ~/.claude/agents when installed.
69
66
  Missing manifests fall back to hard-coded
70
67
  Claude okstra-* / *-worker.md names.
@@ -75,7 +72,7 @@ Usage:
75
72
  (<PROJECT>/.claude/settings.local.json symlink)
76
73
  are NOT touched — remove them manually if needed.
77
74
  okstra uninstall --purge Remove the entire ~/.okstra directory AND
78
- okstra skills in Claude/Agent/OMP homes AND
75
+ okstra skills in Claude/Agent homes AND
79
76
  ~/.claude/agents/<*-worker.md> (DESTRUCTIVE).
80
77
  Requires -y or an interactive confirmation
81
78
  okstra uninstall --dry-run Print the plan without touching disk
@@ -139,7 +136,7 @@ export async function runUninstall(args) {
139
136
  if (opts.purge) {
140
137
  if (!opts.yes && !opts.dryRun) {
141
138
  const ok = await promptConfirm(
142
- `purge entire ${paths.home} AND okstra skills in Claude/Agent/OMP homes? user data will be lost.`,
139
+ `purge entire ${paths.home} AND okstra skills in Claude/Agent homes? user data will be lost.`,
143
140
  );
144
141
  if (!ok) {
145
142
  process.stdout.write("aborted.\n");