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
4 changes: 2 additions & 2 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
},
"metadata": {
"description": "Parallel Codex workers inside Claude Code.",
"version": "0.5.0"
"version": "0.5.1"
},
"plugins": [
{
"name": "magic-codex",
"source": "./plugin",
"description": "Parallel Codex workers inside Claude Code — multi-agent orchestration with git worktree isolation, resumable sessions, and dual-model PR review.",
"version": "0.5.0",
"version": "0.5.1",
"author": {
"name": "Wenqing Yu"
},
Expand Down
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,15 @@

All notable changes documented here. Format follows [Keep a Changelog](https://keepachangelog.com/).

## [0.5.1] — 2026-04-29

Docs-only release.

### Changed
- **Model recommendations refreshed for the mid-2026 codex lineup.** The 2025-era per-role split (`gpt-5.2-codex` for code, `gpt-5` for review, `o3` for planning) collapsed: `gpt-5.5` now handles all three workloads and the dial that matters is reasoning effort, configured via codex CLI profiles (`[profiles.coding]`, `[profiles.deep]`, `[profiles.fast]`). The README "Choosing models" section and `magic-codex.toml.example` now both lead with "leave model unset, configure your `~/.codex/config.toml`" and only show in-magic-codex pinning for the budget-capping case (e.g., `[roles.generic] model = "gpt-5-codex-mini"`).
- **`magic-codex.toml.example` filename bug fixed.** Header comments referenced the wrong file (`codex-team.toml`); the actual loader reads `magic-codex.toml`. Corrected.
- **README role table** corrected to show implementer's `danger-full-access` default (was still showing `workspace-write` from before the 0.4.0 switch).

## [0.5.0] — 2026-04-28

### Added
Expand Down
48 changes: 38 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -192,33 +192,61 @@ Built-in presets (`src/roles/defaults/`):

| Role | Sandbox | Worktree | Timeout |
|---|---|---|---|
| `implementer` | `workspace-write` | branch-per-agent | 30 min |
| `implementer` | `danger-full-access` | branch-per-agent | 30 min |
| `reviewer` | `read-only` | detached at PR head (when `pr_number` given) | 10 min |
| `planner` | `read-only` | none | 15 min |
| `generic` | `read-only` | none | 15 min |

**Model selection.** By default, each role inherits whatever model your `~/.codex/config.toml` selects. Override per-role or per-spawn:
> Implementer's `danger-full-access` default landed in 0.4.0. `workspace-write` empirically dropped `.git/worktrees/<id>/index.lock` writes for ~33-67% of macOS spawns even with the writable_roots workaround. The agent is already isolated to a throwaway worktree branch, so `danger-full-access` is the smaller blast radius. Override via `[roles.implementer] sandbox = "workspace-write"` if you need stricter network egress isolation; the lock denials will still happen but 0.4.1's silent-failure detection surfaces them as `failed/kind=sandbox_denied` instead of a misleading `completed`.

### Choosing models

**The per-role model split that was useful in 2025 collapsed in 2026.** `gpt-5.5` (with `gpt-5.4` as a fallback during rollout) is now the unified top model for implementation, review, and planning. The dial that matters is **reasoning effort**, configured via codex CLI profiles — not via magic-codex.

**Recommended approach:** leave `model` unset on every role in `magic-codex.toml` and let codex inherit your `~/.codex/config.toml` defaults + profiles.

A solid codex baseline:

```toml
# magic-codex.toml
[roles.implementer]
model = "gpt-5-codex" # or whatever Codex accepts
# ~/.codex/config.toml
model = "gpt-5.5"
model_reasoning_effort = "high"
service_tier = "fast"
review_model = "gpt-5.5"

[profiles.coding] # daily work
model_reasoning_effort = "high"

[profiles.deep] # hard reviews / planning / refactors
model_reasoning_effort = "xhigh"
web_search = "live"

[profiles.fast] # cheap iteration
model = "gpt-5-codex-mini"
model_reasoning_effort = "medium"
```

[roles.reviewer]
model = "gpt-5" # strong reasoning for dual-review
timeout_seconds = 900
Switch profiles with `codex --profile <name>` at the codex CLI level. magic-codex passes through to the codex MCP server, which honors your codex config — no magic-codex changes needed when you adjust profiles.

**When to pin a model in `magic-codex.toml`:** only when you want a role to diverge from your codex default. The most common case is budget-capping the `generic` role:

```toml
[roles.generic]
model = "gpt-5-codex-mini" # cheap for repetitive work
```

Per-spawn override:
Per-spawn overrides remain available:

```json
{
"role": "reviewer",
"prompt": "...",
"overrides": { "model": "gpt-5", "timeout_seconds": 1200 }
"overrides": { "model": "gpt-5.5", "timeout_seconds": 1200 }
}
```

See `magic-codex.toml.example` for a copy-paste starter and a richer set of profile recommendations.

---

## PR review flow
Expand Down
56 changes: 46 additions & 10 deletions magic-codex.toml.example
Original file line number Diff line number Diff line change
@@ -1,25 +1,61 @@
# magic-cc-codex-worker — project config
# Copy to `codex-team.toml` at your repo root (commit it for team-wide conventions).
# Per-user overrides live at `~/.codex-team/config.toml`.
# magic-codex — project config
# Copy to `magic-codex.toml` at your repo root (commit it for team-wide conventions).
# Per-user overrides live at `~/.magic-codex/config.toml` (not committed).

# --- Delegation policy ---
# How aggressively should Claude offload work to Codex?
# Values: "minimal" | "balance" | "max"
[delegation]
level = "balance"

# --- Role overrides ---
# Only specified fields override the built-in defaults.
# See src/roles/defaults/*.toml for the full defaults.
# --- Models ---
# Recommended approach (mid-2026): leave magic-codex's `model` field
# UNSET on every role and let codex inherit your `~/.codex/config.toml`
# defaults + profiles. magic-codex passes through to the codex MCP
# server, which already honors your codex global config.
#
# A solid `~/.codex/config.toml` baseline looks like this:
#
# model = "gpt-5.5" # gpt-5.4 as fallback during rollout
# model_reasoning_effort = "high"
# model_reasoning_summary = "concise"
# service_tier = "fast"
# review_model = "gpt-5.5" # used by codex's /review
# web_search = "cached"
#
# [profiles.coding] model_reasoning_effort = "high" # daily work
# [profiles.deep] model_reasoning_effort = "xhigh" # hard reviews / planning
# [profiles.fast] model = "gpt-5-codex-mini" # cheap iteration
#
# Switch profiles via `codex --profile <name>` at the codex CLI level.
# magic-codex doesn't currently surface a per-spawn `profile` field, so
# the codex global config is where reasoning-depth / web-search /
# service-tier knobs live.
#
# WHEN TO PIN A MODEL IN magic-codex.toml: only when you want a role to
# diverge from your codex default — e.g., budget-cap the `generic` role
# to `gpt-5-codex-mini` while implementer/reviewer/planner ride the
# stronger default.

# [roles.implementer]
# model = "gpt-5-codex" # override to pin a specific Codex model
# # Inherit codex default (gpt-5.5 + your `coding` profile reasoning depth).
# # Pin only if you want a different model than your codex global.
# # model = "gpt-5.5"
# timeout_seconds = 1800
# sandbox = "workspace-write"
# sandbox = "danger-full-access" # default since 0.4.0; see CHANGELOG

# [roles.reviewer]
# model = "gpt-5" # force a strong reasoning model for dual-review
# # Same as implementer — inherit. If you have a `deep` codex profile
# # configured, you'd switch to it via `codex --profile deep` rather
# # than overriding here.
# # model = "gpt-5.5"
# timeout_seconds = 900

# [roles.planner]
# model = "gpt-5"
# # Inherit. Pair with codex `deep` profile for complex decomposition.
# # model = "gpt-5.5"
# timeout_seconds = 1200

# [roles.generic]
# # Cheap path for trivial repetitive work. Pin to mini to budget-cap.
# # model = "gpt-5-codex-mini"
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "magic-cc-codex-worker",
"version": "0.5.0",
"version": "0.5.1",
"description": "Parallel Codex workers inside Claude Code — multi-agent orchestration.",
"private": true,
"license": "SEE LICENSE IN LICENSE",
Expand Down
2 changes: 1 addition & 1 deletion plugin/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "magic-codex",
"version": "0.5.0",
"version": "0.5.1",
"description": "Parallel Codex workers inside Claude Code — multi-agent orchestration with git worktree isolation, resumable sessions, and dual-model PR review.",
"author": {
"name": "Wenqing Yu",
Expand Down
4 changes: 2 additions & 2 deletions plugin/dist/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -27716,7 +27716,7 @@ var CodexChild = class {
stderr: "pipe"
});
this.client = new Client(
{ name: "magic-codex", version: "0.5.0" },
{ name: "magic-codex", version: "0.5.1" },
{ capabilities: {} }
);
await this.client.connect(this.transport);
Expand Down Expand Up @@ -28278,7 +28278,7 @@ async function main() {
mfConventions
});
const server = new Server(
{ name: "magic-codex", version: "0.5.0" },
{ name: "magic-codex", version: "0.5.1" },
{ capabilities: { tools: {} } }
);
server.setRequestHandler(ListToolsRequestSchema, async () => ({
Expand Down
2 changes: 1 addition & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ async function main() {
});

const server = new Server(
{ name: "magic-codex", version: "0.5.0" },
{ name: "magic-codex", version: "0.5.1" },
{ capabilities: { tools: {} } },
);

Expand Down
2 changes: 1 addition & 1 deletion src/mcp/codex-client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ export class CodexChild {
stderr: "pipe",
});
this.client = new Client(
{ name: "magic-codex", version: "0.5.0" },
{ name: "magic-codex", version: "0.5.1" },
{ capabilities: {} },
);
await this.client.connect(this.transport);
Expand Down