okstra 0.81.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 +2 -2
- package/docs/project-structure-overview.md +1 -1
- package/package.json +1 -1
- package/runtime/BUILD.json +2 -2
- package/src/install.mjs +34 -17
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
|
-
`
|
|
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
package/runtime/BUILD.json
CHANGED
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 <-
|
|
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 =
|
|
729
|
-
|
|
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
|
|
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 =
|
|
953
|
-
|
|
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
|
}
|