rpi-kit 1.4.0 → 2.0.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/marketplace.json +9 -6
- package/.claude-plugin/plugin.json +4 -4
- package/AGENTS.md +2016 -117
- package/CHANGELOG.md +83 -0
- package/README.md +116 -169
- package/agents/atlas.md +61 -0
- package/agents/clara.md +49 -0
- package/agents/forge.md +38 -0
- package/agents/hawk.md +54 -0
- package/agents/luna.md +50 -0
- package/agents/mestre.md +61 -0
- package/agents/nexus.md +63 -0
- package/agents/pixel.md +48 -0
- package/agents/quill.md +40 -0
- package/agents/razor.md +41 -0
- package/agents/sage.md +52 -0
- package/agents/scout.md +49 -0
- package/agents/shield.md +51 -0
- package/bin/cli.js +160 -53
- package/bin/onboarding.js +46 -28
- package/commands/rpi/archive.md +149 -0
- package/commands/rpi/docs.md +106 -168
- package/commands/rpi/implement.md +163 -401
- package/commands/rpi/init.md +150 -67
- package/commands/rpi/learn.md +114 -0
- package/commands/rpi/new.md +85 -155
- package/commands/rpi/onboarding.md +157 -336
- package/commands/rpi/party.md +212 -0
- package/commands/rpi/plan.md +241 -205
- package/commands/rpi/research.md +162 -104
- package/commands/rpi/review.md +350 -104
- package/commands/rpi/rpi.md +125 -0
- package/commands/rpi/simplify.md +156 -93
- package/commands/rpi/status.md +91 -114
- package/package.json +7 -3
- package/skills/rpi-agents/SKILL.md +63 -39
- package/skills/rpi-workflow/SKILL.md +160 -186
- package/agents/code-reviewer.md +0 -108
- package/agents/code-simplifier.md +0 -82
- package/agents/cto-advisor.md +0 -61
- package/agents/doc-synthesizer.md +0 -67
- package/agents/doc-writer.md +0 -37
- package/agents/explore-codebase.md +0 -88
- package/agents/plan-executor.md +0 -95
- package/agents/product-manager.md +0 -59
- package/agents/requirement-parser.md +0 -51
- package/agents/senior-engineer.md +0 -61
- package/agents/test-engineer.md +0 -23
- package/agents/ux-designer.md +0 -58
- package/codex.md +0 -72
- package/commands/rpi/add-todo.md +0 -83
- package/commands/rpi/set-profile.md +0 -124
- package/commands/rpi/test.md +0 -198
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 {
|
|
@@ -46,7 +51,7 @@ function installCodex() {
|
|
|
46
51
|
|
|
47
52
|
if (fs.existsSync(dest)) {
|
|
48
53
|
const existing = fs.readFileSync(dest, "utf8");
|
|
49
|
-
if (existing.includes("
|
|
54
|
+
if (existing.includes("RPIKit Agents")) {
|
|
50
55
|
log("Codex: AGENTS.md already contains RPI definitions.");
|
|
51
56
|
return true;
|
|
52
57
|
}
|
|
@@ -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 {
|
|
@@ -78,82 +89,178 @@ function uninstallClaude() {
|
|
|
78
89
|
|
|
79
90
|
function printHelp() {
|
|
80
91
|
console.log(`
|
|
81
|
-
RPIKit — Research → Plan → Implement
|
|
92
|
+
RPIKit v2 — Research → Plan → Implement
|
|
93
|
+
|
|
94
|
+
7-phase workflow with 13 named agents, delta specs,
|
|
95
|
+
and knowledge compounding for AI-assisted feature development.
|
|
82
96
|
|
|
83
97
|
Usage:
|
|
84
|
-
rpi-kit install
|
|
98
|
+
rpi-kit install Interactive setup for AI tools
|
|
85
99
|
rpi-kit install --claude Install for Claude Code only
|
|
86
100
|
rpi-kit install --codex Install for Codex only (copies AGENTS.md to cwd)
|
|
101
|
+
rpi-kit install --gemini Install for Gemini CLI only
|
|
87
102
|
rpi-kit uninstall Remove from Claude Code
|
|
88
103
|
rpi-kit onboarding Interactive walkthrough of the workflow
|
|
89
104
|
rpi-kit help Show this help
|
|
90
105
|
|
|
91
|
-
|
|
92
|
-
/rpi:
|
|
93
|
-
/rpi:
|
|
94
|
-
/rpi:
|
|
95
|
-
/rpi:
|
|
96
|
-
/rpi:
|
|
97
|
-
/rpi:
|
|
98
|
-
/rpi:
|
|
106
|
+
Commands (14):
|
|
107
|
+
/rpi:new <feature> Describe your feature → REQUEST.md
|
|
108
|
+
/rpi:research <feature> Parallel agent analysis → RESEARCH.md
|
|
109
|
+
/rpi:plan <feature> Generate specs + tasks → PLAN.md
|
|
110
|
+
/rpi:implement <feature> Execute tasks with tracking → IMPLEMENT.md
|
|
111
|
+
/rpi:simplify <feature> Code quality checks → auto-fix issues
|
|
112
|
+
/rpi:review <feature> Review against plan → PASS / FAIL
|
|
113
|
+
/rpi:docs <feature> Document the code → DOCS.md + changelog
|
|
114
|
+
|
|
115
|
+
/rpi:init Configure RPIKit for your project
|
|
116
|
+
/rpi:status Show all features and their phases
|
|
117
|
+
/rpi <feature> Auto-progress to next phase
|
|
118
|
+
/rpi:onboarding Guided first-time setup
|
|
119
|
+
/rpi:learn [description] Capture a solution to knowledge base
|
|
120
|
+
/rpi:archive <feature> Archive a completed feature
|
|
121
|
+
/rpi:party Multi-agent debate on any topic
|
|
122
|
+
|
|
123
|
+
Agents (13):
|
|
124
|
+
Luna (Analyst) · Atlas (Explorer) · Scout (Researcher) · Nexus (Synthesizer)
|
|
125
|
+
Mestre (Architect) · Clara (PM) · Pixel (UX) · Forge (Builder)
|
|
126
|
+
Sage (Tester) · Razor (Simplifier) · Hawk (Reviewer) · Shield (Security)
|
|
127
|
+
Quill (Doc Writer)
|
|
99
128
|
`);
|
|
100
129
|
}
|
|
101
130
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
131
|
+
async function run() {
|
|
132
|
+
switch (command) {
|
|
133
|
+
case "install": {
|
|
134
|
+
const claudeOnly = flags.includes("--claude");
|
|
135
|
+
const codexOnly = flags.includes("--codex");
|
|
136
|
+
const geminiOnly = flags.includes("--gemini");
|
|
106
137
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
138
|
+
if (claudeOnly) {
|
|
139
|
+
installClaude();
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
if (codexOnly) {
|
|
143
|
+
installCodex();
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
if (geminiOnly) {
|
|
147
|
+
installGeminiCLI();
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// If silent, use the original auto-install behavior
|
|
152
|
+
if (silent) {
|
|
153
|
+
let installed = false;
|
|
154
|
+
if (hasClaude()) installed = installClaude() || installed;
|
|
155
|
+
if (hasCodex()) installed = installCodex() || installed;
|
|
156
|
+
if (hasGeminiCLI()) installed = installGeminiCLI() || installed;
|
|
157
|
+
if (!installed) {
|
|
158
|
+
const result = installClaude();
|
|
159
|
+
if (!result) {
|
|
160
|
+
log("\nNo supported tool detected (claude, codex, gemini).");
|
|
161
|
+
log("Run manually after installing Claude Code, Codex, or Gemini CLI:");
|
|
162
|
+
log(" rpi-kit install --claude");
|
|
163
|
+
log(" rpi-kit install --codex");
|
|
164
|
+
log(" rpi-kit install --gemini");
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Interactive prompt
|
|
171
|
+
let p;
|
|
172
|
+
let color;
|
|
173
|
+
try {
|
|
174
|
+
p = await import("@clack/prompts");
|
|
175
|
+
color = (await import("picocolors")).default;
|
|
176
|
+
} catch (e) {
|
|
177
|
+
console.error("Failed to load interactive prompt dependencies. Falling back to default install.");
|
|
178
|
+
let installed = false;
|
|
179
|
+
if (hasClaude()) installed = installClaude() || installed;
|
|
180
|
+
if (hasCodex()) installed = installCodex() || installed;
|
|
181
|
+
if (!installed) installClaude();
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
console.clear();
|
|
186
|
+
p.intro(color.bgCyan(color.black(" RPIKit Setup ")));
|
|
113
187
|
|
|
114
|
-
|
|
115
|
-
|
|
188
|
+
p.log.message(color.dim("RPIKit configured: Claude Code, Codex, Gemini CLI"));
|
|
189
|
+
|
|
190
|
+
const options = [
|
|
191
|
+
{ value: "claude", label: "Claude Code", hint: hasClaude() ? "detected" : "" },
|
|
192
|
+
{ value: "codex", label: "Codex", hint: hasCodex() ? "detected" : "" },
|
|
193
|
+
{ value: "gemini", label: "Gemini CLI", hint: hasGeminiCLI() ? "detected" : "" }
|
|
194
|
+
];
|
|
195
|
+
|
|
196
|
+
const initialValues = options.filter(o => o.hint === "detected").map(o => o.value);
|
|
197
|
+
if (initialValues.length === 0) {
|
|
198
|
+
initialValues.push("claude"); // default selection if none detected
|
|
116
199
|
}
|
|
117
200
|
|
|
118
|
-
|
|
119
|
-
|
|
201
|
+
const selectedTools = await p.multiselect({
|
|
202
|
+
message: `Select tools to set up (${options.length} available)`,
|
|
203
|
+
options: options,
|
|
204
|
+
initialValues,
|
|
205
|
+
required: false
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
if (p.isCancel(selectedTools)) {
|
|
209
|
+
p.cancel("Setup cancelled.");
|
|
210
|
+
process.exit(0);
|
|
120
211
|
}
|
|
121
212
|
|
|
122
|
-
if (
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
213
|
+
if (selectedTools.length === 0) {
|
|
214
|
+
p.outro("No tools selected.");
|
|
215
|
+
break;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
console.log(); // Spacing
|
|
219
|
+
|
|
220
|
+
let installed = false;
|
|
221
|
+
for (const tool of selectedTools) {
|
|
222
|
+
if (tool === "claude") {
|
|
223
|
+
installed = installClaude() || installed;
|
|
224
|
+
} else if (tool === "codex") {
|
|
225
|
+
installed = installCodex() || installed;
|
|
226
|
+
} else if (tool === "gemini") {
|
|
227
|
+
installed = installGeminiCLI() || installed;
|
|
129
228
|
}
|
|
130
229
|
}
|
|
131
230
|
|
|
132
|
-
if (installed
|
|
133
|
-
log(
|
|
134
|
-
|
|
231
|
+
if (installed) {
|
|
232
|
+
console.log();
|
|
233
|
+
p.outro(color.green("Setup complete! New to RPIKit? Run: rpi-kit onboarding"));
|
|
234
|
+
} else {
|
|
235
|
+
p.outro(color.yellow("Setup finished with some issues."));
|
|
135
236
|
}
|
|
237
|
+
|
|
238
|
+
break;
|
|
136
239
|
}
|
|
137
|
-
break;
|
|
138
|
-
}
|
|
139
240
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
241
|
+
case "onboarding": {
|
|
242
|
+
const { run } = require("./onboarding");
|
|
243
|
+
run();
|
|
244
|
+
break;
|
|
245
|
+
}
|
|
145
246
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
247
|
+
case "uninstall":
|
|
248
|
+
uninstallClaude();
|
|
249
|
+
break;
|
|
149
250
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
251
|
+
case "help":
|
|
252
|
+
case "--help":
|
|
253
|
+
case "-h":
|
|
254
|
+
printHelp();
|
|
255
|
+
break;
|
|
155
256
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
257
|
+
default:
|
|
258
|
+
if (!silent) printHelp();
|
|
259
|
+
break;
|
|
260
|
+
}
|
|
159
261
|
}
|
|
262
|
+
|
|
263
|
+
run().catch((err) => {
|
|
264
|
+
console.error(err);
|
|
265
|
+
process.exit(1);
|
|
266
|
+
});
|
package/bin/onboarding.js
CHANGED
|
@@ -9,27 +9,28 @@ const RESET = "\x1b[0m";
|
|
|
9
9
|
|
|
10
10
|
const steps = [
|
|
11
11
|
{
|
|
12
|
-
title: "Welcome to RPIKit",
|
|
12
|
+
title: "Welcome to RPIKit v2",
|
|
13
13
|
body: `
|
|
14
14
|
${BOLD}Research → Plan → Implement${RESET}
|
|
15
15
|
|
|
16
|
-
RPIKit is a structured feature development workflow for Claude Code and Codex.
|
|
17
|
-
It guides you through
|
|
18
|
-
you plan, and plan before you code.
|
|
16
|
+
RPIKit v2 is a structured feature development workflow for Claude Code and Codex.
|
|
17
|
+
It guides you through ${CYAN}7 phases${RESET} with validation gates, delta specs, and
|
|
18
|
+
knowledge compounding — so you research before you plan, and plan before you code.
|
|
19
19
|
|
|
20
|
-
${DIM}
|
|
21
|
-
|
|
20
|
+
${DIM}13 named agents simulate a product team:
|
|
21
|
+
Luna (Analyst), Atlas (Explorer), Scout (Researcher), Forge (Builder),
|
|
22
|
+
Hawk (Reviewer), Shield (Security), Quill (Doc Writer), and more.${RESET}`,
|
|
22
23
|
},
|
|
23
24
|
{
|
|
24
|
-
title: "The Pipeline",
|
|
25
|
+
title: "The 7-Phase Pipeline",
|
|
25
26
|
body: `
|
|
26
|
-
${DIM}Your feature flows through
|
|
27
|
+
${DIM}Your feature flows through 7 phases:${RESET}
|
|
27
28
|
|
|
28
29
|
${CYAN}/rpi:new${RESET} Describe your feature → ${BOLD}REQUEST.md${RESET}
|
|
29
30
|
│
|
|
30
31
|
${CYAN}/rpi:research${RESET} Parallel agent analysis → ${BOLD}RESEARCH.md${RESET} + GO/NO-GO
|
|
31
32
|
│
|
|
32
|
-
${CYAN}/rpi:plan${RESET} Generate specs + tasks → ${BOLD}PLAN.md${RESET} + eng/pm/ux.md
|
|
33
|
+
${CYAN}/rpi:plan${RESET} Generate delta specs + tasks → ${BOLD}PLAN.md${RESET} + eng/pm/ux.md
|
|
33
34
|
│
|
|
34
35
|
${CYAN}/rpi:implement${RESET} Execute tasks with tracking → ${BOLD}IMPLEMENT.md${RESET}
|
|
35
36
|
│
|
|
@@ -37,25 +38,34 @@ ${DIM}Your feature flows through these phases:${RESET}
|
|
|
37
38
|
│
|
|
38
39
|
${CYAN}/rpi:review${RESET} Review against plan → PASS / FAIL
|
|
39
40
|
│
|
|
40
|
-
${CYAN}/rpi:docs${RESET} Document the code →
|
|
41
|
+
${CYAN}/rpi:docs${RESET} Document the code → ${BOLD}DOCS.md${RESET} + changelog
|
|
42
|
+
|
|
43
|
+
${DIM}Plus: /rpi:learn for knowledge compounding, /rpi:archive to wrap up.${RESET}`,
|
|
41
44
|
},
|
|
42
45
|
{
|
|
43
|
-
title: "
|
|
46
|
+
title: "Key v2 Concepts",
|
|
44
47
|
body: `
|
|
45
|
-
${
|
|
46
|
-
|
|
47
|
-
${
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
${DIM}
|
|
48
|
+
${BOLD}Delta Specs${RESET}
|
|
49
|
+
${DIM}Specs capture system state. Features only record what changes:${RESET}
|
|
50
|
+
rpi/specs/ ${DIM}Source of truth${RESET}
|
|
51
|
+
rpi/features/{slug}/delta/
|
|
52
|
+
├── ADDED/ ${DIM}New spec files${RESET}
|
|
53
|
+
├── MODIFIED/ ${DIM}Changes to existing specs${RESET}
|
|
54
|
+
└── REMOVED/ ${DIM}Specs being deleted${RESET}
|
|
55
|
+
|
|
56
|
+
${BOLD}Knowledge Compounding${RESET}
|
|
57
|
+
${DIM}A persistent knowledge base that grows with every feature:${RESET}
|
|
58
|
+
${CYAN}/rpi:learn${RESET} ${DIM}Manually capture lessons${RESET}
|
|
59
|
+
${CYAN}/rpi:archive${RESET} ${DIM}Merge delta into specs, clean up${RESET}
|
|
60
|
+
|
|
61
|
+
${DIM}Scout checks past solutions before external research.${RESET}`,
|
|
52
62
|
},
|
|
53
63
|
{
|
|
54
64
|
title: "Feature Folder Structure",
|
|
55
65
|
body: `
|
|
56
66
|
${DIM}Each feature gets its own folder with all artifacts:${RESET}
|
|
57
67
|
|
|
58
|
-
rpi/
|
|
68
|
+
rpi/features/
|
|
59
69
|
└── ${BOLD}your-feature/${RESET}
|
|
60
70
|
├── REQUEST.md ${DIM}What and why${RESET}
|
|
61
71
|
├── research/
|
|
@@ -65,24 +75,32 @@ ${DIM}Each feature gets its own folder with all artifacts:${RESET}
|
|
|
65
75
|
│ ├── eng.md ${DIM}Technical spec${RESET}
|
|
66
76
|
│ ├── pm.md ${DIM}Product requirements${RESET}
|
|
67
77
|
│ └── ux.md ${DIM}UX design${RESET}
|
|
78
|
+
├── delta/ ${DIM}What changes (specs diff)${RESET}
|
|
79
|
+
│ ├── ADDED/
|
|
80
|
+
│ ├── MODIFIED/
|
|
81
|
+
│ └── REMOVED/
|
|
68
82
|
└── implement/
|
|
69
83
|
├── IMPLEMENT.md ${DIM}Execution audit trail${RESET}
|
|
70
84
|
└── DOCS.md ${DIM}Documentation summary${RESET}`,
|
|
71
85
|
},
|
|
72
86
|
{
|
|
73
|
-
title: "
|
|
87
|
+
title: "Quick Flow & Flags",
|
|
74
88
|
body: `
|
|
75
|
-
${
|
|
89
|
+
${BOLD}Quick Flow${RESET} ${DIM}— for small features${RESET}
|
|
90
|
+
|
|
91
|
+
${CYAN}/rpi:new my-feature --quick${RESET}
|
|
92
|
+
|
|
93
|
+
Luna asks 1-2 questions → compact REQUEST.md → Forge implements
|
|
94
|
+
directly with a mini-plan (3-5 tasks). Skips research and full plan.
|
|
76
95
|
|
|
77
|
-
|
|
78
|
-
${GREEN}GREEN${RESET} → Write minimal code to pass
|
|
79
|
-
${YELLOW}REFACTOR${RESET} → Clean up, re-run tests
|
|
96
|
+
${BOLD}Global Flags${RESET}
|
|
80
97
|
|
|
81
|
-
${
|
|
82
|
-
|
|
83
|
-
|
|
98
|
+
${GREEN}--quick${RESET} Skip research + full plan
|
|
99
|
+
${YELLOW}--force${RESET} Re-run a phase even if artifacts exist
|
|
100
|
+
${CYAN}--skip=phase${RESET} Skip specific phase(s)
|
|
101
|
+
${CYAN}--from=phase${RESET} Start from a specific phase
|
|
84
102
|
|
|
85
|
-
${DIM}
|
|
103
|
+
${DIM}TDD is also supported — enable in .rpi.yaml with tdd: true${RESET}`,
|
|
86
104
|
},
|
|
87
105
|
{
|
|
88
106
|
title: "Get Started",
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: rpi:archive
|
|
3
|
+
description: Merge delta specs into main specs and clean up the feature directory.
|
|
4
|
+
argument-hint: "<feature-name>"
|
|
5
|
+
allowed-tools:
|
|
6
|
+
- Read
|
|
7
|
+
- Write
|
|
8
|
+
- Bash
|
|
9
|
+
- Glob
|
|
10
|
+
- Grep
|
|
11
|
+
- Agent
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# /rpi:archive — Archive Feature
|
|
15
|
+
|
|
16
|
+
Merge the feature's delta specs into the main `rpi/specs/` directory, preserve any solutions worth saving, and delete the feature directory. History is preserved in git.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Step 1: Load config and validate
|
|
21
|
+
|
|
22
|
+
1. Read `.rpi.yaml` for config. Apply defaults if missing:
|
|
23
|
+
- `folder`: `rpi/features`
|
|
24
|
+
- `specs_dir`: `rpi/specs`
|
|
25
|
+
- `solutions_dir`: `rpi/solutions`
|
|
26
|
+
2. Parse `$ARGUMENTS` to extract `{slug}`.
|
|
27
|
+
3. Validate `rpi/features/{slug}/` exists. If not:
|
|
28
|
+
```
|
|
29
|
+
Feature '{slug}' not found. Nothing to archive.
|
|
30
|
+
```
|
|
31
|
+
Stop.
|
|
32
|
+
|
|
33
|
+
## Step 2: Validate review verdict
|
|
34
|
+
|
|
35
|
+
1. Read `rpi/features/{slug}/implement/IMPLEMENT.md`.
|
|
36
|
+
2. Look for a `## Review` section with a verdict of `PASS` or `PASS with concerns`.
|
|
37
|
+
3. If verdict is `FAIL`:
|
|
38
|
+
```
|
|
39
|
+
Review verdict is FAIL for '{slug}'.
|
|
40
|
+
Fix the issues and re-run: /rpi:review {slug}
|
|
41
|
+
Cannot archive a feature that hasn't passed review.
|
|
42
|
+
```
|
|
43
|
+
Stop.
|
|
44
|
+
4. If no review section or verdict is found:
|
|
45
|
+
```
|
|
46
|
+
No review verdict found for '{slug}'.
|
|
47
|
+
Run /rpi:review {slug} before archiving.
|
|
48
|
+
```
|
|
49
|
+
Stop.
|
|
50
|
+
|
|
51
|
+
## Step 3: Read delta contents
|
|
52
|
+
|
|
53
|
+
1. Scan `rpi/features/{slug}/delta/ADDED/` for all files — store as `$ADDED_FILES`.
|
|
54
|
+
2. Scan `rpi/features/{slug}/delta/MODIFIED/` for all files — store as `$MODIFIED_FILES`.
|
|
55
|
+
3. Scan `rpi/features/{slug}/delta/REMOVED/` for all files — store as `$REMOVED_FILES`.
|
|
56
|
+
4. Read the contents of each file found.
|
|
57
|
+
|
|
58
|
+
If all three directories are empty:
|
|
59
|
+
```
|
|
60
|
+
No delta specs found for '{slug}'. Skipping specs merge.
|
|
61
|
+
```
|
|
62
|
+
Proceed to Step 5.
|
|
63
|
+
|
|
64
|
+
## Step 4: Launch Nexus to merge delta into specs
|
|
65
|
+
|
|
66
|
+
Use the Agent tool to launch Nexus for the merge:
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
You are Nexus. Merge the delta specs for feature '{slug}' into the main specs directory.
|
|
70
|
+
|
|
71
|
+
## ADDED Files (copy to rpi/specs/)
|
|
72
|
+
{for each file in $ADDED_FILES: filename and full contents}
|
|
73
|
+
|
|
74
|
+
## MODIFIED Files (apply changes to existing rpi/specs/ files)
|
|
75
|
+
{for each file in $MODIFIED_FILES: filename, delta contents, and current contents of the target spec file in rpi/specs/}
|
|
76
|
+
|
|
77
|
+
## REMOVED Files (delete from rpi/specs/)
|
|
78
|
+
{for each file in $REMOVED_FILES: filename}
|
|
79
|
+
|
|
80
|
+
Your task:
|
|
81
|
+
1. For each ADDED file: determine the correct path under rpi/specs/ and write the file there.
|
|
82
|
+
- Use the file's content as-is. Preserve the directory structure (e.g. delta/ADDED/auth/oauth.md → rpi/specs/auth/oauth.md).
|
|
83
|
+
2. For each MODIFIED file: read the current spec at rpi/specs/{path}, apply the changes from the delta version.
|
|
84
|
+
- The delta file contains the updated version of the spec. Merge it intelligently:
|
|
85
|
+
- Preserve any sections in the original that aren't addressed by the delta
|
|
86
|
+
- Update sections that the delta modifies
|
|
87
|
+
- Add new sections from the delta
|
|
88
|
+
3. For each REMOVED file: note the path under rpi/specs/ that should be deleted.
|
|
89
|
+
|
|
90
|
+
Output format:
|
|
91
|
+
## Merge Plan
|
|
92
|
+
### Files to Write
|
|
93
|
+
- {path}: {action: created | updated} — {brief description}
|
|
94
|
+
|
|
95
|
+
### Files to Delete
|
|
96
|
+
- {path} — {reason}
|
|
97
|
+
|
|
98
|
+
### Warnings
|
|
99
|
+
- {any conflicts or issues detected}
|
|
100
|
+
(or "No warnings.")
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Store the output as `$NEXUS_MERGE`.
|
|
104
|
+
|
|
105
|
+
After Nexus responds, execute the merge plan:
|
|
106
|
+
1. **ADDED**: Write each file to `rpi/specs/{path}` (create directories as needed).
|
|
107
|
+
2. **MODIFIED**: Write the merged content to `rpi/specs/{path}`.
|
|
108
|
+
3. **REMOVED**: Delete the files from `rpi/specs/`.
|
|
109
|
+
|
|
110
|
+
## Step 5: Check for solutions worth saving
|
|
111
|
+
|
|
112
|
+
1. Read `rpi/features/{slug}/implement/IMPLEMENT.md` for the review section.
|
|
113
|
+
2. If the review flagged solutions saved to `rpi/solutions/`:
|
|
114
|
+
- Verify each referenced solution file exists in `rpi/solutions/`.
|
|
115
|
+
- If any are missing, warn:
|
|
116
|
+
```
|
|
117
|
+
Warning: Solution '{path}' referenced in review but not found.
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## Step 6: Delete feature directory
|
|
121
|
+
|
|
122
|
+
Remove the entire feature directory:
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
rm -rf rpi/features/{slug}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Step 7: Commit
|
|
129
|
+
|
|
130
|
+
Stage all changes and commit:
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
git add -A
|
|
134
|
+
git commit -m "chore: archive {slug} — delta merged, feature complete"
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Step 8: Output summary
|
|
138
|
+
|
|
139
|
+
```
|
|
140
|
+
Archive complete: {slug}
|
|
141
|
+
|
|
142
|
+
Specs merged:
|
|
143
|
+
- Added: {N} files
|
|
144
|
+
- Modified: {N} files
|
|
145
|
+
- Removed: {N} files
|
|
146
|
+
|
|
147
|
+
Feature directory deleted: rpi/features/{slug}/
|
|
148
|
+
History preserved in git.
|
|
149
|
+
```
|