From 458cf681e12f236767bc0e6fa230282146f408ef Mon Sep 17 00:00:00 2001 From: Alex Oliveira <4482374+aroff@users.noreply.github.com> Date: Tue, 7 Jul 2026 06:46:21 +0000 Subject: [PATCH] fix(sdk): pass stdin marker to opencode run opencode run requires a `-` positional to read the prompt from stdin; without it the CLI prints help and exits, breaking unattended agent runs. --- aikit-sdk/src/runner/argv.rs | 8 ++++++++ aikit-sdk/src/runner/backends/opencode.rs | 6 +++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/aikit-sdk/src/runner/argv.rs b/aikit-sdk/src/runner/argv.rs index 523d51f..7731c7f 100644 --- a/aikit-sdk/src/runner/argv.rs +++ b/aikit-sdk/src/runner/argv.rs @@ -305,9 +305,16 @@ mod tests { assert!(argv.contains(&OsString::from("opencode"))); assert!(argv.contains(&OsString::from("run"))); assert!(!argv.contains(&OsString::from("test prompt"))); + assert!(argv.contains(&OsString::from("-"))); assert!(argv.contains(&OsString::from("-m"))); assert!(argv.contains(&OsString::from("zai-coding-plan/glm-4.7"))); assert!(argv.contains(&OsString::from("--dangerously-skip-permissions"))); + let run_pos = argv.iter().position(|a| a == "run").unwrap(); + let dash_pos = argv.iter().position(|a| a == "-").unwrap(); + assert!( + run_pos < dash_pos, + "stdin marker must follow run subcommand" + ); } #[test] @@ -336,6 +343,7 @@ mod tests { assert!(argv.contains(&OsString::from("opencode"))); assert!(argv.contains(&OsString::from("run"))); assert!(!argv.contains(&OsString::from("test prompt"))); + assert_eq!(*argv.last().unwrap(), OsString::from("-")); assert!(argv.contains(&OsString::from("--format"))); assert!(argv.contains(&OsString::from("json"))); assert!(!argv.contains(&OsString::from("--json"))); diff --git a/aikit-sdk/src/runner/backends/opencode.rs b/aikit-sdk/src/runner/backends/opencode.rs index 2bd3e66..8ae37d9 100644 --- a/aikit-sdk/src/runner/backends/opencode.rs +++ b/aikit-sdk/src/runner/backends/opencode.rs @@ -1,4 +1,7 @@ -//! OpenCode backend: `opencode run --format json` over a subprocess. +//! OpenCode backend: `opencode run --format json -` over a subprocess. +//! +//! The prompt is written to stdin; `-` tells `opencode run` to read the message +//! from stdin (same pattern as `codex exec --json -- -`). use std::ffi::OsString; @@ -155,5 +158,6 @@ pub(crate) fn argv(ctx: ArgvCtx) -> Vec { argv.extend_from_slice(&[OsString::from("--format"), OsString::from("json")]); } SPEC.push_session_flag(&mut argv, ctx.session_id); + argv.push(OsString::from("-")); argv }