@kynetic-ai/spec 0.6.0 → 0.8.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.
Files changed (74) hide show
  1. package/dist/agents/adapters.d.ts +2 -0
  2. package/dist/agents/adapters.d.ts.map +1 -1
  3. package/dist/agents/adapters.js +18 -0
  4. package/dist/agents/adapters.js.map +1 -1
  5. package/dist/agents/spawner.d.ts +2 -0
  6. package/dist/agents/spawner.d.ts.map +1 -1
  7. package/dist/agents/spawner.js +4 -2
  8. package/dist/agents/spawner.js.map +1 -1
  9. package/dist/cli/commands/batch.d.ts.map +1 -1
  10. package/dist/cli/commands/batch.js +38 -6
  11. package/dist/cli/commands/batch.js.map +1 -1
  12. package/dist/cli/commands/ralph.d.ts.map +1 -1
  13. package/dist/cli/commands/ralph.js +76 -39
  14. package/dist/cli/commands/ralph.js.map +1 -1
  15. package/dist/cli/commands/setup-seeding.d.ts +6 -3
  16. package/dist/cli/commands/setup-seeding.d.ts.map +1 -1
  17. package/dist/cli/commands/setup-seeding.js +20 -4
  18. package/dist/cli/commands/setup-seeding.js.map +1 -1
  19. package/dist/cli/commands/setup.d.ts +3 -2
  20. package/dist/cli/commands/setup.d.ts.map +1 -1
  21. package/dist/cli/commands/setup.js +10 -90
  22. package/dist/cli/commands/setup.js.map +1 -1
  23. package/dist/cli/commands/skill-install.d.ts.map +1 -1
  24. package/dist/cli/commands/skill-install.js +104 -1
  25. package/dist/cli/commands/skill-install.js.map +1 -1
  26. package/dist/lib/codex-config.d.ts +14 -0
  27. package/dist/lib/codex-config.d.ts.map +1 -0
  28. package/dist/lib/codex-config.js +88 -0
  29. package/dist/lib/codex-config.js.map +1 -0
  30. package/dist/parser/agent-detection.d.ts +14 -0
  31. package/dist/parser/agent-detection.d.ts.map +1 -0
  32. package/dist/parser/agent-detection.js +118 -0
  33. package/dist/parser/agent-detection.js.map +1 -0
  34. package/dist/parser/setup-status.d.ts +4 -3
  35. package/dist/parser/setup-status.d.ts.map +1 -1
  36. package/dist/parser/setup-status.js +4 -10
  37. package/dist/parser/setup-status.js.map +1 -1
  38. package/dist/parser/shadow.d.ts.map +1 -1
  39. package/dist/parser/shadow.js +22 -31
  40. package/dist/parser/shadow.js.map +1 -1
  41. package/dist/parser/skill-render.d.ts +9 -1
  42. package/dist/parser/skill-render.d.ts.map +1 -1
  43. package/dist/parser/skill-render.js +116 -17
  44. package/dist/parser/skill-render.js.map +1 -1
  45. package/dist/ralph/subagent.d.ts +2 -0
  46. package/dist/ralph/subagent.d.ts.map +1 -1
  47. package/dist/ralph/subagent.js +2 -0
  48. package/dist/ralph/subagent.js.map +1 -1
  49. package/dist/ralph/wrap-up.d.ts +2 -0
  50. package/dist/ralph/wrap-up.d.ts.map +1 -1
  51. package/dist/ralph/wrap-up.js +1 -0
  52. package/dist/ralph/wrap-up.js.map +1 -1
  53. package/dist/sessions/store.d.ts +10 -0
  54. package/dist/sessions/store.d.ts.map +1 -1
  55. package/dist/sessions/store.js +59 -7
  56. package/dist/sessions/store.js.map +1 -1
  57. package/package.json +2 -1
  58. package/plugin/.claude-plugin/marketplace.json +1 -1
  59. package/plugin/.claude-plugin/plugin.json +1 -1
  60. package/templates/agents-sections/03-task-lifecycle.md +4 -1
  61. package/templates/agents-sections/07-batch-usage.md +51 -0
  62. package/templates/skills/create-workflow/SKILL.md +2 -2
  63. package/templates/skills/manifest.yaml +11 -0
  64. package/templates/skills/observations/SKILL.md +2 -2
  65. package/templates/skills/plan/SKILL.md +5 -5
  66. package/templates/skills/reflect/SKILL.md +1 -1
  67. package/templates/skills/review/SKILL.md +2 -2
  68. package/templates/skills/task-work/SKILL.md +6 -6
  69. package/templates/skills/triage/SKILL.md +1 -1
  70. package/templates/skills/triage/docs/inbox.md +1 -1
  71. package/templates/skills/triage/docs/observations.md +1 -1
  72. package/templates/skills/triage-automation/SKILL.md +1 -1
  73. package/templates/skills/triage-inbox/SKILL.md +3 -3
  74. package/templates/skills/writing-specs/SKILL.md +6 -6
@@ -18,6 +18,8 @@ export interface AgentAdapter {
18
18
  shell?: boolean;
19
19
  /** Human-readable description */
20
20
  description?: string;
21
+ /** Arguments to append for auto-approve / yolo mode */
22
+ autoApproveArgs?: string[];
21
23
  }
22
24
  /**
23
25
  * Get an adapter by ID.
@@ -1 +1 @@
1
- {"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../../src/agents/adapters.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,mCAAmC;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,uDAAuD;IACvD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAyCD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAE/D;AAED;;;;GAIG;AACH,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAEvC;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI,CAEvE;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,YAAY,CAexD"}
1
+ {"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../../src/agents/adapters.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,mCAAmC;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,uDAAuD;IACvD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uDAAuD;IACvD,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AA4DD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAE/D;AAED;;;;GAIG;AACH,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAEvC;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI,CAEvE;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,YAAY,CAexD"}
@@ -17,6 +17,7 @@ const ADAPTERS = {
17
17
  args: ["@zed-industries/claude-agent-acp"],
18
18
  shell: process.platform === "win32",
19
19
  description: "Claude Agent via ACP protocol",
20
+ autoApproveArgs: ["--dangerously-skip-permissions"],
20
21
  },
21
22
  /**
22
23
  * @deprecated Alias for backwards compatibility.
@@ -28,6 +29,23 @@ const ADAPTERS = {
28
29
  args: ["@zed-industries/claude-agent-acp"],
29
30
  shell: process.platform === "win32",
30
31
  description: "Claude Agent via ACP protocol (deprecated alias)",
32
+ autoApproveArgs: ["--dangerously-skip-permissions"],
33
+ },
34
+ /**
35
+ * Codex ACP adapter.
36
+ * Uses the codex-acp package for OpenAI Codex agent.
37
+ */
38
+ "codex-acp": {
39
+ command: "npx",
40
+ args: ["@zed-industries/codex-acp"],
41
+ shell: process.platform === "win32",
42
+ description: "Codex agent via ACP protocol",
43
+ autoApproveArgs: [
44
+ "-c",
45
+ 'approval_policy="never"',
46
+ "-c",
47
+ 'sandbox_mode="danger-full-access"',
48
+ ],
31
49
  },
32
50
  /**
33
51
  * Mock ACP adapter for testing.
@@ -1 +1 @@
1
- {"version":3,"file":"adapters.js","sourceRoot":"","sources":["../../src/agents/adapters.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkBH;;GAEG;AACH,MAAM,QAAQ,GAAiC;IAC7C;;;OAGG;IACH,kBAAkB,EAAE;QAClB,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,CAAC,kCAAkC,CAAC;QAC1C,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;QACnC,WAAW,EAAE,+BAA+B;KAC7C;IAED;;;;OAIG;IACH,iBAAiB,EAAE;QACjB,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,CAAC,kCAAkC,CAAC;QAC1C,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;QACnC,WAAW,EAAE,kDAAkD;KAChE;IAED;;;OAGG;IACH,UAAU,EAAE;QACV,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,EAAE,EAAE,6CAA6C;QACvD,GAAG,EAAE,EAAE;QACP,WAAW,EAAE,4BAA4B;KAC1C;CACF,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,EAAU;IACnC,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAC;AACtB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC/B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,EAAU,EAAE,OAAqB;IAC/D,QAAQ,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC;AACzB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,EAAW;IACxC,MAAM,SAAS,GAAG,EAAE,IAAI,kBAAkB,CAAC;IAC3C,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IAEtC,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,qEAAqE;IACrE,OAAO;QACL,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,CAAC,SAAS,CAAC;QACjB,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;QACnC,WAAW,EAAE,sBAAsB,SAAS,EAAE;KAC/C,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"adapters.js","sourceRoot":"","sources":["../../src/agents/adapters.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoBH;;GAEG;AACH,MAAM,QAAQ,GAAiC;IAC7C;;;OAGG;IACH,kBAAkB,EAAE;QAClB,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,CAAC,kCAAkC,CAAC;QAC1C,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;QACnC,WAAW,EAAE,+BAA+B;QAC5C,eAAe,EAAE,CAAC,gCAAgC,CAAC;KACpD;IAED;;;;OAIG;IACH,iBAAiB,EAAE;QACjB,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,CAAC,kCAAkC,CAAC;QAC1C,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;QACnC,WAAW,EAAE,kDAAkD;QAC/D,eAAe,EAAE,CAAC,gCAAgC,CAAC;KACpD;IAED;;;OAGG;IACH,WAAW,EAAE;QACX,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,CAAC,2BAA2B,CAAC;QACnC,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;QACnC,WAAW,EAAE,8BAA8B;QAC3C,eAAe,EAAE;YACf,IAAI;YACJ,yBAAyB;YACzB,IAAI;YACJ,mCAAmC;SACpC;KACF;IAED;;;OAGG;IACH,UAAU,EAAE;QACV,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,EAAE,EAAE,6CAA6C;QACvD,GAAG,EAAE,EAAE;QACP,WAAW,EAAE,4BAA4B;KAC1C;CACF,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,EAAU;IACnC,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAC;AACtB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC/B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,EAAU,EAAE,OAAqB;IAC/D,QAAQ,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC;AACzB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,EAAW;IACxC,MAAM,SAAS,GAAG,EAAE,IAAI,kBAAkB,CAAC;IAC3C,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IAEtC,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,qEAAqE;IACrE,OAAO;QACL,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,CAAC,SAAS,CAAC;QACjB,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;QACnC,WAAW,EAAE,sBAAsB,SAAS,EAAE;KAC/C,CAAC;AACJ,CAAC"}
@@ -15,6 +15,8 @@ export interface SpawnAgentOptions {
15
15
  cwd: string;
16
16
  /** Additional environment variables */
17
17
  env?: Record<string, string>;
18
+ /** Extra arguments to append (e.g., auto-approve flags) */
19
+ extraArgs?: string[];
18
20
  /** ACP client options */
19
21
  clientOptions?: Omit<ACPClientOptions, "stdin" | "stdout">;
20
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"spawner.d.ts","sourceRoot":"","sources":["../../src/agents/spawner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,YAAY,EAAS,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,sCAAsC;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,uCAAuC;IACvC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,yBAAyB;IACzB,aAAa,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,QAAQ,CAAC,CAAC;CAC5D;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,uCAAuC;IACvC,MAAM,EAAE,SAAS,CAAC;IAClB,+BAA+B;IAC/B,OAAO,EAAE,YAAY,CAAC;IACtB,6BAA6B;IAC7B,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC;CACzC;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,iBAAiB,GACzB,YAAY,CAiDd;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,YAAY,CAAC,CAWvB"}
1
+ {"version":3,"file":"spawner.d.ts","sourceRoot":"","sources":["../../src/agents/spawner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,YAAY,EAAS,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,sCAAsC;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,uCAAuC;IACvC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,yBAAyB;IACzB,aAAa,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,QAAQ,CAAC,CAAC;CAC5D;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,uCAAuC;IACvC,MAAM,EAAE,SAAS,CAAC;IAClB,+BAA+B;IAC/B,OAAO,EAAE,YAAY,CAAC;IACtB,6BAA6B;IAC7B,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC;CACzC;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,iBAAiB,GACzB,YAAY,CAoDd;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,YAAY,CAAC,CAWvB"}
@@ -17,15 +17,17 @@ import { ACPClient } from "../acp/index.js";
17
17
  * @returns SpawnedAgent with client, process, and kill function
18
18
  */
19
19
  export function spawnAgent(adapter, options) {
20
- const { cwd, env = {}, clientOptions = {} } = options;
20
+ const { cwd, env = {}, extraArgs, clientOptions = {} } = options;
21
21
  // Merge environment variables
22
22
  const processEnv = {
23
23
  ...process.env,
24
24
  ...adapter.env,
25
25
  ...env,
26
26
  };
27
+ // Build args from fresh copy to prevent cross-call leakage
28
+ const args = [...adapter.args, ...(extraArgs || [])];
27
29
  // Spawn the agent process
28
- const child = spawn(adapter.command, adapter.args, {
30
+ const child = spawn(adapter.command, args, {
29
31
  cwd,
30
32
  env: processEnv,
31
33
  shell: adapter.shell,
@@ -1 +1 @@
1
- {"version":3,"file":"spawner.js","sourceRoot":"","sources":["../../src/agents/spawner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAqB,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAyB,MAAM,iBAAiB,CAAC;AA2BnE;;;;;;;;;GASG;AACH,MAAM,UAAU,UAAU,CACxB,OAAqB,EACrB,OAA0B;IAE1B,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,aAAa,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;IAEtD,8BAA8B;IAC9B,MAAM,UAAU,GAAG;QACjB,GAAG,OAAO,CAAC,GAAG;QACd,GAAG,OAAO,CAAC,GAAG;QACd,GAAG,GAAG;KACP,CAAC;IAEF,0BAA0B;IAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE;QACjD,GAAG;QACH,GAAG,EAAE,UAAU;QACf,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,oCAAoC;KACzE,CAAC,CAAC;IAEH,oCAAoC;IACpC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IAED,+CAA+C;IAC/C,uCAAuC;IACvC,iDAAiD;IACjD,gDAAgD;IAChD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,GAAG,aAAa;QAChB,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,8BAA8B;QACnD,MAAM,EAAE,KAAK,CAAC,KAA8B,EAAE,4BAA4B;KAC3E,CAAC,CAAC;IAEH,uCAAuC;IACvC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;QACpB,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;YACvB,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,uCAAuC;IACvC,MAAM,IAAI,GAAG,CAAC,SAAyB,SAAS,EAAQ,EAAE;QACxD,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAClB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAC1C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAqB,EACrB,OAA0B;IAE1B,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAE3C,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,qCAAqC;QACrC,KAAK,CAAC,IAAI,EAAE,CAAC;QACb,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"spawner.js","sourceRoot":"","sources":["../../src/agents/spawner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAqB,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAyB,MAAM,iBAAiB,CAAC;AA6BnE;;;;;;;;;GASG;AACH,MAAM,UAAU,UAAU,CACxB,OAAqB,EACrB,OAA0B;IAE1B,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,SAAS,EAAE,aAAa,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;IAEjE,8BAA8B;IAC9B,MAAM,UAAU,GAAG;QACjB,GAAG,OAAO,CAAC,GAAG;QACd,GAAG,OAAO,CAAC,GAAG;QACd,GAAG,GAAG;KACP,CAAC;IAEF,2DAA2D;IAC3D,MAAM,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC;IAErD,0BAA0B;IAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE;QACzC,GAAG;QACH,GAAG,EAAE,UAAU;QACf,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,oCAAoC;KACzE,CAAC,CAAC;IAEH,oCAAoC;IACpC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IAED,+CAA+C;IAC/C,uCAAuC;IACvC,iDAAiD;IACjD,gDAAgD;IAChD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,GAAG,aAAa;QAChB,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,8BAA8B;QACnD,MAAM,EAAE,KAAK,CAAC,KAA8B,EAAE,4BAA4B;KAC3E,CAAC,CAAC;IAEH,uCAAuC;IACvC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;QACpB,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;YACvB,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,uCAAuC;IACvC,MAAM,IAAI,GAAG,CAAC,SAAyB,SAAS,EAAQ,EAAE;QACxD,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAClB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAC1C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAqB,EACrB,OAA0B;IAE1B,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAE3C,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,qCAAqC;QACrC,KAAK,CAAC,IAAI,EAAE,CAAC;QACb,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/batch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkFzC;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiK3D"}
1
+ {"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/batch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkFzC;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuM3D"}
@@ -174,7 +174,8 @@ Examples:
174
174
  batchCmd
175
175
  .command("commands")
176
176
  .description("List commands allowed in batch mode")
177
- .action(() => {
177
+ .argument("[path]", "Filter to a specific command (e.g. 'task add')")
178
+ .action((pathFilter) => {
178
179
  const json = isJsonMode();
179
180
  const tree = extractCommandTree(program);
180
181
  const allCommands = flattenCommandTree(tree);
@@ -192,22 +193,53 @@ Examples:
192
193
  return false;
193
194
  return true;
194
195
  });
196
+ // AC: @batch-allowed-commands ac-filter-by-path
197
+ let filteredCommands = allowedCommands;
198
+ if (pathFilter) {
199
+ const normalizedFilter = pathFilter.trim();
200
+ filteredCommands = allowedCommands.filter((cmd) => cmd.fullPath.slice(1).join(" ") === normalizedFilter);
201
+ // AC: @batch-allowed-commands ac-filter-not-found
202
+ if (filteredCommands.length === 0) {
203
+ if (json) {
204
+ output({
205
+ commands: [],
206
+ total: 0,
207
+ filter: normalizedFilter,
208
+ error: `No batch-allowed command found matching '${normalizedFilter}'`,
209
+ });
210
+ }
211
+ else {
212
+ console.error(`No batch-allowed command found matching '${normalizedFilter}'`);
213
+ console.error("Run 'kspec batch commands' without arguments to see all available commands.");
214
+ }
215
+ process.exit(EXIT_CODES.NOT_FOUND);
216
+ return;
217
+ }
218
+ }
195
219
  if (json) {
196
- const commandInfos = allowedCommands.map(buildCommandInfo);
197
- output({ commands: commandInfos, total: commandInfos.length });
220
+ const commandInfos = filteredCommands.map(buildCommandInfo);
221
+ const result = {
222
+ commands: commandInfos,
223
+ total: commandInfos.length,
224
+ };
225
+ if (pathFilter)
226
+ result.filter = pathFilter.trim();
227
+ output(result);
198
228
  }
199
229
  else {
200
230
  console.log(chalk.bold.cyan("Batch-Allowed Commands"));
201
231
  console.log(chalk.gray("─".repeat(60)));
202
- console.log(chalk.gray("Only mutating commands can be used in batch mode.\n"));
203
- for (const cmd of allowedCommands) {
232
+ if (!pathFilter) {
233
+ console.log(chalk.gray("Only mutating commands can be used in batch mode.\n"));
234
+ }
235
+ for (const cmd of filteredCommands) {
204
236
  const signature = formatCommandSignature(cmd);
205
237
  console.log(chalk.green(signature));
206
238
  if (cmd.description) {
207
239
  console.log(chalk.gray(` ${cmd.description}`));
208
240
  }
209
241
  }
210
- console.log(chalk.gray(`\n${allowedCommands.length} command(s) available`));
242
+ console.log(chalk.gray(`\n${filteredCommands.length} command(s) available`));
211
243
  }
212
244
  });
213
245
  }
@@ -1 +1 @@
1
- {"version":3,"file":"batch.js","sourceRoot":"","sources":["../../../src/cli/commands/batch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"batch.js","sourceRoot":"","sources":["../../../src/cli/commands/batch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EACL,eAAe,EACf,eAAe,EACf,YAAY,GACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAoB,MAAM,qBAAqB,CAAC;AAC/F,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C;;;GAGG;AACH,SAAS,sBAAsB,CAAC,GAAgB;IAC9C,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,oBAAoB;IAErE,2BAA2B;IAC3B,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QAChC,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;YACjB,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,6DAA6D;IAC7D,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IACzD,MAAM,kBAAkB,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;QACpD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACnD,OAAO,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAuBD,SAAS,gBAAgB,CAAC,GAAgB;IACxC,OAAO;QACL,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,oBAAoB;QAC9D,SAAS,EAAE,sBAAsB,CAAC,GAAG,CAAC;QACtC,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACrC,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,QAAQ,EAAE,GAAG,CAAC,QAAQ;SACvB,CAAC,CAAC;QACH,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACjC,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,QAAQ,EAAE,GAAG,CAAC,SAAS;SACxB,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,QAAQ,GAAG,OAAO;SACrB,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,+CAA+C,CAAC;SAC5D,MAAM,CAAC,eAAe,EAAE,gCAAgC,CAAC;SACzD,MAAM,CAAC,mBAAmB,EAAE,2BAA2B,CAAC;SACxD,MAAM,CAAC,aAAa,EAAE,kDAAkD,CAAC;SACzE,MAAM,CAAC,YAAY,EAAE,yCAAyC,CAAC;SAC/D,MAAM,CAAC,WAAW,EAAE,4BAA4B,CAAC;SACjD,WAAW,CACV,OAAO,EACP;;;;;;;;2DAQqD,CACtD;SACA,MAAM,CAAC,KAAK,EAAE,OAMd,EAAE,EAAE;QACH,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;QAE1B,iCAAiC;QACjC,oCAAoC;QACpC,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC5B,IAAI,OAAO,CAAC,QAAQ,IAAI,MAAM,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,CAAC,KAAK,CACX,yDAAyD,CAC1D,CAAC;YACJ,CAAC;YACD,MAAM,GAAG,KAAK,CAAC;QACjB,CAAC;QAED,yBAAyB;QACzB,IAAI,MAA6F,CAAC;QAClG,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;QAChD,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC5B,MAAM,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC7B,CAAC;QAED,cAAc;QACd,IAAI,QAAQ,CAAC;QACb,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,eAAe,EAAE,CAAC;gBACnC,IAAI,IAAI,EAAE,CAAC;oBACT,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;wBACzB,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,GAAG,CAAC,OAAO;qBACnB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBACf,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBACzC,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACjC,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,UAAU;QACV,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE;YACnD,MAAM;YACN,eAAe,EAAE,OAAO,CAAC,QAAQ,IAAI,KAAK;YAC1C,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;YAC/B,IAAI;SACL,CAAC,CAAC;QAEH,SAAS;QACT,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,wBAAwB;YACxB,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC;YACpE,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CACT,mBAAmB,SAAS,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,YAAY,CAC/F,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CACX,iBAAiB,SAAS,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,eAAe,MAAM,CAAC,OAAO,CAAC,MAAM,SAAS,CAC9H,CAAC;YACJ,CAAC;YAED,2BAA2B;YAC3B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC/B,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;gBACpC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;oBACd,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC;gBAC/C,CAAC;qBAAM,CAAC;oBACN,IAAI,SAAS,GAAG,MAAM,KAAK,KAAK,CAAC,CAAC,OAAO,cAAc,CAAC,CAAC,KAAK,EAAE,CAAC;oBACjE,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;wBACjB,SAAS,IAAI,kBAAkB,CAAC,CAAC,UAAU,GAAG,CAAC;oBACjD,CAAC;oBACD,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC;YAED,kFAAkF;YAClF,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBAC5B,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAClB,OAAO,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;YAChF,CAAC;QACH,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,2CAA2C;IAC3C,QAAQ;SACL,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,qCAAqC,CAAC;SAClD,QAAQ,CAAC,QAAQ,EAAE,gDAAgD,CAAC;SACpE,MAAM,CAAC,CAAC,UAAmB,EAAE,EAAE;QAC9B,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,aAAa,GAAG,wBAAwB,EAAE,CAAC;QAEjD,sEAAsE;QACtE,MAAM,eAAe,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;YACjD,0CAA0C;YAC1C,IAAI,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC7C,6CAA6C;YAC7C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC;YACtC,uBAAuB;YACvB,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,OAAO,KAAK,CAAC;YACzE,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,gDAAgD;QAChD,IAAI,gBAAgB,GAAG,eAAe,CAAC;QACvC,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,gBAAgB,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;YAC3C,gBAAgB,GAAG,eAAe,CAAC,MAAM,CACvC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,gBAAgB,CAC9D,CAAC;YAEF,kDAAkD;YAClD,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClC,IAAI,IAAI,EAAE,CAAC;oBACT,MAAM,CAAC;wBACL,QAAQ,EAAE,EAAE;wBACZ,KAAK,EAAE,CAAC;wBACR,MAAM,EAAE,gBAAgB;wBACxB,KAAK,EAAE,4CAA4C,gBAAgB,GAAG;qBACvE,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,KAAK,CACX,4CAA4C,gBAAgB,GAAG,CAChE,CAAC;oBACF,OAAO,CAAC,KAAK,CACX,6EAA6E,CAC9E,CAAC;gBACJ,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;gBACnC,OAAO;YACT,CAAC;QACH,CAAC;QAED,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,YAAY,GAAG,gBAAgB,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC5D,MAAM,MAAM,GAA4B;gBACtC,QAAQ,EAAE,YAAY;gBACtB,KAAK,EAAE,YAAY,CAAC,MAAM;aAC3B,CAAC;YACF,IAAI,UAAU;gBAAE,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;YAClD,MAAM,CAAC,MAAM,CAAC,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACxC,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC,CAAC;YACjF,CAAC;YAED,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;gBACnC,MAAM,SAAS,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;gBAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;gBACpC,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;oBACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,gBAAgB,CAAC,MAAM,uBAAuB,CAAC,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ralph.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/ralph.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmyBzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAq0B3D"}
1
+ {"version":3,"file":"ralph.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/ralph.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqyBzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA42B3D"}
@@ -492,6 +492,7 @@ async function processPendingReviewTasks(ctx, adapter, pendingReviewTasks, optio
492
492
  }, {
493
493
  yolo: options.yolo,
494
494
  cwd: options.cwd,
495
+ extraArgs: options.autoApproveArgs,
495
496
  handleRequest: (client, reqId, method, params) => handleRequest(client, reqId, method, params, options.yolo),
496
497
  });
497
498
  if (result.timedOut) {
@@ -612,6 +613,8 @@ export function registerRalphCommand(program) {
612
613
  .option("--no-yolo", "Require normal permission prompts")
613
614
  .option("--subagent-timeout <minutes>", "Review subagent timeout in minutes", "20")
614
615
  .option("--adapter <id>", "Agent adapter to use", "claude-agent-acp")
616
+ .option("--worker-adapter <id>", "Adapter for task-work agent (overrides --adapter)")
617
+ .option("--reviewer-adapter <id>", "Adapter for review subagent (overrides --adapter)")
615
618
  .option("--adapter-cmd <cmd>", "Custom adapter command (for testing)")
616
619
  .option("--restart-every <n>", "Restart agent every N iterations to prevent OOM (0 = never)", "10")
617
620
  .option("--focus <instructions>", "Focus instructions included in every iteration prompt")
@@ -679,28 +682,32 @@ export function registerRalphCommand(program) {
679
682
  registerAdapter("custom", customAdapter);
680
683
  options.adapter = "custom";
681
684
  }
682
- // Resolve adapter
683
- const adapter = resolveAdapter(options.adapter);
684
- // Validate adapter package exists before proceeding
685
- // Skip validation for:
686
- // - Custom adapters (--adapter-cmd)
687
- // - Non-npx adapters
688
- // - Dry-run mode with default adapter (doesn't spawn agent, default may not be installed in CI)
689
- // Note: If user explicitly specifies --adapter, validate even in dry-run to catch typos
690
- // Accept both new and deprecated adapter names
691
- const isDefaultAdapter = options.adapter === "claude-agent-acp" ||
692
- options.adapter === "claude-code-acp";
693
- const skipValidation = options.adapterCmd ||
694
- adapter.command !== "npx" ||
695
- !adapter.args[0] ||
696
- (options.dryRun && isDefaultAdapter);
697
- if (!skipValidation) {
698
- validateAdapter(adapter.args[0]);
699
- }
700
- // Add yolo flag to adapter args if needed (accept both new and deprecated names)
701
- if (options.yolo && isDefaultAdapter) {
702
- adapter.args = [...adapter.args, "--dangerously-skip-permissions"];
685
+ // AC: @ralph-per-role-adapters ac-3, ac-4, ac-5
686
+ // Resolve per-role adapters with precedence: role flag > --adapter > default
687
+ const workerAdapterId = options.workerAdapter ?? options.adapter;
688
+ const reviewerAdapterId = options.reviewerAdapter ?? options.adapter;
689
+ const workerAdapter = resolveAdapter(workerAdapterId);
690
+ const reviewerAdapter = resolveAdapter(reviewerAdapterId);
691
+ // AC: @ralph-per-role-adapters ac-6, ac-9, ac-11
692
+ // Validate adapter packages deduplicate when same ID
693
+ const adapterIdsToValidate = new Set([workerAdapterId, reviewerAdapterId]);
694
+ for (const id of adapterIdsToValidate) {
695
+ const resolved = resolveAdapter(id);
696
+ const isDefault = id === "claude-agent-acp" || id === "claude-code-acp";
697
+ const skip = resolved.command !== "npx" ||
698
+ !resolved.args[0] ||
699
+ (options.dryRun && isDefault);
700
+ if (!skip) {
701
+ validateAdapter(resolved.args[0]);
702
+ }
703
703
  }
704
+ // Build auto-approve extra args per adapter (applied per-spawn to prevent cross-role leakage)
705
+ const workerAutoApproveArgs = options.yolo
706
+ ? workerAdapter.autoApproveArgs
707
+ : undefined;
708
+ const reviewerAutoApproveArgs = options.yolo
709
+ ? reviewerAdapter.autoApproveArgs
710
+ : undefined;
704
711
  const restartInfo = restartEvery > 0 ? `, restart every ${restartEvery}` : "";
705
712
  const maxTasksInfo = maxTasks === 0 ? "unlimited" : `${maxTasks}`;
706
713
  // Initialize kspec context early to validate --tasks
@@ -720,7 +727,10 @@ export function registerRalphCommand(program) {
720
727
  const taskScopeInfo = explicitTaskScope
721
728
  ? `, tasks=${explicitTaskScope.refs.join(",")}`
722
729
  : "";
723
- info(`Starting ralph loop (adapter=${options.adapter}, max ${maxLoops} iterations, ${maxRetries} retries, ${maxFailures} max failures${restartInfo}, max-tasks=${maxTasksInfo}${taskScopeInfo})`);
730
+ const adapterInfo = workerAdapterId === reviewerAdapterId
731
+ ? `adapter=${workerAdapterId}`
732
+ : `worker=${workerAdapterId}, reviewer=${reviewerAdapterId}`;
733
+ info(`Starting ralph loop (${adapterInfo}, max ${maxLoops} iterations, ${maxRetries} retries, ${maxFailures} max failures${restartInfo}, max-tasks=${maxTasksInfo}${taskScopeInfo})`);
724
734
  if (options.focus) {
725
735
  info(`Focus: ${options.focus}`);
726
736
  }
@@ -738,12 +748,20 @@ export function registerRalphCommand(program) {
738
748
  // Create session with budget. When maxTasks=0 (unlimited), no budget.json is created.
739
749
  await createSessionWithBudget(specDir, {
740
750
  id: sessionId,
741
- agent_type: options.adapter,
751
+ agent_type: workerAdapterId,
742
752
  budget: maxTasks,
743
753
  });
744
- // Adapter ID for harness-specific env injection/cleanup.
745
- // Declared before try/finally so signal handlers and finally block can access it.
746
- const adapterId = options.adapter || "claude-agent-acp";
754
+ // AC: @ralph-per-role-adapters ac-6, ac-7
755
+ // Adapter IDs for harness-specific env injection/cleanup.
756
+ // Deduplicate by harness target, not just adapter ID. claude-code-acp is
757
+ // an alias for claude-agent-acp — both inject to the same Claude Code
758
+ // settings file. Without normalization, injecting twice would clobber the
759
+ // previousValue and break cleanup restoration.
760
+ const normalizeForEnv = (id) => id === "claude-code-acp" ? "claude-agent-acp" : id;
761
+ const uniqueAdapterIds = [...new Set([
762
+ normalizeForEnv(workerAdapterId),
763
+ normalizeForEnv(reviewerAdapterId),
764
+ ])];
747
765
  // Everything after session creation is wrapped in try/finally to guarantee
748
766
  // budget cleanup even if pre-loop setup (event logging, signal handlers) throws.
749
767
  // AC: @ralph-session-budget-integration ac-session-close-all-paths
@@ -753,7 +771,9 @@ export function registerRalphCommand(program) {
753
771
  let exitReason = null;
754
772
  let lastIterationCtx = null;
755
773
  let lastErrorMessage;
756
- let previousEnvValue; // For restoring pre-existing KSPEC_SESSION_ID
774
+ // AC: @ralph-per-role-adapters ac-7
775
+ // Track previous env values per adapter for cleanup restoration
776
+ const previousEnvValues = new Map();
757
777
  const recentTaskRefs = [];
758
778
  const sessionIterationMap = new Map();
759
779
  // Signal handler refs — declared here so finally can remove them
@@ -772,7 +792,7 @@ export function registerRalphCommand(program) {
772
792
  await Promise.all([
773
793
  fs.unlink(getSessionBudgetPath(specDir, sessionId)).catch(() => { }),
774
794
  closeSession(specDir, sessionId, "abandoned", `Received ${signal}`),
775
- removeEnvForAdapter(adapterId, previousEnvValue),
795
+ ...uniqueAdapterIds.map((id) => removeEnvForAdapter(id, previousEnvValues.get(id))),
776
796
  ]);
777
797
  }
778
798
  catch {
@@ -792,19 +812,24 @@ export function registerRalphCommand(program) {
792
812
  // AC: @ralph-session-budget-integration ac-session-close-all-paths
793
813
  process.on("SIGINT", sigintHandler);
794
814
  process.on("SIGTERM", sigtermHandler);
795
- // Inject KSPEC_SESSION_ID into agent harness config so it reaches child
796
- // processes. Inside try/finally so cleanup runs even if injection fails.
815
+ // AC: @ralph-per-role-adapters ac-6, ac-7
816
+ // Inject KSPEC_SESSION_ID into agent harness config for each unique adapter.
797
817
  // Process env alone is insufficient — some harnesses (e.g., Claude Code)
798
818
  // sandbox child processes and don't forward arbitrary parent env vars.
799
819
  // AC: @ralph-session-budget-integration ac-env-inject
800
- const injectionResult = await injectEnvForAdapter(adapterId, sessionId);
801
- previousEnvValue = injectionResult?.previousValue;
802
- // Log session start
820
+ for (const id of uniqueAdapterIds) {
821
+ const injectionResult = await injectEnvForAdapter(id, sessionId);
822
+ previousEnvValues.set(id, injectionResult?.previousValue);
823
+ }
824
+ // AC: @ralph-per-role-adapters ac-12
825
+ // Log session start with both adapter IDs
803
826
  await appendEvent(specDir, {
804
827
  session_id: sessionId,
805
828
  type: "session.start",
806
829
  data: {
807
- adapter: options.adapter,
830
+ adapter: workerAdapterId,
831
+ workerAdapter: workerAdapterId,
832
+ reviewerAdapter: reviewerAdapterId,
808
833
  maxLoops,
809
834
  maxRetries,
810
835
  maxFailures,
@@ -841,14 +866,16 @@ export function registerRalphCommand(program) {
841
866
  sessionCtx = filterByExplicitTasks(sessionCtx, explicitTaskScope);
842
867
  }
843
868
  // AC: @ralph-subagent-spawning ac-8 - Process pending_review tasks BEFORE main iteration
869
+ // AC: @ralph-per-role-adapters ac-2 - Use reviewer adapter for review subagents
844
870
  // This wraps consecutiveFailures in an object so it can be mutated by the helper
845
871
  const failureTracker = { count: consecutiveFailures };
846
- const continueLoop = await processPendingReviewTasks(ctx, adapter, sessionCtx.pending_review_tasks, {
872
+ const continueLoop = await processPendingReviewTasks(ctx, reviewerAdapter, sessionCtx.pending_review_tasks, {
847
873
  yolo: options.yolo,
848
874
  maxRetries,
849
875
  maxFailures,
850
876
  cwd: process.cwd(),
851
877
  subagentTimeout: subagentTimeout * 60 * 1000,
878
+ autoApproveArgs: reviewerAutoApproveArgs,
852
879
  }, failureTracker);
853
880
  consecutiveFailures = failureTracker.count;
854
881
  if (!continueLoop) {
@@ -905,8 +932,11 @@ export function registerRalphCommand(program) {
905
932
  const taskWorkPrompt = buildTaskWorkPrompt(currentCtx, iteration, maxLoops, sessionId, ctx.config.ralph.skills.task_work, options.focus, explicitTaskScope);
906
933
  const reflectPrompt = buildReflectPrompt(iteration, maxLoops, sessionId, ctx.config.ralph.skills.reflect);
907
934
  // AC: @cli-ralph ac-21
935
+ // AC: @ralph-per-role-adapters ac-10
908
936
  if (options.dryRun) {
909
937
  console.log(chalk.yellow("=== DRY RUN - Configuration ===\n"));
938
+ console.log(` worker-adapter: ${workerAdapterId}`);
939
+ console.log(` reviewer-adapter: ${reviewerAdapterId}`);
910
940
  console.log(` max-loops: ${maxLoops}`);
911
941
  console.log(` max-tasks: ${maxTasks === 0 ? "unlimited" : maxTasks}`);
912
942
  console.log(` max-retries: ${maxRetries}`);
@@ -945,12 +975,15 @@ export function registerRalphCommand(program) {
945
975
  }
946
976
  try {
947
977
  // Spawn agent if not already running
978
+ // AC: @ralph-per-role-adapters ac-1 - Use worker adapter for task-work
948
979
  if (!agent) {
949
980
  info("Spawning ACP agent...");
950
981
  // AC: @ralph-session-budget-integration ac-env-inject
951
- agent = await spawnAndInitialize(adapter, {
982
+ // AC: @ralph-adapter-auto-approve ac-1, ac-2, ac-3
983
+ agent = await spawnAndInitialize(workerAdapter, {
952
984
  cwd: process.cwd(),
953
985
  env: { KSPEC_SESSION_ID: sessionId },
986
+ extraArgs: workerAutoApproveArgs,
954
987
  clientOptions: {
955
988
  clientInfo: {
956
989
  name: "kspec-ralph",
@@ -1127,9 +1160,11 @@ export function registerRalphCommand(program) {
1127
1160
  agent = null;
1128
1161
  }
1129
1162
  // AC: @ralph-session-budget-integration ac-session-close-all-paths
1130
- // Clean up budget file and harness env injection when session ends
1163
+ // AC: @ralph-per-role-adapters ac-7 - Clean up env for all unique adapters
1131
1164
  await fs.unlink(getSessionBudgetPath(specDir, sessionId)).catch(() => { });
1132
- await removeEnvForAdapter(adapterId, previousEnvValue);
1165
+ for (const id of uniqueAdapterIds) {
1166
+ await removeEnvForAdapter(id, previousEnvValues.get(id));
1167
+ }
1133
1168
  // Clean up session env vars
1134
1169
  delete process.env.KSPEC_RALPH_SESSION;
1135
1170
  delete process.env.KSPEC_SESSION_ID;
@@ -1147,9 +1182,11 @@ export function registerRalphCommand(program) {
1147
1182
  maxLoops, inProgressTasks, pendingReviewTasks, recentTaskRefs, process.cwd(), lastErrorMessage);
1148
1183
  info(`Exit reason: ${exitReason}`);
1149
1184
  info(`Working tree: ${wrapUpCtx.workingTree.clean ? "clean" : "has uncommitted changes"}`);
1150
- const wrapUpResult = await runWrapUpAgent(adapter, wrapUpCtx, {
1185
+ // AC: @ralph-per-role-adapters ac-8 - Wrap-up uses worker adapter
1186
+ const wrapUpResult = await runWrapUpAgent(workerAdapter, wrapUpCtx, {
1151
1187
  yolo: options.yolo,
1152
1188
  cwd: process.cwd(),
1189
+ extraArgs: workerAutoApproveArgs,
1153
1190
  handleRequest: (client, reqId, method, params) => handleRequest(client, reqId, method, params, options.yolo),
1154
1191
  }, DEFAULT_WRAPUP_TIMEOUT);
1155
1192
  // Log wrap-up result