@ai-hero/sandcastle 0.5.8 → 0.5.11
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.
- package/README.md +72 -29
- package/dist/AgentProvider.d.ts +3 -1
- package/dist/AgentProvider.d.ts.map +1 -1
- package/dist/AgentProvider.js +5 -2
- package/dist/AgentProvider.js.map +1 -1
- package/dist/DockerLifecycle.d.ts +16 -1
- package/dist/DockerLifecycle.d.ts.map +1 -1
- package/dist/DockerLifecycle.js +12 -2
- package/dist/DockerLifecycle.js.map +1 -1
- package/dist/EnvResolver.d.ts.map +1 -1
- package/dist/EnvResolver.js +18 -3
- package/dist/EnvResolver.js.map +1 -1
- package/dist/InitService.d.ts.map +1 -1
- package/dist/InitService.js +38 -22
- package/dist/InitService.js.map +1 -1
- package/dist/Output.d.ts +80 -0
- package/dist/Output.d.ts.map +1 -0
- package/dist/Output.js +68 -0
- package/dist/Output.js.map +1 -0
- package/dist/SandboxFactory.d.ts.map +1 -1
- package/dist/SandboxFactory.js +51 -0
- package/dist/SandboxFactory.js.map +1 -1
- package/dist/SandboxProvider.d.ts +7 -9
- package/dist/SandboxProvider.d.ts.map +1 -1
- package/dist/SandboxProvider.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +16 -1
- package/dist/cli.js.map +1 -1
- package/dist/createSandbox.d.ts +2 -2
- package/dist/createSandbox.d.ts.map +1 -1
- package/dist/createSandbox.js +29 -2
- package/dist/createSandbox.js.map +1 -1
- package/dist/createWorktree.d.ts +2 -2
- package/dist/createWorktree.d.ts.map +1 -1
- package/dist/createWorktree.js +10 -0
- package/dist/createWorktree.js.map +1 -1
- package/dist/extractStructuredOutput.d.ts +21 -0
- package/dist/extractStructuredOutput.d.ts.map +1 -0
- package/dist/extractStructuredOutput.js +97 -0
- package/dist/extractStructuredOutput.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/interactive.d.ts +1 -1
- package/dist/mountUtils.d.ts +42 -0
- package/dist/mountUtils.d.ts.map +1 -1
- package/dist/mountUtils.js +58 -2
- package/dist/mountUtils.js.map +1 -1
- package/dist/run.d.ts +31 -2
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +27 -3
- package/dist/run.js.map +1 -1
- package/dist/sandboxes/docker.d.ts +23 -1
- package/dist/sandboxes/docker.d.ts.map +1 -1
- package/dist/sandboxes/docker.js +72 -10
- package/dist/sandboxes/docker.js.map +1 -1
- package/dist/sandboxes/no-sandbox.d.ts +4 -3
- package/dist/sandboxes/no-sandbox.d.ts.map +1 -1
- package/dist/sandboxes/no-sandbox.js +4 -3
- package/dist/sandboxes/no-sandbox.js.map +1 -1
- package/dist/sandboxes/podman.d.ts +3 -2
- package/dist/sandboxes/podman.d.ts.map +1 -1
- package/dist/sandboxes/podman.js +29 -9
- package/dist/sandboxes/podman.js.map +1 -1
- package/dist/sandboxes/vercel.d.ts +1 -1
- package/dist/sandboxes/vercel.js +1 -1
- package/dist/startSandbox.d.ts +13 -3
- package/dist/startSandbox.d.ts.map +1 -1
- package/dist/startSandbox.js +16 -0
- package/dist/startSandbox.js.map +1 -1
- package/dist/templates/blank/main.mts +1 -1
- package/dist/templates/parallel-planner/main.mts +1 -1
- package/dist/templates/parallel-planner-with-review/main.mts +1 -1
- package/dist/templates/sequential-reviewer/implement-prompt.md +1 -1
- package/dist/templates/sequential-reviewer/main.mts +54 -49
- package/dist/templates/simple-loop/main.mts +2 -2
- package/dist/templates/simple-loop/prompt.md +1 -1
- package/dist/templates/simple-loop/template.json +1 -1
- package/package.json +3 -2
package/dist/sandboxes/podman.js
CHANGED
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Usage:
|
|
5
5
|
* import { podman } from "sandcastle/sandboxes/podman";
|
|
6
|
-
* await run({ agent: claudeCode("claude-opus-4-
|
|
6
|
+
* await run({ agent: claudeCode("claude-opus-4-7"), sandbox: podman() });
|
|
7
7
|
*/
|
|
8
8
|
import { execFile, execFileSync, spawn, } from "node:child_process";
|
|
9
9
|
import { randomUUID } from "node:crypto";
|
|
10
10
|
import { createInterface } from "node:readline";
|
|
11
11
|
import { createBindMountSandboxProvider, } from "../SandboxProvider.js";
|
|
12
|
-
import { defaultImageName, resolveUserMounts } from "../mountUtils.js";
|
|
12
|
+
import { defaultImageName, resolveUserMounts, formatVolumeMount, processFileMountParents, } from "../mountUtils.js";
|
|
13
13
|
/**
|
|
14
14
|
* Create a Podman sandbox provider.
|
|
15
15
|
*
|
|
@@ -28,6 +28,9 @@ export const podman = (options) => {
|
|
|
28
28
|
const userMounts = options?.mounts
|
|
29
29
|
? resolveUserMounts(options.mounts, sandboxHomedir)
|
|
30
30
|
: [];
|
|
31
|
+
// Validate file mounts and collect parent dirs to create at container start.
|
|
32
|
+
// Throws at construction time if any file mount parent is outside sandboxHomedir.
|
|
33
|
+
const parentDirsToCreate = processFileMountParents(userMounts, sandboxHomedir);
|
|
31
34
|
return createBindMountSandboxProvider({
|
|
32
35
|
name: "podman",
|
|
33
36
|
env: options?.env,
|
|
@@ -89,6 +92,30 @@ export const podman = (options) => {
|
|
|
89
92
|
}
|
|
90
93
|
});
|
|
91
94
|
});
|
|
95
|
+
// Create parent directories for file mounts and chown to the container user
|
|
96
|
+
for (const dir of parentDirsToCreate) {
|
|
97
|
+
await new Promise((resolve, reject) => {
|
|
98
|
+
execFile("podman", [
|
|
99
|
+
"exec",
|
|
100
|
+
"--user",
|
|
101
|
+
"0:0",
|
|
102
|
+
containerName,
|
|
103
|
+
"sh",
|
|
104
|
+
"-c",
|
|
105
|
+
`mkdir -p "$1" && chown "$2" "$1"`,
|
|
106
|
+
"sh",
|
|
107
|
+
dir,
|
|
108
|
+
`${containerUid}:${containerGid}`,
|
|
109
|
+
], (error) => {
|
|
110
|
+
if (error) {
|
|
111
|
+
reject(new Error(`Failed to create parent directory '${dir}' in container: ${error.message}`));
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
resolve();
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
}
|
|
92
119
|
// Set up signal handlers for cleanup
|
|
93
120
|
const onExit = () => {
|
|
94
121
|
try {
|
|
@@ -258,11 +285,4 @@ const checkPodmanMachine = () => new Promise((resolve, reject) => {
|
|
|
258
285
|
}
|
|
259
286
|
});
|
|
260
287
|
});
|
|
261
|
-
const formatVolumeMount = (mount, selinuxLabel) => {
|
|
262
|
-
const base = `${mount.hostPath}:${mount.sandboxPath}`;
|
|
263
|
-
const options = [mount.readonly ? "ro" : undefined, selinuxLabel || undefined]
|
|
264
|
-
.filter((option) => option !== undefined)
|
|
265
|
-
.join(",");
|
|
266
|
-
return options ? `${base}:${options}` : base;
|
|
267
|
-
};
|
|
268
288
|
//# sourceMappingURL=podman.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"podman.js","sourceRoot":"","sources":["../../src/sandboxes/podman.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,KAAK,GAEN,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EACL,8BAA8B,GAM/B,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"podman.js","sourceRoot":"","sources":["../../src/sandboxes/podman.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Usage:
|
|
5
5
|
* import { vercel } from "sandcastle/sandboxes/vercel";
|
|
6
|
-
* await run({ agent: claudeCode("claude-opus-4-
|
|
6
|
+
* await run({ agent: claudeCode("claude-opus-4-7"), sandbox: vercel() });
|
|
7
7
|
*/
|
|
8
8
|
import { type IsolatedSandboxProvider } from "../SandboxProvider.js";
|
|
9
9
|
/**
|
package/dist/sandboxes/vercel.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Usage:
|
|
5
5
|
* import { vercel } from "sandcastle/sandboxes/vercel";
|
|
6
|
-
* await run({ agent: claudeCode("claude-opus-4-
|
|
6
|
+
* await run({ agent: claudeCode("claude-opus-4-7"), sandbox: vercel() });
|
|
7
7
|
*/
|
|
8
8
|
import { execSync } from "node:child_process";
|
|
9
9
|
import { readFile, unlink, writeFile, mkdir, stat } from "node:fs/promises";
|
package/dist/startSandbox.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Effect, Layer } from "effect";
|
|
2
2
|
import { ContainerStartTimeoutError, CopyToWorktreeTimeoutError, SyncError, SyncInTimeoutError, WorktreeError, type DockerError } from "./errors.js";
|
|
3
|
-
import type { BindMountSandboxProvider, BindMountSandboxHandle, IsolatedSandboxProvider, IsolatedSandboxHandle } from "./SandboxProvider.js";
|
|
3
|
+
import type { BindMountSandboxProvider, BindMountSandboxHandle, IsolatedSandboxProvider, IsolatedSandboxHandle, NoSandboxProvider, NoSandboxHandle } from "./SandboxProvider.js";
|
|
4
4
|
import { type Sandbox, type MountEntry } from "./SandboxFactory.js";
|
|
5
5
|
export interface StartSandboxBindMountOptions {
|
|
6
6
|
provider: BindMountSandboxProvider;
|
|
@@ -20,9 +20,19 @@ export interface StartSandboxIsolatedOptions {
|
|
|
20
20
|
repoDir?: undefined;
|
|
21
21
|
copyPaths?: string[];
|
|
22
22
|
}
|
|
23
|
-
export
|
|
23
|
+
export interface StartSandboxNoSandboxOptions {
|
|
24
|
+
provider: NoSandboxProvider;
|
|
25
|
+
hostRepoDir: string;
|
|
26
|
+
env: Record<string, string>;
|
|
27
|
+
/** Host-side worktree path the agent will run in. Equal to hostRepoDir in head mode. */
|
|
28
|
+
worktreeOrRepoPath: string;
|
|
29
|
+
gitMounts?: undefined;
|
|
30
|
+
repoDir?: undefined;
|
|
31
|
+
copyPaths?: undefined;
|
|
32
|
+
}
|
|
33
|
+
export type StartSandboxOptions = StartSandboxBindMountOptions | StartSandboxIsolatedOptions | StartSandboxNoSandboxOptions;
|
|
24
34
|
export interface StartSandboxResult {
|
|
25
|
-
handle: BindMountSandboxHandle | IsolatedSandboxHandle;
|
|
35
|
+
handle: BindMountSandboxHandle | IsolatedSandboxHandle | NoSandboxHandle;
|
|
26
36
|
sandboxLayer: Layer.Layer<Sandbox>;
|
|
27
37
|
worktreePath: string;
|
|
28
38
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startSandbox.d.ts","sourceRoot":"","sources":["../src/startSandbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAGvC,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,EAC1B,SAAS,EACT,kBAAkB,EAClB,aAAa,EAEb,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAEV,wBAAwB,EACxB,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,
|
|
1
|
+
{"version":3,"file":"startSandbox.d.ts","sourceRoot":"","sources":["../src/startSandbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAGvC,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,EAC1B,SAAS,EACT,kBAAkB,EAClB,aAAa,EAEb,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAEV,wBAAwB,EACxB,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,UAAU,EAGhB,MAAM,qBAAqB,CAAC;AAI7B,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,wBAAwB,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,UAAU,EAAE,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,uBAAuB,CAAC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,kBAAkB,CAAC,EAAE,SAAS,CAAC;IAC/B,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,wFAAwF;IACxF,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,MAAM,mBAAmB,GAC3B,4BAA4B,GAC5B,2BAA2B,GAC3B,4BAA4B,CAAC;AAEjC,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,sBAAsB,GAAG,qBAAqB,GAAG,eAAe,CAAC;IACzE,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnC,YAAY,EAAE,MAAM,CAAC;CACtB;AAID,eAAO,MAAM,qBAAqB,SAAU,CAAC;AAE7C;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,oMAkBxB,CAAC"}
|
package/dist/startSandbox.js
CHANGED
|
@@ -21,8 +21,24 @@ export const startSandbox = (options) => {
|
|
|
21
21
|
if (options.provider.tag === "bind-mount") {
|
|
22
22
|
return startBindMountSandbox(options);
|
|
23
23
|
}
|
|
24
|
+
if (options.provider.tag === "none") {
|
|
25
|
+
return startNoSandbox(options);
|
|
26
|
+
}
|
|
24
27
|
return startIsolatedSandbox(options);
|
|
25
28
|
};
|
|
29
|
+
const startNoSandbox = (options) => Effect.tryPromise({
|
|
30
|
+
try: () => options.provider.create({
|
|
31
|
+
worktreePath: options.worktreeOrRepoPath,
|
|
32
|
+
env: options.env,
|
|
33
|
+
}),
|
|
34
|
+
catch: (e) => new WorktreeError({
|
|
35
|
+
message: `Provider '${options.provider.name}' create failed: ${e instanceof Error ? e.message : String(e)}`,
|
|
36
|
+
}),
|
|
37
|
+
}).pipe(Effect.map((handle) => ({
|
|
38
|
+
handle,
|
|
39
|
+
sandboxLayer: makeSandboxLayerFromHandle(handle),
|
|
40
|
+
worktreePath: handle.worktreePath,
|
|
41
|
+
})));
|
|
26
42
|
const startBindMountSandbox = (options) => Effect.tryPromise({
|
|
27
43
|
try: () => {
|
|
28
44
|
const rawMounts = [
|
package/dist/startSandbox.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startSandbox.js","sourceRoot":"","sources":["../src/startSandbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAS,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,EAE1B,kBAAkB,EAClB,aAAa,EACb,WAAW,GAEZ,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"startSandbox.js","sourceRoot":"","sources":["../src/startSandbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ import { docker } from "@ai-hero/sandcastle/sandboxes/docker";
|
|
|
6
6
|
// Or add to package.json scripts: "sandcastle": "npx tsx .sandcastle/main.mts"
|
|
7
7
|
|
|
8
8
|
await run({
|
|
9
|
-
agent: claudeCode("claude-opus-4-
|
|
9
|
+
agent: claudeCode("claude-opus-4-7"),
|
|
10
10
|
sandbox: docker(),
|
|
11
11
|
promptFile: "./.sandcastle/prompt.md",
|
|
12
12
|
});
|
|
@@ -62,7 +62,7 @@ for (let iteration = 1; iteration <= MAX_ITERATIONS; iteration++) {
|
|
|
62
62
|
// not write code.
|
|
63
63
|
maxIterations: 1,
|
|
64
64
|
// Opus for planning: dependency analysis benefits from deeper reasoning.
|
|
65
|
-
agent: sandcastle.claudeCode("claude-opus-4-
|
|
65
|
+
agent: sandcastle.claudeCode("claude-opus-4-7"),
|
|
66
66
|
promptFile: "./.sandcastle/plan-prompt.md",
|
|
67
67
|
});
|
|
68
68
|
|
|
@@ -67,7 +67,7 @@ for (let iteration = 1; iteration <= MAX_ITERATIONS; iteration++) {
|
|
|
67
67
|
// not write code.
|
|
68
68
|
maxIterations: 1,
|
|
69
69
|
// Opus for planning: dependency analysis benefits from deeper reasoning.
|
|
70
|
-
agent: sandcastle.claudeCode("claude-opus-4-
|
|
70
|
+
agent: sandcastle.claudeCode("claude-opus-4-7"),
|
|
71
71
|
promptFile: "./.sandcastle/plan-prompt.md",
|
|
72
72
|
});
|
|
73
73
|
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
// Sequential Reviewer — implement-then-review loop
|
|
2
2
|
//
|
|
3
3
|
// This template drives a two-phase workflow per issue:
|
|
4
|
-
// Phase 1 (Implement): A sonnet agent picks an open
|
|
4
|
+
// Phase 1 (Implement): A sonnet agent picks an open issue, works on it
|
|
5
5
|
// on a dedicated branch, commits the changes, and signals
|
|
6
6
|
// completion.
|
|
7
7
|
// Phase 2 (Review): A second sonnet agent reviews the branch diff and either
|
|
8
8
|
// approves it or makes corrections directly on the branch.
|
|
9
9
|
//
|
|
10
|
+
// Both phases share a single sandbox created via createSandbox(), so the
|
|
11
|
+
// implementer and reviewer work on the same explicit branch.
|
|
12
|
+
//
|
|
10
13
|
// The outer loop repeats up to MAX_ITERATIONS times, processing one issue per
|
|
11
14
|
// iteration. This is a middle-complexity option between the simple-loop (no review
|
|
12
15
|
// gate) and the parallel-planner (concurrent execution with a planning phase).
|
|
@@ -45,62 +48,64 @@ const copyToWorktree = ["node_modules"];
|
|
|
45
48
|
for (let iteration = 1; iteration <= MAX_ITERATIONS; iteration++) {
|
|
46
49
|
console.log(`\n=== Iteration ${iteration}/${MAX_ITERATIONS} ===\n`);
|
|
47
50
|
|
|
48
|
-
//
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
//
|
|
52
|
-
//
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
// The result contains the branch name the agent worked on.
|
|
57
|
-
// -------------------------------------------------------------------------
|
|
58
|
-
const implement = await sandcastle.run({
|
|
51
|
+
// Generate a unique branch name for this iteration.
|
|
52
|
+
const branch = `sandcastle/sequential-reviewer/${Date.now()}`;
|
|
53
|
+
|
|
54
|
+
// Create a single sandbox that both the implementer and reviewer share.
|
|
55
|
+
// This gives both agents a real, named branch that persists across phases.
|
|
56
|
+
const sandbox = await sandcastle.createSandbox({
|
|
57
|
+
branch,
|
|
58
|
+
sandbox: docker(),
|
|
59
59
|
hooks,
|
|
60
60
|
copyToWorktree,
|
|
61
|
-
sandbox: docker(),
|
|
62
|
-
branchStrategy: { type: "merge-to-head" },
|
|
63
|
-
name: "implementer",
|
|
64
|
-
maxIterations: 100,
|
|
65
|
-
agent: sandcastle.claudeCode("claude-sonnet-4-6"),
|
|
66
|
-
promptFile: "./.sandcastle/implement-prompt.md",
|
|
67
61
|
});
|
|
68
62
|
|
|
69
|
-
|
|
70
|
-
|
|
63
|
+
try {
|
|
64
|
+
// -----------------------------------------------------------------------
|
|
65
|
+
// Phase 1: Implement
|
|
66
|
+
//
|
|
67
|
+
// A sonnet agent picks the next open issue, writes the
|
|
68
|
+
// implementation (using RGR: Red → Green → Repeat → Refactor), and
|
|
69
|
+
// commits the result.
|
|
70
|
+
//
|
|
71
|
+
// The agent signals completion via <promise>COMPLETE</promise> when done.
|
|
72
|
+
// -----------------------------------------------------------------------
|
|
73
|
+
const implement = await sandbox.run({
|
|
74
|
+
name: "implementer",
|
|
75
|
+
maxIterations: 100,
|
|
76
|
+
agent: sandcastle.claudeCode("claude-sonnet-4-6"),
|
|
77
|
+
promptFile: "./.sandcastle/implement-prompt.md",
|
|
78
|
+
});
|
|
71
79
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
80
|
+
if (!implement.commits.length) {
|
|
81
|
+
console.log("Implementation agent made no commits. Skipping review.");
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
76
84
|
|
|
77
|
-
|
|
78
|
-
|
|
85
|
+
console.log(`\nImplementation complete on branch: ${branch}`);
|
|
86
|
+
console.log(`Commits: ${implement.commits.length}`);
|
|
79
87
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
// Prompt arguments substitute {{BRANCH}} in review-prompt.md before the
|
|
97
|
-
// agent sees the prompt.
|
|
98
|
-
promptArgs: {
|
|
99
|
-
BRANCH: branch,
|
|
100
|
-
},
|
|
101
|
-
});
|
|
88
|
+
// -----------------------------------------------------------------------
|
|
89
|
+
// Phase 2: Review
|
|
90
|
+
//
|
|
91
|
+
// A second sonnet agent reviews the diff of the branch produced by
|
|
92
|
+
// Phase 1. It uses the {{BRANCH}} prompt argument to inspect the right
|
|
93
|
+
// branch, and either approves or makes corrections directly on the branch.
|
|
94
|
+
// -----------------------------------------------------------------------
|
|
95
|
+
await sandbox.run({
|
|
96
|
+
name: "reviewer",
|
|
97
|
+
maxIterations: 1,
|
|
98
|
+
agent: sandcastle.claudeCode("claude-sonnet-4-6"),
|
|
99
|
+
promptFile: "./.sandcastle/review-prompt.md",
|
|
100
|
+
promptArgs: {
|
|
101
|
+
BRANCH: branch,
|
|
102
|
+
},
|
|
103
|
+
});
|
|
102
104
|
|
|
103
|
-
|
|
105
|
+
console.log("\nReview complete.");
|
|
106
|
+
} finally {
|
|
107
|
+
await sandbox.close();
|
|
108
|
+
}
|
|
104
109
|
}
|
|
105
110
|
|
|
106
111
|
console.log("\nAll done.");
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { run, claudeCode } from "@ai-hero/sandcastle";
|
|
2
2
|
import { docker } from "@ai-hero/sandcastle/sandboxes/docker";
|
|
3
3
|
|
|
4
|
-
// Simple loop: an agent that picks open
|
|
4
|
+
// Simple loop: an agent that picks open issues one by one and closes them.
|
|
5
5
|
// Run this with: npx tsx .sandcastle/main.mts
|
|
6
6
|
// Or add to package.json scripts: "sandcastle": "npx tsx .sandcastle/main.mts"
|
|
7
7
|
|
|
@@ -13,7 +13,7 @@ await run({
|
|
|
13
13
|
sandbox: docker(),
|
|
14
14
|
|
|
15
15
|
// The agent provider. Pass a model string to claudeCode() — sonnet balances
|
|
16
|
-
// capability and speed for most tasks. Switch to claude-opus-4-
|
|
16
|
+
// capability and speed for most tasks. Switch to claude-opus-4-7 for harder
|
|
17
17
|
// problems, or claude-haiku-4-5-20251001 for speed.
|
|
18
18
|
agent: claudeCode("claude-sonnet-4-6"),
|
|
19
19
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-hero/sandcastle",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.11",
|
|
4
4
|
"description": "CLI for orchestrating AI agents in isolated sandbox environments",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -71,7 +71,8 @@
|
|
|
71
71
|
"lint-staged": "^15.5.1",
|
|
72
72
|
"prettier": "^3.5.3",
|
|
73
73
|
"tsx": "^4.21.0",
|
|
74
|
-
"vitest": "^3.2.0"
|
|
74
|
+
"vitest": "^3.2.0",
|
|
75
|
+
"@daytona/sdk": "^0.164.0"
|
|
75
76
|
},
|
|
76
77
|
"dependencies": {
|
|
77
78
|
"@clack/prompts": "^1.1.0",
|