Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion .codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "cc",
"version": "1.3.0",
"version": "1.4.0",
"description": "Claude Code Plugin for Codex. Delegate code reviews, investigations, and tracked tasks to Claude Code from inside Codex.",
"author": {
"name": "Sendbird, Inc.",
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
os:
- windows-latest
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v6
with:
node-version: 24
Expand All @@ -32,7 +32,7 @@ jobs:
name: Full CI (macos-latest)
runs-on: macos-latest
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v6
with:
node-version: 24
Expand All @@ -52,7 +52,7 @@ jobs:
name: Full CI (ubuntu-latest)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v6
with:
node-version: 24
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ jobs:
contents: read
id-token: write
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
ref: ${{ github.event.release.tag_name || inputs.ref || github.ref_name }}
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v6
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/update-marketplace.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ jobs:
MARKETPLACE_REPO: sendbird/codex-marketplace
MARKETPLACE_BRANCH_PREFIX: auto/update-cc-
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
ref: ${{ github.event.release.tag_name || inputs.ref || github.ref_name }}

Expand Down Expand Up @@ -58,7 +58,7 @@ jobs:
fi
done

- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
repository: sendbird/codex-marketplace
path: marketplace
Expand Down
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
# Changelog

## v1.4.0

- Delegate Claude model resolution to Claude Code. `--model` now forwards every value through unchanged, the friendly aliases `fable`, `opus`, `sonnet`, and `haiku` are matched case-insensitively, and the plugin no longer pins `claude-opus-4-7[1m]` / `claude-sonnet-4-6[1m]` or forces the 1M-context variant. Run `/model` in Claude Code to discover what your account and provider actually offer. Every friendly alias now defaults to `high` effort, so `opus` moves from `xhigh` to `high` and `haiku` moves from unset to `high` unless you pass `--effort`.
- Add `fable` as a supported model alias across `review`, `adversarial-review`, and `rescue`, forwarded to Claude Code rather than pinned to a version-specific model ID.
- Stop pinning `spawn_agent` routing to a Codex-owned catalog. Codex 0.145 only advertises `agent_type` when custom agents are configured and dropped `gpt-5.4-mini` / `gpt-5.4` from the child-model catalog, which broke every built-in background forwarding spawn. The forwarding children now omit `agent_type` and `model`, inheriting the built-in default agent and the parent model while keeping `reasoning_effort: "medium"`.
- Request targeted `sandbox_permissions: "require_escalated"` for the single Claude companion command in the review, adversarial-review, and rescue forwarding paths. Codex's default `workspace-write` sandbox has no outbound network, so the companion previously started Claude Code only for it to fail with `API Error: Unable to connect to API (ENOTFOUND)`. Global `network_access` is still not required.
- Stop auto-reaping live background jobs when the sandbox denies a process probe. `isProcessAlive()` now treats `EPERM` as "exists but cannot be signaled", and `validateProcessIdentity()` falls back to that probe when the identity check is denied instead of reporting death. `ESRCH`, absent PIDs, and genuine identity mismatches stay classified as dead, so PID-reuse detection is unchanged.
- Update GitHub Actions, ESLint, runtime globals, and transitive development dependencies.

## v1.3.0

- Preserve the originating workspace when reserved background job ids pass through built-in rescue, review, and adversarial-review forwarding children.
Expand Down
12 changes: 6 additions & 6 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "cc-plugin-codex",
"version": "1.3.0",
"version": "1.4.0",
"description": "Claude Code Plugin for Codex by Sendbird",
"type": "module",
"author": {
Expand Down
32 changes: 32 additions & 0 deletions tasks/lessons.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Lessons

- Do not infer the release number from stale local preparation metadata. When the user names the target version, treat that exact GitHub, npm, and marketplace version as the completion contract.
- When contributor PRs already exist, preserve their authorship and review history by amending and merging those PR branches whenever maintainers can do so. Reimplement on a separate release branch only when the original branch cannot be edited or safely disentangled.
- If a feature introduces reservation markers or leases, enforce both halves of the contract: reject unreserved explicit ids at the API boundary and release the reservation in `finally` blocks so failures cannot leak ownership state.
- When a test assertion was loosened to accommodate runtime variance, do not immediately tighten it back based on intuition. Reproduce the exact variant first, then narrow the assertion only when the expected state machine is explicit.
- For background jobs, separate completion notification from result retrieval. Use notifications only to steer the user to `$cc:result <job-id>` and keep `resultViewedAt` tied to actual result fetches or foreground success paths.
- If a behavior change is meant to affect real Codex routing rather than just prompt text, add an E2E around the concrete host flow. The first background-result fix only changed contract text; the rescue E2E was what proved the host would still inline raw child output until the child completion message itself was changed.
- When a job is meant to stay visible in the parent Codex thread, test session ownership explicitly for every job class, not just rescue tasks. Review/adversarial-review background jobs need the same parent-session coverage as task jobs.
- If a large-diff protection is supposed to avoid buffering huge output, test the hook path too, not only the review path. Stop-review and unread hooks can reuse the same git helpers and silently reintroduce the original failure mode.
- Plugin bootstrap commands must not derive their runtime path from the skill file location or any cache directory. Use the stable installed plugin root for the very first companion command, then use helper output only for secondary routing data such as owner session id or parent thread id.
- If a bug can be masked by platform-specific behavior, add explicit CI coverage for each supported OS instead of trusting Linux-only automation. Keep a portable core test subset for Windows/Linux, and leave shell-heavy integration/E2E coverage in a separate Linux-only job.
- For cross-platform shell commands, do not put POSIX env expansion such as `${VAR:-fallback}` into runtime skill prompts. Keep source skills shell-agnostic and let the installer materialize concrete absolute paths into the installed copy.
- Internal debug artifacts such as job log paths must stay out of user/model-facing surfaces. Keep logs on disk, but redact `logFile` from status/result JSON and do not render log links in human-facing status output.
- When checking Claude background work, do not read plugin state files or job logs to learn the result unless the user explicitly asked for internal debugging. Use the official surfaces first: `$cc:result <job-id>` for the result, or `$cc:status` for status only.
- In this plugin, background mode means "the parent does not wait on a built-in forwarding subagent." It must never mean "run claude-companion itself as a detached shell process." Encode that rule in both skill text and E2E assertions.
- When the user replaces the review context mid-turn, discard any earlier diff snapshot and treat the newly supplied artifact as the only authoritative input for subsequent review work.
- If users repeatedly have to explain which skill should apply, the skill contracts are too vague. Make the router criteria explicit inside the skill text, especially for the boundaries between straightforward review, adversarial/risk review, and rescue/fix work.
- When a user asks for "local review + Claude review in background + aggregate + fix", do not hand-write a generic review subagent prompt that only covers the review half. Either use the explicit Claude review/rescue skills, or encode the full phase contract (review scope, output format, and who handles the fix phase) so the delegated work matches the user's actual request.
- Do not suggest retrofitting a change into a version that is already published. Once a release is out, move the work to the next version and say that explicitly.
- When install support tiers change, reflect that immediately in README ordering. Put the preferred install path first, keep fallback paths lower, and tell users to run `$cc:setup` after marketplace installs because hooks are still plugin-managed.
- Secret names must match the final operational naming before workflows are considered done. If the user renames a secret or repo integration token, update the workflow references immediately instead of leaving the old name in docs or automation.
- If hook installation is the repair path, it must repair both halves: write `hooks.json` and ensure `codex_hooks = true`. Do not leave `install-hooks.mjs` as a guidance-only script when the user expects the install path itself to make hooks executable.
- When testing marketplace installs before release, distinguish between the public marketplace snapshot and a local marketplace snapshot built from the current working tree. A successful public install does not prove unreleased hook/runtime fixes if the marketplace repo has not been updated yet.
- If a status surface returns a finished job's stored `result` payload, treat that as a real result read and update `resultViewedAt`. Otherwise unread reminders drift from actual user-visible behavior and will fire again after the result was already consumed.
- If a review skill supports both foreground and background execution, spell out the execution syntax separately. Foreground must run the installed companion command directly in the parent thread; background may use the built-in forwarding child. Do not leave room for generic review-runner roles or raw Claude CLI fallbacks to blur that boundary.
- If an internal procedure should not appear as a public skill, do not represent it as a hidden `SKILL.md` and hope metadata will hide it. Put it outside the scanned public skill roots as a plain reference document, then have the public skill point to that document explicitly.
- Apply the same rule to prompt-shaping guides and runtime guides alike. If a document exists only to help a public skill compose or execute work, keep the must-have rules inline in the public skill and move the longer heuristics to a plain internal reference file, not another pseudo-hidden skill.
- Keep that pattern structurally consistent across similar skills. If rescue uses public invariants plus internal runtime/reference docs, review and adversarial-review should use the same split unless there is a concrete reason not to.
- If a rule exists because a past invocation bug or regression actually happened in production, keep that rule in the public skill too, not only in an internal reference. Internal runtime docs can restate and organize it, but the public skill must remain self-sufficient on proven regression guards.
- Do not embed workstation-specific absolute file targets in skill or internal-reference docs. Use relative reference text or install-time placeholders so source trees, installed copies, and marketplace snapshots all remain valid.
- For built-in background review/rescue forwarding, "background" belongs only to the parent wait behavior. The child must still run the companion command as one blocking foreground shell-tool call. Explicitly forbid background terminal/session execs, shell session ids, and polling loops inside the child prompt.
Loading