@ai-hero/sandcastle 0.3.0 → 0.4.1
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 +384 -58
- package/dist/AgentProvider.d.ts +22 -12
- package/dist/AgentProvider.d.ts.map +1 -1
- package/dist/AgentProvider.js +46 -47
- package/dist/AgentProvider.js.map +1 -1
- package/dist/DockerLifecycle.d.ts +5 -1
- package/dist/DockerLifecycle.d.ts.map +1 -1
- package/dist/DockerLifecycle.js +8 -1
- package/dist/DockerLifecycle.js.map +1 -1
- package/dist/InitService.d.ts.map +1 -1
- package/dist/InitService.js +57 -6
- package/dist/InitService.js.map +1 -1
- package/dist/MountConfig.d.ts +15 -0
- package/dist/MountConfig.d.ts.map +1 -0
- package/dist/MountConfig.js +7 -0
- package/dist/MountConfig.js.map +1 -0
- package/dist/Orchestrator.d.ts +0 -1
- package/dist/Orchestrator.d.ts.map +1 -1
- package/dist/Orchestrator.js +28 -29
- package/dist/Orchestrator.js.map +1 -1
- package/dist/SandboxFactory.d.ts +21 -17
- package/dist/SandboxFactory.d.ts.map +1 -1
- package/dist/SandboxFactory.js +48 -50
- package/dist/SandboxFactory.js.map +1 -1
- package/dist/SandboxLifecycle.d.ts +1 -1
- package/dist/SandboxLifecycle.d.ts.map +1 -1
- package/dist/SandboxLifecycle.js +2 -2
- package/dist/SandboxLifecycle.js.map +1 -1
- package/dist/SandboxProvider.d.ts +50 -13
- package/dist/SandboxProvider.d.ts.map +1 -1
- package/dist/SandboxProvider.js +2 -0
- package/dist/SandboxProvider.js.map +1 -1
- package/dist/TextDeltaBuffer.d.ts +24 -0
- package/dist/TextDeltaBuffer.d.ts.map +1 -0
- package/dist/TextDeltaBuffer.js +68 -0
- package/dist/TextDeltaBuffer.js.map +1 -0
- package/dist/WorktreeManager.d.ts +2 -0
- package/dist/WorktreeManager.d.ts.map +1 -1
- package/dist/WorktreeManager.js +3 -0
- package/dist/WorktreeManager.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +11 -6
- package/dist/cli.js.map +1 -1
- package/dist/createSandbox.d.ts +6 -5
- package/dist/createSandbox.d.ts.map +1 -1
- package/dist/createSandbox.js +14 -6
- package/dist/createSandbox.js.map +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mergeProviderEnv.d.ts +13 -0
- package/dist/mergeProviderEnv.d.ts.map +1 -0
- package/dist/mergeProviderEnv.js +23 -0
- package/dist/mergeProviderEnv.js.map +1 -0
- package/dist/run.d.ts +7 -18
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +35 -22
- package/dist/run.js.map +1 -1
- package/dist/sandboxes/daytona.d.ts +48 -0
- package/dist/sandboxes/daytona.d.ts.map +1 -0
- package/dist/sandboxes/daytona.js +125 -0
- package/dist/sandboxes/daytona.js.map +1 -0
- package/dist/sandboxes/docker.d.ts +10 -0
- package/dist/sandboxes/docker.d.ts.map +1 -1
- package/dist/sandboxes/docker.js +69 -42
- package/dist/sandboxes/docker.js.map +1 -1
- package/dist/sandboxes/podman.d.ts +46 -0
- package/dist/sandboxes/podman.d.ts.map +1 -0
- package/dist/sandboxes/podman.js +195 -0
- package/dist/sandboxes/podman.js.map +1 -0
- package/dist/sandboxes/test-isolated.d.ts +1 -1
- package/dist/sandboxes/test-isolated.d.ts.map +1 -1
- package/dist/sandboxes/test-isolated.js +56 -45
- package/dist/sandboxes/test-isolated.js.map +1 -1
- package/dist/sandboxes/vercel.d.ts +92 -0
- package/dist/sandboxes/vercel.d.ts.map +1 -0
- package/dist/sandboxes/vercel.js +165 -0
- package/dist/sandboxes/vercel.js.map +1 -0
- package/dist/syncIn.d.ts +4 -2
- package/dist/syncIn.d.ts.map +1 -1
- package/dist/syncIn.js +72 -22
- package/dist/syncIn.js.map +1 -1
- package/dist/syncOut.d.ts +4 -2
- package/dist/syncOut.d.ts.map +1 -1
- package/dist/syncOut.js +156 -77
- package/dist/syncOut.js.map +1 -1
- package/dist/templates/blank/.env.example +1 -0
- package/dist/templates/parallel-planner/.env.example +1 -0
- package/dist/templates/parallel-planner/main.mts +3 -3
- package/dist/templates/parallel-planner-with-review/.env.example +5 -0
- package/dist/templates/parallel-planner-with-review/CODING_STANDARDS.md +27 -0
- package/dist/templates/parallel-planner-with-review/implement-prompt.md +62 -0
- package/dist/templates/parallel-planner-with-review/main.mts +249 -0
- package/dist/templates/parallel-planner-with-review/merge-prompt.md +22 -0
- package/dist/templates/parallel-planner-with-review/plan-prompt.md +33 -0
- package/dist/templates/parallel-planner-with-review/review-prompt.md +55 -0
- package/dist/templates/parallel-planner-with-review/template.json +4 -0
- package/dist/templates/sequential-reviewer/.env.example +1 -0
- package/dist/templates/sequential-reviewer/CODING_STANDARDS.md +27 -0
- package/dist/templates/sequential-reviewer/implement-prompt.md +34 -45
- package/dist/templates/sequential-reviewer/main.mts +2 -2
- package/dist/templates/sequential-reviewer/review-prompt.md +1 -1
- package/dist/templates/simple-loop/.env.example +1 -0
- package/dist/testSandbox.d.ts.map +1 -1
- package/dist/testSandbox.js +58 -53
- package/dist/testSandbox.js.map +1 -1
- package/package.json +25 -1
package/dist/syncIn.d.ts
CHANGED
|
@@ -5,7 +5,9 @@
|
|
|
5
5
|
* copies it into the sandbox via the provider's copyIn, and
|
|
6
6
|
* clones from the bundle inside the sandbox.
|
|
7
7
|
*/
|
|
8
|
+
import { Effect } from "effect";
|
|
8
9
|
import type { IsolatedSandboxHandle } from "./SandboxProvider.js";
|
|
10
|
+
import { SyncError } from "./errors.js";
|
|
9
11
|
/**
|
|
10
12
|
* Sync a host git repo into an isolated sandbox.
|
|
11
13
|
*
|
|
@@ -16,7 +18,7 @@ import type { IsolatedSandboxHandle } from "./SandboxProvider.js";
|
|
|
16
18
|
*
|
|
17
19
|
* @returns The branch name that was checked out
|
|
18
20
|
*/
|
|
19
|
-
export declare const syncIn: (hostRepoDir: string, handle: IsolatedSandboxHandle) =>
|
|
21
|
+
export declare const syncIn: (hostRepoDir: string, handle: IsolatedSandboxHandle) => Effect.Effect<{
|
|
20
22
|
branch: string;
|
|
21
|
-
}>;
|
|
23
|
+
}, SyncError, never>;
|
|
22
24
|
//# sourceMappingURL=syncIn.d.ts.map
|
package/dist/syncIn.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"syncIn.d.ts","sourceRoot":"","sources":["../src/syncIn.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"syncIn.d.ts","sourceRoot":"","sources":["../src/syncIn.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAwDxC;;;;;;;;;GASG;AACH,eAAO,MAAM,MAAM;;oBA2Ff,CAAC"}
|
package/dist/syncIn.js
CHANGED
|
@@ -8,7 +8,40 @@
|
|
|
8
8
|
import { mkdtemp, rm } from "node:fs/promises";
|
|
9
9
|
import { tmpdir } from "node:os";
|
|
10
10
|
import { join } from "node:path";
|
|
11
|
-
import {
|
|
11
|
+
import { Effect } from "effect";
|
|
12
|
+
import { SyncError } from "./errors.js";
|
|
13
|
+
/**
|
|
14
|
+
* Execute a command on the host side, returning stdout.
|
|
15
|
+
* Fails with SyncError on non-zero exit.
|
|
16
|
+
*/
|
|
17
|
+
const execHost = (command, cwd) => Effect.tryPromise({
|
|
18
|
+
try: async () => {
|
|
19
|
+
const { exec } = await import("node:child_process");
|
|
20
|
+
const { promisify } = await import("node:util");
|
|
21
|
+
const execAsync = promisify(exec);
|
|
22
|
+
const { stdout } = await execAsync(command, {
|
|
23
|
+
cwd,
|
|
24
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
25
|
+
});
|
|
26
|
+
return stdout;
|
|
27
|
+
},
|
|
28
|
+
catch: (e) => new SyncError({
|
|
29
|
+
message: `Host command failed: ${command}\n${e instanceof Error ? e.message : String(e)}`,
|
|
30
|
+
}),
|
|
31
|
+
});
|
|
32
|
+
/**
|
|
33
|
+
* Execute a command in the sandbox, failing with SyncError if it exits non-zero.
|
|
34
|
+
*/
|
|
35
|
+
const execOk = (handle, command, options) => Effect.tryPromise({
|
|
36
|
+
try: () => handle.exec(command, options),
|
|
37
|
+
catch: (e) => new SyncError({
|
|
38
|
+
message: `Sandbox exec failed: ${command}\n${e instanceof Error ? e.message : String(e)}`,
|
|
39
|
+
}),
|
|
40
|
+
}).pipe(Effect.flatMap((result) => result.exitCode !== 0
|
|
41
|
+
? Effect.fail(new SyncError({
|
|
42
|
+
message: `Sandbox command failed (exit ${result.exitCode}): ${command}\n${result.stderr}`,
|
|
43
|
+
}))
|
|
44
|
+
: Effect.succeed(result)));
|
|
12
45
|
/**
|
|
13
46
|
* Sync a host git repo into an isolated sandbox.
|
|
14
47
|
*
|
|
@@ -19,39 +52,56 @@ import { execHost, execOk } from "./sandboxExec.js";
|
|
|
19
52
|
*
|
|
20
53
|
* @returns The branch name that was checked out
|
|
21
54
|
*/
|
|
22
|
-
export const syncIn =
|
|
55
|
+
export const syncIn = (hostRepoDir, handle) => Effect.gen(function* () {
|
|
23
56
|
// Get current branch from host
|
|
24
|
-
const branch = (
|
|
57
|
+
const branch = (yield* execHost("git rev-parse --abbrev-ref HEAD", hostRepoDir)).trim();
|
|
25
58
|
// Create git bundle on host capturing all refs
|
|
26
|
-
const bundleDir =
|
|
59
|
+
const bundleDir = yield* Effect.tryPromise({
|
|
60
|
+
try: () => mkdtemp(join(tmpdir(), "sandcastle-bundle-")),
|
|
61
|
+
catch: (e) => new SyncError({
|
|
62
|
+
message: `Failed to create temp dir: ${e instanceof Error ? e.message : String(e)}`,
|
|
63
|
+
}),
|
|
64
|
+
});
|
|
27
65
|
const bundleHostPath = join(bundleDir, "repo.bundle");
|
|
28
|
-
|
|
29
|
-
|
|
66
|
+
yield* Effect.ensuring(Effect.gen(function* () {
|
|
67
|
+
yield* execHost(`git bundle create "${bundleHostPath}" --all`, hostRepoDir);
|
|
30
68
|
// Create temp dir in sandbox and copy bundle in
|
|
31
|
-
const mkTempResult =
|
|
69
|
+
const mkTempResult = yield* execOk(handle, "mktemp -d -t sandcastle-XXXXXX");
|
|
32
70
|
const sandboxTmpDir = mkTempResult.stdout.trim();
|
|
33
71
|
const bundleSandboxPath = `${sandboxTmpDir}/repo.bundle`;
|
|
34
|
-
|
|
72
|
+
yield* Effect.tryPromise({
|
|
73
|
+
try: () => handle.copyIn(bundleHostPath, bundleSandboxPath),
|
|
74
|
+
catch: (e) => new SyncError({
|
|
75
|
+
message: `Failed to copy bundle into sandbox: ${e instanceof Error ? e.message : String(e)}`,
|
|
76
|
+
}),
|
|
77
|
+
});
|
|
35
78
|
// Clone from bundle into the workspace
|
|
36
79
|
const workspacePath = handle.workspacePath;
|
|
37
|
-
|
|
80
|
+
yield* execOk(handle, `git clone "${bundleSandboxPath}" "${workspacePath}_clone"`);
|
|
38
81
|
// Move contents from clone into workspace (git clone requires empty target)
|
|
39
|
-
|
|
82
|
+
yield* execOk(handle, `rm -rf "${workspacePath}" && mv "${workspacePath}_clone" "${workspacePath}"`);
|
|
40
83
|
// Checkout the correct branch
|
|
41
|
-
|
|
84
|
+
yield* execOk(handle, `git checkout "${branch}"`, {
|
|
85
|
+
cwd: workspacePath,
|
|
86
|
+
});
|
|
42
87
|
// Clean up sandbox temp files
|
|
43
|
-
|
|
88
|
+
yield* Effect.tryPromise({
|
|
89
|
+
try: () => handle.exec(`rm -rf "${sandboxTmpDir}"`),
|
|
90
|
+
catch: () => new SyncError({ message: "Failed to clean up sandbox temp dir" }),
|
|
91
|
+
});
|
|
44
92
|
// Verify sync succeeded
|
|
45
|
-
const hostHead = (
|
|
46
|
-
const sandboxHead = (
|
|
93
|
+
const hostHead = (yield* execHost("git rev-parse HEAD", hostRepoDir)).trim();
|
|
94
|
+
const sandboxHead = (yield* execOk(handle, "git rev-parse HEAD", {
|
|
95
|
+
cwd: workspacePath,
|
|
96
|
+
})).stdout.trim();
|
|
47
97
|
if (hostHead !== sandboxHead) {
|
|
48
|
-
|
|
98
|
+
yield* Effect.fail(new SyncError({
|
|
99
|
+
message: `HEAD mismatch after sync-in: host=${hostHead} sandbox=${sandboxHead}`,
|
|
100
|
+
}));
|
|
49
101
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
};
|
|
102
|
+
}),
|
|
103
|
+
// Clean up host-side bundle temp dir (runs regardless of success/failure)
|
|
104
|
+
Effect.promise(() => rm(bundleDir, { recursive: true, force: true })));
|
|
105
|
+
return { branch };
|
|
106
|
+
});
|
|
57
107
|
//# sourceMappingURL=syncIn.js.map
|
package/dist/syncIn.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"syncIn.js","sourceRoot":"","sources":["../src/syncIn.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"syncIn.js","sourceRoot":"","sources":["../src/syncIn.ts"],"names":[],"mappings":"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"}
|
package/dist/syncOut.d.ts
CHANGED
|
@@ -11,9 +11,11 @@
|
|
|
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` + `
|
|
14
|
+
* 3. Untracked files: `git ls-files --others` + `copyFileOut` each file
|
|
15
15
|
*/
|
|
16
|
+
import { Effect } from "effect";
|
|
16
17
|
import type { IsolatedSandboxHandle } from "./SandboxProvider.js";
|
|
18
|
+
import { SyncError } from "./errors.js";
|
|
17
19
|
/**
|
|
18
20
|
* Sync changes from an isolated sandbox back to the host repo.
|
|
19
21
|
*
|
|
@@ -21,5 +23,5 @@ import type { IsolatedSandboxHandle } from "./SandboxProvider.js";
|
|
|
21
23
|
* 1. Save all artifacts to `.sandcastle/patches/<timestamp>/`
|
|
22
24
|
* 2. Apply from saved directory; on failure, preserve artifacts and print recovery
|
|
23
25
|
*/
|
|
24
|
-
export declare const syncOut: (hostRepoDir: string, handle: IsolatedSandboxHandle) =>
|
|
26
|
+
export declare const syncOut: (hostRepoDir: string, handle: IsolatedSandboxHandle) => Effect.Effect<void, SyncError, never>;
|
|
25
27
|
//# sourceMappingURL=syncOut.d.ts.map
|
package/dist/syncOut.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"syncOut.d.ts","sourceRoot":"","sources":["../src/syncOut.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAYH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"syncOut.d.ts","sourceRoot":"","sources":["../src/syncOut.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAYH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAElE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AA+HxC;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,+FAgNhB,CAAC"}
|
package/dist/syncOut.js
CHANGED
|
@@ -11,45 +11,97 @@
|
|
|
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` + `
|
|
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";
|
|
18
18
|
import { basename, dirname, join } from "node:path";
|
|
19
|
+
import { Effect } from "effect";
|
|
19
20
|
import { buildRecoveryMessage } from "./RecoveryMessage.js";
|
|
20
|
-
import {
|
|
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 =
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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 =
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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 =
|
|
112
|
+
export const syncOut = (hostRepoDir, handle) => Effect.gen(function* () {
|
|
61
113
|
const workspacePath = handle.workspacePath;
|
|
62
|
-
const hostHead = (
|
|
63
|
-
const sandboxHead = (
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
143
|
+
const mkTempResult = yield* execOk(handle, "mktemp -d -t sandcastle-patches-XXXXXX");
|
|
88
144
|
const sandboxPatchDir = mkTempResult.stdout.trim();
|
|
89
145
|
try {
|
|
90
|
-
|
|
91
|
-
const lsResult =
|
|
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
|
-
|
|
100
|
-
|
|
155
|
+
yield* Effect.tryPromise({
|
|
156
|
+
try: () => handle.copyFileOut(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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
121
|
-
|
|
186
|
+
yield* Effect.tryPromise({
|
|
187
|
+
try: async () => {
|
|
188
|
+
await mkdir(dirname(hostFilePath), { recursive: true });
|
|
189
|
+
await handle.copyFileOut(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
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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
|
-
|
|
141
|
-
|
|
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
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
const
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
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
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
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
|
package/dist/syncOut.js.map
CHANGED
|
@@ -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":"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"}
|
|
@@ -107,7 +107,9 @@ for (let iteration = 1; iteration <= MAX_ITERATIONS; iteration++) {
|
|
|
107
107
|
sandcastle.run({
|
|
108
108
|
hooks,
|
|
109
109
|
copyToSandbox,
|
|
110
|
+
// Each agent starts on its own branch via branchStrategy on run().
|
|
110
111
|
sandbox: docker(),
|
|
112
|
+
branchStrategy: { type: "branch", branch: issue.branch },
|
|
111
113
|
name: "implementer",
|
|
112
114
|
// Give each agent plenty of room to implement and iterate on tests.
|
|
113
115
|
maxIterations: 100,
|
|
@@ -122,8 +124,6 @@ for (let iteration = 1; iteration <= MAX_ITERATIONS; iteration++) {
|
|
|
122
124
|
ISSUE_TITLE: issue.title,
|
|
123
125
|
BRANCH: issue.branch,
|
|
124
126
|
},
|
|
125
|
-
// Each agent starts on its own branch.
|
|
126
|
-
worktree: { mode: "branch", branch: issue.branch },
|
|
127
127
|
}),
|
|
128
128
|
),
|
|
129
129
|
);
|
|
@@ -184,7 +184,7 @@ for (let iteration = 1; iteration <= MAX_ITERATIONS; iteration++) {
|
|
|
184
184
|
copyToSandbox,
|
|
185
185
|
sandbox: docker(),
|
|
186
186
|
name: "merger",
|
|
187
|
-
maxIterations:
|
|
187
|
+
maxIterations: 1,
|
|
188
188
|
// Sonnet is sufficient for merge conflict resolution.
|
|
189
189
|
agent: sandcastle.claudeCode("claude-sonnet-4-6"),
|
|
190
190
|
promptFile: "./.sandcastle/merge-prompt.md",
|
|
@@ -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
|
+
-->
|