Route project work through Cursor agy and PI

Why: make the three approved CLIs the only active implementation and test routes

Evidence: adapter unit tests, configuration validation, diff check, and real marker probes for all three profiles

Impact: narrows project routing and fixes agy prompt binding for noninteractive execution

Refs: feature/goal-first-delivery
This commit is contained in:
2026-10-15 06:48:06 +00:00
parent 60e3b705c2
commit 8c98635dfd
3 changed files with 20 additions and 35 deletions
+8 -31
View File
@@ -7,9 +7,10 @@ parser accepts exactly one `agent-execution` fenced block.
U3's execution controller and U4's project wiring are integrated. This file is U3's execution controller and U4's project wiring are integrated. This file is
the execution-routing authority for implementation, repair, test, and review. the execution-routing authority for implementation, repair, test, and review.
Installed CLI identity stays unproven until a host runs the U5 probes one Active routes are intentionally limited to Cursor, Antigravity (`agy`), and
profile at a time. A provider that makes no successful stdin write or PI. `model: auto` lets each CLI use its configured default model; PI therefore
stdout/stderr read for `idle_timeout_seconds` is stopped before uses the operator-selected MiniMax default. A provider that makes no successful
stdin write or stdout/stderr read for `idle_timeout_seconds` is stopped before
`timeout_seconds`. `timeout_seconds`.
```agent-execution ```agent-execution
@@ -26,10 +27,10 @@ execution:
raw_output_bytes: 10485760 raw_output_bytes: 10485760
roles: roles:
implementation: [cursor, antigravity, claude, codex, pi, kimi, opencode] implementation: [cursor, antigravity, pi]
repair: [cursor, antigravity, codex, claude] repair: [cursor, antigravity, pi]
test: [pi, antigravity, codex] test: [pi, antigravity, cursor]
review: [claude, codex, pi] review: [pi, antigravity, cursor]
profiles: profiles:
cursor: cursor:
@@ -44,33 +45,9 @@ profiles:
model: auto model: auto
enabled: true enabled: true
claude:
adapter: claude
executable: claude
model: auto
enabled: true
codex:
adapter: codex
executable: codex
model: auto
enabled: true
pi: pi:
adapter: pi adapter: pi
executable: pi executable: pi
model: auto model: auto
enabled: true enabled: true
kimi:
adapter: kimi
executable: kimi
model: auto
enabled: true
opencode:
adapter: opencode
executable: opencode
model: auto
enabled: true
``` ```
+6 -2
View File
@@ -121,7 +121,7 @@ BUILTIN_SPECS: dict[str, AdapterSpec] = {
), ),
"antigravity": AdapterSpec( "antigravity": AdapterSpec(
name="antigravity", name="antigravity",
noninteractive_argv=("--print",), noninteractive_argv=(),
run_everything_argv=( run_everything_argv=(
"--dangerously-skip-permissions", "--dangerously-skip-permissions",
"--mode", "--mode",
@@ -130,7 +130,7 @@ BUILTIN_SPECS: dict[str, AdapterSpec] = {
workspace_flag=None, workspace_flag=None,
model_flag="--model", model_flag="--model",
output_argv=("--output-format", "stream-json"), output_argv=("--output-format", "stream-json"),
prompt_transport="positional", prompt_transport="print",
), ),
"claude": AdapterSpec( "claude": AdapterSpec(
name="claude", name="claude",
@@ -289,6 +289,10 @@ def build_invocation(
elif spec.prompt_transport == "flag": elif spec.prompt_transport == "flag":
argv.extend(["--prompt", prompt]) argv.extend(["--prompt", prompt])
prompt_values.add(prompt) prompt_values.add(prompt)
elif spec.prompt_transport == "print":
# agy 1.3.5 consumes the argv item immediately after --print.
argv.extend(["--print", prompt])
prompt_values.add(prompt)
else: else:
raise ValueError(f"unsupported prompt_transport: {spec.prompt_transport!r}") raise ValueError(f"unsupported prompt_transport: {spec.prompt_transport!r}")
+6 -2
View File
@@ -224,10 +224,9 @@ class AgentExecAdapterTests(unittest.TestCase):
profile, cfg, self.workspace, self.unit_packet, self.result_path profile, cfg, self.workspace, self.unit_packet, self.result_path
) )
self.assertEqual( self.assertEqual(
inv.argv[:-1], inv.argv[:-2],
( (
"agy", "agy",
"--print",
"--dangerously-skip-permissions", "--dangerously-skip-permissions",
"--mode", "--mode",
"auto", "auto",
@@ -235,9 +234,14 @@ class AgentExecAdapterTests(unittest.TestCase):
"stream-json", "stream-json",
), ),
) )
self.assertEqual(inv.argv[-2], "--print")
_assert_bounded_prompt(self, inv.argv[-1], self.packet_body) _assert_bounded_prompt(self, inv.argv[-1], self.packet_body)
self.assertNotIn("--model", inv.argv)
self.assertIsNone(inv.stdin)
self.assertEqual(inv.cwd, self.workspace) self.assertEqual(inv.cwd, self.workspace)
self.assertEqual(inv.sanitized_display[-1], UNIT_PACKET_MARKER) self.assertEqual(inv.sanitized_display[-1], UNIT_PACKET_MARKER)
self.assertEqual(inv.sanitized_display[-2], "--print")
self.assertNotIn(self.packet_body, " ".join(inv.sanitized_display))
def test_claude_run_everything_argv(self) -> None: def test_claude_run_everything_argv(self) -> None:
_write_fake_cli(self.bindir, "claude", help_text=CLAUDE_HELP) _write_fake_cli(self.bindir, "claude", help_text=CLAUDE_HELP)