@ask-llm/plugin 0.16.3 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +1 -1
- package/.cursor-plugin/plugin.json +1 -1
- package/CHANGELOG.md +32 -0
- package/README.md +17 -13
- package/agents/brainstorm-coordinator.md +17 -16
- package/agents/codex-reviewer.md +6 -1
- package/agents/codex-verifier.md +5 -3
- package/agents/sol-reviewer.md +11 -7
- package/codex-pair-defaults.json +1 -1
- package/dist/brainstorm-panel.d.ts +1 -1
- package/dist/brainstorm-panel.d.ts.map +1 -1
- package/dist/brainstorm-panel.js +8 -8
- package/dist/brainstorm-panel.js.map +1 -1
- package/dist/brainstorm-run.js +1 -1
- package/dist/brainstorm-run.js.map +1 -1
- package/package.json +7 -7
- package/pi/extensions/codex-pair.ts +2 -1
- package/pi/extensions/provider-tools.ts +1 -1
- package/scripts/codex-pair-watch.mjs +3 -2
- package/scripts/sol-review-transport.mjs +117 -36
- package/skills/brainstorm/SKILL.md +9 -9
- package/skills/codex-image/SKILL.md +6 -6
- package/skills/codex-pair/SKILL.md +8 -6
- package/skills/codex-review/SKILL.md +1 -1
- package/skills/grok-pair/SKILL.md +3 -3
- package/skills/pairing-contract.md +1 -1
- package/skills/sol-review/SKILL.md +8 -8
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,37 @@
|
|
|
1
1
|
# @ask-llm/plugin
|
|
2
2
|
|
|
3
|
+
## 0.18.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#336](https://github.com/Lykhoyda/ask-llm/pull/336) [`8d7ff9f`](https://github.com/Lykhoyda/ask-llm/commit/8d7ff9fdbd7ee76aa40a45a500d67910662c2002) Thanks [@Lykhoyda](https://github.com/Lykhoyda)! - Adopt Codex's bundled `gpt-6-astra` as the factory default, keep Terra as the quota fallback, and fail closed when Astra is selected on Codex CLI older than 0.153.0. `/sol-review` and the Cursor brainstorm Sol catalog IDs stay explicit Sol pins.
|
|
8
|
+
|
|
9
|
+
- [#334](https://github.com/Lykhoyda/ask-llm/pull/334) [`51d2c32`](https://github.com/Lykhoyda/ask-llm/commit/51d2c32b658cf356f61ed02986680525b95f810e) Thanks [@Lykhoyda](https://github.com/Lykhoyda)! - Accept Codex's catalog-backed `ultra` reasoning effort as explicit opt-in. Keep ordinary defaults at `medium` and `/codex-review`/`/brainstorm` at `high`. Unified Grok still rejects `max` and `ultra`.
|
|
10
|
+
|
|
11
|
+
- [#337](https://github.com/Lykhoyda/ask-llm/pull/337) [`3a9a8e5`](https://github.com/Lykhoyda/ask-llm/commit/3a9a8e5f773d2d6aab8ea7c4c42d8e5b4c473e0a) Thanks [@Lykhoyda](https://github.com/Lykhoyda)! - Pin codex-pair, /sol-review, and the Cursor brainstorm participant to GPT-6 Sol (`gpt-6-sol`, Cursor `gpt-6-sol-high`). Pair effort is medium. Grok defaults are grok-4.7 on both harnesses, and current Opus pins are Claude Opus 5.5. Astra stays the ask-codex default.
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- Updated dependencies [[`8d7ff9f`](https://github.com/Lykhoyda/ask-llm/commit/8d7ff9fdbd7ee76aa40a45a500d67910662c2002), [`51d2c32`](https://github.com/Lykhoyda/ask-llm/commit/51d2c32b658cf356f61ed02986680525b95f810e), [`3a9a8e5`](https://github.com/Lykhoyda/ask-llm/commit/3a9a8e5f773d2d6aab8ea7c4c42d8e5b4c473e0a)]:
|
|
16
|
+
- @ask-llm/codex-mcp@0.8.0
|
|
17
|
+
- @ask-llm/mcp@0.11.0
|
|
18
|
+
- @ask-llm/grok-mcp@0.2.0
|
|
19
|
+
- @ask-llm/gemini-mcp@1.9.2
|
|
20
|
+
- @ask-llm/ollama-mcp@0.6.3
|
|
21
|
+
- @ask-llm/antigravity-mcp@0.7.7
|
|
22
|
+
|
|
23
|
+
## 0.17.0
|
|
24
|
+
|
|
25
|
+
### Minor Changes
|
|
26
|
+
|
|
27
|
+
- [#327](https://github.com/Lykhoyda/ask-llm/pull/327) [`4e0e436`](https://github.com/Lykhoyda/ask-llm/commit/4e0e436b43f7a1bff897bd690c71765420ff32ae) Thanks [@Lykhoyda](https://github.com/Lykhoyda)! - Add Codex `preferred` and `sandbox` to unified `ask-llm` (fail closed on other providers) and let plugin Codex workflows use fully pinned unified MCP when no `ask-codex` leaf is present, without stripping provider options ([#266](https://github.com/Lykhoyda/ask-llm/issues/266)).
|
|
28
|
+
|
|
29
|
+
### Patch Changes
|
|
30
|
+
|
|
31
|
+
- Updated dependencies [[`124d93d`](https://github.com/Lykhoyda/ask-llm/commit/124d93dd6dae941ffac37d6583be7cbf0eb0c30f), [`4e0e436`](https://github.com/Lykhoyda/ask-llm/commit/4e0e436b43f7a1bff897bd690c71765420ff32ae)]:
|
|
32
|
+
- @ask-llm/antigravity-mcp@0.7.6
|
|
33
|
+
- @ask-llm/mcp@0.10.0
|
|
34
|
+
|
|
3
35
|
## 0.16.3
|
|
4
36
|
|
|
5
37
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -23,16 +23,20 @@ Part of the [Ask LLM](https://github.com/Lykhoyda/ask-llm) monorepo.
|
|
|
23
23
|
|
|
24
24
|
### MCP Servers
|
|
25
25
|
|
|
26
|
-
The
|
|
26
|
+
The recommended cross-provider server is `@ask-llm/mcp`. Keep `npx -y @ask-llm/mcp` as the primary registration; `npm install -g @ask-llm/mcp` is a first-class alternative when you want a pinned global binary. Split provider packages (`@ask-llm/codex-mcp`, `@ask-llm/grok-mcp`, and the others) remain an advanced optimization for a richer per-provider tool surface.
|
|
27
|
+
|
|
28
|
+
The plugin bundles only the Codex MCP registration under Claude Code's plugin namespace. After installation or upgrade, fully restart Claude Code and run `/mcp`; `plugin:ask-llm:codex` should be connected. Codex-facing workflows prefer that bundled `ask-codex` leaf (or a user-scoped `ask-codex`), then a fully pinned unified `ask-llm` call (`provider: "codex"` plus model and Codex options), then the disclosed `codex exec` fallback. An older unified schema that cannot honor those options is reported rather than stripped.
|
|
27
29
|
|
|
28
30
|
`/grok-pair` does not add servers to the plugin. Register the unified Ask LLM server at user scope (the recommended install: it exposes `ask-cursor-agent` for the Cursor Agent route plus the unified `ask-llm` tool, which pair skills call only fully pinned) and, optionally, the split Grok server for the `ask-grok` leaf:
|
|
29
31
|
|
|
30
32
|
```bash
|
|
31
33
|
claude mcp add --scope user ask-llm -- npx -y @ask-llm/mcp
|
|
34
|
+
# first-class alternative after `npm install -g @ask-llm/mcp`:
|
|
35
|
+
# claude mcp add --scope user ask-llm -- ask-llm-mcp
|
|
32
36
|
claude mcp add --scope user grok -- npx -y @ask-llm/grok-mcp
|
|
33
37
|
```
|
|
34
38
|
|
|
35
|
-
Existing user-scoped Codex registrations remain compatible and keep their shorter names. Other providers are registered explicitly at user scope:
|
|
39
|
+
Existing user-scoped Codex registrations remain compatible and keep their shorter names. Other providers are registered explicitly at user scope only when you want their split leaves:
|
|
36
40
|
|
|
37
41
|
```bash
|
|
38
42
|
claude mcp add --scope user gemini -- npx -y @ask-llm/gemini-mcp
|
|
@@ -40,6 +44,8 @@ claude mcp add --scope user ollama -- npx -y @ask-llm/ollama-mcp
|
|
|
40
44
|
claude mcp add --scope user antigravity -- npx -y @ask-llm/antigravity-mcp
|
|
41
45
|
```
|
|
42
46
|
|
|
47
|
+
If Codex is missing entirely, provision the unified server first (`claude mcp add --scope user ask-llm -- npx -y @ask-llm/mcp`) or the split Codex leaf with `claude mcp add --scope user codex -- npx -y @ask-llm/codex-mcp`. If `/mcp` shows the bundled registration but it is disconnected, run `npx -y @ask-llm/mcp doctor` and restart Claude Code. `/sol-review` preserves source-plugin and session-local MCP/settings context when reading the active `claude mcp list` inventory, reports missing, unavailable, and unsupported-schema states separately, and discloses the explicit `codex exec` fallback after failed health, an incomplete unified schema, or MCP transport failure.
|
|
48
|
+
|
|
43
49
|
### Cursor Agent
|
|
44
50
|
|
|
45
51
|
Cursor's supported Agent Skills surface exposes exactly `/codex-pair` and `/grok-pair` (the manifest sets `agents: []`, `commands: []`, and `hooks: {}` so Claude agents and the Claude-format hooks file are never auto-discovered, and the other skills stay Claude/Pi-only until they get Cursor adapters); its MCP surface is `mcp.json`, which bundles only the unified `ask-llm` server. For a source checkout:
|
|
@@ -48,9 +54,7 @@ Cursor's supported Agent Skills surface exposes exactly `/codex-pair` and `/grok
|
|
|
48
54
|
agent --plugin-dir ./packages/claude-plugin
|
|
49
55
|
```
|
|
50
56
|
|
|
51
|
-
`/codex-pair` requires explicit `model=` and `effort=` values before consent, then uses a separately user-installed `ask-codex` leaf when exposed, otherwise the bundled unified `ask-llm` fully pinned (`provider: "codex"`, model, effort, include directories, session), with resumable Thread ID, cancellation, and result relay. It never guesses MCP-process environment defaults and does not pretend Claude-only hooks are active. `/grok-pair` gives Cursor-native `.cursor/mcp.json` and Tools & MCP reload guidance; it never sends Cursor users to `claude mcp add`. If installing only MCP configuration, the recommended minimal entry is `ask-llm` → `npx -y @ask-llm/mcp` in project `.cursor/mcp.json` or user `~/.cursor/mcp.json` (keep one registration per server — do not duplicate it when the plugin is loaded); add `codex` → `@ask-llm/codex-mcp` or `grok` → `@ask-llm/grok-mcp` only when you specifically want their `ask-codex`/`ask-grok` leaves, then reload MCP/restart Cursor Agent. When Cursor hosts `/grok-pair`, it never recursively invokes Cursor Agent.
|
|
52
|
-
|
|
53
|
-
If Codex is missing entirely, register it explicitly with `claude mcp add --scope user codex -- npx -y @ask-llm/codex-mcp`. If `/mcp` shows the bundled registration but it is disconnected, run `npx -y @ask-llm/mcp doctor` and restart Claude Code. `/sol-review` preserves source-plugin and session-local MCP/settings context when reading the active `claude mcp list` inventory, reports missing and unavailable states separately, and discloses the explicit `codex exec` fallback after failed health or MCP transport failure.
|
|
57
|
+
`/codex-pair` requires explicit `model=` and `effort=` values before consent, then uses a separately user-installed `ask-codex` leaf when exposed, otherwise the bundled unified `ask-llm` fully pinned (`provider: "codex"`, model, effort, include directories, sandbox, session), with resumable Thread ID, cancellation, and result relay. It never guesses MCP-process environment defaults and does not pretend Claude-only hooks are active. `/grok-pair` gives Cursor-native `.cursor/mcp.json` and Tools & MCP reload guidance; it never sends Cursor users to `claude mcp add`. If installing only MCP configuration, the recommended minimal entry is `ask-llm` → `npx -y @ask-llm/mcp` in project `.cursor/mcp.json` or user `~/.cursor/mcp.json` (keep one registration per server — do not duplicate it when the plugin is loaded); add `codex` → `@ask-llm/codex-mcp` or `grok` → `@ask-llm/grok-mcp` only when you specifically want their `ask-codex`/`ask-grok` leaves, then reload MCP/restart Cursor Agent. When Cursor hosts `/grok-pair`, it never recursively invokes Cursor Agent.
|
|
54
58
|
|
|
55
59
|
### Pi
|
|
56
60
|
|
|
@@ -80,29 +84,29 @@ See the [Pi host guide](https://lykhoyda.github.io/ask-llm/plugin/pi) for securi
|
|
|
80
84
|
| `/gemini-review` | Gemini-only code review with confidence filtering |
|
|
81
85
|
| `/codex-review` | Codex-only code review (precision-first, ≥80 confidence — default for routine PR review) |
|
|
82
86
|
| `/fable-review` | Isolated, read-only review requesting native Fable, with runtime verification limits disclosed |
|
|
83
|
-
| `/sol-review` | Model-pinned GPT-
|
|
87
|
+
| `/sol-review` | Model-pinned GPT-6 Sol review: prefer bundled or user-scoped `ask-codex`, then fully pinned unified `ask-llm`, then the disclosed CLI fallback |
|
|
84
88
|
| `/ollama-review` | Local review — no data leaves your machine |
|
|
85
|
-
| `/brainstorm` | Explicit multi-model brainstorm (default external: Antigravity + Codex); supports an exact no-Gemini Grok + GPT-
|
|
89
|
+
| `/brainstorm` | Explicit multi-model brainstorm (default external: Antigravity + Codex); supports an exact no-Gemini Grok + GPT-6 Sol panel through Cursor Agent |
|
|
86
90
|
| `/grok-review` | Grok review through explicit xAI API or Grok CLI harness; no fallback |
|
|
87
91
|
| `/grok-pair` | Consent-gated iterative Grok reviewer through exact Cursor Agent, xAI API, or Grok CLI route; no fallback |
|
|
88
92
|
| `/codex-pair` | Claude/Pi per-edit pairing dashboard; Cursor on-demand session adapter with explicit Thread ID continuity |
|
|
89
93
|
| `/brainstorm-all` | Brainstorm with all five external providers (Gemini, Codex, Grok, Ollama, Antigravity) + Claude Opus research |
|
|
90
94
|
| `/compare` | Side-by-side raw responses from multiple providers (no synthesis, no consensus extraction) |
|
|
91
95
|
|
|
92
|
-
### Exact Grok + GPT-
|
|
96
|
+
### Exact Grok + GPT-6 Sol brainstorm
|
|
93
97
|
|
|
94
98
|
The preferred architect panel routes both models through the model-neutral Cursor Agent harness with provider and exact account-catalog ID kept separate:
|
|
95
99
|
|
|
96
100
|
```text
|
|
97
|
-
/brainstorm grok@cursor-agent:
|
|
101
|
+
/brainstorm grok@cursor-agent:grok-4.7-high,codex@cursor-agent:gpt-6-sol-high "review this architecture"
|
|
98
102
|
```
|
|
99
103
|
|
|
100
|
-
This panel calls exactly Grok and GPT-
|
|
104
|
+
This panel calls exactly Grok and GPT-6 Sol—never Gemini. Cursor `Auto`, model rewriting, and harness/provider fallback are forbidden. If one participant fails, the result is partial and cannot be presented as two-model consensus. Catalogs are account-specific; confirm these exact IDs with `agent --list-models` and replace an unavailable ID explicitly.
|
|
101
105
|
|
|
102
106
|
Official Grok Build remains an explicit alternative when its installed headless contract is supported:
|
|
103
107
|
|
|
104
108
|
```text
|
|
105
|
-
/brainstorm grok@grok-cli:grok-
|
|
109
|
+
/brainstorm grok@grok-cli:grok-4.7,codex@cursor-agent:gpt-6-sol-high "review this architecture"
|
|
106
110
|
```
|
|
107
111
|
|
|
108
112
|
A Grok CLI failure remains a Grok CLI failure; the workflow does not pivot to Cursor or xAI.
|
|
@@ -114,7 +118,7 @@ A Grok CLI failure remains a Grok CLI failure; the workflow does not pivot to Cu
|
|
|
114
118
|
| gemini-reviewer | cyan | 4-phase: context, prompt, synthesis, validation |
|
|
115
119
|
| codex-reviewer | green | 4-phase: context, prompt, synthesis, validation |
|
|
116
120
|
| fable-reviewer | purple | Fable-requested review with source-verified findings |
|
|
117
|
-
| sol-reviewer | blue | GPT-
|
|
121
|
+
| sol-reviewer | blue | GPT-6 Sol review through Codex with source validation |
|
|
118
122
|
| ollama-reviewer | yellow | 4-phase: context, prompt, synthesis, validation (local) |
|
|
119
123
|
| brainstorm-coordinator | magenta | Source-grounded research + parallel multi-model consultation; exact two-model mode keeps the host non-voting and partial failures out of consensus |
|
|
120
124
|
|
|
@@ -160,7 +164,7 @@ To disable:
|
|
|
160
164
|
| Just this session | `/plugin disable ask-llm` |
|
|
161
165
|
| Just this command | `CODEX_PAIR_DISABLED=1 <command>` |
|
|
162
166
|
|
|
163
|
-
**Usage characteristics**: GPT-
|
|
167
|
+
**Usage characteristics**: GPT-6 Sol at medium effort by default, with Terra quota fallback; ~13–50s per file. Files >20KB skipped (override with `CODEX_PAIR_MAX_FILE_BYTES`). node_modules/dist/lockfiles/images skipped automatically.
|
|
164
168
|
|
|
165
169
|
**When to enable**: any project where missed correctness issues cost more than the per-edit review (~$0.04–0.07). The decision is about *code characteristics*, not domain — codex-pair catches bugs earlier wherever a project has implicit invariants the model can't infer from one file in isolation (which most projects do, somewhere). **When NOT to enable**: routine refactors, glue code, simple CRUD where `/codex-review` at PR time is sufficient (~1/4 the cost). The four-task benchmark in ADR-077 has the full task-agnostic evidence trail; ADR-095 is the lived-experience replication on this very repo.
|
|
166
170
|
|
|
@@ -32,7 +32,7 @@ The frontmatter and detailed implementation below define Claude Code subagent ex
|
|
|
32
32
|
|
|
33
33
|
You are a brainstorming coordinator powered by Claude Opus. You have two jobs:
|
|
34
34
|
|
|
35
|
-
1. **Research independently before dispatch.** Perform deep analysis of the topic — read the actual files, trace real code paths, and factor in framework-specific semantics. In standard mode this is a peer participant. In the exact Grok + GPT-
|
|
35
|
+
1. **Research independently before dispatch.** Perform deep analysis of the topic — read the actual files, trace real code paths, and factor in framework-specific semantics. In standard mode this is a peer participant. In the exact Grok + GPT-6 Sol mode it is a non-voting evidence memo: the requested panel must remain exactly two models.
|
|
36
36
|
2. **Orchestrate explicit consultations.** Dispatch only the selected external participants (Antigravity, Codex, Grok, Ollama, Gemini — default: antigravity,codex) via a **single blocking foreground Bash call**, collect responses, and synthesize with provider, harness, requested model, independently observed served model (direct xAI API / Grok CLI only), and Cursor display label kept separate; a harness-echoed requested ID is selected-only and is never presented as the actual model.
|
|
37
37
|
|
|
38
38
|
You run on Opus and have filesystem access. Never skip the independent research phase, but never count it as a third panel vote in exact two-model mode.
|
|
@@ -126,14 +126,14 @@ The user specifies which external providers to use. Default is `antigravity,code
|
|
|
126
126
|
|
|
127
127
|
Participant specs use `provider@harness:exact-model-id`. The preferred Grok route is Cursor Agent. The supported exact architect panel is:
|
|
128
128
|
|
|
129
|
-
- `grok@cursor-agent:
|
|
130
|
-
- `codex@cursor-agent:gpt-
|
|
129
|
+
- `grok@cursor-agent:grok-4.7-high`
|
|
130
|
+
- `codex@cursor-agent:gpt-6-sol-high`
|
|
131
131
|
|
|
132
|
-
Account catalogs can change; an unavailable exact ID is a clear failure, not permission to choose Auto or another ID. Grok Build remains explicit as `grok@grok-cli:grok-
|
|
132
|
+
Account catalogs can change; an unavailable exact ID is a clear failure, not permission to choose Auto or another ID. Grok Build remains explicit as `grok@grok-cli:grok-4.7` when the installed CLI supports the canonical contract. The exact panel contains no Gemini and must never launch a Gemini process/tool.
|
|
133
133
|
|
|
134
|
-
A list that mixes routed specs with bare provider names (for example `grok@cursor-agent:
|
|
134
|
+
A list that mixes routed specs with bare provider names (for example `grok@cursor-agent:grok-4.7-high,antigravity`) is unsupported: stop before Phase 3A, report `Mixed brainstorm participant lists are not supported: routed "<spec>" cannot be combined with bare "<provider>". Use either an all-bare provider list or the exact routed Grok + GPT-6 Sol panel. No participant was substituted, rerouted, or dispatched.`, and dispatch nothing. Never downgrade a routed spec to `grok-run.js`/`codex-run.js` or promote a bare name into a routed spec; `brainstorm-run.js` refuses such lists with the same error. Generalized mixed panels are deferred to a future ADR.
|
|
135
135
|
|
|
136
|
-
**Exact Grok + GPT-
|
|
136
|
+
**Exact Grok + GPT-6 Sol branch (preferred architect workflow):**
|
|
137
137
|
|
|
138
138
|
Use this branch instead of the generic template whenever the selected providers are exactly Grok and Codex with explicit route specs. Validate both specs first, then make one foreground call:
|
|
139
139
|
|
|
@@ -146,8 +146,8 @@ cat > "$workdir/prompt.md" <<'PROMPT_EOF'
|
|
|
146
146
|
PROMPT_EOF
|
|
147
147
|
|
|
148
148
|
node "${CLAUDE_PLUGIN_ROOT}/dist/brainstorm-run.js" \
|
|
149
|
-
--participant 'grok@cursor-agent:
|
|
150
|
-
--participant 'codex@cursor-agent:gpt-
|
|
149
|
+
--participant 'grok@cursor-agent:grok-4.7-high' \
|
|
150
|
+
--participant 'codex@cursor-agent:gpt-6-sol-high' \
|
|
151
151
|
< "$workdir/prompt.md" > "$workdir/panel.json" 2> "$workdir/panel.err"
|
|
152
152
|
rc_panel=$?
|
|
153
153
|
echo "===== GROK + GPT-5.6 SOL PANEL (rc=$rc_panel) ====="
|
|
@@ -156,7 +156,7 @@ echo "===== PANEL STDERR ====="
|
|
|
156
156
|
cat "$workdir/panel.err"
|
|
157
157
|
```
|
|
158
158
|
|
|
159
|
-
Substitute only user-supplied, grammar-validated exact specs. For the explicit Grok Build alternative, substitute only the Grok spec with `grok@grok-cli:grok-
|
|
159
|
+
Substitute only user-supplied, grammar-validated exact specs. For the explicit Grok Build alternative, substitute only the Grok spec with `grok@grok-cli:grok-4.7`; do not change the Sol route. `brainstorm-run.js` starts both participants concurrently, preserves input order and identity, returns `complete | partial | failed`, and exits 2 for partial/failed participant execution. Parse its JSON even when rc=2. It does not know or support Gemini, and it does not pivot routes.
|
|
160
160
|
|
|
161
161
|
**Required Bash tool call parameters:**
|
|
162
162
|
- `timeout: 600000` — 10 minutes, the Bash tool maximum. The default 2 minutes will kill Codex at high reasoning effort mid-response, recreating the same silent-failure class this phase is designed to avoid.
|
|
@@ -205,18 +205,19 @@ gemini -p "@$workdir/prompt.md" > "$workdir/gemini.out" 2> "$workdir/gemini.err"
|
|
|
205
205
|
pid_gemini=$!
|
|
206
206
|
|
|
207
207
|
# Only include this block if codex was requested (in the default set).
|
|
208
|
-
# GPT-
|
|
209
|
-
# Terra preserves the lower-cost fallback role.
|
|
208
|
+
# GPT-6 Astra at high effort is the quality-first default for unpinned
|
|
209
|
+
# brainstorming; Terra preserves the lower-cost fallback role. The exact Cursor
|
|
210
|
+
# architect panel stays gpt-6-sol-high (ADR-148). ASK_CODEX_PREFERRED_MODEL and
|
|
210
211
|
# ASK_CODEX_REASONING_EFFORT remain escape hatches. prompt.md is a FILE (not a
|
|
211
212
|
# pipe), so both attempts can re-read it. The whole `{ ...; }` group is
|
|
212
213
|
# backgrounded as one job so pid_codex/`wait` capture the final code.
|
|
213
|
-
codex_model="${ASK_CODEX_PREFERRED_MODEL:-${ASK_CODEX_MODEL:-gpt-
|
|
214
|
+
codex_model="${ASK_CODEX_PREFERRED_MODEL:-${ASK_CODEX_MODEL:-gpt-6-astra}}"
|
|
214
215
|
codex_fallback="${ASK_CODEX_FALLBACK_MODEL:-gpt-5.6-terra}"
|
|
215
216
|
codex_effort="${ASK_CODEX_REASONING_EFFORT:-high}"
|
|
216
217
|
# Keep the raw env override aligned with ask-codex's public enum so malformed
|
|
217
218
|
# config fragments never reach the Codex CLI.
|
|
218
219
|
case "$codex_effort" in
|
|
219
|
-
low|medium|high|xhigh|max) ;;
|
|
220
|
+
low|medium|high|xhigh|max|ultra) ;;
|
|
220
221
|
*) codex_effort="high" ;;
|
|
221
222
|
esac
|
|
222
223
|
{ codex exec --sandbox read-only -c "model_reasoning_effort=\"$codex_effort\"" -m "$codex_model" - < "$workdir/prompt.md" \
|
|
@@ -312,9 +313,9 @@ Surface this grade as the first line of the synthesis output (see Output Format
|
|
|
312
313
|
|
|
313
314
|
### Participants Consulted
|
|
314
315
|
- ℹ️ Claude Opus: non-voting evidence verifier (exact two-model mode; verified against real files: path/to/a, path/to/b)
|
|
315
|
-
- ✅ Grok via Cursor Agent — requested `
|
|
316
|
-
- ✅ Codex via Cursor Agent — requested `gpt-
|
|
317
|
-
- (direct route example) ✅ Grok via xAI API — requested `grok-4.
|
|
316
|
+
- ✅ Grok via Cursor Agent — requested `grok-4.7-high` (selected-unverified: Cursor echoes the requested ID); reported display label `Grok 4.7` (label, not a catalog ID)
|
|
317
|
+
- ✅ Codex via Cursor Agent — requested `gpt-6-sol-high` (selected-unverified); reported display label `GPT-6 Sol 1M High`
|
|
318
|
+
- (direct route example) ✅ Grok via xAI API — requested `grok-4.7`; observed served `grok-4.7-<snapshot>` (observed-alias, disclosed same-product resolution)
|
|
318
319
|
- 🚫 Gemini: explicitly excluded (not called)
|
|
319
320
|
|
|
320
321
|
### Consensus (high confidence; omit for a partial exact panel)
|
package/agents/codex-reviewer.md
CHANGED
|
@@ -10,6 +10,7 @@ tools:
|
|
|
10
10
|
- Read
|
|
11
11
|
- mcp__codex__ask-codex
|
|
12
12
|
- mcp__plugin_ask-llm_codex__ask-codex
|
|
13
|
+
- mcp__ask-llm__ask-llm
|
|
13
14
|
---
|
|
14
15
|
|
|
15
16
|
<!-- PORTABLE-CONTRACT:START -->
|
|
@@ -62,7 +63,11 @@ You are a code review coordinator that leverages OpenAI Codex for independent an
|
|
|
62
63
|
|
|
63
64
|
### Phase 2: Review Prompt Construction
|
|
64
65
|
|
|
65
|
-
When calling
|
|
66
|
+
When calling Codex, leave `model` and `preferred` unset and set `reasoningEffort: "high"` plus `sandbox: "read-only"`. This uses GPT-6 Astra at high effort and transparently falls back to GPT-5.6 Terra on quota.
|
|
67
|
+
|
|
68
|
+
Prefer an exact `ask-codex` leaf (`mcp__codex__ask-codex` or `mcp__plugin_ask-llm_codex__ask-codex`). If none is exposed, call `mcp__ask-llm__ask-llm` with `provider: "codex"` and the same options. Inspect the unified input schema first: if it lacks `reasoningEffort`, `includeDirs`, `preferred`, or `sandbox`, stop and tell the user to upgrade `@ask-llm/mcp` (`npx -y @ask-llm/mcp@latest` or `npm install -g @ask-llm/mcp`); do not omit those fields to make the call succeed. Never make an unpinned generic `ask-llm` call.
|
|
69
|
+
|
|
70
|
+
Structure the prompt to request confidence scoring AND severity classification:
|
|
66
71
|
|
|
67
72
|
```
|
|
68
73
|
Review the following code changes. For each issue found, rate:
|
package/agents/codex-verifier.md
CHANGED
|
@@ -9,6 +9,8 @@ tools:
|
|
|
9
9
|
- Grep
|
|
10
10
|
- Read
|
|
11
11
|
- mcp__codex__ask-codex
|
|
12
|
+
- mcp__plugin_ask-llm_codex__ask-codex
|
|
13
|
+
- mcp__ask-llm__ask-llm
|
|
12
14
|
---
|
|
13
15
|
|
|
14
16
|
<!-- PORTABLE-CONTRACT:START -->
|
|
@@ -35,7 +37,7 @@ If the assistant said "I added retry logic to the executor," `codex-reviewer` lo
|
|
|
35
37
|
|
|
36
38
|
## Tool surface (read-only by contract)
|
|
37
39
|
|
|
38
|
-
Allowed: `Read`, `Grep`, `Glob`, `Bash` (read-only commands only — `cat`, `head`, `tail`, `wc`, `diff`, `git diff|log|show|status|blame`, `jq`, language-native test runners in dry-run/list mode), `mcp__codex__ask-codex`.
|
|
40
|
+
Allowed: `Read`, `Grep`, `Glob`, `Bash` (read-only commands only — `cat`, `head`, `tail`, `wc`, `diff`, `git diff|log|show|status|blame`, `jq`, language-native test runners in dry-run/list mode), `mcp__codex__ask-codex`, `mcp__plugin_ask-llm_codex__ask-codex`, `mcp__ask-llm__ask-llm`.
|
|
39
41
|
|
|
40
42
|
Forbidden: anything that mutates state. Never run `rm`, `mv`, `chmod`, redirections (`>`, `>>`, `tee`), package installs (`npm install`, `pip install`), or DB writes (`INSERT`, `UPDATE`, `DELETE`, `DROP`). No `Write`, no `Edit`, no `NotebookEdit`.
|
|
41
43
|
|
|
@@ -77,9 +79,9 @@ Evidence sources, in order of cost:
|
|
|
77
79
|
- `Bash`: `git log --diff-filter=A -- <path>` — confirm a file was added in this branch.
|
|
78
80
|
- `Bash`: `git diff <ref> -- <path>` — confirm what specifically changed.
|
|
79
81
|
- `Bash`: `node -e "..."` (dry-run only, no side effects) — evaluate a small expression to confirm a constant value.
|
|
80
|
-
- `mcp__codex__ask-codex` — when the verification needs Codex's broader code-tracing (e.g., "does function X actually call function Y in the new path?"), send a focused single-claim prompt.
|
|
82
|
+
- `mcp__codex__ask-codex` or `mcp__plugin_ask-llm_codex__ask-codex` — when the verification needs Codex's broader code-tracing (e.g., "does function X actually call function Y in the new path?"), send a focused single-claim prompt. Prefer any exact `ask-codex` leaf; if only unified `mcp__ask-llm__ask-llm` is exposed, call it with `provider: "codex"`, `reasoningEffort: "high"`, `sandbox: "read-only"`, and `preferred` unset. If the unified schema lacks those Codex options, stop and report that `@ask-llm/mcp` must be upgraded; do not omit the fields.
|
|
81
83
|
|
|
82
|
-
When you call `
|
|
84
|
+
When you call an exact `ask-codex` leaf or the fully pinned unified `ask-llm` equivalent for verification, scope the prompt narrowly:
|
|
83
85
|
|
|
84
86
|
```
|
|
85
87
|
Verify this single claim against actual source: <claim>.
|
package/agents/sol-reviewer.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sol-reviewer
|
|
3
|
-
description: Coordinates an isolated, read-only code review explicitly pinned to OpenAI GPT-
|
|
3
|
+
description: Coordinates an isolated, read-only code review explicitly pinned to OpenAI GPT-6 Sol and reports only source-verified, high-confidence correctness findings.
|
|
4
4
|
model: opus
|
|
5
5
|
effort: high
|
|
6
6
|
color: blue
|
|
@@ -13,7 +13,7 @@ disallowedTools:
|
|
|
13
13
|
<!-- PORTABLE-CONTRACT:START -->
|
|
14
14
|
## Portable contract
|
|
15
15
|
|
|
16
|
-
Review only the supplied changes with Codex explicitly pinned to GPT-
|
|
16
|
+
Review only the supplied changes with Codex explicitly pinned to GPT-6 Sol, high effort, and read-only sandbox. Verify every candidate against source, report only high-confidence correctness findings, and disclose any model or transport fallback.
|
|
17
17
|
<!-- PORTABLE-CONTRACT:END -->
|
|
18
18
|
|
|
19
19
|
<!-- HOST-ADAPTER:CLAUDE-CODE:START -->
|
|
@@ -23,25 +23,29 @@ The frontmatter and detailed implementation below define Claude Code subagent ex
|
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
|
|
26
|
-
You are a code review coordinator for a model-pinned OpenAI GPT-
|
|
26
|
+
You are a code review coordinator for a model-pinned OpenAI GPT-6 Sol review. Send the changes to Codex, then independently validate every candidate against the current source.
|
|
27
27
|
|
|
28
28
|
## Workflow
|
|
29
29
|
|
|
30
30
|
1. Inspect `git diff` and `git diff --cached`. Read each affected file around the changed lines.
|
|
31
31
|
2. Apply the nearest `CLAUDE.md` instructions and inspect any ADR explicitly cited by changed code.
|
|
32
|
-
3. Call
|
|
33
|
-
- `model: "gpt-
|
|
32
|
+
3. Call an available Ask LLM Codex transport with:
|
|
33
|
+
- `model: "gpt-6-sol"`
|
|
34
34
|
- `reasoningEffort: "high"`
|
|
35
|
+
- `sandbox: "read-only"`
|
|
35
36
|
- `preferred` unset
|
|
36
37
|
- a prompt containing the scoped conventions, relevant ADR summaries, and the diff
|
|
37
38
|
|
|
38
|
-
|
|
39
|
+
Transport ladder (do not skip rungs, and never strip an option to make a call succeed):
|
|
40
|
+
1. Prefer any exact `ask-codex` leaf whose server identity maps to an active `@ask-llm/codex-mcp` registration (`mcp__codex__ask-codex` or plugin-namespaced `mcp__plugin_ask-llm_codex__ask-codex`).
|
|
41
|
+
2. Otherwise call `mcp__ask-llm__ask-llm` (or another namespaced `__ask-llm` leaf whose server maps to `@ask-llm/mcp`) with `provider: "codex"` plus the same model, reasoningEffort, sandbox, preferred, and any `includeDirs`. Inspect the advertised input schema first. If it lacks `reasoningEffort`, `includeDirs`, `preferred`, or `sandbox`, stop: the installed `@ask-llm/mcp` is too old to honor Codex options. Upgrade with `npx -y @ask-llm/mcp@latest` or `npm install -g @ask-llm/mcp`; do not omit those fields.
|
|
42
|
+
3. If no authoritative MCP tool is available in this subagent context, pass the same prompt on stdin to the shipped fallback runner:
|
|
39
43
|
|
|
40
44
|
```bash
|
|
41
45
|
node "${CLAUDE_PLUGIN_ROOT}/scripts/sol-review-transport.mjs" --fallback --plugin-dir "${CLAUDE_PLUGIN_ROOT}" --cli-path "$(command -v codex || true)"
|
|
42
46
|
```
|
|
43
47
|
|
|
44
|
-
Before executing Codex, the runner queries the active Claude MCP inventory again with the active plugin preserved; mirror any session-local `--mcp-config`, `--settings`, `--setting-sources`, and `--strict-mcp-config` flags on the runner command. This makes a parent `preferred` result followed by an absent or disconnected subagent tool a registered-but-unavailable state with the corresponding remediation. If the MCP call itself fails at the transport/service boundary, rerun the same fallback command with `--mcp-failed`; do not use that flag for a provider/model response. The runner then executes `codex exec -m gpt-
|
|
48
|
+
Before executing Codex, the runner queries the active Claude MCP inventory again with the active plugin preserved; mirror any session-local `--mcp-config`, `--settings`, `--setting-sources`, and `--strict-mcp-config` flags on the runner command. When the resolved tool is unified `ask-llm`, pass `--tool "<resolved tool name>" --tool-schema "<advertised input JSON schema>"` so an older schema is classified as `unsupported-schema` rather than being called. This makes a parent `preferred` or `unified` result followed by an absent or disconnected subagent tool a registered-but-unavailable state with the corresponding remediation. If the MCP call itself fails at the transport/service boundary, rerun the same fallback command with `--mcp-failed`; do not use that flag for a provider/model response. The runner then executes `codex exec -m gpt-6-sol -c model_reasoning_effort="high" -s read-only --ignore-user-config --ignore-rules --skip-git-repo-check`. The model pin, reasoning-effort override, read-only sandbox, and isolation flags are load-bearing; never drop or substitute them. On a quota or rate-limit failure only, the runner retries once with `${ASK_CODEX_FALLBACK_MODEL:-gpt-5.6-terra}` and identical flags, matching the MCP executor's configurable quota ladder. It writes the review result to stdout unchanged so the validated findings can be relayed without loss. If the `codex` CLI is also unavailable, stop and report that the Sol review could not run. Do not review on another transport, on any model outside the Sol-to-fallback ladder, or in another sandbox mode.
|
|
45
49
|
4. Ask Sol for concrete correctness, security, data-loss, concurrency, resource-lifecycle, and compatibility failures with confidence scores and reproduction conditions.
|
|
46
50
|
5. Read the reported source locations and trace each reproduction path. Drop style preferences, speculative improvements, pre-existing issues, linter/type-checker findings, and behavior documented as intentional.
|
|
47
51
|
6. Report only validated findings with confidence of at least 80/100. Never invent findings to fill a report.
|
package/codex-pair-defaults.json
CHANGED
|
@@ -27,7 +27,7 @@ export interface BrainstormParticipantResult extends BrainstormParticipant {
|
|
|
27
27
|
error?: string;
|
|
28
28
|
}
|
|
29
29
|
export interface BrainstormPanelReport {
|
|
30
|
-
panel: "grok+gpt-
|
|
30
|
+
panel: "grok+gpt-6-sol";
|
|
31
31
|
status: "complete" | "partial" | "failed";
|
|
32
32
|
consensusEligible: boolean;
|
|
33
33
|
synthesisRule: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brainstorm-panel.d.ts","sourceRoot":"","sources":["../src/brainstorm-panel.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,0BAA0B,YAAI,MAAM,EAAE,OAAO,CAAU,CAAC;AACrE,MAAM,MAAM,uBAAuB,GAAG,CAAC,OAAO,0BAA0B,CAAC,CAAC,MAAM,CAAC,CAAC;AAClF,MAAM,MAAM,sBAAsB,GAAG,cAAc,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC;AAC3F,eAAO,MAAM,yBAAyB,YAAI,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAU,CAAC;AACvG,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhF,MAAM,MAAM,yBAAyB,GACjC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,sBAAsB,EAAE,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,qBAAqB,EAAE,CAAA;CAAE,CAAC;AAE7D,MAAM,MAAM,2BAA2B,GACnC,gBAAgB,GAChB,gBAAgB,GAChB,qBAAqB,GACrB,UAAU,GACV,UAAU,CAAC;AAEf,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,uBAAuB,CAAC;IAClC,OAAO,EAAE,sBAAsB,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,2BAA4B,SAAQ,qBAAqB;IACxE,MAAM,EAAE,WAAW,GAAG,UAAU,CAAC;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,2BAA2B,CAAC;IAChD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"brainstorm-panel.d.ts","sourceRoot":"","sources":["../src/brainstorm-panel.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,0BAA0B,YAAI,MAAM,EAAE,OAAO,CAAU,CAAC;AACrE,MAAM,MAAM,uBAAuB,GAAG,CAAC,OAAO,0BAA0B,CAAC,CAAC,MAAM,CAAC,CAAC;AAClF,MAAM,MAAM,sBAAsB,GAAG,cAAc,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC;AAC3F,eAAO,MAAM,yBAAyB,YAAI,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAU,CAAC;AACvG,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhF,MAAM,MAAM,yBAAyB,GACjC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,sBAAsB,EAAE,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,qBAAqB,EAAE,CAAA;CAAE,CAAC;AAE7D,MAAM,MAAM,2BAA2B,GACnC,gBAAgB,GAChB,gBAAgB,GAChB,qBAAqB,GACrB,UAAU,GACV,UAAU,CAAC;AAEf,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,uBAAuB,CAAC;IAClC,OAAO,EAAE,sBAAsB,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,2BAA4B,SAAQ,qBAAqB;IACxE,MAAM,EAAE,WAAW,GAAG,UAAU,CAAC;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,2BAA2B,CAAC;IAChD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,gBAAgB,CAAC;IACxB,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC1C,iBAAiB,EAAE,OAAO,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,2BAA2B,EAAE,CAAC;CAC7C;AAYD,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB,CAqB9E;AAMD,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,yBAAyB,CAoBzF;AAED,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,qBAAqB,EAAE,GAAG,IAAI,CA4BnF;AAID,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CASpF;AAuLD,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,qBAAqB,EAAE,CAAC;IACtC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAiBjC"}
|
package/dist/brainstorm-panel.js
CHANGED
|
@@ -13,7 +13,7 @@ function routeAllowed(participant) {
|
|
|
13
13
|
export function parseBrainstormParticipant(spec) {
|
|
14
14
|
const match = spec.match(/^(grok|codex)@(cursor-agent|grok-cli|xai-api|codex-cli):(.+)$/);
|
|
15
15
|
if (!match) {
|
|
16
|
-
throw new Error(`Invalid brainstorm participant "${spec}". Use provider@harness:exact-model-id (for example grok@cursor-agent:
|
|
16
|
+
throw new Error(`Invalid brainstorm participant "${spec}". Use provider@harness:exact-model-id (for example grok@cursor-agent:grok-4.7-high).`);
|
|
17
17
|
}
|
|
18
18
|
const participant = {
|
|
19
19
|
provider: match[1],
|
|
@@ -38,7 +38,7 @@ export function parseBrainstormParticipantList(specs) {
|
|
|
38
38
|
const bare = trimmed.filter((spec) => !spec.includes("@"));
|
|
39
39
|
const routed = trimmed.filter((spec) => spec.includes("@"));
|
|
40
40
|
if (bare.length > 0 && routed.length > 0) {
|
|
41
|
-
throw new Error(`Mixed brainstorm participant lists are not supported: routed ${routed.map((spec) => `"${spec}"`).join(", ")} cannot be combined with bare ${bare.map((spec) => `"${spec}"`).join(", ")}. Use either an all-bare provider list or the exact routed Grok + GPT-
|
|
41
|
+
throw new Error(`Mixed brainstorm participant lists are not supported: routed ${routed.map((spec) => `"${spec}"`).join(", ")} cannot be combined with bare ${bare.map((spec) => `"${spec}"`).join(", ")}. Use either an all-bare provider list or the exact routed Grok + GPT-6 Sol panel. No participant was substituted, rerouted, or dispatched.`);
|
|
42
42
|
}
|
|
43
43
|
if (routed.length > 0) {
|
|
44
44
|
return { mode: "exact", participants: routed.map(parseBrainstormParticipant) };
|
|
@@ -51,15 +51,15 @@ export function parseBrainstormParticipantList(specs) {
|
|
|
51
51
|
}
|
|
52
52
|
export function validateBrainstormPanel(participants) {
|
|
53
53
|
if (participants.length !== 2) {
|
|
54
|
-
throw new Error("The Grok + GPT-
|
|
54
|
+
throw new Error("The Grok + GPT-6 Sol panel requires exactly two participants.");
|
|
55
55
|
}
|
|
56
56
|
const providers = participants.map(({ provider }) => provider);
|
|
57
57
|
if (new Set(providers).size !== providers.length) {
|
|
58
|
-
throw new Error("The Grok + GPT-
|
|
58
|
+
throw new Error("The Grok + GPT-6 Sol panel requires one Grok participant and one Codex participant.");
|
|
59
59
|
}
|
|
60
60
|
for (const required of BRAINSTORM_PANEL_PROVIDERS) {
|
|
61
61
|
if (!providers.includes(required)) {
|
|
62
|
-
throw new Error(`The Grok + GPT-
|
|
62
|
+
throw new Error(`The Grok + GPT-6 Sol panel is missing provider "${required}".`);
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
65
|
for (const participant of participants) {
|
|
@@ -69,8 +69,8 @@ export function validateBrainstormPanel(participants) {
|
|
|
69
69
|
if (!routeAllowed(participant)) {
|
|
70
70
|
throw new Error(`Unsupported brainstorm route ${participant.provider}@${participant.harness}. No provider or harness fallback was attempted.`);
|
|
71
71
|
}
|
|
72
|
-
if (participant.provider === "codex" && !participant.model.toLowerCase().includes("gpt-
|
|
73
|
-
throw new Error(`The Codex participant must request an exact GPT-
|
|
72
|
+
if (participant.provider === "codex" && !participant.model.toLowerCase().includes("gpt-6-sol")) {
|
|
73
|
+
throw new Error(`The Codex participant must request an exact GPT-6 Sol model ID; received "${participant.model}". No model substitution was attempted.`);
|
|
74
74
|
}
|
|
75
75
|
}
|
|
76
76
|
}
|
|
@@ -237,7 +237,7 @@ export async function runBrainstormPanel(options) {
|
|
|
237
237
|
const participants = await Promise.all(options.participants.map((participant) => invokeParticipant(participant, options.prompt, options.signal, options.onProgress)));
|
|
238
238
|
const successCount = participants.filter(({ status }) => status === "fulfilled").length;
|
|
239
239
|
return {
|
|
240
|
-
panel: "grok+gpt-
|
|
240
|
+
panel: "grok+gpt-6-sol",
|
|
241
241
|
status: successCount === 2 ? "complete" : successCount === 1 ? "partial" : "failed",
|
|
242
242
|
consensusEligible: successCount === 2,
|
|
243
243
|
synthesisRule: SYNTHESIS_RULE,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brainstorm-panel.js","sourceRoot":"","sources":["../src/brainstorm-panel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,MAAM,EAAE,OAAO,CAAU,CAAC;AAGrE,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAU,CAAC;AAuCvG,MAAM,cAAc,GAClB,yOAAyO,CAAC;AAE5O,SAAS,YAAY,CAAC,WAAkC;IACtD,IAAI,WAAW,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QACpC,OAAO,CAAC,cAAc,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,IAAY;IACrD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAC;IAC1F,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,mCAAmC,IAAI,
|
|
1
|
+
{"version":3,"file":"brainstorm-panel.js","sourceRoot":"","sources":["../src/brainstorm-panel.ts"],"names":[],"mappings":"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"}
|
package/dist/brainstorm-run.js
CHANGED
|
@@ -29,7 +29,7 @@ async function main() {
|
|
|
29
29
|
const specs = parseArgs(process.argv.slice(2));
|
|
30
30
|
const list = parseBrainstormParticipantList(specs);
|
|
31
31
|
if (list.mode !== "exact") {
|
|
32
|
-
throw new Error(`ask-brainstorm-run executes only the exact routed Grok + GPT-
|
|
32
|
+
throw new Error(`ask-brainstorm-run executes only the exact routed Grok + GPT-6 Sol panel; bare providers (${list.providers.join(", ")}) use the standard coordinator dispatch. No participant was dispatched.`);
|
|
33
33
|
}
|
|
34
34
|
const prompt = await readStdin();
|
|
35
35
|
const report = await runBrainstormPanel({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brainstorm-run.js","sourceRoot":"","sources":["../src/brainstorm-run.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,8BAA8B,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3F,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,GAAG,KAAK,eAAe,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAC9B,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;YACtF,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,yDAAyD,CAAC,CAAC;IACrG,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,KAAK,UAAU,SAAS;IACtB,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK;QAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5D,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,8BAA8B,CAAC,KAAK,CAAC,CAAC;QACnD,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb
|
|
1
|
+
{"version":3,"file":"brainstorm-run.js","sourceRoot":"","sources":["../src/brainstorm-run.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,8BAA8B,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3F,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,GAAG,KAAK,eAAe,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAC9B,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;YACtF,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,yDAAyD,CAAC,CAAC;IACrG,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,KAAK,UAAU,SAAS;IACtB,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK;QAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5D,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,8BAA8B,CAAC,KAAK,CAAC,CAAC;QACnD,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,6FAA6F,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,yEAAyE,CAChM,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC;YACtC,MAAM;YACN,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;SAChD,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU;YAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,8BAA8B,OAAO,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ask-llm/plugin",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.18.0",
|
|
4
4
|
"description": "Ask LLM review, comparison, brainstorming, image, verification, and pairing workflows for Claude Code, Cursor Agent, and Pi",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -83,12 +83,12 @@
|
|
|
83
83
|
]
|
|
84
84
|
},
|
|
85
85
|
"dependencies": {
|
|
86
|
-
"@ask-llm/antigravity-mcp": "^0.7.
|
|
87
|
-
"@ask-llm/codex-mcp": "^0.
|
|
88
|
-
"@ask-llm/gemini-mcp": "^1.9.
|
|
89
|
-
"@ask-llm/grok-mcp": "^0.
|
|
90
|
-
"@ask-llm/mcp": "^0.
|
|
91
|
-
"@ask-llm/ollama-mcp": "^0.6.
|
|
86
|
+
"@ask-llm/antigravity-mcp": "^0.7.7",
|
|
87
|
+
"@ask-llm/codex-mcp": "^0.8.0",
|
|
88
|
+
"@ask-llm/gemini-mcp": "^1.9.2",
|
|
89
|
+
"@ask-llm/grok-mcp": "^0.2.0",
|
|
90
|
+
"@ask-llm/mcp": "^0.11.0",
|
|
91
|
+
"@ask-llm/ollama-mcp": "^0.6.3"
|
|
92
92
|
},
|
|
93
93
|
"peerDependencies": {
|
|
94
94
|
"@earendil-works/pi-ai": "*",
|
|
@@ -280,7 +280,7 @@ function parseNumberFrontmatter(content: string, key: string, fallback: number):
|
|
|
280
280
|
async function readConfig(markerDir: string): Promise<{ config: PairConfig; context: string }> {
|
|
281
281
|
const context = await readFile(join(markerDir, ".codex-pair", "context.md"), "utf8");
|
|
282
282
|
const threshold = context.match(/^surfaceThreshold:\s*(high|med|low)\s*$/m)?.[1];
|
|
283
|
-
const model = context.match(/^model:\s*([^\n]+)$/m)?.[1]?.trim() || "gpt-
|
|
283
|
+
const model = context.match(/^model:\s*([^\n]+)$/m)?.[1]?.trim() || "gpt-6-sol";
|
|
284
284
|
return {
|
|
285
285
|
context,
|
|
286
286
|
config: {
|
|
@@ -693,6 +693,7 @@ export function registerCodexPair(pi: ExtensionAPI): void {
|
|
|
693
693
|
const result = await executeCodexCLI({
|
|
694
694
|
prompt,
|
|
695
695
|
model: config.model,
|
|
696
|
+
reasoningEffort: "medium",
|
|
696
697
|
sandbox: "read-only",
|
|
697
698
|
signal: controller.signal,
|
|
698
699
|
});
|
|
@@ -41,7 +41,7 @@ const prompt = Type.String({ minLength: 1, maxLength: 100000, description: "Prom
|
|
|
41
41
|
const codexSchema = Type.Object({
|
|
42
42
|
prompt,
|
|
43
43
|
model: Type.Optional(Type.String({ minLength: 1 })),
|
|
44
|
-
reasoningEffort: Type.Optional(StringEnum(["low", "medium", "high", "xhigh", "max"] as const)),
|
|
44
|
+
reasoningEffort: Type.Optional(StringEnum(["low", "medium", "high", "xhigh", "max", "ultra"] as const)),
|
|
45
45
|
sessionId: Type.Optional(Type.String()),
|
|
46
46
|
includeDirs: Type.Optional(relativeDirs),
|
|
47
47
|
preferred: Type.Optional(Type.Boolean()),
|
|
@@ -84,7 +84,7 @@ const DEFAULTS_PATH = join(SCRIPT_DIR, "..", "codex-pair-defaults.json");
|
|
|
84
84
|
// without duplicating literals across files. A structural test links the
|
|
85
85
|
// JSON values to constants.ts so drift fails CI. If the file is missing or
|
|
86
86
|
// malformed, fall through to env vars and hardcoded literals.
|
|
87
|
-
let CODEX_PAIR_DEFAULTS = { model: "gpt-
|
|
87
|
+
let CODEX_PAIR_DEFAULTS = { model: "gpt-6-sol", fallbackModel: "gpt-5.6-terra" };
|
|
88
88
|
try {
|
|
89
89
|
CODEX_PAIR_DEFAULTS = JSON.parse(readFileSync(DEFAULTS_PATH, "utf8"));
|
|
90
90
|
} catch {
|
|
@@ -98,7 +98,7 @@ const MARKER_FILE = join(PAIR_ROOT_DIR, CONTEXT_FILENAME);
|
|
|
98
98
|
const WATCHED_TOOLS = new Set(["Edit", "Write", "MultiEdit"]);
|
|
99
99
|
const DEFAULT_MODEL = process.env.ASK_CODEX_MODEL ?? CODEX_PAIR_DEFAULTS.model;
|
|
100
100
|
const FALLBACK_MODEL = process.env.ASK_CODEX_FALLBACK_MODEL ?? CODEX_PAIR_DEFAULTS.fallbackModel;
|
|
101
|
-
const CODEX_REASONING_EFFORTS = new Set(["low", "medium", "high", "xhigh", "max"]);
|
|
101
|
+
const CODEX_REASONING_EFFORTS = new Set(["low", "medium", "high", "xhigh", "max", "ultra"]);
|
|
102
102
|
const configuredReasoningEffort = process.env.ASK_CODEX_REASONING_EFFORT;
|
|
103
103
|
const DEFAULT_REASONING_EFFORT = CODEX_REASONING_EFFORTS.has(configuredReasoningEffort)
|
|
104
104
|
? configuredReasoningEffort
|
|
@@ -833,6 +833,7 @@ async function runWithBroker({ prompt, timeoutMs, model, markerDir }) {
|
|
|
833
833
|
baseInstructions: "",
|
|
834
834
|
prompt,
|
|
835
835
|
model,
|
|
836
|
+
effort: DEFAULT_REASONING_EFFORT,
|
|
836
837
|
timeoutMs,
|
|
837
838
|
});
|
|
838
839
|
} finally {
|
|
@@ -7,9 +7,18 @@ import { prepareCommandInvocation } from "./lib/process.mjs";
|
|
|
7
7
|
|
|
8
8
|
export const ASK_CODEX_PACKAGE = "@ask-llm/codex-mcp";
|
|
9
9
|
export const ASK_CODEX_TOOL = "ask-codex";
|
|
10
|
-
export const
|
|
10
|
+
export const ASK_LLM_PACKAGE = "@ask-llm/mcp";
|
|
11
|
+
export const ASK_LLM_TOOL = "ask-llm";
|
|
12
|
+
export const UNIFIED_CODEX_OPTION_KEYS = ["reasoningEffort", "includeDirs", "preferred", "sandbox"];
|
|
13
|
+
export const SOL_MODEL = "gpt-6-sol";
|
|
11
14
|
export const TERRA_MODEL = "gpt-5.6-terra";
|
|
12
15
|
|
|
16
|
+
const MISSING_REGISTRATION_REMEDIATION =
|
|
17
|
+
"Run `claude mcp add --scope user ask-llm -- npx -y @ask-llm/mcp`, fully restart Claude Code, then verify with `/mcp`. Split Codex remains an advanced optimization: `claude mcp add --scope user codex -- npx -y @ask-llm/codex-mcp`.";
|
|
18
|
+
const SERVICE_REMEDIATION = "Run `npx -y @ask-llm/mcp doctor`, inspect `/mcp`, then fully restart Claude Code.";
|
|
19
|
+
const UPGRADE_UNIFIED_REMEDIATION =
|
|
20
|
+
"Upgrade `@ask-llm/mcp` with `npx -y @ask-llm/mcp@latest` or `npm install -g @ask-llm/mcp`, fully restart Claude Code, then verify with `/mcp`.";
|
|
21
|
+
|
|
13
22
|
const scriptPath = fileURLToPath(import.meta.url);
|
|
14
23
|
const quotaSignals = [
|
|
15
24
|
"rate_limit_exceeded",
|
|
@@ -38,6 +47,29 @@ export function isAskCodexRegistration(server) {
|
|
|
38
47
|
);
|
|
39
48
|
}
|
|
40
49
|
|
|
50
|
+
export function isAskLlmToolName(name) {
|
|
51
|
+
return name === ASK_LLM_TOOL || /^mcp__.+__ask-llm$/.test(name);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function isAskLlmRegistration(server) {
|
|
55
|
+
if (!server || typeof server !== "object") return false;
|
|
56
|
+
const command = typeof server.command === "string" ? server.command : "";
|
|
57
|
+
const args = Array.isArray(server.args) ? server.args.filter((arg) => typeof arg === "string") : [];
|
|
58
|
+
const commandLine = typeof server.commandLine === "string" ? server.commandLine : "";
|
|
59
|
+
return (
|
|
60
|
+
/(?:^|[/\\])ask-llm-mcp(?:\.cmd|\.exe)?$/.test(command) ||
|
|
61
|
+
args.includes(ASK_LLM_PACKAGE) ||
|
|
62
|
+
/(?:^|\s)@ask-llm\/mcp(?:@[^\s]+)?(?:\s|$)/.test(commandLine) ||
|
|
63
|
+
/(?:^|[/\\])ask-llm-mcp(?:\.cmd|\.exe)?(?:\s|$)/.test(commandLine)
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function unifiedSchemaHonorsCodexOptions(schema) {
|
|
68
|
+
const properties = schema?.properties;
|
|
69
|
+
if (!properties || typeof properties !== "object") return false;
|
|
70
|
+
return UNIFIED_CODEX_OPTION_KEYS.every((key) => Object.hasOwn(properties, key));
|
|
71
|
+
}
|
|
72
|
+
|
|
41
73
|
export function parseClaudeMcpList(output) {
|
|
42
74
|
const servers = {};
|
|
43
75
|
for (const line of output.split(/\r?\n/)) {
|
|
@@ -77,8 +109,8 @@ export function readActiveMcpServers({
|
|
|
77
109
|
return parseClaudeMcpList(result.stdout || "");
|
|
78
110
|
}
|
|
79
111
|
|
|
80
|
-
function expectedToolName(serverName) {
|
|
81
|
-
return `mcp__${serverName.replaceAll(":", "_")}__${
|
|
112
|
+
function expectedToolName(serverName, tool = ASK_CODEX_TOOL) {
|
|
113
|
+
return `mcp__${serverName.replaceAll(":", "_")}__${tool}`;
|
|
82
114
|
}
|
|
83
115
|
|
|
84
116
|
function isAvailableMcpServer(server) {
|
|
@@ -86,12 +118,34 @@ function isAvailableMcpServer(server) {
|
|
|
86
118
|
return !status || /^✔\s*Connected\b/i.test(status) || /^cached\b.*\bconnects on first use\b/i.test(status);
|
|
87
119
|
}
|
|
88
120
|
|
|
121
|
+
function withCliFallback({ state, reason, remediation, cliPath }) {
|
|
122
|
+
if (!cliPath) {
|
|
123
|
+
return {
|
|
124
|
+
state,
|
|
125
|
+
transport: null,
|
|
126
|
+
toolName: null,
|
|
127
|
+
diagnostic: `${reason} The explicit CLI fallback is also unavailable.`,
|
|
128
|
+
remediation: `${remediation} Install the fallback with \`npm install -g @openai/codex\` if needed.`,
|
|
129
|
+
fallbackDisclosure: null,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
state,
|
|
134
|
+
transport: "cli",
|
|
135
|
+
toolName: null,
|
|
136
|
+
diagnostic: reason,
|
|
137
|
+
remediation,
|
|
138
|
+
fallbackDisclosure: `Transport disclosure: ${reason} Running the review through the explicit \`codex exec\` CLI fallback; validated findings will be relayed unchanged.`,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
|
|
89
142
|
export function classifySolReviewTransport({
|
|
90
143
|
availableTools = [],
|
|
91
144
|
mcpServers = {},
|
|
92
145
|
cliPath = "",
|
|
93
146
|
inventoryError = null,
|
|
94
147
|
mcpFailed = false,
|
|
148
|
+
toolSchemas = {},
|
|
95
149
|
}) {
|
|
96
150
|
if (inventoryError) {
|
|
97
151
|
const reason = `Ask LLM Codex MCP availability could not be determined because the active Claude MCP inventory could not be inspected: ${inventoryError}`;
|
|
@@ -116,28 +170,60 @@ export function classifySolReviewTransport({
|
|
|
116
170
|
};
|
|
117
171
|
}
|
|
118
172
|
|
|
119
|
-
const
|
|
120
|
-
const
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
|
|
173
|
+
const codexRegistrations = Object.entries(mcpServers).filter(([, server]) => isAskCodexRegistration(server));
|
|
174
|
+
const availableCodexRegistrations = codexRegistrations.filter(([, server]) => isAvailableMcpServer(server));
|
|
175
|
+
const registeredCodexToolNames = new Set(
|
|
176
|
+
availableCodexRegistrations.map(([name]) => expectedToolName(name, ASK_CODEX_TOOL)),
|
|
177
|
+
);
|
|
178
|
+
const askCodexToolName = availableTools.find(
|
|
179
|
+
(name) => isAskCodexToolName(name) && registeredCodexToolNames.has(name),
|
|
180
|
+
);
|
|
181
|
+
if (askCodexToolName && !mcpFailed) {
|
|
124
182
|
return {
|
|
125
183
|
state: "preferred",
|
|
126
184
|
transport: "mcp",
|
|
127
|
-
toolName,
|
|
128
|
-
diagnostic: `Ask LLM Codex transport available as ${
|
|
185
|
+
toolName: askCodexToolName,
|
|
186
|
+
diagnostic: `Ask LLM Codex transport available as ${askCodexToolName}.`,
|
|
187
|
+
remediation: null,
|
|
188
|
+
fallbackDisclosure: null,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
const unifiedRegistrations = Object.entries(mcpServers).filter(([, server]) => isAskLlmRegistration(server));
|
|
193
|
+
const availableUnifiedRegistrations = unifiedRegistrations.filter(([, server]) => isAvailableMcpServer(server));
|
|
194
|
+
const registeredUnifiedToolNames = new Set(
|
|
195
|
+
availableUnifiedRegistrations.map(([name]) => expectedToolName(name, ASK_LLM_TOOL)),
|
|
196
|
+
);
|
|
197
|
+
const askLlmToolName = availableTools.find((name) => isAskLlmToolName(name) && registeredUnifiedToolNames.has(name));
|
|
198
|
+
if (askLlmToolName && !mcpFailed) {
|
|
199
|
+
const schema = toolSchemas[askLlmToolName];
|
|
200
|
+
if (!unifiedSchemaHonorsCodexOptions(schema)) {
|
|
201
|
+
const schemaMissing = !schema;
|
|
202
|
+
return withCliFallback({
|
|
203
|
+
state: "unsupported-schema",
|
|
204
|
+
reason: schemaMissing
|
|
205
|
+
? "Ask LLM unified MCP is registered, but its `ask-llm` schema was not provided so Codex options (reasoningEffort, includeDirs, preferred, sandbox) cannot be verified. Pass `--tool-schema` with the advertised input JSON schema; never omit those fields to make the call succeed."
|
|
206
|
+
: "Ask LLM unified MCP is registered, but its `ask-llm` schema cannot honor Codex options (reasoningEffort, includeDirs, preferred, sandbox). Upgrade `@ask-llm/mcp`; never omit those fields to make the call succeed.",
|
|
207
|
+
remediation: UPGRADE_UNIFIED_REMEDIATION,
|
|
208
|
+
cliPath,
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
return {
|
|
212
|
+
state: "unified",
|
|
213
|
+
transport: "mcp",
|
|
214
|
+
toolName: askLlmToolName,
|
|
215
|
+
diagnostic: `Ask LLM unified transport available as ${askLlmToolName}. Call it with provider "codex" and pass reasoningEffort, includeDirs, preferred, and sandbox; do not strip unsupported fields.`,
|
|
129
216
|
remediation: null,
|
|
130
217
|
fallbackDisclosure: null,
|
|
131
218
|
};
|
|
132
219
|
}
|
|
133
220
|
|
|
134
|
-
const registered =
|
|
221
|
+
const registered = codexRegistrations.length > 0 || unifiedRegistrations.length > 0;
|
|
135
222
|
const state = registered || mcpFailed ? "unavailable" : "missing-registration";
|
|
136
|
-
const remediation =
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
const unavailableRegistration = registrations.find(([, server]) => !isAvailableMcpServer(server));
|
|
223
|
+
const remediation = registered || mcpFailed ? SERVICE_REMEDIATION : MISSING_REGISTRATION_REMEDIATION;
|
|
224
|
+
const unavailableRegistration =
|
|
225
|
+
codexRegistrations.find(([, server]) => !isAvailableMcpServer(server)) ||
|
|
226
|
+
unifiedRegistrations.find(([, server]) => !isAvailableMcpServer(server));
|
|
141
227
|
const reason = mcpFailed
|
|
142
228
|
? "Ask LLM Codex MCP invocation failed in this session, so the preferred transport is unavailable."
|
|
143
229
|
: unavailableRegistration
|
|
@@ -146,25 +232,7 @@ export function classifySolReviewTransport({
|
|
|
146
232
|
? "Ask LLM Codex MCP is registered, but its `ask-codex` tool is unavailable in this session."
|
|
147
233
|
: "Ask LLM Codex MCP registration is missing from this Claude Code installation.";
|
|
148
234
|
|
|
149
|
-
|
|
150
|
-
return {
|
|
151
|
-
state,
|
|
152
|
-
transport: null,
|
|
153
|
-
toolName: null,
|
|
154
|
-
diagnostic: `${reason} The explicit CLI fallback is also unavailable.`,
|
|
155
|
-
remediation: `${remediation} Install the fallback with \`npm install -g @openai/codex\` if needed.`,
|
|
156
|
-
fallbackDisclosure: null,
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
return {
|
|
161
|
-
state,
|
|
162
|
-
transport: "cli",
|
|
163
|
-
toolName: null,
|
|
164
|
-
diagnostic: reason,
|
|
165
|
-
remediation,
|
|
166
|
-
fallbackDisclosure: `Transport disclosure: ${reason} Running the review through the explicit \`codex exec\` CLI fallback; validated findings will be relayed unchanged.`,
|
|
167
|
-
};
|
|
235
|
+
return withCliFallback({ state, reason, remediation, cliPath });
|
|
168
236
|
}
|
|
169
237
|
|
|
170
238
|
export function codexFallbackArgs(model) {
|
|
@@ -255,6 +323,7 @@ function parseArgs(args) {
|
|
|
255
323
|
mcpList: null,
|
|
256
324
|
fallback: false,
|
|
257
325
|
mcpFailed: false,
|
|
326
|
+
toolSchema: null,
|
|
258
327
|
claudeContextArgs: [],
|
|
259
328
|
};
|
|
260
329
|
const claudeContextValueFlags = new Set(["--plugin-dir", "--mcp-config", "--settings", "--setting-sources"]);
|
|
@@ -265,7 +334,14 @@ function parseArgs(args) {
|
|
|
265
334
|
else if (arg === "--tool") parsed.tools.push(args[++index] ?? "");
|
|
266
335
|
else if (arg === "--cli-path") parsed.cliPath = args[++index] ?? "";
|
|
267
336
|
else if (arg === "--mcp-list") parsed.mcpList = args[++index] ?? "";
|
|
268
|
-
else if (arg === "--
|
|
337
|
+
else if (arg === "--tool-schema") {
|
|
338
|
+
const raw = args[++index] ?? "";
|
|
339
|
+
try {
|
|
340
|
+
parsed.toolSchema = JSON.parse(raw);
|
|
341
|
+
} catch {
|
|
342
|
+
throw new Error("Invalid --tool-schema JSON");
|
|
343
|
+
}
|
|
344
|
+
} else if (arg === "--strict-mcp-config") parsed.claudeContextArgs.push(arg);
|
|
269
345
|
else if (claudeContextValueFlags.has(arg)) {
|
|
270
346
|
const value = args[++index];
|
|
271
347
|
if (value === undefined) throw new Error(`Missing value for ${arg}`);
|
|
@@ -295,12 +371,17 @@ function readMcpServers(parsed) {
|
|
|
295
371
|
async function main() {
|
|
296
372
|
const parsed = parseArgs(process.argv.slice(2));
|
|
297
373
|
const { mcpServers, inventoryError } = readMcpServers(parsed);
|
|
374
|
+
const toolSchemas = {};
|
|
375
|
+
if (parsed.toolSchema) {
|
|
376
|
+
for (const name of parsed.tools) toolSchemas[name] = parsed.toolSchema;
|
|
377
|
+
}
|
|
298
378
|
const decision = classifySolReviewTransport({
|
|
299
379
|
availableTools: parsed.tools,
|
|
300
380
|
mcpServers,
|
|
301
381
|
cliPath: parsed.cliPath,
|
|
302
382
|
inventoryError,
|
|
303
383
|
mcpFailed: parsed.mcpFailed,
|
|
384
|
+
toolSchemas,
|
|
304
385
|
});
|
|
305
386
|
|
|
306
387
|
if (parsed.fallback) {
|
|
@@ -6,7 +6,7 @@ description: Send a topic to an explicit multi-model panel, then synthesize find
|
|
|
6
6
|
<!-- PORTABLE-CONTRACT:START -->
|
|
7
7
|
## Portable contract
|
|
8
8
|
|
|
9
|
-
For the standard workflow, the current host model records an independent analysis before seeing external answers, then sends the same bounded topic and Context Brief concurrently to the selected providers. For the exact Grok + GPT-
|
|
9
|
+
For the standard workflow, the current host model records an independent analysis before seeing external answers, then sends the same bounded topic and Context Brief concurrently to the selected providers. For the exact Grok + GPT-6 Sol workflow, the host is a non-voting evidence verifier/synthesizer: the brainstorming panel has exactly those two requested participants. Cross-check source where possible and synthesize consensus, unique insights, contradictions, rejected false positives, failures, and confidence. Keep provider, harness, requested model ID, independently observed served model ID, and Cursor's reported display label separate. Only direct xAI API / Grok CLI routes can report a served ID, and only when the provider/CLI payload actually carries one; a disclosed same-product alias/snapshot resolution (for example `grok-4.7` served as a dated `grok-4.7-<snapshot>`, or `grok-4-latest` served as `grok-4-<snapshot>`) stays eligible, while a different model is a mismatch and ineligible. A direct route whose payload omits the model stays selected-only. Cursor Agent and Codex CLI echo the requested ID, so that attribution is selected-only and unverifiable—never call a requested or selected ID the actual model. Never select Cursor Auto, infer a requested ID from a display label, silently change a model, or pivot to another harness/provider.
|
|
10
10
|
<!-- PORTABLE-CONTRACT:END -->
|
|
11
11
|
|
|
12
12
|
## Host adapters
|
|
@@ -15,8 +15,8 @@ For the standard workflow, the current host model records an independent analysi
|
|
|
15
15
|
|
|
16
16
|
The current Pi host model completes its independent evidence memo first. Standard provider lists use native `ask-multi`. A routed participant uses the matching native tool instead: `provider@cursor-agent:model` calls `ask-cursor-agent` with separate `provider` and exact `model`; direct Grok calls `ask-grok` with the explicit `harness` and exact model. A participant list mixing routed `provider@harness:exact-model-id` entries with bare provider names is refused before any tool call; nothing is dispatched or substituted. For the exact Grok + Sol panel, issue only these two consultations (concurrently when the host supports it):
|
|
17
17
|
|
|
18
|
-
- `ask-cursor-agent({ provider: "grok", model: "
|
|
19
|
-
- `ask-cursor-agent({ provider: "codex", model: "gpt-
|
|
18
|
+
- `ask-cursor-agent({ provider: "grok", model: "grok-4.7-high", prompt })`
|
|
19
|
+
- `ask-cursor-agent({ provider: "codex", model: "gpt-6-sol-high", prompt })`
|
|
20
20
|
|
|
21
21
|
Do not call `ask-multi` for that panel because it cannot express Cursor harness identity, and do not call Gemini. Treat the host memo as non-voting verification evidence, not a third panel answer. If either participant fails, label the run partial and do not claim two-model consensus.
|
|
22
22
|
|
|
@@ -38,19 +38,19 @@ Consult an explicitly selected panel on a topic, then synthesize the responses a
|
|
|
38
38
|
- Bare `grok` retains the existing direct canonical runner and its explicit `ASK_GROK_HARNESS` selection (`xai-api` default or `grok-cli`) for compatibility. That direct route never falls back.
|
|
39
39
|
- Preferred explicit syntax is `provider@harness:exact-model-id`. Supported routed participants are:
|
|
40
40
|
- `grok@cursor-agent:<exact ID from agent --list-models>` (preferred Grok route)
|
|
41
|
-
- `codex@cursor-agent:<exact GPT-
|
|
41
|
+
- `codex@cursor-agent:<exact GPT-6 Sol ID from agent --list-models>`
|
|
42
42
|
- `grok@grok-cli:<exact ID from grok models>` (explicit Grok Build alternative)
|
|
43
43
|
- `grok@xai-api:<exact ID from GET /v1/models>`
|
|
44
|
-
- `codex@codex-cli:gpt-
|
|
44
|
+
- `codex@codex-cli:gpt-6-sol` (explicit direct Codex alternative; any reported fallback makes the exact panel partial)
|
|
45
45
|
- Never accept `Auto`, map a display label to an ID, or substitute a route. A missing registration/harness, unavailable model, auth failure, or unsupported provider/harness pair is a participant failure with its actionable error preserved.
|
|
46
|
-
- A participant list must be either all bare provider names or all routed `provider@harness:exact-model-id` specs. A mixed list (for example `grok@cursor-agent:
|
|
46
|
+
- A participant list must be either all bare provider names or all routed `provider@harness:exact-model-id` specs. A mixed list (for example `grok@cursor-agent:grok-4.7-high,antigravity`) is refused before any dispatch with the "Mixed brainstorm participant lists are not supported" error; no participant is rerouted to a bare runner, substituted, or dispatched. Generalized mixed panels are deferred to a future ADR.
|
|
47
47
|
- Everything after the participant list is the topic.
|
|
48
48
|
- In standard mode, Claude Opus remains a participant. In the exact Grok + Sol mode below, Claude is only the non-voting evidence verifier/synthesizer so the panel has exactly two participants.
|
|
49
49
|
|
|
50
|
-
**Architect workflow — exactly Grok + GPT-
|
|
50
|
+
**Architect workflow — exactly Grok + GPT-6 Sol, no Gemini:**
|
|
51
51
|
|
|
52
52
|
```text
|
|
53
|
-
/brainstorm grok@cursor-agent:
|
|
53
|
+
/brainstorm grok@cursor-agent:grok-4.7-high,codex@cursor-agent:gpt-6-sol-high "review this architecture"
|
|
54
54
|
```
|
|
55
55
|
|
|
56
56
|
These IDs are exact catalog examples verified for this workflow; account catalogs can change, so use `agent --list-models` and replace an unavailable ID explicitly. The coordinator must not call Gemini, the direct Grok runner, xAI API, Grok Build, or Codex CLI for this invocation.
|
|
@@ -58,7 +58,7 @@ These IDs are exact catalog examples verified for this workflow; account catalog
|
|
|
58
58
|
**Explicit Grok Build alternative (still no Gemini):**
|
|
59
59
|
|
|
60
60
|
```text
|
|
61
|
-
/brainstorm grok@grok-cli:grok-
|
|
61
|
+
/brainstorm grok@grok-cli:grok-4.7,codex@cursor-agent:gpt-6-sol-high "review this architecture"
|
|
62
62
|
```
|
|
63
63
|
|
|
64
64
|
This route is valid only when the installed Grok Build contract supports Ask LLM's headless JSON/read-only flags. Failure is terminal for the Grok participant; do not pivot to Cursor or xAI.
|
|
@@ -38,7 +38,7 @@ Codex's `image_generation` tool selects the image model server-side; as of 2026-
|
|
|
38
38
|
|
|
39
39
|
- `codex-cli` >= 0.125.0 installed and authenticated
|
|
40
40
|
- `image_generation` feature flag enabled (default: stable + true). Verify with `codex features list | grep image_generation`
|
|
41
|
-
- The `ask-codex` MCP tool available (from `@ask-llm/codex-mcp` or the `@ask-llm/mcp`
|
|
41
|
+
- The `ask-codex` MCP tool available (from `@ask-llm/codex-mcp`) or the unified `mcp__ask-llm__ask-llm` tool (from `@ask-llm/mcp`) whose schema includes `sandbox`
|
|
42
42
|
|
|
43
43
|
## Instructions
|
|
44
44
|
|
|
@@ -65,9 +65,9 @@ Example slug derivation:
|
|
|
65
65
|
- "Generate an image of a dark terminal with two reviewers" → `dark-terminal-with-two-reviewers.png`
|
|
66
66
|
- "Make me a cat picture" → `cat-picture.png`
|
|
67
67
|
|
|
68
|
-
### Phase 3: Dispatch to
|
|
68
|
+
### Phase 3: Dispatch to Codex
|
|
69
69
|
|
|
70
|
-
Call
|
|
70
|
+
Call an exact `ask-codex` leaf when exposed (NOT raw `codex exec` — that bypasses ADR-044 quota fallback, ADR-042 stdin handling, and ADR-047 PATH resolution). If only unified `mcp__ask-llm__ask-llm` is exposed, use that instead with `provider: "codex"`. If the unified schema lacks `sandbox`, stop and tell the user to upgrade `@ask-llm/mcp` (`npx -y @ask-llm/mcp@latest` or `npm install -g @ask-llm/mcp`); do not omit `sandbox` to make the call succeed. Use this prompt template:
|
|
71
71
|
|
|
72
72
|
```
|
|
73
73
|
Use your image_generation tool to create the following image and save it as a PNG file.
|
|
@@ -80,9 +80,9 @@ Save the file to this absolute path: <path from Phase 2>
|
|
|
80
80
|
After saving, confirm the absolute path of the created file and its byte size in your reply. If image_generation fails or the file cannot be written, explain what went wrong and do not invent a fake path.
|
|
81
81
|
```
|
|
82
82
|
|
|
83
|
-
**Sandbox:** pass `sandbox: "workspace-write"` on this `ask-codex`
|
|
83
|
+
**Sandbox:** pass `sandbox: "workspace-write"` on this `ask-codex` or fully pinned `ask-llm({ provider: "codex", ... })` call. Codex defaults to the read-only review sandbox (ADR-136), under which it cannot write the PNG to disk; image generation is the sanctioned exception that needs Codex to write the output file itself. The unified server will not silently strip `sandbox`; an older `@ask-llm/mcp` that cannot honor it must fail closed.
|
|
84
84
|
|
|
85
|
-
**Default model:** let `ask-codex` use its default (`gpt-
|
|
85
|
+
**Default model:** let `ask-codex` use its default (`gpt-6-astra`). The image_generation tool is invoked by the model regardless of which Codex chat model is selected — model selection here is about the orchestrating agent, not the image model itself.
|
|
86
86
|
|
|
87
87
|
**Wall time expectation:** with gpt-image-2, simple images typically render in **under a minute** end-to-end; complex prompts or high-resolution (up to 4K) renders can take a **few minutes** because gpt-image-2's thinking mode plans layout and self-checks before generating. This is normal; do not retry assuming a hang. The first call in a session is slowest because the image_generation tool definitions aren't cached yet; subsequent calls in the same session are faster (Codex CLI prompt-caches aggressively).
|
|
88
88
|
|
|
@@ -113,7 +113,7 @@ Phase 3 — `ask-codex` is called with the prompt template above.
|
|
|
113
113
|
|
|
114
114
|
Phase 4 — `ls -la /tmp/codex-images/2026-04-24/cat-reading-a-book.png` shows a 248KB file. Skill returns:
|
|
115
115
|
|
|
116
|
-
> Generated **/tmp/codex-images/2026-04-24/cat-reading-a-book.png** (248 KB) via gpt-image-2. Used Codex (gpt-
|
|
116
|
+
> Generated **/tmp/codex-images/2026-04-24/cat-reading-a-book.png** (248 KB) via gpt-image-2. Used Codex (gpt-6-sol) as orchestrator. Refined prompt: *minimalist illustration of a cat reading a book, flat vector style, two-tone palette, no human figures, square framing, transparent background*. Reading inline below.
|
|
117
117
|
|
|
118
118
|
[image renders]
|
|
119
119
|
|
|
@@ -19,12 +19,12 @@ Pi requires project trust, this repository marker, and explicit user-owned allow
|
|
|
19
19
|
|
|
20
20
|
Cursor discovers this `SKILL.md` through its supported Agent Skills surface; `/codex-pair` attaches it as an explicit command. Do **not** use Claude Code's `PostToolUse`, `Stop`, `SessionStart`, `SessionEnd`, `CLAUDE_PLUGIN_ROOT`, `AskUserQuestion`, or plugin tool namespaces. This adapter is an on-demand iterative pairing session, not a claim that Claude hooks were registered in Cursor.
|
|
21
21
|
|
|
22
|
-
1. Read `../pairing-contract.md`. The Cursor plugin bundle registers only the unified `ask-llm` server; if the user separately installed `@ask-llm/codex-mcp`, prefer that deterministic `ask-codex` leaf. Resolve an exposed MCP tool whose exact leaf is `ask-codex`; do not assume its server prefix. When only the unified `ask-llm` leaf is registered, it may serve as the transport with `provider: "codex"` and every option (model, reasoning effort, include directories, session) pinned explicitly; its schema rejects unsupported combinations instead of stripping them
|
|
22
|
+
1. Read `../pairing-contract.md`. The Cursor plugin bundle registers only the unified `ask-llm` server; if the user separately installed `@ask-llm/codex-mcp`, prefer that deterministic `ask-codex` leaf. Resolve an exposed MCP tool whose exact leaf is `ask-codex`; do not assume its server prefix. When only the unified `ask-llm` leaf is registered, it may serve as the transport with `provider: "codex"` and every option (model, reasoning effort, include directories, sandbox, session) pinned explicitly; its schema rejects unsupported combinations instead of stripping them. Inspect the advertised schema before the first call: if `sandbox` or another required Codex option is missing, stop and upgrade `@ask-llm/mcp` rather than omitting the field. Never make an unpinned generic call. If neither tool is exposed, stop with the recommended user-installed unified server:
|
|
23
23
|
```json
|
|
24
24
|
{"mcpServers":{"ask-llm":{"command":"npx","args":["-y","@ask-llm/mcp"]}}}
|
|
25
25
|
```
|
|
26
26
|
Save that as project `.cursor/mcp.json` or user `~/.cursor/mcp.json`, ensure `codex` is authenticated, reload the server from Cursor Settings → Tools & MCP or restart Cursor Agent, and invoke `/codex-pair` again. A split `codex` entry using `@ask-llm/codex-mcp` is an explicit user-installed alternative when only the `ask-codex` leaf is desired; keep one registration per server (the plugin already provides `ask-llm`, so do not add a second `ask-llm` entry merely to duplicate it).
|
|
27
|
-
2. Require both `model=<exact ID>` and `effort=low|medium|high|xhigh|max`; parse optional `include=dir1,dir2`. If model or effort is omitted, ask the user to
|
|
27
|
+
2. Require both `model=<exact ID>` and `effort=low|medium|high|xhigh|max|ultra`; parse optional `include=dir1,dir2`. If model or effort is omitted, ask the user to confirm the pair defaults `model=gpt-6-sol` and `effort=medium`, then stop before reading extra context, requesting consent, or calling a provider. Do not infer either value from the Cursor host environment: the MCP server may resolve different `ASK_CODEX_MODEL` or `ASK_CODEX_REASONING_EFFORT` values. Reject absolute, `..`, and `~` include paths; cap at 32. Build a bounded context manifest (20 KB/file, 100 KB/request) from task requirements, relevant project instructions, changed files, and tests. Do not send secrets or unrelated files.
|
|
28
28
|
3. Before the first provider call, show host=`Cursor Agent`, reviewer provider=`codex`, selected transport=`ask-codex` or unified `ask-llm`, exact user-supplied model, exact user-supplied reasoning effort, include directories, read-only behavior, data/quota boundary, and fresh persisted-session intent. Ask for explicit confirmation using Cursor's normal conversational approval surface. Refusal ends `cancelled` with no provider call.
|
|
29
29
|
4. First call exactly one of these protocol shapes, substituting the already disclosed explicit choices:
|
|
30
30
|
```json
|
|
@@ -48,13 +48,14 @@ Cursor discovers this `SKILL.md` through its supported Agent Skills surface; `/c
|
|
|
48
48
|
"model": "<required exact ID>",
|
|
49
49
|
"reasoningEffort": "<required effort>",
|
|
50
50
|
"includeDirs": ["<validated relative directory>"],
|
|
51
|
-
"sessionId": ""
|
|
51
|
+
"sessionId": "",
|
|
52
|
+
"sandbox": "read-only"
|
|
52
53
|
}
|
|
53
54
|
}
|
|
54
55
|
]
|
|
55
56
|
```
|
|
56
57
|
The prompt assigns Codex the independent reviewer role and requests actionable severity/file/line evidence. Capture the returned structured `sessionId`/Thread ID and actual model. Relay feedback before changing code; verify every finding against source and label it accepted, rejected, or deferred.
|
|
57
|
-
5. At meaningful checkpoints, call the same tool with the captured `sessionId`, same model/effort, and bounded delta.
|
|
58
|
+
5. At meaningful checkpoints, call the same tool with the captured `sessionId`, same model/effort, and bounded delta. Keep `sandbox: "read-only"` on both `ask-codex` and unified `ask-llm`. If the unified schema lacks `sandbox`, stop and upgrade `@ask-llm/mcp` rather than omitting it. Omit `includeDirs` on resumed calls because `codex exec resume` does not support them (every Codex transport — split `ask-codex`, unified `ask-llm`, and Pi — rejects that combination at the shared executor instead of dropping the directories); never silently strip them from the first call. If no session ID was returned, stop with a session diagnostic instead of pretending continuity.
|
|
58
59
|
6. A Cursor interrupt cancels the MCP request. Report `cancelled` and never retry another tool/model/provider. Preserve earlier feedback on later failure and report `failed (partial)`. On success report `completed` with host, provider, requested/actual model, effort, session reuse count, context/include directories, accepted/rejected/deferred actions, and any reported Codex quota fallback. Never conceal fallback or rewrite a model.
|
|
59
60
|
|
|
60
61
|
<!-- HOST-ADAPTER:CLAUDE-CODE:START -->
|
|
@@ -195,7 +196,8 @@ Render a status table:
|
|
|
195
196
|
codex-pair status — <MARKER_DIR>
|
|
196
197
|
|
|
197
198
|
State: ACTIVE ✓
|
|
198
|
-
Marker model: <model from frontmatter of context.md, or "default (gpt-
|
|
199
|
+
Marker model: <model from frontmatter of context.md, or "default (gpt-6-sol)">
|
|
200
|
+
Reasoning effort: medium (override with ASK_CODEX_REASONING_EFFORT)
|
|
199
201
|
Surface threshold: <surfaceThreshold from frontmatter, or "med">
|
|
200
202
|
Cost/review: varies by Codex plan and workload / ~13–50s wall-clock
|
|
201
203
|
|
|
@@ -302,7 +304,7 @@ Claude edits src/billing/charge.ts
|
|
|
302
304
|
|
|
303
305
|
## Cost characteristics
|
|
304
306
|
|
|
305
|
-
- Usage varies by Codex plan and workload (`gpt-
|
|
307
|
+
- Usage varies by Codex plan and workload (`gpt-6-sol` with reasoning tokens)
|
|
306
308
|
- ~13–50s per file wall-clock
|
|
307
309
|
- Files >20 KB skipped (override with `CODEX_PAIR_MAX_FILE_BYTES`)
|
|
308
310
|
- node_modules, dist, lockfiles, images skipped automatically
|
|
@@ -47,6 +47,6 @@ For **recall-first** review on hot-path code (money handling, security paths, sp
|
|
|
47
47
|
|
|
48
48
|
2. If the diff is empty, inform the user there are no changes to review.
|
|
49
49
|
|
|
50
|
-
3. Launch the `codex-reviewer` agent with the diff content. The agent handles the Codex prompt structure and output formatting, using GPT-
|
|
50
|
+
3. Launch the `codex-reviewer` agent with the diff content. The agent handles the Codex prompt structure and output formatting, using GPT-6 Astra at `high` reasoning effort with automatic Terra fallback.
|
|
51
51
|
|
|
52
52
|
<!-- HOST-ADAPTER:CLAUDE-CODE:END -->
|
|
@@ -35,9 +35,9 @@ Run an iterative pair-programming session in which Claude remains the sole edito
|
|
|
35
35
|
Accept optional command text in this form (ask for any missing choice):
|
|
36
36
|
|
|
37
37
|
```text
|
|
38
|
-
/grok-pair route=cursor-agent model=
|
|
39
|
-
/grok-pair route=xai-api model=grok-4.
|
|
40
|
-
/grok-pair route=grok-cli model=grok-
|
|
38
|
+
/grok-pair route=cursor-agent model=grok-4.7-high include=packages/api,packages/shared <task>
|
|
39
|
+
/grok-pair route=xai-api model=grok-4.7 effort=xhigh <task>
|
|
40
|
+
/grok-pair route=grok-cli model=grok-4.7 effort=high <task>
|
|
41
41
|
```
|
|
42
42
|
|
|
43
43
|
Supported routes:
|
|
@@ -20,7 +20,7 @@ Additional directories must be explicit relative workspace paths: no absolute pa
|
|
|
20
20
|
|
|
21
21
|
## Transport, options, and attribution
|
|
22
22
|
|
|
23
|
-
Select one route before the first call and keep it immutable for the run. Resolve tools by their exact leaf capability (`ask-codex`, `ask-grok`, or `ask-cursor-agent`), not by assuming a Claude plugin namespace. The unified `ask-llm` tool is an acceptable transport only when the call pins provider, harness where applicable, exact model, reasoning effort, include directories, and session explicitly and its schema rejects unsupported combinations rather than stripping them; it is never an unpinned generic call and never a fallback for a failed split tool. A missing tool is a setup failure, never permission to use a generic call.
|
|
23
|
+
Select one route before the first call and keep it immutable for the run. Resolve tools by their exact leaf capability (`ask-codex`, `ask-grok`, or `ask-cursor-agent`), not by assuming a Claude plugin namespace. The unified `ask-llm` tool is an acceptable transport only when the call pins provider, harness where applicable, exact model, reasoning effort, include directories, sandbox where the route supports it, and session explicitly and its schema rejects unsupported combinations rather than stripping them; it is never an unpinned generic call and never a fallback for a failed split tool. If the advertised schema lacks a required Codex option (`reasoningEffort`, `includeDirs`, `preferred`, `sandbox`), stop and upgrade `@ask-llm/mcp` rather than omitting the field. A missing tool is a setup failure, never permission to use a generic call.
|
|
24
24
|
|
|
25
25
|
Every call and final report must keep these separate:
|
|
26
26
|
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sol-review
|
|
3
|
-
description: Review the current code changes specifically with OpenAI GPT-
|
|
3
|
+
description: Review the current code changes specifically with OpenAI GPT-6 Sol. Use when the user asks for a Sol review, says "review with Sol", wants a model-pinned Codex review, or invokes /sol-review.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
<!-- PORTABLE-CONTRACT:START -->
|
|
7
7
|
## Portable contract
|
|
8
8
|
|
|
9
|
-
Gather a bounded diff and context brief, request a read-only Codex review explicitly pinned to `gpt-
|
|
9
|
+
Gather a bounded diff and context brief, request a read-only Codex review explicitly pinned to `gpt-6-sol` with `reasoningEffort: "high"`, verify findings against source, and disclose any model or transport fallback. Do not silently substitute another provider.
|
|
10
10
|
<!-- PORTABLE-CONTRACT:END -->
|
|
11
11
|
|
|
12
12
|
## Host adapters
|
|
13
13
|
|
|
14
14
|
### Pi adapter
|
|
15
15
|
|
|
16
|
-
Call `ask-codex` with `model: "gpt-
|
|
16
|
+
Call `ask-codex` with `model: "gpt-6-sol"`, `reasoningEffort: "high"`, and `sandbox: "read-only"`; apply only the portable contract in `../../agents/sol-reviewer.md` and disclose fallback metadata.
|
|
17
17
|
|
|
18
18
|
<!-- HOST-ADAPTER:CLAUDE-CODE:START -->
|
|
19
19
|
### Claude Code adapter
|
|
@@ -24,7 +24,7 @@ The existing detailed workflow below is the Claude Code adapter. Its Agent, MCP,
|
|
|
24
24
|
|
|
25
25
|
# Sol Code Review
|
|
26
26
|
|
|
27
|
-
Run a read-only, precision-first review explicitly pinned to GPT-
|
|
27
|
+
Run a read-only, precision-first review explicitly pinned to GPT-6 Sol at high reasoning effort.
|
|
28
28
|
|
|
29
29
|
## Workflow
|
|
30
30
|
|
|
@@ -33,13 +33,13 @@ Run a read-only, precision-first review explicitly pinned to GPT-5.6 Sol at high
|
|
|
33
33
|
3. If the combined diff is empty, report that there are no changes to review.
|
|
34
34
|
4. Read the root and file-scoped `CLAUDE.md` files plus any ADRs cited by changed code.
|
|
35
35
|
5. Preflight the transport through the shipped executable contract:
|
|
36
|
-
- Search the current tool surface for
|
|
37
|
-
- Run `node "${CLAUDE_PLUGIN_ROOT}/scripts/sol-review-transport.mjs" --plugin-dir "${CLAUDE_PLUGIN_ROOT}" --cli-path "$(command -v codex || true)"`, adding `--tool "<resolved tool name>"`
|
|
38
|
-
- Preserve the returned `state`, `diagnostic`, `remediation`, and `fallbackDisclosure`. The executable reads `claude mcp list` with that session context: `missing-registration` means that active inventory has no supported registration; `unavailable` means it contains the registration but the current tool surface does not expose a usable tool, reports failed health, or the MCP invocation failed; `inventory-unavailable` means the active inventory could not be inspected, so registration and service health are unknown. Do not collapse those states into a generic "no MCP" message. If `transport` is null, stop and show the executable remediation instead of launching the agent.
|
|
36
|
+
- Search the current tool surface for an exact `ask-codex` leaf first, then an `ask-llm` leaf. The executable correlates each client-assigned server prefix with an active `@ask-llm/codex-mcp` or `@ask-llm/mcp` registration; similarly named tools and tools from unrelated servers are not authoritative.
|
|
37
|
+
- Run `node "${CLAUDE_PLUGIN_ROOT}/scripts/sol-review-transport.mjs" --plugin-dir "${CLAUDE_PLUGIN_ROOT}" --cli-path "$(command -v codex || true)"`, adding `--tool "<resolved tool name>"` when an exact `ask-codex` or `ask-llm` tool resolved. For unified `ask-llm`, also pass `--tool-schema "<advertised input JSON schema>"` so a missing `reasoningEffort`/`includeDirs`/`preferred`/`sandbox` property is `unsupported-schema`, not a silent strip. Mirror any session-local `--mcp-config`, `--settings`, `--setting-sources`, and `--strict-mcp-config` flags so the nested inventory sees the same configuration as the active session.
|
|
38
|
+
- Preserve the returned `state`, `diagnostic`, `remediation`, and `fallbackDisclosure`. The executable reads `claude mcp list` with that session context: `preferred` is a usable `ask-codex` leaf; `unified` is a usable `mcp__ask-llm__ask-llm` (or namespaced) leaf whose advertised schema honors Codex options and that must be called with `provider: "codex"` and the complete Codex option set; `missing-registration` means that active inventory has no supported registration; `unavailable` means it contains the registration but the current tool surface does not expose a usable tool, reports failed health, or the MCP invocation failed; `unsupported-schema` means unified MCP is present but its schema was not supplied or cannot honor Codex options — pass `--tool-schema` or upgrade `@ask-llm/mcp` rather than omitting fields; `inventory-unavailable` means the active inventory could not be inspected, so registration and service health are unknown. Do not collapse those states into a generic "no MCP" message. If `transport` is null, stop and show the executable remediation instead of launching the agent.
|
|
39
39
|
- Parent availability remains advisory because subagents do not always inherit the session's MCP servers. The reviewer's fallback runner re-reads the active inventory and reclassifies the absent subagent tool before executing the CLI fallback.
|
|
40
40
|
6. Launch the `sol-reviewer` agent with the diff and a compact context brief containing the changed files, applicable conventions, referenced ADRs, the user's requested review focus, and the complete preflight result.
|
|
41
41
|
7. Return the agent's validated findings without adding unverified issues.
|
|
42
42
|
|
|
43
|
-
The reviewer must call `ask-codex` with `model: "gpt-
|
|
43
|
+
The reviewer must call `ask-codex` with `model: "gpt-6-sol"`, `reasoningEffort: "high"`, and `sandbox: "read-only"`, or the unified `ask-llm` equivalent with `provider: "codex"` and those same fields, or use the shipped CLI fallback runner when no usable MCP tool is available, its schema cannot honor those options, or its invocation fails at the transport/service boundary. That runner executes the sanctioned `codex exec -m gpt-6-sol -c model_reasoning_effort="high" -s read-only --ignore-user-config --ignore-rules --skip-git-repo-check` contract and relays its result unchanged. This explicit pin distinguishes `/sol-review` from `/codex-review`, which follows the configured Codex default. Both fallback kinds must be disclosed in the report: a Terra quota fallback means the requested Sol review did not complete on Sol, and a CLI transport fallback must report missing registration, registered-service unavailability, an unsupported unified schema, or an unreadable inventory without claiming a state that could not be determined.
|
|
44
44
|
|
|
45
45
|
<!-- HOST-ADAPTER:CLAUDE-CODE:END -->
|