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.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/AGENTS.md +89 -85
- package/README.md +0 -2
- package/agents/code-reviewer.md +17 -85
- package/agents/code-simplifier.md +19 -66
- package/agents/cto-advisor.md +16 -26
- package/agents/doc-synthesizer.md +16 -30
- package/agents/doc-writer.md +15 -16
- package/agents/explore-codebase.md +14 -52
- package/agents/plan-executor.md +28 -75
- package/agents/product-manager.md +15 -22
- package/agents/requirement-parser.md +14 -23
- package/agents/senior-engineer.md +19 -28
- package/agents/test-engineer.md +20 -15
- package/agents/ux-designer.md +17 -28
- package/bin/cli.js +134 -44
- package/commands/rpi/implement.md +16 -45
- package/commands/rpi/init.md +0 -3
- package/commands/rpi/simplify.md +1 -1
- package/package.json +5 -1
- package/skills/rpi-workflow/SKILL.md +0 -2
package/agents/ux-designer.md
CHANGED
|
@@ -1,30 +1,22 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ux-designer
|
|
3
|
-
description:
|
|
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
|
-
|
|
9
|
+
Map user journeys and interaction patterns. Reuse existing UI patterns.
|
|
10
10
|
</role>
|
|
11
11
|
|
|
12
|
-
<
|
|
13
|
-
1.
|
|
14
|
-
2.
|
|
15
|
-
3.
|
|
16
|
-
4.
|
|
17
|
-
5. Accessibility
|
|
18
|
-
6.
|
|
19
|
-
</
|
|
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. {
|
|
36
|
-
2. {
|
|
37
|
-
...
|
|
27
|
+
1. {step}: {user action} -> {system response}
|
|
28
|
+
2. {step}: ...
|
|
38
29
|
|
|
39
30
|
### Interaction Patterns
|
|
40
|
-
- {
|
|
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
|
-
| {
|
|
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: {
|
|
54
|
-
- Screen reader: {
|
|
55
|
-
- Contrast: {
|
|
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
|
|
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
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
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
|
-
|
|
115
|
-
|
|
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
|
-
|
|
119
|
-
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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
|
|
133
|
-
log(
|
|
134
|
-
|
|
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
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
224
|
+
case "onboarding": {
|
|
225
|
+
const { run } = require("./onboarding");
|
|
226
|
+
run();
|
|
227
|
+
break;
|
|
228
|
+
}
|
|
145
229
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
230
|
+
case "uninstall":
|
|
231
|
+
uninstallClaude();
|
|
232
|
+
break;
|
|
149
233
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
234
|
+
case "help":
|
|
235
|
+
case "--help":
|
|
236
|
+
case "-h":
|
|
237
|
+
printHelp();
|
|
238
|
+
break;
|
|
155
239
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
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
|
|
4
|
-
argument-hint: "<feature-slug> [--sequential|--parallel] [--
|
|
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
|
|
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.
|
|
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
|
-
##
|
|
438
|
-
{details}
|
|
439
|
-
```
|
|
421
|
+
## Simplify Findings
|
|
440
422
|
|
|
441
|
-
|
|
423
|
+
_Run in a separate session: /rpi:simplify {feature-slug}_
|
|
442
424
|
|
|
443
|
-
|
|
444
|
-
```
|
|
445
|
-
Feature {feature-slug} implemented.
|
|
446
|
-
{N} tasks completed across {M} phases.
|
|
447
|
-
Review: PASS
|
|
425
|
+
## Review
|
|
448
426
|
|
|
449
|
-
|
|
427
|
+
_Run in a separate session: /rpi:review {feature-slug}_
|
|
450
428
|
```
|
|
451
429
|
|
|
452
|
-
|
|
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
|
-
|
|
461
|
-
|
|
462
|
-
If tier == 3, after presenting the final result, add:
|
|
436
|
+
All artifacts: {folder}/{feature-slug}/
|
|
463
437
|
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
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
|
-
##
|
|
443
|
+
## 10. Handle isolation cleanup
|
|
473
444
|
|
|
474
445
|
Read `isolation` from `.rpi.yaml`.
|
|
475
446
|
|
package/commands/rpi/init.md
CHANGED
|
@@ -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}
|
package/commands/rpi/simplify.md
CHANGED
|
@@ -126,6 +126,6 @@ Simplify complete for {feature-slug}:
|
|
|
126
126
|
{Or: "Code was already clean — no issues found."}
|
|
127
127
|
```
|
|
128
128
|
|
|
129
|
-
|
|
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
|
+
"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)
|