From 2a41a3302b44ea575b5939dfc1ff0636cb6c43c1 Mon Sep 17 00:00:00 2001 From: Jared Miller Date: Wed, 28 Jan 2026 16:59:36 -0500 Subject: [PATCH] Add compiled binary support with env var config - Read CLAUDE_REMOTE_SECRET and CLAUDE_REMOTE_SERVER from env - Make -- separator optional (all args pass through to claude) - Add --help support (shows wrapper info, passes to claude if configured) - Update README with binary build/install instructions - Add binary to .gitignore --- .gitignore | 1 + README.md | 57 ++++++++++++++++++++++++++++++------------------------ src/cli.ts | 29 ++++++++++++++++++++++++--- 3 files changed, 59 insertions(+), 28 deletions(-) diff --git a/.gitignore b/.gitignore index f898bb0..691f33f 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,4 @@ report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json # Finder (MacOS) folder config .DS_Store +claude-remote diff --git a/README.md b/README.md index c9f0262..03837fa 100644 --- a/README.md +++ b/README.md @@ -11,10 +11,19 @@ just dev # 2. create a device (one-time setup) just seed dev "My Phone" -# 3. run claude through the wrapper (from any project directory) -bun /path/to/claude-remote/src/cli.ts --secret dev -- --dangerously-skip-permissions +# 3. build the binary + symlink to ~/bin +bun build --compile src/cli.ts --outfile claude-remote +ln -sf $(pwd)/claude-remote ~/bin/claude-remote -# 4. open browser +# 4. set your secret +export CLAUDE_REMOTE_SECRET=dev # add to .bashrc/.zshrc + +# 5. use it like claude +claude-remote +claude-remote -r +claude-remote --dangerously-skip-permissions + +# 6. open browser/phone open http://localhost:7200 ``` @@ -44,40 +53,38 @@ Default if you just run `just seed`: ### run claude -Instead of running `claude` directly, run it through the wrapper: +With the binary installed and `CLAUDE_REMOTE_SECRET` set, just use `claude-remote` like `claude`: ```bash -bun /path/to/claude-remote/src/cli.ts --secret -- +claude-remote # interactive +claude-remote -r # resume +claude-remote --help # shows help +claude-remote -p "explain this" # print mode ``` -Examples: +All arguments pass through to claude. + +### configuration + +Environment variables (add to .bashrc/.zshrc): ```bash -# basic -bun src/cli.ts --secret dev -- --dangerously-skip-permissions - -# resume -bun src/cli.ts --secret dev -- --dangerously-skip-permissions -r - -# any other claude args -bun src/cli.ts --secret dev -- --help +export CLAUDE_REMOTE_SECRET=dev # required +export CLAUDE_REMOTE_SERVER=ws://localhost:7200/ws # optional, this is the default ``` -The wrapper can be run from any directory - it passes through to claude with your current working directory. +Or use flags to override: + +```bash +claude-remote --secret other-device --server ws://remote:7200/ws +``` ### shell aliases -If you have aliases like: - ```bash -alias cd!='claude --dangerously-skip-permissions' -alias cdr='cd! -r' -``` - -Create equivalent remote aliases: - -```bash -alias crd='bun /path/to/claude-remote/src/cli.ts --secret dev -- --dangerously-skip-permissions' +alias cr='claude-remote' +alias crr='claude-remote -r' +alias crd='claude-remote --dangerously-skip-permissions' alias crdr='crd -r' ``` diff --git a/src/cli.ts b/src/cli.ts index 0466ccb..fa9034a 100755 --- a/src/cli.ts +++ b/src/cli.ts @@ -14,8 +14,10 @@ interface Args { function parseArgs(): Args { const args = process.argv.slice(2); - let server = "ws://localhost:7200/ws"; - let secret = ""; + + // Read config from env vars first + let server = process.env.CLAUDE_REMOTE_SERVER || "ws://localhost:7200/ws"; + let secret = process.env.CLAUDE_REMOTE_SECRET || ""; const claudeArgs: string[] = []; let i = 0; @@ -26,7 +28,28 @@ function parseArgs(): Args { } else if (args[i] === "--secret" && i + 1 < args.length) { secret = args[i + 1] as string; i += 2; + } else if (args[i] === "--help") { + // If we have a secret, show brief info then pass through to claude + if (secret) { + console.log("claude-remote: PTY wrapper for claude CLI"); + console.log("Streaming to:", server); + console.log("\nPassing through to claude:\n"); + claudeArgs.push(args[i] as string); + i++; + } else { + // No secret configured, just show our help + console.log("claude-remote: PTY wrapper for claude CLI"); + console.log("\nConfiguration:"); + console.log(" CLAUDE_REMOTE_SECRET - authentication secret (required)"); + console.log(" CLAUDE_REMOTE_SERVER - server URL (default: ws://localhost:7200/ws)"); + console.log("\nFlags:"); + console.log(" --secret - override CLAUDE_REMOTE_SECRET"); + console.log(" --server - override CLAUDE_REMOTE_SERVER"); + console.log("\nAll other arguments are passed through to claude."); + process.exit(0); + } } else if (args[i] === "--") { + // -- separator is optional, just skip it claudeArgs.push(...args.slice(i + 1)); break; } else { @@ -36,7 +59,7 @@ function parseArgs(): Args { } if (!secret) { - console.error("Error: --secret is required"); + console.error("No secret configured. Set CLAUDE_REMOTE_SECRET or use --secret"); process.exit(1); }