feat(maestro): default structured view on for ACP agents
A Claude Code or Codex spawn now asks for the structured view unless the operator says otherwise: the two spawn forms open with the box ticked and `maestro spawn` takes `--terminal` to opt out. Once the operator works the toggle, a command change no longer re-ticks it under them. The support predicate moves to `maestro_protocol::display` so all three clients gate on the same resolution. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
0dc10ffe76
commit
25653abcf5
@@ -44,7 +44,7 @@ describe("spawn form structured view", () => {
|
||||
vi.unstubAllGlobals();
|
||||
});
|
||||
|
||||
it("is default-off and shown for resolved Claude Code and Codex commands", async () => {
|
||||
it("is default-on and shown for resolved Claude Code and Codex commands", async () => {
|
||||
stubApi();
|
||||
handle = createSpawnForm({ onSuccess() {} });
|
||||
document.body.appendChild(handle.el);
|
||||
@@ -57,7 +57,7 @@ describe("spawn form structured view", () => {
|
||||
handle.el.querySelector<HTMLButtonElement>(".wt-toggle")!.click();
|
||||
expect(disclosure.hidden).toBe(false);
|
||||
expect(wrap.hidden).toBe(false);
|
||||
expect(checkbox.checked).toBe(false);
|
||||
expect(checkbox.checked).toBe(true);
|
||||
|
||||
const custom = handle.el.querySelector<HTMLButtonElement>('[data-id="custom"]')!;
|
||||
custom.click();
|
||||
@@ -65,13 +65,34 @@ describe("spawn form structured view", () => {
|
||||
command.value = "FOO=1 /usr/local/bin/codex";
|
||||
command.dispatchEvent(new Event("input"));
|
||||
expect(wrap.hidden).toBe(false);
|
||||
expect(checkbox.checked).toBe(true);
|
||||
|
||||
command.value = "opencode";
|
||||
command.dispatchEvent(new Event("input"));
|
||||
expect(wrap.hidden).toBe(true);
|
||||
expect(checkbox.checked).toBe(false);
|
||||
});
|
||||
|
||||
it("clears a checked value when Codex changes to an unsupported command", async () => {
|
||||
it("keeps an unchecked box unchecked across a command change", async () => {
|
||||
stubApi();
|
||||
handle = createSpawnForm({ onSuccess() {} });
|
||||
document.body.appendChild(handle.el);
|
||||
await drain();
|
||||
|
||||
const checkbox = handle.el.querySelector<HTMLInputElement>("input[name=structured_view]")!;
|
||||
expect(checkbox.checked).toBe(true);
|
||||
checkbox.click();
|
||||
expect(checkbox.checked).toBe(false);
|
||||
|
||||
handle.el.querySelector<HTMLButtonElement>('[data-id="custom"]')!.click();
|
||||
const command = handle.el.querySelector<HTMLInputElement>(".cmd-raw")!;
|
||||
command.value = "codex";
|
||||
command.dispatchEvent(new Event("input"));
|
||||
|
||||
expect(checkbox.checked).toBe(false);
|
||||
});
|
||||
|
||||
it("clears the checked default when Codex changes to an unsupported command", async () => {
|
||||
stubApi();
|
||||
handle = createSpawnForm({ onSuccess() {} });
|
||||
document.body.appendChild(handle.el);
|
||||
@@ -83,7 +104,6 @@ describe("spawn form structured view", () => {
|
||||
command.dispatchEvent(new Event("input"));
|
||||
|
||||
const checkbox = handle.el.querySelector<HTMLInputElement>("input[name=structured_view]")!;
|
||||
checkbox.click();
|
||||
expect(checkbox.checked).toBe(true);
|
||||
|
||||
command.value = "opencode";
|
||||
@@ -93,7 +113,7 @@ describe("spawn form structured view", () => {
|
||||
expect(checkbox.checked).toBe(false);
|
||||
});
|
||||
|
||||
it.each(["claude", "codex"])("emits Structured for a selected %s command", async (tool) => {
|
||||
it.each(["claude", "codex"])("emits Structured for a %s command by default", async (tool) => {
|
||||
const requests = stubApi();
|
||||
handle = createSpawnForm({
|
||||
seed: { cwd: "/srv/work", cwdRawVisible: true, worktreeEnabled: false },
|
||||
@@ -109,7 +129,6 @@ describe("spawn form structured view", () => {
|
||||
command.dispatchEvent(new Event("input"));
|
||||
}
|
||||
|
||||
handle.el.querySelector<HTMLInputElement>("input[name=structured_view]")!.click();
|
||||
handle.el.requestSubmit();
|
||||
await drain();
|
||||
|
||||
@@ -119,4 +138,21 @@ describe("spawn form structured view", () => {
|
||||
view: "Structured",
|
||||
});
|
||||
});
|
||||
|
||||
it("emits no view once the operator unticks the box", async () => {
|
||||
const requests = stubApi();
|
||||
handle = createSpawnForm({
|
||||
seed: { cwd: "/srv/work", cwdRawVisible: true, worktreeEnabled: false },
|
||||
onSuccess() {},
|
||||
});
|
||||
document.body.appendChild(handle.el);
|
||||
await drain();
|
||||
|
||||
handle.el.querySelector<HTMLInputElement>("input[name=structured_view]")!.click();
|
||||
handle.el.requestSubmit();
|
||||
await drain();
|
||||
|
||||
expect(requests).toHaveLength(1);
|
||||
expect(JSON.parse(String(requests[0].body)).view).toBeUndefined();
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user