@ai-hero/sandcastle 0.4.0 → 0.4.2

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 (96) hide show
  1. package/README.md +185 -126
  2. package/dist/AgentProvider.d.ts +22 -2
  3. package/dist/AgentProvider.d.ts.map +1 -1
  4. package/dist/AgentProvider.js +18 -2
  5. package/dist/AgentProvider.js.map +1 -1
  6. package/dist/InitService.d.ts.map +1 -1
  7. package/dist/InitService.js +55 -6
  8. package/dist/InitService.js.map +1 -1
  9. package/dist/MountConfig.d.ts +15 -0
  10. package/dist/MountConfig.d.ts.map +1 -0
  11. package/dist/MountConfig.js +7 -0
  12. package/dist/MountConfig.js.map +1 -0
  13. package/dist/Orchestrator.d.ts +0 -1
  14. package/dist/Orchestrator.d.ts.map +1 -1
  15. package/dist/Orchestrator.js +29 -19
  16. package/dist/Orchestrator.js.map +1 -1
  17. package/dist/SandboxFactory.d.ts +16 -10
  18. package/dist/SandboxFactory.d.ts.map +1 -1
  19. package/dist/SandboxFactory.js +20 -22
  20. package/dist/SandboxFactory.js.map +1 -1
  21. package/dist/SandboxLifecycle.d.ts +1 -1
  22. package/dist/SandboxLifecycle.d.ts.map +1 -1
  23. package/dist/SandboxLifecycle.js +2 -2
  24. package/dist/SandboxLifecycle.js.map +1 -1
  25. package/dist/SandboxProvider.d.ts +31 -21
  26. package/dist/SandboxProvider.d.ts.map +1 -1
  27. package/dist/SandboxProvider.js +2 -2
  28. package/dist/SandboxProvider.js.map +1 -1
  29. package/dist/TextDeltaBuffer.d.ts +24 -0
  30. package/dist/TextDeltaBuffer.d.ts.map +1 -0
  31. package/dist/TextDeltaBuffer.js +68 -0
  32. package/dist/TextDeltaBuffer.js.map +1 -0
  33. package/dist/WorktreeManager.d.ts +2 -0
  34. package/dist/WorktreeManager.d.ts.map +1 -1
  35. package/dist/WorktreeManager.js +3 -0
  36. package/dist/WorktreeManager.js.map +1 -1
  37. package/dist/cli.d.ts.map +1 -1
  38. package/dist/cli.js +11 -7
  39. package/dist/cli.js.map +1 -1
  40. package/dist/createSandbox.d.ts +6 -5
  41. package/dist/createSandbox.d.ts.map +1 -1
  42. package/dist/createSandbox.js +18 -8
  43. package/dist/createSandbox.js.map +1 -1
  44. package/dist/index.d.ts +3 -2
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +1 -1
  47. package/dist/index.js.map +1 -1
  48. package/dist/mergeProviderEnv.d.ts +13 -0
  49. package/dist/mergeProviderEnv.d.ts.map +1 -0
  50. package/dist/mergeProviderEnv.js +23 -0
  51. package/dist/mergeProviderEnv.js.map +1 -0
  52. package/dist/run.d.ts +7 -2
  53. package/dist/run.d.ts.map +1 -1
  54. package/dist/run.js +20 -6
  55. package/dist/run.js.map +1 -1
  56. package/dist/sandboxes/daytona.d.ts +48 -0
  57. package/dist/sandboxes/daytona.d.ts.map +1 -0
  58. package/dist/sandboxes/daytona.js +125 -0
  59. package/dist/sandboxes/daytona.js.map +1 -0
  60. package/dist/sandboxes/docker.d.ts +11 -3
  61. package/dist/sandboxes/docker.d.ts.map +1 -1
  62. package/dist/sandboxes/docker.js +69 -43
  63. package/dist/sandboxes/docker.js.map +1 -1
  64. package/dist/sandboxes/podman.d.ts +46 -0
  65. package/dist/sandboxes/podman.d.ts.map +1 -0
  66. package/dist/sandboxes/podman.js +195 -0
  67. package/dist/sandboxes/podman.js.map +1 -0
  68. package/dist/sandboxes/test-isolated.d.ts +3 -7
  69. package/dist/sandboxes/test-isolated.d.ts.map +1 -1
  70. package/dist/sandboxes/test-isolated.js +57 -47
  71. package/dist/sandboxes/test-isolated.js.map +1 -1
  72. package/dist/sandboxes/vercel.d.ts +92 -0
  73. package/dist/sandboxes/vercel.d.ts.map +1 -0
  74. package/dist/sandboxes/vercel.js +165 -0
  75. package/dist/sandboxes/vercel.js.map +1 -0
  76. package/dist/syncOut.d.ts +1 -1
  77. package/dist/syncOut.js +3 -3
  78. package/dist/syncOut.js.map +1 -1
  79. package/dist/templates/parallel-planner/main.mts +6 -3
  80. package/dist/templates/parallel-planner-with-review/.env.example +5 -0
  81. package/dist/templates/parallel-planner-with-review/CODING_STANDARDS.md +27 -0
  82. package/dist/templates/parallel-planner-with-review/implement-prompt.md +62 -0
  83. package/dist/templates/parallel-planner-with-review/main.mts +251 -0
  84. package/dist/templates/parallel-planner-with-review/merge-prompt.md +22 -0
  85. package/dist/templates/parallel-planner-with-review/plan-prompt.md +33 -0
  86. package/dist/templates/parallel-planner-with-review/review-prompt.md +55 -0
  87. package/dist/templates/parallel-planner-with-review/template.json +4 -0
  88. package/dist/templates/sequential-reviewer/CODING_STANDARDS.md +27 -0
  89. package/dist/templates/sequential-reviewer/implement-prompt.md +34 -45
  90. package/dist/templates/sequential-reviewer/main.mts +4 -2
  91. package/dist/templates/sequential-reviewer/review-prompt.md +1 -1
  92. package/dist/templates/simple-loop/main.mts +6 -0
  93. package/dist/testSandbox.d.ts.map +1 -1
  94. package/dist/testSandbox.js +58 -53
  95. package/dist/testSandbox.js.map +1 -1
  96. package/package.json +25 -1
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Vercel isolated sandbox provider — wraps `@vercel/sandbox` into a SandboxProvider.
3
+ *
4
+ * Usage:
5
+ * import { vercel } from "sandcastle/sandboxes/vercel";
6
+ * await run({ agent: claudeCode("claude-opus-4-6"), sandbox: vercel() });
7
+ */
8
+ import { execSync } from "node:child_process";
9
+ import { readFile, unlink, writeFile, mkdir, stat } from "node:fs/promises";
10
+ import { tmpdir } from "node:os";
11
+ import { dirname, join } from "node:path";
12
+ import { Writable } from "node:stream";
13
+ import { createIsolatedSandboxProvider, } from "../SandboxProvider.js";
14
+ /** Workspace path inside the Vercel sandbox. */
15
+ const VERCEL_WORKSPACE_PATH = "/vercel/sandbox/workspace";
16
+ /**
17
+ * Create a Vercel isolated sandbox provider.
18
+ *
19
+ * The returned provider creates Vercel Firecracker microVM sandboxes via
20
+ * the `@vercel/sandbox` SDK. Each sandbox is ephemeral — one sandbox per run.
21
+ *
22
+ * Requires `@vercel/sandbox` to be installed as a peer dependency.
23
+ */
24
+ export const vercel = (options) => createIsolatedSandboxProvider({
25
+ name: "vercel",
26
+ env: options?.env,
27
+ create: async (createOptions) => {
28
+ // Dynamic import so the peer dependency is only loaded at runtime
29
+ const { Sandbox } = await import("@vercel/sandbox");
30
+ const createParams = {};
31
+ // Pass through SDK options
32
+ if (options?.source)
33
+ createParams.source = options.source;
34
+ if (options?.ports)
35
+ createParams.ports = options.ports;
36
+ if (options?.resources)
37
+ createParams.resources = options.resources;
38
+ if (options?.networkPolicy)
39
+ createParams.networkPolicy = options.networkPolicy;
40
+ // runtime takes precedence over the template convenience alias
41
+ const resolvedRuntime = options?.runtime ?? options?.template;
42
+ if (resolvedRuntime)
43
+ createParams.runtime = resolvedRuntime;
44
+ // Timeout: prefer explicit timeout, fall back to timeoutMs alias
45
+ const timeoutValue = options?.timeout ?? options?.timeoutMs;
46
+ if (timeoutValue !== undefined)
47
+ createParams.timeout = timeoutValue;
48
+ // Merge provider env with Sandcastle env
49
+ createParams.env = createOptions.env;
50
+ // Auth: pass token and team/project IDs if provided
51
+ if (options?.token)
52
+ createParams.token = options.token;
53
+ if (options?.projectId)
54
+ createParams.projectId = options.projectId;
55
+ if (options?.teamId)
56
+ createParams.teamId = options.teamId;
57
+ const sandbox = await Sandbox.create(createParams);
58
+ // Ensure workspace directory exists
59
+ await sandbox.mkDir(VERCEL_WORKSPACE_PATH);
60
+ const handle = {
61
+ workspacePath: VERCEL_WORKSPACE_PATH,
62
+ exec: async (command, opts) => {
63
+ if (opts?.onLine) {
64
+ const onLine = opts.onLine;
65
+ const stdoutLines = [];
66
+ const stderrChunks = [];
67
+ let partial = "";
68
+ const stdoutWritable = new Writable({
69
+ write(chunk, _encoding, callback) {
70
+ const text = partial + chunk.toString();
71
+ const lines = text.split("\n");
72
+ partial = lines.pop() ?? "";
73
+ for (const line of lines) {
74
+ stdoutLines.push(line);
75
+ onLine(line);
76
+ }
77
+ callback();
78
+ },
79
+ final(callback) {
80
+ if (partial) {
81
+ stdoutLines.push(partial);
82
+ onLine(partial);
83
+ partial = "";
84
+ }
85
+ callback();
86
+ },
87
+ });
88
+ const stderrWritable = new Writable({
89
+ write(chunk, _encoding, callback) {
90
+ stderrChunks.push(chunk.toString());
91
+ callback();
92
+ },
93
+ });
94
+ const result = await sandbox.runCommand({
95
+ cmd: "sh",
96
+ args: ["-c", command],
97
+ cwd: opts?.cwd ?? VERCEL_WORKSPACE_PATH,
98
+ stdout: stdoutWritable,
99
+ stderr: stderrWritable,
100
+ });
101
+ return {
102
+ stdout: stdoutLines.join("\n"),
103
+ stderr: stderrChunks.join(""),
104
+ exitCode: result.exitCode,
105
+ };
106
+ }
107
+ const result = await sandbox.runCommand({
108
+ cmd: "sh",
109
+ args: ["-c", command],
110
+ cwd: opts?.cwd ?? VERCEL_WORKSPACE_PATH,
111
+ });
112
+ const stdout = await result.stdout();
113
+ const stderr = await result.stderr();
114
+ return {
115
+ stdout,
116
+ stderr,
117
+ exitCode: result.exitCode,
118
+ };
119
+ },
120
+ copyIn: async (hostPath, sandboxPath) => {
121
+ const info = await stat(hostPath);
122
+ if (info.isDirectory()) {
123
+ const tarPath = join(tmpdir(), `sandcastle-copyin-${Date.now()}.tar.gz`);
124
+ execSync(`tar -czf "${tarPath}" -C "${hostPath}" .`);
125
+ try {
126
+ const tarContent = await readFile(tarPath);
127
+ const sandboxTarPath = `/tmp/sandcastle-copyin-${Date.now()}.tar.gz`;
128
+ await sandbox.writeFiles([
129
+ { path: sandboxTarPath, content: tarContent },
130
+ ]);
131
+ await sandbox.runCommand({
132
+ cmd: "sh",
133
+ args: [
134
+ "-c",
135
+ `mkdir -p "${sandboxPath}" && tar -xzf "${sandboxTarPath}" -C "${sandboxPath}" && rm -f "${sandboxTarPath}"`,
136
+ ],
137
+ });
138
+ }
139
+ finally {
140
+ await unlink(tarPath).catch(() => { });
141
+ }
142
+ }
143
+ else {
144
+ const content = await readFile(hostPath);
145
+ await sandbox.writeFiles([{ path: sandboxPath, content }]);
146
+ }
147
+ },
148
+ copyFileOut: async (sandboxPath, hostPath) => {
149
+ const buffer = await sandbox.readFileToBuffer({
150
+ path: sandboxPath,
151
+ });
152
+ if (!buffer) {
153
+ throw new Error(`File not found in Vercel sandbox: ${sandboxPath}`);
154
+ }
155
+ await mkdir(dirname(hostPath), { recursive: true });
156
+ await writeFile(hostPath, buffer);
157
+ },
158
+ close: async () => {
159
+ await sandbox.stop();
160
+ },
161
+ };
162
+ return handle;
163
+ },
164
+ });
165
+ //# sourceMappingURL=vercel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vercel.js","sourceRoot":"","sources":["../../src/sandboxes/vercel.ts"],"names":[],"mappings":"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"}
package/dist/syncOut.d.ts CHANGED
@@ -11,7 +11,7 @@
11
11
  * Three-prong extraction within each phase:
12
12
  * 1. Committed changes: `git format-patch` + `git am --3way`
13
13
  * 2. Uncommitted changes (staged + unstaged): `git diff HEAD` + `git apply`
14
- * 3. Untracked files: `git ls-files --others` + `copyOut` each file
14
+ * 3. Untracked files: `git ls-files --others` + `copyFileOut` each file
15
15
  */
16
16
  import { Effect } from "effect";
17
17
  import type { IsolatedSandboxHandle } from "./SandboxProvider.js";
package/dist/syncOut.js CHANGED
@@ -11,7 +11,7 @@
11
11
  * Three-prong extraction within each phase:
12
12
  * 1. Committed changes: `git format-patch` + `git am --3way`
13
13
  * 2. Uncommitted changes (staged + unstaged): `git diff HEAD` + `git apply`
14
- * 3. Untracked files: `git ls-files --others` + `copyOut` each file
14
+ * 3. Untracked files: `git ls-files --others` + `copyFileOut` each file
15
15
  */
16
16
  import { existsSync } from "node:fs";
17
17
  import { mkdir, readdir, readFile, rm, stat, writeFile, } from "node:fs/promises";
@@ -153,7 +153,7 @@ export const syncOut = (hostRepoDir, handle) => Effect.gen(function* () {
153
153
  const sandboxPatchPath = `${sandboxPatchDir}/${patchName}`;
154
154
  const hostPatchPath = join(patchDir, patchName);
155
155
  yield* Effect.tryPromise({
156
- try: () => handle.copyOut(sandboxPatchPath, hostPatchPath),
156
+ try: () => handle.copyFileOut(sandboxPatchPath, hostPatchPath),
157
157
  catch: (e) => new SyncError({
158
158
  message: `Failed to copy patch ${patchName}: ${e instanceof Error ? e.message : String(e)}`,
159
159
  }),
@@ -186,7 +186,7 @@ export const syncOut = (hostRepoDir, handle) => Effect.gen(function* () {
186
186
  yield* Effect.tryPromise({
187
187
  try: async () => {
188
188
  await mkdir(dirname(hostFilePath), { recursive: true });
189
- await handle.copyOut(sandboxFilePath, hostFilePath);
189
+ await handle.copyFileOut(sandboxFilePath, hostFilePath);
190
190
  },
191
191
  catch: (e) => new SyncError({
192
192
  message: `Failed to save untracked file ${relPath}: ${e instanceof Error ? e.message : String(e)}`,
@@ -1 +1 @@
1
- {"version":3,"file":"syncOut.js","sourceRoot":"","sources":["../src/syncOut.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"syncOut.js","sourceRoot":"","sources":["../src/syncOut.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EACL,KAAK,EACL,OAAO,EACP,QAAQ,EACR,EAAE,EACF,IAAI,EACJ,SAAS,GACV,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,oBAAoB,EAAmB,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC;;;GAGG;AACH,MAAM,QAAQ,GAAG,CACf,OAAe,EACf,GAAW,EACuB,EAAE,CACpC,MAAM,CAAC,UAAU,CAAC;IAChB,GAAG,EAAE,KAAK,IAAI,EAAE;QACd,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACpD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE;YAC1C,GAAG;YACH,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;SAC5B,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CACX,IAAI,SAAS,CAAC;QACZ,OAAO,EAAE,wBAAwB,OAAO,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;KAC1F,CAAC;CACL,CAAC,CAAC;AAEL;;GAEG;AACH,MAAM,MAAM,GAAG,CACb,MAA6B,EAC7B,OAAe,EACf,OAA0B,EAI1B,EAAE,CACF,MAAM,CAAC,UAAU,CAAC;IAChB,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC;IACxC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CACX,IAAI,SAAS,CAAC;QACZ,OAAO,EAAE,wBAAwB,OAAO,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;KAC1F,CAAC;CACL,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CACxB,MAAM,CAAC,QAAQ,KAAK,CAAC;IACnB,CAAC,CAAC,MAAM,CAAC,IAAI,CACT,IAAI,SAAS,CAAC;QACZ,OAAO,EAAE,gCAAgC,MAAM,CAAC,QAAQ,MAAM,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE;KAC1F,CAAC,CACH;IACH,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAC3B,CACF,CAAC;AAEJ;;GAEG;AACH,MAAM,WAAW,GAAG,CAClB,MAA6B,EAC7B,OAAe,EACf,OAA0B,EAI1B,EAAE,CACF,MAAM,CAAC,UAAU,CAAC;IAChB,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC;IACxC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CACX,IAAI,SAAS,CAAC;QACZ,OAAO,EAAE,wBAAwB,OAAO,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;KAC1F,CAAC;CACL,CAAC,CAAC;AAEL;;;;GAIG;AACH,MAAM,YAAY,GAAG,CAAC,SAAiB,EAAqC,EAAE,CAC5E,MAAM,CAAC,UAAU,CAAC;IAChB,GAAG,EAAE,KAAK,IAAI,EAAE;QACd,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC;QACnC,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACnD,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IACzC,CAAC;IACD,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CACX,IAAI,SAAS,CAAC;QACZ,OAAO,EAAE,yBAAyB,SAAS,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;KAC7F,CAAC;CACL,CAAC,CAAC;AAEL;;;GAGG;AACH,MAAM,cAAc,GAAG,CACrB,WAAmB,EACe,EAAE,CACpC,MAAM,CAAC,UAAU,CAAC;IAChB,GAAG,EAAE,KAAK,IAAI,EAAE;QACd,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC;QAE1J,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;QAChE,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE9C,IAAI,OAAO,GAAG,IAAI,CAAC;QACnB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,OAAO,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;YAC9C,OAAO,EAAE,CAAC;YACV,OAAO,GAAG,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC;QACjC,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CACX,IAAI,SAAS,CAAC;QACZ,OAAO,EAAE,qCAAqC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;KAC3F,CAAC;CACL,CAAC,CAAC;AAEL;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CACrB,WAAmB,EACnB,MAA6B,EACG,EAAE,CAClC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;IAE3C,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAC/B,oBAAoB,EACpB,WAAW,CACZ,CAAC,CAAC,IAAI,EAAE,CAAC;IACV,MAAM,WAAW,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,EAAE;QAC/D,GAAG,EAAE,aAAa;KACnB,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAElB,MAAM,UAAU,GAAG,QAAQ,KAAK,WAAW,CAAC;IAE5C,gCAAgC;IAChC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,eAAe,EAAE;QAC7D,GAAG,EAAE,aAAa;KACnB,CAAC,CAAC;IACH,MAAM,OAAO,GACX,UAAU,CAAC,QAAQ,KAAK,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAEnE,4BAA4B;IAC5B,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,WAAW,CACtC,MAAM,EACN,0CAA0C,EAC1C,EAAE,GAAG,EAAE,aAAa,EAAE,CACvB,CAAC;IACF,MAAM,YAAY,GAChB,aAAa,CAAC,QAAQ,KAAK,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAEzE,MAAM,cAAc,GAAG,YAAY;QACjC,CAAC,CAAC,aAAa,CAAC,MAAM;aACjB,IAAI,EAAE;aACN,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAChC,CAAC,CAAC,EAAE,CAAC;IAEP,kBAAkB;IAClB,IAAI,CAAC,UAAU,IAAI,CAAC,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,sCAAsC;IACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IACpD,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE5E,MAAM,eAAe,GAAa,EAAE,CAAC;IAErC,yBAAyB;IACzB,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,MAAM,CAChC,MAAM,EACN,wCAAwC,CACzC,CAAC;QACF,MAAM,eAAe,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAEnD,IAAI,CAAC;YACH,KAAK,CAAC,CAAC,MAAM,CACX,MAAM,EACN,qBAAqB,QAAQ,eAAe,eAAe,GAAG,EAC9D,EAAE,GAAG,EAAE,aAAa,EAAE,CACvB,CAAC;YAEF,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,eAAe,GAAG,CAAC,CAAC;YACrE,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM;iBAC/B,IAAI,EAAE;iBACN,KAAK,CAAC,IAAI,CAAC;iBACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAErC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;gBACnC,MAAM,gBAAgB,GAAG,GAAG,eAAe,IAAI,SAAS,EAAE,CAAC;gBAC3D,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;gBAChD,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;oBACvB,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,gBAAgB,EAAE,aAAa,CAAC;oBAC9D,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CACX,IAAI,SAAS,CAAC;wBACZ,OAAO,EAAE,wBAAwB,SAAS,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;qBAC5F,CAAC;iBACL,CAAC,CAAC;gBAEH,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;oBAC1C,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,KAAK,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,WAAW,eAAe,GAAG,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QACjD,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;YACvB,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAC;YACjD,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CACX,IAAI,SAAS,CAAC;gBACZ,OAAO,EAAE,+BAA+B,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;aACrF,CAAC;SACL,CAAC,CAAC;IACL,CAAC;IAED,uBAAuB;IACvB,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACjD,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;YACrC,MAAM,eAAe,GAAG,GAAG,aAAa,IAAI,OAAO,EAAE,CAAC;YACtD,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACjD,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;gBACvB,GAAG,EAAE,KAAK,IAAI,EAAE;oBACd,MAAM,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBACxD,MAAM,MAAM,CAAC,WAAW,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;gBAC1D,CAAC;gBACD,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CACX,IAAI,SAAS,CAAC;oBACZ,OAAO,EAAE,iCAAiC,OAAO,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;iBACnG,CAAC;aACL,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,IAAI,UAAkC,CAAC;IAEvC,0BAA0B;IAC1B,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CACtC,QAAQ,CAAC,gBAAgB,EAAE,WAAW,CAAC,CACxC,CAAC;QACF,KAAK,WAAW,CAAC,CAAC,wBAAwB;QAC1C,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CACtC,QAAQ,CAAC,iBAAiB,SAAS,EAAE,EAAE,WAAW,CAAC,CACpD,CAAC;QACF,IAAI,WAAW,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAChC,UAAU,GAAG,SAAS,CAAC;QACzB,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,IAAI,CAAC,UAAU,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QACjD,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CACtC,QAAQ,CAAC,cAAc,QAAQ,GAAG,EAAE,WAAW,CAAC,CACjD,CAAC;QACF,IAAI,WAAW,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAChC,UAAU,GAAG,MAAM,CAAC;QACtB,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,IAAI,CAAC,UAAU,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CACrC,MAAM,CAAC,UAAU,CAAC;YAChB,GAAG,EAAE,KAAK,IAAI,EAAE;gBACd,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;gBACjD,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;oBACrC,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;oBAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;oBAC5C,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBACpD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;oBACxC,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;YACD,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CACX,IAAI,SAAS,CAAC;gBACZ,OAAO,EAAE,mCAAmC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;aACzF,CAAC;SACL,CAAC,CACH,CAAC;QACF,IAAI,UAAU,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC/B,UAAU,GAAG,WAAW,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,8BAA8B;IAC9B,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,oBAAoB,CAAC;YAC/B,QAAQ,EAAE,gBAAgB;YAC1B,UAAU;YACV,UAAU,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC;YACtC,OAAO;YACP,YAAY;SACb,CAAC,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IAC5B,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;YACvB,GAAG,EAAE,KAAK,IAAI,EAAE;gBACd,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBACrD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;gBAChE,IAAI,CAAC;oBACH,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;oBAC7C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAC3B,MAAM,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,EAAE;4BACzC,SAAS,EAAE,IAAI;4BACf,KAAK,EAAE,IAAI;yBACZ,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS;gBACX,CAAC;YACH,CAAC;YACD,KAAK,EAAE,GAAG,EAAE,CACV,IAAI,SAAS,CAAC,EAAE,OAAO,EAAE,oCAAoC,EAAE,CAAC;SACnE,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -58,6 +58,7 @@ for (let iteration = 1; iteration <= MAX_ITERATIONS; iteration++) {
58
58
  hooks,
59
59
  copyToSandbox,
60
60
  sandbox: docker(),
61
+ branchStrategy: { type: "merge-to-head" },
61
62
  name: "planner",
62
63
  // One iteration is enough: the planner just needs to read and reason,
63
64
  // not write code.
@@ -107,8 +108,9 @@ for (let iteration = 1; iteration <= MAX_ITERATIONS; iteration++) {
107
108
  sandcastle.run({
108
109
  hooks,
109
110
  copyToSandbox,
110
- // Each agent starts on its own branch via the provider's branchStrategy.
111
- sandbox: docker({ branchStrategy: { type: "branch", branch: issue.branch } }),
111
+ // Each agent starts on its own branch via branchStrategy on run().
112
+ sandbox: docker(),
113
+ branchStrategy: { type: "branch", branch: issue.branch },
112
114
  name: "implementer",
113
115
  // Give each agent plenty of room to implement and iterate on tests.
114
116
  maxIterations: 100,
@@ -182,8 +184,9 @@ for (let iteration = 1; iteration <= MAX_ITERATIONS; iteration++) {
182
184
  hooks,
183
185
  copyToSandbox,
184
186
  sandbox: docker(),
187
+ branchStrategy: { type: "merge-to-head" },
185
188
  name: "merger",
186
- maxIterations: 10,
189
+ maxIterations: 1,
187
190
  // Sonnet is sufficient for merge conflict resolution.
188
191
  agent: sandcastle.claudeCode("claude-sonnet-4-6"),
189
192
  promptFile: "./.sandcastle/merge-prompt.md",
@@ -0,0 +1,5 @@
1
+ # Anthropic API key
2
+ # If you want to use your Claude subscription instead of an API key, see https://github.com/mattpocock/sandcastle/issues/191
3
+ ANTHROPIC_API_KEY=
4
+ # GitHub personal access token
5
+ GH_TOKEN=
@@ -0,0 +1,27 @@
1
+ # Coding Standards
2
+
3
+ <!-- Customize this file with your project's coding standards.
4
+ The reviewer agent loads it during code review via @.sandcastle/CODING_STANDARDS.md
5
+ so these standards are enforced during review without costing tokens during implementation. -->
6
+
7
+ ## Style
8
+
9
+ <!-- Example:
10
+ - Use camelCase for variables and functions
11
+ - Use PascalCase for classes and types
12
+ - Prefer named exports over default exports
13
+ -->
14
+
15
+ ## Testing
16
+
17
+ <!-- Example:
18
+ - Every public function must have at least one test
19
+ - Use descriptive test names that explain the expected behavior
20
+ -->
21
+
22
+ ## Architecture
23
+
24
+ <!-- Example:
25
+ - Keep modules focused on a single responsibility
26
+ - Prefer composition over inheritance
27
+ -->
@@ -0,0 +1,62 @@
1
+ # TASK
2
+
3
+ Fix issue #{{ISSUE_NUMBER}}: {{ISSUE_TITLE}}
4
+
5
+ Pull in the issue using `gh issue view`. If it has a parent PRD, pull that in too.
6
+
7
+ Only work on the issue specified.
8
+
9
+ Work on branch {{BRANCH}}. Make commits, run tests, and close the issue when done.
10
+
11
+ # CONTEXT
12
+
13
+ Here are the last 10 commits:
14
+
15
+ <recent-commits>
16
+
17
+ !`git log -n 10 --format="%H%n%ad%n%B---" --date=short`
18
+
19
+ </recent-commits>
20
+
21
+ # EXPLORATION
22
+
23
+ Explore the repo and fill your context window with relevant information that will allow you to complete the task.
24
+
25
+ Pay extra attention to test files that touch the relevant parts of the code.
26
+
27
+ # EXECUTION
28
+
29
+ If applicable, use RGR to complete the task.
30
+
31
+ 1. RED: write one test
32
+ 2. GREEN: write the implementation to pass that test
33
+ 3. REPEAT until done
34
+ 4. REFACTOR the code
35
+
36
+ # FEEDBACK LOOPS
37
+
38
+ Before committing, run `npm run typecheck` and `npm run test` to ensure the tests pass.
39
+
40
+ # COMMIT
41
+
42
+ Make a git commit. The commit message must:
43
+
44
+ 1. Start with `RALPH:` prefix
45
+ 2. Include task completed + PRD reference
46
+ 3. Key decisions made
47
+ 4. Files changed
48
+ 5. Blockers or notes for next iteration
49
+
50
+ Keep it concise.
51
+
52
+ # THE ISSUE
53
+
54
+ If the task is not complete, leave a comment on the GitHub issue with what was done.
55
+
56
+ Do not close the issue - this will be done later.
57
+
58
+ Once complete, output <promise>COMPLETE</promise>.
59
+
60
+ # FINAL RULES
61
+
62
+ ONLY WORK ON A SINGLE TASK.
@@ -0,0 +1,251 @@
1
+ // Parallel Planner with Review — four-phase orchestration loop
2
+ //
3
+ // This template drives a multi-phase workflow:
4
+ // Phase 1 (Plan): An opus agent analyzes open issues, builds a
5
+ // dependency graph, and outputs a <plan> JSON
6
+ // listing unblocked issues with branch names.
7
+ // Phase 2 (Execute + Review): For each issue, a sandbox is created via
8
+ // createSandbox(). The implementer runs first
9
+ // (100 iterations). If it produces commits, a
10
+ // reviewer runs in the same sandbox on the same
11
+ // branch (1 iteration). All issue pipelines run
12
+ // concurrently via Promise.allSettled().
13
+ // Phase 3 (Merge): A single agent merges all completed branches
14
+ // into the current branch.
15
+ //
16
+ // The outer loop repeats up to MAX_ITERATIONS times so that newly unblocked
17
+ // issues are picked up after each round of merges.
18
+ //
19
+ // Usage:
20
+ // npx tsx .sandcastle/main.mts
21
+ // Or add to package.json:
22
+ // "scripts": { "sandcastle": "npx tsx .sandcastle/main.mts" }
23
+
24
+ import * as sandcastle from "@ai-hero/sandcastle";
25
+ import { docker } from "@ai-hero/sandcastle/sandboxes/docker";
26
+
27
+ // ---------------------------------------------------------------------------
28
+ // Configuration
29
+ // ---------------------------------------------------------------------------
30
+
31
+ // Maximum number of plan→execute→merge cycles before stopping.
32
+ // Raise this if your backlog is large; lower it for a quick smoke-test run.
33
+ const MAX_ITERATIONS = 10;
34
+
35
+ // Hooks run inside the sandbox before the agent starts each iteration.
36
+ // npm install ensures the sandbox always has fresh dependencies.
37
+ const hooks = {
38
+ onSandboxReady: [{ command: "npm install" }],
39
+ };
40
+
41
+ // Copy node_modules from the host into the worktree before each sandbox
42
+ // starts. Avoids a full npm install from scratch; the hook above handles
43
+ // platform-specific binaries and any packages added since the last copy.
44
+ const copyToSandbox = ["node_modules"];
45
+
46
+ // Cap the number of concurrent sandboxes to avoid resource exhaustion.
47
+ const MAX_CONCURRENCY = 4;
48
+
49
+ // ---------------------------------------------------------------------------
50
+ // Main loop
51
+ // ---------------------------------------------------------------------------
52
+
53
+ for (let iteration = 1; iteration <= MAX_ITERATIONS; iteration++) {
54
+ console.log(`\n=== Iteration ${iteration}/${MAX_ITERATIONS} ===\n`);
55
+
56
+ // -------------------------------------------------------------------------
57
+ // Phase 1: Plan
58
+ //
59
+ // The planning agent (opus, for deeper reasoning) reads the open issue list,
60
+ // builds a dependency graph, and selects the issues that can be worked in
61
+ // parallel right now (i.e., no blocking dependencies on other open issues).
62
+ //
63
+ // It outputs a <plan> JSON block — we parse that to drive Phase 2.
64
+ // -------------------------------------------------------------------------
65
+ const plan = await sandcastle.run({
66
+ hooks,
67
+ copyToSandbox,
68
+ sandbox: docker(),
69
+ branchStrategy: { type: "merge-to-head" },
70
+ name: "planner",
71
+ // One iteration is enough: the planner just needs to read and reason,
72
+ // not write code.
73
+ maxIterations: 1,
74
+ // Opus for planning: dependency analysis benefits from deeper reasoning.
75
+ agent: sandcastle.claudeCode("claude-opus-4-6"),
76
+ promptFile: "./.sandcastle/plan-prompt.md",
77
+ });
78
+
79
+ // Extract the <plan>…</plan> block from the agent's stdout.
80
+ const planMatch = plan.stdout.match(/<plan>([\s\S]*?)<\/plan>/);
81
+ if (!planMatch) {
82
+ throw new Error(
83
+ "Planning agent did not produce a <plan> tag.\n\n" + plan.stdout,
84
+ );
85
+ }
86
+
87
+ // The plan JSON contains an array of issues, each with number, title, branch.
88
+ const { issues } = JSON.parse(planMatch[1]!) as {
89
+ issues: { number: number; title: string; branch: string }[];
90
+ };
91
+
92
+ if (issues.length === 0) {
93
+ // No unblocked work — either everything is done or everything is blocked.
94
+ console.log("No unblocked issues to work on. Exiting.");
95
+ break;
96
+ }
97
+
98
+ console.log(
99
+ `Planning complete. ${issues.length} issue(s) to work in parallel:`,
100
+ );
101
+ for (const issue of issues) {
102
+ console.log(` #${issue.number}: ${issue.title} → ${issue.branch}`);
103
+ }
104
+
105
+ // -------------------------------------------------------------------------
106
+ // Phase 2: Execute + Review
107
+ //
108
+ // For each issue, create a sandbox via createSandbox() so the implementer
109
+ // and reviewer share the same sandbox instance per branch. The implementer
110
+ // runs first; if it produces commits, the reviewer runs in the same sandbox.
111
+ //
112
+ // A semaphore limits concurrency to MAX_CONCURRENCY sandboxes at once.
113
+ // Promise.allSettled means one failing pipeline doesn't cancel the others.
114
+ // -------------------------------------------------------------------------
115
+
116
+ // Simple semaphore for concurrency limiting
117
+ let running = 0;
118
+ const waiting: Array<() => void> = [];
119
+ const acquire = (): Promise<void> => {
120
+ if (running < MAX_CONCURRENCY) {
121
+ running++;
122
+ return Promise.resolve();
123
+ }
124
+ return new Promise<void>((resolve) => {
125
+ waiting.push(() => {
126
+ running++;
127
+ resolve();
128
+ });
129
+ });
130
+ };
131
+ const release = () => {
132
+ running--;
133
+ const next = waiting.shift();
134
+ if (next) next();
135
+ };
136
+
137
+ const settled = await Promise.allSettled(
138
+ issues.map(async (issue) => {
139
+ await acquire();
140
+ try {
141
+ const sandbox = await sandcastle.createSandbox({
142
+ branch: issue.branch,
143
+ sandbox: docker(),
144
+ hooks,
145
+ copyToSandbox,
146
+ });
147
+
148
+ try {
149
+ // Run the implementer
150
+ const implement = await sandbox.run({
151
+ name: "implementer",
152
+ maxIterations: 100,
153
+ agent: sandcastle.claudeCode("claude-sonnet-4-6"),
154
+ promptFile: "./.sandcastle/implement-prompt.md",
155
+ promptArgs: {
156
+ ISSUE_NUMBER: String(issue.number),
157
+ ISSUE_TITLE: issue.title,
158
+ BRANCH: issue.branch,
159
+ },
160
+ });
161
+
162
+ // Only review if the implementer produced commits
163
+ if (implement.commits.length > 0) {
164
+ await sandbox.run({
165
+ name: "reviewer",
166
+ maxIterations: 1,
167
+ agent: sandcastle.claudeCode("claude-sonnet-4-6"),
168
+ promptFile: "./.sandcastle/review-prompt.md",
169
+ promptArgs: {
170
+ BRANCH: issue.branch,
171
+ },
172
+ });
173
+ }
174
+
175
+ return implement;
176
+ } finally {
177
+ await sandbox.close();
178
+ }
179
+ } finally {
180
+ release();
181
+ }
182
+ }),
183
+ );
184
+
185
+ // Log any agents that threw (network error, sandbox crash, etc.).
186
+ for (const [i, outcome] of settled.entries()) {
187
+ if (outcome.status === "rejected") {
188
+ console.error(
189
+ ` ✗ #${issues[i]!.number} (${issues[i]!.branch}) failed: ${outcome.reason}`,
190
+ );
191
+ }
192
+ }
193
+
194
+ // Only pass branches that actually produced commits to the merge phase.
195
+ // An agent that ran successfully but made no commits has nothing to merge.
196
+ const completedIssues = settled
197
+ .map((outcome, i) => ({ outcome, issue: issues[i]! }))
198
+ .filter(
199
+ (entry) =>
200
+ entry.outcome.status === "fulfilled" &&
201
+ entry.outcome.value.commits.length > 0,
202
+ )
203
+ .map((entry) => entry.issue);
204
+
205
+ const completedBranches = completedIssues.map((i) => i.branch);
206
+
207
+ console.log(
208
+ `\nExecution complete. ${completedBranches.length} branch(es) with commits:`,
209
+ );
210
+ for (const branch of completedBranches) {
211
+ console.log(` ${branch}`);
212
+ }
213
+
214
+ if (completedBranches.length === 0) {
215
+ // All agents ran but none made commits — nothing to merge this cycle.
216
+ console.log("No commits produced. Nothing to merge.");
217
+ continue;
218
+ }
219
+
220
+ // -------------------------------------------------------------------------
221
+ // Phase 3: Merge
222
+ //
223
+ // One agent merges all completed branches into the current branch,
224
+ // resolving any conflicts and running tests to confirm everything works.
225
+ //
226
+ // The {{BRANCHES}} and {{ISSUES}} prompt arguments are lists that the agent
227
+ // uses to know which branches to merge and which issues to close.
228
+ // -------------------------------------------------------------------------
229
+ await sandcastle.run({
230
+ hooks,
231
+ copyToSandbox,
232
+ sandbox: docker(),
233
+ branchStrategy: { type: "merge-to-head" },
234
+ name: "merger",
235
+ maxIterations: 1,
236
+ agent: sandcastle.claudeCode("claude-sonnet-4-6"),
237
+ promptFile: "./.sandcastle/merge-prompt.md",
238
+ promptArgs: {
239
+ // A markdown list of branch names, one per line.
240
+ BRANCHES: completedBranches.map((b) => `- ${b}`).join("\n"),
241
+ // A markdown list of issue numbers and titles, one per line.
242
+ ISSUES: completedIssues
243
+ .map((i) => `- #${i.number}: ${i.title}`)
244
+ .join("\n"),
245
+ },
246
+ });
247
+
248
+ console.log("\nBranches merged.");
249
+ }
250
+
251
+ console.log("\nAll done.");
@@ -0,0 +1,22 @@
1
+ # TASK
2
+
3
+ Merge the following branches into the current branch:
4
+
5
+ {{BRANCHES}}
6
+
7
+ For each branch:
8
+
9
+ 1. Run `git merge <branch> --no-edit`
10
+ 2. If there are merge conflicts, resolve them intelligently by reading both sides and choosing the correct resolution
11
+ 3. After resolving conflicts, run `npm run typecheck` and `npm run test` to verify everything works
12
+ 4. If tests fail, fix the issues before proceeding to the next branch
13
+
14
+ After all branches are merged, make a single commit summarizing the merge.
15
+
16
+ # CLOSE ISSUES
17
+
18
+ For each branch that was merged, close its issue. Here are all the issues:
19
+
20
+ {{ISSUES}}
21
+
22
+ Once you've merged everything you can, output <promise>COMPLETE</promise>.