Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
e8a1e8c
fix: honor stop_hook_active in the stop-review-gate hook (#548)
mittalpk Jul 27, 2026
bdfcd86
fix: surface the stop_hook_active skip via systemMessage
mittalpk Aug 15, 2026
208e07b
feat: enforce scoped Codex task reads
kilhyeonjun Sep 4, 2026
401ea76
fix: require scoped read directories
kilhyeonjun Sep 4, 2026
2522bf9
fix: preserve scoped workspace safeguards
kilhyeonjun Sep 4, 2026
9375ff1
fix: deny unapproved temp roots
kilhyeonjun Sep 4, 2026
22dac7a
fix: reject empty scoped roots
kilhyeonjun Sep 4, 2026
cacf227
feat: add task --resume-thread
Sep 4, 2026
4be1ab5
fix: support relocated Claude config transfers
Sep 4, 2026
08cd208
fix: route explicit resume threads through rescue
Sep 4, 2026
e123511
fix: persist review gate config outside transient state
Sep 4, 2026
a81f52f
test: isolate persistent review gate config
Sep 4, 2026
a958132
fix: contain staged Claude session imports
Sep 5, 2026
d1ac612
fix: reject unsafe staging ancestors
Sep 5, 2026
44eea53
test: pin explicit resume cwd rebinding
Sep 5, 2026
638f727
fix: allocate collision-free transfer staging
Sep 5, 2026
8f09814
fix: resolve Node outside minimal hook PATH
Sep 5, 2026
31b8b18
fix: preserve compatible Node toolchain PATH
Sep 5, 2026
a17c3da
test: tidy Node launcher regressions
Sep 5, 2026
cc0ffad
fix: preserve alternate Codex toolchain paths
Sep 5, 2026
866d3aa
fix: preserve transfer identity across staging retries
Sep 5, 2026
21b617c
fix: coordinate shared transfer staging leases
fscfede-beep Sep 5, 2026
75eda99
feat: add --sandbox <mode> to task and /codex:rescue
alirezarzg Sep 5, 2026
e5f3a38
docs: a resumed thread keeps its starting sandbox; test the worker on…
alirezarzg Sep 5, 2026
4151f04
feat: let --sandbox take precedence over --write instead of rejecting…
alirezarzg Sep 5, 2026
3d7b524
docs: say when a resumed thread keeps its sandbox
alirezarzg Sep 5, 2026
91cc73b
feat: read --sandbox only before the task text, and refuse a resume t…
alirezarzg Sep 5, 2026
f3803d2
fix: check the sandbox the app-server reports on resume, keep a mid-t…
alirezarzg Sep 5, 2026
89792b5
docs: --sandbox counts anywhere in the leading option block, not only…
alirezarzg Sep 5, 2026
c3e03cc
fix: an empty --sandbox value is an error, not the default
alirezarzg Sep 5, 2026
c462ced
fix: tokenize the raw task input once
alirezarzg Sep 5, 2026
32932ec
fix: infer a thread's starting sandbox only from records that carry one
alirezarzg Sep 5, 2026
011b1c4
test: the write resume in the legacy-record case is refused by the jo…
alirezarzg Sep 5, 2026
3d6c7d9
refactor: one parser rule and one resume check instead of a pre-parse…
alirezarzg Sep 5, 2026
959b0ec
fix: a resumed sandbox policy the plugin cannot compare is refused, n…
alirezarzg Sep 5, 2026
ff36d0a
fix: an inline boolean value must be exactly true or false
alirezarzg Sep 5, 2026
ef58bf1
fix: discover Windows Node installs in launcher
fscfede-beep Sep 5, 2026
1338ede
fix: complete portable launcher coverage
fscfede-beep Sep 5, 2026
a6855f3
fix: honor custom NVM_DIR in launcher
fscfede-beep Sep 5, 2026
64dcef9
fix: align launcher node with codex toolchain
fscfede-beep Sep 5, 2026
a420fc0
test: isolate portable launcher environment
fscfede-beep Sep 5, 2026
0ef6b73
fix: honor custom fnm directory
fscfede-beep Sep 5, 2026
2c6b255
fix: honor custom asdf and mise roots
fscfede-beep Sep 5, 2026
11007e4
test: preserve launcher test encoding
fscfede-beep Sep 5, 2026
e116d57
fix: honor Linuxbrew prefix in launcher
fscfede-beep Sep 5, 2026
66dcf2d
Support --effort on adversarial-review, and surface unrecognised options
taur-us Sep 6, 2026
912e98d
fix: make runCommand maxBuffer explicit
sylvesterkaczmarek Sep 6, 2026
4ab1fa2
fix: keep only the latest value per key in CLAUDE_ENV_FILE (SessionSt…
MeGaNeKoS Sep 7, 2026
3629758
fix: persist errorMessage on non-throwing turn failure and shorten su…
Sep 14, 2026
8c30e32
Merge openai/codex-plugin-cc#565: honor stop_hook_active in the stop-…
claude Sep 17, 2026
1f6d4ad
Merge openai/codex-plugin-cc#748: keep only the latest value per key …
claude Sep 17, 2026
66c9b24
Merge openai/codex-plugin-cc#746: --effort on reviews, and surface un…
claude Sep 17, 2026
196276b
Merge openai/codex-plugin-cc#742: add --sandbox <mode> to task and /c…
claude Sep 17, 2026
4a2ef41
Merge openai/codex-plugin-cc#727: add task --resume-thread <id>
claude Sep 17, 2026
9e6b38b
Merge openai/codex-plugin-cc#729: support relocated Claude config tra…
claude Sep 17, 2026
4cda989
Merge openai/codex-plugin-cc#724: enforce scoped Codex task reads
claude Sep 17, 2026
e3276ee
docs: bring the README up to date with the imported pull requests
claude Sep 17, 2026
dd70d87
fix: a busy broker refusing shutdown is not an identity rejection
claude Sep 17, 2026
c4a4c4f
Merge openai/codex-plugin-cc#747: make runCommand maxBuffer explicit
claude Sep 17, 2026
fce431e
Merge openai/codex-plugin-cc#763: persist errorMessage on a non-throw…
claude Sep 17, 2026
ed667e1
Merge openai/codex-plugin-cc#731: persist the review gate config outs…
claude Sep 17, 2026
62c5832
Merge openai/codex-plugin-cc#737: resolve Node outside the minimal ho…
claude Sep 17, 2026
4783ed1
docs: record the tier-B imports in the README and CHANGELOG
claude Sep 17, 2026
4f5c23e
fix: satisfy the typecheck that has been failing on main
claude Sep 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 81 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,28 +5,56 @@ Use Codex from inside Claude Code for code reviews or to delegate tasks to Codex
This plugin is for Claude Code users who want an easy way to start using Codex from the workflow
they already have.

> [!NOTE]
> This repository is a fork of [`openai/codex-plugin-cc`](https://github.com/openai/codex-plugin-cc).
> It tracks upstream `main` and carries a set of community pull requests that are still open
> upstream — mostly broker/background-job lifecycle fixes plus a few extra flags. See
> [Differences From Upstream](#differences-from-upstream) for the full list.

<video src="./docs/plugin-demo.webm" controls muted playsinline autoplay></video>

## What You Get

- `/codex:review` for a normal read-only Codex review
- `/codex:adversarial-review` for a steerable challenge review
- `/codex:rescue`, `/codex:transfer`, `/codex:status`, `/codex:result`, and `/codex:cancel` to delegate work, hand off sessions, and manage background jobs
- `/codex:setup` to check that Codex is installed and signed in, and to toggle the optional stop-time review gate

### Commands At A Glance

| Command | What it does | Main flags |
| --- | --- | --- |
| [`/codex:review`](#codexreview) | read-only Codex review of your current work | `--wait`, `--background`, `--base <ref>`, `--scope <auto\|working-tree\|branch>`, `--model <model\|spark>`, `--effort <level>` |
| [`/codex:adversarial-review`](#codexadversarial-review) | steerable review that challenges the approach | same as `/codex:review`, plus free-form focus text |
| [`/codex:rescue`](#codexrescue) | delegate investigation or a fix to Codex | `--background`, `--wait`, `--resume`, `--resume-thread <id>`, `--fresh`, `--model`, `--effort`, `--write`, `--sandbox <mode>`, `--read-root <dir>` |
| [`/codex:transfer`](#codextransfer) | turn this Claude session into a resumable Codex thread | `--source <claude-jsonl>` |
| [`/codex:status`](#codexstatus) | show active and recent Codex jobs | `[job-id]`, `--wait`, `--timeout-ms <ms>`, `--all` |
| [`/codex:result`](#codexresult) | show the stored output of a finished job | `[job-id]` |
| [`/codex:cancel`](#codexcancel) | cancel an active background job | `[job-id]` |
| [`/codex:setup`](#codexsetup) | check the Codex install, manage the review gate | `--enable-review-gate`, `--disable-review-gate` |

Accepted `--effort` values are `none`, `minimal`, `low`, `medium`, `high`, and `xhigh`. An
unrecognised `--flag` is not silently swallowed into the prompt: the plugin warns on stderr and
passes the token through as text.

## Requirements

- **ChatGPT subscription (incl. Free) or OpenAI API key.**
- Usage will contribute to your Codex usage limits. [Learn more](https://developers.openai.com/codex/pricing).
- **Node.js 18.18 or later**
- **Node.js 18.18 or later.**
- It does not have to be on the system PATH: the hooks resolve Node through `scripts/run-node.sh`, which also looks in nvm, fnm, asdf, mise, Volta and Homebrew toolchains, preferring one that ships `codex` alongside it. Set `CODEX_COMPANION_NODE` to an executable path to pin a specific one.

## Install

Add the marketplace in Claude Code:

```bash
/plugin marketplace add openai/codex-plugin-cc
/plugin marketplace add Edo771977/codex-plugin-cc
```

(Use `openai/codex-plugin-cc` instead if you want upstream without the imported fixes. The
marketplace name is `openai-codex` either way, so only one of the two can be added at a time.)

Install the plugin:

```bash
Expand Down Expand Up @@ -86,14 +114,15 @@ Use it when you want:
- a review of your current uncommitted changes
- a review of your branch compared to a base branch like `main`

Use `--base <ref>` for branch review. It also supports `--wait` and `--background`. It is not steerable and does not take custom focus text. Use [`/codex:adversarial-review`](#codexadversarial-review) when you want to challenge a specific decision or risk area.
Use `--base <ref>` for branch review. It also supports `--wait`, `--background`, `--scope <auto|working-tree|branch>`, and — like `/codex:rescue` — `--model <model|spark>` and `--effort <level>` to pick the reviewing model and how hard it thinks. It is not steerable and does not take custom focus text. Use [`/codex:adversarial-review`](#codexadversarial-review) when you want to challenge a specific decision or risk area.

Examples:

```bash
/codex:review
/codex:review --base main
/codex:review --background
/codex:review --base main --model gpt-5.4-mini --effort high
```

This command is read-only and will not perform any changes. When run in the background you can use [`/codex:status`](#codexstatus) to check on the progress and [`/codex:cancel`](#codexcancel) to cancel the ongoing task.
Expand All @@ -105,7 +134,7 @@ Runs a **steerable** review that questions the chosen implementation and design.
It can be used to pressure-test assumptions, tradeoffs, failure modes, and whether a different approach would have been safer or simpler.

It uses the same review target selection as `/codex:review`, including `--base <ref>` for branch review.
It also supports `--wait` and `--background`. Unlike `/codex:review`, it can take extra focus text after the flags.
It also supports `--wait`, `--background`, `--model <model|spark>`, and `--effort <level>`. Unlike `/codex:review`, it can take extra focus text after the flags.

Use it when you want:

Expand Down Expand Up @@ -137,17 +166,21 @@ Use it when you want Codex to:
> [!NOTE]
> Depending on the task and the model you choose these tasks might take a long time and it's generally recommended to force the task to be in the background or move the agent to the background.

It supports `--background`, `--wait`, `--resume`, and `--fresh`. If you omit `--resume` and `--fresh`, the plugin can offer to continue the latest rescue thread for this repo.
It supports `--background`, `--wait`, `--resume`, `--resume-thread <id>`, `--fresh`, `--model <model|spark>`, `--effort <level>`, `--write`, `--sandbox <read-only|workspace-write|danger-full-access>`, and repeatable `--read-root <directory>`. If you omit the resume flags, the plugin can offer to continue the latest rescue thread for this repo.

Examples:

```bash
/codex:rescue investigate why the tests started failing
/codex:rescue fix the failing test with the smallest safe patch
/codex:rescue --resume apply the top fix from the last run
/codex:rescue --resume-thread thr_0199... keep working on that specific thread
/codex:rescue --model gpt-5.4-mini --effort medium investigate the flaky integration test
/codex:rescue --model spark fix the issue quickly
/codex:rescue --background investigate the regression
/codex:rescue --sandbox read-only explain how the cache invalidation works
/codex:rescue --sandbox danger-full-access run the integration tests and fix what fails
/codex:rescue --read-root ./src --read-root ./tests inspect only the approved paths
```

You can also just ask for a task to be delegated to Codex:
Expand All @@ -161,6 +194,13 @@ Ask Codex to redesign the database connection to be more resilient.
- if you do not pass `--model` or `--effort`, Codex chooses its own defaults.
- if you say `spark`, the plugin maps that to `gpt-5.3-codex-spark`
- follow-up rescue requests can continue the latest Codex task in the repo
- `--resume`/`--resume-last` continues the newest thread for this repository; `--resume-thread <id>` continues one specific thread (the id is printed by `/codex:status` and `/codex:result`). `--resume`, `--resume-thread`, and `--fresh` are mutually exclusive.
- `--sandbox` applies to `/codex:rescue` only; the review commands stay read-only. It takes precedence over `--write` and counts only before the task text. Rescue runs edit files inside the repository by default (`workspace-write`); `read-only` blocks edits, and `danger-full-access` disables the Codex sandbox entirely, so Codex can write outside the repository and use the network without asking. Reserve it for tasks the sandbox blocks.
- a resumed thread keeps the sandbox it was started with while the plugin's shared app-server still holds it, which is the normal case inside one Claude Code session (Codex CLI 0.153.2 applies a new mode only when it loads the thread again from disk). `task` refuses a resume whose sandbox differs from what the app-server reports; resume with the same `--sandbox`, or start a new thread with `--fresh`.
- each `--read-root <directory>` must name an existing directory and opts into an OS-enforced permission profile that denies local command reads outside the listed directories and Codex's minimal runtime paths
- a scoped `--write` (or `--sandbox workspace-write`) requires the approved read roots to cover the workspace directory and uses Codex's built-in `:workspace` write policy; `--read-root` is rejected together with `--sandbox danger-full-access`
- scoped reads require Codex 0.138.0 or later and fail closed when the runtime cannot enforce permission profiles
- filesystem profiles apply to local sandboxed commands, not web search, MCP servers, connectors, browser tools, or computer use

### `/codex:transfer`

Expand All @@ -175,7 +215,7 @@ Examples:
/codex:transfer --source ~/.claude/projects/-Users-me-repo/<session-id>.jsonl
```

The plugin's existing `SessionStart` hook supplies the current transcript path automatically; `--source` is available as a manual override. The transfer uses Codex's external-agent session importer, so it follows the same conversion rules as importing Claude history in the Codex App and creates visible turns that can be continued in the App or TUI. The source must be under `~/.claude/projects`, and older Codex versions that do not expose session import must be upgraded before using this command.
The plugin's existing `SessionStart` hook supplies the current transcript path automatically; `--source` is available as a manual override. The transfer uses Codex's external-agent session importer, so it follows the same conversion rules as importing Claude history in the Codex App and creates visible turns that can be continued in the App or TUI. The source must live under a Claude projects root — `~/.claude/projects`, or `$CLAUDE_CONFIG_DIR/projects` when you have relocated your Claude config — and older Codex versions that do not expose session import must be upgraded before using this command.

### `/codex:status`

Expand Down Expand Up @@ -233,6 +273,8 @@ You can also use `/codex:setup` to manage the optional review gate.

When the review gate is enabled, the plugin uses a `Stop` hook to run a targeted Codex review based on Claude's response. If that review finds issues, the stop is blocked so Claude can address them first.

On the continuation turn that follows a block, the gate does not review again: Claude Code re-invokes the hook with `stop_hook_active`, and re-running the review there would just block again until the harness's retry cap ends the turn. The skip is reported as a system message, so run `/codex:review --wait` yourself when you want the fixes verified.

> [!WARNING]
> The review gate can create a long-running Claude/Codex loop and may drain usage limits quickly. Only enable it when you plan to actively monitor the session.

Expand Down Expand Up @@ -309,6 +351,39 @@ Delegated tasks and any [stop gate](#what-does-the-review-gate-do) run can also

This way you can review the Codex work or continue the work there.

## Differences From Upstream

This fork is [`openai/codex-plugin-cc`](https://github.com/openai/codex-plugin-cc) `main` plus a
set of community pull requests that are still open upstream. Each one is a separate merge commit,
so any of them can be reverted on its own.

Broker and background-job lifecycle:

| Upstream PR | What it fixes |
| --- | --- |
| [#541](https://github.com/openai/codex-plugin-cc/pull/541) | broker leaks, state races, and signal-masked command failures in the test runtime |
| [#623](https://github.com/openai/codex-plugin-cc/pull/623) | session end no longer tears down the shared broker while another session's jobs are still using it |
| [#652](https://github.com/openai/codex-plugin-cc/pull/652) | bounds the lifetime of detached brokers and task workers (see [Background Runtime Limits](#background-runtime-limits)) |

Commands and flags:

| Upstream PR | What it adds |
| --- | --- |
| [#565](https://github.com/openai/codex-plugin-cc/pull/565) | the stop-review gate honors `stop_hook_active` instead of re-blocking a continuation turn |
| [#724](https://github.com/openai/codex-plugin-cc/pull/724) | `--read-root <directory>` for OS-enforced scoped reads |
| [#727](https://github.com/openai/codex-plugin-cc/pull/727) | `--resume-thread <id>` to continue one specific Codex thread |
| [#729](https://github.com/openai/codex-plugin-cc/pull/729) | `/codex:transfer` works with a relocated `CLAUDE_CONFIG_DIR` |
| [#742](https://github.com/openai/codex-plugin-cc/pull/742) | `--sandbox <mode>` on `task` and `/codex:rescue` |
| [#746](https://github.com/openai/codex-plugin-cc/pull/746) | `--model`/`--effort` on the review commands, and a warning for unrecognised options |
| [#748](https://github.com/openai/codex-plugin-cc/pull/748) | `CLAUDE_ENV_FILE` keeps one export per key instead of growing on every session |
| [#731](https://github.com/openai/codex-plugin-cc/pull/731) | the review-gate flag is persisted outside the transient state dir, so a different `CLAUDE_PLUGIN_DATA` no longer silently disables it |
| [#737](https://github.com/openai/codex-plugin-cc/pull/737) | hooks resolve Node through `scripts/run-node.sh`, so nvm/fnm/asdf/mise/Volta/Homebrew toolchains work under the minimal hook PATH |
| [#747](https://github.com/openai/codex-plugin-cc/pull/747) | `runCommand` sets an explicit 256 MiB `maxBuffer`, so a large `git diff` is no longer truncated at Node's 1 MiB default |
| [#763](https://github.com/openai/codex-plugin-cc/pull/763) | a turn that fails without throwing stores its error text, so `/codex:result` says why it failed |

Where two of these PRs disagreed, the merge commit says which side won and why. The plugin version
is deliberately left at the upstream number: these merges do not cut a release.

## FAQ

### Do I need a separate Codex account for this plugin?
Expand Down
14 changes: 14 additions & 0 deletions plugins/codex/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,19 @@
# Changelog

## Unreleased

- Add opt-in `--read-root` enforcement for Codex rescue tasks using request-scoped permission profiles (openai/codex-plugin-cc#724).
- Preserve scoped roots across foreground, background, and resumed tasks, with fail-closed runtime compatibility errors.
- Require every `--read-root` to be an existing, non-empty directory so scoped tasks do not claim unsupported file-level isolation on macOS.
- Use the built-in `:workspace` profile for scoped write tasks and require the approved read roots to cover the workspace.
- Deny inherited system temp roots in scoped profiles so only approved directories and minimal runtime paths remain readable.
- Reject `--read-root` together with `--sandbox danger-full-access`, which disables the sandbox entirely.
- Treat a busy broker's shutdown refusal as a refusal rather than an identity rejection, so SessionEnd leaves the shared runtime to the sessions still using it instead of exiting with an error.
- Set an explicit 256 MiB `maxBuffer` for spawned commands so a large `git diff` is no longer truncated at Node's 1 MiB default.
- Persist the failure text of a turn that fails without throwing, and shorten job summaries to 96 characters.
- Keep the review-gate flag in a durable per-workspace file under `CODEX_HOME`, written privately and atomically.
- Resolve Node through `scripts/run-node.sh` in the hooks, preferring a user-managed toolchain over a system install.

## 1.0.0

- Initial version of the Codex plugin for Claude Code
10 changes: 7 additions & 3 deletions plugins/codex/agents/codex-rescue.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,15 @@ Forwarding rules:
- If the user asks for `spark`, map that to `--model gpt-5.3-codex-spark`.
- If the user asks for a concrete model name such as `gpt-5.4-mini`, pass it through with `--model`.
- Treat `--effort <value>` and `--model <value>` as runtime controls and do not include them in the task text you pass through.
- Default to a write-capable Codex run by adding `--write` unless the user explicitly asks for read-only behavior or only wants review, diagnosis, or research without edits.
- Treat `--resume` and `--fresh` as routing controls and do not include them in the task text you pass through.
- If the user passes `--sandbox <read-only|workspace-write|danger-full-access>` before the task text, forward it in that position and do not add `--write`; the sandbox already decides whether Codex may edit. A `--sandbox` inside the task text is part of the prompt: leave it there. Never add a `--sandbox` on your own.
- Preserve every `--read-root <directory>` pair as a runtime control and do not include either token in the task text you pass through.
- When forwarding both scoped roots and a write-capable sandbox (`--write` or `--sandbox workspace-write`), include an approved read root that covers the workspace directory.
- Otherwise default to a write-capable Codex run by adding `--write` unless the user explicitly asks for read-only behavior or only wants review, diagnosis, or research without edits.
- Treat `--resume`, `--resume-thread <id>`, and `--fresh` as routing controls and do not include them in the task text you pass through.
- `--resume` means add `--resume-last`.
- `--resume-thread <id>` means pass that exact routing pair through and do not add `--resume-last`.
- `--fresh` means do not add `--resume-last`.
- If the user is clearly asking to continue prior Codex work in this repository, such as "continue", "keep going", "resume", "apply the top fix", or "dig deeper", add `--resume-last` unless `--fresh` is present.
- If the user is clearly asking to continue prior Codex work in this repository, such as "continue", "keep going", "resume", "apply the top fix", or "dig deeper", add `--resume-last` unless `--fresh` or `--resume-thread <id>` is present.
- Otherwise forward the task as a fresh `task` run.
- Preserve the user's task text as-is apart from stripping routing flags.
- Return the stdout of the `codex-companion` command exactly as-is.
Expand Down
2 changes: 1 addition & 1 deletion plugins/codex/commands/adversarial-review.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
description: Run a Codex review that challenges the implementation approach and design choices
argument-hint: '[--wait|--background] [--base <ref>] [--scope auto|working-tree|branch] [focus ...]'
argument-hint: '[--wait|--background] [--base <ref>] [--scope auto|working-tree|branch] [--model <model|spark>] [--effort <none|minimal|low|medium|high|xhigh>] [focus ...]'
disable-model-invocation: true
allowed-tools: Read, Glob, Grep, Bash(node:*), Bash(git:*), AskUserQuestion
---
Expand Down
4 changes: 2 additions & 2 deletions plugins/codex/commands/cancel.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
description: Cancel an active background Codex job in this repository
argument-hint: '[job-id]'
disable-model-invocation: true
allowed-tools: Bash(node:*)
allowed-tools: Bash(bash:*)
---

!`node "${CLAUDE_PLUGIN_ROOT}/scripts/codex-companion.mjs" cancel "$ARGUMENTS"`
!`bash "$(if command -v cygpath >/dev/null 2>&1; then cygpath -u "${CLAUDE_PLUGIN_ROOT}"; else printf '%s' "${CLAUDE_PLUGIN_ROOT}"; fi)/scripts/run-node.sh" "codex-companion.mjs" cancel "$ARGUMENTS"`
Loading