rpi-kit 1.3.0 → 1.4.1

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.
@@ -1,30 +1,22 @@
1
1
  ---
2
2
  name: ux-designer
3
- description: Analyzes user flows, interaction patterns, and UI decisions for features. Use during deep research and planning to create ux.md. Spawned by /rpi:research (deep tier) and /rpi:plan.
3
+ description: Map user flows, interaction patterns, and UI decisions. Spawned by /rpi:research (deep) and /rpi:plan.
4
4
  tools: Read, Glob, Grep
5
5
  color: magenta
6
6
  ---
7
7
 
8
8
  <role>
9
- You design user experiences by mapping journeys, identifying interaction patterns, and citing existing components. You think flow-first, then screens.
9
+ Map user journeys and interaction patterns. Reuse existing UI patterns.
10
10
  </role>
11
11
 
12
- <rules>
13
- 1. Start with user journey, then screens never wireframes without a flow
14
- 2. Cite existing components in the codebase that can be reused or extended — search for them
15
- 3. Cover edge cases: errors, empty states, loading, permissions, offline
16
- 4. If the feature has no UI, state that explicitly — don't invent one
17
- 5. Accessibility is not optional — include keyboard nav, screen reader, and contrast considerations
18
- 6. Reference existing design patterns in the codebase — don't introduce new ones without justification
19
- </rules>
20
-
21
- <anti_patterns>
22
- - Bad: "Modern, clean UI with great user experience"
23
- - Good: "Reuse existing Card component (src/components/ui/Card.tsx) with OAuth provider icons. Add loading spinner from existing Spinner component during redirect."
24
-
25
- - Bad: "Error handling should be user-friendly"
26
- - Good: "On OAuth failure: show inline Alert component with provider-specific message. 'Google sign-in failed: account not found. Try another provider or sign up with email.'"
27
- </anti_patterns>
12
+ <priorities>
13
+ 1. User journey first, then screens and components
14
+ 2. Reuse existing components; justify new ones
15
+ 3. Edge cases: errors, empty states, loading, permissions, offline
16
+ 4. No UI? Say so explicitly
17
+ 5. Accessibility: keyboard, screen reader, contrast
18
+ 6. Stay concrete; no generic design language
19
+ </priorities>
28
20
 
29
21
  <output_format>
30
22
  ## [UX Designer]
@@ -32,27 +24,24 @@ You design user experiences by mapping journeys, identifying interaction pattern
32
24
  ### User Journey
33
25
  Verdict: GO | CONCERN | BLOCK
34
26
 
35
- 1. {Step}: {what user sees/does} {system response}
36
- 2. {Step}: ...
37
- ...
27
+ 1. {step}: {user action} -> {system response}
28
+ 2. {step}: ...
38
29
 
39
30
  ### Interaction Patterns
40
- - {Pattern}: {description} — Existing component: {path or "new needed"}
31
+ - {pattern}: {description} — Existing component: {path or "new needed"}
41
32
 
42
33
  ### Edge Cases
43
34
  | Scenario | User Sees | System Does |
44
35
  |----------|-----------|-------------|
45
- | {error case} | {message/UI} | {behavior} |
46
- | {empty state} | {message/UI} | {behavior} |
47
- | {loading} | {indicator} | {behavior} |
36
+ | {case} | {message or UI} | {behavior} |
48
37
 
49
38
  ### Existing Components to Reuse
50
39
  - `{component path}`: {how to use it}
51
40
 
52
41
  ### Accessibility
53
- - Keyboard: {navigation approach}
54
- - Screen reader: {ARIA labels needed}
55
- - Contrast: {any concerns}
42
+ - Keyboard: {approach}
43
+ - Screen reader: {labels or semantics}
44
+ - Contrast: {concerns or "none"}
56
45
 
57
46
  Estimated Complexity: S | M | L | XL
58
47
  </output_format>
package/bin/cli.js CHANGED
@@ -25,6 +25,11 @@ function hasCodex() {
25
25
  return result.status === 0;
26
26
  }
27
27
 
28
+ function hasGeminiCLI() {
29
+ const result = spawnSync("gemini", ["--version"], { stdio: "pipe" });
30
+ return result.status === 0;
31
+ }
32
+
28
33
  function installClaude() {
29
34
  log("Installing RPIKit for Claude Code...");
30
35
  try {
@@ -62,6 +67,12 @@ function installCodex() {
62
67
  return true;
63
68
  }
64
69
 
70
+ function installGeminiCLI() {
71
+ log("Installing RPIKit for Gemini CLI...");
72
+ log("Gemini CLI: coming soon. Please see documentation for manual setup.");
73
+ return true;
74
+ }
75
+
65
76
  function uninstallClaude() {
66
77
  log("Removing RPIKit from Claude Code...");
67
78
  try {
@@ -81,14 +92,15 @@ function printHelp() {
81
92
  RPIKit — Research → Plan → Implement
82
93
 
83
94
  Usage:
84
- rpi-kit install Install for detected tools (Claude Code + Codex)
95
+ rpi-kit install Interactive setup for AI tools
85
96
  rpi-kit install --claude Install for Claude Code only
86
97
  rpi-kit install --codex Install for Codex only (copies AGENTS.md to cwd)
98
+ rpi-kit install --gemini Install for Gemini CLI only
87
99
  rpi-kit uninstall Remove from Claude Code
88
100
  rpi-kit onboarding Interactive walkthrough of the workflow
89
101
  rpi-kit help Show this help
90
102
 
91
- After install, use in Claude Code:
103
+ After install, use in Claude Code or Gemini CLI:
92
104
  /rpi:init Configure for your project
93
105
  /rpi:new <feature> Start a new feature
94
106
  /rpi:research <feature> Research feasibility
@@ -99,61 +111,139 @@ After install, use in Claude Code:
99
111
  `);
100
112
  }
101
113
 
102
- switch (command) {
103
- case "install": {
104
- const claudeOnly = flags.includes("--claude");
105
- const codexOnly = flags.includes("--codex");
114
+ async function run() {
115
+ switch (command) {
116
+ case "install": {
117
+ const claudeOnly = flags.includes("--claude");
118
+ const codexOnly = flags.includes("--codex");
119
+ const geminiOnly = flags.includes("--gemini");
106
120
 
107
- if (claudeOnly) {
108
- installClaude();
109
- } else if (codexOnly) {
110
- installCodex();
111
- } else {
112
- let installed = false;
121
+ if (claudeOnly) {
122
+ installClaude();
123
+ break;
124
+ }
125
+ if (codexOnly) {
126
+ installCodex();
127
+ break;
128
+ }
129
+ if (geminiOnly) {
130
+ installGeminiCLI();
131
+ break;
132
+ }
113
133
 
114
- if (hasClaude()) {
115
- installed = installClaude() || installed;
134
+ // If silent, use the original auto-install behavior
135
+ if (silent) {
136
+ let installed = false;
137
+ if (hasClaude()) installed = installClaude() || installed;
138
+ if (hasCodex()) installed = installCodex() || installed;
139
+ if (hasGeminiCLI()) installed = installGeminiCLI() || installed;
140
+ if (!installed) {
141
+ const result = installClaude();
142
+ if (!result) {
143
+ log("\nNo supported tool detected (claude, codex, gemini).");
144
+ log("Run manually after installing Claude Code, Codex, or Gemini CLI:");
145
+ log(" rpi-kit install --claude");
146
+ log(" rpi-kit install --codex");
147
+ log(" rpi-kit install --gemini");
148
+ }
149
+ }
150
+ break;
116
151
  }
117
152
 
118
- if (hasCodex()) {
119
- installed = installCodex() || installed;
153
+ // Interactive prompt
154
+ let p;
155
+ let color;
156
+ try {
157
+ p = await import("@clack/prompts");
158
+ color = (await import("picocolors")).default;
159
+ } catch (e) {
160
+ console.error("Failed to load interactive prompt dependencies. Falling back to default install.");
161
+ let installed = false;
162
+ if (hasClaude()) installed = installClaude() || installed;
163
+ if (hasCodex()) installed = installCodex() || installed;
164
+ if (!installed) installClaude();
165
+ break;
120
166
  }
121
167
 
122
- if (!installed && !silent) {
123
- const result = installClaude();
124
- if (!result) {
125
- log("\nNo supported tool detected (claude, codex).");
126
- log("Run manually after installing Claude Code or Codex:");
127
- log(" rpi-kit install --claude");
128
- log(" rpi-kit install --codex");
168
+ console.clear();
169
+ p.intro(color.bgCyan(color.black(" RPIKit Setup ")));
170
+
171
+ p.log.message(color.dim("RPIKit configured: Claude Code, Codex, Gemini CLI"));
172
+
173
+ const options = [
174
+ { value: "claude", label: "Claude Code", hint: hasClaude() ? "detected" : "" },
175
+ { value: "codex", label: "Codex", hint: hasCodex() ? "detected" : "" },
176
+ { value: "gemini", label: "Gemini CLI", hint: hasGeminiCLI() ? "detected" : "" }
177
+ ];
178
+
179
+ const initialValues = options.filter(o => o.hint === "detected").map(o => o.value);
180
+ if (initialValues.length === 0) {
181
+ initialValues.push("claude"); // default selection if none detected
182
+ }
183
+
184
+ const selectedTools = await p.multiselect({
185
+ message: `Select tools to set up (${options.length} available)`,
186
+ options: options,
187
+ initialValues,
188
+ required: false
189
+ });
190
+
191
+ if (p.isCancel(selectedTools)) {
192
+ p.cancel("Setup cancelled.");
193
+ process.exit(0);
194
+ }
195
+
196
+ if (selectedTools.length === 0) {
197
+ p.outro("No tools selected.");
198
+ break;
199
+ }
200
+
201
+ console.log(); // Spacing
202
+
203
+ let installed = false;
204
+ for (const tool of selectedTools) {
205
+ if (tool === "claude") {
206
+ installed = installClaude() || installed;
207
+ } else if (tool === "codex") {
208
+ installed = installCodex() || installed;
209
+ } else if (tool === "gemini") {
210
+ installed = installGeminiCLI() || installed;
129
211
  }
130
212
  }
131
213
 
132
- if (installed && !silent) {
133
- log("");
134
- log("New to RPIKit? Run: rpi-kit onboarding");
214
+ if (installed) {
215
+ console.log();
216
+ p.outro(color.green("Setup complete! New to RPIKit? Run: rpi-kit onboarding"));
217
+ } else {
218
+ p.outro(color.yellow("Setup finished with some issues."));
135
219
  }
220
+
221
+ break;
136
222
  }
137
- break;
138
- }
139
223
 
140
- case "onboarding": {
141
- const { run } = require("./onboarding");
142
- run();
143
- break;
144
- }
224
+ case "onboarding": {
225
+ const { run } = require("./onboarding");
226
+ run();
227
+ break;
228
+ }
145
229
 
146
- case "uninstall":
147
- uninstallClaude();
148
- break;
230
+ case "uninstall":
231
+ uninstallClaude();
232
+ break;
149
233
 
150
- case "help":
151
- case "--help":
152
- case "-h":
153
- printHelp();
154
- break;
234
+ case "help":
235
+ case "--help":
236
+ case "-h":
237
+ printHelp();
238
+ break;
155
239
 
156
- default:
157
- if (!silent) printHelp();
158
- break;
240
+ default:
241
+ if (!silent) printHelp();
242
+ break;
243
+ }
159
244
  }
245
+
246
+ run().catch((err) => {
247
+ console.error(err);
248
+ process.exit(1);
249
+ });
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: rpi:implement
3
- description: Execute the implementation plan with task-level tracking, smart parallelism, automatic simplification, and mandatory code review.
4
- argument-hint: "<feature-slug> [--sequential|--parallel] [--skip-simplify] [--skip-review] [--resume] [--from-task <id>]"
3
+ description: Execute the implementation plan with task-level tracking and smart parallelism.
4
+ argument-hint: "<feature-slug> [--sequential|--parallel] [--resume] [--from-task <id>]"
5
5
  allowed-tools:
6
6
  - Read
7
7
  - Write
@@ -14,7 +14,7 @@ allowed-tools:
14
14
  ---
15
15
 
16
16
  <objective>
17
- Execute tasks from PLAN.md with per-task commits, automatic code simplification, and mandatory code review. Track everything in IMPLEMENT.md.
17
+ Execute tasks from PLAN.md with per-task commits. Track everything in IMPLEMENT.md. Simplification and review run in separate sessions for fresh context.
18
18
  </objective>
19
19
 
20
20
  <process>
@@ -26,8 +26,6 @@ Parse `$ARGUMENTS`:
26
26
  - First argument: `{feature-slug}` (required)
27
27
  - `--sequential`: force single agent mode
28
28
  - `--parallel`: force parallel wave mode
29
- - `--skip-simplify`: skip the simplify step (overrides config)
30
- - `--skip-review`: skip the review step (overrides config)
31
29
  - `--resume`: resume from last completed task in existing IMPLEMENT.md
32
30
  - `--from-task {id}`: resume from a specific task ID (used with --resume)
33
31
 
@@ -404,21 +402,7 @@ After all tasks in a PLAN.md phase complete:
404
402
  ```
405
403
  4. If any tasks blocked, ask user how to proceed before next phase
406
404
 
407
- ## 8. Run simplify (unless --skip-simplify)
408
-
409
- If `auto_simplify` is true in config (and no `--skip-simplify`):
410
-
411
- Run the simplify process as defined in `/rpi:simplify {feature-slug}`.
412
- Record findings in IMPLEMENT.md under "## Simplify Findings".
413
-
414
- ## 9. Run review (unless --skip-review)
415
-
416
- If `review_after_implement` is true in config (and no `--skip-review`):
417
-
418
- Run the review process as defined in `/rpi:review {feature-slug}`.
419
- Record verdict in IMPLEMENT.md under "## Review".
420
-
421
- ## 10. Finalize IMPLEMENT.md
405
+ ## 8. Finalize IMPLEMENT.md
422
406
 
423
407
  Rebuild IMPLEMENT.md from all checkpoint files:
424
408
  1. Read all files in `checkpoints/`
@@ -434,42 +418,29 @@ Sessions: {count from sessions/ directory}
434
418
  Commits: {list with hashes from checkpoints}
435
419
  Deviations: {count by severity}
436
420
 
437
- ## Review Verdict: {PASS|FAIL}
438
- {details}
439
- ```
421
+ ## Simplify Findings
440
422
 
441
- ## 11. Present result
423
+ _Run in a separate session: /rpi:simplify {feature-slug}_
442
424
 
443
- If PASS:
444
- ```
445
- Feature {feature-slug} implemented.
446
- {N} tasks completed across {M} phases.
447
- Review: PASS
425
+ ## Review
448
426
 
449
- All artifacts: {folder}/{feature-slug}/
427
+ _Run in a separate session: /rpi:review {feature-slug}_
450
428
  ```
451
429
 
452
- If FAIL:
453
- ```
454
- Feature {feature-slug} implementation complete but review found issues:
455
- {list issues}
430
+ ## 9. Present result
456
431
 
457
- Fix and re-run: /rpi:review {feature-slug}
458
432
  ```
433
+ Implementation complete: {feature-slug}
434
+ {N} tasks completed across {M} phases.
459
435
 
460
- ## 11b. Cross-phase session boundary (Tier 3 only)
461
-
462
- If tier == 3, after presenting the final result, add:
436
+ All artifacts: {folder}/{feature-slug}/
463
437
 
464
- ```
465
- This was a large feature (Tier 3). For future features of this complexity,
466
- consider running each RPI phase in a separate session:
467
- 1. Session 1: /rpi:new + /rpi:research
468
- 2. Session 2: /rpi:plan
469
- 3. Session 3+: /rpi:implement --resume (one session per wave)
438
+ Next steps (run each in a new session for fresh context):
439
+ 1. /rpi:simplify {feature-slug}
440
+ 2. /rpi:review {feature-slug}
470
441
  ```
471
442
 
472
- ## 12. Handle isolation cleanup
443
+ ## 10. Handle isolation cleanup
473
444
 
474
445
  Read `isolation` from `.rpi.yaml`.
475
446
 
@@ -29,7 +29,6 @@ Use AskUserQuestion to gather preferences. Ask up to 4 questions at a time:
29
29
  - "What's your default research tier?" — Options: `standard` (Recommended), `quick`, `deep`
30
30
 
31
31
  **Batch 2:**
32
- - "Should code simplification run automatically before review?" — Options: Yes (Recommended), No
33
32
  - "What commit message style do you prefer?" — Options: `conventional` (Recommended, e.g., feat(1.1): task name), `descriptive` (plain English)
34
33
 
35
34
  **Batch 3:**
@@ -61,11 +60,9 @@ Write the config file at the project root:
61
60
 
62
61
  folder: {user_choice}
63
62
  tier: {user_choice}
64
- auto_simplify: {true|false}
65
63
  commit_style: {conventional|descriptive}
66
64
  parallel_threshold: {number}
67
65
  skip_artifacts: []
68
- review_after_implement: true
69
66
  isolation: {none|branch|worktree}
70
67
  tdd: {true|false}
71
68
  test_runner: {auto|command}
@@ -126,6 +126,6 @@ Simplify complete for {feature-slug}:
126
126
  {Or: "Code was already clean — no issues found."}
127
127
  ```
128
128
 
129
- If called from /rpi:implement, return findings for recording in IMPLEMENT.md.
129
+ After finishing, update IMPLEMENT.md `## Simplify Findings` section with the results.
130
130
 
131
131
  </process>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rpi-kit",
3
- "version": "1.3.0",
3
+ "version": "1.4.1",
4
4
  "description": "Research → Plan → Implement. A systematic feature development workflow for Claude Code.",
5
5
  "license": "MIT",
6
6
  "author": "Daniel Mendes",
@@ -35,5 +35,9 @@
35
35
  "scripts": {
36
36
  "test": "node --test test/cli.test.js test/commands.test.js",
37
37
  "postinstall": "node bin/cli.js install --silent"
38
+ },
39
+ "dependencies": {
40
+ "@clack/prompts": "^1.1.0",
41
+ "picocolors": "^1.1.1"
38
42
  }
39
43
  }
@@ -112,11 +112,9 @@ After implementation, isolation cleanup runs based on config:
112
112
  ```yaml
113
113
  folder: rpi # Feature folder location
114
114
  tier: standard # Default research tier
115
- auto_simplify: true # Run simplify before review
116
115
  commit_style: conventional # Commit message format
117
116
  parallel_threshold: 8 # Task count for parallel mode
118
117
  skip_artifacts: [] # Artifacts to never generate
119
- review_after_implement: true # Mandatory review gate
120
118
  isolation: none # none | branch | worktree
121
119
  tdd: false # Enable Test-Driven Development
122
120
  test_runner: auto # Test command (auto-detect or explicit)