@rayburst/cc 1.0.25 → 1.0.27

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.
@@ -77,11 +77,13 @@ Print a warning:
77
77
 
78
78
  If a feature-atlas key is found, proceed to Step 1 using this derived prefix.
79
79
 
80
- ---
81
-
82
- **Level 3 (curl-only fallback)**
80
+ If no feature-atlas server is found in either `rb-config.md` or `.mcp.json`, stop immediately:
81
+ ```
82
+ ERROR: rb:discover requires an MCP server assigned to the `feature-atlas` role.
83
83
 
84
- Only if no feature-atlas server is found in either `rb-config.md` or `.mcp.json`: fall back to curl JSON-RPC using the Bearer token of the first HTTP MCP server in `.mcp.json`. Note that all subsequent MCP calls in the workflow will use curl JSON-RPC instead of MCP tool calls.
84
+ Run /rb:init to configure MCP server role assignments.
85
+ The feature-atlas role must be mapped to an MCP server in .mcp.json before running discovery.
86
+ ```
85
87
 
86
88
  ---
87
89
 
@@ -94,7 +96,15 @@ Call:
94
96
  ```
95
97
 
96
98
  - **Success** → proceed with MCP tool calls
97
- - **Failure** → switch to curl fallback for all remaining MCP calls; do NOT stop the workflow
99
+ - **Failure** → stop immediately:
100
+ ```
101
+ ERROR: The MCP server for the feature-atlas role is not loaded in this session.
102
+
103
+ The MCP server '<server-name>' must be available. Try:
104
+ 1. Start a new Claude session (MCP servers load at session start)
105
+ 2. Verify the server entry exists in .mcp.json
106
+ 3. Re-run /rb:init to confirm role assignments
107
+ ```
98
108
 
99
109
  ---
100
110
 
@@ -5,8 +5,7 @@ allowed-tools:
5
5
  - Glob
6
6
  - Grep
7
7
  - Bash
8
- - EnterPlanMode
9
- - ExitPlanMode
8
+ - Agent
10
9
  - mcp__playwright__browser_navigate
11
10
  - mcp__playwright__browser_snapshot
12
11
  - mcp__playwright__browser_click
@@ -24,7 +23,7 @@ allowed-tools:
24
23
 
25
24
  # rb:implement — Card Implementation
26
25
 
27
- Implement a Rayburst board card: load the card and its linked features + criteria, detect conflicts with other active features, enter plan mode for approval, execute the implementation, and move the card to `validation` when done. QA validation is a separate step (`/rb:validate-card`).
26
+ Implement a Rayburst board card end-to-end: load the card + linked features, plan with a subagent, execute with a subagent, then move to `validation`. Works like `/gsd:quick` spawns a planner agent then an executor agent with no interactive plan approval pause.
28
27
 
29
28
  ## Reference Data
30
29
 
@@ -48,7 +47,7 @@ Examples:
48
47
 
49
48
  ## Workflow
50
49
 
51
- ### Step 0b: Resolve MCP Prefix
50
+ ### Step 1: Resolve MCP Prefix
52
51
 
53
52
  Read `.claude/rb-config.md` and parse the `## MCP Role Assignments` table. Find the row where `Role` is `engineer` and read its `MCP Server Name`.
54
53
 
@@ -58,25 +57,39 @@ Read `.claude/rb-config.md` and parse the `## MCP Role Assignments` table. Find
58
57
  ```
59
58
  Example: if the server name is `rayburst-rb-engineer-780086`, then `MCP_PREFIX = mcp__rayburst-rb-engineer-780086__`.
60
59
 
61
- - If `.claude/rb-config.md` does not exist or the role is `unassigned`, set `MCP_PREFIX = ""` and use the curl fallback for all MCP calls (see "MCP Curl Fallback" section below). Read the API key from `.mcp.json` under the first HTTP MCP server entry.
60
+ - If `.claude/rb-config.md` does not exist or the role is `unassigned`, stop immediately:
61
+ ```
62
+ ERROR: rb:implement requires an MCP server assigned to the `engineer` role.
63
+
64
+ Run /rb:init to configure MCP server role assignments.
65
+ The engineer role must be mapped to an MCP server in .mcp.json before implementing cards.
66
+ ```
62
67
 
63
68
  All MCP tool calls below use `<MCP_PREFIX>` as a stand-in for the resolved prefix.
64
69
 
65
70
  ---
66
71
 
67
- ### Step 1: Verify MCP Connection
72
+ ### Step 2: Verify MCP Connection
68
73
 
69
74
  ```
70
75
  <MCP_PREFIX>ping()
71
76
  ```
72
77
 
73
- **If the MCP tool is not found** (error: "No such tool available"), the MCP server did not load in this session. Fall back to curl JSON-RPC for the entire workflow (see "MCP Curl Fallback" section).
78
+ If ping fails (tool not found or error), stop immediately:
79
+ ```
80
+ ERROR: The MCP server for the engineer role is not loaded in this session.
81
+
82
+ The MCP server '<server-name>' must be available. Try:
83
+ 1. Start a new Claude session (MCP servers load at session start)
84
+ 2. Verify the server entry exists in .mcp.json
85
+ 3. Re-run /rb:init to confirm role assignments
86
+ ```
74
87
 
75
- If ping via curl also fails (network error), stop and report the error.
88
+ ---
76
89
 
77
- ### Step 2: Resolve the Card
90
+ ### Step 3: Resolve the Card
78
91
 
79
- **If the input looks like a UUID** (contains hyphens in UUID format):
92
+ **If the input looks like a UUID:**
80
93
 
81
94
  ```
82
95
  <MCP_PREFIX>get_card({ cardId: "<input>" })
@@ -88,207 +101,160 @@ If ping via curl also fails (network error), stop and report the error.
88
101
  <MCP_PREFIX>list_cards({ boardId: "23578fa2-49c1-475c-b398-6d7080a676bc" })
89
102
  ```
90
103
 
91
- Find the card whose title best matches the input. If multiple close matches exist, pick the closest and note it. Then call:
104
+ Find the closest title match, then call `get_card` on it.
92
105
 
93
- ```
94
- <MCP_PREFIX>get_card({ cardId: "<resolved-id>" })
95
- ```
96
-
97
- Collect from the `get_card` response:
98
- - `card.id`, `card.title`, `card.description`, `card.status`
99
- - `card.todos[]` — implementation checklist items
100
- - `card.columnId` / current board context
106
+ Collect: `card.id`, `card.title`, `card.description`, `card.status`, `card.todos[]`.
101
107
 
102
- **If card status is not `ready` or `in-progress`**, warn the user:
108
+ **If card status is not `ready` or `in-progress`**, warn and ask:
103
109
  ```
104
- ⚠️ Card "<title>" is currently in status "<status>". Expected status is "ready".
105
- Proceed anyway? (yes / no)
110
+ ⚠️ Card "<title>" is currently "<status>". Expected "ready". Proceed anyway? (yes / no)
106
111
  ```
107
112
  Stop if the user says no.
108
113
 
109
- ### Step 3: Load Linked Features & Criteria
114
+ ---
115
+
116
+ ### Step 4: Load Linked Features & Criteria
110
117
 
111
118
  ```
112
119
  <MCP_PREFIX>list_card_features({ cardId: "<cardId>" })
113
120
  ```
114
121
 
115
- For each linked feature, call:
116
-
122
+ For each linked feature:
117
123
  ```
118
124
  <MCP_PREFIX>get_feature({ featureId: "<featureId>" })
119
125
  ```
120
126
 
121
- Build a **test plan** from all acceptance criteria across all linked features. Each criterion becomes a target behavior the implementation must satisfy.
122
-
123
- Also fetch prior validation reports for this card:
124
-
127
+ Also load prior validation reports:
125
128
  ```
126
129
  <MCP_PREFIX>list_validations({ cardId: "<cardId>" })
127
130
  ```
128
131
 
129
- Review the reports to understand which criteria have previously passed or failed. Use this context when building the test plan — criteria that have previously failed should receive extra implementation attention.
130
-
131
- If no features are linked, warn the user:
132
- ```
133
- ⚠️ No features are linked to this card. Implementation will proceed without acceptance criteria.
134
- ```
135
-
136
- #### Step 3b: Load Prior Validation Context (if card was returned from validation)
137
-
138
- If the card's current status is `in-progress` (indicating it may have been returned from validation after a QA failure), fetch prior failure context:
139
-
132
+ If the card is `in-progress` (possible QA return), also check for prior failures:
140
133
  ```
141
134
  <MCP_PREFIX>list_comments({ cardId: "<cardId>" })
142
- <MCP_PREFIX>list_validations({ cardId: "<cardId>" })
143
- ```
144
-
145
- Inspect the comments for a recent QA failure comment (look for "QA: Validation Failed" in the content). Inspect the latest validation report for criteria with status `"fail"`.
146
-
147
- If a prior failure is detected, display it prominently before proceeding:
148
-
149
- ```
150
- ## Prior QA Failure Detected
151
-
152
- The card was previously returned from validation with the following failures:
153
-
154
- <QA failure comment content>
155
-
156
- The implementation plan will specifically address these failing criteria.
157
135
  ```
136
+ Look for a "QA: Validation Failed" comment and note any failing criteria — these get extra attention in the plan.
158
137
 
159
- Then in Step 6 (Enter Plan Mode), prepend a **"Fixing QA Failures"** section to the plan that explicitly lists the failing criteria and what needs to change, above the general implementation approach.
160
-
161
- If no prior failure comment or validation report is found, proceed normally.
138
+ If no features are linked, warn the user but continue.
162
139
 
163
- ### Step 4: Move Card to `in-progress`
140
+ ---
164
141
 
165
- Before entering plan mode, move the card so the board reflects active work:
142
+ ### Step 5: Move Card to `in-progress`
166
143
 
167
144
  ```
168
145
  <MCP_PREFIX>move_card({ cardId: "<cardId>", status: "in-progress" })
169
146
  ```
170
147
 
171
- ### Step 5: Conflict Detection
172
-
173
- Before planning, detect criteria in *other* active features that this implementation might break.
174
-
175
- **Detection process:**
148
+ ---
176
149
 
177
- 1. Read the card title, description, and linked feature titles to understand the scope of change (which files, components, routes, API endpoints will be touched)
178
- 2. Use `Glob` and `Grep` to identify which source files will need to change
179
- 3. Load the full feature atlas:
180
- ```
181
- <MCP_PREFIX>list_features({ limit: 100 })
182
- ```
183
- 4. For each *other* active feature (status `active`, not linked to this card), check if its criteria describe behavior in the same files/components/routes the implementation will touch
184
- 5. Assess risk level: HIGH if the same component/route is directly modified, MEDIUM if a shared utility is changed, LOW if only indirect overlap
150
+ ### Step 6: Spawn Planner Agent
185
151
 
186
- **If conflicts are found**, STOP and prompt the user before proceeding:
152
+ Spawn a `Plan` subagent to design the implementation. Pass it all the card context you've collected (title, description, todos, criteria, prior failures if any). The planner writes the plan as output — it does NOT write files.
187
153
 
188
154
  ```
189
- ⚠️ Conflict detected before planning.
155
+ Agent(
156
+ subagent_type="Plan",
157
+ prompt="
158
+ You are planning the implementation of a Rayburst board card.
190
159
 
191
- Implementing "<card title>" will modify:
192
- - <file or component>
193
- - <file or component>
160
+ ## Card
161
+ Title: <card title>
162
+ Description: <card description>
163
+ Status: in-progress
164
+ Card ID: <cardId>
194
165
 
195
- The following criteria from other features may be affected:
196
- - Feature: "<other feature title>"
197
- Criterion: "<criterion description>" (ID: <full-uuid>)
198
- Risk: <why this implementation could break it>
166
+ ## Acceptance Criteria
167
+ <list all criteria from linked features, with criterionId and Given/When/Then description>
199
168
 
200
- Options:
201
- 1. Proceed anyway (I'll accept the regression risk)
202
- 2. Adjust the plan to preserve these criteria
203
- 3. Cancel
169
+ ## Todo List (implement in this order)
170
+ <list card todos in order>
204
171
 
205
- Please reply with 1, 2, or 3.
206
- ```
172
+ ## Prior QA Failures (if any)
173
+ <list any criteria that previously failed — these must be fixed>
207
174
 
208
- - **Option 1 (Proceed)**: Note the at-risk criteria in the plan, continue to Step 6
209
- - **Option 2 (Adjust)**: Include criteria preservation in the plan requirements, continue to Step 6
210
- - **Option 3 (Cancel)**: Move the card back to `ready`:
211
- ```
212
- <MCP_PREFIX>move_card({ cardId: "<cardId>", status: "ready" })
213
- ```
214
- Then stop.
215
-
216
- If no conflicts are found, proceed directly to Step 6.
175
+ ## Codebase Context
176
+ App URL: http://www.rayburst.app
177
+ Frontend: rayburst/ (React, TanStack Router, Tailwind v4)
178
+ Backend: rayburst-api/ (Hono, Drizzle ORM, PostgreSQL)
217
179
 
218
- ### Step 6: Enter Plan Mode
180
+ ## Your Task
181
+ Produce a complete implementation plan:
182
+ 1. List every file to create or modify (exact paths)
183
+ 2. Describe the approach for each acceptance criterion
184
+ 3. Cover any DB migrations, API changes, env vars needed
185
+ 4. Note edge cases and error handling
186
+ 5. If prior QA failures exist, add a 'Fixing QA Failures' section at the top
219
187
 
220
- Enter plan mode (`EnterPlanMode`) to design the full implementation approach.
188
+ Output the plan as structured markdown. Be specific — the executor will follow this plan without asking questions.
189
+ ",
190
+ description="Plan: <card title>"
191
+ )
192
+ ```
221
193
 
222
- The plan must cover:
223
- - Files to create or modify (with exact paths)
224
- - Implementation approach for each acceptance criterion from the test plan
225
- - Any database migrations, API changes, or environment variable additions needed
226
- - Edge cases and error handling
227
- - How at-risk criteria from Step 5 (if any) will be preserved
194
+ Store the plan output as `$PLAN`.
228
195
 
229
- The plan is presented to the user for approval before any code is written. Use `AskUserQuestion` in plan mode if architectural choices need clarification before finalizing.
196
+ ---
230
197
 
231
- ### Step 7: Write Plan as Card Comment
198
+ ### Step 7: Post Plan as Card Comment
232
199
 
233
- After the user approves the plan (via `ExitPlanMode`), post a concise summary to the card:
200
+ Post the plan to the card before execution starts:
234
201
 
235
202
  ```
236
203
  <MCP_PREFIX>add_comment({
237
204
  cardId: "<cardId>",
238
- content: "## Implementation Plan\n\n<plan summary in 2-3 sentences>\n\n### Files to Modify\n- <file path>\n- <file path>\n\n### Approach\n<prose description of the approach>\n\n### Acceptance Criteria Coverage\n- Criterion: <description> <how it will be satisfied>\n- Criterion: <description> — <how it will be satisfied>"
205
+ content: "## Implementation Plan\n\n<$PLAN summary 2-3 sentences>\n\n### Files to Modify\n- <file>\n\n### Approach\n<prose>\n\n### Criteria Coverage\n- <criterion>: <how satisfied>"
239
206
  })
240
207
  ```
241
208
 
242
- Keep the comment under 5000 characters. Use plain markdown prose — no raw code snippets or code fences with actual code (describe the approach, don't paste it).
209
+ Keep under 5000 characters. Describe the approach — no raw code blocks.
243
210
 
244
- ### Step 8: Execute Implementation
245
-
246
- Switch to execute mode. Work through the implementation:
247
-
248
- 1. **Work the todo list in order** — use `list_card_todos` to get the ordered checklist, implement each item before moving to the next
249
- 2. **Make atomic changes** — one logical unit at a time (e.g., backend schema first, then service, then routes, then frontend)
250
- 3. **Run tests after significant changes**:
251
- ```bash
252
- cd rayburst && npm run test -- <relevant-test-file>
253
- cd rayburst-api && npm run type-check
254
- ```
255
- 4. **Run lint/type check before moving on**:
256
- ```bash
257
- cd rayburst && npm run check
258
- cd rayburst-api && npm run check
259
- ```
211
+ ---
260
212
 
261
- **At-risk criteria preservation**: If Step 5 flagged criteria from other features, verify after each relevant change that the behavior described in those criteria is still correct.
213
+ ### Step 8: Spawn Executor Agent
262
214
 
263
- ### Step 9: Verify Criteria
215
+ Spawn a `general-purpose` subagent to execute the plan. Pass it the full plan and all card context.
264
216
 
265
- After implementation is complete, do a self-check pass for each acceptance criterion:
217
+ ```
218
+ Agent(
219
+ subagent_type="general-purpose",
220
+ prompt="
221
+ You are implementing a Rayburst board card. Execute the plan below completely. Do not ask questions — make decisions and write the code.
266
222
 
267
- For each criterion in the test plan:
268
- - Does the implemented code satisfy the criterion's described behavior?
269
- - Are there relevant tests that cover this behavior? If yes, do they pass?
270
- - Use `Grep` to confirm the key logic is in place
223
+ ## Card
224
+ Title: <card title>
225
+ Card ID: <cardId>
226
+ MCP Prefix: <MCP_PREFIX>
271
227
 
272
- If any criterion is clearly not satisfied, loop back to Step 8 and fix it before continuing. Do not proceed to Step 10 with known gaps.
228
+ ## Implementation Plan
229
+ <full $PLAN>
273
230
 
274
- ### Step 10: Move Card to `validation` and Print Summary
231
+ ## Acceptance Criteria (verify each before finishing)
232
+ <list all criteria with criterionId>
275
233
 
276
- Move the card to `validation` status:
234
+ ## Todo List (work in this order)
235
+ <list card todos>
277
236
 
278
- ```
279
- <MCP_PREFIX>move_card({ cardId: "<cardId>", status: "validation" })
237
+ ## Execution Rules
238
+ - Work through todos in order
239
+ - Make atomic changes (backend schema → service → routes → frontend)
240
+ - After backend changes: run `cd rayburst-api && npm run type-check`
241
+ - After frontend changes: run `cd rayburst && npx biome check <changed files>`
242
+ - After implementation: do a self-check — does each criterion have code that satisfies it?
243
+ - When all todos are complete and criteria are satisfied, call:
244
+ <MCP_PREFIX>move_card({ cardId: '<cardId>', status: 'validation' })
245
+ - Then post a summary comment:
246
+ <MCP_PREFIX>add_comment({ cardId: '<cardId>', content: '## Implementation Complete\n\n### What was built\n<summary>\n\n### Files changed\n- <file>\n\n### Criteria coverage\n- <criterion>: satisfied via <explanation>' })
247
+ - Return a completion message listing files changed and criteria satisfied.
248
+ ",
249
+ description="Implement: <card title>"
250
+ )
280
251
  ```
281
252
 
282
- Post a brief implementation summary comment:
253
+ ---
283
254
 
284
- ```
285
- <MCP_PREFIX>add_comment({
286
- cardId: "<cardId>",
287
- content: "## Implementation Complete\n\nReady for QA validation.\n\n### What was built\n<brief prose summary of what was implemented>\n\n### Files changed\n- <file path>\n- <file path>\n\n### Criteria coverage\n- <criterion description>: satisfied via <brief explanation>"
288
- })
289
- ```
255
+ ### Step 9: Print Summary
290
256
 
291
- Then print:
257
+ After the executor returns, print:
292
258
 
293
259
  ```
294
260
  ## Implementation Complete: <Card Title>
@@ -299,85 +265,19 @@ Then print:
299
265
 
300
266
  ### Files Changed
301
267
  - <file path>
302
- - <file path>
303
268
 
304
269
  Run `/rb:validate-card <cardId>` to run QA validation.
305
270
  ```
306
271
 
307
272
  ---
308
273
 
309
- ## MCP Curl Fallback
310
-
311
- When MCP tools are unavailable, use this curl pattern for all operations. Read the API key from `.mcp.json` under the server assigned to the `engineer` role (or the first HTTP server entry if config is missing).
312
-
313
- ```bash
314
- # Get card
315
- curl -s -X POST "https://api.rayburst.app/api/v1/mcp" \
316
- -H "Authorization: Bearer <KEY>" \
317
- -H "Content-Type: application/json" \
318
- -H "Accept: application/json, text/event-stream" \
319
- -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_card","arguments":{"cardId":"<cardId>"}}}'
320
-
321
- # Move card
322
- curl -s -X POST "https://api.rayburst.app/api/v1/mcp" \
323
- -H "Authorization: Bearer <KEY>" \
324
- -H "Content-Type: application/json" \
325
- -H "Accept: application/json, text/event-stream" \
326
- -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"move_card","arguments":{"cardId":"<cardId>","status":"in-progress"}}}'
327
-
328
- # Add comment
329
- curl -s -X POST "https://api.rayburst.app/api/v1/mcp" \
330
- -H "Authorization: Bearer <KEY>" \
331
- -H "Content-Type: application/json" \
332
- -H "Accept: application/json, text/event-stream" \
333
- -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"add_comment","arguments":{"cardId":"<cardId>","content":"<comment>"}}}'
334
-
335
- # List comments (used in Step 3b to detect prior QA failures)
336
- curl -s -X POST "https://api.rayburst.app/api/v1/mcp" \
337
- -H "Authorization: Bearer <KEY>" \
338
- -H "Content-Type: application/json" \
339
- -H "Accept: application/json, text/event-stream" \
340
- -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"list_comments","arguments":{"cardId":"<cardId>"}}}'
341
-
342
- # List validations (used in Step 3b to identify failing criteria)
343
- curl -s -X POST "https://api.rayburst.app/api/v1/mcp" \
344
- -H "Authorization: Bearer <KEY>" \
345
- -H "Content-Type: application/json" \
346
- -H "Accept: application/json, text/event-stream" \
347
- -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"list_validations","arguments":{"cardId":"<cardId>"}}}'
348
-
349
- # Submit validation report (Steps 13)
350
- curl -s -X POST "https://api.rayburst.app/api/v1/mcp" \
351
- -H "Authorization: Bearer <KEY>" \
352
- -H "Content-Type: application/json" \
353
- -H "Accept: application/json, text/event-stream" \
354
- -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"submit_validation","arguments":{"cardId":"<cardId>","results":[{"criterionId":"<id>","status":"pass","comment":"<evidence>"}],"overallComment":"N of total criteria passing."}}}'
355
-
356
- # Move card to done (Step 14 — only after submit_validation passes)
357
- curl -s -X POST "https://api.rayburst.app/api/v1/mcp" \
358
- -H "Authorization: Bearer <KEY>" \
359
- -H "Content-Type: application/json" \
360
- -H "Accept: application/json, text/event-stream" \
361
- -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"move_card","arguments":{"cardId":"<cardId>","status":"done"}}}'
362
- ```
363
-
364
- Parse the `data:` line from the SSE response to extract the JSON result.
365
-
366
- ---
367
-
368
274
  ## Constraints
369
275
 
370
276
  - **Full UUIDs only** — short hashes return NOT_FOUND
371
277
  - **Rate limit: 60 req/min** — batch MCP calls in groups of 4-5
372
- - **Move card to `in-progress` before plan mode** (Step 4) board must reflect active work
278
+ - **No interactive plan approval** planner agent produces the plan, executor runs it immediately
279
+ - **Move card to `in-progress` before planning** (Step 5) — board must reflect active work
373
280
  - **Post plan as comment before executing** (Step 7) — creates a paper trail
374
- - **Move card to `validation` before QA** (Step 10) required before running browser tests
375
- - **Always run QA validation after implementation** (Steps 11–13) — never stop at `validation` status
376
- - **Only move card to `done` after `submit_validation` passes** (Step 14) — the MCP gate is mandatory
377
- - **On QA failure: post comment then move to `in-progress`** — never leave a failed card in `validation`
378
- - **Do NOT fix failing criteria during QA** — report them, return the card, and stop
379
- - **If conflict detection finds at-risk criteria, STOP and prompt** — do not silently proceed
380
- - **If user cancels after conflict detection, move card back to `ready`** before stopping
281
+ - **Executor moves card to `validation`** do not move it manually after spawning
381
282
  - **Implementation comments under 5000 characters** — no raw code in comment content
382
- - **Validation criterion comments under 500 characters** — plain prose only, no backticks
383
283
  - **Run `/rb:init` first** if `.claude/rb-config.md` is missing
@@ -61,7 +61,13 @@ Read `.claude/rb-config.md` and parse the `## MCP Role Assignments` table. Find
61
61
  ```
62
62
  Example: if the server name is `rayburst-rb-qa-engineer-55ae0f`, then `MCP_PREFIX = mcp__rayburst-rb-qa-engineer-55ae0f__`.
63
63
 
64
- - If `.claude/rb-config.md` does not exist or the role is `unassigned`, set `MCP_PREFIX = ""` and use the curl fallback for all MCP calls (see "MCP Curl Fallback" section below). Read the API key from `.mcp.json` under the first HTTP MCP server entry.
64
+ - If `.claude/rb-config.md` does not exist or the role is `unassigned`, stop immediately:
65
+ ```
66
+ ERROR: rb:validate-card requires an MCP server assigned to the `qa-engineer` role.
67
+
68
+ Run /rb:init to configure MCP server role assignments.
69
+ The qa-engineer role must be mapped to an MCP server in .mcp.json before validating cards.
70
+ ```
65
71
 
66
72
  All MCP tool calls below use `<MCP_PREFIX>` as a stand-in for the resolved prefix.
67
73
 
@@ -73,22 +79,15 @@ All MCP tool calls below use `<MCP_PREFIX>` as a stand-in for the resolved prefi
73
79
  <MCP_PREFIX>ping()
74
80
  ```
75
81
 
76
- **If the MCP tool is not found** (error: "No such tool available"), the MCP server did not load in this session. Do NOT stop — fall back to curl JSON-RPC for the entire workflow:
77
-
78
- ```bash
79
- curl -s -X POST "https://api.rayburst.app/api/v1/mcp" \
80
- -H "Authorization: Bearer <API_KEY_FROM_.mcp.json>" \
81
- -H "Content-Type: application/json" \
82
- -H "Accept: application/json, text/event-stream" \
83
- -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"ping","arguments":{}}}'
82
+ **If the MCP tool is not found** (error: "No such tool available"), stop immediately:
84
83
  ```
84
+ ERROR: The MCP server for the qa-engineer role is not loaded in this session.
85
85
 
86
- Read the API key from `.mcp.json` under the server assigned to the `qa-engineer` role (from `rb-config.md`), or the first HTTP server entry if config is missing.
87
- Parse the SSE response: result is in the `data:` line as `{"result":{"content":[{"type":"text","text":"..."}]}}`.
88
-
89
- If ping via curl also fails (network error), stop and report the error.
90
-
91
- **Use curl for ALL subsequent MCP calls** (get_card, list_cards, list_card_features, get_feature, add_comment, submit_validation, move_card) whenever MCP tools are unavailable.
86
+ The MCP server '<server-name>' must be available. Try:
87
+ 1. Start a new Claude session (MCP servers load at session start)
88
+ 2. Verify the server entry exists in .mcp.json
89
+ 3. Re-run /rb:init to confirm role assignments
90
+ ```
92
91
 
93
92
  ### Step 2: Resolve the Card
94
93
 
@@ -222,7 +221,7 @@ After testing each criterion, record locally:
222
221
  })
223
222
  ```
224
223
 
225
- **Comment rules (critical when using curl fallback):**
224
+ **Comment rules:**
226
225
  - Keep comments under 500 characters
227
226
  - Plain prose only — no backtick code, no raw code snippets, no JSON in comment strings (causes `INTERNAL_ERROR`)
228
227
  - Reference files as plain text: "ComponentName.tsx line 79" not a code excerpt
@@ -281,44 +280,6 @@ Report ID: <report-id>
281
280
 
282
281
  ---
283
282
 
284
- ## MCP Curl Fallback
285
-
286
- When MCP tools are unavailable, use this curl pattern. Read the API key from `.mcp.json` under the server assigned to the `qa-engineer` role (or the first HTTP server entry if config is missing):
287
-
288
- ```bash
289
- # Get card
290
- curl -s -X POST "https://api.rayburst.app/api/v1/mcp" \
291
- -H "Authorization: Bearer <KEY>" \
292
- -H "Content-Type: application/json" \
293
- -H "Accept: application/json, text/event-stream" \
294
- -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_card","arguments":{"cardId":"<cardId>"}}}'
295
-
296
- # List card features
297
- curl -s -X POST "https://api.rayburst.app/api/v1/mcp" \
298
- -H "Authorization: Bearer <KEY>" \
299
- -H "Content-Type: application/json" \
300
- -H "Accept: application/json, text/event-stream" \
301
- -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"list_card_features","arguments":{"cardId":"<cardId>"}}}'
302
-
303
- # Submit validation (cardId, not featureId)
304
- curl -s -X POST "https://api.rayburst.app/api/v1/mcp" \
305
- -H "Authorization: Bearer <KEY>" \
306
- -H "Content-Type: application/json" \
307
- -H "Accept: application/json, text/event-stream" \
308
- -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"submit_validation","arguments":{"cardId":"<cardId>","results":[...],"overallComment":"..."}}}'
309
-
310
- # Move card to done
311
- curl -s -X POST "https://api.rayburst.app/api/v1/mcp" \
312
- -H "Authorization: Bearer <KEY>" \
313
- -H "Content-Type: application/json" \
314
- -H "Accept: application/json, text/event-stream" \
315
- -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"move_card","arguments":{"cardId":"<cardId>","status":"done"}}}'
316
- ```
317
-
318
- Parse the `data:` line from the SSE response to extract the JSON result.
319
-
320
- ---
321
-
322
283
  ## Constraints
323
284
 
324
285
  - Full UUIDs only
@@ -61,7 +61,13 @@ Read `.claude/rb-config.md` and parse the `## MCP Role Assignments` table. Find
61
61
  ```
62
62
  Example: if the server name is `rayburst-rb-qa-engineer-55ae0f`, then `MCP_PREFIX = mcp__rayburst-rb-qa-engineer-55ae0f__`.
63
63
 
64
- - If `.claude/rb-config.md` does not exist or the role is `unassigned`, set `MCP_PREFIX = ""` and use the curl fallback for all MCP calls (see "MCP Curl Fallback" section below). Read the API key from `.mcp.json` under the first HTTP MCP server entry.
64
+ - If `.claude/rb-config.md` does not exist or the role is `unassigned`, stop immediately:
65
+ ```
66
+ ERROR: rb:validate-feature requires an MCP server assigned to the `qa-engineer` role.
67
+
68
+ Run /rb:init to configure MCP server role assignments.
69
+ The qa-engineer role must be mapped to an MCP server in .mcp.json before validating features.
70
+ ```
65
71
 
66
72
  All MCP tool calls below use `<MCP_PREFIX>` as a stand-in for the resolved prefix.
67
73
 
@@ -73,22 +79,15 @@ All MCP tool calls below use `<MCP_PREFIX>` as a stand-in for the resolved prefi
73
79
  <MCP_PREFIX>ping()
74
80
  ```
75
81
 
76
- **If the MCP tool is not found** (error: "No such tool available"), the MCP server did not load in this session. Do NOT stop — fall back to curl JSON-RPC for the entire workflow:
77
-
78
- ```bash
79
- curl -s -X POST "https://api.rayburst.app/api/v1/mcp" \
80
- -H "Authorization: Bearer <API_KEY_FROM_.mcp.json>" \
81
- -H "Content-Type: application/json" \
82
- -H "Accept: application/json, text/event-stream" \
83
- -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"ping","arguments":{}}}'
82
+ **If the MCP tool is not found** (error: "No such tool available"), stop immediately:
84
83
  ```
84
+ ERROR: The MCP server for the qa-engineer role is not loaded in this session.
85
85
 
86
- Read the API key from `.mcp.json` under the server assigned to the `qa-engineer` role (from `rb-config.md`), or the first HTTP server entry if config is missing.
87
- Parse the SSE response: result is in the `data:` line as `{"result":{"content":[{"type":"text","text":"..."}]}}`.
88
-
89
- If ping via curl also fails (network error), stop and report the error.
90
-
91
- **Use curl for ALL subsequent MCP calls** (get_feature, list_boards, create_card, link_feature, submit_validation, update_feature) whenever MCP tools are unavailable.
86
+ The MCP server '<server-name>' must be available. Try:
87
+ 1. Start a new Claude session (MCP servers load at session start)
88
+ 2. Verify the server entry exists in .mcp.json
89
+ 3. Re-run /rb:init to confirm role assignments
90
+ ```
92
91
 
93
92
  ### Step 2: Resolve the Feature
94
93
 
@@ -222,7 +221,7 @@ Rules:
222
221
  })
223
222
  ```
224
223
 
225
- **Comment rules (critical when using curl fallback):**
224
+ **Comment rules:**
226
225
  - Keep comments under 500 characters
227
226
  - Plain prose only — no backtick code, no raw code snippets, no JSON in comment strings (causes `INTERNAL_ERROR`)
228
227
  - Reference files as plain text: "ComponentName.tsx line 79" not a code excerpt
@@ -270,22 +269,6 @@ Submitted via submit_validation (featureId: <id>)
270
269
 
271
270
  ---
272
271
 
273
- ## MCP Curl Fallback
274
-
275
- When MCP tools are unavailable, use this curl pattern. Read the API key from `.mcp.json` under the server assigned to the `qa-engineer` role (or the first HTTP server entry if config is missing):
276
-
277
- ```bash
278
- curl -s -X POST "https://api.rayburst.app/api/v1/mcp" \
279
- -H "Authorization: Bearer <KEY>" \
280
- -H "Content-Type: application/json" \
281
- -H "Accept: application/json, text/event-stream" \
282
- -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_feature","arguments":{"featureId":"<id>"}}}'
283
- ```
284
-
285
- Parse the `data:` line from the SSE response to extract the JSON result.
286
-
287
- ---
288
-
289
272
  ## Constraints
290
273
 
291
274
  - Full UUIDs only
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rayburst/cc",
3
- "version": "1.0.25",
3
+ "version": "1.0.27",
4
4
  "description": "Rayburst slash commands for Claude Code — /rb:init, /rb:plan, /rb:sync, /rb:status, /rb:validate-feature, /rb:validate-card, /rb:implement, /rb:discover",
5
5
  "bin": {
6
6
  "rayburst-cc": "bin/install.js"