Skip to content

Releases: SomeCodecat/multiclaude

multiclaude 2.6.0 — reliable AGY dispatch + GPT-6 Astra routing

Choose a tag to compare

@SomeCodecat SomeCodecat released this 07 Sep 17:34

Two targeted fixes: AGY dispatches were silently no-op'ing, and the Codex hard band was still pinned to the previous generation.

AGY dispatch was a silent no-op

resolveTiers() returned the whole agy models row — id<TAB>Display Name — so dispatches ran as:

# ⚠️ the bug, not a command to run — that is a literal tab in the --model value
agy --model "gemini-3.8-flash-high⇥Gemini 3.8 Flash (High)"

agy does not reject that. It prints its interactive model picker and exits 0 without ever running the prompt. The result is non-empty and plausible-looking, so it slips past orchestrate §3's "empty result = dispatch failure" backstop: the task never ran, the wallet was never touched, and the orchestrator carried on as if it had an answer.

  • agyTiers() now parses rows into {id, name} and drops the Fetching available models... status line.
  • resolveTiers() resolves by ID and ranks by the version parsed out of the ID, so a tier never depends on the order agy models happens to print. Adds gemlo and prohi; display names move to .names, used only for §9 attribution.
  • probe.mjs and quota.mjs print the bare ID with the display name behind a //, and say plainly which half goes to --model.
  • mc-agy refuses a --model value containing a space, tab, paren, or slash rather than firing the no-op.

Codex routing: GPT-6 Astra

mc-codex hard-enumerated gpt-5.6-{luna,terra,sol} and would have rejected Astra outright.

Band Was Now
Mechanical gpt-5.6-luna @ medium unchanged
Standard gpt-5.6-terra @ high unchanged
Hard gpt-5.6-sol @ xhigh gpt-6-astra @ xhigh
Escalation — gpt-6-astra @ ultra (new)

gpt-5.6-sol is the documented hard-band fallback: Astra is account-gated and needs Codex CLI ≥ 0.153. Routine burn rate is unchanged — only the top bands moved.

Verified against the live CLIs

Exact commands, copy-pasteable. Note that the prompt is attached to --print:
a valueless --print swallows the next flag as its prompt (agy 1.1.27 now catches
this and says so, rather than acting on the literal flag text).

agy --print="reply with exactly: OK" --model gemini-3.8-flash-high --output-format json
# → {"status":"SUCCESS","response":"OK\n","usage":{"total_tokens":5478}}

codex exec -m gpt-6-astra -c model_reasoning_effort="ultra" \
  --skip-git-repo-check "reply with exactly: OK"
# → OK, 4,812 tokens

# probe — from a clone of this repo:
node multiclaude/scripts/probe.mjs
# ...or from anywhere, against the installed plugin:
node ~/.claude/plugins/cache/multiclaude/multiclaude/2.6.0/scripts/probe.mjs
# → all six tiers resolve to bare IDs

Inside a Claude Code session the orchestrate skill runs the probe itself as
node "${CLAUDE_PLUGIN_ROOT}/scripts/probe.mjs" — the paths above are only for
checking it by hand from a shell.

Known gap

Nothing yet verifies that an AGY dispatch actually ran. This release removes the cause of the silent no-op, but agy exits 0 on both known failure modes, so the exit code remains useless as a success signal. agy --output-format json exposes status and usage.total_tokens — a deterministic check plus proof the work landed off-wallet. Tracked in docs/NEXT_STEPS.md.

Full changelog: v2.5.1...v2.6.0

multiclaude 2.5.0 — native dispatch agents + hybrid dispatch

Choose a tag to compare

@SomeCodecat SomeCodecat released this 10 Jul 11:29

The plugin now ships its own forwarder agents and chooses the dispatch path by situation.

Native dispatch agents (reverses the no-agents stance)

  • multiclaude:mc-codex and multiclaude:mc-agy: strict Bash-only forwarders (haiku driver) — one foreground CLI call, raw stdout verbatim, exact errors on failure, never self-answer, never background
  • mc-agy accepts --model "<resolved tier name>" and --edit, so tier-specific AGY work gets native agent cards too
  • External codex:codex-rescue / agy:agy-rescue are banned (observed: backgrounding placeholders, self-answering drivers)

Hybrid dispatch

  • Interactive default: mc-* agents (native agent card, inline result)
  • Batches / long jobs: direct backgrounded CLI (zero driver cost)
  • Big fan-outs: Workflow tool — only after the user opts in (new "Ask before you fan out" gate)

Always-visible executor indication (§9 grows a fourth surface)

  • Every dispatch description starts with the executor tag (Codex gpt-5.6-terra @ high: …); narration names the delegate at dispatch and result — delegated work never looks like Claude did it

multiclaude 2.4.0 — executor attribution

Choose a tag to compare

@SomeCodecat SomeCodecat released this 10 Jul 10:44

Every delegated task now surfaces its executor: provider + exact model (+ effort for Codex).

  • Task subjects carry the executor ([Codex · gpt-5.6-luna @ medium]), updated on escalation, with history in executorHistory metadata
  • Synthesis reports list each subtask's executor with exact-model rules per provider (AGY tier names verbatim from the probe)
  • Delegated-edit commits carry an Implemented-by: trailer; workflow nodes encode the executor in their label (codex:gpt-5.6-terra@high:<item>)

multiclaude 2.3.0 — GPT-5.6 tier routing + Workflow fan-out

Choose a tag to compare

@SomeCodecat SomeCodecat released this 10 Jul 10:44

Routes Codex work across OpenAI's new GPT-5.6 family by task band, and adds native Workflow-tool fan-out.

GPT-5.6 tier routing

  • Three Codex bands: mechanical → gpt-5.6-luna @ medium effort, standard → gpt-5.6-terra @ high, hard → gpt-5.6-sol @ xhigh
  • Explicit tier + effort on every dispatch (never the CLI config default); pick the lower band when unsure, escalate one band only after a gate failure
  • Both dispatch paths carry the tier: --model/--effort pass-through in rescue prompts, -m + -c model_reasoning_effort on Bash

Workflow fan-out

  • Drive ≥3 independent offload nodes through the native Workflow tool with synchronous Bash-only CLI nodes
  • Mix all three wallets (Codex, AGY, own Claude) concurrently: cross-provider judge panels, headroom-weighted partitioning
  • *-rescue agentTypes banned inside workflows (forwarder can background the CLI and return a placeholder)
  • Per-node temp file + stdin prompt form; no interpolation inside shell quotes

multiclaude 2.2.0

Choose a tag to compare

@SomeCodecat SomeCodecat released this 10 Jul 10:44

Cheaper dispatch, deterministic routing, closed failure paths.

  • Rescue-agent dispatches now pin a haiku driver (model: "haiku") so forwarding costs a fraction of an Opus driver
  • Deterministic session probe (probe.mjs): opt-out, CLI availability, pattern-resolved AGY tiers
  • Documented and routed around the broken AGY MCP / --background polling paths — the two inline CLI paths are the only supported AGY routes
  • Wallet-headroom hook biases routing before every Task/Workflow dispatch

v2.1.0

Choose a tag to compare

@SomeCodecat SomeCodecat released this 16 Jun 00:49

The usage readout is now /multiclaude:quota.

Changed

  • Renamed the usage skill to quota so its slash command is
    /multiclaude:quota instead of /multiclaude:usage. The old name shadowed
    Claude Code's built-in /usage command and was confusing to invoke. The
    readout, output format, and underlying wallet sources are unchanged — only the
    command name. References to Claude Code's first-party /usage (the source of
    the CLAUDE utilization bars) are intentionally kept as-is.
  • Moved skills/usage/usage.mjs → skills/quota/quota.mjs; updated the
    setup health check, the orchestrate §0 fallback pointer, the README, and the
    plugin/marketplace manifest descriptions to match.

Migration

  • /multiclaude:usage no longer exists — use /multiclaude:quota. Restart
    Claude Code after updating so the renamed skill is picked up.

v2.0.2

Choose a tag to compare

@SomeCodecat SomeCodecat released this 16 Jun 00:49

The CLAUDE wallet now shows the real quota %, not a time proxy.

Fixed

  • CLAUDE bar was elapsed-time, not usage. It tracked how far through the
    5-hour block you were (e.g. 86% at ~4h17m), which read like quota used but
    wasn't — a 69%-used account could show 86%. It now shows the official
    utilization %
    from the same first-party endpoint Claude Code's /usage uses
    (GET https://api.anthropic.com/api/oauth/usage), via the OAuth token at
    ~/.claude/.credentials.json (token only ever goes to api.anthropic.com).

Added

  • claudeLimits() in scripts/lib/wallets.mjs — returns 5-hour + 7-day (and
    per-model 7-day opus/sonnet) used % with reset times, plan, and extra-usage
    credits. Degrades cleanly when offline, token-expired, or (macOS) creds live in
    the Keychain rather than the file.
  • Full report (/multiclaude:usage) renders two official bars — 5h limit
    and weekly — with opus/sonnet weekly + plan + extra credits as a sub-line;
    ccusage cost/tokens/burn/projection stays as detail.
  • Compact hook line now leads with CLAUDE 5h NN% / wk NN% (the headroom signal
    that matters for routing) before the ccusage cost/burn detail.

Fallback

  • If the limits endpoint is unreachable, the report falls back to a clearly
    labelled
    elapsed-time bar ("elapsed time, not quota") so it can never again be
    mistaken for the real %.

v2.0.1

Choose a tag to compare

@SomeCodecat SomeCodecat released this 16 Jun 00:49

Documents the AGY-quota investigation and keeps the usage readout honest. AGY's
Gemini + Claude pools stay reactive-only — there is no usable proactive quota
number, and the real model lineup is still sourced from agy models.

Why no proactive AGY %

Both backend RPCs were tried and rejected:

  • …/v1internal:retrieveUserQuota answers 200 with a consumer token but reports
    the legacy Gemini Code Assist buckets (gemini-2.5-flash / -flash-lite /
    -pro / gemini-3.1-flash-lite), all pinned at remainingFraction: 1. AGY's
    real pooled quota never draws from them, so it would always read "100%"
    regardless of true depletion — actively misleading (the "models are wrong" bug).
  • …/v1internal:retrieveUserQuotaSummary returns AGY's real pool grouping but
    403 PERMISSION_DENIED for a direct token. It only answers over the Antigravity
    Language Server (Connect RPC on a random localhost port; CSRF token in
    /proc/<pid>/environ) — live-session-only and Linux-only, so unusable from a
    background, cross-platform usage hook.

Changed (docs + clarity; no behavior change)

  • scripts/lib/wallets.mjs, skills/usage/usage.mjs,
    scripts/usage-snapshot.mjs now document the reactive-only rationale inline so
    the dead-end endpoint is never re-added; minor cosmetic refactor of the AGY
    pool rendering. The displayed output is unchanged from 2.0.0.
  • skills/usage/SKILL.md gains a "Why no proactive %" subsection and corrected
    dependencies (only the Claude section needs the network).

v2.0.0

Choose a tag to compare

@SomeCodecat SomeCodecat released this 16 Jun 00:49

Full port of every script and hook from bash + python3 to pure Node.js, so
the plugin runs identically on Linux, macOS, and Windows. No /bin/sh, no
bash, no python3, no GNU find — only node (already required by Claude
Code) plus bunx/npx for the one ccusage network call.

Changed (breaking — implementation only; commands & output are unchanged)

  • All four scripts are now .mjs. scripts/probe.sh → probe.mjs,
    scripts/usage-snapshot.sh → usage-snapshot.mjs, scripts/setup.sh →
    setup.mjs, skills/usage/usage.sh → usage.mjs. The old .sh files are
    removed. Shared cross-platform helpers live in scripts/lib/mc.mjs (a
    PATHEXT-aware which, shell-free run, recursive newestFile, duration/bar
    formatting) and the wallet readers in scripts/lib/wallets.mjs (one source of
    truth for Codex / Claude / AGY data, used by both the full readout and the
    hook snapshot).
  • Hooks switched to exec form. hooks/hooks.json now uses
    "command": "node" + "args": [...] (spawned directly, no shell) instead of
    "shell": "bash" with a $(find …) fallback — the documented cross-platform
    pattern. ${CLAUDE_PLUGIN_ROOT} is still substituted by Claude Code.
  • /multiclaude:setup gained an idempotent apply mode. check (default)
    verifies and changes nothing; apply deep-merges the desired-state template
    into ~/.claude/settings.json (backing up to .bak, never clobbering keys it
    doesn't manage), with --full, --set dotted.key=value, --ttl, --model,
    and --dry-run. The JSON merge is native JS — the python3 heredoc is gone.

Removed

  • python3, GNU find, and bash as dependencies. The usage readout's
    Codex and AGY sections read local files directly and now work fully offline;
    only the Claude block still needs the network (ccusage via bunx/npx).

v1.9.0

Choose a tag to compare

@SomeCodecat SomeCodecat released this 16 Jun 00:49

Completes the orchestrate → multiclaude rename and makes the setup step real.

Added

  • /multiclaude:setup command. New skills/setup skill wrapping
    scripts/setup.sh — the deploy docs and the usage skill already referenced
    /multiclaude:setup, but no such command existed. Verifies codex/agy
    (installed + authenticated), python3/find/node, companion plugins, the
    wallet-headroom hook, and ccusage; prints an exact fix: for anything missing.

Changed

  • Ship the bootstrap settings inside the plugin. Moved
    setup/settings.json (repo root, not distributed) →
    multiclaude/setup/settings.json, so a plugin-only install can find the
    canonical ~/.claude/settings.json at ${CLAUDE_PLUGIN_ROOT}/setup/.
    scripts/setup.sh now points its fix messages at that shipped path.
  • Finished the rename drift. setup/settings.json enabledPlugins, the
    README (orchestrate/ dir, /orchestrate command, orchestrate@multiclaude
    enable key, install name), and the manifest descriptions now all say
    multiclaude / multiclaude@multiclaude instead of the dead orchestrate
    name.