{"slug": "claude-p-drop-in-replacement-after-jun-15th", "title": "Claude -p drop-in replacement after Jun 15th", "summary": "Desplega.ai released claude-bridge, a drop-in replacement for Claude Code's `-p` print mode that routes prompts through a detached tmux session instead of directly to the CLI. The tool intercepts prompt dispatch, transcript capture, and output formatting to bypass Claude's startup dialogs and permission prompts while maintaining compatibility with existing `--output-format` flags. Users can run the bridge via `bunx @desplega.ai/claude-bridge` as a direct substitute for `claude -p` commands starting June 15th.", "body_md": "`claude-bridge`\n\nis a bridge-owned replacement for common `claude -p`\n\nautomation.\n\nInstead of delegating to raw `claude -p`\n\n, it starts normal interactive Claude\nCode inside a detached [tmux](https://github.com/tmux/tmux) pane, sends your\nprompt through tmux, tails Claude's own on-disk transcript, formats the reply,\nand exits at turn end.\n\nThat keeps prompt dispatch, transcript capture, `--output-format`\n\n, JSON schema\nvalidation, and process exit behavior inside the bridge.\n\n```\n# Raw Claude Code print mode\nclaude -p \"say hi\" --output-format json\n\n# Bridge-owned replacement\nbunx @desplega.ai/claude-bridge -p \"say hi\" --output-format json\n```\n\nThe transcript source is the same JSONL file Claude writes under\n`~/.claude/projects/<slug>/<session-uuid>.jsonl`\n\n. Outside print mode, piped\nconsumers get bridge envelopes and TTY users get a compact readable view. The\ntranscript tailing follows the\n[Shannon](https://github.com/dexhorthy/shannon) technique: snapshot the\npre-existing `*.jsonl`\n\nset before launch, poll for a fresh file, and\npoll-and-reparse it every 100 ms.\n\nThe orchestrator also pre-clears the prompts that would otherwise block Claude's UI:\n\n- Claude's global config is edited so\n`projects[<workdir>].hasTrustDialogAccepted`\n\nand`hasCompletedProjectOnboarding`\n\nare set. This is`~/.claude.json`\n\nby default, or`$CLAUDE_CONFIG_DIR/.claude.json`\n\nwhen`CLAUDE_CONFIG_DIR`\n\nis set. The previous file is backed up alongside it as`.claude.json.claude-bridge-backup`\n\n. - A per-workdir\n`.claude/settings.local.json`\n\nsets`defaultMode: \"bypassPermissions\"`\n\nand`skipDangerousModePermissionPrompt: true`\n\n. `claude`\n\nis launched with`--dangerously-skip-permissions`\n\n.- Theme/security startup prompts are auto-accepted by watching\n`tmux capture-pane`\n\nfor marker text and sending`Enter`\n\n. With`--desplega-local-auth`\n\n, the custom API key confirmation prompt is also auto-accepted. Login-method selection is deliberately not auto-accepted.\n\n```\n+--------------------+\n| claude-bridge      |\n|  - tmux paste      |\n|  - transcript tail |\n+----------+---------+\n           |\n           | tmux paste-buffer + Enter\n           v\n    +------+-----------------------------+\n    |  tmux session  claude-bridge-<id>  |\n    |   pane 0: claude --dangerously-... |\n    +------------------------------------+\n```\n\n[Bun](https://bun.sh)(`>= 1.1`\n\n)`claude`\n\nCLI on PATH, version`>= 2.1.80`\n\n`tmux`\n\non PATH.- Claude Code authenticated for the spawned\n`claude`\n\nprocess.\n\nRun without installing:\n\n```\n# Drop-in print-mode usage.\nbunx @desplega.ai/claude-bridge -p \"say hi\"\nbunx @desplega.ai/claude-bridge -p \"say hi\" --output-format json\nbunx @desplega.ai/claude-bridge -p \"say hi\" --output-format stream-json\n\n# Opt in to Desplega/bridge envelopes for bridge-specific consumers.\nbunx @desplega.ai/claude-bridge -p \"say hi\" --output-format stream-json --desplega-format\n```\n\nInstall globally with Bun:\n\n```\nbun install -g @desplega.ai/claude-bridge\nclaude-bridge -p \"say hi\"\nclaude-bridge --help\n```\n\nInstall globally with npm:\n\n```\nnpm install -g @desplega.ai/claude-bridge\nclaude-bridge -p \"say hi\"\n```\n\nThe installed command is `claude-bridge`\n\n. Bun is still required at runtime\nbecause the published bin uses `#!/usr/bin/env bun`\n\n.\n\n```\nclaude-bridge -p \"say hi\"\nclaude-bridge -p \"say hi\" --model sonnet\nclaude-bridge -p \"say hi\" --output-format json\nclaude-bridge -p \"say hi\" --output-format stream-json\nprintf 'say hi\\n' | claude-bridge --print\n```\n\nPrint mode is intended for shell automation that would otherwise call\n`claude -p`\n\n:\n\n```\nclaude -p \"say hi\" --output-format json\nclaude-bridge -p \"say hi\" --output-format json\n\nclaude -p \"say hi\" --output-format stream-json\nclaude-bridge -p \"say hi\" --output-format stream-json\n```\n\nThis is intended as a drop-in replacement for common `claude -p`\n\nautomation.\nIn print mode the wrapper starts an interactive Claude session in tmux, waits\nfor the pane to become ready, sends the prompt through tmux, prints the\nrequested format, then kills the tmux session.\n\nBy default, print-mode stdout is reserved for the requested Claude-compatible\noutput. Bridge envelopes and bridge debug events are not written to stdout in\n`json`\n\nor `stream-json`\n\nmode unless you explicitly pass `--desplega-format`\n\n.\n\n`claude-bridge`\n\ndoes not call the Anthropic API itself. It launches the local\n`claude`\n\nCLI and relies on whatever authentication that `claude`\n\nprocess can\nuse.\n\nFor local interactive machines, first make sure `claude`\n\nworks:\n\n```\nclaude auth status\nclaude -p \"say hi\"\n```\n\nThen run the bridge:\n\n```\nclaude-bridge -p \"say hi\"\n```\n\nFor headless CI, use the long-lived Claude Code OAuth token from:\n\n```\nclaude setup-token\n```\n\nSet it exactly as printed:\n\n```\nexport CLAUDE_CODE_OAUTH_TOKEN=sk-ant-oat01-...\nclaude-bridge -p \"say hi\" --output-format json\n```\n\nBy default, the spawned Claude process receives `HOME`\n\n, `CLAUDE_CONFIG_DIR`\n\n,\nand `CLAUDE_CODE_OAUTH_TOKEN`\n\n; Anthropic provider env vars such as\n`ANTHROPIC_API_KEY`\n\nand `ANTHROPIC_AUTH_TOKEN`\n\nare cleared so the bridge does\nnot accidentally test a different auth path.\n\nUse `--desplega-local-auth`\n\nwhen you intentionally want the spawned Claude\nprocess to receive local auth-related env vars. If Claude shows the custom API\nkey confirmation prompt, this mode selects the API-key path:\n\n```\nANTHROPIC_API_KEY=... claude-bridge --desplega-local-auth -p \"say hi\"\n```\n\nIf Claude shows a browser login or login-method selector, the bridge will not\nauto-select it. Run `claude auth status`\n\n, run `claude setup-token`\n\n, or attach\nto the tmux pane shown in the banner and complete the prompt manually.\n\n`-p`\n\n/`--print`\n\nrequires a prompt argument or piped stdin. `--output-format`\n\nrequires print mode and accepts `text`\n\n, `json`\n\n, or `stream-json`\n\n; the default is\n`text`\n\n. `--json-schema`\n\nis also print-only.\n\nCompatibility mode is the default. If you are replacing `claude -p`\n\nin scripts,\ndo not pass `--desplega-format`\n\n.\n\nThe final result comes from the transcript. When Claude writes a `system`\n\n`turn_duration`\n\nrow, the wrapper uses the latest assistant text it saw in that\nturn.\n\n`text`\n\n: prints only the final answer text plus a trailing newline. Wrapper errors go to stderr and exit non-zero.`json`\n\n: prints one final Claude-compatible JSON result object with the answer in`result`\n\n, plus available transcript metadata such as`session_id`\n\n,`duration_ms`\n\n, and`usage`\n\n.`stream-json`\n\n: streams raw Claude transcript JSONL rows as they are written. The bridge does not wrap them in custom envelopes.\n\nUse `--desplega-format`\n\nwhen you want the older bridge-owned JSON envelopes in\n`json`\n\nor `stream-json`\n\nmodes. This flag is for bridge-specific consumers, not\ndrop-in `claude -p`\n\nreplacement scripts:\n\n```\nclaude-bridge -p \"say hi\" --output-format stream-json --desplega-format\n```\n\nWith `--desplega-format`\n\n, `json`\n\nincludes bridge debug metadata when\n`--desplega-verbose`\n\nis set, and `stream-json`\n\nprints newline-delimited bridge\nevents as the run progresses, then a final `result`\n\nevent. This is a custom\n`claude-bridge`\n\nevent stream, not Claude's native `stream-json`\n\nschema.\n\nTypical `--desplega-format --output-format stream-json`\n\nevent types are:\n\n```\n{\"type\":\"push\",\"id\":\"ab12cd34\",\"content\":\"say hi\"}\n{\"type\":\"transcript_folder\",\"path\":\"/Users/.../.claude/projects/...\"}\n{\"type\":\"transcript_open\",\"path\":\"/Users/.../<uuid>.jsonl\",\"session_id\":\"...\"}\n{\"type\":\"transcript\",\"row\":{\"type\":\"assistant\",\"message\":{...}}}\n{\"type\":\"result\",\"subtype\":\"success\",\"is_error\":false,\"result\":\"Hi.\",\"session_id\":\"...\"}\n```\n\nThese custom `transcript`\n\nevents only exist with `--desplega-format`\n\n. In the\ndefault compatibility mode, the same Claude data is written as the top-level\nJSONL row.\n\n`--json-schema <schema|file>`\n\nis bridge-owned. It is not forwarded to raw\n`claude -p`\n\n; the wrapper keeps the normal tmux/transcript path, injects schema\nguidance with `--append-system-prompt`\n\n, extracts the last JSON value from the\nfinal assistant text, and validates it locally with Zod.\n\nExisting user-provided `--append-system-prompt`\n\nvalues are preserved. When a\nschema is present, the wrapper merges those prompts with its schema instruction\ninstead of replacing them.\n\nSchema print mode also installs a global Claude Code `Stop`\n\nhook in\n`~/.claude/settings.json`\n\n. The hook is inert outside `claude-bridge`\n\nschema\nruns; during a schema run it checks the final assistant text before Claude\nstops and blocks the stop if it does not validate. That gives Claude a bounded\nnumber of extra turns to answer with valid JSON before the wrapper exits.\n\nControl that hook explicitly with:\n\n```\nclaude-bridge --desplega-install\nclaude-bridge --desplega-uninstall\n```\n\nInstall is append-only and idempotent: unrelated hooks are preserved, and stale\nold `claude-bridge`\n\nhook commands are replaced with the current command.\n\nThe schema argument may be inline JSON or a path to a JSON file:\n\n```\nclaude-bridge -p \"Return the repo name\" \\\n  --json-schema '{\"type\":\"object\",\"required\":[\"name\"],\"properties\":{\"name\":{\"type\":\"string\"}}}' \\\n  --output-format json\n\nclaude-bridge -p \"Return the repo name\" \\\n  --json-schema ./schema.json \\\n  --output-format text\n```\n\nExtraction is intentionally simple and deterministic:\n\n- Try the whole reply as JSON.\n- Otherwise use the last fenced\n`json`\n\nblock. - Otherwise use the final balanced JSON object or array in the reply.\n\nValidation uses Zod's `z.fromJSONSchema()`\n\nconverter. That API is still marked\nexperimental by Zod, but it keeps the bridge aligned with Zod's JSON Schema\nsupport instead of maintaining a handwritten validator here. If Zod cannot\nconvert the schema, the wrapper treats that as a print-mode error.\n\nWith `--output-format text`\n\n, successful schema mode prints the extracted JSON\nvalue as compact JSON. With `--output-format json`\n\n, the final result includes\n`structured_output`\n\nalongside the original reply text in `result`\n\n. With\n`--desplega-format`\n\n, bridge JSON results also include\n`structured_output_source`\n\n.\n\nIf schema extraction or validation fails after Claude replies, `json`\n\nand\n`stream-json`\n\nerror results include `raw_response`\n\nwith the unmodified Claude\nreply. In `text`\n\nmode the same raw reply is printed to stderr under\n`Raw Claude reply:`\n\n.\n\nThe compact stringified schema is capped before Claude starts. The default cap\nis roughly `15000`\n\ntokens, estimated as `ceil(chars / 4)`\n\n. Configure it with:\n\n```\nCLAUDE_BRIDGE_JSON_SCHEMA_MAX_TOKENS=30000 claude-bridge -p \"...\" --json-schema schema.json\nclaude-bridge -p \"...\" --json-schema schema.json --desplega-json-schema-max-tokens=30000\n```\n\nThe wrapper owns these options and does not forward them to Claude:\n\n`-p`\n\n/`--print`\n\n,`--output-format`\n\n, and`--json-schema`\n\n`--desplega-verbose`\n\n,`--desplega-local-auth`\n\n, and other`--desplega-<name>[=<value>]`\n\nflags`--claude-help`\n\n`-h`\n\n/`--help`\n\n`-v`\n\n/`--version`\n\nMost interactive `claude -h`\n\noptions pass through to the spawned Claude session,\nfor example `--model sonnet`\n\n, `--permission-mode acceptEdits`\n\n, `--append-system-prompt`\n\n,\nor `--allowed-tools`\n\n. The wrapper always prepends its own launch flags:\n`--dangerously-skip-permissions`\n\n.\n\nThe initial prompt is wrapper-owned too. It is not passed to Claude as a CLI argument; once the pane is ready, the wrapper sends it through tmux. In non-print mode, stdin remains a small REPL that sends each entered line through the same tmux/transcript bridge.\n\nClaude subcommands are intentionally blocked; run `claude <cmd>`\n\ndirectly for\ncommands such as `doctor`\n\n, `mcp`\n\n, `plugin`\n\n, `update`\n\n, `agents`\n\n, or `auth`\n\n.\nClaude modes that conflict with the bridge are also blocked: `--tmux`\n\n,\n`--replay-user-messages`\n\n/`--replay*`\n\n, and `-w`\n\n/`--worktree`\n\n.\n\nUse `--claude-help`\n\nto see raw Claude help, with the caveat that wrapper-owned\nmodes behave as described here. Use `-v`\n\n/`--version`\n\nto print the wrapper\npackage version, the full `claude`\n\npath from `which claude`\n\n, and the\n`claude -v`\n\noutput.\n\nUse `--desplega-verbose`\n\nfor extra wrapper debug output and raw transcript\nrows. Other `--desplega-<name>[=<value>]`\n\nflags are reserved for future wrapper\nfeatures and are not forwarded to Claude.\n\nThe CLI prints a banner with the tmux session name and run state path:\n\n```\n   tmux session : claude-bridge-2026abcd\n   cwd          : /path/to/current/project\n   run state    : /path/to/current/project/.claude-bridge/runs/2026-05-15T.../\n\n   attach to the Claude UI in another terminal:\n     tmux attach -t claude-bridge-2026abcd\n\n   Type a message + Enter on stdin to send it to Claude.\n   Assistant and useful transcript rows print below.\n   Use --desplega-verbose for raw transcript rows and wrapper debug.\n   Ctrl-D to quit (kills the tmux session).\n\n>\n```\n\nWhen stdout is a TTY, the orchestrator pretty-prints a human-friendly feed:\n\n```\n14:02:17 transcript /Users/taras/.claude/projects/.../<uuid>.jsonl\n14:02:21 → push     id=a1b2c3 what files exist?\n14:02:22 user       what files exist?\n14:02:22 assistant  Let me check.\n                    [tool_use Bash {\"command\":\"ls\"}]\n14:02:23 user       [tool_result] file.txt\\n.gitignore\n14:02:23 assistant  I found two files: file.txt and .gitignore.\n14:02:23 system     turn_duration=2345ms\n```\n\nBy default, TTY output hides raw transcript metadata and only shows useful\nhuman-friendly rows. `--desplega-verbose`\n\nadds wrapper debug output and the\nverbatim JSONL row dimmed below each friendly transcript summary.\n\n```\nclaude-bridge --desplega-verbose             # friendly rows plus raw rows\n```\n\nThe orchestrator shows a `> `\n\nprompt for stdin and redraws it after every\noutput line, so you always know where you can type.\n\nAttach the live Claude UI in another terminal if you want to see what Claude is doing:\n\n```\ntmux attach -t claude-bridge-2026abcd\n```\n\nThe orchestrator pre-accepts trust and dangerous-mode prompts, and watches for theme/security prompts. You shouldn't need to touch the pane unless Claude asks for login selection or authentication.\n\nNow type in the orchestrator window:\n\n```\nwhat's in the current directory?\n```\n\nStdout will show, in order: the `push`\n\nenvelope, a stream of `transcript`\n\nenvelopes as Claude works (each row is whatever Claude wrote to the JSONL —\nuser, assistant, tool_use, tool_result, system, etc.):\n\n```\n{\"type\":\"push\",\"id\":\"ab12cd34\",\"content\":\"what's in the current directory?\"}\n{\"type\":\"transcript_open\",\"path\":\"/Users/.../<uuid>.jsonl\",\"session_id\":\"...\"}\n{\"type\":\"transcript\",\"row\":{\"type\":\"user\",\"message\":{...}}}\n{\"type\":\"transcript\",\"row\":{\"type\":\"assistant\",\"message\":{...}}}\n{\"type\":\"transcript\",\"row\":{\"type\":\"tool_use\",\"name\":\"Bash\",\"input\":{...}}}\n{\"type\":\"transcript\",\"row\":{\"type\":\"tool_result\",\"output\":\"...\"}}\n```\n\nCtrl-D on the orchestrator kills the tmux session and exits.\n\nInstall local dependencies:\n\n```\nbun install\n```\n\nRun the CLI from the repo:\n\n```\nbun ./src/cli.ts -p \"say hi\"\nbun ./src/cli.ts -p \"say hi\" --output-format json\nbun ./src/cli.ts --help\n```\n\nRun deterministic tests:\n\n```\nbun run test\nbun run typecheck\n```\n\nThe smallest hermetic smoke test does not require tmux or Claude:\n\nA hermetic test stands up the Unix socket, spawns `mcp-channel.ts`\n\nas a stdio\nMCP subprocess, drives it through `initialize`\n\n/ `tools/list`\n\n/ `tools/call`\n\n,\nand asserts that push envelopes become channel notifications and that reply\ntool calls produce reply envelopes back on the socket:\n\n```\nbun run test:smoke\n```\n\nExpected: 13 PASS lines and `result: PASS`\n\n.\n\n`.github/workflows/ci.yml`\n\nruns deterministic tests and typechecking on pushes\nand pull requests.\n\nThe workflow also has a gated live smoke job. If the GitHub Actions environment\nhas `CLAUDE_CODE_OAUTH_TOKEN`\n\navailable, it installs `tmux`\n\nand Claude Code,\nnormalizes that token into the job environment, and then runs a matrix across:\n\n`--output-format text`\n\n`--output-format json`\n\n`--output-format stream-json`\n\n- schema mode enabled and disabled\n\nIf the secret is not available, the live smoke is skipped while the\ndeterministic job still runs. Use the `CLAUDE_CODE_OAUTH_TOKEN`\n\npath exactly as\n`claude setup-token`\n\nprints it; do not remap it to `ANTHROPIC_AUTH_TOKEN`\n\n.\nThe smoke command clears inherited `ANTHROPIC_*`\n\nvariables so unrelated\nprovider headers or API-key configuration cannot change the auth path under\ntest.\n\nThe workflow uses a reusable script that can be run locally:\n\n```\nCLAUDE_BRIDGE_SMOKE_OUTPUT_FORMAT=json \\\nCLAUDE_BRIDGE_SMOKE_SCHEMA=true \\\nbun run ci:live-smoke\n```\n\nTo run that script with local auth env vars instead of the CI OAuth-token path:\n\n```\nCLAUDE_BRIDGE_SMOKE_LOCAL_AUTH=true \\\nCLAUDE_BRIDGE_SMOKE_OUTPUT_FORMAT=json \\\nbun run ci:live-smoke\n```\n\nThe npm package is `@desplega.ai/claude-bridge`\n\n.\n\nSee [docs/releasing.md](/desplega-ai/claude-bridge/blob/master/docs/releasing.md) for the full release runbook.\n\nReleases are automated from `master`\n\n: when `package.json`\n\n's `version`\n\nchanges,\n`.github/workflows/release.yml`\n\nvalidates the package, publishes the public npm\npackage with `NPM_TOKEN`\n\n, creates the `vX.Y.Z`\n\ngit tag, and creates a GitHub\nRelease.\n\nPrepare a release on a branch:\n\n```\nnpm version --no-git-tag-version patch\nbun install\ngit add package.json bun.lock\n```\n\nThe package tarball is intentionally allowlisted in `package.json`\n\n. Keep tests,\nCI scripts, `.github`\n\n, `AGENTS.md`\n\n, and `CLAUDE.md`\n\nout of the public npm\npackage.\n\nStructured output should stay bridge-native. Future AI SDK integration can be a\nrepair or fallback layer after the transcript result, not a replacement for the\nbridge-owned turn. Plausible provider knobs are\n`--desplega-structured-provider=anthropic|openai|google|openrouter`\n\nwith the\nusual `ANTHROPIC_API_KEY`\n\n, `OPENAI_API_KEY`\n\n, `GOOGLE_GENERATIVE_AI_API_KEY`\n\n/\n`GEMINI_API_KEY`\n\n, or `OPENROUTER_API_KEY`\n\nenv vars. That mode would validate\nthe transcript result first, then optionally ask a provider to repair invalid\nJSON into the schema.\n\nRemote/SSH support should also keep the bridge boundary. The likely shape is a\ntransport abstraction (`tmux`\n\ntoday, HTTP MCP later) plus a tunnel abstraction\n(`none`\n\n, Tailscale Serve/Funnel, SSH reverse tunnel, cloudflared, ngrok). For a\nremote Claude session, the remote host still needs `claude`\n\n, `tmux`\n\n, Bun, and\nthe bridge entrypoint. Tunnels only expose/connect the transport; they do not\nremove the need for a Claude Code process on the remote host. Public tunnels\nsuch as Tailscale Funnel must require a per-run bearer token and should default\nto localhost binding unless explicitly exposed.\n\n`src/cli.ts`\n\n— orchestrator (tmux launcher + stdin REPL + transcript tail).`src/auth-env.ts`\n\n— auth environment forwarding and local-auth handling.`src/mcp-channel.ts`\n\n— optional channel MCP kept for hermetic protocol tests and future transport experiments.`src/bridge.ts`\n\n— newline-delimited JSON framing for the optional channel MCP.`src/transcript.ts`\n\n— Shannon-style transcript discovery + poll-and-tail.`src/preaccept.ts`\n\n— pre-writes Claude's global trust entry +`.claude/settings.local.json`\n\nto suppress trust and permission prompts.`src/hook-install.ts`\n\nand`src/stop-hook.ts`\n\n— install and execute the schema-only global Stop hook.- Each run writes its run state and schema copy under\n`.claude-bridge/runs/<id>/`\n\nin the target cwd.\n\nThe default CLI path does not depend on Claude Code Channels. The channel MCP is still present as an optional experimental transport. Its envelopes are JSON, newline-delimited:\n\n```\ntype Envelope =\n  | { kind: \"hello\"; pid: number; channel: string }                       // mcp -> orchestrator on connect\n  | { kind: \"push\"; id: string; content: string; meta?: Record<string,string> } // orchestrator -> mcp\n  | { kind: \"reply\"; chat_id: string; text: string };                     // mcp -> orchestrator\n```\n\n`push`\n\nbecomes a `notifications/claude/channel`\n\nevent for Claude; the `id`\n\ntravels in `meta.id`\n\n, so Claude sees:\n\n```\n<channel source=\"bridge\" id=\"ab12cd34\">what's in the current directory?</channel>\n```\n\nThe channel's `instructions`\n\ntell Claude to call `reply`\n\nwith `chat_id`\n\nset to\nthat same id so the orchestrator can correlate replies.\n\n- This is a single-pane POC. A real version would multiplex multiple sessions per orchestrator and persist transcripts.\n- This wrapper deliberately blocks Claude subcommands and bridge-conflicting\nmodes:\n`--tmux`\n\n,`-w`\n\n/`--worktree`\n\n, and`--replay-user-messages`\n\n/`--replay*`\n\n. Run`claude <cmd>`\n\nor raw`claude`\n\ndirectly for those modes. - The auto-acceptor for startup prompts is a regex over\n`tmux capture-pane`\n\n. If Claude's prompt copy changes the heuristic may miss it; you can still attach to the pane and press`Enter`\n\nyourself. - Permission prompts and tool approvals are pre-bypassed via\n`--dangerously-skip-permissions`\n\n.**This effectively runs Claude in auto-execute mode against the target cwd.** By default that is the current directory; use`--desplega-cwd <path>`\n\nwhen you need to point the run somewhere else, and do not point this at sensitive paths. - To relay permission prompts off the pane instead of bypassing them, a future\ntransport can either parse the transcript/pane or revive the optional channel\npath with\n`experimental['claude/channel/permission']`\n\n.", "url": "https://wpnews.pro/news/claude-p-drop-in-replacement-after-jun-15th", "canonical_source": "https://github.com/desplega-ai/claude-bridge", "published_at": "2026-06-04 19:28:09+00:00", "updated_at": "2026-06-04 19:50:35.836284+00:00", "lang": "en", "topics": ["ai-tools", "ai-infrastructure", "ai-agents", "large-language-models", "generative-ai"], "entities": ["Claude", "Desplega", "tmux", "Shannon"], "alternates": {"html": "https://wpnews.pro/news/claude-p-drop-in-replacement-after-jun-15th", "markdown": "https://wpnews.pro/news/claude-p-drop-in-replacement-after-jun-15th.md", "text": "https://wpnews.pro/news/claude-p-drop-in-replacement-after-jun-15th.txt", "jsonld": "https://wpnews.pro/news/claude-p-drop-in-replacement-after-jun-15th.jsonld"}}