@ai-hero/sandcastle 0.4.5 → 0.4.6

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 (89) hide show
  1. package/README.md +35 -19
  2. package/dist/AgentProvider.d.ts +7 -2
  3. package/dist/AgentProvider.d.ts.map +1 -1
  4. package/dist/AgentProvider.js +28 -15
  5. package/dist/AgentProvider.js.map +1 -1
  6. package/dist/{CopyToSandbox.d.ts → CopyToWorkspace.d.ts} +2 -2
  7. package/dist/CopyToWorkspace.d.ts.map +1 -0
  8. package/dist/{CopyToSandbox.js → CopyToWorkspace.js} +2 -2
  9. package/dist/CopyToWorkspace.js.map +1 -0
  10. package/dist/ErrorHandler.d.ts.map +1 -1
  11. package/dist/ErrorHandler.js +3 -0
  12. package/dist/ErrorHandler.js.map +1 -1
  13. package/dist/InitService.d.ts +24 -0
  14. package/dist/InitService.d.ts.map +1 -1
  15. package/dist/InitService.js +117 -11
  16. package/dist/InitService.js.map +1 -1
  17. package/dist/Orchestrator.d.ts.map +1 -1
  18. package/dist/Orchestrator.js +4 -1
  19. package/dist/Orchestrator.js.map +1 -1
  20. package/dist/PodmanLifecycle.d.ts +17 -0
  21. package/dist/PodmanLifecycle.d.ts.map +1 -0
  22. package/dist/PodmanLifecycle.js +45 -0
  23. package/dist/PodmanLifecycle.js.map +1 -0
  24. package/dist/PromptArgumentSubstitution.d.ts +5 -0
  25. package/dist/PromptArgumentSubstitution.d.ts.map +1 -1
  26. package/dist/PromptArgumentSubstitution.js +22 -0
  27. package/dist/PromptArgumentSubstitution.js.map +1 -1
  28. package/dist/PromptPreprocessor.d.ts.map +1 -1
  29. package/dist/PromptPreprocessor.js +6 -0
  30. package/dist/PromptPreprocessor.js.map +1 -1
  31. package/dist/SandboxFactory.d.ts +3 -3
  32. package/dist/SandboxFactory.d.ts.map +1 -1
  33. package/dist/SandboxFactory.js +3 -3
  34. package/dist/SandboxFactory.js.map +1 -1
  35. package/dist/SandboxLifecycle.d.ts.map +1 -1
  36. package/dist/SandboxLifecycle.js +7 -7
  37. package/dist/SandboxLifecycle.js.map +1 -1
  38. package/dist/SandboxProvider.d.ts +73 -1
  39. package/dist/SandboxProvider.d.ts.map +1 -1
  40. package/dist/SandboxProvider.js.map +1 -1
  41. package/dist/cli.d.ts +10 -6
  42. package/dist/cli.d.ts.map +1 -1
  43. package/dist/cli.js +113 -113
  44. package/dist/cli.js.map +1 -1
  45. package/dist/createSandbox.d.ts +23 -1
  46. package/dist/createSandbox.d.ts.map +1 -1
  47. package/dist/createSandbox.js +63 -6
  48. package/dist/createSandbox.js.map +1 -1
  49. package/dist/errors.d.ts +9 -1
  50. package/dist/errors.d.ts.map +1 -1
  51. package/dist/errors.js +3 -0
  52. package/dist/errors.js.map +1 -1
  53. package/dist/index.d.ts +5 -3
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +1 -0
  56. package/dist/index.js.map +1 -1
  57. package/dist/interactive.d.ts +52 -0
  58. package/dist/interactive.d.ts.map +1 -0
  59. package/dist/interactive.js +231 -0
  60. package/dist/interactive.js.map +1 -0
  61. package/dist/run.d.ts +1 -1
  62. package/dist/run.d.ts.map +1 -1
  63. package/dist/run.js +5 -5
  64. package/dist/run.js.map +1 -1
  65. package/dist/sandboxes/docker.d.ts.map +1 -1
  66. package/dist/sandboxes/docker.js +26 -1
  67. package/dist/sandboxes/docker.js.map +1 -1
  68. package/dist/sandboxes/no-sandbox.d.ts +25 -0
  69. package/dist/sandboxes/no-sandbox.d.ts.map +1 -0
  70. package/dist/sandboxes/no-sandbox.js +91 -0
  71. package/dist/sandboxes/no-sandbox.js.map +1 -0
  72. package/dist/sandboxes/podman.d.ts +10 -2
  73. package/dist/sandboxes/podman.d.ts.map +1 -1
  74. package/dist/sandboxes/podman.js +79 -11
  75. package/dist/sandboxes/podman.js.map +1 -1
  76. package/dist/templates/blank/prompt.md +1 -1
  77. package/dist/templates/parallel-planner/implement-prompt.md +2 -2
  78. package/dist/templates/parallel-planner/main.mts +12 -12
  79. package/dist/templates/parallel-planner/plan-prompt.md +3 -3
  80. package/dist/templates/parallel-planner-with-review/implement-prompt.md +2 -2
  81. package/dist/templates/parallel-planner-with-review/main.mts +11 -11
  82. package/dist/templates/parallel-planner-with-review/plan-prompt.md +3 -3
  83. package/dist/templates/sequential-reviewer/implement-prompt.md +2 -2
  84. package/dist/templates/sequential-reviewer/main.mts +3 -3
  85. package/dist/templates/simple-loop/main.mts +2 -2
  86. package/dist/templates/simple-loop/prompt.md +2 -2
  87. package/package.json +8 -2
  88. package/dist/CopyToSandbox.d.ts.map +0 -1
  89. package/dist/CopyToSandbox.js.map +0 -1
package/README.md CHANGED
@@ -65,33 +65,32 @@ await run({
65
65
 
66
66
  ## Sandbox Providers
67
67
 
68
- Sandcastle uses a `SandboxProvider` to create isolated environments. The `sandbox` option on `run()` and `createSandbox()` accepts any provider. Three are built in:
68
+ Sandcastle uses a `SandboxProvider` to create isolated environments. The `sandbox` option on `run()` and `createSandbox()` accepts any provider. A no-sandbox option is also available for `interactive()` only. Built-in providers:
69
69
 
70
- | Provider | Import path | Type |
71
- | -------- | -------------------------------------- | ---------- |
72
- | Docker | `@ai-hero/sandcastle/sandboxes/docker` | Bind-mount |
73
- | Podman | `@ai-hero/sandcastle/sandboxes/podman` | Bind-mount |
74
- | Vercel | `@ai-hero/sandcastle/sandboxes/vercel` | Isolated |
70
+ | Provider | Import path | Type | Accepted by |
71
+ | ---------- | ------------------------------------------ | ---------- | ------------------------------------------- |
72
+ | Docker | `@ai-hero/sandcastle/sandboxes/docker` | Bind-mount | `run()`, `createSandbox()`, `interactive()` |
73
+ | Podman | `@ai-hero/sandcastle/sandboxes/podman` | Bind-mount | `run()`, `createSandbox()`, `interactive()` |
74
+ | Vercel | `@ai-hero/sandcastle/sandboxes/vercel` | Isolated | `run()`, `createSandbox()`, `interactive()` |
75
+ | No-sandbox | `@ai-hero/sandcastle/sandboxes/no-sandbox` | None | `interactive()` only |
75
76
 
76
77
  ```typescript
77
78
  import { docker } from "@ai-hero/sandcastle/sandboxes/docker";
78
79
  import { podman } from "@ai-hero/sandcastle/sandboxes/podman";
79
80
  import { vercel } from "@ai-hero/sandcastle/sandboxes/vercel";
81
+ import { noSandbox } from "@ai-hero/sandcastle/sandboxes/no-sandbox";
80
82
 
81
- // All three are interchangeable in run() and createSandbox():
83
+ // Docker, Podman, and Vercel are interchangeable in run() and createSandbox():
82
84
  await run({
83
85
  agent: claudeCode("claude-opus-4-6"),
84
86
  sandbox: docker(),
85
87
  prompt: "...",
86
88
  });
87
- await run({
88
- agent: claudeCode("claude-opus-4-6"),
89
- sandbox: podman(),
90
- prompt: "...",
91
- });
92
- await run({
89
+
90
+ // No-sandbox runs the agent directly on the host — interactive() only:
91
+ await interactive({
93
92
  agent: claudeCode("claude-opus-4-6"),
94
- sandbox: vercel(),
93
+ sandbox: noSandbox(),
95
94
  prompt: "...",
96
95
  });
97
96
  ```
@@ -167,7 +166,7 @@ const result = await run({
167
166
 
168
167
  // Host-relative file paths to copy into the sandbox before the container starts.
169
168
  // Not supported with branchStrategy: { type: "head" }.
170
- copyToSandbox: [".env"],
169
+ copyToWorkspace: [".env"],
171
170
 
172
171
  // How to record progress. Default: write to a file under .sandcastle/logs/
173
172
  logging: { type: "file", path: ".sandcastle/logs/my-run.log" },
@@ -265,7 +264,7 @@ if (closeResult.preservedWorktreePath) {
265
264
  | `branch` | string | — | **Required.** Explicit branch for the sandbox |
266
265
  | `sandbox` | SandboxProvider | — | **Required.** Sandbox provider (e.g. `docker()`, `podman()`) |
267
266
  | `hooks` | object | — | Lifecycle hooks (`onSandboxReady`) — run once at creation time |
268
- | `copyToSandbox` | string[] | — | Host-relative file paths to copy into the sandbox at creation time |
267
+ | `copyToWorkspace` | string[] | — | Host-relative file paths to copy into the sandbox at creation time |
269
268
  | `throwOnDuplicateWorktree` | boolean | `true` | When `false`, reuse an existing worktree instead of failing on collision |
270
269
 
271
270
  #### `Sandbox`
@@ -422,7 +421,7 @@ Tell the agent to output your chosen string(s) in the prompt, and the orchestrat
422
421
 
423
422
  ### Templates
424
423
 
425
- `sandcastle init` prompts you to choose a template, which scaffolds a ready-to-use prompt and `main.mts` suited to a specific workflow. If your project's `package.json` has `"type": "module"`, the file will be named `main.ts` instead. Four templates are available:
424
+ `sandcastle init` prompts you to choose a sandbox provider (Docker or Podman), a backlog manager (GitHub Issues or Beads), and a template, which scaffolds a ready-to-use prompt and `main.mts` suited to a specific workflow. If your project's `package.json` has `"type": "module"`, the file will be named `main.ts` instead. Five templates are available:
426
425
 
427
426
  | Template | Description |
428
427
  | ------------------------------ | ------------------------------------------------------------------------- |
@@ -438,7 +437,7 @@ Select a template during `sandcastle init` when prompted, or re-run init in a fr
438
437
 
439
438
  ### `sandcastle init`
440
439
 
441
- Scaffolds the `.sandcastle/` config directory and builds the Docker image. This is the first command you run in a new repo.
440
+ Scaffolds the `.sandcastle/` config directory and builds the container image. This is the first command you run in a new repo. You choose a sandbox provider (Docker or Podman) during init — selecting Podman writes a `Containerfile` instead of `Dockerfile` and uses `sandcastle podman build-image` for the build step.
442
441
 
443
442
  | Option | Required | Default | Description |
444
443
  | -------------- | -------- | ---------------------------- | -------------------------------------------------------------------- |
@@ -476,6 +475,23 @@ Removes the Docker image.
476
475
  | -------------- | -------- | ---------------------------- | ----------------- |
477
476
  | `--image-name` | No | `sandcastle:<repo-dir-name>` | Docker image name |
478
477
 
478
+ ### `sandcastle podman build-image`
479
+
480
+ Builds the Podman image from an existing `.sandcastle/` directory. Use this after modifying the Containerfile.
481
+
482
+ | Option | Required | Default | Description |
483
+ | ----------------- | -------- | ---------------------------- | ------------------------------------------------------------------------------------ |
484
+ | `--image-name` | No | `sandcastle:<repo-dir-name>` | Podman image name |
485
+ | `--containerfile` | No | — | Path to a custom Containerfile (build context will be the current working directory) |
486
+
487
+ ### `sandcastle podman remove-image`
488
+
489
+ Removes the Podman image.
490
+
491
+ | Option | Required | Default | Description |
492
+ | -------------- | -------- | ---------------------------- | ----------------- |
493
+ | `--image-name` | No | `sandcastle:<repo-dir-name>` | Podman image name |
494
+
479
495
  ### `RunOptions`
480
496
 
481
497
  | Option | Type | Default | Description |
@@ -489,7 +505,7 @@ Removes the Docker image.
489
505
  | `name` | string | — | Display name for the run, shown as a prefix in log output |
490
506
  | `promptArgs` | PromptArgs | — | Key-value map for `{{KEY}}` placeholder substitution |
491
507
  | `branchStrategy` | BranchStrategy | per-provider default | Branch strategy: `{ type: 'head' }`, `{ type: 'merge-to-head' }`, or `{ type: 'branch', branch: '…' }` |
492
- | `copyToSandbox` | string[] | — | Host-relative file paths to copy into the sandbox before start (not supported with `branchStrategy: { type: 'head' }`) |
508
+ | `copyToWorkspace` | string[] | — | Host-relative file paths to copy into the sandbox before start (not supported with `branchStrategy: { type: 'head' }`) |
493
509
  | `logging` | object | file (auto-generated) | `{ type: 'file', path }` or `{ type: 'stdout' }` |
494
510
  | `completionSignal` | string \| string[] | `<promise>COMPLETE</promise>` | String or array of strings the agent emits to stop the iteration loop early |
495
511
  | `idleTimeoutSeconds` | number | `600` | Idle timeout in seconds — resets on each agent output event |
@@ -9,12 +9,17 @@ export type ParsedStreamEvent = {
9
9
  name: string;
10
10
  args: string;
11
11
  };
12
+ /** Options passed to buildPrintCommand and buildInteractiveArgs. */
13
+ export interface AgentCommandOptions {
14
+ readonly prompt: string;
15
+ readonly dangerouslySkipPermissions: boolean;
16
+ }
12
17
  export interface AgentProvider {
13
18
  readonly name: string;
14
19
  /** Environment variables injected by this agent provider. Merged at launch time with env resolver and sandbox provider env. */
15
20
  readonly env: Record<string, string>;
16
- buildPrintCommand(prompt: string): string;
17
- buildInteractiveArgs(prompt: string): string[];
21
+ buildPrintCommand(options: AgentCommandOptions): string;
22
+ buildInteractiveArgs?(options: AgentCommandOptions): string[];
18
23
  parseStreamLine(line: string): ParsedStreamEvent[];
19
24
  }
20
25
  export declare const DEFAULT_MODEL = "claude-opus-4-6";
@@ -1 +1 @@
1
- {"version":3,"file":"AgentProvider.d.ts","sourceRoot":"","sources":["../src/AgentProvider.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AA6DtD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,+HAA+H;IAC/H,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1C,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC/C,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAAC;CACpD;AAED,eAAO,MAAM,aAAa,oBAAoB,CAAC;AA2D/C,yCAAyC;AACzC,MAAM,WAAW,SAAS;IACxB,6DAA6D;IAC7D,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAED,eAAO,MAAM,EAAE,mEAeb,CAAC;AAwCH,4CAA4C;AAC5C,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;IACtD,6DAA6D;IAC7D,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAED,eAAO,MAAM,KAAK,sEAyBhB,CAAC;AAMH,+CAA+C;AAC/C,MAAM,WAAW,eAAe;IAC9B,6DAA6D;IAC7D,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAED,eAAO,MAAM,QAAQ,yEAkBnB,CAAC;AAMH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;IACpD,6DAA6D;IAC7D,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAED,eAAO,MAAM,UAAU,2EAqBrB,CAAC"}
1
+ {"version":3,"file":"AgentProvider.d.ts","sourceRoot":"","sources":["../src/AgentProvider.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AA6DtD,oEAAoE;AACpE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,0BAA0B,EAAE,OAAO,CAAC;CAC9C;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,+HAA+H;IAC/H,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,iBAAiB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAAC;IACxD,oBAAoB,CAAC,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,EAAE,CAAC;IAC9D,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAAC;CACpD;AAED,eAAO,MAAM,aAAa,oBAAoB,CAAC;AA2D/C,yCAAyC;AACzC,MAAM,WAAW,SAAS;IACxB,6DAA6D;IAC7D,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAED,eAAO,MAAM,EAAE,mEAiBb,CAAC;AAwCH,4CAA4C;AAC5C,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;IACtD,6DAA6D;IAC7D,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAED,eAAO,MAAM,KAAK,sEAuBhB,CAAC;AAMH,+CAA+C;AAC/C,MAAM,WAAW,eAAe;IAC9B,6DAA6D;IAC7D,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAED,eAAO,MAAM,QAAQ,yEAoBnB,CAAC;AAMH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;IACpD,6DAA6D;IAC7D,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAED,eAAO,MAAM,UAAU,2EAiCrB,CAAC"}
@@ -111,11 +111,14 @@ const parsePiStreamLine = (line) => {
111
111
  export const pi = (model, options) => ({
112
112
  name: "pi",
113
113
  env: options?.env ?? {},
114
- buildPrintCommand(prompt) {
114
+ buildPrintCommand({ prompt }) {
115
115
  return `pi -p --mode json --no-session --model ${shellEscape(model)} ${shellEscape(prompt)}`;
116
116
  },
117
- buildInteractiveArgs(_prompt) {
118
- return ["pi", "--model", model];
117
+ buildInteractiveArgs({ prompt }) {
118
+ const args = ["pi", "--model", model];
119
+ if (prompt)
120
+ args.push(prompt);
121
+ return args;
119
122
  },
120
123
  parseStreamLine(line) {
121
124
  return parsePiStreamLine(line);
@@ -155,17 +158,16 @@ const parseCodexStreamLine = (line) => {
155
158
  export const codex = (model, options) => ({
156
159
  name: "codex",
157
160
  env: options?.env ?? {},
158
- buildPrintCommand(prompt) {
161
+ buildPrintCommand({ prompt }) {
159
162
  const effortFlag = options?.effort
160
163
  ? ` -c ${shellEscape(`model_reasoning_effort="${options.effort}"`)}`
161
164
  : "";
162
165
  return `codex exec --json --dangerously-bypass-approvals-and-sandbox -m ${shellEscape(model)}${effortFlag} ${shellEscape(prompt)}`;
163
166
  },
164
- buildInteractiveArgs(_prompt) {
167
+ buildInteractiveArgs({ prompt }) {
165
168
  const args = ["codex", "--model", model];
166
- if (options?.effort) {
167
- args.push("-c", `model_reasoning_effort="${options.effort}"`);
168
- }
169
+ if (prompt)
170
+ args.push(prompt);
169
171
  return args;
170
172
  },
171
173
  parseStreamLine(line) {
@@ -175,11 +177,14 @@ export const codex = (model, options) => ({
175
177
  export const opencode = (model, options) => ({
176
178
  name: "opencode",
177
179
  env: options?.env ?? {},
178
- buildPrintCommand(prompt) {
180
+ buildPrintCommand({ prompt }) {
179
181
  return `opencode run --model ${shellEscape(model)} ${shellEscape(prompt)}`;
180
182
  },
181
- buildInteractiveArgs(_prompt) {
182
- return ["opencode", "--model", model];
183
+ buildInteractiveArgs({ prompt }) {
184
+ const args = ["opencode", "--model", model];
185
+ if (prompt)
186
+ args.push("-p", prompt);
187
+ return args;
183
188
  },
184
189
  parseStreamLine(_line) {
185
190
  return [];
@@ -188,14 +193,22 @@ export const opencode = (model, options) => ({
188
193
  export const claudeCode = (model, options) => ({
189
194
  name: "claude-code",
190
195
  env: options?.env ?? {},
191
- buildPrintCommand(prompt) {
196
+ buildPrintCommand({ prompt, dangerouslySkipPermissions, }) {
197
+ const skipPerms = dangerouslySkipPermissions
198
+ ? " --dangerously-skip-permissions"
199
+ : "";
192
200
  const effortFlag = options?.effort ? ` --effort ${options.effort}` : "";
193
- return `claude --print --verbose --dangerously-skip-permissions --output-format stream-json --model ${shellEscape(model)}${effortFlag} -p ${shellEscape(prompt)}`;
201
+ return `claude --print --verbose${skipPerms} --output-format stream-json --model ${shellEscape(model)}${effortFlag} -p ${shellEscape(prompt)}`;
194
202
  },
195
- buildInteractiveArgs(_prompt) {
196
- const args = ["claude", "--dangerously-skip-permissions", "--model", model];
203
+ buildInteractiveArgs({ prompt, dangerouslySkipPermissions, }) {
204
+ const args = ["claude"];
205
+ if (dangerouslySkipPermissions)
206
+ args.push("--dangerously-skip-permissions");
207
+ args.push("--model", model);
197
208
  if (options?.effort)
198
209
  args.push("--effort", options.effort);
210
+ if (prompt)
211
+ args.push(prompt);
199
212
  return args;
200
213
  },
201
214
  parseStreamLine(line) {
@@ -1 +1 @@
1
- {"version":3,"file":"AgentProvider.js","sourceRoot":"","sources":["../src/AgentProvider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AgentProvider.js","sourceRoot":"","sources":["../src/AgentProvider.ts"],"names":[],"mappings":"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"}
@@ -4,5 +4,5 @@ import { Effect } from "effect";
4
4
  * using `cp -R --reflink=auto` for copy-on-write when the filesystem supports it.
5
5
  * Missing paths are silently skipped.
6
6
  */
7
- export declare const copyToSandbox: (paths: string[], hostRepoDir: string, worktreePath: string) => Effect.Effect<void, never, never>;
8
- //# sourceMappingURL=CopyToSandbox.d.ts.map
7
+ export declare const copyToWorkspace: (paths: string[], hostRepoDir: string, worktreePath: string) => Effect.Effect<void, never, never>;
8
+ //# sourceMappingURL=CopyToWorkspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CopyToWorkspace.d.ts","sourceRoot":"","sources":["../src/CopyToWorkspace.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC;;;;GAIG;AACH,eAAO,MAAM,eAAe,mGAyBxB,CAAC"}
@@ -7,7 +7,7 @@ import { Effect } from "effect";
7
7
  * using `cp -R --reflink=auto` for copy-on-write when the filesystem supports it.
8
8
  * Missing paths are silently skipped.
9
9
  */
10
- export const copyToSandbox = (paths, hostRepoDir, worktreePath) => Effect.gen(function* () {
10
+ export const copyToWorkspace = (paths, hostRepoDir, worktreePath) => Effect.gen(function* () {
11
11
  for (const relativePath of paths) {
12
12
  const src = join(hostRepoDir, relativePath);
13
13
  if (!existsSync(src)) {
@@ -29,4 +29,4 @@ export const copyToSandbox = (paths, hostRepoDir, worktreePath) => Effect.gen(fu
29
29
  });
30
30
  }
31
31
  });
32
- //# sourceMappingURL=CopyToSandbox.js.map
32
+ //# sourceMappingURL=CopyToWorkspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CopyToWorkspace.js","sourceRoot":"","sources":["../src/CopyToWorkspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,KAAe,EACf,WAAmB,EACnB,YAAoB,EACQ,EAAE,CAC9B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,KAAK,MAAM,YAAY,IAAI,KAAK,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAC5C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QAC9C,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAc,CAAC,MAAM,EAAE,EAAE;YAC1C,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,gBAAgB,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC5D,IAAI,KAAK,EAAE,CAAC;oBACV,0DAA0D;oBAC1D,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE;wBACrC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;oBACpC,CAAC,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;gBACpC,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorHandler.d.ts","sourceRoot":"","sources":["../src/ErrorHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD;;;GAGG;AACH,eAAO,MAAM,kBAAkB,iCAyB9B,CAAC;AASF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,4FAgBqB,CAAC"}
1
+ {"version":3,"file":"ErrorHandler.d.ts","sourceRoot":"","sources":["../src/ErrorHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD;;;GAGG;AACH,eAAO,MAAM,kBAAkB,iCA2B9B,CAAC;AASF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,4FAiBqB,CAAC"}
@@ -14,6 +14,8 @@ export const formatErrorMessage = (error) => {
14
14
  return `File copy failed: ${error.message}`;
15
15
  case "DockerError":
16
16
  return `Docker operation failed: ${error.message}. Is Docker running?`;
17
+ case "PodmanError":
18
+ return `Podman operation failed: ${error.message}. Is Podman running?`;
17
19
  case "SyncError":
18
20
  return `Git sync failed: ${error.message}`;
19
21
  case "WorktreeError":
@@ -47,6 +49,7 @@ Effect.catchTags(effect, {
47
49
  ExecHostError: showErrorAndExit,
48
50
  CopyError: showErrorAndExit,
49
51
  DockerError: showErrorAndExit,
52
+ PodmanError: showErrorAndExit,
50
53
  SyncError: showErrorAndExit,
51
54
  WorktreeError: showErrorAndExit,
52
55
  PromptError: showErrorAndExit,
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorHandler.js","sourceRoot":"","sources":["../src/ErrorHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAmB,EAAU,EAAE;IAChE,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,WAAW;YACd,OAAO,8BAA8B,KAAK,CAAC,OAAO,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;QAC1E,KAAK,eAAe;YAClB,OAAO,2BAA2B,KAAK,CAAC,OAAO,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;QACvE,KAAK,WAAW;YACd,OAAO,qBAAqB,KAAK,CAAC,OAAO,EAAE,CAAC;QAC9C,KAAK,aAAa;YAChB,OAAO,4BAA4B,KAAK,CAAC,OAAO,sBAAsB,CAAC;QACzE,KAAK,WAAW;YACd,OAAO,oBAAoB,KAAK,CAAC,OAAO,EAAE,CAAC;QAC7C,KAAK,eAAe;YAClB,OAAO,kCAAkC,KAAK,CAAC,OAAO,EAAE,CAAC;QAC3D,KAAK,aAAa;YAChB,OAAO,6BAA6B,KAAK,CAAC,OAAO,EAAE,CAAC;QACtD,KAAK,YAAY;YACf,OAAO,4BAA4B,KAAK,CAAC,OAAO,EAAE,CAAC;QACrD,KAAK,gBAAgB;YACnB,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QAC5B,KAAK,WAAW;YACd,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QAC5B,KAAK,cAAc;YACjB,OAAO,KAAK,CAAC,OAAO,CAAC;IACzB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,KAAmB,EAAE,EAAE,CAC/C,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC;IACzB,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;IACpD,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAU,CAAC,CAAC;AAC5D,CAAC,CAAC,CAAC;AAEL;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,MAA8B,EAC2B,EAAE;AAC3D,8DAA8D;AAC9D,MAAM,CAAC,SAAS,CAAC,MAA2C,EAAE;IAC5D,SAAS,EAAE,gBAAgB;IAC3B,aAAa,EAAE,gBAAgB;IAC/B,SAAS,EAAE,gBAAgB;IAC3B,WAAW,EAAE,gBAAgB;IAC7B,SAAS,EAAE,gBAAgB;IAC3B,aAAa,EAAE,gBAAgB;IAC/B,WAAW,EAAE,gBAAgB;IAC7B,UAAU,EAAE,gBAAgB;IAC5B,cAAc,EAAE,gBAAgB;IAChC,SAAS,EAAE,gBAAgB;IAC3B,YAAY,EAAE,gBAAgB;CAC/B,CAA4D,CAAC"}
1
+ {"version":3,"file":"ErrorHandler.js","sourceRoot":"","sources":["../src/ErrorHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAmB,EAAU,EAAE;IAChE,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,WAAW;YACd,OAAO,8BAA8B,KAAK,CAAC,OAAO,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;QAC1E,KAAK,eAAe;YAClB,OAAO,2BAA2B,KAAK,CAAC,OAAO,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;QACvE,KAAK,WAAW;YACd,OAAO,qBAAqB,KAAK,CAAC,OAAO,EAAE,CAAC;QAC9C,KAAK,aAAa;YAChB,OAAO,4BAA4B,KAAK,CAAC,OAAO,sBAAsB,CAAC;QACzE,KAAK,aAAa;YAChB,OAAO,4BAA4B,KAAK,CAAC,OAAO,sBAAsB,CAAC;QACzE,KAAK,WAAW;YACd,OAAO,oBAAoB,KAAK,CAAC,OAAO,EAAE,CAAC;QAC7C,KAAK,eAAe;YAClB,OAAO,kCAAkC,KAAK,CAAC,OAAO,EAAE,CAAC;QAC3D,KAAK,aAAa;YAChB,OAAO,6BAA6B,KAAK,CAAC,OAAO,EAAE,CAAC;QACtD,KAAK,YAAY;YACf,OAAO,4BAA4B,KAAK,CAAC,OAAO,EAAE,CAAC;QACrD,KAAK,gBAAgB;YACnB,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QAC5B,KAAK,WAAW;YACd,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QAC5B,KAAK,cAAc;YACjB,OAAO,KAAK,CAAC,OAAO,CAAC;IACzB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,KAAmB,EAAE,EAAE,CAC/C,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC;IACzB,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;IACpD,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAU,CAAC,CAAC;AAC5D,CAAC,CAAC,CAAC;AAEL;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,MAA8B,EAC2B,EAAE;AAC3D,8DAA8D;AAC9D,MAAM,CAAC,SAAS,CAAC,MAA2C,EAAE;IAC5D,SAAS,EAAE,gBAAgB;IAC3B,aAAa,EAAE,gBAAgB;IAC/B,SAAS,EAAE,gBAAgB;IAC3B,WAAW,EAAE,gBAAgB;IAC7B,WAAW,EAAE,gBAAgB;IAC7B,SAAS,EAAE,gBAAgB;IAC3B,aAAa,EAAE,gBAAgB;IAC/B,WAAW,EAAE,gBAAgB;IAC7B,UAAU,EAAE,gBAAgB;IAC5B,cAAc,EAAE,gBAAgB;IAChC,SAAS,EAAE,gBAAgB;IAC3B,YAAY,EAAE,gBAAgB;CAC/B,CAA4D,CAAC"}
@@ -13,12 +13,36 @@ export interface AgentEntry {
13
13
  readonly dockerfileTemplate: string;
14
14
  }
15
15
  export declare const listAgents: () => AgentEntry[];
16
+ export interface BacklogManagerEntry {
17
+ readonly name: string;
18
+ readonly label: string;
19
+ readonly placeholders: {
20
+ readonly LIST_TASKS_COMMAND: string;
21
+ readonly VIEW_TASK_COMMAND: string;
22
+ readonly CLOSE_TASK_COMMAND: string;
23
+ };
24
+ }
25
+ export declare const listBacklogManagers: () => BacklogManagerEntry[];
26
+ export declare const getBacklogManager: (name: string) => BacklogManagerEntry | undefined;
16
27
  export declare const getAgent: (name: string) => AgentEntry | undefined;
28
+ export interface SandboxProviderEntry {
29
+ readonly name: string;
30
+ readonly label: string;
31
+ /** Filename written to .sandcastle/ (e.g. "Dockerfile" or "Containerfile") */
32
+ readonly containerfileName: string;
33
+ /** CLI namespace for build/remove commands (e.g. "docker" or "podman") */
34
+ readonly cliNamespace: string;
35
+ }
36
+ export declare const listSandboxProviders: () => SandboxProviderEntry[];
37
+ export declare const getSandboxProvider: (name: string) => SandboxProviderEntry | undefined;
17
38
  export declare function getNextStepsLines(template: string, mainFilename: string): string[];
18
39
  export interface ScaffoldOptions {
19
40
  agent: AgentEntry;
20
41
  model: string;
21
42
  templateName?: string;
43
+ createLabel?: boolean;
44
+ backlogManager?: BacklogManagerEntry;
45
+ sandboxProvider?: SandboxProviderEntry;
22
46
  }
23
47
  export interface ScaffoldResult {
24
48
  mainFilename: string;
@@ -1 +1 @@
1
- {"version":3,"file":"InitService.d.ts","sourceRoot":"","sources":["../src/InitService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAUhC,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AA4BD,eAAO,MAAM,aAAa,0BAAsC,CAAC;AAMjE,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;CACrC;AAuKD,eAAO,MAAM,UAAU,oBAAqC,CAAC;AAE7D,eAAO,MAAM,QAAQ,0CACwB,CAAC;AAM9C,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,MAAM,EAAE,CA8BV;AAqHD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;CACtB;AA2BD,eAAO,MAAM,QAAQ,4GAgDjB,CAAC"}
1
+ {"version":3,"file":"InitService.d.ts","sourceRoot":"","sources":["../src/InitService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAUhC,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AA4BD,eAAO,MAAM,aAAa,0BAAsC,CAAC;AAMjE,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;CACrC;AA+KD,eAAO,MAAM,UAAU,oBAAqC,CAAC;AAM7D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE;QACrB,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;QACpC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;QACnC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;KACrC,CAAC;CACH;AAuBD,eAAO,MAAM,mBAAmB,6BACN,CAAC;AAE3B,eAAO,MAAM,iBAAiB,mDAGyB,CAAC;AAExD,eAAO,MAAM,QAAQ,0CACwB,CAAC;AAM9C,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,8EAA8E;IAC9E,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,0EAA0E;IAC1E,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAiBD,eAAO,MAAM,oBAAoB,8BACN,CAAC;AAE5B,eAAO,MAAM,kBAAkB,oDAGyB,CAAC;AAMzD,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,MAAM,EAAE,CA8BV;AAqMD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,mBAAmB,CAAC;IACrC,eAAe,CAAC,EAAE,oBAAoB,CAAC;CACxC;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;CACtB;AA2BD,eAAO,MAAM,QAAQ,4GA+DjB,CAAC"}
@@ -47,8 +47,10 @@ RUN curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg \\
47
47
  && apt-get update && apt-get install -y gh \\
48
48
  && rm -rf /var/lib/apt/lists/*
49
49
 
50
- # Create a non-root user for Claude to run as
51
- RUN useradd -m -s /bin/bash agent
50
+ # Rename the base image's "node" user (UID 1000) to "agent".
51
+ # This keeps UID 1000 so that --userns=keep-id (Podman) and
52
+ # --user 1000:1000 (Docker) map to the correct home directory owner.
53
+ RUN usermod -d /home/agent -m -l agent node
52
54
  USER agent
53
55
 
54
56
  # Install Claude Code CLI
@@ -81,8 +83,10 @@ RUN curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg \\
81
83
  && apt-get update && apt-get install -y gh \\
82
84
  && rm -rf /var/lib/apt/lists/*
83
85
 
84
- # Create a non-root user
85
- RUN useradd -m -s /bin/bash agent
86
+ # Rename the base image's "node" user (UID 1000) to "agent".
87
+ # This keeps UID 1000 so that --userns=keep-id (Podman) and
88
+ # --user 1000:1000 (Docker) map to the correct home directory owner.
89
+ RUN usermod -d /home/agent -m -l agent node
86
90
 
87
91
  # Install pi coding agent (run as root before USER agent)
88
92
  RUN npm install -g @mariozechner/pi-coding-agent
@@ -113,8 +117,10 @@ RUN curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg \\
113
117
  && apt-get update && apt-get install -y gh \\
114
118
  && rm -rf /var/lib/apt/lists/*
115
119
 
116
- # Create a non-root user
117
- RUN useradd -m -s /bin/bash agent
120
+ # Rename the base image's "node" user (UID 1000) to "agent".
121
+ # This keeps UID 1000 so that --userns=keep-id (Podman) and
122
+ # --user 1000:1000 (Docker) map to the correct home directory owner.
123
+ RUN usermod -d /home/agent -m -l agent node
118
124
 
119
125
  # Install Codex CLI (run as root before USER agent)
120
126
  RUN npm install -g @openai/codex
@@ -145,8 +151,10 @@ RUN curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg \\
145
151
  && apt-get update && apt-get install -y gh \\
146
152
  && rm -rf /var/lib/apt/lists/*
147
153
 
148
- # Create a non-root user
149
- RUN useradd -m -s /bin/bash agent
154
+ # Rename the base image's "node" user (UID 1000) to "agent".
155
+ # This keeps UID 1000 so that --userns=keep-id (Podman) and
156
+ # --user 1000:1000 (Docker) map to the correct home directory owner.
157
+ RUN usermod -d /home/agent -m -l agent node
150
158
 
151
159
  # Install OpenCode CLI (run as root before USER agent)
152
160
  RUN npm install -g opencode-ai@latest
@@ -191,7 +199,45 @@ const AGENT_REGISTRY = [
191
199
  },
192
200
  ];
193
201
  export const listAgents = () => AGENT_REGISTRY;
202
+ const BACKLOG_MANAGER_REGISTRY = [
203
+ {
204
+ name: "github-issues",
205
+ label: "GitHub Issues",
206
+ placeholders: {
207
+ LIST_TASKS_COMMAND: `gh issue list --state open --label Sandcastle --json number,title,body,labels,comments --jq '[.[] | {number, title, body, labels: [.labels[].name], comments: [.comments[].body]}]'`,
208
+ VIEW_TASK_COMMAND: "gh issue view {{TASK_ID}}",
209
+ CLOSE_TASK_COMMAND: `gh issue close {{TASK_ID}} --comment "Completed by Sandcastle"`,
210
+ },
211
+ },
212
+ {
213
+ name: "beads",
214
+ label: "Beads",
215
+ placeholders: {
216
+ LIST_TASKS_COMMAND: "bd ready --json",
217
+ VIEW_TASK_COMMAND: "bd show {{TASK_ID}}",
218
+ CLOSE_TASK_COMMAND: `bd close {{TASK_ID}} "Completed by Sandcastle"`,
219
+ },
220
+ },
221
+ ];
222
+ export const listBacklogManagers = () => BACKLOG_MANAGER_REGISTRY;
223
+ export const getBacklogManager = (name) => BACKLOG_MANAGER_REGISTRY.find((b) => b.name === name);
194
224
  export const getAgent = (name) => AGENT_REGISTRY.find((a) => a.name === name);
225
+ const SANDBOX_PROVIDER_REGISTRY = [
226
+ {
227
+ name: "docker",
228
+ label: "Docker",
229
+ containerfileName: "Dockerfile",
230
+ cliNamespace: "docker",
231
+ },
232
+ {
233
+ name: "podman",
234
+ label: "Podman",
235
+ containerfileName: "Containerfile",
236
+ cliNamespace: "podman",
237
+ },
238
+ ];
239
+ export const listSandboxProviders = () => SANDBOX_PROVIDER_REGISTRY;
240
+ export const getSandboxProvider = (name) => SANDBOX_PROVIDER_REGISTRY.find((p) => p.name === name);
195
241
  // ---------------------------------------------------------------------------
196
242
  // Next steps
197
243
  // ---------------------------------------------------------------------------
@@ -215,7 +261,7 @@ export function getNextStepsLines(template, mainFilename) {
215
261
  `${step++}. Set the required env vars in .sandcastle/.env (see .sandcastle/.env.example)`,
216
262
  " If you want to use your Claude subscription instead of an API key, see https://github.com/mattpocock/sandcastle/issues/191",
217
263
  `${step++}. Add "sandcastle": "npx tsx .sandcastle/${mainFilename}" to your package.json scripts`,
218
- `${step++}. Templates use \`copyToSandbox: ["node_modules"]\` to copy your host node_modules into the sandbox for fast startup — the \`npm install\` in the onSandboxReady hook is a safety net for platform-specific binaries. Adjust both if you use a different package manager`,
264
+ `${step++}. Templates use \`copyToWorkspace: ["node_modules"]\` to copy your host node_modules into the sandbox for fast startup — the \`npm install\` in the onSandboxReady hook is a safety net for platform-specific binaries. Adjust both if you use a different package manager`,
219
265
  `${step++}. Read and customize the prompt files in .sandcastle/ — they shape what the agent does`,
220
266
  ];
221
267
  if (hasReviewer) {
@@ -298,6 +344,58 @@ const rewriteMainTs = (configDir, agent, model, mainFilename) => Effect.gen(func
298
344
  .writeFileString(mainTsPath, content)
299
345
  .pipe(Effect.mapError((e) => new Error(e.message)));
300
346
  });
347
+ /**
348
+ * When the user opted out of the Sandcastle label, strip ` --label Sandcastle`
349
+ * from all `.md` files in the scaffolded config directory so that `gh issue list`
350
+ * commands work without a label filter.
351
+ */
352
+ const rewritePromptFiles = (configDir) => Effect.gen(function* () {
353
+ const fs = yield* FileSystem.FileSystem;
354
+ const files = yield* fs
355
+ .readDirectory(configDir)
356
+ .pipe(Effect.mapError((e) => new Error(e.message)));
357
+ const mdFiles = files.filter((f) => f.endsWith(".md"));
358
+ yield* Effect.all(mdFiles.map((f) => Effect.gen(function* () {
359
+ const filePath = join(configDir, f);
360
+ const content = yield* fs
361
+ .readFileString(filePath)
362
+ .pipe(Effect.mapError((e) => new Error(e.message)));
363
+ const updated = content.replace(/ --label Sandcastle/g, "");
364
+ if (updated !== content) {
365
+ yield* fs
366
+ .writeFileString(filePath, updated)
367
+ .pipe(Effect.mapError((e) => new Error(e.message)));
368
+ }
369
+ })), { concurrency: "unbounded" });
370
+ });
371
+ /**
372
+ * Replace backlog manager placeholders in all `.md` files in the scaffolded
373
+ * config directory. Placeholders: `{{LIST_TASKS_COMMAND}}`,
374
+ * `{{VIEW_TASK_COMMAND}}`, `{{CLOSE_TASK_COMMAND}}`.
375
+ */
376
+ const rewriteBacklogPlaceholders = (configDir, backlogManager) => Effect.gen(function* () {
377
+ const fs = yield* FileSystem.FileSystem;
378
+ const files = yield* fs
379
+ .readDirectory(configDir)
380
+ .pipe(Effect.mapError((e) => new Error(e.message)));
381
+ const mdFiles = files.filter((f) => f.endsWith(".md"));
382
+ yield* Effect.all(mdFiles.map((f) => Effect.gen(function* () {
383
+ const filePath = join(configDir, f);
384
+ let content = yield* fs
385
+ .readFileString(filePath)
386
+ .pipe(Effect.mapError((e) => new Error(e.message)));
387
+ const original = content;
388
+ const { placeholders } = backlogManager;
389
+ content = content.replace(/\{\{LIST_TASKS_COMMAND\}\}/g, placeholders.LIST_TASKS_COMMAND);
390
+ content = content.replace(/\{\{VIEW_TASK_COMMAND\}\}/g, placeholders.VIEW_TASK_COMMAND);
391
+ content = content.replace(/\{\{CLOSE_TASK_COMMAND\}\}/g, placeholders.CLOSE_TASK_COMMAND);
392
+ if (content !== original) {
393
+ yield* fs
394
+ .writeFileString(filePath, content)
395
+ .pipe(Effect.mapError((e) => new Error(e.message)));
396
+ }
397
+ })), { concurrency: "unbounded" });
398
+ });
301
399
  /**
302
400
  * Detect whether the project's package.json has `"type": "module"`.
303
401
  * If so, we can use plain `.ts`; otherwise we use `.mts` to ensure ESM.
@@ -322,7 +420,9 @@ const detectMainFilename = (repoDir) => Effect.gen(function* () {
322
420
  }
323
421
  });
324
422
  export const scaffold = (repoDir, options) => Effect.gen(function* () {
325
- const { agent, model, templateName = "blank" } = options;
423
+ const { agent, model, templateName = "blank", createLabel = true, backlogManager = BACKLOG_MANAGER_REGISTRY[0], // default: github-issues
424
+ sandboxProvider = SANDBOX_PROVIDER_REGISTRY[0], // default: docker
425
+ } = options;
326
426
  const fs = yield* FileSystem.FileSystem;
327
427
  const configDir = join(repoDir, ".sandcastle");
328
428
  const exists = yield* fs
@@ -338,7 +438,7 @@ export const scaffold = (repoDir, options) => Effect.gen(function* () {
338
438
  const templateDir = yield* getTemplateDir(templateName);
339
439
  yield* Effect.all([
340
440
  fs
341
- .writeFileString(join(configDir, "Dockerfile"), agent.dockerfileTemplate)
441
+ .writeFileString(join(configDir, sandboxProvider.containerfileName), agent.dockerfileTemplate)
342
442
  .pipe(Effect.mapError((e) => new Error(e.message))),
343
443
  fs
344
444
  .writeFileString(join(configDir, ".gitignore"), GITIGNORE)
@@ -347,6 +447,12 @@ export const scaffold = (repoDir, options) => Effect.gen(function* () {
347
447
  ], { concurrency: "unbounded" });
348
448
  // Rewrite main file with the selected agent factory and model
349
449
  yield* rewriteMainTs(configDir, agent, model, mainFilename);
450
+ // Replace backlog manager placeholders in prompt files (must run before label stripping)
451
+ yield* rewriteBacklogPlaceholders(configDir, backlogManager);
452
+ // Strip --label Sandcastle from prompt files when the user declined label creation
453
+ if (!createLabel) {
454
+ yield* rewritePromptFiles(configDir);
455
+ }
350
456
  return { mainFilename };
351
457
  });
352
458
  //# sourceMappingURL=InitService.js.map