sequant 1.18.0 → 1.20.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/README.md +1 -1
- package/dist/bin/cli.js +7 -0
- package/dist/src/commands/conventions.d.ts +9 -0
- package/dist/src/commands/conventions.js +61 -0
- package/dist/src/commands/init.js +12 -0
- package/dist/src/lib/conventions-detector.d.ts +62 -0
- package/dist/src/lib/conventions-detector.js +510 -0
- package/dist/src/lib/fs.d.ts +1 -1
- package/dist/src/lib/settings.d.ts +8 -0
- package/dist/src/lib/settings.js +1 -0
- package/dist/src/lib/stacks.d.ts +4 -2
- package/dist/src/lib/stacks.js +43 -3
- package/dist/src/lib/workflow/state-schema.d.ts +5 -5
- package/package.json +7 -7
- package/templates/skills/exec/SKILL.md +1086 -29
- package/templates/skills/qa/SKILL.md +1732 -156
- package/templates/skills/test/SKILL.md +246 -1
|
@@ -12,9 +12,10 @@ allowed-tools:
|
|
|
12
12
|
- Grep
|
|
13
13
|
- Edit
|
|
14
14
|
- Write
|
|
15
|
-
# Build and test
|
|
15
|
+
# Build, lint, and test
|
|
16
16
|
- Bash(npm test:*)
|
|
17
17
|
- Bash(npm run build:*)
|
|
18
|
+
- Bash(npm run lint:*)
|
|
18
19
|
- Bash(npm install:*)
|
|
19
20
|
- Bash(npx tsc:*)
|
|
20
21
|
# Git operations
|
|
@@ -116,9 +117,38 @@ Invocation:
|
|
|
116
117
|
- `/exec <freeform description>`:
|
|
117
118
|
- Treat the text as a lightweight description + AC if no issue context is available.
|
|
118
119
|
|
|
120
|
+
## Orchestration Context
|
|
121
|
+
|
|
122
|
+
When running as part of an orchestrated workflow (e.g., `sequant run` or `/fullsolve`), this skill receives environment variables that indicate the orchestration context:
|
|
123
|
+
|
|
124
|
+
| Environment Variable | Description | Example Value |
|
|
125
|
+
|---------------------|-------------|---------------|
|
|
126
|
+
| `SEQUANT_ORCHESTRATOR` | The orchestrator invoking this skill | `sequant-run` |
|
|
127
|
+
| `SEQUANT_PHASE` | Current phase in the workflow | `exec` |
|
|
128
|
+
| `SEQUANT_ISSUE` | Issue number being processed | `123` |
|
|
129
|
+
| `SEQUANT_WORKTREE` | Path to the feature worktree | `/path/to/worktrees/feature/...` |
|
|
130
|
+
| `SEQUANT_BASE_BRANCH` | Base branch for worktree (if custom) | `feature/dashboard` |
|
|
131
|
+
|
|
132
|
+
**Behavior when orchestrated (SEQUANT_ORCHESTRATOR is set):**
|
|
133
|
+
|
|
134
|
+
1. **Skip pre-flight git checks** - The orchestrator has already verified git state
|
|
135
|
+
2. **Skip worktree creation** - Orchestrator creates worktrees before invoking skills
|
|
136
|
+
3. **Use provided worktree path** - Work in `SEQUANT_WORKTREE` instead of creating a new one
|
|
137
|
+
4. **Reduce GitHub comment frequency** - Defer progress updates to the orchestrator
|
|
138
|
+
5. **Trust issue context** - The orchestrator has already fetched and validated issue data
|
|
139
|
+
|
|
140
|
+
**Behavior when standalone (SEQUANT_ORCHESTRATOR is NOT set):**
|
|
141
|
+
|
|
142
|
+
- Perform all pre-flight checks
|
|
143
|
+
- Create worktree if needed
|
|
144
|
+
- Post progress updates to GitHub
|
|
145
|
+
- Fetch fresh issue context
|
|
146
|
+
|
|
119
147
|
### 0. Pre-flight Check (After Context Restoration)
|
|
120
148
|
|
|
121
|
-
**
|
|
149
|
+
**Skip this section if `SEQUANT_ORCHESTRATOR` is set** - the orchestrator has already performed these checks.
|
|
150
|
+
|
|
151
|
+
**CRITICAL:** If continuing from a restored/summarized conversation (standalone mode), verify git state first:
|
|
122
152
|
|
|
123
153
|
```bash
|
|
124
154
|
# Check current state - are we in a worktree or main repo?
|
|
@@ -134,6 +164,66 @@ git branch -a | grep -i "<issue-number>" || true
|
|
|
134
164
|
|
|
135
165
|
**If PR already merged:** The issue may be complete - verify and close if so.
|
|
136
166
|
|
|
167
|
+
### 0a. Stale Branch Detection (Warning Only)
|
|
168
|
+
|
|
169
|
+
**Skip this section if `SEQUANT_ORCHESTRATOR` is set** - the orchestrator handles branch freshness checks.
|
|
170
|
+
|
|
171
|
+
**Purpose:** Warn when starting implementation on a feature branch that is significantly behind main. This helps developers rebase early rather than discovering conflicts late in the workflow.
|
|
172
|
+
|
|
173
|
+
**Note:** Unlike `/qa` and `/test`, `/exec` **warns but does not block** — starting implementation on a slightly stale branch is acceptable since rebasing can happen before PR creation.
|
|
174
|
+
|
|
175
|
+
**Detection:**
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
# Ensure we have latest remote state
|
|
179
|
+
git fetch origin 2>/dev/null || true
|
|
180
|
+
|
|
181
|
+
# Count commits behind main (only if we're in a worktree, not on main)
|
|
182
|
+
current_branch=$(git rev-parse --abbrev-ref HEAD)
|
|
183
|
+
if [[ "$current_branch" != "main" && "$current_branch" != "master" ]]; then
|
|
184
|
+
behind=$(git rev-list --count HEAD..origin/main 2>/dev/null || echo "0")
|
|
185
|
+
echo "Feature branch is $behind commits behind main"
|
|
186
|
+
fi
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
**Threshold Configuration:**
|
|
190
|
+
|
|
191
|
+
The stale branch threshold is configurable in `.sequant/settings.json`:
|
|
192
|
+
|
|
193
|
+
```json
|
|
194
|
+
{
|
|
195
|
+
"run": {
|
|
196
|
+
"staleBranchThreshold": 5
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
Default: 5 commits
|
|
202
|
+
|
|
203
|
+
**Behavior:**
|
|
204
|
+
|
|
205
|
+
| Commits Behind | Action |
|
|
206
|
+
|----------------|--------|
|
|
207
|
+
| 0 | ✅ Proceed normally |
|
|
208
|
+
| 1 to threshold | ℹ️ **Info:** "Feature branch is N commits behind main." |
|
|
209
|
+
| > threshold | ⚠️ **Warning:** "Feature branch is N commits behind main (threshold: T). Consider rebasing before continuing: `git fetch origin && git rebase origin/main`" |
|
|
210
|
+
|
|
211
|
+
**Important:** `/exec` never blocks on stale branches. It warns to help developers make informed decisions about rebasing.
|
|
212
|
+
|
|
213
|
+
**Output Format:**
|
|
214
|
+
|
|
215
|
+
```markdown
|
|
216
|
+
### Stale Branch Check
|
|
217
|
+
|
|
218
|
+
| Check | Value |
|
|
219
|
+
|-------|-------|
|
|
220
|
+
| Commits behind main | N |
|
|
221
|
+
| Threshold | T |
|
|
222
|
+
| Status | ✅ OK / ℹ️ Info / ⚠️ Warning |
|
|
223
|
+
|
|
224
|
+
[Info/warning message if applicable]
|
|
225
|
+
```
|
|
226
|
+
|
|
137
227
|
### 1. Check Implementation Readiness
|
|
138
228
|
|
|
139
229
|
**FIRST STEP:** Review the issue readiness and proceed with implementation.
|
|
@@ -160,34 +250,263 @@ git branch -a | grep -i "<issue-number>" || true
|
|
|
160
250
|
- Issue is already closed
|
|
161
251
|
- No acceptance criteria exist and cannot be inferred
|
|
162
252
|
|
|
163
|
-
### 2. Re-establish Context
|
|
253
|
+
### 2. Re-establish Context (with Parallel Optimization)
|
|
254
|
+
|
|
255
|
+
**Performance Optimization:** When creating a new worktree, gather context in parallel with worktree creation to reduce setup time by ~5-10 seconds.
|
|
256
|
+
|
|
257
|
+
#### Parallel Context Gathering Pattern
|
|
258
|
+
|
|
259
|
+
When worktree creation is needed (standalone mode, no existing worktree):
|
|
260
|
+
|
|
261
|
+
```
|
|
262
|
+
1. Start worktree creation in background → runs ~30s (npm install)
|
|
263
|
+
2. While waiting, gather context in parallel:
|
|
264
|
+
- Fetch issue details ~2s
|
|
265
|
+
- Read all issue comments ~2s
|
|
266
|
+
- Check for existing patterns/files ~2s
|
|
267
|
+
3. Wait for worktree completion
|
|
268
|
+
4. Begin implementation with full context ready
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
**Implementation:**
|
|
272
|
+
|
|
273
|
+
1. **Start worktree creation as background task:**
|
|
274
|
+
```bash
|
|
275
|
+
# From main repo, start worktree creation in background
|
|
276
|
+
./scripts/dev/new-feature.sh <issue-number> &
|
|
277
|
+
WORKTREE_PID=$!
|
|
278
|
+
echo "Worktree creation started (PID: $WORKTREE_PID)"
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
2. **Gather context while waiting:**
|
|
282
|
+
- **Read all GitHub issue comments** to gather complete context:
|
|
283
|
+
- Comments often contain clarifications, updates, or additional AC added after the initial issue description
|
|
284
|
+
- Look for discussion about implementation details, edge cases, or requirements mentioned in comments
|
|
285
|
+
- Review feedback from previous implementation cycles or review comments
|
|
286
|
+
- Summarize briefly:
|
|
287
|
+
- The AC checklist (AC-1, AC-2, ...) from the issue and all comments
|
|
288
|
+
- The current implementation plan (from issue comments or `/spec`)
|
|
289
|
+
- **The Feature Quality Planning section** (if present from `/spec`)
|
|
290
|
+
- If there is no plan:
|
|
291
|
+
- Ask whether to quickly propose one (or suggest using `/spec` first).
|
|
292
|
+
|
|
293
|
+
#### 2.1b Quality Plan Reference (RECOMMENDED)
|
|
294
|
+
|
|
295
|
+
**If `/spec` was run**, look for the **Feature Quality Planning** section in issue comments. This section provides guidance for implementation quality:
|
|
296
|
+
|
|
297
|
+
**What to extract from Quality Plan:**
|
|
298
|
+
- **Error Handling items** → Implement error handling for identified scenarios
|
|
299
|
+
- **Edge cases** → Handle edge cases listed in the plan
|
|
300
|
+
- **Test Coverage items** → Know what tests are expected
|
|
301
|
+
- **Derived ACs** → Additional ACs generated from quality planning
|
|
302
|
+
|
|
303
|
+
**How to use during implementation:**
|
|
304
|
+
1. Before implementing each AC, check if quality plan has related items
|
|
305
|
+
2. Implement error handling per quality plan's "Error Handling" checklist
|
|
306
|
+
3. Ensure test coverage matches quality plan's "Test Coverage Plan"
|
|
307
|
+
4. Address derived ACs alongside original ACs
|
|
308
|
+
|
|
309
|
+
**Example reference:**
|
|
310
|
+
```markdown
|
|
311
|
+
Per Quality Plan:
|
|
312
|
+
- Error Handling: Handle API timeout with graceful fallback
|
|
313
|
+
- Test Coverage: Add unit tests for edge case (empty input)
|
|
314
|
+
- Derived AC-6: Log errors for observability
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
**If no Quality Plan found:** Proceed with standard implementation but note in progress update that quality planning was not available.
|
|
318
|
+
|
|
319
|
+
#### 2.1b2 Codebase Conventions (RECOMMENDED)
|
|
320
|
+
|
|
321
|
+
**Before generating code**, check for codebase conventions detected during `sequant init`:
|
|
322
|
+
|
|
323
|
+
```bash
|
|
324
|
+
# Read conventions file if it exists
|
|
325
|
+
cat .sequant/conventions.json 2>/dev/null || echo "No conventions detected"
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
**If `.sequant/conventions.json` exists**, use the detected conventions to align generated code:
|
|
329
|
+
- **testFilePattern** → Name test files accordingly (e.g., `*.test.ts` vs `*.spec.ts`)
|
|
330
|
+
- **exportStyle** → Use named or default exports to match codebase style
|
|
331
|
+
- **asyncPattern** → Prefer async/await or promise chains as appropriate
|
|
332
|
+
- **indentation** → Match existing indentation style
|
|
333
|
+
- **semicolons** → Include or omit semicolons per convention
|
|
334
|
+
|
|
335
|
+
**Manual overrides** in the `manual` section take precedence over detected values.
|
|
336
|
+
|
|
337
|
+
**If no conventions file exists:** Proceed normally — conventions are optional enhancement.
|
|
338
|
+
|
|
339
|
+
#### 2.1c Derived AC Extraction (REQUIRED when Quality Plan exists)
|
|
340
|
+
|
|
341
|
+
**Purpose:** Extract derived ACs from the spec comment's Derived ACs table so they can be tracked alongside original ACs during implementation.
|
|
342
|
+
|
|
343
|
+
**When to extract:** If the Quality Plan section exists and contains a "Derived ACs" table.
|
|
344
|
+
|
|
345
|
+
**Extraction Method:**
|
|
346
|
+
|
|
347
|
+
```bash
|
|
348
|
+
# Extract derived ACs from spec comment's Derived ACs table
|
|
349
|
+
# Format: | Source | AC-N: Description | Priority |
|
|
350
|
+
# Uses flexible pattern to match any source dimension (not hardcoded)
|
|
351
|
+
derived_acs=$(gh issue view <issue-number> --comments --json comments -q '.comments[].body' | \
|
|
352
|
+
grep -E '\|[^|]+\|\s*AC-[0-9]+:' | \
|
|
353
|
+
grep -oE 'AC-[0-9]+:[^|]+' | \
|
|
354
|
+
sed 's/^[[:space:]]*//;s/[[:space:]]*$//' | \
|
|
355
|
+
sort -u || true)
|
|
356
|
+
|
|
357
|
+
# Display extracted derived ACs
|
|
358
|
+
if [[ -n "$derived_acs" ]]; then
|
|
359
|
+
echo "Derived ACs found:"
|
|
360
|
+
echo "$derived_acs"
|
|
361
|
+
else
|
|
362
|
+
echo "No derived ACs found in spec comment"
|
|
363
|
+
fi
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
**Handling Malformed Rows:**
|
|
367
|
+
|
|
368
|
+
The extraction pattern is designed to handle edge cases:
|
|
369
|
+
- Missing columns → Row is skipped (requires Source + AC-N pattern)
|
|
370
|
+
- Extra whitespace → Trimmed during extraction
|
|
371
|
+
- Empty description → AC ID still captured
|
|
372
|
+
- Non-standard source names → Row is skipped (only standard sources matched)
|
|
373
|
+
|
|
374
|
+
**Include in AC Tracking:**
|
|
375
|
+
|
|
376
|
+
Once extracted, derived ACs should be:
|
|
377
|
+
1. Added to the implementation checklist
|
|
378
|
+
2. Tracked in the Pre-PR AC Verification table (labeled as "Derived")
|
|
379
|
+
3. Included in progress updates
|
|
380
|
+
|
|
381
|
+
**Example Output:**
|
|
382
|
+
|
|
383
|
+
```markdown
|
|
384
|
+
## Derived ACs (from Quality Plan)
|
|
385
|
+
|
|
386
|
+
| AC | Source | Description | Status |
|
|
387
|
+
|----|--------|-------------|--------|
|
|
388
|
+
| AC-6 | Error Handling | Handle malformed table rows gracefully | ⬜ Pending |
|
|
389
|
+
| AC-7 | Test Coverage | Verify extraction with 0, 1, 5+ derived ACs | ⬜ Pending |
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
**If no Derived ACs found:** Output: "Derived ACs: None in spec comment" and proceed with original ACs only.
|
|
393
|
+
|
|
394
|
+
3. **Wait for worktree completion before implementation:**
|
|
395
|
+
```bash
|
|
396
|
+
# Wait for worktree creation to complete
|
|
397
|
+
wait $WORKTREE_PID
|
|
398
|
+
WORKTREE_EXIT=$?
|
|
399
|
+
if [ $WORKTREE_EXIT -ne 0 ]; then
|
|
400
|
+
echo "ERROR: Worktree creation failed with exit code $WORKTREE_EXIT"
|
|
401
|
+
# Fall back to sequential creation with error visibility
|
|
402
|
+
fi
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
**When to use parallel context gathering:**
|
|
406
|
+
- ✅ Creating a new worktree (standalone mode)
|
|
407
|
+
- ❌ Worktree already exists (skip - just navigate to it)
|
|
408
|
+
- ❌ Orchestrated mode (SEQUANT_WORKTREE set - worktree pre-created)
|
|
409
|
+
|
|
410
|
+
**Fallback:** If parallel execution fails or is not applicable, fall back to sequential context gathering.
|
|
411
|
+
|
|
412
|
+
### 2.1a Smoke Test (Recommended for UI Issues)
|
|
413
|
+
|
|
414
|
+
**Purpose:** Catch runtime failures that pass `npm test` and `npm run build` but crash at runtime (e.g., missing module registrations, framework version incompatibilities).
|
|
415
|
+
|
|
416
|
+
**When to run:** Issues with `admin`, `ui`, or `frontend` labels.
|
|
417
|
+
|
|
418
|
+
**Skip if:** Issue has none of these labels (backend-only, CLI, docs, etc.).
|
|
419
|
+
|
|
420
|
+
**Quick verification (< 30 seconds):**
|
|
421
|
+
|
|
422
|
+
1. Start dev server in background:
|
|
423
|
+
```bash
|
|
424
|
+
npm run dev &
|
|
425
|
+
DEV_PID=$!
|
|
426
|
+
sleep 5 # Wait for server startup
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
2. Check for startup errors:
|
|
430
|
+
```bash
|
|
431
|
+
# Verify server is running
|
|
432
|
+
curl -s http://localhost:3000 > /dev/null && echo "✓ Server responding" || echo "✗ Server not responding"
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
3. Kill the dev server:
|
|
436
|
+
```bash
|
|
437
|
+
kill $DEV_PID 2>/dev/null
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
**What to look for:**
|
|
441
|
+
- ✗ Server crash on startup → Check `framework-gotchas.md`
|
|
442
|
+
- ✗ Blank white page → React hydration error or missing component
|
|
443
|
+
- ✗ Module registration errors → AG Grid, chart libraries, etc.
|
|
444
|
+
- ✗ Console errors on load → Missing imports, env vars
|
|
164
445
|
|
|
165
|
-
|
|
166
|
-
- Comments often contain clarifications, updates, or additional AC added after the initial issue description
|
|
167
|
-
- Look for discussion about implementation details, edge cases, or requirements mentioned in comments
|
|
168
|
-
- Review feedback from previous implementation cycles or review comments
|
|
169
|
-
- Summarize briefly:
|
|
170
|
-
- The AC checklist (AC-1, AC-2, ...) from the issue and all comments
|
|
171
|
-
- The current implementation plan (from issue comments or `/spec`)
|
|
172
|
-
- If there is no plan:
|
|
173
|
-
- Ask whether to quickly propose one (or suggest using `/spec` first).
|
|
446
|
+
**If issues found:** Fix before proceeding with new implementation. Reference `references/shared/framework-gotchas.md` for common solutions.
|
|
174
447
|
|
|
175
448
|
### Feature Worktree Workflow
|
|
176
449
|
|
|
177
450
|
**Execution Phase:** Create and work in a feature worktree.
|
|
178
451
|
|
|
452
|
+
**CRITICAL: Main Branch Safeguard (Issue #85)**
|
|
453
|
+
|
|
454
|
+
Before starting any implementation, verify you are NOT on the main/master branch:
|
|
455
|
+
|
|
456
|
+
```bash
|
|
457
|
+
# Check current branch
|
|
458
|
+
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
|
|
459
|
+
echo "Current branch: $CURRENT_BRANCH"
|
|
460
|
+
```
|
|
461
|
+
|
|
462
|
+
**If on main/master branch:**
|
|
463
|
+
1. **STOP** - Do not implement directly on main
|
|
464
|
+
2. Create a feature worktree first: `./scripts/dev/new-feature.sh <issue-number>`
|
|
465
|
+
- For custom base branch: `./scripts/dev/new-feature.sh <issue-number> --base <branch>`
|
|
466
|
+
3. Navigate to the worktree before making any changes
|
|
467
|
+
|
|
468
|
+
**Why this matters:** Work done directly on main can be lost during sync operations (git reset, git pull --rebase, etc.). Worktrees provide isolation and safe recovery through branches.
|
|
469
|
+
|
|
470
|
+
**If orchestrated (SEQUANT_WORKTREE is set):**
|
|
471
|
+
- Use the provided worktree path directly: `cd $SEQUANT_WORKTREE`
|
|
472
|
+
- Skip steps 1-2 below (worktree already created by orchestrator)
|
|
473
|
+
- Continue with step 3 (Work in the worktree)
|
|
474
|
+
|
|
475
|
+
**If standalone:**
|
|
476
|
+
|
|
179
477
|
1. **Check if worktree already exists:**
|
|
180
478
|
- Check if you're already in a worktree: `git worktree list` or check if `../worktrees/` contains a directory for this issue
|
|
181
479
|
- If worktree exists, navigate to it and continue work there
|
|
182
480
|
|
|
183
|
-
2. **Create worktree if needed:**
|
|
184
|
-
|
|
185
|
-
|
|
481
|
+
2. **Create worktree if needed (with parallel context gathering):**
|
|
482
|
+
|
|
483
|
+
**Optimized flow (parallel):**
|
|
484
|
+
```bash
|
|
485
|
+
# Step 1: Start worktree creation in background
|
|
486
|
+
# For default (main) base:
|
|
487
|
+
./scripts/dev/new-feature.sh <issue-number> &
|
|
488
|
+
# For custom base branch (e.g., feature integration branch):
|
|
489
|
+
./scripts/dev/new-feature.sh <issue-number> --base feature/dashboard &
|
|
490
|
+
WORKTREE_PID=$!
|
|
491
|
+
|
|
492
|
+
# Step 2: Gather context while worktree creates (see Section 2)
|
|
493
|
+
# - Fetch issue details
|
|
494
|
+
# - Read issue comments
|
|
495
|
+
# - Check for existing patterns
|
|
496
|
+
|
|
497
|
+
# Step 3: Wait for worktree completion
|
|
498
|
+
wait $WORKTREE_PID
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
**What new-feature.sh does:**
|
|
186
502
|
- Fetch issue details from GitHub
|
|
187
503
|
- Create branch: `feature/<issue-number>-<issue-title-slug>`
|
|
188
504
|
- Create worktree in: `../worktrees/feature/<branch-name>/`
|
|
189
|
-
-
|
|
505
|
+
- Branch from specified base (default: main)
|
|
506
|
+
- Install dependencies (can use cache if `SEQUANT_NPM_CACHE=true`)
|
|
190
507
|
- Copy environment files if they exist
|
|
508
|
+
|
|
509
|
+
**After completion:**
|
|
191
510
|
- Navigate to the worktree directory: `cd ../worktrees/feature/<branch-name>/`
|
|
192
511
|
|
|
193
512
|
3. **Work in the worktree:**
|
|
@@ -202,6 +521,204 @@ git branch -a | grep -i "<issue-number>" || true
|
|
|
202
521
|
|
|
203
522
|
**Important:** Always work in the worktree directory, not the main repository, once the worktree is created.
|
|
204
523
|
|
|
524
|
+
### Pre-PR AC Verification (REQUIRED)
|
|
525
|
+
|
|
526
|
+
**Before creating a PR**, you MUST verify that each Acceptance Criteria has been addressed:
|
|
527
|
+
|
|
528
|
+
1. **Retrieve AC from workflow state:**
|
|
529
|
+
```bash
|
|
530
|
+
# Get stored AC for this issue
|
|
531
|
+
npx tsx -e "
|
|
532
|
+
import { StateManager } from './src/lib/workflow/state-manager.ts';
|
|
533
|
+
const manager = new StateManager();
|
|
534
|
+
(async () => {
|
|
535
|
+
const state = await manager.getIssueState(<issue-number>);
|
|
536
|
+
if (state?.acceptanceCriteria) {
|
|
537
|
+
console.log(JSON.stringify(state.acceptanceCriteria, null, 2));
|
|
538
|
+
} else {
|
|
539
|
+
console.log('No AC found in state - check issue body');
|
|
540
|
+
}
|
|
541
|
+
})();
|
|
542
|
+
"
|
|
543
|
+
```
|
|
544
|
+
|
|
545
|
+
2. **If no AC in state**, extract from issue body:
|
|
546
|
+
- Check issue body for AC items (AC-1, AC-2, etc.)
|
|
547
|
+
- Parse from issue comments if clarifications were added
|
|
548
|
+
|
|
549
|
+
3. **Generate AC Verification Checklist:**
|
|
550
|
+
|
|
551
|
+
For each AC item (including derived ACs), determine implementation status:
|
|
552
|
+
|
|
553
|
+
```markdown
|
|
554
|
+
### Pre-PR AC Verification
|
|
555
|
+
|
|
556
|
+
| AC | Source | Description | Status | Evidence |
|
|
557
|
+
|----|--------|-------------|--------|----------|
|
|
558
|
+
| AC-1 | Original | [Description] | ✅ Implemented | [File:line or brief explanation] |
|
|
559
|
+
| AC-2 | Original | [Description] | ✅ Implemented | [File:line or brief explanation] |
|
|
560
|
+
| AC-3 | Original | [Description] | ⚠️ Partial | [What's missing] |
|
|
561
|
+
| **Derived ACs** | | | | |
|
|
562
|
+
| AC-6 | Error Handling | [From Quality Plan] | ✅ Implemented | [File:line] |
|
|
563
|
+
| AC-7 | Test Coverage | [From Quality Plan] | ⚠️ Partial | [What's missing] |
|
|
564
|
+
```
|
|
565
|
+
|
|
566
|
+
**Derived AC Handling:**
|
|
567
|
+
- Extract derived ACs using the method in Section 2.1c
|
|
568
|
+
- Include in the same verification table with "Source" column indicating origin
|
|
569
|
+
- Treat derived ACs identically to original ACs for verification purposes
|
|
570
|
+
|
|
571
|
+
4. **Status Definitions:**
|
|
572
|
+
- ✅ **Implemented**: Code exists that satisfies this AC
|
|
573
|
+
- ⚠️ **Partial**: Some aspects implemented, others missing
|
|
574
|
+
- ❌ **Not addressed**: AC not implemented (must include justification)
|
|
575
|
+
- 🔄 **Deferred**: Intentionally deferred to follow-up issue (link issue)
|
|
576
|
+
|
|
577
|
+
5. **Verification Behavior:**
|
|
578
|
+
- **All AC ✅**: Proceed to PR creation
|
|
579
|
+
- **Some AC ⚠️/❌**: Include in PR description as known gaps
|
|
580
|
+
- **Critical AC ❌**: Consider whether to create PR or continue implementation
|
|
581
|
+
|
|
582
|
+
6. **Include in PR Description:**
|
|
583
|
+
Add the AC verification table to the PR body so reviewers can validate coverage.
|
|
584
|
+
|
|
585
|
+
**Why this matters:** Catching AC gaps before PR creation:
|
|
586
|
+
- Reduces review cycles
|
|
587
|
+
- Ensures nothing is forgotten
|
|
588
|
+
- Documents intentional deferrals
|
|
589
|
+
- Enables better QA in `/qa` phase
|
|
590
|
+
|
|
591
|
+
### 3f. CHANGELOG Update (REQUIRED for user-facing changes)
|
|
592
|
+
|
|
593
|
+
**Purpose:** Ensure all user-facing changes are documented in the CHANGELOG before PR creation. This prevents documentation gaps and reduces release overhead.
|
|
594
|
+
|
|
595
|
+
**When to update CHANGELOG:**
|
|
596
|
+
|
|
597
|
+
| Change Type | CHANGELOG Required? | Section |
|
|
598
|
+
|-------------|---------------------|---------|
|
|
599
|
+
| New feature | ✅ Yes | `### Added` |
|
|
600
|
+
| Bug fix | ✅ Yes | `### Fixed` |
|
|
601
|
+
| Breaking change | ✅ Yes | `### Changed` or `### Removed` |
|
|
602
|
+
| Performance improvement | ✅ Yes | `### Changed` |
|
|
603
|
+
| Dependency update (security) | ✅ Yes | `### Fixed` or `### Security` |
|
|
604
|
+
| Documentation only | ❌ No | - |
|
|
605
|
+
| Internal refactor (no behavior change) | ❌ No | - |
|
|
606
|
+
| Test-only changes | ❌ No | - |
|
|
607
|
+
| CI/workflow changes | ❌ No | - |
|
|
608
|
+
|
|
609
|
+
**How to update:**
|
|
610
|
+
|
|
611
|
+
1. **Check if CHANGELOG.md exists:**
|
|
612
|
+
```bash
|
|
613
|
+
if [ -f "CHANGELOG.md" ]; then
|
|
614
|
+
echo "CHANGELOG.md found - update required for user-facing changes"
|
|
615
|
+
else
|
|
616
|
+
echo "No CHANGELOG.md - skip CHANGELOG update"
|
|
617
|
+
fi
|
|
618
|
+
```
|
|
619
|
+
|
|
620
|
+
2. **If CHANGELOG.md exists and change is user-facing**, use the Edit tool to add an entry under `## [Unreleased]`:
|
|
621
|
+
|
|
622
|
+
```markdown
|
|
623
|
+
## [Unreleased]
|
|
624
|
+
|
|
625
|
+
### Added
|
|
626
|
+
|
|
627
|
+
- Brief description of new feature (#<issue-number>)
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
3. **Entry format:**
|
|
631
|
+
- Start with a verb: "Add", "Fix", "Update", "Remove", "Improve"
|
|
632
|
+
- Keep it concise (1-2 lines)
|
|
633
|
+
- Include issue number as `(#123)`
|
|
634
|
+
- Group related changes in a single bullet with sub-bullets if needed
|
|
635
|
+
|
|
636
|
+
**Example entries:**
|
|
637
|
+
|
|
638
|
+
```markdown
|
|
639
|
+
### Added
|
|
640
|
+
|
|
641
|
+
- CHANGELOG update step in /exec skill (#320)
|
|
642
|
+
- Instructs /exec to add [Unreleased] entries during feature commits
|
|
643
|
+
- Includes change type classification table
|
|
644
|
+
|
|
645
|
+
### Fixed
|
|
646
|
+
|
|
647
|
+
- Race condition in parallel agent spawning (#315)
|
|
648
|
+
```
|
|
649
|
+
|
|
650
|
+
**If CHANGELOG doesn't exist:** Skip this step. Not all projects use CHANGELOG.md.
|
|
651
|
+
|
|
652
|
+
**If change is not user-facing:** Skip this step but note in progress summary: "CHANGELOG: N/A (internal change)"
|
|
653
|
+
|
|
654
|
+
---
|
|
655
|
+
|
|
656
|
+
### 3g. CLI Wiring Checklist (When Option Interfaces Modified)
|
|
657
|
+
|
|
658
|
+
**Purpose:** Prevent incomplete CLI implementations where option interface fields are added but never wired to CLI flags. This is a proactive check during implementation, complementing the verification in `/qa`.
|
|
659
|
+
|
|
660
|
+
**When to apply:** Adding or modifying `RunOptions` or similar CLI option interfaces.
|
|
661
|
+
|
|
662
|
+
**Origin:** Issue #305 — A `force` option was added to `RunOptions` and used in runtime logic, but `--force` was never registered in `bin/cli.ts`. This caused the feature to be unreachable by users.
|
|
663
|
+
|
|
664
|
+
**Before committing changes that add option interface fields:**
|
|
665
|
+
|
|
666
|
+
| Step | Action | Verification |
|
|
667
|
+
|------|--------|--------------|
|
|
668
|
+
| 1 | Add field to interface | `src/lib/workflow/batch-executor.ts` |
|
|
669
|
+
| 2 | Register CLI flag | Add `.option("--flag-name", "description")` in `bin/cli.ts` |
|
|
670
|
+
| 3 | Wire to handler | Ensure `options.flagName` passes to implementation |
|
|
671
|
+
| 4 | Test CLI help | Run `npx tsx bin/cli.ts <command> --help` to verify flag appears |
|
|
672
|
+
|
|
673
|
+
**Key File Map:**
|
|
674
|
+
|
|
675
|
+
| Interface | Location | CLI Registration |
|
|
676
|
+
|-----------|----------|------------------|
|
|
677
|
+
| `RunOptions` | `src/lib/workflow/batch-executor.ts` | `run` command in `bin/cli.ts` |
|
|
678
|
+
|
|
679
|
+
**Quick Verification Script:**
|
|
680
|
+
|
|
681
|
+
```bash
|
|
682
|
+
# List all RunOptions fields
|
|
683
|
+
grep -E '^\s+\w+\??: ' src/lib/workflow/batch-executor.ts | head -30 || true
|
|
684
|
+
|
|
685
|
+
# List all registered options for 'run' command
|
|
686
|
+
grep -A 50 'command("run")' bin/cli.ts | grep '\.option(' | head -30 || true
|
|
687
|
+
|
|
688
|
+
# Check if a specific field is registered (e.g., 'force')
|
|
689
|
+
field_name="force"
|
|
690
|
+
cli_flag=$(echo "$field_name" | sed 's/\([A-Z]\)/-\L\1/g') # camelCase to kebab-case
|
|
691
|
+
grep -q "\-\-$cli_flag" bin/cli.ts && echo "✅ --$cli_flag registered" || echo "❌ --$cli_flag NOT registered"
|
|
692
|
+
```
|
|
693
|
+
|
|
694
|
+
**Internal-only Field Exclusion:**
|
|
695
|
+
|
|
696
|
+
Not all interface fields need CLI registration. Fields are internal-only if:
|
|
697
|
+
- They have no `mergedOptions.X` runtime usage (set programmatically)
|
|
698
|
+
- They're environment-controlled (e.g., `SEQUANT_*` env vars)
|
|
699
|
+
- They're only used in type signatures, not at runtime
|
|
700
|
+
|
|
701
|
+
**Detection:** If `grep "mergedOptions.$field"` returns no matches, the field is likely internal-only.
|
|
702
|
+
|
|
703
|
+
**Self-Check Before Commit:**
|
|
704
|
+
|
|
705
|
+
```markdown
|
|
706
|
+
## CLI Wiring Self-Check
|
|
707
|
+
|
|
708
|
+
| New Field | CLI Flag | Help Text | Wiring Status |
|
|
709
|
+
|-----------|----------|-----------|---------------|
|
|
710
|
+
| `newOption` | `--new-option` | "Description" | ✅ Complete |
|
|
711
|
+
| `internalOnly` | N/A | N/A | ⏭️ Internal |
|
|
712
|
+
```
|
|
713
|
+
|
|
714
|
+
**If wiring is incomplete:**
|
|
715
|
+
1. Add the missing `.option()` call in `bin/cli.ts`
|
|
716
|
+
2. Update help text to describe the flag
|
|
717
|
+
3. Run `npm run build` to verify no TypeScript errors
|
|
718
|
+
4. Test with `--help` to confirm flag appears
|
|
719
|
+
|
|
720
|
+
---
|
|
721
|
+
|
|
205
722
|
### PR Creation and Verification
|
|
206
723
|
|
|
207
724
|
After implementation is complete and all checks pass, create and verify the PR:
|
|
@@ -244,6 +761,16 @@ After implementation is complete and all checks pass, create and verify the PR:
|
|
|
244
761
|
- If PR exists: Record the URL from `gh pr view` output
|
|
245
762
|
- If PR creation failed: Record the error and include manual creation instructions
|
|
246
763
|
|
|
764
|
+
6. **Record PR info in workflow state:**
|
|
765
|
+
```bash
|
|
766
|
+
# Extract PR number and URL from gh pr view output, then update state
|
|
767
|
+
PR_INFO=$(gh pr view --json number,url)
|
|
768
|
+
PR_NUMBER=$(echo "$PR_INFO" | jq -r '.number')
|
|
769
|
+
PR_URL=$(echo "$PR_INFO" | jq -r '.url')
|
|
770
|
+
npx tsx scripts/state/update.ts pr <issue-number> "$PR_NUMBER" "$PR_URL"
|
|
771
|
+
```
|
|
772
|
+
This enables `--cleanup` to detect merged PRs and auto-remove state entries.
|
|
773
|
+
|
|
247
774
|
**PR Verification Failure Handling:**
|
|
248
775
|
|
|
249
776
|
If `gh pr view` fails after retry:
|
|
@@ -275,6 +802,52 @@ If `gh pr view` fails after retry:
|
|
|
275
802
|
- If it needs modification, extend it rather than creating a new one
|
|
276
803
|
- Document why existing utilities don't meet requirements before creating new ones
|
|
277
804
|
|
|
805
|
+
### Check npm for Existing Packages
|
|
806
|
+
|
|
807
|
+
**IMPORTANT:** Before implementing utilities for common "solved problem" domains, check if a well-maintained package exists.
|
|
808
|
+
|
|
809
|
+
**Domains to check npm first:**
|
|
810
|
+
|
|
811
|
+
| Domain | Recommended Packages |
|
|
812
|
+
|--------|---------------------|
|
|
813
|
+
| Date/time handling | `date-fns`, `dayjs` |
|
|
814
|
+
| Validation | `zod`, `yup`, `valibot` |
|
|
815
|
+
| HTTP requests with retry | `ky`, `got`, `axios` |
|
|
816
|
+
| Form state | `react-hook-form`, `formik` |
|
|
817
|
+
| State management | `zustand`, `jotai` |
|
|
818
|
+
| ID generation | `nanoid`, `uuid` |
|
|
819
|
+
| String utilities | `lodash` (specific imports only) |
|
|
820
|
+
|
|
821
|
+
**Package evaluation criteria:**
|
|
822
|
+
|
|
823
|
+
| Criterion | Threshold | Why |
|
|
824
|
+
|-----------|-----------|-----|
|
|
825
|
+
| Weekly downloads | >10,000 | Indicates community trust |
|
|
826
|
+
| Last update | <6 months ago | Actively maintained |
|
|
827
|
+
| License | MIT, Apache-2.0, BSD | Permissive, compatible |
|
|
828
|
+
| Bundle size | Proportional to use | Avoid 500kb for one function |
|
|
829
|
+
|
|
830
|
+
**Quick check commands:**
|
|
831
|
+
```bash
|
|
832
|
+
# Package metadata (license, last update, size)
|
|
833
|
+
npm view <pkg> --json | jq '{name, version, license, modified: .time.modified, size: .dist.unpackedSize}'
|
|
834
|
+
|
|
835
|
+
# Weekly downloads (requires npm API)
|
|
836
|
+
curl -s "https://api.npmjs.org/downloads/point/last-week/<pkg>" | jq '.downloads'
|
|
837
|
+
```
|
|
838
|
+
|
|
839
|
+
**Custom implementation is appropriate when:**
|
|
840
|
+
- Only a tiny subset of functionality needed (<20 lines)
|
|
841
|
+
- Package is abandoned (no updates 12+ months) or has security issues
|
|
842
|
+
- Project constraints prohibit new dependencies
|
|
843
|
+
- User explicitly requests custom solution
|
|
844
|
+
|
|
845
|
+
**Decision flow:**
|
|
846
|
+
1. Is this a "solved problem" domain? → Check npm first
|
|
847
|
+
2. Does a well-maintained package exist? → Prefer package
|
|
848
|
+
3. Would custom implementation be <20 lines? → Custom is OK
|
|
849
|
+
4. Uncertain? → Ask user preference
|
|
850
|
+
|
|
278
851
|
### Check Framework Gotchas on Runtime Errors
|
|
279
852
|
|
|
280
853
|
**When encountering unexpected runtime errors or build failures:**
|
|
@@ -292,19 +865,41 @@ If you discover a new framework-specific issue that caused debugging time, add i
|
|
|
292
865
|
|
|
293
866
|
This section covers optional MCP tools that enhance implementation quality when available.
|
|
294
867
|
|
|
295
|
-
#### MCP Availability Check
|
|
868
|
+
#### MCP Availability Check (Lazy Loading)
|
|
869
|
+
|
|
870
|
+
**Performance Optimization:** Check MCP availability lazily on first use, NOT proactively at session start. This avoids wasting time checking MCPs for issues that don't need them.
|
|
296
871
|
|
|
297
|
-
**
|
|
872
|
+
**Lazy Check Pattern:**
|
|
873
|
+
- ❌ **Don't:** Check all MCPs at session start
|
|
874
|
+
- ✅ **Do:** Check MCP availability only when you're about to use it
|
|
298
875
|
|
|
299
876
|
```markdown
|
|
300
|
-
**MCP
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
877
|
+
**MCP Check (on first use only):**
|
|
878
|
+
When you need to use an MCP tool:
|
|
879
|
+
1. Attempt the MCP call
|
|
880
|
+
2. If it fails with "tool not available", use the fallback strategy
|
|
881
|
+
3. Cache the result for the session (don't re-check)
|
|
882
|
+
```
|
|
304
883
|
|
|
305
|
-
|
|
884
|
+
**Example - Lazy Context7 Check:**
|
|
885
|
+
```javascript
|
|
886
|
+
// Only check when you actually need library docs
|
|
887
|
+
// NOT at session start
|
|
888
|
+
if (need_library_documentation) {
|
|
889
|
+
// Try Context7 - fallback to WebSearch if unavailable
|
|
890
|
+
try {
|
|
891
|
+
mcp__context7__resolve-library-id(...)
|
|
892
|
+
} catch {
|
|
893
|
+
// Fallback: use WebSearch or codebase patterns
|
|
894
|
+
}
|
|
895
|
+
}
|
|
306
896
|
```
|
|
307
897
|
|
|
898
|
+
**Why lazy loading:**
|
|
899
|
+
- Many issues don't need MCPs (simple bugs, docs, config changes)
|
|
900
|
+
- Proactive checks waste 2-5 seconds per MCP
|
|
901
|
+
- Lazy checks only run when the tool provides value
|
|
902
|
+
|
|
308
903
|
---
|
|
309
904
|
|
|
310
905
|
#### Context7 - Library Documentation Lookup
|
|
@@ -462,20 +1057,387 @@ If your project uses a database MCP (e.g., Supabase, Postgres):
|
|
|
462
1057
|
### 3. Checks-first Mindset
|
|
463
1058
|
|
|
464
1059
|
- Before and after meaningful changes, plan to run:
|
|
465
|
-
- `npm
|
|
1060
|
+
- `npm run build` - TypeScript compilation
|
|
1061
|
+
- `npm run lint` - ESLint validation (catches unused imports, formatting issues)
|
|
1062
|
+
- `npm test` - Run relevant tests
|
|
466
1063
|
- For larger changes or anything that might impact build/runtime:
|
|
467
1064
|
- Suggest running `npm run build` and interpret any errors.
|
|
468
1065
|
|
|
1066
|
+
**Pre-PR Quality Gates (REQUIRED):**
|
|
1067
|
+
|
|
1068
|
+
Before creating a PR, run ALL checks in this order:
|
|
1069
|
+
1. `npm run build` - Must pass (no TypeScript errors)
|
|
1070
|
+
2. `npm run lint` - Must pass (no ESLint errors)
|
|
1071
|
+
3. `npm test` - Must pass (all tests green)
|
|
1072
|
+
|
|
1073
|
+
If any check fails, fix the issues before creating the PR.
|
|
1074
|
+
|
|
469
1075
|
Do NOT silently skip checks. Always state which commands you intend to run and why.
|
|
470
1076
|
|
|
1077
|
+
### 3a. Test Coverage Transparency (REQUIRED)
|
|
1078
|
+
|
|
1079
|
+
**Purpose:** Report which changed files have corresponding tests, not just "N tests passed."
|
|
1080
|
+
|
|
1081
|
+
**After running `npm test`, you MUST analyze test coverage for changed files:**
|
|
1082
|
+
|
|
1083
|
+
Use the Glob tool to check for corresponding test files:
|
|
1084
|
+
```
|
|
1085
|
+
# Get changed source files (excluding tests) from git
|
|
1086
|
+
changed=$(git diff main...HEAD --name-only | grep -E '\.(ts|tsx|js|jsx)$' | grep -v -E '\.test\.|\.spec\.|__tests__' || true)
|
|
1087
|
+
|
|
1088
|
+
# For each changed file, use the Glob tool to find matching test files
|
|
1089
|
+
# Glob(pattern="**/${base}.test.*") or Glob(pattern="**/${base}.spec.*")
|
|
1090
|
+
# If no test file found, report "NO TEST: $file"
|
|
1091
|
+
```
|
|
1092
|
+
|
|
1093
|
+
**Required reporting format:**
|
|
1094
|
+
|
|
1095
|
+
| Scenario | Report |
|
|
1096
|
+
|----------|--------|
|
|
1097
|
+
| Tests cover changed files | `Tests: N passed (covers changed files)` |
|
|
1098
|
+
| Tests don't cover changed files | `Tests: N passed (⚠️ 0 cover changed files)` |
|
|
1099
|
+
| No tests for specific files | `Tests: N passed (⚠️ NO TESTS: file1.ts, file2.ts)` |
|
|
1100
|
+
|
|
1101
|
+
### 3b. Change Tier Classification
|
|
1102
|
+
|
|
1103
|
+
**Purpose:** Flag coverage gaps based on criticality, not just presence/absence.
|
|
1104
|
+
|
|
1105
|
+
**Tier definitions:**
|
|
1106
|
+
|
|
1107
|
+
| Tier | Change Type | Coverage Requirement |
|
|
1108
|
+
|------|-------------|---------------------|
|
|
1109
|
+
| **Critical** | Auth, payments, security, server-actions, middleware, admin | Flag prominently if missing |
|
|
1110
|
+
| **Standard** | Business logic, API handlers, utilities | Note if missing |
|
|
1111
|
+
| **Optional** | Config, types-only, UI tweaks | No flag needed |
|
|
1112
|
+
|
|
1113
|
+
**Detection heuristic:**
|
|
1114
|
+
|
|
1115
|
+
```bash
|
|
1116
|
+
# Detect critical paths in changed files
|
|
1117
|
+
changed=$(git diff main...HEAD --name-only | grep -E '\.(ts|tsx|js|jsx)$' || true)
|
|
1118
|
+
critical=$(echo "$changed" | grep -E 'auth|payment|security|server-action|middleware|admin' || true)
|
|
1119
|
+
|
|
1120
|
+
if [[ -n "$critical" ]]; then
|
|
1121
|
+
echo "⚠️ CRITICAL PATH CHANGES (test coverage strongly recommended):"
|
|
1122
|
+
echo "$critical"
|
|
1123
|
+
fi
|
|
1124
|
+
```
|
|
1125
|
+
|
|
1126
|
+
**Include in progress summary:**
|
|
1127
|
+
|
|
1128
|
+
```markdown
|
|
1129
|
+
### Test Coverage Analysis
|
|
1130
|
+
|
|
1131
|
+
| Changed File | Tier | Has Tests? |
|
|
1132
|
+
|--------------|------|------------|
|
|
1133
|
+
| `auth/login.ts` | Critical | ⚠️ NO TESTS |
|
|
1134
|
+
| `lib/utils.ts` | Standard | ✅ Yes |
|
|
1135
|
+
| `types/index.ts` | Optional | - (types only) |
|
|
1136
|
+
|
|
1137
|
+
**Coverage:** X/Y changed source files have corresponding tests
|
|
1138
|
+
```
|
|
1139
|
+
|
|
1140
|
+
### 3c. Shell Script Checks (When .sh files modified)
|
|
1141
|
+
|
|
1142
|
+
**Purpose:** Catch shell script issues that `npm test` and `npm run build` miss.
|
|
1143
|
+
|
|
1144
|
+
**When shell scripts are modified, run these checks:**
|
|
1145
|
+
|
|
1146
|
+
```bash
|
|
1147
|
+
# Get changed shell scripts
|
|
1148
|
+
shell_scripts=$(git diff main...HEAD --name-only | grep -E '\.sh$' || true)
|
|
1149
|
+
|
|
1150
|
+
for script in $shell_scripts; do
|
|
1151
|
+
echo "Checking: $script"
|
|
1152
|
+
|
|
1153
|
+
# 1. Syntax validation
|
|
1154
|
+
bash -n "$script" && echo "✅ Syntax OK" || echo "❌ Syntax error"
|
|
1155
|
+
|
|
1156
|
+
# 2. Shellcheck (if available)
|
|
1157
|
+
if command -v shellcheck &>/dev/null; then
|
|
1158
|
+
shellcheck "$script" && echo "✅ Shellcheck OK" || echo "⚠️ Shellcheck warnings"
|
|
1159
|
+
fi
|
|
1160
|
+
|
|
1161
|
+
# 3. Unused function detection
|
|
1162
|
+
funcs=$(grep -oE "^[a-zA-Z_]+\(\)" "$script" | sed 's/()//' || true)
|
|
1163
|
+
for func in $funcs; do
|
|
1164
|
+
calls=$(grep -c "\b${func}\b" "$script" || echo "0")
|
|
1165
|
+
if [[ $calls -lt 2 ]]; then
|
|
1166
|
+
echo "⚠️ Function '$func' defined but possibly not called"
|
|
1167
|
+
fi
|
|
1168
|
+
done
|
|
1169
|
+
|
|
1170
|
+
# 4. Smoke test (--help or similar)
|
|
1171
|
+
if grep -q "getopts\|--help" "$script"; then
|
|
1172
|
+
bash "$script" --help 2>/dev/null && echo "✅ --help works" || echo "⚠️ --help failed"
|
|
1173
|
+
fi
|
|
1174
|
+
done
|
|
1175
|
+
```
|
|
1176
|
+
|
|
1177
|
+
**Checklist:**
|
|
1178
|
+
|
|
1179
|
+
| Check | Command | Pass Criteria |
|
|
1180
|
+
|-------|---------|---------------|
|
|
1181
|
+
| Syntax | `bash -n script.sh` | Exit code 0 |
|
|
1182
|
+
| Shellcheck | `shellcheck script.sh` | No errors (warnings OK) |
|
|
1183
|
+
| Functions used | grep analysis | All defined functions called |
|
|
1184
|
+
| Smoke test | `bash script.sh --help` | Runs without crash |
|
|
1185
|
+
|
|
1186
|
+
**Include in progress summary:**
|
|
1187
|
+
|
|
1188
|
+
```markdown
|
|
1189
|
+
### Shell Script Checks
|
|
1190
|
+
|
|
1191
|
+
| Script | Syntax | Shellcheck | Functions | Smoke Test |
|
|
1192
|
+
|--------|--------|------------|-----------|------------|
|
|
1193
|
+
| `quality-checks.sh` | ✅ OK | ⚠️ 2 warnings | ✅ All used | ✅ OK |
|
|
1194
|
+
```
|
|
1195
|
+
|
|
1196
|
+
### 3d. Lint Check (REQUIRED before PR)
|
|
1197
|
+
|
|
1198
|
+
**Purpose:** Catch ESLint errors locally before they fail CI. This prevents wasted quality loop iterations from lint failures.
|
|
1199
|
+
|
|
1200
|
+
**When to run:** Before every PR creation. Run after `npm run build` succeeds, before `npm test`.
|
|
1201
|
+
|
|
1202
|
+
**Execution:**
|
|
1203
|
+
|
|
1204
|
+
```bash
|
|
1205
|
+
# Run lint check
|
|
1206
|
+
npm run lint
|
|
1207
|
+
|
|
1208
|
+
# If lint script doesn't exist, gracefully skip
|
|
1209
|
+
if ! npm run lint 2>/dev/null; then
|
|
1210
|
+
if npm run --list 2>/dev/null | grep -q "lint"; then
|
|
1211
|
+
echo "❌ Lint failed - fix issues before PR"
|
|
1212
|
+
# Show specific errors
|
|
1213
|
+
npm run lint 2>&1 | head -50
|
|
1214
|
+
else
|
|
1215
|
+
echo "ℹ️ No lint script found - skipping lint check"
|
|
1216
|
+
fi
|
|
1217
|
+
fi
|
|
1218
|
+
```
|
|
1219
|
+
|
|
1220
|
+
**Graceful Skip Logic (AC-4):**
|
|
1221
|
+
|
|
1222
|
+
Not all projects have a lint script. Handle this gracefully:
|
|
1223
|
+
|
|
1224
|
+
| Scenario | Behavior |
|
|
1225
|
+
|----------|----------|
|
|
1226
|
+
| `npm run lint` passes | ✅ Continue to tests |
|
|
1227
|
+
| `npm run lint` fails with errors | ❌ Fix errors before PR |
|
|
1228
|
+
| No `lint` script in package.json | ⚠️ Skip lint, log "No lint script found" |
|
|
1229
|
+
| Lint script exists but times out | ⚠️ Log warning, continue |
|
|
1230
|
+
|
|
1231
|
+
**Detection of lint script:**
|
|
1232
|
+
|
|
1233
|
+
```bash
|
|
1234
|
+
# Check if lint script exists
|
|
1235
|
+
if npm run --list 2>/dev/null | grep -qE "^\s*lint\b"; then
|
|
1236
|
+
echo "Lint script found - running npm run lint"
|
|
1237
|
+
npm run lint
|
|
1238
|
+
else
|
|
1239
|
+
echo "ℹ️ No lint script in package.json - skipping lint check"
|
|
1240
|
+
fi
|
|
1241
|
+
```
|
|
1242
|
+
|
|
1243
|
+
**If lint fails:**
|
|
1244
|
+
|
|
1245
|
+
1. **Read the error output** - identify which files/lines have issues
|
|
1246
|
+
2. **Common lint errors to fix:**
|
|
1247
|
+
- Unused imports → Remove them
|
|
1248
|
+
- Unused variables → Remove or use them
|
|
1249
|
+
- Missing semicolons → Add them (if required by config)
|
|
1250
|
+
- Formatting issues → Run auto-fix if available
|
|
1251
|
+
3. **Fix the issues** - make minimal changes
|
|
1252
|
+
4. **Re-run lint** - verify all errors are resolved
|
|
1253
|
+
5. **Then continue** - to `npm test`
|
|
1254
|
+
|
|
1255
|
+
**Auto-fix consideration:**
|
|
1256
|
+
|
|
1257
|
+
Some projects support `npm run lint -- --fix`. However, auto-fix should be used cautiously:
|
|
1258
|
+
- ✅ Safe: formatting fixes, import ordering
|
|
1259
|
+
- ⚠️ Caution: removing unused code (verify it's truly unused)
|
|
1260
|
+
- ❌ Avoid: auto-fixing semantic errors without review
|
|
1261
|
+
|
|
1262
|
+
**Include in progress summary:**
|
|
1263
|
+
|
|
1264
|
+
```markdown
|
|
1265
|
+
### Lint Results
|
|
1266
|
+
|
|
1267
|
+
| Check | Status | Notes |
|
|
1268
|
+
|-------|--------|-------|
|
|
1269
|
+
| ESLint | ✅ Passed | 0 errors, 0 warnings |
|
|
1270
|
+
```
|
|
1271
|
+
|
|
1272
|
+
Or if issues were found and fixed:
|
|
1273
|
+
|
|
1274
|
+
```markdown
|
|
1275
|
+
### Lint Results
|
|
1276
|
+
|
|
1277
|
+
| Check | Status | Notes |
|
|
1278
|
+
|-------|--------|-------|
|
|
1279
|
+
| ESLint | ✅ Passed (after fixes) | Fixed 2 unused imports in `src/lib/scope/index.ts` |
|
|
1280
|
+
```
|
|
1281
|
+
|
|
1282
|
+
### 3e. Testing Non-Exported Functions (REQUIRED)
|
|
1283
|
+
|
|
1284
|
+
**Purpose:** Provide guidance when a function needs tests but is not exported, preventing tautological tests that provide zero regression protection.
|
|
1285
|
+
|
|
1286
|
+
**Decision Tree:**
|
|
1287
|
+
|
|
1288
|
+
```
|
|
1289
|
+
Function needs tests but is not exported?
|
|
1290
|
+
│
|
|
1291
|
+
├─ Can it be exported with @internal tag?
|
|
1292
|
+
│ └─ YES → Export it, test directly
|
|
1293
|
+
│
|
|
1294
|
+
├─ Can a dependency be injected for mocking?
|
|
1295
|
+
│ └─ YES → Add optional param, test with mock
|
|
1296
|
+
│
|
|
1297
|
+
├─ Can the behavior be tested via a public caller?
|
|
1298
|
+
│ └─ YES → Write integration test through the public API
|
|
1299
|
+
│
|
|
1300
|
+
└─ None of the above?
|
|
1301
|
+
└─ Document why tests are limited, do NOT write tautological tests
|
|
1302
|
+
```
|
|
1303
|
+
|
|
1304
|
+
**⚠️ ANTI-PATTERN WARNING:**
|
|
1305
|
+
|
|
1306
|
+
> **NEVER write tests that only assert on local variables.** If a test block does not call any imported function, it is tautological and provides no regression protection.
|
|
1307
|
+
>
|
|
1308
|
+
> **Bad example (from #267):**
|
|
1309
|
+
> ```typescript
|
|
1310
|
+
> // ❌ TAUTOLOGICAL - tests nothing real
|
|
1311
|
+
> it("should retry on failure", () => {
|
|
1312
|
+
> const mcpEnabled = true;
|
|
1313
|
+
> const phaseFailed = true;
|
|
1314
|
+
> expect(mcpEnabled && phaseFailed).toBe(true); // Always passes!
|
|
1315
|
+
> });
|
|
1316
|
+
> ```
|
|
1317
|
+
>
|
|
1318
|
+
> If you cannot test a function directly, escalate to integration testing or export with `@internal` — **do not fake the test**.
|
|
1319
|
+
|
|
1320
|
+
**Pattern 1: Export with @internal**
|
|
1321
|
+
|
|
1322
|
+
When the function can be safely exported without breaking encapsulation:
|
|
1323
|
+
|
|
1324
|
+
```typescript
|
|
1325
|
+
// src/lib/retry.ts
|
|
1326
|
+
|
|
1327
|
+
/** @internal Exported for testing only - do not use directly */
|
|
1328
|
+
export function executePhaseWithRetry(
|
|
1329
|
+
phase: Phase,
|
|
1330
|
+
maxRetries: number,
|
|
1331
|
+
): Promise<Result> {
|
|
1332
|
+
// Implementation
|
|
1333
|
+
}
|
|
1334
|
+
|
|
1335
|
+
// src/lib/retry.test.ts
|
|
1336
|
+
import { executePhaseWithRetry } from './retry';
|
|
1337
|
+
|
|
1338
|
+
it("retries up to maxRetries on failure", async () => {
|
|
1339
|
+
const result = await executePhaseWithRetry(mockPhase, 3);
|
|
1340
|
+
expect(result.attempts).toBe(3);
|
|
1341
|
+
});
|
|
1342
|
+
```
|
|
1343
|
+
|
|
1344
|
+
**Pattern 2: Dependency Injection (often combined with Pattern 1)**
|
|
1345
|
+
|
|
1346
|
+
When the function has internal dependencies that need mocking, DI requires the
|
|
1347
|
+
function to be exported so tests can pass in mock dependencies. Combine with
|
|
1348
|
+
`@internal` from Pattern 1 to signal it's not part of the public API:
|
|
1349
|
+
|
|
1350
|
+
```typescript
|
|
1351
|
+
// src/lib/retry.ts
|
|
1352
|
+
|
|
1353
|
+
/** @internal Exported for testing - DI allows mocking internal dependencies */
|
|
1354
|
+
export function retry<T>(
|
|
1355
|
+
fn: () => Promise<T>,
|
|
1356
|
+
maxRetries: number,
|
|
1357
|
+
// Injectable for tests - defaults to real implementation
|
|
1358
|
+
delayFn: (ms: number) => Promise<void> = delay,
|
|
1359
|
+
): Promise<T> {
|
|
1360
|
+
// Implementation uses delayFn instead of hardcoded delay
|
|
1361
|
+
}
|
|
1362
|
+
|
|
1363
|
+
// src/lib/retry.test.ts
|
|
1364
|
+
import { retry } from './retry';
|
|
1365
|
+
|
|
1366
|
+
it("waits between retries", async () => {
|
|
1367
|
+
const mockDelay = vi.fn().mockResolvedValue(undefined);
|
|
1368
|
+
|
|
1369
|
+
await retry(failingFn, 3, mockDelay);
|
|
1370
|
+
|
|
1371
|
+
expect(mockDelay).toHaveBeenCalledTimes(2); // Called between retries
|
|
1372
|
+
});
|
|
1373
|
+
```
|
|
1374
|
+
|
|
1375
|
+
**Pattern 3: Integration Test via Public API**
|
|
1376
|
+
|
|
1377
|
+
When the private function is called by a public entry point:
|
|
1378
|
+
|
|
1379
|
+
```typescript
|
|
1380
|
+
// src/commands/run.ts (public)
|
|
1381
|
+
export async function runCommand(options: RunOptions): Promise<Result> {
|
|
1382
|
+
// Internally calls executePhaseWithRetry (private)
|
|
1383
|
+
}
|
|
1384
|
+
|
|
1385
|
+
// src/commands/run.test.ts
|
|
1386
|
+
import { runCommand } from './run';
|
|
1387
|
+
|
|
1388
|
+
it("retries on cold-start MCP failure", async () => {
|
|
1389
|
+
// Mock the MCP to fail once then succeed
|
|
1390
|
+
mockMcp.onFirstCall().throws(new Error("Cold start"));
|
|
1391
|
+
mockMcp.onSecondCall().resolves(successResult);
|
|
1392
|
+
|
|
1393
|
+
// Test via public API - exercises the private retry logic
|
|
1394
|
+
const result = await runCommand({ useMcp: true });
|
|
1395
|
+
|
|
1396
|
+
expect(result.exitCode).toBe(0);
|
|
1397
|
+
expect(mockMcp.callCount).toBe(2); // Proves retry happened
|
|
1398
|
+
});
|
|
1399
|
+
```
|
|
1400
|
+
|
|
1401
|
+
**Pattern 4: Document Limitation (Last Resort)**
|
|
1402
|
+
|
|
1403
|
+
When none of the above approaches work, document the limitation clearly:
|
|
1404
|
+
|
|
1405
|
+
```typescript
|
|
1406
|
+
// src/lib/internal.ts
|
|
1407
|
+
|
|
1408
|
+
/**
|
|
1409
|
+
* @remarks
|
|
1410
|
+
* This function cannot be directly tested because:
|
|
1411
|
+
* - It relies on process-level state that cannot be mocked
|
|
1412
|
+
* - Exporting would break the module's encapsulation contract
|
|
1413
|
+
* - No public API exercises this code path in isolation
|
|
1414
|
+
*
|
|
1415
|
+
* Coverage is provided indirectly through E2E tests in:
|
|
1416
|
+
* - e2e/full-workflow.test.ts (lines 45-67)
|
|
1417
|
+
*
|
|
1418
|
+
* TODO: Refactor to enable direct testing (see #XXX)
|
|
1419
|
+
*/
|
|
1420
|
+
function internalHelper(): void {
|
|
1421
|
+
// Implementation
|
|
1422
|
+
}
|
|
1423
|
+
```
|
|
1424
|
+
|
|
1425
|
+
**When documenting limitations, you MUST:**
|
|
1426
|
+
1. Explain WHY direct testing is not possible
|
|
1427
|
+
2. Reference any indirect coverage (E2E, integration tests)
|
|
1428
|
+
3. Create a follow-up issue if refactoring would enable testability
|
|
1429
|
+
4. **Never** write a tautological test to inflate coverage numbers
|
|
1430
|
+
|
|
471
1431
|
### 4. Implementation Loop
|
|
472
1432
|
|
|
473
1433
|
- Implement in **small, incremental diffs**.
|
|
474
1434
|
- Prefer touching the minimal number of files required.
|
|
475
1435
|
- Align with repository conventions described in CLAUDE.md (naming, patterns, etc.).
|
|
476
1436
|
- After each meaningful change:
|
|
477
|
-
1. Run `npm
|
|
478
|
-
2.
|
|
1437
|
+
1. Run `npm run build` (if TypeScript changes)
|
|
1438
|
+
2. Run `npm run lint` (catches unused imports early)
|
|
1439
|
+
3. Run `npm test`
|
|
1440
|
+
4. If checks fail:
|
|
479
1441
|
- Inspect the failure output.
|
|
480
1442
|
- Identify the root cause.
|
|
481
1443
|
- Apply small, targeted fixes.
|
|
@@ -547,7 +1509,9 @@ Fall back to sequential execution (standard implementation loop).
|
|
|
547
1509
|
- Run Prettier on all modified files after each group (agents skip auto-format)
|
|
548
1510
|
- On any agent failure: stop remaining agents, log error, continue with sequential
|
|
549
1511
|
- File locking prevents concurrent edits to the same file
|
|
550
|
-
- **
|
|
1512
|
+
- **REQUIRED:** When spawning agents, you MUST use prompt templates from Section 4c for typed tasks (component, CLI, test, refactor). Generic prompts are only acceptable for truly untyped tasks.
|
|
1513
|
+
|
|
1514
|
+
⚠️ **Warning:** Skipping templates for typed tasks will result in QA rejection.
|
|
551
1515
|
|
|
552
1516
|
**Error Handling with Automatic Retry:**
|
|
553
1517
|
|
|
@@ -746,7 +1710,49 @@ When in doubt, choose:
|
|
|
746
1710
|
|
|
747
1711
|
The goal is to satisfy AC with the smallest, safest change possible.
|
|
748
1712
|
|
|
749
|
-
### 5.
|
|
1713
|
+
### 5. Adversarial Self-Evaluation (REQUIRED)
|
|
1714
|
+
|
|
1715
|
+
**Before outputting your final summary**, you MUST complete this adversarial self-evaluation to catch issues that automated checks miss.
|
|
1716
|
+
|
|
1717
|
+
**Why this matters:** Sessions show that honest self-questioning consistently catches real issues:
|
|
1718
|
+
- Tests that pass but don't cover the actual changes
|
|
1719
|
+
- Features that build but don't work as expected
|
|
1720
|
+
- AC items marked "done" but with weak implementation
|
|
1721
|
+
|
|
1722
|
+
**Answer these questions honestly:**
|
|
1723
|
+
1. "Did anything not work as expected during implementation?"
|
|
1724
|
+
2. "If this feature broke tomorrow, would the current tests catch it?"
|
|
1725
|
+
3. "What's the weakest part of this implementation?"
|
|
1726
|
+
4. "Am I reporting success metrics without honest self-evaluation?"
|
|
1727
|
+
|
|
1728
|
+
**Include this section in your output:**
|
|
1729
|
+
|
|
1730
|
+
```markdown
|
|
1731
|
+
### Self-Evaluation
|
|
1732
|
+
|
|
1733
|
+
- **Worked as expected:** [Yes/No - if No, explain what didn't work]
|
|
1734
|
+
- **Test coverage confidence:** [High/Medium/Low - explain why]
|
|
1735
|
+
- **Weakest part:** [Identify the weakest aspect of the implementation]
|
|
1736
|
+
- **Honest assessment:** [Any concerns or caveats?]
|
|
1737
|
+
```
|
|
1738
|
+
|
|
1739
|
+
**If any answer reveals concerns:**
|
|
1740
|
+
- Address the issues before proceeding
|
|
1741
|
+
- Re-run relevant checks (`npm test`, `npm run build`)
|
|
1742
|
+
- Update the self-evaluation after fixes
|
|
1743
|
+
|
|
1744
|
+
**Do NOT skip this self-evaluation.** Honest reflection catches issues that automated checks miss.
|
|
1745
|
+
|
|
1746
|
+
---
|
|
1747
|
+
|
|
1748
|
+
### 6. Progress Summary and Draft Issue Update
|
|
1749
|
+
|
|
1750
|
+
**If orchestrated (SEQUANT_ORCHESTRATOR is set):**
|
|
1751
|
+
- Skip posting progress comments to GitHub (orchestrator handles summary)
|
|
1752
|
+
- Still provide AC coverage summary in output for orchestrator to capture
|
|
1753
|
+
- Let orchestrator handle final GitHub update
|
|
1754
|
+
|
|
1755
|
+
**If standalone:**
|
|
750
1756
|
|
|
751
1757
|
At the end of a session:
|
|
752
1758
|
|
|
@@ -761,9 +1767,26 @@ At the end of a session:
|
|
|
761
1767
|
- Include:
|
|
762
1768
|
- AC coverage summary
|
|
763
1769
|
- Brief list of key files changed
|
|
1770
|
+
- **Quality Plan Alignment** (REQUIRED if quality plan exists in issue comments)
|
|
764
1771
|
- **PR Status** (Created with URL, or Failed with reason and manual instructions)
|
|
765
1772
|
- Any known gaps or open questions
|
|
766
1773
|
|
|
1774
|
+
**Quality Plan Alignment (REQUIRED when quality plan exists):**
|
|
1775
|
+
|
|
1776
|
+
If the issue has a Feature Quality Planning section from `/spec`, you MUST include this section. If no quality plan exists, output: "Quality Plan Alignment: N/A - No quality plan in issue"
|
|
1777
|
+
```markdown
|
|
1778
|
+
### Quality Plan Alignment
|
|
1779
|
+
|
|
1780
|
+
| Quality Dimension | Items Addressed | Notes |
|
|
1781
|
+
|-------------------|-----------------|-------|
|
|
1782
|
+
| Error Handling | 2/3 | Missing: API timeout handling |
|
|
1783
|
+
| Test Coverage | 3/3 | All critical paths covered |
|
|
1784
|
+
| Code Quality | 2/2 | Types defined, patterns followed |
|
|
1785
|
+
| Best Practices | 1/1 | Logging added |
|
|
1786
|
+
|
|
1787
|
+
**Derived ACs:** 2/2 addressed
|
|
1788
|
+
```
|
|
1789
|
+
|
|
767
1790
|
- Label it clearly as:
|
|
768
1791
|
|
|
769
1792
|
```md
|
|
@@ -792,13 +1815,47 @@ You may be invoked multiple times for the same issue. Each time, re-establish co
|
|
|
792
1815
|
|
|
793
1816
|
---
|
|
794
1817
|
|
|
1818
|
+
## State Tracking
|
|
1819
|
+
|
|
1820
|
+
**IMPORTANT:** Update workflow state when running standalone (not orchestrated).
|
|
1821
|
+
|
|
1822
|
+
### Check Orchestration Mode
|
|
1823
|
+
|
|
1824
|
+
The orchestration check happens automatically when you run the state update script - it exits silently if `SEQUANT_ORCHESTRATOR` is set.
|
|
1825
|
+
|
|
1826
|
+
### State Updates (Standalone Only)
|
|
1827
|
+
|
|
1828
|
+
When NOT orchestrated (`SEQUANT_ORCHESTRATOR` is not set):
|
|
1829
|
+
|
|
1830
|
+
**At skill start:**
|
|
1831
|
+
```bash
|
|
1832
|
+
npx tsx scripts/state/update.ts start <issue-number> exec
|
|
1833
|
+
```
|
|
1834
|
+
|
|
1835
|
+
**On successful completion:**
|
|
1836
|
+
```bash
|
|
1837
|
+
npx tsx scripts/state/update.ts complete <issue-number> exec
|
|
1838
|
+
```
|
|
1839
|
+
|
|
1840
|
+
**On failure:**
|
|
1841
|
+
```bash
|
|
1842
|
+
npx tsx scripts/state/update.ts fail <issue-number> exec "Error description"
|
|
1843
|
+
```
|
|
1844
|
+
|
|
1845
|
+
**Why this matters:** State tracking enables dashboard visibility, resume capability, and workflow orchestration. Skills update state when standalone; orchestrators handle state when running workflows.
|
|
1846
|
+
|
|
1847
|
+
---
|
|
1848
|
+
|
|
795
1849
|
## Output Verification
|
|
796
1850
|
|
|
797
1851
|
**Before responding, verify your output includes ALL of these:**
|
|
798
1852
|
|
|
1853
|
+
- [ ] **Self-Evaluation Completed** - Adversarial self-evaluation section included in output
|
|
799
1854
|
- [ ] **AC Progress Summary** - Which AC items are satisfied, partially met, or blocked
|
|
800
1855
|
- [ ] **Files Changed** - List of key files modified
|
|
801
|
-
- [ ] **Test/Build Results** - Output from `npm
|
|
1856
|
+
- [ ] **Test/Build/Lint Results** - Output from `npm run build`, `npm run lint`, and `npm test`
|
|
1857
|
+
- [ ] **CLI Wiring Check** - If option interfaces modified, verified CLI flags are registered (Section 3g)
|
|
1858
|
+
- [ ] **Quality Plan Alignment** - Included if quality plan was available (or marked N/A if no quality plan)
|
|
802
1859
|
- [ ] **PR Status** - Created (with URL) or Failed (with error and manual instructions)
|
|
803
1860
|
- [ ] **Progress Update Draft** - Formatted comment for GitHub issue
|
|
804
1861
|
- [ ] **Documentation Reminder** - Note if README/docs need updating (checked in /qa)
|