okstra 0.82.0 → 0.82.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/docs/kr/cli.md CHANGED
@@ -328,7 +328,7 @@ Lead runtime independence boundary:
328
328
  - Codex host: `okstra run` 이 `codex-run` -> `codex-dispatch` 를 orchestration 합니다.
329
329
  - generic terminal + tmux: `okstra run` 이 `render-bundle --lead-runtime external` -> `okstra team dispatch` -> `okstra team await` 를 orchestration 합니다.
330
330
 
331
- `okstra install` / `ensure-installed` / `doctor` / `render-bundle` 도 `auto` 를 기본값으로 받지만, host signal 이 없는 plain terminal 에서는 host 지정이 필요합니다. 그래서 Claude Code skill 들은 `--runtime claude-code` / `--lead-runtime claude-code` 명시합니다. 단, `okstra install` 스킬 복사 대상은 runtime resolution 이 아니라 agent home 존재 여부입니다. `~/.claude` 와 `~/.codex` 가 있으면 둘 다 설치하고, 둘 다 없을 때만 `~/.omp/agent` 를 fallback 으로 사용합니다.
331
+ `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` 와 `~/.codex` 가 있으면 둘 다 설치하고, 둘 다 없을 때만 `~/.omp/agent` 를 fallback 으로 사용합니다.
332
332
 
333
333
  `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 호환 경로에서만 해석됩니다.
334
334
 
@@ -624,7 +624,7 @@ chmod +x ~/.local/bin/okstra-ctl
624
624
  |---|---|
625
625
  | `okstra paths [--field <name>\|--shell]` | package/runtime/home/bin/pythonpath/version 경로 출력 |
626
626
  | `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, `~/.codex` 가 있으면 Codex skills, 둘 다 없고 `~/.omp/agent` 가 있으면 OMP skills 를 설치한다 |
627
- | `okstra ensure-installed [--runtime claude-code\|codex\|external\|all] [-q]` | 설치 상태 확인, stale이면 같은 runtime 으로 재설치. 존재하는 skill target 의 drift 만 검사한다 |
627
+ | `okstra ensure-installed [--runtime claude-code\|codex\|external\|all] [-q]` | 설치 상태 확인, stale이면 같은 runtime 으로 재설치. 기본 `auto` 는 host signal 이 없어도 설치를 계속하며, 존재하는 skill target 의 drift 만 검사한다 |
628
628
  | `okstra uninstall [--purge -y]` | 설치 자산 제거. 기본값은 `installed-skills.json` target 목록과 `installed-agents.json` 기준으로 제거하고 사용자 데이터는 보존 |
629
629
  | `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 체크를 추가한다 |
630
630
  | `okstra setup --project-id <id>` | 현재 프로젝트의 `.okstra/project.json` 생성/갱신 |
@@ -131,7 +131,7 @@ Runtime/install asset changes follow this checklist:
131
131
 
132
132
  `--link <repo>` mode is for development and symlinks installed files back to repo sources.
133
133
 
134
- `src/runtime-resolver.mjs` is the single reference point for runtime auto-detection. `okstra install` defaults to `--runtime auto`, records the request and resolution in `installed-runtimes.json` schemaVersion 2, and still copies the shared runtime payload from the installed package `runtime/` tree. Skill targets are discovered from existing agent homes: `~/.claude` and `~/.codex` 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.
134
+ `src/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 `~/.codex` 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
135
 
136
136
  ---
137
137
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "okstra",
3
- "version": "0.82.0",
3
+ "version": "0.82.1",
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.82.0",
3
- "builtAt": "2026-06-14T17:52:40.353Z",
2
+ "package": "0.82.1",
3
+ "builtAt": "2026-06-15T04:53:43.767Z",
4
4
  "repoRoot": "/home/runner/work/okstra/okstra"
5
5
  }
package/src/install.mjs CHANGED
@@ -62,7 +62,7 @@ Effect (copy mode):
62
62
  ${"$HOME"}/.codex/skills/<name> <- skills when ${"$HOME"}/.codex exists
63
63
  ${"$HOME"}/.omp/agent/skills/<name> <- skills fallback when Claude/Codex homes are absent
64
64
  ${"$HOME"}/.claude/agents/<worker>.md <- worker agents when ${"$HOME"}/.claude exists
65
- ${"$HOME"}/.okstra/installed-runtimes.json <- manifest of installed runtime adapters
65
+ ${"$HOME"}/.okstra/installed-runtimes.json <- install request/resolution manifest
66
66
  ${"$HOME"}/.okstra/installed-skills.json <- target-aware manifest of installed skills
67
67
  ${"$HOME"}/.okstra/installed-agents.json <- manifest of installed workers
68
68
  ${"$HOME"}/.okstra/version <- installed package version stamp
@@ -86,6 +86,9 @@ worker wrapper scripts without modifying the user's global settings.
86
86
  Worker agent definitions are installed into ${"$HOME"}/.claude/agents/ only
87
87
  when ${"$HOME"}/.claude exists, so Claude Code's subagent discovery can pick
88
88
  them up. Codex/OMP skill targets receive skill markdown only.
89
+
90
+ Default auto runtime installation does not require host detection; it still
91
+ installs shared runtime files and any agent-home skill targets it finds.
89
92
  `;
90
93
 
91
94
  const ENSURE_USAGE = `okstra ensure-installed — idempotent install check
@@ -125,6 +128,31 @@ export function validateInstallRuntime(value) {
125
128
  return runtime;
126
129
  }
127
130
 
131
+ function resolveInstallRuntime(runtime, command) {
132
+ const resolution = resolveRuntime({
133
+ requestedRuntime: runtime,
134
+ command,
135
+ env: process.env,
136
+ capabilities: { tmuxAvailable: Boolean(process.env.TMUX) },
137
+ });
138
+ if (resolution.ok || runtime !== "auto") return resolution;
139
+ return {
140
+ ok: false,
141
+ requestedRuntime: "auto",
142
+ resolvedRuntime: null,
143
+ host: "unknown",
144
+ confidence: "none",
145
+ reason: resolution.reason,
146
+ fallbackFrom: null,
147
+ warnings: [resolution.reason],
148
+ };
149
+ }
150
+
151
+ function formatInstallRuntimeLabel(runtime, resolution) {
152
+ if (resolution.resolvedRuntime) return `${runtime} -> ${resolution.resolvedRuntime}`;
153
+ return `${runtime} (host unresolved; installing target assets)`;
154
+ }
155
+
128
156
  async function hashFile(path) {
129
157
  const buf = await fs.readFile(path);
130
158
  return createHash("sha256").update(buf).digest("hex");
@@ -725,17 +753,11 @@ export async function runInstall(args) {
725
753
  const pkgRoot = getPackageRoot();
726
754
  const runtimeRoot = join(pkgRoot, "runtime");
727
755
  const paths = await resolvePaths();
728
- const runtimeResolution = resolveRuntime({
729
- requestedRuntime: opts.runtime,
730
- command: "install",
731
- env: process.env,
732
- capabilities: { tmuxAvailable: Boolean(process.env.TMUX) },
733
- });
734
- if (!runtimeResolution.ok) {
756
+ const runtimeResolution = resolveInstallRuntime(opts.runtime, "install");
757
+ if (!runtimeResolution.ok && opts.runtime !== "auto") {
735
758
  process.stderr.write(`error: ${runtimeResolution.reason}\n`);
736
759
  return 2;
737
760
  }
738
- const resolvedRuntime = runtimeResolution.resolvedRuntime;
739
761
 
740
762
  if (!opts.dryRun) {
741
763
  await fs.mkdir(paths.home, { recursive: true });
@@ -754,7 +776,7 @@ export async function runInstall(args) {
754
776
 
755
777
  if (!opts.quiet) {
756
778
  process.stdout.write(`installing okstra runtime (package ${paths.package})\n`);
757
- process.stdout.write(` runtime: ${opts.runtime} -> ${resolvedRuntime}\n`);
779
+ process.stdout.write(` runtime: ${formatInstallRuntimeLabel(opts.runtime, runtimeResolution)}\n`);
758
780
  process.stdout.write(` source: ${runtimeRoot}\n`);
759
781
  process.stdout.write(` home: ${paths.home}\n`);
760
782
  }
@@ -949,13 +971,8 @@ export async function runEnsureInstalled(args) {
949
971
  return 2;
950
972
  }
951
973
  const paths = await resolvePaths();
952
- const runtimeResolution = resolveRuntime({
953
- requestedRuntime: opts.runtime,
954
- command: "ensure-installed",
955
- env: process.env,
956
- capabilities: { tmuxAvailable: Boolean(process.env.TMUX) },
957
- });
958
- if (!runtimeResolution.ok) {
974
+ const runtimeResolution = resolveInstallRuntime(opts.runtime, "ensure-installed");
975
+ if (!runtimeResolution.ok && opts.runtime !== "auto") {
959
976
  process.stderr.write(`error: ${runtimeResolution.reason}\n`);
960
977
  return 2;
961
978
  }