specrails-core 3.0.0 → 3.1.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/commands/setup.md CHANGED
@@ -314,21 +314,14 @@ When no flags are passed (the default), run this streamlined 3-question setup. D
314
314
 
315
315
  ### QS1: Ask the 3 questions
316
316
 
317
- Ask exactly these questions in sequence. Do not ask any other questions.
317
+ Display the following prompt EXACTLY ONCE and then wait for the user's responses. Do NOT repeat the questions — output them a single time only.
318
318
 
319
- ```
320
319
  Welcome to specrails! Let's get your AI agent team set up in 3 quick questions.
321
320
 
322
321
  1. What is this project? (one sentence)
323
- > _
324
-
325
322
  2. Who are the target users?
326
- > _
327
-
328
323
  3. Git access for agents — read-only or read-write?
329
324
  (read-only = agents can read and suggest; read-write = agents can commit)
330
- > _
331
- ```
332
325
 
333
326
  Store the answers as:
334
327
  - `QS_PROJECT_DESCRIPTION` — answer to question 1
package/install.sh CHANGED
@@ -44,6 +44,7 @@ SPECRAILS_DIR=""
44
44
  INSTRUCTIONS_FILE=""
45
45
  HAS_CLAUDE=false
46
46
  HAS_CODEX=false
47
+ AGENT_TEAMS=false
47
48
 
48
49
  while [[ $# -gt 0 ]]; do
49
50
  case "$1" in
@@ -98,7 +99,7 @@ if [[ -z "$CUSTOM_ROOT_DIR" && -f "$SCRIPT_DIR/install.sh" && -d "$SCRIPT_DIR/te
98
99
  echo -e "${YELLOW}⚠${NC} You're running the installer from inside the specrails source repo."
99
100
  echo -e " specrails installs into a ${BOLD}target${NC} repository, not into itself."
100
101
  echo ""
101
- read -p " Enter the path to the target repo (or 'q' to quit): " TARGET_PATH
102
+ read -p " Enter the path to the target repo (or 'q' to quit): " TARGET_PATH || TARGET_PATH="q"
102
103
  if [[ "$TARGET_PATH" == "q" || -z "$TARGET_PATH" ]]; then
103
104
  echo " Aborted. No changes made."
104
105
  exit 0
@@ -229,7 +230,7 @@ elif [ "$HAS_CLAUDE" = true ] && [ "$HAS_CODEX" = true ]; then
229
230
  echo " 1) Claude Code (claude) → output to .claude/"
230
231
  echo " 2) Codex (codex) → output to .codex/"
231
232
  echo ""
232
- read -p " Select provider (1 or 2, default: 1): " PROVIDER_CHOICE
233
+ read -p " Select provider (1 or 2, default: 1): " PROVIDER_CHOICE || PROVIDER_CHOICE="1"
233
234
  PROVIDER_CHOICE="${PROVIDER_CHOICE:-1}"
234
235
  if [[ "$PROVIDER_CHOICE" == "2" ]]; then
235
236
  CLI_PROVIDER="codex"
@@ -266,6 +267,35 @@ else
266
267
  INSTRUCTIONS_FILE="CLAUDE.md"
267
268
  fi
268
269
 
270
+ # 1.2b Agent Teams opt-in (Claude Code only)
271
+ if [[ "$CLI_PROVIDER" == "claude" ]]; then
272
+ echo ""
273
+ if [ "$AUTO_YES" = true ]; then
274
+ # --yes flag: default to NOT installing (opt-in, not opt-out)
275
+ AGENT_TEAMS=false
276
+ info "Agent Teams commands: skipped (opt-in, use interactive mode to enable)"
277
+ else
278
+ echo -e " ${BOLD}Agent Teams commands are available (experimental):${NC}"
279
+ echo " /sr:team-review — Multi-perspective code review with AI reviewers"
280
+ echo " /sr:team-debug — Collaborative debugging with competing hypotheses"
281
+ echo ""
282
+ echo " These require Claude Code Agent Teams (experimental feature)."
283
+ read -p " Install Agent Teams commands? (y/n, default: n): " INSTALL_AGENT_TEAMS || INSTALL_AGENT_TEAMS="n"
284
+ if [[ "$INSTALL_AGENT_TEAMS" == "y" || "$INSTALL_AGENT_TEAMS" == "Y" ]]; then
285
+ AGENT_TEAMS=true
286
+ ok "Agent Teams commands will be installed"
287
+ echo ""
288
+ info "Remember to set the feature flag before using these commands:"
289
+ echo ""
290
+ echo " export CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1"
291
+ echo ""
292
+ else
293
+ AGENT_TEAMS=false
294
+ info "Agent Teams commands: skipped"
295
+ fi
296
+ fi
297
+ fi
298
+
269
299
  # 1.3 API key / authentication (provider-specific)
270
300
  if [[ "$CLI_PROVIDER" == "claude" ]]; then
271
301
  CLAUDE_AUTHED=false
@@ -334,7 +364,7 @@ elif [ -f "$REPO_ROOT/node_modules/.bin/openspec" ]; then
334
364
  else
335
365
  warn "OpenSpec CLI not found."
336
366
  if [ "$HAS_NPM" = true ]; then
337
- if [ "$AUTO_YES" = true ]; then INSTALL_OPENSPEC="y"; else read -p " Install OpenSpec CLI globally? (y/n): " INSTALL_OPENSPEC; fi
367
+ if [ "$AUTO_YES" = true ]; then INSTALL_OPENSPEC="y"; else read -p " Install OpenSpec CLI globally? (y/n): " INSTALL_OPENSPEC || INSTALL_OPENSPEC="n"; fi
338
368
  if [ "$INSTALL_OPENSPEC" = "y" ] || [ "$INSTALL_OPENSPEC" = "Y" ]; then
339
369
  info "Installing OpenSpec CLI..."
340
370
  npm install -g @openspec/cli 2>/dev/null && {
@@ -439,7 +469,7 @@ fi
439
469
  if [ "$EXISTING_SETUP" = true ]; then
440
470
  echo ""
441
471
  warn "This repo already has some agent/command/openspec artifacts."
442
- if [ "$AUTO_YES" = true ]; then CONTINUE="y"; else read -p " Continue and merge with existing setup? (y/n): " CONTINUE; fi
472
+ if [ "$AUTO_YES" = true ]; then CONTINUE="y"; else read -p " Continue and merge with existing setup? (y/n): " CONTINUE || CONTINUE="n"; fi
443
473
  if [ "$CONTINUE" != "y" ] && [ "$CONTINUE" != "Y" ]; then
444
474
  info "Aborted. No changes made."
445
475
  exit 0
@@ -521,7 +551,9 @@ chmod +x "$REPO_ROOT/.specrails/bin/doctor.sh"
521
551
  ok "Installed specrails doctor (bin/doctor.sh)"
522
552
 
523
553
  # Copy templates (includes commands, skills, agents, rules, personas, settings)
524
- cp -r "$SCRIPT_DIR/templates/"* "$REPO_ROOT/$SPECRAILS_DIR/setup-templates/"
554
+ # Use tar to exclude node_modules and package-lock.json for performance
555
+ tar -C "$SCRIPT_DIR/templates" --exclude='node_modules' --exclude='package-lock.json' -cf - . \
556
+ | tar -C "$REPO_ROOT/$SPECRAILS_DIR/setup-templates/" -xf -
525
557
  ok "Installed setup templates (commands + skills)"
526
558
 
527
559
  # Write OSS detection results for /setup
@@ -542,7 +574,8 @@ cat > "$REPO_ROOT/$SPECRAILS_DIR/setup-templates/.provider-detection.json" << EO
542
574
  {
543
575
  "cli_provider": "$CLI_PROVIDER",
544
576
  "specrails_dir": "$SPECRAILS_DIR",
545
- "instructions_file": "$INSTRUCTIONS_FILE"
577
+ "instructions_file": "$INSTRUCTIONS_FILE",
578
+ "agent_teams": $AGENT_TEAMS
546
579
  }
547
580
  EOF
548
581
  ok "Provider detection results written ($CLI_PROVIDER → $SPECRAILS_DIR/)"
@@ -589,6 +622,10 @@ echo ""
589
622
  echo -e "${BOLD}${GREEN}Installation summary:${NC}"
590
623
  echo ""
591
624
  echo " Provider: $CLI_PROVIDER → output to $SPECRAILS_DIR/"
625
+ if [[ "$AGENT_TEAMS" == "true" ]]; then
626
+ echo " Agent Teams: installed (/sr:team-review, /sr:team-debug)"
627
+ echo " Feature flag: CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1 (required)"
628
+ fi
592
629
  echo ""
593
630
  echo " Files installed:"
594
631
  if [[ "$CLI_PROVIDER" == "codex" ]]; then
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "specrails-core",
3
- "version": "3.0.0",
3
+ "version": "3.1.0",
4
4
  "description": "AI agent workflow system for Claude Code — installs 12 specialized agents, orchestration commands, and persona-driven product discovery into any repository",
5
5
  "bin": {
6
6
  "specrails-core": "bin/specrails-core.js"
@@ -50,6 +50,10 @@
50
50
  "bugs": {
51
51
  "url": "https://github.com/fjpulidop/specrails-core/issues"
52
52
  },
53
+ "scripts": {
54
+ "test": "bash tests/run-all.sh",
55
+ "test:coverage": "bash tests/run-coverage.sh"
56
+ },
53
57
  "license": "MIT",
54
58
  "author": "fjpulidop"
55
59
  }
@@ -0,0 +1,286 @@
1
+ ---
2
+ name: "Team Debug"
3
+ description: "Collaborative debugging using Claude Code Agent Teams. Multiple investigators pursue competing hypotheses independently, challenge each other's findings, and produce a root cause analysis ranked by confidence."
4
+ category: Workflow
5
+ tags: [workflow, debugging, agent-teams, investigation]
6
+ ---
7
+
8
+ Collaborative debugging for **{{PROJECT_NAME}}** using Claude Code Agent Teams. Multiple investigators pursue competing hypotheses about a bug, challenge each other's findings, and produce a confidence-ranked root cause analysis.
9
+
10
+ **Input:** $ARGUMENTS — required: a bug description in one of these forms:
11
+ - `"Login fails silently when email has uppercase letters"` — free text bug description
12
+ - `tests/auth.test.ts` — a failing test file path
13
+ - `"TypeError: Cannot read property 'id' of undefined"` — an error message or stack trace
14
+ - `#42` — a GitHub issue number
15
+
16
+ Optional flags:
17
+ - `--scope <paths>` — comma-separated file/directory paths to constrain investigation (default: entire repo)
18
+ - `--depth <level>` — investigation depth: `shallow`, `normal` (default), `deep`
19
+
20
+ ---
21
+
22
+ ## Phase 0: Feature Flag Guard
23
+
24
+ **This check is mandatory and runs before anything else.**
25
+
26
+ Check whether Agent Teams is enabled:
27
+
28
+ ```bash
29
+ echo "${CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS:-}"
30
+ ```
31
+
32
+ If the variable is unset or not equal to `1`, print this message and **stop immediately**:
33
+
34
+ ```
35
+ Error: Agent Teams is an experimental feature that requires opt-in.
36
+
37
+ To enable it, set the environment variable before starting Claude Code:
38
+
39
+ export CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1
40
+
41
+ Agent Teams requires Claude Code v2.1.32 or later.
42
+ ```
43
+
44
+ Do NOT proceed past this point if the guard fails.
45
+
46
+ ---
47
+
48
+ ## Phase 1: Bug Context Gathering
49
+
50
+ Parse `$ARGUMENTS` to determine the bug context and flags.
51
+
52
+ **Variables to set:**
53
+
54
+ - `BUG_DESCRIPTION` — the user's description of the bug
55
+ - `INPUT_TYPE` — `"text"`, `"test"`, `"error"`, or `"issue"`
56
+ - `SCOPE_PATHS` — from `--scope` flag or `["."]` (entire repo)
57
+ - `INVESTIGATION_DEPTH` — from `--depth` flag or `"normal"`
58
+
59
+ **Detection rules:**
60
+
61
+ 1. If input starts with `#` or is a bare integer -> `INPUT_TYPE="issue"`, fetch issue body via `gh issue view <number> --json title,body`
62
+ 2. If input is a file path that exists and contains `test` or `spec` -> `INPUT_TYPE="test"`, run the test to capture failure output
63
+ 3. If input contains common error patterns (stack trace, `Error:`, `Exception`, `FATAL`) -> `INPUT_TYPE="error"`
64
+ 4. Otherwise -> `INPUT_TYPE="text"`
65
+
66
+ If `$ARGUMENTS` is empty, print usage and stop:
67
+ ```
68
+ Usage: /sr:team-debug <bug-description> [--scope <paths>] [--depth <level>]
69
+
70
+ Examples:
71
+ /sr:team-debug "Login fails silently when email has uppercase letters"
72
+ /sr:team-debug tests/auth.test.ts --depth deep
73
+ /sr:team-debug "TypeError: Cannot read property 'id' of undefined" --scope src/api
74
+ /sr:team-debug #42
75
+ ```
76
+
77
+ ---
78
+
79
+ ## Phase 2: Hypothesis Generation
80
+
81
+ Analyze the bug context and generate competing hypotheses:
82
+
83
+ 1. **Analyze symptoms**: Read relevant source files within `SCOPE_PATHS`, examine recent git changes (`git log --oneline -20` for the relevant paths), check related tests
84
+ 2. **Generate hypotheses**: Produce 2-3 distinct, testable hypotheses about the root cause. Each must target a different subsystem, mechanism, or failure mode.
85
+ 3. **Rank hypotheses**: Order by initial likelihood based on available evidence
86
+
87
+ Each hypothesis MUST include:
88
+ - **Title**: One-line description of the proposed cause
89
+ - **Rationale**: Why this is plausible given the symptoms
90
+ - **Investigation plan**: Specific files to examine, commands to run, patterns to search for
91
+ - **Expected evidence**: What would confirm or refute this hypothesis
92
+
93
+ Decide whether to launch 2 or 3 investigators:
94
+ - Default: 2 investigators (Hypothesis A and B)
95
+ - Launch 3 when: `--depth deep` is set, OR the bug description is ambiguous enough to warrant three genuinely distinct hypotheses
96
+
97
+ Print the hypothesis summary:
98
+ ```
99
+ ## Bug Analysis
100
+
101
+ **Input type:** <text / test / error / issue>
102
+ **Scope:** <SCOPE_PATHS>
103
+ **Depth:** <INVESTIGATION_DEPTH>
104
+
105
+ ### Hypotheses
106
+
107
+ 1. **<Hypothesis A title>** (initial confidence: X%)
108
+ <one-line rationale>
109
+
110
+ 2. **<Hypothesis B title>** (initial confidence: Y%)
111
+ <one-line rationale>
112
+
113
+ 3. **<Hypothesis C title>** (initial confidence: Z%) [if applicable]
114
+ <one-line rationale>
115
+
116
+ Launching <N> investigators...
117
+ ```
118
+
119
+ ---
120
+
121
+ ## Phase 3: Launch Investigation Team
122
+
123
+ Create 2-3 investigator teammates using Agent Teams. Each teammate receives the bug context and their assigned hypothesis.
124
+
125
+ **IMPORTANT:** Use the Agent Teams teammate mechanism — NOT the Agent tool's `subagent_type`. Teammates share a task list and can message each other via mailbox.
126
+
127
+ ### Investigator A: Primary Hypothesis
128
+
129
+ **Prompt:**
130
+ ```
131
+ You are Investigator A on a debugging team. Your job is to prove or disprove your assigned hypothesis through systematic investigation.
132
+
133
+ ## Bug Context
134
+ <BUG_DESCRIPTION>
135
+ <additional context gathered in Phase 1: test output, error details, issue body>
136
+
137
+ ## Your Hypothesis
138
+ **<Hypothesis A title>**
139
+ <Hypothesis A rationale>
140
+
141
+ ## Investigation Plan
142
+ <Hypothesis A investigation plan>
143
+
144
+ ## Scope
145
+ Limit your investigation to: <SCOPE_PATHS>
146
+
147
+ ## Instructions
148
+ 1. Follow your investigation plan systematically
149
+ 2. Read source files, search for patterns, examine git history within scope
150
+ 3. Collect concrete evidence — file paths, line numbers, code snippets, command output
151
+ 4. Determine a confidence level (0-100%) that your hypothesis is the root cause
152
+ 5. After completing your investigation, read the other investigators' findings from the task list
153
+ 6. If you find evidence that supports or contradicts another investigator's hypothesis, send a mailbox message challenging or endorsing their findings
154
+ 7. Do NOT modify any files — this is a read-only investigation
155
+
156
+ ## Report Format
157
+ Post your findings as a task list update:
158
+
159
+ ### Investigator A: <Hypothesis Title>
160
+
161
+ #### Evidence Found
162
+ | # | Type | Location | Finding |
163
+ |---|------|----------|---------|
164
+ | 1 | code/git/test/config | file:line | What was found |
165
+
166
+ #### Evidence Against
167
+ <any evidence that contradicts this hypothesis>
168
+
169
+ #### Confidence: X%
170
+ <explanation of confidence level>
171
+
172
+ #### Verdict
173
+ <CONFIRMED / REFUTED / INCONCLUSIVE>
174
+ <brief explanation>
175
+ ```
176
+
177
+ ### Investigator B: Alternative Hypothesis
178
+
179
+ Same structure as Investigator A, with Hypothesis B title, rationale, investigation plan, and expected evidence.
180
+
181
+ ### Investigator C: Contrarian Hypothesis (when applicable)
182
+
183
+ Same structure as Investigator A, with Hypothesis C title, rationale, investigation plan, and expected evidence. Only launched when 3 hypotheses are generated.
184
+
185
+ ### Team Coordination
186
+
187
+ After launching all investigators:
188
+
189
+ 1. Wait for all investigators to complete their independent investigations (posted to the shared task list)
190
+ 2. Allow one round of cross-investigation challenge via mailbox — each investigator may respond to findings from the others
191
+ 3. Collect all findings and challenge outcomes
192
+
193
+ If any teammate fails to respond, proceed with available findings and note the gap in the final report.
194
+
195
+ ---
196
+
197
+ ## Phase 4: Root Cause Synthesis
198
+
199
+ After all investigations and challenges are complete, the team lead produces the root cause analysis.
200
+
201
+ ### Step 1: Evidence Aggregation
202
+
203
+ 1. Read all investigator reports from the task list
204
+ 2. Identify converging evidence (multiple investigators pointing to the same cause)
205
+ 3. Identify conflicting evidence and note unresolved disagreements
206
+ 4. Read any mailbox challenge messages for cross-investigator insights
207
+
208
+ ### Step 2: Confidence Recalibration
209
+
210
+ Adjust hypothesis confidence levels based on cross-investigation challenges:
211
+ - A hypothesis endorsed by evidence from another investigator: confidence boost (+10-20%)
212
+ - A hypothesis contradicted by another investigator's evidence: confidence reduction (-10-30%)
213
+ - A hypothesis with no cross-investigation interaction: confidence unchanged
214
+ - Converging evidence from multiple investigators: strongest signal for root cause
215
+
216
+ ### Step 3: Render Report
217
+
218
+ ```markdown
219
+ ## Root Cause Analysis
220
+
221
+ **Bug:** <one-line bug description>
222
+ **Scope:** <SCOPE_PATHS>
223
+ **Depth:** <INVESTIGATION_DEPTH>
224
+ **Investigators:** <N>
225
+
226
+ ---
227
+
228
+ ### Most Likely Root Cause
229
+
230
+ **<Winning hypothesis title>** — Confidence: X%
231
+
232
+ <2-3 sentence explanation of the root cause with specific file and line references>
233
+
234
+ #### Key Evidence
235
+ | # | Location | Finding |
236
+ |---|----------|---------|
237
+ | 1 | file:line | Evidence supporting this conclusion |
238
+
239
+ #### Suggested Fix
240
+ <specific, actionable fix recommendation with file and line references>
241
+
242
+ ---
243
+
244
+ ### Alternative Hypotheses
245
+
246
+ | # | Hypothesis | Initial | Final | Verdict | Key Evidence |
247
+ |---|-----------|---------|-------|---------|-------------|
248
+ | 1 | <title> | X% | Y% | CONFIRMED/REFUTED/INCONCLUSIVE | <one-line> |
249
+ | 2 | <title> | X% | Y% | CONFIRMED/REFUTED/INCONCLUSIVE | <one-line> |
250
+
251
+ ### Investigation Trail
252
+
253
+ <for each investigator, a 2-3 line summary of what they investigated and what they found>
254
+
255
+ ### Cross-Investigation Notes
256
+
257
+ <any points of challenge or agreement between investigators, with resolution>
258
+
259
+ ---
260
+
261
+ ### Recommended Next Steps
262
+
263
+ 1. <most important action — typically the fix>
264
+ 2. <verification step — test to confirm the fix>
265
+ 3. <preventive step — how to avoid this class of bug>
266
+ ```
267
+
268
+ ### Step 4: Cost Notice
269
+
270
+ Print a brief cost notice after the report:
271
+
272
+ ```
273
+ Note: Team debug used ~<N>x the tokens of a single-agent investigation (<N> parallel investigators + challenge round).
274
+ ```
275
+
276
+ ---
277
+
278
+ ## Rules
279
+
280
+ - This command is **read-only** — it MUST NOT create, modify, or delete any files
281
+ - All investigators run as Agent Teams teammates, not as Agent tool subagents
282
+ - If Agent Teams is unavailable at runtime (API error, version mismatch), fall back to running 2-3 sequential Agent tool subagents and skip the challenge phase. Print a warning about the fallback.
283
+ - The challenge phase is limited to one round per investigator to control token costs
284
+ - Findings MUST include file paths and line numbers — vague findings are not acceptable
285
+ - Investigation MUST stay within `SCOPE_PATHS` if specified
286
+ - This command is Claude Code only — it is NOT installed when the provider is `codex`
@@ -0,0 +1,341 @@
1
+ ---
2
+ name: "Team Review"
3
+ description: "Multi-perspective code review using Claude Code Agent Teams. Three specialized reviewers (security, performance, correctness) independently review changes, debate findings, and produce a consolidated report."
4
+ category: Workflow
5
+ tags: [workflow, review, agent-teams, security, performance]
6
+ ---
7
+
8
+ Multi-perspective code review for **{{PROJECT_NAME}}** using Claude Code Agent Teams. Three specialized reviewers analyze changes independently, debate cross-cutting findings, and produce a consolidated report.
9
+
10
+ **Input:** $ARGUMENTS — required: a review target in one of these forms:
11
+ - `#123` — review a pull request by number
12
+ - `feat/my-feature` — review a branch diff against base
13
+ - `abc1234..def5678` — review a commit range
14
+
15
+ Optional flags:
16
+ - `--base <branch>` — override base branch for comparison (default: repository default branch)
17
+ - `--focus <areas>` — comma-separated focus areas to weight: `security`, `performance`, `correctness`, `tests`, `types`
18
+
19
+ ---
20
+
21
+ ## Phase 0: Feature Flag Guard
22
+
23
+ **This check is mandatory and runs before anything else.**
24
+
25
+ Check whether Agent Teams is enabled:
26
+
27
+ ```bash
28
+ echo "${CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS:-}"
29
+ ```
30
+
31
+ If the variable is unset or not equal to `1`, print this message and **stop immediately**:
32
+
33
+ ```
34
+ Error: Agent Teams is an experimental feature that requires opt-in.
35
+
36
+ To enable it, set the environment variable before starting Claude Code:
37
+
38
+ export CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1
39
+
40
+ Agent Teams requires Claude Code v2.1.32 or later.
41
+ ```
42
+
43
+ Do NOT proceed past this point if the guard fails.
44
+
45
+ ---
46
+
47
+ ## Phase 1: Input Parsing
48
+
49
+ Parse `$ARGUMENTS` to determine the review target and flags.
50
+
51
+ **Variables to set:**
52
+
53
+ - `REVIEW_TARGET` — the PR number, branch name, or commit range
54
+ - `REVIEW_TYPE` — `"pr"`, `"branch"`, or `"range"`
55
+ - `BASE_BRANCH` — from `--base` flag or detect via `gh repo view --json defaultBranchRef -q '.defaultBranchRef.name'` or fall back to `main`
56
+ - `FOCUS_AREAS` — array from `--focus` flag or `["all"]`
57
+
58
+ **Detection rules:**
59
+
60
+ 1. If input starts with `#` or is a bare integer → `REVIEW_TYPE="pr"`, strip `#` prefix
61
+ 2. If input contains `..` → `REVIEW_TYPE="range"`
62
+ 3. Otherwise → `REVIEW_TYPE="branch"`
63
+
64
+ If `$ARGUMENTS` is empty, print usage and stop:
65
+ ```
66
+ Usage: /sr:team-review <target> [--base <branch>] [--focus <areas>]
67
+
68
+ Examples:
69
+ /sr:team-review #42
70
+ /sr:team-review feat/new-auth --focus security
71
+ /sr:team-review abc123..def456
72
+ ```
73
+
74
+ ---
75
+
76
+ ## Phase 2: Gather Diff
77
+
78
+ Collect the code changes based on `REVIEW_TYPE`:
79
+
80
+ - **PR**: Run `gh pr diff <REVIEW_TARGET>` and `gh pr diff <REVIEW_TARGET> --name-only`
81
+ - **Branch**: Run `git diff ${BASE_BRANCH}...${REVIEW_TARGET}` and `git diff --name-only ${BASE_BRANCH}...${REVIEW_TARGET}`
82
+ - **Range**: Run `git diff ${REVIEW_TARGET}` and `git diff --name-only ${REVIEW_TARGET}`
83
+
84
+ Also collect file-level stats: `git diff --stat <appropriate-range>`
85
+
86
+ **Store these variables for Phase 3:**
87
+ - `DIFF_CONTENT` — full unified diff
88
+ - `CHANGED_FILES` — list of changed file paths
89
+ - `DIFF_STATS` — file-level line count changes
90
+
91
+ If the diff is empty, print `No changes found for the given review target.` and stop.
92
+
93
+ Print a summary:
94
+ ```
95
+ ## Review Target
96
+ Type: <PR / Branch / Range>
97
+ Target: <REVIEW_TARGET>
98
+ Base: <BASE_BRANCH>
99
+ Changed files: <N>
100
+ Focus: <FOCUS_AREAS or "all areas">
101
+
102
+ <DIFF_STATS output>
103
+ ```
104
+
105
+ ---
106
+
107
+ ## Phase 3: Launch Team Review
108
+
109
+ Create three reviewer teammates using Agent Teams. Each teammate receives the full diff and file list.
110
+
111
+ **IMPORTANT:** Use the Agent Teams teammate mechanism — NOT the Agent tool's `subagent_type`. Teammates share a task list and can message each other via mailbox.
112
+
113
+ ### Teammate 1: Security Reviewer
114
+
115
+ **Persona:** sr-security-reviewer (or sr-reviewer with security focus if persona not available)
116
+
117
+ **Prompt:**
118
+ ```
119
+ You are the Security Reviewer on a team code review.
120
+
121
+ ## Your Focus Areas
122
+ - Authentication and authorization flaws
123
+ - Input validation and injection vulnerabilities (SQL, XSS, command injection)
124
+ - Secrets or credentials in code
125
+ - OWASP Top 10 vulnerabilities
126
+ - Insecure dependencies or configurations
127
+ - Missing rate limiting or access controls
128
+
129
+ ## Changed Files
130
+ <CHANGED_FILES>
131
+
132
+ ## Diff
133
+ <DIFF_CONTENT>
134
+
135
+ ## Instructions
136
+ 1. Review every changed file through a security lens
137
+ 2. Report findings using the format below — be specific about file, line, and fix
138
+ 3. After completing your review, read the other reviewers' findings from the task list
139
+ 4. If you have security-relevant context on their findings, send a mailbox message
140
+
141
+ ## Report Format
142
+ Post your findings as a task list update:
143
+
144
+ ### Security Review Findings
145
+
146
+ #### Summary
147
+ <1-2 sentences>
148
+
149
+ #### Findings
150
+ | # | Severity | File | Line(s) | Finding | Recommendation |
151
+ |---|----------|------|---------|---------|----------------|
152
+
153
+ #### Verdict
154
+ <APPROVE / REQUEST_CHANGES / COMMENT>
155
+ ```
156
+
157
+ ### Teammate 2: Performance Reviewer
158
+
159
+ **Persona:** sr-performance-reviewer (or sr-reviewer with performance focus if persona not available)
160
+
161
+ **Prompt:**
162
+ ```
163
+ You are the Performance Reviewer on a team code review.
164
+
165
+ ## Your Focus Areas
166
+ - Database query complexity and N+1 queries
167
+ - Missing or broken caching
168
+ - Memory leaks and excessive allocations
169
+ - Algorithmic complexity (O(n^2) or worse in hot paths)
170
+ - Bundle size and lazy loading concerns (frontend)
171
+ - Missing pagination or unbounded data fetching
172
+
173
+ ## Changed Files
174
+ <CHANGED_FILES>
175
+
176
+ ## Diff
177
+ <DIFF_CONTENT>
178
+
179
+ ## Instructions
180
+ 1. Review every changed file through a performance lens
181
+ 2. Report findings using the format below — be specific about file, line, and fix
182
+ 3. After completing your review, read the other reviewers' findings from the task list
183
+ 4. If you have performance-relevant context on their findings, send a mailbox message
184
+
185
+ ## Report Format
186
+ Post your findings as a task list update:
187
+
188
+ ### Performance Review Findings
189
+
190
+ #### Summary
191
+ <1-2 sentences>
192
+
193
+ #### Findings
194
+ | # | Severity | File | Line(s) | Finding | Recommendation |
195
+ |---|----------|------|---------|---------|----------------|
196
+
197
+ #### Verdict
198
+ <APPROVE / REQUEST_CHANGES / COMMENT>
199
+ ```
200
+
201
+ ### Teammate 3: Correctness Reviewer
202
+
203
+ **Persona:** sr-reviewer
204
+
205
+ **Prompt:**
206
+ ```
207
+ You are the Correctness Reviewer on a team code review.
208
+
209
+ ## Your Focus Areas
210
+ - Logic errors and edge cases
211
+ - Missing or inadequate test coverage
212
+ - Type safety violations
213
+ - Error handling gaps (uncaught exceptions, missing error paths)
214
+ - API contract mismatches
215
+ - Race conditions and concurrency issues
216
+
217
+ ## Changed Files
218
+ <CHANGED_FILES>
219
+
220
+ ## Diff
221
+ <DIFF_CONTENT>
222
+
223
+ ## Instructions
224
+ 1. Review every changed file through a correctness and test coverage lens
225
+ 2. Report findings using the format below — be specific about file, line, and fix
226
+ 3. After completing your review, read the other reviewers' findings from the task list
227
+ 4. If you have correctness-relevant context on their findings, send a mailbox message
228
+
229
+ ## Report Format
230
+ Post your findings as a task list update:
231
+
232
+ ### Correctness Review Findings
233
+
234
+ #### Summary
235
+ <1-2 sentences>
236
+
237
+ #### Findings
238
+ | # | Severity | File | Line(s) | Finding | Recommendation |
239
+ |---|----------|------|---------|---------|----------------|
240
+
241
+ #### Verdict
242
+ <APPROVE / REQUEST_CHANGES / COMMENT>
243
+ ```
244
+
245
+ ### Team Coordination
246
+
247
+ After launching all three teammates:
248
+
249
+ 1. Wait for all three to complete their independent reviews (posted to the shared task list)
250
+ 2. Allow one round of cross-review debate via mailbox — each reviewer may respond to findings from the other two
251
+ 3. Collect all findings and debate outcomes
252
+
253
+ If any teammate fails to respond, proceed with available reviews and note the gap in the final report.
254
+
255
+ ---
256
+
257
+ ## Phase 4: Synthesize Consolidated Report
258
+
259
+ After all reviews and debate are complete, the team lead produces the final report.
260
+
261
+ ### Step 1: Collect and Deduplicate
262
+
263
+ 1. Read all three reviewer reports from the task list
264
+ 2. Identify duplicate findings (same file + overlapping lines + similar issue)
265
+ 3. For duplicates: keep the highest-severity version, note which reviewers flagged it
266
+
267
+ ### Step 2: Apply Focus Weighting
268
+
269
+ If `FOCUS_AREAS` is not `["all"]`:
270
+ - Findings in focus areas get their severity preserved
271
+ - Findings outside focus areas: Critical stays Critical, but High→Medium, Medium→Low for display purposes
272
+ - Note the weighting in the report header
273
+
274
+ ### Step 3: Render Report
275
+
276
+ ```markdown
277
+ ## Team Review Report
278
+
279
+ **Target:** <PR #N / branch-name / commit-range>
280
+ **Base:** <BASE_BRANCH>
281
+ **Reviewers:** Security, Performance, Correctness
282
+ **Changed files:** N files (+X/-Y lines)
283
+ **Focus:** <FOCUS_AREAS or "all areas equally weighted">
284
+
285
+ ---
286
+
287
+ ### Critical Findings (action required before merge)
288
+
289
+ | # | Severity | Domain | File | Line(s) | Finding | Recommendation | Flagged By |
290
+ |---|----------|--------|------|---------|---------|----------------|------------|
291
+
292
+ ### High-Priority Findings
293
+
294
+ | # | Severity | Domain | File | Line(s) | Finding | Recommendation | Flagged By |
295
+ |---|----------|--------|------|---------|---------|----------------|------------|
296
+
297
+ ### Medium & Low Findings
298
+
299
+ | # | Severity | Domain | File | Line(s) | Finding | Recommendation |
300
+ |---|----------|--------|------|---------|---------|----------------|
301
+
302
+ ### Praise (things done well)
303
+ <positive observations from reviewers>
304
+
305
+ ---
306
+
307
+ ### Cross-Review Notes
308
+ <any points of debate or disagreement between reviewers, with resolution>
309
+
310
+ ---
311
+
312
+ ### Reviewer Verdicts
313
+
314
+ | Reviewer | Verdict | Critical | High | Medium | Low | Info |
315
+ |----------|---------|----------|------|--------|-----|------|
316
+ | Security | APPROVE/REQUEST_CHANGES | N | N | N | N | N |
317
+ | Performance | APPROVE/REQUEST_CHANGES | N | N | N | N | N |
318
+ | Correctness | APPROVE/REQUEST_CHANGES | N | N | N | N | N |
319
+
320
+ ### Overall Verdict: <APPROVE / REQUEST_CHANGES>
321
+
322
+ <one-paragraph summary: key risks, recommended actions, and overall assessment>
323
+ ```
324
+
325
+ ### Step 4: Cost Notice
326
+
327
+ Print a brief cost notice after the report:
328
+
329
+ ```
330
+ Note: Team review used ~3x the tokens of a single-reviewer run (3 parallel reviewers + debate round).
331
+ ```
332
+
333
+ ---
334
+
335
+ ## Rules
336
+
337
+ - This command is **read-only** — it MUST NOT create, modify, or delete any files
338
+ - All three reviewers run as Agent Teams teammates, not as Agent tool subagents
339
+ - If Agent Teams is unavailable at runtime (API error, version mismatch), fall back to running three sequential Agent tool subagents with `subagent_type: sr-reviewer` and skip the debate phase. Print a warning about the fallback.
340
+ - The debate phase is limited to one round per reviewer to control token costs
341
+ - Findings MUST include file paths and line numbers — vague findings are not acceptable
package/update.sh CHANGED
@@ -94,7 +94,7 @@ if [[ -z "$CUSTOM_ROOT_DIR" && -f "$SCRIPT_DIR/install.sh" && -d "$SCRIPT_DIR/te
94
94
  echo -e "${YELLOW}⚠${NC} You're running the updater from inside the specrails source repo."
95
95
  echo -e " specrails updates a ${BOLD}target${NC} repository, not itself."
96
96
  echo ""
97
- read -p " Enter the path to the target repo (or 'q' to quit): " TARGET_PATH
97
+ read -p " Enter the path to the target repo (or 'q' to quit): " TARGET_PATH || TARGET_PATH="q"
98
98
  if [[ "$TARGET_PATH" == "q" || -z "$TARGET_PATH" ]]; then
99
99
  echo " Aborted. No changes made."
100
100
  exit 0
@@ -107,7 +107,7 @@ if [[ -z "$CUSTOM_ROOT_DIR" && -f "$SCRIPT_DIR/install.sh" && -d "$SCRIPT_DIR/te
107
107
  }
108
108
  if [[ ! -d "$REPO_ROOT/.git" ]]; then
109
109
  echo -e "${YELLOW}⚠${NC} Warning: $REPO_ROOT does not appear to be a git repository."
110
- read -p " Continue anyway? (y/n): " CONTINUE_NOGIT
110
+ read -p " Continue anyway? (y/n): " CONTINUE_NOGIT || CONTINUE_NOGIT="n"
111
111
  if [[ "$CONTINUE_NOGIT" != "y" && "$CONTINUE_NOGIT" != "Y" ]]; then
112
112
  echo " Aborted. No changes made."
113
113
  exit 0
@@ -658,7 +658,7 @@ except Exception:
658
658
  fi
659
659
 
660
660
  local answer
661
- read -p " Regenerate agents? (y/N): " answer
661
+ read -p " Regenerate agents? (y/N): " answer || answer="n"
662
662
  if [[ "$answer" == "y" ]] || [[ "$answer" == "Y" ]]; then
663
663
  NEEDS_SETUP_UPDATE=true
664
664
  ok "Will regenerate agents via /setup --update"