okstra 0.162.2 → 0.163.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/package.json
CHANGED
package/runtime/BUILD.json
CHANGED
|
@@ -94,6 +94,10 @@ while [[ $# -gt 0 ]]; do
|
|
|
94
94
|
REPORT_WRITER_MODEL_OVERRIDE="$(require_option_value --report-writer-model "${2-}")"
|
|
95
95
|
shift 2
|
|
96
96
|
;;
|
|
97
|
+
--launch-only)
|
|
98
|
+
LAUNCH_ONLY="true"
|
|
99
|
+
shift
|
|
100
|
+
;;
|
|
97
101
|
--lead-runtime)
|
|
98
102
|
LEAD_RUNTIME="$(require_option_value --lead-runtime "${2-}")"
|
|
99
103
|
shift 2
|
|
@@ -164,3 +164,6 @@ REPORT_WRITER_MODEL_EXECUTION_VALUE=""
|
|
|
164
164
|
DEFAULT_WORKERS="claude,codex,report-writer"
|
|
165
165
|
DISPLAY_COMMAND_NAME="${OKSTRA_COMMAND_NAME:-$(basename "$0")}"
|
|
166
166
|
DISPLAY_TOOL_NAME="${OKSTRA_TOOL_NAME:-okstra}"
|
|
167
|
+
|
|
168
|
+
# `okstra run <lead>` 전용: 번들을 준비하지 않고 리드 CLI 만 띄운다.
|
|
169
|
+
LAUNCH_ONLY="false"
|
package/runtime/bin/okstra.sh
CHANGED
|
@@ -71,6 +71,58 @@ if [[ "$RESUME_CLARIFICATION_MODE" == "true" ]]; then
|
|
|
71
71
|
exit 0
|
|
72
72
|
fi
|
|
73
73
|
autofill_from_project_json
|
|
74
|
+
|
|
75
|
+
# `okstra run <lead>` — open the host, nothing else. The okstra-run skill inside
|
|
76
|
+
# it collects task inputs, which is how the Claude Code path has always worked.
|
|
77
|
+
# Preparing a bundle here would demand a task id before the user has a session
|
|
78
|
+
# to choose one in.
|
|
79
|
+
if [[ "$LAUNCH_ONLY" == "true" ]]; then
|
|
80
|
+
if [[ -z "$PROJECT_ROOT" ]]; then
|
|
81
|
+
PROJECT_ROOT="$(resolve_project_root_strict "$PROJECT_ROOT_OVERRIDE")" || exit 1
|
|
82
|
+
fi
|
|
83
|
+
read -r LEAD_EXECUTABLE SANDBOX_NOTE < <(
|
|
84
|
+
okstra_py - "$LEAD_RUNTIME" <<'PY'
|
|
85
|
+
import sys
|
|
86
|
+
from okstra_ctl.lead_runtime import lead_runtime_info
|
|
87
|
+
from okstra_ctl.models import bare_lead_launch_argv, lead_launch_spec
|
|
88
|
+
provider = lead_runtime_info(sys.argv[1]).agent
|
|
89
|
+
print(bare_lead_launch_argv(provider)[0], lead_launch_spec(provider).sandbox_waiver_note)
|
|
90
|
+
PY
|
|
91
|
+
)
|
|
92
|
+
if ! command -v "$LEAD_EXECUTABLE" >/dev/null 2>&1; then
|
|
93
|
+
printf '%s command not found\n' "$LEAD_EXECUTABLE" >&2
|
|
94
|
+
exit 1
|
|
95
|
+
fi
|
|
96
|
+
if [[ -n "$SANDBOX_NOTE" ]]; then
|
|
97
|
+
okstra_py - "$LEAD_RUNTIME" <<'PY' >&2
|
|
98
|
+
import sys
|
|
99
|
+
from okstra_ctl.lead_runtime import lead_runtime_info
|
|
100
|
+
from okstra_ctl.models import lead_launch_spec
|
|
101
|
+
print("\n" + lead_launch_spec(lead_runtime_info(sys.argv[1]).agent).sandbox_waiver_note)
|
|
102
|
+
PY
|
|
103
|
+
if [[ "$ASSUME_YES" != "true" ]]; then
|
|
104
|
+
printf 'Start %s without its sandbox? [y/N] ' "$LEAD_EXECUTABLE" >&2
|
|
105
|
+
read -r _sandbox_answer < /dev/tty || _sandbox_answer=""
|
|
106
|
+
if [[ "$_sandbox_answer" != "y" && "$_sandbox_answer" != "Y" ]]; then
|
|
107
|
+
printf 'okstra: cancelled\n' >&2
|
|
108
|
+
exit 1
|
|
109
|
+
fi
|
|
110
|
+
fi
|
|
111
|
+
fi
|
|
112
|
+
LAUNCH_ARGV=()
|
|
113
|
+
while IFS= read -r -d '' _arg; do LAUNCH_ARGV+=("$_arg"); done < <(
|
|
114
|
+
okstra_py - "$LEAD_RUNTIME" <<'PY'
|
|
115
|
+
import sys
|
|
116
|
+
from okstra_ctl.lead_runtime import lead_runtime_info
|
|
117
|
+
from okstra_ctl.models import bare_lead_launch_argv
|
|
118
|
+
for a in bare_lead_launch_argv(lead_runtime_info(sys.argv[1]).agent):
|
|
119
|
+
sys.stdout.write(a + "\0")
|
|
120
|
+
PY
|
|
121
|
+
)
|
|
122
|
+
cd "$PROJECT_ROOT"
|
|
123
|
+
exec "${LAUNCH_ARGV[@]}"
|
|
124
|
+
fi
|
|
125
|
+
|
|
74
126
|
autofill_from_manifest
|
|
75
127
|
collect_required_arguments
|
|
76
128
|
|
|
@@ -247,6 +247,18 @@ def lead_launch_spec(provider: str) -> LeadLaunchSpec:
|
|
|
247
247
|
return spec.lead_launch
|
|
248
248
|
|
|
249
249
|
|
|
250
|
+
def bare_lead_launch_argv(provider: str) -> list[str]:
|
|
251
|
+
"""Start this provider's CLI with nothing to do yet.
|
|
252
|
+
|
|
253
|
+
`okstra run <lead>` opens the host; the okstra-run skill inside it collects
|
|
254
|
+
task inputs, exactly as the Claude Code path already works. So there is no
|
|
255
|
+
prompt and no model to pin here — only the flags that make the session
|
|
256
|
+
usable to okstra at all.
|
|
257
|
+
"""
|
|
258
|
+
launch = lead_launch_spec(provider)
|
|
259
|
+
return [launch.executable, *launch.sandbox_waiver]
|
|
260
|
+
|
|
261
|
+
|
|
250
262
|
def lead_launch_argv(
|
|
251
263
|
provider: str,
|
|
252
264
|
*,
|
|
@@ -32,6 +32,8 @@ const RUNTIME_ALIASES = new Map([
|
|
|
32
32
|
["claude-code", "claude-code"],
|
|
33
33
|
["codex", "codex"],
|
|
34
34
|
["antigravity", "antigravity"],
|
|
35
|
+
["avg", "antigravity"],
|
|
36
|
+
["agy", "antigravity"],
|
|
35
37
|
["external", "external"],
|
|
36
38
|
]);
|
|
37
39
|
|
|
@@ -110,10 +112,18 @@ export function buildRunPlan({ args, paths, resolution, runManifestPath = "" })
|
|
|
110
112
|
// Handed to okstra.sh, which owns input collection and the launch. Only
|
|
111
113
|
// the runtime is decided here; everything else is passed through so the
|
|
112
114
|
// launcher can prompt for whatever is still missing.
|
|
115
|
+
// --launch-only: open the host and stop. Task inputs are collected by the
|
|
116
|
+
// okstra-run skill inside the session, which is how the Claude Code path
|
|
117
|
+
// has always worked — demanding a task id out here asks for it before the
|
|
118
|
+
// user has a session to pick one in.
|
|
113
119
|
commands: [
|
|
114
120
|
{
|
|
115
121
|
name: "launcher",
|
|
116
|
-
args: [
|
|
122
|
+
args: [
|
|
123
|
+
"--launch-only",
|
|
124
|
+
"--lead-runtime", resolution.resolvedRuntime,
|
|
125
|
+
...withoutRuntimeSelection(args),
|
|
126
|
+
],
|
|
117
127
|
capture: false,
|
|
118
128
|
},
|
|
119
129
|
],
|