projecta-rrr 1.16.3 → 1.16.5

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/CHANGELOG.md CHANGED
@@ -4,6 +4,25 @@ All notable changes to RRR will be documented in this file.
4
4
 
5
5
  Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
6
 
7
+ ## [1.16.5] - 2026-01-27
8
+
9
+ ### Fixed
10
+ - **Verify-Work UAT Workflow Path** - Fixed workflow file loading for UAT mode:
11
+ - Changed from relative path (`rrr/workflows/verify-work.md`) to `@` reference (`@rrr/workflows/verify-work.md`)
12
+ - Workflow now loads correctly from RRR framework (`~/.claude/rrr/workflows/verify-work.md`)
13
+ - **Milestone-Level UAT Support** - Added comprehensive milestone support:
14
+ - Detects milestone targets (`v1.2`, `v2.0`) and finds all phases in that milestone
15
+ - Creates UAT file at `.planning/milestones/{milestone}/phases/{milestone}-UAT.md`
16
+ - Updates frontmatter with `target_type` (phase/milestone) and `target`
17
+ - Fixed commit message generation for milestone-level UAT
18
+ - **PHASE_ARG Variable Propagation** - Added export of `PHASE_ARG` for workflow consumption
19
+ - **SUMMARY Path Detection** - Fixed test type detection to search both old and new directory structures
20
+ - **UAT File Discovery** - Updated active session detection to search `.planning/` recursively for both phase and milestone UAT files
21
+
22
+ ## [1.16.4] - 2026-01-27
23
+ - `playwright` → run_playwright_batch
24
+ - `manual` → present_test
25
+
7
26
  ## [1.16.3] - 2026-01-27
8
27
 
9
28
  ### Changed
@@ -86,6 +86,14 @@ Validate built features through **audit mode by default**, or interactive UAT wi
86
86
  hasAuditFlag = $ARGUMENTS contains "--audit"
87
87
  hasUatFlag = $ARGUMENTS contains "--uat"
88
88
  target = $ARGUMENTS with flags removed (e.g., "05", "v1.9", or empty)
89
+
90
+ # Set PHASE_ARG for workflow consumption (UAT mode needs this)
91
+ if [ -n "$target" ]; then
92
+ PHASE_ARG="$target"
93
+ else
94
+ PHASE_ARG=""
95
+ fi
96
+ export PHASE_ARG
89
97
  ```
90
98
 
91
99
  **Step 2: Route and explain selection**
@@ -98,6 +106,7 @@ target = $ARGUMENTS with flags removed (e.g., "05", "v1.9", or empty)
98
106
  **If --uat is present:**
99
107
  1. Execute the `<uat_mode>` section below
100
108
  2. This loads the workflow file which runs component tests then UAT
109
+ 3. The workflow uses `$PHASE_ARG` to find summaries
101
110
 
102
111
  **If --audit is present OR no flags:**
103
112
  1. Execute the `<audit_mode>` section below (DEFAULT)
@@ -331,9 +340,9 @@ Purpose: Component tests → Zeroshot/Manual user acceptance testing
331
340
  For quick evidence check, use: /rrr:verify-work --audit
332
341
  ```
333
342
 
334
- **Load the workflow to run UAT:**
343
+ **Load the UAT workflow:**
335
344
 
336
- Read the file at: `rrr/workflows/verify-work.md`
345
+ @rrr/workflows/verify-work.md
337
346
 
338
347
  The workflow contains the full UAT process including:
339
348
  1. **Component tests** — Runs vitest --browser if configured
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "projecta-rrr",
3
- "version": "1.16.3",
3
+ "version": "1.16.5",
4
4
  "description": "A meta-prompting, context engineering and spec-driven development system for Claude Code by Projecta.ai",
5
5
  "bin": {
6
6
  "projecta-rrr": "bin/install.js"
@@ -179,31 +179,123 @@ Check if zeroshot validation is available:
179
179
 
180
180
  **If ZEROSHOT_AVAILABLE and MODULE_EXISTS:**
181
181
 
182
- Check for Playwright MCP availability:
182
+ Check for Playwright MCP availability (multiple detection methods):
183
+
184
+ ```bash
185
+ # Enhanced Playwright MCP detection - checks multiple locations
186
+ PLAYWRIGHT_STATUS="NO_PLAYWRIGHT_MCP"
187
+
188
+ # Method 1: Check ~/.claude/mcp.json
189
+ if [ -f "$HOME/.claude/mcp.json" ]; then
190
+ if grep -qi "playwright" "$HOME/.claude/mcp.json" 2>/dev/null; then
191
+ PLAYWRIGHT_STATUS="PLAYWRIGHT_MCP_AVAILABLE"
192
+ fi
193
+ fi
194
+
195
+ # Method 2: Check ~/.claude/settings.json (alternate location)
196
+ if [ "$PLAYWRIGHT_STATUS" = "NO_PLAYWRIGHT_MCP" ] && [ -f "$HOME/.claude/settings.json" ]; then
197
+ if grep -qi "playwright" "$HOME/.claude/settings.json" 2>/dev/null; then
198
+ PLAYWRIGHT_STATUS="PLAYWRIGHT_MCP_AVAILABLE"
199
+ fi
200
+ fi
201
+
202
+ # Method 3: Check if playwright-mcp command exists
203
+ if [ "$PLAYWRIGHT_STATUS" = "NO_PLAYWRIGHT_MCP" ]; then
204
+ if command -v playwright-mcp >/dev/null 2>&1; then
205
+ PLAYWRIGHT_STATUS="PLAYWRIGHT_MCP_AVAILABLE"
206
+ fi
207
+ fi
208
+
209
+ # Method 4: Check MCP servers via ps or other running processes
210
+ if [ "$PLAYWRIGHT_STATUS" = "NO_PLAYWRIGHT_MCP" ]; then
211
+ if ps aux 2>/dev/null | grep -qi "[p]laywright-mcp"; then
212
+ PLAYWRIGHT_STATUS="PLAYWRIGHT_MCP_AVAILABLE"
213
+ fi
214
+ fi
215
+
216
+ echo "$PLAYWRIGHT_STATUS"
217
+ ```
218
+
219
+ Check for MiniMax API key (enables AI visual validation):
220
+
221
+ ```bash
222
+ [ -n "$MINIMAX_API_KEY" ] && echo "MINIMAX_AVAILABLE" || echo "NO_MINIMAX"
223
+ ```
224
+
225
+ **Determine Recommended Mode:**
226
+
227
+ Based on what's available, calculate the recommended mode:
228
+
229
+ | Available | Recommended Mode | Why |
230
+ |-----------|-----------------|-----|
231
+ | Playwright MCP + MiniMax | AI QA Engineer | Best for web UI - browser control + visual validation |
232
+ | MiniMax only | Zeroshot (Screenshot) | Fast, cheap visual validation |
233
+ | Anthropic API only | Zeroshot (Screenshot) | Uses Claude vision |
234
+ | No API keys | Manual | User testing required |
235
+
236
+ **Auto-detect test type from SUMMARY.md:**
237
+
183
238
  ```bash
184
- # Check if Playwright MCP is configured
185
- [ -f "$HOME/.claude/mcp.json" ] && grep -q "playwright" "$HOME/.claude/mcp.json" && echo "PLAYWRIGHT_MCP_AVAILABLE" || echo "NO_PLAYWRIGHT_MCP"
239
+ # Check SUMMARY.md content to determine test type
240
+ # Search in both old (.planning/phases/*/) and new (.planning/milestones/*/phases/*/) structures
241
+ SUMMARY_CONTENT=$(cat .planning/phases/*/*-SUMMARY.md .planning/milestones/*/phases/*/*-SUMMARY.md 2>/dev/null | head -100)
242
+
243
+ if echo "$SUMMARY_CONTENT" | grep -qiE "(ui|page|screen|button|form|input|click|navigation|redirect|layout|visual|interface)"; then
244
+ TEST_TYPE="WEB_UI"
245
+ elif echo "$SUMMARY_CONTENT" | grep -qiE "(api|endpoint|database|backend|voice|sip|telephony|audio|websocket)"; then
246
+ TEST_TYPE="API_BACKEND"
247
+ else
248
+ TEST_TYPE="MIXED"
249
+ fi
250
+ echo "$TEST_TYPE"
251
+ ```
252
+
253
+ **Mode Selection UX:**
254
+
255
+ ```
256
+ ╔══════════════════════════════════════════════════════════════════════╗
257
+ ║ UAT Testing Mode (auto-detected: Web UI tests) ║
258
+ ╠══════════════════════════════════════════════════════════════════════╣
259
+ ║ ║
260
+ ║ Recommended: ║
261
+ ║ ──────────────────── ║
262
+ ║ ⭐ AI QA Engineer (Recommended for web UI) ║
263
+ ║ • Browser automation + visual AI validation ║
264
+ ║ • Explores edge cases, tests like a real user ║
265
+ ║ • Cost: ~$0.001/test (MiniMax vision) ║
266
+ ║ ║
267
+ ║ Alternative: ║
268
+ ║ ──────────── ║
269
+ ║ • Zeroshot (Screenshot) — Fast, fully automated ║
270
+ ║ • Manual — You test each feature and report results ║
271
+ ║ ║
272
+ ╚══════════════════════════════════════════════════════════════════════╝
186
273
  ```
187
274
 
188
275
  Use AskUserQuestion:
189
276
  - header: "Testing Mode"
190
- - question: "How would you like to run UAT?"
277
+ - question: "How would you like to run UAT? (Recommended: AI QA Engineer for web UI)"
191
278
  - options:
192
- {If PLAYWRIGHT_MCP_AVAILABLE:}
193
- - "AI QA Engineer (Recommended)" — Claude acts as a QA engineer, controlling the browser interactively. Explores like a real user, tests edge cases.
279
+ {If PLAYWRIGHT_MCP_AVAILABLE and MINIMAX_AVAILABLE:}
280
+ - "AI QA Engineer (Recommended)" — Claude acts as a QA engineer, controlling the browser interactively with visual validation. Tests edge cases automatically. Best for web UI.
194
281
  - "Zeroshot (Screenshot)" — Claude validates UI using screenshots. Faster, less thorough.
195
282
  - "Manual" — You'll test each feature and report results. More control, slower.
196
- {Else:}
283
+ {ElseIf PLAYWRIGHT_MCP_AVAILABLE and TEST_TYPE = "WEB_UI":}
284
+ - "Playwright MCP (Interactive)" — Use browser automation for testing. No visual AI validation.
285
+ - "Manual" — You'll test each feature and report results.
286
+ {ElseIf MINIMAX_AVAILABLE or ANTHROPIC_API_KEY:}
197
287
  - "Zeroshot (Automated) (Recommended)" — Claude validates UI autonomously using screenshots. Faster, no input needed per test.
198
288
  - "Manual" — You'll test each feature and report results. More control, slower.
289
+ {Else:}
290
+ - "Manual" — You'll test each feature and report results.
199
291
 
200
- Store result in `TESTING_MODE` (qa-engineer, zeroshot, or manual).
292
+ Store result in `TESTING_MODE` (qa-engineer, zeroshot, playwright, or manual).
201
293
 
202
294
  **If MANUAL_ONLY or MODULE_MISSING:**
203
295
 
204
296
  ```
205
297
  UAT will run in manual mode.
206
- (Set ANTHROPIC_API_KEY to enable automated zeroshot testing)
298
+ (Set ANTHROPIC_API_KEY to enable automated testing)
207
299
  ```
208
300
 
209
301
  Set `TESTING_MODE=manual`.
@@ -215,34 +307,35 @@ Proceed to `check_active_session`.
215
307
  **First: Check for active UAT sessions**
216
308
 
217
309
  ```bash
218
- find .planning/phases -name "*-UAT.md" -type f 2>/dev/null | head -5
310
+ # Search for UAT files in both old (.planning/phases/) and new (.planning/milestones/*/phases/) structures
311
+ UAT_FILES=$(find .planning -name "*-UAT.md" -type f 2>/dev/null | head -10)
219
312
  ```
220
313
 
221
314
  **If active sessions exist AND no $ARGUMENTS provided:**
222
315
 
223
- Read each file's frontmatter (status, phase) and Current Test section.
316
+ Read each file's frontmatter (status, target, target_type) and Current Test section.
224
317
 
225
318
  Display inline:
226
319
 
227
320
  ```
228
321
  ## Active UAT Sessions
229
322
 
230
- | # | Phase | Status | Current Test | Progress |
231
- |---|-------|--------|--------------|----------|
232
- | 1 | 04-comments | testing | 3. Reply to Comment | 2/6 |
233
- | 2 | 05-auth | testing | 1. Login Form | 0/4 |
323
+ | # | Target | Type | Status | Current Test | Progress |
324
+ |---|--------|------|--------|--------------|----------|
325
+ | 1 | 04-comments | phase | testing | 3. Reply to Comment | 2/6 |
326
+ | 2 | v1.2 | milestone | testing | 1. Login Form | 0/4 |
234
327
 
235
- Reply with a number to resume, or provide a phase number to start new.
328
+ Reply with a number to resume, or provide a target to start new.
236
329
  ```
237
330
 
238
331
  Wait for user response.
239
332
 
240
333
  - If user replies with number (1, 2) → Load that file, go to `resume_from_file`
241
- - If user replies with phase number → Treat as new session, go to `create_uat_file`
334
+ - If user replies with phase number or milestone → Treat as new session, go to `create_uat_file`
242
335
 
243
336
  **If active sessions exist AND $ARGUMENTS provided:**
244
337
 
245
- Check if session exists for that phase. If yes, offer to resume or restart.
338
+ Check if session exists for that target (phase or milestone). If yes, offer to resume or restart.
246
339
  If no, continue to `create_uat_file`.
247
340
 
248
341
  **If no active sessions AND no $ARGUMENTS:**
@@ -250,7 +343,7 @@ If no, continue to `create_uat_file`.
250
343
  ```
251
344
  No active UAT sessions.
252
345
 
253
- Provide a phase number to start testing (e.g., /rrr:verify-work 4)
346
+ Provide a phase number (e.g., 4) or milestone (e.g., v1.2) to start testing:
254
347
  ```
255
348
 
256
349
  **If no active sessions AND $ARGUMENTS provided:**
@@ -261,15 +354,32 @@ Continue to `create_uat_file`.
261
354
  <step name="find_summaries">
262
355
  **Find what to test:**
263
356
 
264
- Parse $ARGUMENTS as phase number (e.g., "4") or plan number (e.g., "04-02").
357
+ Parse $ARGUMENTS to determine scope:
265
358
 
266
- ```bash
267
- # Find phase directory
268
- # Find phase directory using phase-paths library (handles milestone-aware structure)
269
- PHASE_DIR=$(find_phase_dir "${PHASE_ARG}")
359
+ - **Phase number** (e.g., `4`, `05`, `05-auth`): Test that phase only
360
+ - **Milestone** (e.g., `v1.9`, `v2.0`): Test all phases in that milestone
361
+ - **Empty**: Use current milestone from ROADMAP.md
270
362
 
271
- # Find SUMMARY files
272
- ls "$PHASE_DIR"/*-SUMMARY.md 2>/dev/null
363
+ ```bash
364
+ # Determine if target is a milestone (starts with 'v' followed by digits)
365
+ if [[ "$PHASE_ARG" =~ ^v[0-9]+\.[0-9]+$ ]]; then
366
+ # Milestone target - find all SUMMARY files in that milestone's phases
367
+ MILESTONE="$PHASE_ARG"
368
+ MILESTONE_DIR=".planning/milestones/${MILESTONE}/phases"
369
+ if [ -d "$MILESTONE_DIR" ]; then
370
+ find "$MILESTONE_DIR" -maxdepth 2 -name "*-SUMMARY.md" 2>/dev/null | sort
371
+ else
372
+ echo "ERROR: Milestone directory not found: $MILESTONE_DIR" >&2
373
+ fi
374
+ else
375
+ # Phase target - use find_phase_dir
376
+ PHASE_DIR=$(find_phase_dir "${PHASE_ARG}")
377
+ if [ -n "$PHASE_DIR" ]; then
378
+ ls "$PHASE_DIR"/*-SUMMARY.md 2>/dev/null
379
+ else
380
+ echo "ERROR: Phase directory not found for: $PHASE_ARG" >&2
381
+ fi
382
+ fi
273
383
  ```
274
384
 
275
385
  Read each SUMMARY.md to extract testable deliverables.
@@ -300,7 +410,21 @@ Skip internal/non-observable items (refactors, type changes, etc.).
300
410
  **Create UAT file with all tests:**
301
411
 
302
412
  ```bash
303
- mkdir -p "$PHASE_DIR"
413
+ # Determine if milestone target and set up output location
414
+ if [[ "$PHASE_ARG" =~ ^v[0-9]+\.[0-9]+$ ]]; then
415
+ # Milestone-level UAT - create in milestone's phases directory
416
+ MILESTONE="$PHASE_ARG"
417
+ MILESTONE_DIR=".planning/milestones/${MILESTONE}/phases"
418
+ mkdir -p "$MILESTONE_DIR"
419
+ UAT_FILE="$MILESTONE_DIR/${MILESTONE}-UAT.md"
420
+ TARGET_TYPE="milestone"
421
+ else
422
+ # Phase-level UAT - use existing phase directory
423
+ mkdir -p "$PHASE_DIR"
424
+ PHASE_NAME=$(basename "$PHASE_DIR")
425
+ UAT_FILE="$PHASE_DIR/${PHASE_NAME}-UAT.md"
426
+ TARGET_TYPE="phase"
427
+ fi
304
428
  ```
305
429
 
306
430
  Build test list from extracted deliverables.
@@ -310,7 +434,8 @@ Create file:
310
434
  ```markdown
311
435
  ---
312
436
  status: testing
313
- phase: XX-name
437
+ target_type: {TARGET_TYPE}
438
+ target: {PHASE_ARG}
314
439
  source: [list of SUMMARY.md files]
315
440
  started: [ISO timestamp]
316
441
  updated: [ISO timestamp]
@@ -350,10 +475,12 @@ skipped: 0
350
475
  [none yet]
351
476
  ```
352
477
 
353
- Write to `{phase_dir}/{phase}-UAT.md` (where phase_dir is from get_phase_dir)
478
+ Write to `$UAT_FILE`
354
479
 
355
480
  **Route based on testing mode:**
481
+ - If `TESTING_MODE=qa-engineer` → Go to `run_qa_engineer_batch`
356
482
  - If `TESTING_MODE=zeroshot` → Go to `run_zeroshot_batch`
483
+ - If `TESTING_MODE=playwright` → Go to `run_playwright_batch`
357
484
  - If `TESTING_MODE=manual` → Go to `present_test`
358
485
  </step>
359
486
 
@@ -444,6 +571,128 @@ Falling back to manual mode for remaining tests.
444
571
  Set `TESTING_MODE=manual` and continue from current test.
445
572
  </step>
446
573
 
574
+ <step name="run_qa_engineer_batch">
575
+ **Run AI QA Engineer mode for all tests:**
576
+
577
+ This mode combines Playwright MCP (browser control) with MiniMax (visual AI) for comprehensive exploratory testing.
578
+
579
+ ```
580
+ ╔══════════════════════════════════════════════════════════════╗
581
+ ║ AI QA ENGINEER: Autonomous Testing ║
582
+ ╚══════════════════════════════════════════════════════════════╝
583
+
584
+ Running {N} tests with browser automation + AI visual validation...
585
+ ```
586
+
587
+ **For each test in the UAT file:**
588
+
589
+ 1. Extract test name and expected behavior
590
+ 2. Determine the URL to test
591
+ 3. Run QA Engineer validation:
592
+ ```javascript
593
+ const { zeroshotValidate } = require('~/.claude/rrr/lib/uat/zeroshot-validator.js');
594
+
595
+ const result = await zeroshotValidate({
596
+ url: testUrl,
597
+ task: `Verify: ${expectedBehavior}`,
598
+ mode: 'qa-engineer', // QA engineer persona
599
+ interactive: true, // Use Playwright MCP for browser control
600
+ timeout: 60000 // Longer timeout for exploratory testing
601
+ });
602
+ ```
603
+
604
+ 4. Process result:
605
+ - If `result.passed === true`:
606
+ - Update test result to "pass"
607
+ - Log: `✓ Test {N}: {name}`
608
+ - If `result.passed === false`:
609
+ - Update test result to "issue"
610
+ - Capture observations and reasoning
611
+ - Add to Gaps section
612
+ - Log: `✗ Test {N}: {name} - {brief reason}`
613
+
614
+ 5. Update UAT.md after each test (checkpoint)
615
+
616
+ 6. Display progress:
617
+ ```
618
+ Progress: [████████░░] 8/10 tests complete
619
+ ✓ Test 1: Login page loads with form fields
620
+ ✓ Test 2: Form validation on submit
621
+ ✗ Test 3: Password reset email not sent (edge case found)
622
+ ...
623
+ ```
624
+
625
+ **QA Engineer specific behaviors:**
626
+ - Tests edge cases automatically (empty fields, long inputs, special chars)
627
+ - Explores navigation paths beyond the happy path
628
+ - Screenshots any issues found
629
+ - Validates visual correctness with MiniMax vision
630
+
631
+ **After all tests complete:**
632
+
633
+ Update frontmatter status to "complete".
634
+
635
+ **Display summary:**
636
+
637
+ ```
638
+ ╔══════════════════════════════════════════════════════════════╗
639
+ ║ AI QA ENGINEER: Complete ║
640
+ ╚══════════════════════════════════════════════════════════════╝
641
+
642
+ Results:
643
+ ✓ Passed: {N}
644
+ ✗ Issues: {N}
645
+ ⏭ Skipped: {N}
646
+
647
+ Exploratory Testing Notes:
648
+ - {N} edge cases tested automatically
649
+ - {N} navigation paths explored
650
+
651
+ {If issues > 0:}
652
+ Issues Found:
653
+ 1. Test 3: Password reset - Edge case: special chars in email cause error
654
+ 2. Test 7: Form submission - Visual: error message clipped on mobile
655
+ ```
656
+
657
+ Go to `complete_session`.
658
+
659
+ **On error (Playwright MCP not available, timeout):**
660
+
661
+ ```
662
+ ⚠ QA Engineer mode error: {error}
663
+ Falling back to Zeroshot mode...
664
+ ```
665
+
666
+ Set `TESTING_MODE=zeroshot` and continue to `run_zeroshot_batch`.
667
+ </step>
668
+
669
+ <step name="run_playwright_batch">
670
+ **Run Playwright-only mode (no visual AI):**
671
+
672
+ Use Playwright MCP for browser automation without visual AI validation.
673
+
674
+ ```
675
+ ╔══════════════════════════════════════════════════════════════╗
676
+ ║ PLAYWRIGHT UAT: Browser Automation ║
677
+ ╚══════════════════════════════════════════════════════════════╝
678
+
679
+ Running {N} tests with Playwright browser automation...
680
+ ```
681
+
682
+ **For each test:**
683
+
684
+ 1. Navigate to URL using Playwright MCP
685
+ 2. Perform interactions described in test
686
+ 3. Take screenshot at key points
687
+ 4. Report findings (manual AI analysis not used)
688
+
689
+ **After all tests:**
690
+
691
+ Display summary and prompt for manual verification of screenshots.
692
+
693
+ Go to `complete_session`.
694
+ </step>
695
+
447
696
  <step name="present_test">
448
697
  **Present current test to user (Manual Mode):**
449
698
 
@@ -567,13 +816,19 @@ Clear Current Test section:
567
816
 
568
817
  Commit the UAT file:
569
818
  ```bash
570
- git add "{phase_dir}/{phase}-UAT.md"
571
- git commit -m "test({phase}): complete UAT - {passed} passed, {issues} issues"
819
+ # Use target from frontmatter (phase or milestone)
820
+ if [ "$TARGET_TYPE" = "milestone" ]; then
821
+ git add "$UAT_FILE"
822
+ git commit -m "test(${TARGET}): complete UAT - ${passed} passed, ${issues} issues"
823
+ else
824
+ git add "$UAT_FILE"
825
+ git commit -m "test(${TARGET}): complete UAT - ${passed} passed, ${issues} issues"
826
+ fi
572
827
  ```
573
828
 
574
829
  Present summary:
575
830
  ```
576
- ## UAT Complete: Phase {phase}
831
+ ## UAT Complete: {TARGET_TYPE} {TARGET}
577
832
 
578
833
  | Result | Count |
579
834
  |--------|-------|