From 61329f6960e02d60dde5557f508cc09a18b3544a Mon Sep 17 00:00:00 2001 From: kawaiipunk Date: Wed, 12 Aug 2026 17:58:47 +0100 Subject: [PATCH] Rename Claude sandbox to Assistant and update docs/volumes --- .opencode/package-lock.json | 159 ++++++++++++++++------------ sandbox/Dockerfile | 4 +- sandbox/README.md | 2 +- sandbox/{claude.py => assistant.py} | 0 sandbox/docker-compose.yml | 6 +- sandbox/entrypoint.sh | 54 +++++----- 6 files changed, 122 insertions(+), 103 deletions(-) rename sandbox/{claude.py => assistant.py} (100%) diff --git a/.opencode/package-lock.json b/.opencode/package-lock.json index abb4bd1..7a345cf 100644 --- a/.opencode/package-lock.json +++ b/.opencode/package-lock.json @@ -5,13 +5,25 @@ "packages": { "": { "dependencies": { - "@opencode-ai/plugin": "1.14.48" + "@opencode-ai/plugin": "1.18.15" + } + }, + "node_modules/@ai-sdk/provider": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.8.tgz", + "integrity": "sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" } }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", - "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.4.tgz", + "integrity": "sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ==", "cpu": [ "arm64" ], @@ -22,9 +34,9 @@ ] }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", - "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.4.tgz", + "integrity": "sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w==", "cpu": [ "x64" ], @@ -35,9 +47,9 @@ ] }, "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", - "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.4.tgz", + "integrity": "sha512-Tg3yX65f5GbtXLkrYEHE5oibZG9epyYWas7FogTTEJeDEF9JlXJzKgXaNhT3UXlTOeA+AfZpYZYZ0uPj7Cfquw==", "cpu": [ "arm" ], @@ -48,9 +60,9 @@ ] }, "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", - "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.4.tgz", + "integrity": "sha512-dgX0P/9wGPJeHFBG+ZmhgE6bmtMt7NP5CRBGyyktpopdk/mW4POnrpQsSLtKI1dwpc+pPLuXHDh6vvskyQE/sw==", "cpu": [ "arm64" ], @@ -61,9 +73,9 @@ ] }, "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", - "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.4.tgz", + "integrity": "sha512-8TNXMEjJc3QEy7R/x1INhgiU+XakDAFUzBhaz7+Rbrs8NH5UQeHQxxmzsSBJGyV6I1jW79undiQm8tOI+D+8FQ==", "cpu": [ "x64" ], @@ -74,9 +86,9 @@ ] }, "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", - "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.4.tgz", + "integrity": "sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ==", "cpu": [ "x64" ], @@ -87,19 +99,20 @@ ] }, "node_modules/@opencode-ai/plugin": { - "version": "1.14.48", - "resolved": "https://registry.npmjs.org/@opencode-ai/plugin/-/plugin-1.14.48.tgz", - "integrity": "sha512-pb2ywByzn4i35WWJquEYyb8lDC/ph1PLXT+heucJN6Y9U/oeSw98JQV93IG7M6BUBks6MKD3DGDJdQfyD6x0rA==", + "version": "1.18.15", + "resolved": "https://registry.npmjs.org/@opencode-ai/plugin/-/plugin-1.18.15.tgz", + "integrity": "sha512-AY10RtFbzLkf951dbLkSGJdBeddeS6ojbjvqCpWnINedqlj2cK/GF91xWjWnlHpqQZ4GABLPCuoSJx8mGmKvCw==", "license": "MIT", "dependencies": { - "@opencode-ai/sdk": "1.14.48", - "effect": "4.0.0-beta.59", + "@ai-sdk/provider": "3.0.8", + "@opencode-ai/sdk": "1.18.15", + "effect": "4.0.0-beta.83", "zod": "4.1.8" }, "peerDependencies": { - "@opentui/core": ">=0.2.6", - "@opentui/keymap": ">=0.2.6", - "@opentui/solid": ">=0.2.6" + "@opentui/core": ">=0.4.5", + "@opentui/keymap": ">=0.4.5", + "@opentui/solid": ">=0.4.5" }, "peerDependenciesMeta": { "@opentui/core": { @@ -114,9 +127,9 @@ } }, "node_modules/@opencode-ai/sdk": { - "version": "1.14.48", - "resolved": "https://registry.npmjs.org/@opencode-ai/sdk/-/sdk-1.14.48.tgz", - "integrity": "sha512-wKM86jCzV/ZApyWrdm3uP8XdWcS0LMbu3FV+OWz1ChiGGg1wiIWNGMJs5CY8/QX2/rUuZrd1Q1DqvdamZ0zLeg==", + "version": "1.18.15", + "resolved": "https://registry.npmjs.org/@opencode-ai/sdk/-/sdk-1.18.15.tgz", + "integrity": "sha512-8sfo9nGiVwesAZW9Wqkvynyn7w4wYaHx1O9qOHpYL65+Bs2XUpHP3kBbZe58gjQydFgk6I74kUF7sqCiPu2arQ==", "license": "MIT", "dependencies": { "cross-spawn": "7.0.6" @@ -153,27 +166,27 @@ } }, "node_modules/effect": { - "version": "4.0.0-beta.59", - "resolved": "https://registry.npmjs.org/effect/-/effect-4.0.0-beta.59.tgz", - "integrity": "sha512-xyUDLeHSe8d6lWGOvR6Fgn2HL6gYeTZ/S4Jzk9uc4ZUxMPPsNZlNXrvk0C7/utQFzeX7uAWcVnG2BjbA0SRoAA==", + "version": "4.0.0-beta.83", + "resolved": "https://registry.npmjs.org/effect/-/effect-4.0.0-beta.83.tgz", + "integrity": "sha512-0wsak8RtgGAr9UWSbVDgJHZcUqMSvicHcvaZv1MbMM7MCGgW4Rn/137J1MHQbwYPcwYGxT/IqehFd+UbYuj78w==", "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.1.0", - "fast-check": "^4.6.0", + "fast-check": "^4.8.0", "find-my-way-ts": "^0.1.6", - "ini": "^6.0.0", + "ini": "^7.0.0", "kubernetes-types": "^1.30.0", - "msgpackr": "^1.11.9", + "msgpackr": "^2.0.1", "multipasta": "^0.2.7", "toml": "^4.1.1", - "uuid": "^13.0.0", - "yaml": "^2.8.3" + "uuid": "^14.0.0", + "yaml": "^2.9.0" } }, "node_modules/fast-check": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-4.7.0.tgz", - "integrity": "sha512-NsZRtqvSSoCP0HbNjUD+r1JH8zqZalyp6gLY9e7OYs7NK9b6AHOs2baBFeBG7bVNsuoukh89x2Yg3rPsul8ziQ==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-4.9.0.tgz", + "integrity": "sha512-7ms6T7SybUev/PQITciI0yLM2pOSFy5zpG8Ty7tQofcVaQUvrMXp6CBwqF6fThLCLOrfBtuHAtwq6Yu4XPCllg==", "funding": [ { "type": "individual", @@ -199,12 +212,12 @@ "license": "MIT" }, "node_modules/ini": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", - "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-7.0.0.tgz", + "integrity": "sha512-ifK0CgjALofS5bkrcTy4RaQ9Vx2Knf/eLeIO+NaswQEpH1UblrtTSCIvN71qQDMq0PeQ/SSPojvEJp9vvvfr+w==", "license": "ISC", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "^22.22.2 || ^24.15.0 || >=26.0.0" } }, "node_modules/isexe": { @@ -213,6 +226,12 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, "node_modules/kubernetes-types": { "version": "1.30.0", "resolved": "https://registry.npmjs.org/kubernetes-types/-/kubernetes-types-1.30.0.tgz", @@ -220,18 +239,18 @@ "license": "Apache-2.0" }, "node_modules/msgpackr": { - "version": "1.11.12", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.12.tgz", - "integrity": "sha512-RBdJ1Un7yGlXWajrkxcSa93nvQ0w4zBf60c0yYv7YtBelP8H2FA7XsfBbMHtXKXUMUxH7zV3Zuozh+kUQWhHvg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-2.0.5.tgz", + "integrity": "sha512-cef05H/dSYpLpqp3sj/qyZh5vhUYCalnaLO7j1yOmpsR0y/XwLVtK7r5gn+U/F7CTEfMowcGhlUQJDLcLf7jcA==", "license": "MIT", "optionalDependencies": { - "msgpackr-extract": "^3.0.2" + "msgpackr-extract": "^3.0.4" } }, "node_modules/msgpackr-extract": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", - "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.4.tgz", + "integrity": "sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw==", "hasInstallScript": true, "license": "MIT", "optional": true, @@ -242,18 +261,18 @@ "download-msgpackr-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.4", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.4", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.4", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.4", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.4", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.4" } }, "node_modules/multipasta": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/multipasta/-/multipasta-0.2.7.tgz", - "integrity": "sha512-KPA58d68KgGil15oDqXjkUBEBYc00XvbPj5/X+dyzeo/lWm9Nc25pQRlf1D+gv4OpK7NM0J1odrbu9JNNGvynA==", + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/multipasta/-/multipasta-0.2.8.tgz", + "integrity": "sha512-ZPWuMKyv0cSO29f7hozp+k6+crZbQijV8ipMvxNxRf2SwtYGTX1ZX89Kd20VV4H9Znonx+EQn+iy1wGQsJ+b+Q==", "license": "MIT" }, "node_modules/node-gyp-build-optional-packages": { @@ -281,9 +300,9 @@ } }, "node_modules/pure-rand": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-8.4.0.tgz", - "integrity": "sha512-IoM8YF/jY0hiugFo/wOWqfmarlE6J0wc6fDK1PhftMk7MGhVZl88sZimmqBBFomLOCSmcCCpsfj7wXASCpvK9A==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-8.4.2.tgz", + "integrity": "sha512-vvuOGgcuPJAirlHvuQw1TrOiw7ptaIXXmIbNuiNOY6lNGJJH49PQ1Kj4nd783nPdQhQdicgOjVI2yI/9BD6/Ng==", "funding": [ { "type": "individual", @@ -318,18 +337,18 @@ } }, "node_modules/toml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/toml/-/toml-4.1.1.tgz", - "integrity": "sha512-EBJnVBr3dTXdA89WVFoAIPUqkBjxPMwRqsfuo1r240tKFHXv3zgca4+NJib/h6TyvGF7vOawz0jGuryJCdNHrw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/toml/-/toml-4.3.0.tgz", + "integrity": "sha512-lVb8X9BsPVuH0M4BKeS91tXAmJvCjQ5UIyAbQFaxkKGyUFK2RPkhwaFSQH8vbpl1d23eu/IBH+dwVMHWaq9A5A==", "license": "MIT", "engines": { "node": ">=20" } }, "node_modules/uuid": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.2.tgz", - "integrity": "sha512-vzi9uRZ926x4XV73S/4qQaTwPXM2JBj6/6lI/byHH1jOpCzb0zDbfytgA9LcN/hzb2l7WQSQnxITOVx5un/wGw==", + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.1.tgz", + "integrity": "sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" diff --git a/sandbox/Dockerfile b/sandbox/Dockerfile index fa6a727..03dc940 100644 --- a/sandbox/Dockerfile +++ b/sandbox/Dockerfile @@ -142,8 +142,8 @@ RUN chmod 755 /root && \ chmod a+rx /usr/local/bin/abra 2>/dev/null || true # Pre-create home directory for the claude user -RUN mkdir -p /home/claude/.claude /home/claude/.local/bin /home/claude/.config /home/claude/.abra && \ - chmod -R 755 /home/claude +RUN mkdir -p /home/assistant/.claude /home/assistant/.local/bin /home/assistant/.config /home/assistant/.abra && \ + chmod -R 755 /home/assistant COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh diff --git a/sandbox/README.md b/sandbox/README.md index 71a9739..d8a266f 100644 --- a/sandbox/README.md +++ b/sandbox/README.md @@ -39,7 +39,7 @@ The Python wrapper does three things: ### `entrypoint.sh` — user mapping -The entrypoint creates a non-root `claude` user inside the container whose UID/GID matches your host user. This means files Claude creates or edits have the right ownership on your host filesystem. +The entrypoint creates a non-root `assistant` user inside the container whose UID/GID matches your host user. This means files Claude creates or edits have the right ownership on your host filesystem. ### `docker-compose.yml` — persistence diff --git a/sandbox/claude.py b/sandbox/assistant.py similarity index 100% rename from sandbox/claude.py rename to sandbox/assistant.py diff --git a/sandbox/docker-compose.yml b/sandbox/docker-compose.yml index d859be2..e122aeb 100644 --- a/sandbox/docker-compose.yml +++ b/sandbox/docker-compose.yml @@ -1,5 +1,5 @@ services: - claude: + assistant: image: sandbox env_file: - path: ./.env @@ -10,7 +10,7 @@ services: volumes: - .:/workspace # default; overridden by claude.py at runtime - claude_target:/workspace/target # persist Rust build cache - - claude_userhome:/home/claude # persist Claude settings, auth, history + - assistant_userhome:/home/claude # persist Claude settings, auth, history - ./.container-abra:/home/claude/.abra # default; overridden by claude.py at runtime - tailscale_state:/var/lib/tailscale # persist Tailscale auth across restarts tty: true @@ -18,5 +18,5 @@ services: volumes: claude_target: - claude_userhome: + assistant_userhome: tailscale_state: diff --git a/sandbox/entrypoint.sh b/sandbox/entrypoint.sh index d36987e..d456106 100644 --- a/sandbox/entrypoint.sh +++ b/sandbox/entrypoint.sh @@ -7,9 +7,9 @@ HOST_GID=${HOST_GID:-0} DEFAULT_UID=${DEFAULT_UID:-1000} DEFAULT_GID=${DEFAULT_GID:-1000} -CLAUDE_USER=${CLAUDE_USER:-claude} -CLAUDE_GROUP=${CLAUDE_GROUP:-claude} -CLAUDE_HOME=${CLAUDE_HOME:-/home/${CLAUDE_USER}} +ASSISTANT_USER=${ASSISTANT_USER:-assistant} +ASSISTANT_GROUP=${ASSISTANT_GROUP:-claude} +ASSISTANT_HOME=${ASSISTANT_HOME:-/home/${ASSISTANT_USER}} if [ "$HOST_UID" -eq 0 ] && [ "$HOST_GID" -eq 0 ]; then HOST_UID=$DEFAULT_UID @@ -17,39 +17,39 @@ if [ "$HOST_UID" -eq 0 ] && [ "$HOST_GID" -eq 0 ]; then fi if getent group "$HOST_GID" >/dev/null 2>&1; then - CLAUDE_GROUP="$(getent group "$HOST_GID" | cut -d: -f1)" + ASSISTANT_GROUP="$(getent group "$HOST_GID" | cut -d: -f1)" else - groupadd -g "$HOST_GID" "$CLAUDE_GROUP" + groupadd -g "$HOST_GID" "$ASSISTANT_GROUP" fi # Ensure home exists, but don't recreate it -if [ ! -d "$CLAUDE_HOME" ]; then - mkdir -p "$CLAUDE_HOME" - chown "$HOST_UID:$HOST_GID" "$CLAUDE_HOME" +if [ ! -d "$ASSISTANT_HOME" ]; then + mkdir -p "$ASSISTANT_HOME" + chown "$HOST_UID:$HOST_GID" "$ASSISTANT_HOME" fi -chown -R "$HOST_UID:$HOST_GID" "$CLAUDE_HOME" +chown -R "$HOST_UID:$HOST_GID" "$ASSISTANT_HOME" -if id -u "$CLAUDE_USER" >/dev/null 2>&1; then +if id -u "$ASSISTANT_USER" >/dev/null 2>&1; then # Do NOT change -d (home) for existing user - usermod -u "$HOST_UID" -g "$CLAUDE_GROUP" "$CLAUDE_USER" + usermod -u "$HOST_UID" -g "$ASSISTANT_GROUP" "$ASSISTANT_USER" else # Only use -m when home doesn't already exist - useradd -u "$HOST_UID" -g "$CLAUDE_GROUP" -d "$CLAUDE_HOME" -s /bin/bash "$CLAUDE_USER" + useradd -u "$HOST_UID" -g "$ASSISTANT_GROUP" -d "$ASSISTANT_HOME" -s /bin/bash "$ASSISTANT_USER" fi # Grant passwordless sudo to claude user -echo "$CLAUDE_USER ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/claude -chmod 440 /etc/sudoers.d/claude +echo "$ASSISTANT_USER ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/assistant +chmod 440 /etc/sudoers.d/assistant -install -d -m 0755 -o "$HOST_UID" -g "$HOST_GID" "$CLAUDE_HOME/.local" -install -d -m 0755 -o "$HOST_UID" -g "$HOST_GID" "$CLAUDE_HOME/.local/bin" -install -d -m 0755 -o "$HOST_UID" -g "$HOST_GID" "$CLAUDE_HOME/.config" -install -d -m 0755 -o "$HOST_UID" -g "$HOST_GID" "$CLAUDE_HOME/.claude" -install -d -m 0755 -o "$HOST_UID" -g "$HOST_GID" "$CLAUDE_HOME/.abra" +install -d -m 0755 -o "$HOST_UID" -g "$HOST_GID" "$ASSISTANT_HOME/.local" +install -d -m 0755 -o "$HOST_UID" -g "$HOST_GID" "$ASSISTANT_HOME/.local/bin" +install -d -m 0755 -o "$HOST_UID" -g "$HOST_GID" "$ASSISTANT_HOME/.config" +install -d -m 0755 -o "$HOST_UID" -g "$HOST_GID" "$ASSISTANT_HOME/.claude" +install -d -m 0755 -o "$HOST_UID" -g "$HOST_GID" "$ASSISTANT_HOME/.abra" # Copy Claude binaries to user's local bin (always, to ensure upgrades apply) -cp -r /root/.local/bin/* "$CLAUDE_HOME/.local/bin/" 2>/dev/null || true -chown -R "$HOST_UID:$HOST_GID" "$CLAUDE_HOME/.local/bin" +cp -r /root/.local/bin/* "$ASSISTANT_HOME/.local/bin/" 2>/dev/null || true +chown -R "$HOST_UID:$HOST_GID" "$ASSISTANT_HOME/.local/bin" if [ -d /workspace ]; then chown -R "$HOST_UID:$HOST_GID" /workspace 2>/dev/null || true @@ -59,15 +59,15 @@ if [ -d /workspace/target ]; then fi # Set up PATH in user's bashrc to avoid "~/.local/bin not in PATH" warning -if ! grep -q 'export PATH="\$HOME/.local/bin:\$PATH"' "$CLAUDE_HOME/.bashrc" 2>/dev/null; then - echo 'export PATH="$HOME/.local/bin:$PATH"' >> "$CLAUDE_HOME/.bashrc" - chown "$HOST_UID:$HOST_GID" "$CLAUDE_HOME/.bashrc" +if ! grep -q 'export PATH="\$HOME/.local/bin:\$PATH"' "$ASSISTANT_HOME/.bashrc" 2>/dev/null; then + echo 'export PATH="$HOME/.local/bin:$PATH"' >> "$ASSISTANT_HOME/.bashrc" + chown "$HOST_UID:$HOST_GID" "$ASSISTANT_HOME/.bashrc" fi -export PATH="$CLAUDE_HOME/.local/bin:$CLAUDE_HOME/.cargo/bin:/usr/local/bin:$PATH" +export PATH="$ASSISTANT_HOME/.local/bin:$ASSISTANT_HOME/.cargo/bin:/usr/local/bin:$PATH" if [ $# -gt 0 ]; then - exec gosu "$CLAUDE_USER" "$@" + exec gosu "$ASSISTANT_USER" "$@" else - exec gosu "$CLAUDE_USER" "$CLAUDE_HOME/.local/bin/claude" --dangerously-skip-permissions + exec gosu "$ASSISTANT_USER" "$ASSISTANT_HOME/.local/bin/assistant" --dangerously-skip-permissions fi