@ai-hero/sandcastle 0.3.0 → 0.4.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 (56) hide show
  1. package/README.md +304 -37
  2. package/dist/AgentProvider.d.ts +0 -10
  3. package/dist/AgentProvider.d.ts.map +1 -1
  4. package/dist/AgentProvider.js +28 -45
  5. package/dist/AgentProvider.js.map +1 -1
  6. package/dist/DockerLifecycle.d.ts +5 -1
  7. package/dist/DockerLifecycle.d.ts.map +1 -1
  8. package/dist/DockerLifecycle.js +8 -1
  9. package/dist/DockerLifecycle.js.map +1 -1
  10. package/dist/InitService.d.ts.map +1 -1
  11. package/dist/InitService.js +2 -0
  12. package/dist/InitService.js.map +1 -1
  13. package/dist/Orchestrator.d.ts +0 -1
  14. package/dist/Orchestrator.d.ts.map +1 -1
  15. package/dist/Orchestrator.js +2 -13
  16. package/dist/Orchestrator.js.map +1 -1
  17. package/dist/SandboxFactory.d.ts +7 -7
  18. package/dist/SandboxFactory.d.ts.map +1 -1
  19. package/dist/SandboxFactory.js +39 -35
  20. package/dist/SandboxFactory.js.map +1 -1
  21. package/dist/SandboxProvider.d.ts +27 -0
  22. package/dist/SandboxProvider.d.ts.map +1 -1
  23. package/dist/SandboxProvider.js +2 -0
  24. package/dist/SandboxProvider.js.map +1 -1
  25. package/dist/cli.js +2 -2
  26. package/dist/cli.js.map +1 -1
  27. package/dist/index.d.ts +2 -2
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js.map +1 -1
  30. package/dist/run.d.ts +0 -16
  31. package/dist/run.d.ts.map +1 -1
  32. package/dist/run.js +18 -20
  33. package/dist/run.js.map +1 -1
  34. package/dist/sandboxes/docker.d.ts +3 -1
  35. package/dist/sandboxes/docker.d.ts.map +1 -1
  36. package/dist/sandboxes/docker.js +1 -0
  37. package/dist/sandboxes/docker.js.map +1 -1
  38. package/dist/sandboxes/test-isolated.d.ts +6 -2
  39. package/dist/sandboxes/test-isolated.d.ts.map +1 -1
  40. package/dist/sandboxes/test-isolated.js +2 -1
  41. package/dist/sandboxes/test-isolated.js.map +1 -1
  42. package/dist/syncIn.d.ts +4 -2
  43. package/dist/syncIn.d.ts.map +1 -1
  44. package/dist/syncIn.js +72 -22
  45. package/dist/syncIn.js.map +1 -1
  46. package/dist/syncOut.d.ts +3 -1
  47. package/dist/syncOut.d.ts.map +1 -1
  48. package/dist/syncOut.js +155 -76
  49. package/dist/syncOut.js.map +1 -1
  50. package/dist/templates/blank/.env.example +1 -0
  51. package/dist/templates/parallel-planner/.env.example +1 -0
  52. package/dist/templates/parallel-planner/main.mts +2 -3
  53. package/dist/templates/sequential-reviewer/.env.example +1 -0
  54. package/dist/templates/sequential-reviewer/main.mts +1 -2
  55. package/dist/templates/simple-loop/.env.example +1 -0
  56. package/package.json +1 -1
package/dist/syncOut.js CHANGED
@@ -16,40 +16,92 @@
16
16
  import { existsSync } from "node:fs";
17
17
  import { mkdir, readdir, readFile, rm, stat, writeFile, } from "node:fs/promises";
18
18
  import { basename, dirname, join } from "node:path";
19
+ import { Effect } from "effect";
19
20
  import { buildRecoveryMessage } from "./RecoveryMessage.js";
20
- import { execHost, execOk } from "./sandboxExec.js";
21
+ import { SyncError } from "./errors.js";
22
+ /**
23
+ * Execute a command on the host side, returning stdout.
24
+ * Fails with SyncError on non-zero exit.
25
+ */
26
+ const execHost = (command, cwd) => Effect.tryPromise({
27
+ try: async () => {
28
+ const { exec } = await import("node:child_process");
29
+ const { promisify } = await import("node:util");
30
+ const execAsync = promisify(exec);
31
+ const { stdout } = await execAsync(command, {
32
+ cwd,
33
+ maxBuffer: 10 * 1024 * 1024,
34
+ });
35
+ return stdout;
36
+ },
37
+ catch: (e) => new SyncError({
38
+ message: `Host command failed: ${command}\n${e instanceof Error ? e.message : String(e)}`,
39
+ }),
40
+ });
41
+ /**
42
+ * Execute a command in the sandbox, failing with SyncError if it exits non-zero.
43
+ */
44
+ const execOk = (handle, command, options) => Effect.tryPromise({
45
+ try: () => handle.exec(command, options),
46
+ catch: (e) => new SyncError({
47
+ message: `Sandbox exec failed: ${command}\n${e instanceof Error ? e.message : String(e)}`,
48
+ }),
49
+ }).pipe(Effect.flatMap((result) => result.exitCode !== 0
50
+ ? Effect.fail(new SyncError({
51
+ message: `Sandbox command failed (exit ${result.exitCode}): ${command}\n${result.stderr}`,
52
+ }))
53
+ : Effect.succeed(result)));
54
+ /**
55
+ * Execute a command in the sandbox, returning the result without failing on non-zero exit.
56
+ */
57
+ const execSandbox = (handle, command, options) => Effect.tryPromise({
58
+ try: () => handle.exec(command, options),
59
+ catch: (e) => new SyncError({
60
+ message: `Sandbox exec failed: ${command}\n${e instanceof Error ? e.message : String(e)}`,
61
+ }),
62
+ });
21
63
  /**
22
64
  * Check if a patch file is empty or header-only.
23
65
  * Merge commits produce patches with headers but no diff content.
24
66
  * A patch is considered empty if it has no lines starting with "diff --git".
25
67
  */
26
- const isEmptyPatch = async (patchPath) => {
27
- const info = await stat(patchPath);
28
- if (info.size === 0)
29
- return true;
30
- const content = await readFile(patchPath, "utf-8");
31
- return !content.includes("diff --git");
32
- };
68
+ const isEmptyPatch = (patchPath) => Effect.tryPromise({
69
+ try: async () => {
70
+ const info = await stat(patchPath);
71
+ if (info.size === 0)
72
+ return true;
73
+ const content = await readFile(patchPath, "utf-8");
74
+ return !content.includes("diff --git");
75
+ },
76
+ catch: (e) => new SyncError({
77
+ message: `Failed to check patch ${patchPath}: ${e instanceof Error ? e.message : String(e)}`,
78
+ }),
79
+ });
33
80
  /**
34
81
  * Generate a YYYYMMDD-HHMMSS timestamp directory name.
35
82
  * Appends a counter suffix (-1, -2, ...) if the directory already exists.
36
83
  */
37
- const createPatchDir = async (hostRepoDir) => {
38
- const now = new Date();
39
- const pad = (n) => String(n).padStart(2, "0");
40
- const base = `${now.getFullYear()}${pad(now.getMonth() + 1)}${pad(now.getDate())}-${pad(now.getHours())}${pad(now.getMinutes())}${pad(now.getSeconds())}`;
41
- const patchesRoot = join(hostRepoDir, ".sandcastle", "patches");
42
- await mkdir(patchesRoot, { recursive: true });
43
- let dirName = base;
44
- let counter = 0;
45
- while (existsSync(join(patchesRoot, dirName))) {
46
- counter++;
47
- dirName = `${base}-${counter}`;
48
- }
49
- const patchDir = join(patchesRoot, dirName);
50
- await mkdir(patchDir, { recursive: true });
51
- return patchDir;
52
- };
84
+ const createPatchDir = (hostRepoDir) => Effect.tryPromise({
85
+ try: async () => {
86
+ const now = new Date();
87
+ const pad = (n) => String(n).padStart(2, "0");
88
+ const base = `${now.getFullYear()}${pad(now.getMonth() + 1)}${pad(now.getDate())}-${pad(now.getHours())}${pad(now.getMinutes())}${pad(now.getSeconds())}`;
89
+ const patchesRoot = join(hostRepoDir, ".sandcastle", "patches");
90
+ await mkdir(patchesRoot, { recursive: true });
91
+ let dirName = base;
92
+ let counter = 0;
93
+ while (existsSync(join(patchesRoot, dirName))) {
94
+ counter++;
95
+ dirName = `${base}-${counter}`;
96
+ }
97
+ const patchDir = join(patchesRoot, dirName);
98
+ await mkdir(patchDir, { recursive: true });
99
+ return patchDir;
100
+ },
101
+ catch: (e) => new SyncError({
102
+ message: `Failed to create patch directory: ${e instanceof Error ? e.message : String(e)}`,
103
+ }),
104
+ });
53
105
  /**
54
106
  * Sync changes from an isolated sandbox back to the host repo.
55
107
  *
@@ -57,16 +109,20 @@ const createPatchDir = async (hostRepoDir) => {
57
109
  * 1. Save all artifacts to `.sandcastle/patches/<timestamp>/`
58
110
  * 2. Apply from saved directory; on failure, preserve artifacts and print recovery
59
111
  */
60
- export const syncOut = async (hostRepoDir, handle) => {
112
+ export const syncOut = (hostRepoDir, handle) => Effect.gen(function* () {
61
113
  const workspacePath = handle.workspacePath;
62
- const hostHead = (await execHost("git rev-parse HEAD", hostRepoDir)).trim();
63
- const sandboxHead = (await execOk(handle, "git rev-parse HEAD", { cwd: workspacePath })).stdout.trim();
114
+ const hostHead = (yield* execHost("git rev-parse HEAD", hostRepoDir)).trim();
115
+ const sandboxHead = (yield* execOk(handle, "git rev-parse HEAD", {
116
+ cwd: workspacePath,
117
+ })).stdout.trim();
64
118
  const hasCommits = hostHead !== sandboxHead;
65
119
  // Check for uncommitted changes
66
- const diffResult = await handle.exec("git diff HEAD", { cwd: workspacePath });
120
+ const diffResult = yield* execSandbox(handle, "git diff HEAD", {
121
+ cwd: workspacePath,
122
+ });
67
123
  const hasDiff = diffResult.exitCode === 0 && diffResult.stdout.trim().length > 0;
68
124
  // Check for untracked files
69
- const lsFilesResult = await handle.exec("git ls-files --others --exclude-standard", { cwd: workspacePath });
125
+ const lsFilesResult = yield* execSandbox(handle, "git ls-files --others --exclude-standard", { cwd: workspacePath });
70
126
  const hasUntracked = lsFilesResult.exitCode === 0 && lsFilesResult.stdout.trim().length > 0;
71
127
  const untrackedFiles = hasUntracked
72
128
  ? lsFilesResult.stdout
@@ -79,16 +135,16 @@ export const syncOut = async (hostRepoDir, handle) => {
79
135
  return;
80
136
  }
81
137
  // --- Phase 1: Save all artifacts ---
82
- const patchDir = await createPatchDir(hostRepoDir);
138
+ const patchDir = yield* createPatchDir(hostRepoDir);
83
139
  const relativePatchDir = join(".sandcastle", "patches", basename(patchDir));
84
140
  const nonEmptyPatches = [];
85
141
  // Save committed patches
86
142
  if (hasCommits) {
87
- const mkTempResult = await execOk(handle, "mktemp -d -t sandcastle-patches-XXXXXX");
143
+ const mkTempResult = yield* execOk(handle, "mktemp -d -t sandcastle-patches-XXXXXX");
88
144
  const sandboxPatchDir = mkTempResult.stdout.trim();
89
145
  try {
90
- await execOk(handle, `git format-patch "${hostHead}..HEAD" -o "${sandboxPatchDir}"`, { cwd: workspacePath });
91
- const lsResult = await execOk(handle, `ls -1 "${sandboxPatchDir}"`);
146
+ yield* execOk(handle, `git format-patch "${hostHead}..HEAD" -o "${sandboxPatchDir}"`, { cwd: workspacePath });
147
+ const lsResult = yield* execOk(handle, `ls -1 "${sandboxPatchDir}"`);
92
148
  const patchNames = lsResult.stdout
93
149
  .trim()
94
150
  .split("\n")
@@ -96,20 +152,30 @@ export const syncOut = async (hostRepoDir, handle) => {
96
152
  for (const patchName of patchNames) {
97
153
  const sandboxPatchPath = `${sandboxPatchDir}/${patchName}`;
98
154
  const hostPatchPath = join(patchDir, patchName);
99
- await handle.copyOut(sandboxPatchPath, hostPatchPath);
100
- if (!(await isEmptyPatch(hostPatchPath))) {
155
+ yield* Effect.tryPromise({
156
+ try: () => handle.copyOut(sandboxPatchPath, hostPatchPath),
157
+ catch: (e) => new SyncError({
158
+ message: `Failed to copy patch ${patchName}: ${e instanceof Error ? e.message : String(e)}`,
159
+ }),
160
+ });
161
+ if (!(yield* isEmptyPatch(hostPatchPath))) {
101
162
  nonEmptyPatches.push(hostPatchPath);
102
163
  }
103
164
  }
104
165
  }
105
166
  finally {
106
- await handle.exec(`rm -rf "${sandboxPatchDir}"`);
167
+ yield* execSandbox(handle, `rm -rf "${sandboxPatchDir}"`);
107
168
  }
108
169
  }
109
170
  // Save uncommitted diff
110
171
  if (hasDiff) {
111
172
  const diffPath = join(patchDir, "changes.patch");
112
- await writeFile(diffPath, diffResult.stdout);
173
+ yield* Effect.tryPromise({
174
+ try: () => writeFile(diffPath, diffResult.stdout),
175
+ catch: (e) => new SyncError({
176
+ message: `Failed to write diff patch: ${e instanceof Error ? e.message : String(e)}`,
177
+ }),
178
+ });
113
179
  }
114
180
  // Save untracked files
115
181
  if (hasUntracked) {
@@ -117,46 +183,55 @@ export const syncOut = async (hostRepoDir, handle) => {
117
183
  for (const relPath of untrackedFiles) {
118
184
  const sandboxFilePath = `${workspacePath}/${relPath}`;
119
185
  const hostFilePath = join(untrackedDir, relPath);
120
- await mkdir(dirname(hostFilePath), { recursive: true });
121
- await handle.copyOut(sandboxFilePath, hostFilePath);
186
+ yield* Effect.tryPromise({
187
+ try: async () => {
188
+ await mkdir(dirname(hostFilePath), { recursive: true });
189
+ await handle.copyOut(sandboxFilePath, hostFilePath);
190
+ },
191
+ catch: (e) => new SyncError({
192
+ message: `Failed to save untracked file ${relPath}: ${e instanceof Error ? e.message : String(e)}`,
193
+ }),
194
+ });
122
195
  }
123
196
  }
124
197
  // --- Phase 2: Apply from saved directory ---
125
198
  let failedStep;
126
199
  // Apply committed patches
127
200
  if (nonEmptyPatches.length > 0) {
128
- try {
129
- await execHost("git am --abort", hostRepoDir).catch(() => { });
130
- const patchArgs = nonEmptyPatches.map((p) => `"${p}"`).join(" ");
131
- await execHost(`git am --3way ${patchArgs}`, hostRepoDir);
132
- }
133
- catch {
201
+ const abortResult = yield* Effect.either(execHost("git am --abort", hostRepoDir));
202
+ void abortResult; // ignore abort failures
203
+ const patchArgs = nonEmptyPatches.map((p) => `"${p}"`).join(" ");
204
+ const applyResult = yield* Effect.either(execHost(`git am --3way ${patchArgs}`, hostRepoDir));
205
+ if (applyResult._tag === "Left") {
134
206
  failedStep = "commits";
135
207
  }
136
208
  }
137
209
  // Apply uncommitted diff
138
210
  if (!failedStep && hasDiff) {
139
211
  const diffPath = join(patchDir, "changes.patch");
140
- try {
141
- await execHost(`git apply "${diffPath}"`, hostRepoDir);
142
- }
143
- catch {
212
+ const applyResult = yield* Effect.either(execHost(`git apply "${diffPath}"`, hostRepoDir));
213
+ if (applyResult._tag === "Left") {
144
214
  failedStep = "diff";
145
215
  }
146
216
  }
147
217
  // Copy untracked files
148
218
  if (!failedStep && hasUntracked) {
149
- try {
150
- const untrackedDir = join(patchDir, "untracked");
151
- for (const relPath of untrackedFiles) {
152
- const srcPath = join(untrackedDir, relPath);
153
- const destPath = join(hostRepoDir, relPath);
154
- await mkdir(dirname(destPath), { recursive: true });
155
- const content = await readFile(srcPath);
156
- await writeFile(destPath, content);
157
- }
158
- }
159
- catch {
219
+ const copyResult = yield* Effect.either(Effect.tryPromise({
220
+ try: async () => {
221
+ const untrackedDir = join(patchDir, "untracked");
222
+ for (const relPath of untrackedFiles) {
223
+ const srcPath = join(untrackedDir, relPath);
224
+ const destPath = join(hostRepoDir, relPath);
225
+ await mkdir(dirname(destPath), { recursive: true });
226
+ const content = await readFile(srcPath);
227
+ await writeFile(destPath, content);
228
+ }
229
+ },
230
+ catch: (e) => new SyncError({
231
+ message: `Failed to copy untracked files: ${e instanceof Error ? e.message : String(e)}`,
232
+ }),
233
+ }));
234
+ if (copyResult._tag === "Left") {
160
235
  failedStep = "untracked";
161
236
  }
162
237
  }
@@ -172,21 +247,25 @@ export const syncOut = async (hostRepoDir, handle) => {
172
247
  console.error(`\n${msg}`);
173
248
  }
174
249
  else {
175
- await rm(patchDir, { recursive: true, force: true });
176
- // Clean up empty parent dirs
177
- const patchesRoot = join(hostRepoDir, ".sandcastle", "patches");
178
- try {
179
- const remaining = await readdir(patchesRoot);
180
- if (remaining.length === 0) {
181
- await rm(join(hostRepoDir, ".sandcastle"), {
182
- recursive: true,
183
- force: true,
184
- });
185
- }
186
- }
187
- catch {
188
- // ignore
189
- }
250
+ yield* Effect.tryPromise({
251
+ try: async () => {
252
+ await rm(patchDir, { recursive: true, force: true });
253
+ const patchesRoot = join(hostRepoDir, ".sandcastle", "patches");
254
+ try {
255
+ const remaining = await readdir(patchesRoot);
256
+ if (remaining.length === 0) {
257
+ await rm(join(hostRepoDir, ".sandcastle"), {
258
+ recursive: true,
259
+ force: true,
260
+ });
261
+ }
262
+ }
263
+ catch {
264
+ // ignore
265
+ }
266
+ },
267
+ catch: () => new SyncError({ message: "Failed to clean up patch directory" }),
268
+ });
190
269
  }
191
- };
270
+ });
192
271
  //# sourceMappingURL=syncOut.js.map
@@ -1 +1 @@
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;AAEpD,OAAO,EAAE,oBAAoB,EAAmB,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;;;GAIG;AACH,MAAM,YAAY,GAAG,KAAK,EAAE,SAAiB,EAAoB,EAAE;IACjE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC;IACnC,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEjC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACnD,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;AACzC,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,cAAc,GAAG,KAAK,EAAE,WAAmB,EAAmB,EAAE;IACpE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtD,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;IAE1J,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;IAChE,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9C,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,OAAO,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;QAC9C,OAAO,EAAE,CAAC;QACV,OAAO,GAAG,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC;IACjC,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC5C,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAC1B,WAAmB,EACnB,MAA6B,EACd,EAAE;IACjB,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;IAE3C,MAAM,QAAQ,GAAG,CAAC,MAAM,QAAQ,CAAC,oBAAoB,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5E,MAAM,WAAW,GAAG,CAClB,MAAM,MAAM,CAAC,MAAM,EAAE,oBAAoB,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,CACnE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAEhB,MAAM,UAAU,GAAG,QAAQ,KAAK,WAAW,CAAC;IAE5C,gCAAgC;IAChC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,CAAC;IAC9E,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,MAAM,MAAM,CAAC,IAAI,CACrC,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,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;IACnD,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,MAAM,MAAM,CAC/B,MAAM,EACN,wCAAwC,CACzC,CAAC;QACF,MAAM,eAAe,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAEnD,IAAI,CAAC;YACH,MAAM,MAAM,CACV,MAAM,EACN,qBAAqB,QAAQ,eAAe,eAAe,GAAG,EAC9D,EAAE,GAAG,EAAE,aAAa,EAAE,CACvB,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,UAAU,eAAe,GAAG,CAAC,CAAC;YACpE,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,MAAM,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;gBAEtD,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;oBACzC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,eAAe,GAAG,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QACjD,MAAM,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAC/C,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,MAAM,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxD,MAAM,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,IAAI,UAAkC,CAAC;IAEvC,0BAA0B;IAC1B,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC9D,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjE,MAAM,QAAQ,CAAC,iBAAiB,SAAS,EAAE,EAAE,WAAW,CAAC,CAAC;QAC5D,CAAC;QAAC,MAAM,CAAC;YACP,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,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,cAAc,QAAQ,GAAG,EAAE,WAAW,CAAC,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,UAAU,GAAG,MAAM,CAAC;QACtB,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,IAAI,CAAC,UAAU,IAAI,YAAY,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YACjD,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;gBACrC,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;gBAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;gBAC5C,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACpD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACxC,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,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,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,6BAA6B;QAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;QAChE,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;YAC7C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,MAAM,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,EAAE;oBACzC,SAAS,EAAE,IAAI;oBACf,KAAK,EAAE,IAAI;iBACZ,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;AACH,CAAC,CAAC"}
1
+ {"version":3,"file":"syncOut.js","sourceRoot":"","sources":["../src/syncOut.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
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
2
3
  ANTHROPIC_API_KEY=
3
4
  # GitHub personal access token
4
5
  GH_TOKEN=
@@ -1,4 +1,5 @@
1
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
2
3
  ANTHROPIC_API_KEY=
3
4
  # GitHub personal access token
4
5
  GH_TOKEN=
@@ -107,7 +107,8 @@ for (let iteration = 1; iteration <= MAX_ITERATIONS; iteration++) {
107
107
  sandcastle.run({
108
108
  hooks,
109
109
  copyToSandbox,
110
- sandbox: docker(),
110
+ // Each agent starts on its own branch via the provider's branchStrategy.
111
+ sandbox: docker({ branchStrategy: { type: "branch", branch: issue.branch } }),
111
112
  name: "implementer",
112
113
  // Give each agent plenty of room to implement and iterate on tests.
113
114
  maxIterations: 100,
@@ -122,8 +123,6 @@ for (let iteration = 1; iteration <= MAX_ITERATIONS; iteration++) {
122
123
  ISSUE_TITLE: issue.title,
123
124
  BRANCH: issue.branch,
124
125
  },
125
- // Each agent starts on its own branch.
126
- worktree: { mode: "branch", branch: issue.branch },
127
126
  }),
128
127
  ),
129
128
  );
@@ -1,4 +1,5 @@
1
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
2
3
  ANTHROPIC_API_KEY=
3
4
  # GitHub personal access token
4
5
  GH_TOKEN=
@@ -86,7 +86,7 @@ for (let iteration = 1; iteration <= MAX_ITERATIONS; iteration++) {
86
86
  await sandcastle.run({
87
87
  hooks,
88
88
  copyToSandbox,
89
- sandbox: docker(),
89
+ sandbox: docker({ branchStrategy: { type: "branch", branch } }),
90
90
  name: "reviewer",
91
91
  maxIterations: 10,
92
92
  agent: sandcastle.claudeCode("claude-sonnet-4-6"),
@@ -96,7 +96,6 @@ for (let iteration = 1; iteration <= MAX_ITERATIONS; iteration++) {
96
96
  promptArgs: {
97
97
  BRANCH: branch,
98
98
  },
99
- worktree: { mode: "branch", branch },
100
99
  });
101
100
 
102
101
  console.log("\nReview complete.");
@@ -1,4 +1,5 @@
1
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
2
3
  ANTHROPIC_API_KEY=
3
4
  # GitHub personal access token
4
5
  GH_TOKEN=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-hero/sandcastle",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "CLI for orchestrating AI agents in isolated sandbox environments",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",