Compare commits
7 Commits
6face2560e
...
b73ff47151
| Author | SHA1 | Date | |
|---|---|---|---|
| b73ff47151 | |||
| 8e62ce1a59 | |||
| 7442d6c6a1 | |||
| a671d95379 | |||
| 6e0ecdb594 | |||
| 4069015074 | |||
| 08641ecfe2 |
22
package.json
22
package.json
|
|
@ -1,10 +1,28 @@
|
||||||
{
|
{
|
||||||
"name": "sandlot",
|
"name": "@because/sandlot",
|
||||||
"version": "0.0.1",
|
"version": "0.0.2",
|
||||||
|
"description": "Sandboxed, branch-based development with Claude",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"bin": {
|
"bin": {
|
||||||
"sandlot": "./src/cli.ts"
|
"sandlot": "./src/cli.ts"
|
||||||
},
|
},
|
||||||
|
"files": [
|
||||||
|
"src",
|
||||||
|
"completions"
|
||||||
|
],
|
||||||
|
"keywords": [
|
||||||
|
"git",
|
||||||
|
"worktree",
|
||||||
|
"container",
|
||||||
|
"apple-container",
|
||||||
|
"claude",
|
||||||
|
"cli"
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://git.nose.space/defunkt/sandlot"
|
||||||
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"commander": "^14.0.3"
|
"commander": "^14.0.3"
|
||||||
},
|
},
|
||||||
|
|
|
||||||
12
src/vm.ts
12
src/vm.ts
|
|
@ -18,8 +18,8 @@ export function containerPath(hostPath: string): string {
|
||||||
if (hostPath.startsWith(`${home}/dev`)) {
|
if (hostPath.startsWith(`${home}/dev`)) {
|
||||||
return "/host/dev" + hostPath.slice(`${home}/dev`.length)
|
return "/host/dev" + hostPath.slice(`${home}/dev`.length)
|
||||||
}
|
}
|
||||||
if (hostPath.startsWith(`${home}/Code`)) {
|
if (hostPath.startsWith(`${home}/code`)) {
|
||||||
return "/host/Code" + hostPath.slice(`${home}/Code`.length)
|
return "/host/code" + hostPath.slice(`${home}/code`.length)
|
||||||
}
|
}
|
||||||
return hostPath
|
return hostPath
|
||||||
}
|
}
|
||||||
|
|
@ -48,7 +48,7 @@ async function run(cmd: ReturnType<typeof $>, step: string): Promise<void> {
|
||||||
async function hostMounts(home: string): Promise<{ dev: boolean; code: boolean }> {
|
async function hostMounts(home: string): Promise<{ dev: boolean; code: boolean }> {
|
||||||
const [dev, code] = await Promise.all([
|
const [dev, code] = await Promise.all([
|
||||||
Bun.file(`${home}/dev`).exists().catch(() => false),
|
Bun.file(`${home}/dev`).exists().catch(() => false),
|
||||||
Bun.file(`${home}/Code`).exists().catch(() => false),
|
Bun.file(`${home}/code`).exists().catch(() => false),
|
||||||
])
|
])
|
||||||
return { dev, code }
|
return { dev, code }
|
||||||
}
|
}
|
||||||
|
|
@ -58,7 +58,7 @@ async function createContainer(home: string): Promise<void> {
|
||||||
const mounts = await hostMounts(home)
|
const mounts = await hostMounts(home)
|
||||||
const args = ["container", "run", "-d", "--name", CONTAINER_NAME, "-m", "4G"]
|
const args = ["container", "run", "-d", "--name", CONTAINER_NAME, "-m", "4G"]
|
||||||
if (mounts.dev) args.push("--mount", `type=bind,source=${home}/dev,target=/host/dev,readonly`)
|
if (mounts.dev) args.push("--mount", `type=bind,source=${home}/dev,target=/host/dev,readonly`)
|
||||||
if (mounts.code) args.push("--mount", `type=bind,source=${home}/Code,target=/host/Code,readonly`)
|
if (mounts.code) args.push("--mount", `type=bind,source=${home}/code,target=/host/code,readonly`)
|
||||||
args.push("-v", `${home}/.sandlot:/sandlot`, "ubuntu:24.04", "sleep", "infinity")
|
args.push("-v", `${home}/.sandlot:/sandlot`, "ubuntu:24.04", "sleep", "infinity")
|
||||||
const result = await $`${args}`.nothrow().quiet()
|
const result = await $`${args}`.nothrow().quiet()
|
||||||
if (result.exitCode !== 0) {
|
if (result.exitCode !== 0) {
|
||||||
|
|
@ -83,7 +83,7 @@ async function createHostSymlinks(home: string): Promise<void> {
|
||||||
const mounts = await hostMounts(home)
|
const mounts = await hostMounts(home)
|
||||||
const cmds = [`mkdir -p '${home}'`, `ln -s /sandlot '${home}/.sandlot'`]
|
const cmds = [`mkdir -p '${home}'`, `ln -s /sandlot '${home}/.sandlot'`]
|
||||||
if (mounts.dev) cmds.push(`ln -s /host/dev '${home}/dev'`)
|
if (mounts.dev) cmds.push(`ln -s /host/dev '${home}/dev'`)
|
||||||
if (mounts.code) cmds.push(`ln -s /host/Code '${home}/Code'`)
|
if (mounts.code) cmds.push(`ln -s /host/code '${home}/code'`)
|
||||||
await run(
|
await run(
|
||||||
$`container exec ${CONTAINER_NAME} bash -c ${cmds.join(" && ")}`,
|
$`container exec ${CONTAINER_NAME} bash -c ${cmds.join(" && ")}`,
|
||||||
"Symlink creation")
|
"Symlink creation")
|
||||||
|
|
@ -270,7 +270,7 @@ export async function claude(workdir: string, opts?: { prompt?: string; print?:
|
||||||
`Your working directory is ${cwd}, a git worktree managed by sandlot.`,
|
`Your working directory is ${cwd}, a git worktree managed by sandlot.`,
|
||||||
]
|
]
|
||||||
if (mounts.dev) systemPromptLines.push("The host's ~/dev is mounted read-only at /host/dev.")
|
if (mounts.dev) systemPromptLines.push("The host's ~/dev is mounted read-only at /host/dev.")
|
||||||
if (mounts.code) systemPromptLines.push("The host's ~/Code is mounted read-only at /host/Code.")
|
if (mounts.code) systemPromptLines.push("The host's ~/code is mounted read-only at /host/code.")
|
||||||
systemPromptLines.push(
|
systemPromptLines.push(
|
||||||
"The host's ~/.sandlot is mounted at /sandlot.",
|
"The host's ~/.sandlot is mounted at /sandlot.",
|
||||||
"Bun is installed at ~/.local/bin/bun. Use bun instead of node/npm.",
|
"Bun is installed at ~/.local/bin/bun. Use bun instead of node/npm.",
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user