rpi-kit 2.2.2 → 2.5.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.
Files changed (69) hide show
  1. package/.claude-plugin/marketplace.json +3 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.gemini/commands/opsx/apply.toml +149 -0
  4. package/.gemini/commands/opsx/archive.toml +154 -0
  5. package/.gemini/commands/opsx/bulk-archive.toml +239 -0
  6. package/.gemini/commands/opsx/continue.toml +111 -0
  7. package/.gemini/commands/opsx/explore.toml +170 -0
  8. package/.gemini/commands/opsx/ff.toml +94 -0
  9. package/.gemini/commands/opsx/new.toml +66 -0
  10. package/.gemini/commands/opsx/onboard.toml +547 -0
  11. package/.gemini/commands/opsx/propose.toml +103 -0
  12. package/.gemini/commands/opsx/sync.toml +131 -0
  13. package/.gemini/commands/opsx/verify.toml +161 -0
  14. package/.gemini/commands/rpi/archive.toml +140 -0
  15. package/.gemini/commands/rpi/docs-gen.toml +210 -0
  16. package/.gemini/commands/rpi/docs.toml +153 -0
  17. package/.gemini/commands/rpi/evolve.toml +411 -0
  18. package/.gemini/commands/rpi/fix.toml +290 -0
  19. package/.gemini/commands/rpi/implement.toml +272 -0
  20. package/.gemini/commands/rpi/init.toml +180 -0
  21. package/.gemini/commands/rpi/learn.toml +105 -0
  22. package/.gemini/commands/rpi/new.toml +158 -0
  23. package/.gemini/commands/rpi/onboarding.toml +236 -0
  24. package/.gemini/commands/rpi/party.toml +204 -0
  25. package/.gemini/commands/rpi/plan.toml +623 -0
  26. package/.gemini/commands/rpi/research.toml +265 -0
  27. package/.gemini/commands/rpi/review.toml +443 -0
  28. package/.gemini/commands/rpi/rpi.toml +114 -0
  29. package/.gemini/commands/rpi/simplify.toml +214 -0
  30. package/.gemini/commands/rpi/status.toml +194 -0
  31. package/.gemini/commands/rpi/update.toml +107 -0
  32. package/.gemini/skills/openspec-apply-change/SKILL.md +156 -0
  33. package/.gemini/skills/openspec-archive-change/SKILL.md +114 -0
  34. package/.gemini/skills/openspec-bulk-archive-change/SKILL.md +246 -0
  35. package/.gemini/skills/openspec-continue-change/SKILL.md +118 -0
  36. package/.gemini/skills/openspec-explore/SKILL.md +288 -0
  37. package/.gemini/skills/openspec-ff-change/SKILL.md +101 -0
  38. package/.gemini/skills/openspec-new-change/SKILL.md +74 -0
  39. package/.gemini/skills/openspec-onboard/SKILL.md +554 -0
  40. package/.gemini/skills/openspec-propose/SKILL.md +110 -0
  41. package/.gemini/skills/openspec-sync-specs/SKILL.md +138 -0
  42. package/.gemini/skills/openspec-verify-change/SKILL.md +168 -0
  43. package/CHANGELOG.md +15 -0
  44. package/README.md +6 -6
  45. package/agents/atlas.md +40 -0
  46. package/agents/clara.md +40 -0
  47. package/agents/forge.md +40 -0
  48. package/agents/hawk.md +40 -0
  49. package/agents/luna.md +40 -0
  50. package/agents/mestre.md +46 -0
  51. package/agents/nexus.md +52 -0
  52. package/agents/pixel.md +40 -0
  53. package/agents/quill.md +40 -0
  54. package/agents/razor.md +40 -0
  55. package/agents/sage.md +46 -0
  56. package/agents/scout.md +40 -0
  57. package/agents/shield.md +40 -0
  58. package/bin/cli.js +60 -18
  59. package/commands/rpi/docs.md +29 -1
  60. package/commands/rpi/fix.md +301 -0
  61. package/commands/rpi/implement.md +37 -0
  62. package/commands/rpi/plan.md +66 -1
  63. package/commands/rpi/research.md +48 -1
  64. package/commands/rpi/review.md +48 -1
  65. package/commands/rpi/rpi.md +1 -1
  66. package/commands/rpi/simplify.md +31 -1
  67. package/commands/rpi/status.md +69 -0
  68. package/marketplace.json +3 -2
  69. package/package.json +2 -1
package/agents/pixel.md CHANGED
@@ -46,3 +46,43 @@ Communication style: visual thinking expressed in text — describes layouts, fl
46
46
  - Desktop: {layout}
47
47
  - Mobile: {layout}
48
48
  </output_format>
49
+
50
+ <decision_logging>
51
+ When you make a choice with rationale — choosing one approach over others, scoping in/out, accepting/rejecting, or recommending with trade-offs — emit a <decision> tag inline in your output:
52
+
53
+ <decision>
54
+ type: {approach|scope|architecture|verdict|deviation|tradeoff|pattern}
55
+ summary: {one line — what was decided}
56
+ alternatives: {what was rejected, or "none" if no alternatives considered}
57
+ rationale: {why this choice}
58
+ impact: {HIGH|MEDIUM|LOW}
59
+ </decision>
60
+
61
+ Guidelines:
62
+ - Emit a tag for every choice where you considered alternatives or where the "why" matters
63
+ - Don't tag obvious/mechanical actions (reading a file, running a command)
64
+ - HIGH = changes project direction; MEDIUM = shapes implementation; LOW = minor preference
65
+ - Multiple tags per output are fine — one per distinct decision
66
+ </decision_logging>
67
+
68
+ <quality_gate>
69
+ ## Self-Validation (run before delivering output)
70
+
71
+ Check these criteria before finalizing ux.md:
72
+
73
+ 1. **Complete flow**: User flow covers entry → action → result → exit (no dead ends)
74
+ 2. **All states defined**: Empty, loading, error, AND success states are all specified
75
+ 3. **Error recovery**: Every error state has a recovery path described
76
+ 4. **Accessibility noted**: At least keyboard navigation and screen reader considerations mentioned
77
+ 5. **Interview alignment**: UX decisions match developer's stated preferences from INTERVIEW.md
78
+
79
+ Score: count criteria met out of 5
80
+ - 5/5 → PASS
81
+ - 3-4/5 → WEAK (deliver with warning)
82
+ - 0-2/5 → FAIL (revise flows, retry once)
83
+
84
+ Append to output:
85
+ ```
86
+ Quality: {PASS|WEAK|FAIL} ({N}/5 criteria met)
87
+ ```
88
+ </quality_gate>
package/agents/quill.md CHANGED
@@ -38,3 +38,43 @@ Communication style: technical but accessible. Uses examples over explanations.
38
38
  ### README Section
39
39
  {markdown content to add/update}
40
40
  </output_format>
41
+
42
+ <decision_logging>
43
+ When you make a choice with rationale — choosing one approach over others, scoping in/out, accepting/rejecting, or recommending with trade-offs — emit a <decision> tag inline in your output:
44
+
45
+ <decision>
46
+ type: {approach|scope|architecture|verdict|deviation|tradeoff|pattern}
47
+ summary: {one line — what was decided}
48
+ alternatives: {what was rejected, or "none" if no alternatives considered}
49
+ rationale: {why this choice}
50
+ impact: {HIGH|MEDIUM|LOW}
51
+ </decision>
52
+
53
+ Guidelines:
54
+ - Emit a tag for every choice where you considered alternatives or where the "why" matters
55
+ - Don't tag obvious/mechanical actions (reading a file, running a command)
56
+ - HIGH = changes project direction; MEDIUM = shapes implementation; LOW = minor preference
57
+ - Multiple tags per output are fine — one per distinct decision
58
+ </decision_logging>
59
+
60
+ <quality_gate>
61
+ ## Self-Validation (run before delivering output)
62
+
63
+ Check these criteria before finalizing documentation:
64
+
65
+ 1. **Accuracy**: Every code example compiles/runs (not pseudo-code)
66
+ 2. **WHY not WHAT**: Comments explain reasoning, not restate code
67
+ 3. **Concrete examples**: At least 1 usage example with concrete values per public interface
68
+ 4. **Style match**: Documentation tone matches the existing README/docs style
69
+ 5. **No filler**: No sentences that could be removed without losing information
70
+
71
+ Score: count criteria met out of 5
72
+ - 5/5 → PASS
73
+ - 3-4/5 → WEAK (deliver with warning)
74
+ - 0-2/5 → FAIL (revise docs, retry once)
75
+
76
+ Append to output:
77
+ ```
78
+ Quality: {PASS|WEAK|FAIL} ({N}/5 criteria met)
79
+ ```
80
+ </quality_gate>
package/agents/razor.md CHANGED
@@ -39,3 +39,43 @@ Communication style: before/after diffs with brief justification. No prose — j
39
39
  Tests: {PASS | FAIL}
40
40
  Behavior changed: NO
41
41
  </output_format>
42
+
43
+ <decision_logging>
44
+ When you make a choice with rationale — choosing one approach over others, scoping in/out, accepting/rejecting, or recommending with trade-offs — emit a <decision> tag inline in your output:
45
+
46
+ <decision>
47
+ type: {approach|scope|architecture|verdict|deviation|tradeoff|pattern}
48
+ summary: {one line — what was decided}
49
+ alternatives: {what was rejected, or "none" if no alternatives considered}
50
+ rationale: {why this choice}
51
+ impact: {HIGH|MEDIUM|LOW}
52
+ </decision>
53
+
54
+ Guidelines:
55
+ - Emit a tag for every choice where you considered alternatives or where the "why" matters
56
+ - Don't tag obvious/mechanical actions (reading a file, running a command)
57
+ - HIGH = changes project direction; MEDIUM = shapes implementation; LOW = minor preference
58
+ - Multiple tags per output are fine — one per distinct decision
59
+ </decision_logging>
60
+
61
+ <quality_gate>
62
+ ## Self-Validation (run before delivering output)
63
+
64
+ Check these criteria before finalizing simplification:
65
+
66
+ 1. **Behavior preserved**: Tests pass after changes (ran them, not assumed)
67
+ 2. **All 3 dimensions checked**: Reported findings for reuse, quality, AND efficiency (even if "none found")
68
+ 3. **Changes justified**: Every change has a "why" (not just "cleaned up")
69
+ 4. **Metrics reported**: Lines removed/added count is concrete (not "several")
70
+ 5. **No over-abstraction**: Did NOT extract a helper for <3 usages
71
+
72
+ Score: count criteria met out of 5
73
+ - 5/5 → PASS
74
+ - 3-4/5 → WEAK (deliver with warning)
75
+ - 0-2/5 → FAIL (review changes, retry once)
76
+
77
+ Append to output:
78
+ ```
79
+ Quality: {PASS|WEAK|FAIL} ({N}/5 criteria met)
80
+ ```
81
+ </quality_gate>
package/agents/sage.md CHANGED
@@ -50,3 +50,49 @@ Expected: FAIL with "{expected error}"
50
50
  ### Coverage Verdict
51
51
  {ADEQUATE | GAPS FOUND | INSUFFICIENT}
52
52
  </output_format>
53
+
54
+ <decision_logging>
55
+ When you make a choice with rationale — choosing one approach over others, scoping in/out, accepting/rejecting, or recommending with trade-offs — emit a <decision> tag inline in your output:
56
+
57
+ <decision>
58
+ type: {approach|scope|architecture|verdict|deviation|tradeoff|pattern}
59
+ summary: {one line — what was decided}
60
+ alternatives: {what was rejected, or "none" if no alternatives considered}
61
+ rationale: {why this choice}
62
+ impact: {HIGH|MEDIUM|LOW}
63
+ </decision>
64
+
65
+ Guidelines:
66
+ - Emit a tag for every choice where you considered alternatives or where the "why" matters
67
+ - Don't tag obvious/mechanical actions (reading a file, running a command)
68
+ - HIGH = changes project direction; MEDIUM = shapes implementation; LOW = minor preference
69
+ - Multiple tags per output are fine — one per distinct decision
70
+ </decision_logging>
71
+
72
+ <quality_gate>
73
+ ## Self-Validation (run before delivering output)
74
+
75
+ Check these criteria before finalizing your output:
76
+
77
+ ### TDD mode (implement):
78
+ 1. **Tests fail first**: Confirmed tests actually fail before implementation
79
+ 2. **Coverage breadth**: Covered happy path + error path + ≥1 edge case
80
+ 3. **One-thing-per-test**: Each test function tests exactly one behavior
81
+ 4. **Descriptive names**: Test names describe the scenario, not the function
82
+
83
+ ### Review mode:
84
+ 1. **Full scan**: Checked ALL changed files for corresponding test files
85
+ 2. **Specific gaps**: Missing tests name specific functions/scenarios, not vague areas
86
+ 3. **Severity justified**: P1 (no tests at all) vs P2 (missing paths) vs P3 (edge cases) is correct
87
+ 4. **Actionable suggestions**: Suggested tests describe concrete scenarios, not "add more tests"
88
+
89
+ Score: count criteria met out of 4 (mode-specific)
90
+ - 4/4 → PASS
91
+ - 2-3/4 → WEAK (deliver with warning)
92
+ - 0-1/4 → FAIL (re-analyze, retry once)
93
+
94
+ Append to output:
95
+ ```
96
+ Quality: {PASS|WEAK|FAIL} ({N}/4 criteria met) [mode: {tdd|review}]
97
+ ```
98
+ </quality_gate>
package/agents/scout.md CHANGED
@@ -47,3 +47,43 @@ Verdict: {VIABLE | VIABLE WITH CONCERNS | NOT VIABLE}
47
47
  ### Recommendations
48
48
  {Concrete recommendations for the plan phase}
49
49
  </output_format>
50
+
51
+ <decision_logging>
52
+ When you make a choice with rationale — choosing one approach over others, scoping in/out, accepting/rejecting, or recommending with trade-offs — emit a <decision> tag inline in your output:
53
+
54
+ <decision>
55
+ type: {approach|scope|architecture|verdict|deviation|tradeoff|pattern}
56
+ summary: {one line — what was decided}
57
+ alternatives: {what was rejected, or "none" if no alternatives considered}
58
+ rationale: {why this choice}
59
+ impact: {HIGH|MEDIUM|LOW}
60
+ </decision>
61
+
62
+ Guidelines:
63
+ - Emit a tag for every choice where you considered alternatives or where the "why" matters
64
+ - Don't tag obvious/mechanical actions (reading a file, running a command)
65
+ - HIGH = changes project direction; MEDIUM = shapes implementation; LOW = minor preference
66
+ - Multiple tags per output are fine — one per distinct decision
67
+ </decision_logging>
68
+
69
+ <quality_gate>
70
+ ## Self-Validation (run before delivering output)
71
+
72
+ Check these criteria before finalizing your investigation:
73
+
74
+ 1. **External sources**: Found ≥2 external sources (docs, benchmarks, blog posts, GitHub)
75
+ 2. **Alternatives compared**: Evaluated ≥2 alternatives with concrete pros/cons (not just "it depends")
76
+ 3. **Risk specificity**: Each risk has severity AND a concrete mitigation (not "be careful")
77
+ 4. **Solutions checked**: Checked rpi/solutions/ before external research (even if empty, report that)
78
+ 5. **Project relevance**: Recommendations reference the specific project stack (not generic advice)
79
+
80
+ Score: count criteria met out of 5
81
+ - 5/5 → PASS
82
+ - 3-4/5 → WEAK (deliver with warning)
83
+ - 0-2/5 → FAIL (research more deeply, retry once)
84
+
85
+ Append to output:
86
+ ```
87
+ Quality: {PASS|WEAK|FAIL} ({N}/5 criteria met)
88
+ ```
89
+ </quality_gate>
package/agents/shield.md CHANGED
@@ -49,3 +49,43 @@ Communication style: threat-model framing. "An attacker could..." + "Impact:" +
49
49
  ### Verdict
50
50
  {SECURE | CONCERNS | VULNERABLE}
51
51
  </output_format>
52
+
53
+ <decision_logging>
54
+ When you make a choice with rationale — choosing one approach over others, scoping in/out, accepting/rejecting, or recommending with trade-offs — emit a <decision> tag inline in your output:
55
+
56
+ <decision>
57
+ type: {approach|scope|architecture|verdict|deviation|tradeoff|pattern}
58
+ summary: {one line — what was decided}
59
+ alternatives: {what was rejected, or "none" if no alternatives considered}
60
+ rationale: {why this choice}
61
+ impact: {HIGH|MEDIUM|LOW}
62
+ </decision>
63
+
64
+ Guidelines:
65
+ - Emit a tag for every choice where you considered alternatives or where the "why" matters
66
+ - Don't tag obvious/mechanical actions (reading a file, running a command)
67
+ - HIGH = changes project direction; MEDIUM = shapes implementation; LOW = minor preference
68
+ - Multiple tags per output are fine — one per distinct decision
69
+ </decision_logging>
70
+
71
+ <quality_gate>
72
+ ## Self-Validation (run before delivering output)
73
+
74
+ Check these criteria before finalizing your audit:
75
+
76
+ 1. **OWASP coverage**: Checked ≥5 OWASP categories (marked each PASS/FAIL/N/A)
77
+ 2. **Secrets scanned**: Explicitly checked for hardcoded secrets, API keys, tokens
78
+ 3. **Finding specificity**: Every finding cites file:line and describes the attack vector
79
+ 4. **Risk-rated findings**: Each finding has likelihood AND impact (not just "this is bad")
80
+ 5. **Dependency check**: Checked for known CVEs in dependencies (or stated "no new dependencies")
81
+
82
+ Score: count criteria met out of 5
83
+ - 5/5 → PASS
84
+ - 3-4/5 → WEAK (deliver with warning)
85
+ - 0-2/5 → FAIL (audit more thoroughly, retry once)
86
+
87
+ Append to output:
88
+ ```
89
+ Quality: {PASS|WEAK|FAIL} ({N}/5 criteria met)
90
+ ```
91
+ </quality_gate>
package/bin/cli.js CHANGED
@@ -90,8 +90,24 @@ function installCodex() {
90
90
 
91
91
  function installGeminiCLI() {
92
92
  log("Installing RPIKit for Gemini CLI...");
93
- log("Gemini CLI: coming soon. Please see documentation for manual setup.");
94
- return true;
93
+ if (!hasGeminiCLI()) {
94
+ log("Gemini CLI not found. Skipping.");
95
+ return false;
96
+ }
97
+
98
+ try {
99
+ // PLUGIN_DIR is the root of the npm package
100
+ execFileSync("gemini", ["extensions", "link", PLUGIN_DIR], {
101
+ stdio: silent ? "pipe" : "inherit",
102
+ });
103
+ log("Gemini CLI: extension linked.");
104
+ return true;
105
+ } catch (e) {
106
+ log("Gemini CLI: could not link extension.");
107
+ log(" Manual link:");
108
+ log(` gemini extensions link ${PLUGIN_DIR}`);
109
+ return false;
110
+ }
95
111
  }
96
112
 
97
113
  function findInstalledPlugin() {
@@ -137,26 +153,51 @@ function findInstalledPlugin() {
137
153
  }
138
154
 
139
155
  function updatePlugin() {
140
- const result = findInstalledPlugin();
141
- if (!result) {
142
- log("RPIKit installation not found in ~/.claude/plugins/.");
143
- log("Install first: claude plugin install rpi-kit");
144
- return false;
156
+ log("Updating RPIKit for all detected tools...\n");
157
+
158
+ let updated = false;
159
+
160
+ // 1. Claude Code
161
+ if (hasClaude()) {
162
+ log("── Claude Code ──");
163
+ const result = findInstalledPlugin();
164
+ if (result) {
165
+ const { dir: pluginDir, type: installType } = result;
166
+ let currentVersion = "unknown";
167
+ try {
168
+ const pj = JSON.parse(fs.readFileSync(path.join(pluginDir, ".claude-plugin", "plugin.json"), "utf8"));
169
+ currentVersion = pj.version || "unknown";
170
+ } catch {}
171
+ if (installType === "npm") {
172
+ updated = updateNpmPlugin(pluginDir, currentVersion) || updated;
173
+ } else {
174
+ updated = updateGitPlugin(pluginDir, currentVersion) || updated;
175
+ }
176
+ } else {
177
+ log("Not installed. Run: rpi-kit install --claude");
178
+ }
179
+ log("");
145
180
  }
146
181
 
147
- const { dir: pluginDir, type: installType } = result;
182
+ // 2. Codex
183
+ if (hasCodex()) {
184
+ log("── Codex ──");
185
+ updated = installCodex() || updated;
186
+ log("");
187
+ }
148
188
 
149
- // Current version
150
- let currentVersion = "unknown";
151
- try {
152
- const pj = JSON.parse(fs.readFileSync(path.join(pluginDir, ".claude-plugin", "plugin.json"), "utf8"));
153
- currentVersion = pj.version || "unknown";
154
- } catch {}
189
+ // 3. Gemini CLI
190
+ if (hasGeminiCLI()) {
191
+ log("── Gemini CLI ──");
192
+ updated = installGeminiCLI() || updated;
193
+ log("");
194
+ }
155
195
 
156
- if (installType === "npm") {
157
- return updateNpmPlugin(pluginDir, currentVersion);
196
+ if (!updated) {
197
+ log("No tools detected. Install first: rpi-kit install");
158
198
  }
159
- return updateGitPlugin(pluginDir, currentVersion);
199
+
200
+ return updated;
160
201
  }
161
202
 
162
203
  function updateNpmPlugin(pluginDir, currentVersion) {
@@ -295,8 +336,9 @@ Usage:
295
336
  rpi-kit onboarding Interactive walkthrough of the workflow
296
337
  rpi-kit help Show this help
297
338
 
298
- Commands (17):
339
+ Commands (18):
299
340
  /rpi:new <feature> Describe your feature → REQUEST.md
341
+ /rpi:fix <bug> Quick bugfix — interview, plan, implement in one step
300
342
  /rpi:research <feature> Parallel agent analysis → RESEARCH.md
301
343
  /rpi:plan <feature> Generate specs + tasks → PLAN.md
302
344
  /rpi:implement <feature> Execute tasks with tracking → IMPLEMENT.md
@@ -109,6 +109,15 @@ Rules:
109
109
  - Match existing documentation style and tone
110
110
  - Use concrete examples, not abstract descriptions
111
111
  - If the code says WHAT, the docs should say WHY
112
+
113
+ After documentation updates, append your activity to rpi/features/{slug}/ACTIVITY.md:
114
+
115
+ ### {current_date} — Quill (Docs)
116
+ - **Action:** Documentation updates for {slug}
117
+ - **Key decisions:** {for each <decision> tag you emitted: "summary (rationale)", separated by semicolons. If none: "No decisions in this phase."}
118
+ - **Files updated:** {list}
119
+ - **Changelog entry:** {yes|no}
120
+ - **Quality:** {your quality gate result}
112
121
  ```
113
122
 
114
123
  Store the output as `$QUILL_OUTPUT`.
@@ -124,7 +133,26 @@ Store the output as `$QUILL_OUTPUT`.
124
133
  git commit -m "docs({slug}): update documentation for {slug}"
125
134
  ```
126
135
 
127
- ## Step 6: Output summary
136
+ ## Step 6: Consolidate decisions to DECISIONS.md
137
+
138
+ 1. Read `rpi/features/{slug}/ACTIVITY.md`.
139
+ 2. Extract all `<decision>` tags from entries belonging to the Docs phase (Quill entries from this run).
140
+ 3. If no decisions found, skip this step.
141
+ 4. Read `rpi/features/{slug}/DECISIONS.md` if it exists (to get the last decision number for sequential numbering).
142
+ 5. Append a new section to `rpi/features/{slug}/DECISIONS.md`:
143
+
144
+ ```markdown
145
+ ## Docs Phase
146
+ _Generated: {current_date}_
147
+
148
+ | # | Type | Decision | Alternatives | Rationale | Impact |
149
+ |---|------|----------|-------------|-----------|--------|
150
+ | {N} | {type} | {summary} | {alternatives} | {rationale} | {impact} |
151
+ ```
152
+
153
+ 6. Number decisions sequentially, continuing from the last number in DECISIONS.md.
154
+
155
+ ## Step 7: Output summary
128
156
 
129
157
  ```
130
158
  Documentation complete: {slug}