red-proto 0.11.0 → 0.13.2
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/README.md +56 -23
- package/bin/install.js +138 -32
- package/commands/red:proto-architect.md +3 -20
- package/commands/red:proto-dev-setup.md +6 -9
- package/commands/red:proto-dev.md +3 -4
- package/commands/red:proto-flows.md +4 -18
- package/commands/red:proto-qa.md +2 -2
- package/commands/red:proto-requirements.md +3 -18
- package/commands/red:proto-research.md +3 -47
- package/commands/red:proto-sparring.md +5 -34
- package/commands/red:proto-ux.md +3 -20
- package/design-system/INDEX.md +50 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -4,19 +4,9 @@ Ein KI-gestütztes Product Development Framework für [Claude Code](https://clau
|
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
## Workflow
|
|
8
|
-
|
|
9
|
-

|
|
10
|
-
|
|
11
|
-
> Maschinenlesbare BPMN 2.0 Datei: [workflow.bpmn](docs/workflow.bpmn) – öffenbar in [Camunda Modeler](https://camunda.com/download/modeler/) oder [bpmn.io](https://bpmn.io)
|
|
12
|
-
|
|
13
|
-
**Faustregel:** Alles bis `/red:proto-flows` machst du einmal für dein Projekt. Ab `/red:proto-ux` wiederholst du den Loop für jedes Feature. `proto-dev` und `proto-qa` laufen in **getrennten Sessions** – `proto-dev` schreibt am Ende ein Handoff-File, das `proto-qa` in der neuen Session einliest.
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
7
|
## Was ist das?
|
|
18
8
|
|
|
19
|
-
Eine Sammlung von Claude Code Commands
|
|
9
|
+
Eine Sammlung von Claude Code Commands, die eine vollständige Produktentwicklungs-Pipeline abbilden. Du beschreibst deine Idee in natürlicher Sprache – Claude führt die Pipeline aus, du triffst die Entscheidungen.
|
|
20
10
|
|
|
21
11
|
```
|
|
22
12
|
/red:proto-workflow → Nach jeder Pause: zeigt exakt wo du stehst und was als nächstes zu tun ist
|
|
@@ -37,7 +27,51 @@ dann pro Feature (Build-Loop bis QA grün):
|
|
|
37
27
|
└── Bugs? → neue Session → /red:proto-dev → /red:proto-qa
|
|
38
28
|
```
|
|
39
29
|
|
|
40
|
-
Jeder Command ist eigenständig – du kannst an jedem Punkt einsteigen oder aufhören. Die Commands bauen
|
|
30
|
+
Jeder Command ist eigenständig – du kannst an jedem Punkt einsteigen oder aufhören. Die Commands bauen aufeinander auf: jeder liest den Output des vorherigen und ergänzt die gemeinsamen Artefakte.
|
|
31
|
+
|
|
32
|
+
### Workflow
|
|
33
|
+
|
|
34
|
+
```mermaid
|
|
35
|
+
flowchart TD
|
|
36
|
+
A([Idee]) --> B
|
|
37
|
+
|
|
38
|
+
subgraph setup["📐 Einmalig pro Projekt"]
|
|
39
|
+
B["/red:proto-sparring\nIdee → PRD"]
|
|
40
|
+
B --> C["/red:proto-dev-setup\nTech-Stack + GitHub"]
|
|
41
|
+
C --> D{Research?}
|
|
42
|
+
D -->|optional| E["/red:proto-research\nPersonas + Problem Statement"]
|
|
43
|
+
D -->|überspringen| F
|
|
44
|
+
E --> F["/red:proto-requirements\nSpecs für alle Features"]
|
|
45
|
+
F --> G["/red:proto-flows\nScreen-Inventar + Transitions"]
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
subgraph feature["🔁 Pro Feature wiederholen"]
|
|
49
|
+
G --> H["/red:proto-ux\nUX-Entscheidungen"]
|
|
50
|
+
H --> I["/red:proto-architect\nTech-Design + Security + Tests"]
|
|
51
|
+
I --> J
|
|
52
|
+
|
|
53
|
+
subgraph session1["Session 1"]
|
|
54
|
+
J["/red:proto-dev\nImplementierung"]
|
|
55
|
+
J --> J2["Handoff schreiben\ncontext/FEAT-x-dev-handoff.md"]
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
subgraph session2["Session 2 (neu starten)"]
|
|
59
|
+
J2 --> K["/red:proto-qa\nTests + Bugs"]
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
K --> L{Bugs?}
|
|
63
|
+
L -->|Critical / High| J
|
|
64
|
+
L -->|Grün ✅| M([Production-Ready])
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
M --> N{Weitere Features?}
|
|
68
|
+
N -->|ja| H
|
|
69
|
+
N -->|nein| O([Release 🎉])
|
|
70
|
+
|
|
71
|
+
P(["/red:proto-workflow\nOrientierung jederzeit"]) -.->|wo stehe ich?| feature
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**Faustregel:** Alles bis `/red:proto-flows` machst du einmal für dein Projekt. Ab `/red:proto-ux` wiederholst du den Loop für jedes Feature. `proto-dev` und `proto-qa` laufen in **getrennten Sessions** – `proto-dev` schreibt am Ende ein Handoff-File, das `proto-qa` in der neuen Session einliest.
|
|
41
75
|
|
|
42
76
|
---
|
|
43
77
|
|
|
@@ -65,8 +99,18 @@ Der Installer fragt interaktiv:
|
|
|
65
99
|
- **Global** (`~/.claude/`) → Commands in allen Projekten verfügbar
|
|
66
100
|
- **Lokal** (`./.claude/`) → nur im aktuellen Verzeichnis
|
|
67
101
|
|
|
102
|
+
> **Hinweis:** Nicht global und lokal gleichzeitig installieren – Claude Code zeigt die Commands sonst doppelt an. Der Installer warnt dich, wenn eine andere Installation erkannt wird.
|
|
103
|
+
|
|
68
104
|
> **Update:** Denselben Befehl erneut ausführen – der Installer erkennt bestehende Installationen.
|
|
69
105
|
|
|
106
|
+
**Deinstallieren:**
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
npx red-proto --uninstall
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Entfernt alle Commands und Agents – deine Projektdateien (`features/`, `research/`, `prd.md` usw.) bleiben unangetastet.
|
|
113
|
+
|
|
70
114
|
**Option B – Manuell via Git (falls kein npx):**
|
|
71
115
|
|
|
72
116
|
```bash
|
|
@@ -105,17 +149,6 @@ Dann in Claude Code:
|
|
|
105
149
|
|
|
106
150
|
---
|
|
107
151
|
|
|
108
|
-
### Kurzübersicht: Was macht was?
|
|
109
|
-
|
|
110
|
-
| Befehl | Wann | Was passiert |
|
|
111
|
-
|--------|------|--------------|
|
|
112
|
-
| `npx red-proto@latest` | Einmalig pro Computer | Installiert Commands in `~/.claude/` (global) oder `./.claude/` (lokal) |
|
|
113
|
-
| `/red:proto` | Einmalig pro Projekt | Legt Projektstruktur an, kopiert Design System |
|
|
114
|
-
| `/red:proto-sparring` | Start jedes Projekts | Erste Anlaufstelle – Idee zu PRD |
|
|
115
|
-
| `/red:proto-workflow` | Nach jeder Session-Pause | Zeigt wo du stehst, was als nächstes kommt |
|
|
116
|
-
|
|
117
|
-
---
|
|
118
|
-
|
|
119
152
|
## Was wird installiert?
|
|
120
153
|
|
|
121
154
|
Nach dem Setup hat dein Projekt folgende Struktur:
|
package/bin/install.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
import { createInterface } from 'readline';
|
|
4
|
-
import { cp, mkdir, access } from 'fs/promises';
|
|
4
|
+
import { cp, mkdir, rm, access } from 'fs/promises';
|
|
5
5
|
import { join, dirname } from 'path';
|
|
6
6
|
import { fileURLToPath } from 'url';
|
|
7
7
|
import { homedir } from 'os';
|
|
8
|
-
import { createReadStream } from 'fs';
|
|
9
8
|
|
|
10
9
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
11
10
|
const PACKAGE_ROOT = join(__dirname, '..');
|
|
@@ -21,6 +20,27 @@ const c = {
|
|
|
21
20
|
dim: (s) => `\x1b[2m${s}\x1b[0m`,
|
|
22
21
|
};
|
|
23
22
|
|
|
23
|
+
const COMMAND_FILES = [
|
|
24
|
+
'red:proto.md',
|
|
25
|
+
'red:proto-workflow.md',
|
|
26
|
+
'red:proto-sparring.md',
|
|
27
|
+
'red:proto-dev-setup.md',
|
|
28
|
+
'red:proto-research.md',
|
|
29
|
+
'red:proto-requirements.md',
|
|
30
|
+
'red:proto-flows.md',
|
|
31
|
+
'red:proto-ux.md',
|
|
32
|
+
'red:proto-architect.md',
|
|
33
|
+
'red:proto-dev.md',
|
|
34
|
+
'red:proto-qa.md',
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
const AGENT_FILES = [
|
|
38
|
+
'frontend-developer.md',
|
|
39
|
+
'backend-developer.md',
|
|
40
|
+
'qa-engineer.md',
|
|
41
|
+
'ux-reviewer.md',
|
|
42
|
+
];
|
|
43
|
+
|
|
24
44
|
async function exists(path) {
|
|
25
45
|
try { await access(path); return true; }
|
|
26
46
|
catch { return false; }
|
|
@@ -46,9 +66,98 @@ function printHeader(version) {
|
|
|
46
66
|
console.log('');
|
|
47
67
|
}
|
|
48
68
|
|
|
49
|
-
// ───
|
|
69
|
+
// ─── Uninstall ───────────────────────────────────────────────────────────────
|
|
70
|
+
|
|
71
|
+
async function runUninstall() {
|
|
72
|
+
const { version } = JSON.parse(
|
|
73
|
+
await import('fs').then(fs => fs.promises.readFile(join(PACKAGE_ROOT, 'package.json'), 'utf8'))
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
printHeader(version);
|
|
77
|
+
|
|
78
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
79
|
+
|
|
80
|
+
console.log(c.yellow(' Uninstall – where was red · proto installed?'));
|
|
81
|
+
console.log('');
|
|
82
|
+
|
|
83
|
+
const globalBase = join(homedir(), '.claude');
|
|
84
|
+
const localBase = join(process.cwd(), '.claude');
|
|
85
|
+
|
|
86
|
+
const globalExists = await exists(join(globalBase, 'commands', 'red:proto.md'));
|
|
87
|
+
const localExists = await exists(join(localBase, 'commands', 'red:proto.md'));
|
|
88
|
+
|
|
89
|
+
if (!globalExists && !localExists) {
|
|
90
|
+
console.log(c.dim(' red · proto is not installed in this location.'));
|
|
91
|
+
console.log('');
|
|
92
|
+
rl.close();
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const options = [];
|
|
97
|
+
if (globalExists) options.push({ label: `Global ${c.dim('(~/.claude)')}`, base: globalBase });
|
|
98
|
+
if (localExists) options.push({ label: `Local ${c.dim('(./.claude)')}`, base: localBase });
|
|
99
|
+
|
|
100
|
+
options.forEach((opt, i) => {
|
|
101
|
+
console.log(` ${i + 1}) ${c.bold(opt.label)}`);
|
|
102
|
+
});
|
|
103
|
+
if (options.length > 1) {
|
|
104
|
+
console.log(` ${options.length + 1}) ${c.bold('Both')}`);
|
|
105
|
+
}
|
|
106
|
+
console.log('');
|
|
107
|
+
|
|
108
|
+
const max = options.length > 1 ? options.length + 1 : options.length;
|
|
109
|
+
let choice = '';
|
|
110
|
+
while (!Array.from({ length: max }, (_, i) => String(i + 1)).includes(choice)) {
|
|
111
|
+
choice = (await ask(rl, c.dim(' Choice [1]: '))).trim() || '1';
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const targets =
|
|
115
|
+
options.length > 1 && choice === String(options.length + 1)
|
|
116
|
+
? options
|
|
117
|
+
: [options[parseInt(choice) - 1]];
|
|
118
|
+
|
|
119
|
+
console.log('');
|
|
120
|
+
console.log(c.yellow(' ⚠ This will remove all red:proto commands and agents.'));
|
|
121
|
+
console.log(c.dim(' Your project files (features/, research/, prd.md, …) are NOT touched.'));
|
|
122
|
+
console.log('');
|
|
123
|
+
|
|
124
|
+
const confirm = (await ask(rl, c.dim(' Type "yes" to confirm: '))).trim().toLowerCase();
|
|
125
|
+
rl.close();
|
|
126
|
+
|
|
127
|
+
if (confirm !== 'yes') {
|
|
128
|
+
console.log('');
|
|
129
|
+
console.log(c.dim(' Aborted. Nothing changed.'));
|
|
130
|
+
console.log('');
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
let removed = 0;
|
|
135
|
+
for (const target of targets) {
|
|
136
|
+
for (const file of COMMAND_FILES) {
|
|
137
|
+
const path = join(target.base, 'commands', file);
|
|
138
|
+
if (await exists(path)) { await rm(path); removed++; }
|
|
139
|
+
}
|
|
140
|
+
for (const file of AGENT_FILES) {
|
|
141
|
+
const path = join(target.base, 'agents', file);
|
|
142
|
+
if (await exists(path)) { await rm(path); removed++; }
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
console.log('');
|
|
147
|
+
console.log(c.green(` ✓ ${removed} file(s) removed`));
|
|
148
|
+
console.log(c.dim(' red · proto has been uninstalled.'));
|
|
149
|
+
console.log('');
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// ─── Install ─────────────────────────────────────────────────────────────────
|
|
50
153
|
|
|
51
154
|
async function main() {
|
|
155
|
+
const args = process.argv.slice(2);
|
|
156
|
+
|
|
157
|
+
if (args.includes('--uninstall') || args.includes('-u')) {
|
|
158
|
+
return runUninstall();
|
|
159
|
+
}
|
|
160
|
+
|
|
52
161
|
const { version } = JSON.parse(
|
|
53
162
|
await import('fs').then(fs => fs.promises.readFile(join(PACKAGE_ROOT, 'package.json'), 'utf8'))
|
|
54
163
|
);
|
|
@@ -76,6 +185,28 @@ async function main() {
|
|
|
76
185
|
const claudeBase = isGlobal ? join(homedir(), '.claude') : join(process.cwd(), '.claude');
|
|
77
186
|
const label = isGlobal ? `~/.claude` : `./.claude`;
|
|
78
187
|
|
|
188
|
+
// ── Duplicate detection ────────────────────────────────────────────────────
|
|
189
|
+
const globalBase = join(homedir(), '.claude');
|
|
190
|
+
const localBase = join(process.cwd(), '.claude');
|
|
191
|
+
const otherBase = isGlobal ? localBase : globalBase;
|
|
192
|
+
const otherLabel = isGlobal ? './.claude' : '~/.claude';
|
|
193
|
+
|
|
194
|
+
const otherInstalled = await exists(join(otherBase, 'commands', 'red:proto.md'));
|
|
195
|
+
if (otherInstalled) {
|
|
196
|
+
console.log('');
|
|
197
|
+
console.log(c.yellow(` ⚠ red · proto is already installed in ${otherLabel}`));
|
|
198
|
+
console.log(c.dim(` Installing in both locations will show every command twice in Claude Code.`));
|
|
199
|
+
console.log('');
|
|
200
|
+
const proceed = (await ask(rl, c.dim(' Continue anyway? [y/N]: '))).trim().toLowerCase();
|
|
201
|
+
if (proceed !== 'y') {
|
|
202
|
+
console.log('');
|
|
203
|
+
console.log(c.dim(' Aborted. Nothing changed.'));
|
|
204
|
+
console.log('');
|
|
205
|
+
rl.close();
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
79
210
|
console.log('');
|
|
80
211
|
|
|
81
212
|
// ── Step 2: Confirm if already installed ──────────────────────────────────
|
|
@@ -144,53 +275,28 @@ async function installFiles(claudeBase, isGlobal, noClobber) {
|
|
|
144
275
|
const agentsDir = join(claudeBase, 'agents');
|
|
145
276
|
const projectRoot = process.cwd();
|
|
146
277
|
|
|
147
|
-
// Create dirs
|
|
148
278
|
await mkdir(commandsDir, { recursive: true });
|
|
149
279
|
await mkdir(agentsDir, { recursive: true });
|
|
150
280
|
|
|
151
281
|
const copyOpts = { recursive: true, force: !noClobber, errorOnExist: false };
|
|
152
282
|
|
|
153
|
-
// Commands
|
|
154
283
|
const srcCommands = join(PACKAGE_ROOT, 'commands');
|
|
155
|
-
const files = [
|
|
156
|
-
'red:proto.md',
|
|
157
|
-
'red:proto-workflow.md',
|
|
158
|
-
'red:proto-sparring.md',
|
|
159
|
-
'red:proto-dev-setup.md',
|
|
160
|
-
'red:proto-research.md',
|
|
161
|
-
'red:proto-requirements.md',
|
|
162
|
-
'red:proto-flows.md',
|
|
163
|
-
'red:proto-ux.md',
|
|
164
|
-
'red:proto-architect.md',
|
|
165
|
-
'red:proto-dev.md',
|
|
166
|
-
'red:proto-qa.md',
|
|
167
|
-
];
|
|
168
|
-
|
|
169
284
|
let copied = 0;
|
|
170
285
|
let skipped = 0;
|
|
171
286
|
|
|
172
|
-
for (const file of
|
|
287
|
+
for (const file of COMMAND_FILES) {
|
|
173
288
|
const dest = join(commandsDir, file);
|
|
174
289
|
const alreadyExists = await exists(dest);
|
|
175
|
-
if (noClobber && alreadyExists) {
|
|
176
|
-
skipped++;
|
|
177
|
-
continue;
|
|
178
|
-
}
|
|
290
|
+
if (noClobber && alreadyExists) { skipped++; continue; }
|
|
179
291
|
await cp(join(srcCommands, file), dest);
|
|
180
292
|
copied++;
|
|
181
293
|
}
|
|
182
294
|
|
|
183
|
-
// Agents
|
|
184
295
|
const srcAgents = join(PACKAGE_ROOT, 'agents');
|
|
185
|
-
const
|
|
186
|
-
|
|
187
|
-
for (const file of agents) {
|
|
296
|
+
for (const file of AGENT_FILES) {
|
|
188
297
|
const dest = join(agentsDir, file);
|
|
189
298
|
const alreadyExists = await exists(dest);
|
|
190
|
-
if (noClobber && alreadyExists) {
|
|
191
|
-
skipped++;
|
|
192
|
-
continue;
|
|
193
|
-
}
|
|
299
|
+
if (noClobber && alreadyExists) { skipped++; continue; }
|
|
194
300
|
await cp(join(srcAgents, file), dest);
|
|
195
301
|
copied++;
|
|
196
302
|
}
|
|
@@ -134,35 +134,18 @@ AskUserQuestion({ questions: [{ question: "Passt das technische Design?", header
|
|
|
134
134
|
], multiSelect: false }] })
|
|
135
135
|
```
|
|
136
136
|
|
|
137
|
-
Nach Approval
|
|
138
|
-
|
|
139
|
-
Dann dem User sagen:
|
|
140
|
-
```
|
|
141
|
-
📝 Draft gespeichert: features/FEAT-[X]-[name].md
|
|
142
|
-
|
|
143
|
-
Öffne die Datei, prüfe das technische Design und bearbeite es direkt falls nötig.
|
|
144
|
-
|
|
145
|
-
→ Schreib `weiter` wenn alles passt
|
|
146
|
-
→ Oder sag mir direkt was geändert werden soll
|
|
147
|
-
```
|
|
137
|
+
Nach Approval: FEAT-[X].md um Abschnitt `## 3. Technisches Design` erweitern, YAML `status: draft` setzen. User per CONVENTIONS.md §Resume Pattern informieren.
|
|
148
138
|
|
|
149
139
|
## Phase 4b: Finalisieren
|
|
150
140
|
|
|
151
|
-
Nach `weiter` oder Korrekturen
|
|
152
|
-
|
|
153
|
-
1. FEAT-[X].md einlesen, Korrekturen übernehmen
|
|
154
|
-
2. YAML-Frontmatter auf `status: approved` setzen
|
|
155
|
-
3. `## Fortschritt` → `Status: Approved`, `Aktueller Schritt: Tech` setzen
|
|
156
|
-
4. STATUS.md aktualisieren (Tech-Spalte auf ✓ setzen)
|
|
157
|
-
5. Commit-Zusammenfassung zeigen und committen:
|
|
141
|
+
Nach `weiter` oder Korrekturen: FEAT-[X].md einlesen, Korrekturen übernehmen, `status: approved` + `## Fortschritt → Status: Approved, Aktueller Schritt: Tech` setzen. STATUS.md (Tech-Spalte ✓).
|
|
158
142
|
|
|
159
143
|
```bash
|
|
160
144
|
echo "Ich committe jetzt:"
|
|
161
145
|
echo " → features/FEAT-[X]-[name].md – Tech Design finalisiert"
|
|
162
146
|
echo " → features/STATUS.md – Tech-Status aktualisiert"
|
|
163
147
|
git add features/FEAT-[X]-*.md features/STATUS.md
|
|
164
|
-
git commit -m "docs: FEAT-[X] tech design – [Feature Name]"
|
|
165
|
-
git push
|
|
148
|
+
git commit -q -m "docs: FEAT-[X] tech design – [Feature Name]" && git push -q
|
|
166
149
|
```
|
|
167
150
|
|
|
168
151
|
## Routing nach Approval
|
|
@@ -84,7 +84,7 @@ Leite aus PRD-Signalen und Recherche eine **konkrete Empfehlung** ab. Präsentie
|
|
|
84
84
|
- Web-Technologie: **Electron** oder **Tauri** (leichtgewichtiger, Rust-basiert)
|
|
85
85
|
|
|
86
86
|
**Datenbank-Empfehlung** (unabhängig vom Framework):
|
|
87
|
-
- Standard (relational): **PostgreSQL via Neon** (
|
|
87
|
+
- Standard (relational): **PostgreSQL via Neon** (keine eigene Server-Verwaltung, kostenlos startbar)
|
|
88
88
|
- Echtzeit + Auth integriert: **Supabase**
|
|
89
89
|
- Dokument-basiert: **MongoDB**
|
|
90
90
|
- Kein persistentes Backend nötig: localStorage / kein DB
|
|
@@ -428,7 +428,7 @@ Installiere nur was das PRD tatsächlich braucht – keine spekulativen Packages
|
|
|
428
428
|
**Variante A – Nur Code versionieren:**
|
|
429
429
|
```bash
|
|
430
430
|
cd [codedir]
|
|
431
|
-
git init
|
|
431
|
+
git init -q -b main
|
|
432
432
|
cat > .gitignore << 'EOF'
|
|
433
433
|
node_modules/
|
|
434
434
|
.env
|
|
@@ -445,14 +445,13 @@ target/
|
|
|
445
445
|
bin/
|
|
446
446
|
obj/
|
|
447
447
|
EOF
|
|
448
|
-
git add .
|
|
449
|
-
git commit -m "chore: initial scaffold ([Stack])"
|
|
448
|
+
git add . && git commit -q -m "chore: initial scaffold ([Stack])"
|
|
450
449
|
```
|
|
451
450
|
|
|
452
451
|
**Variante B – Alles versionieren (Code + Projektdokumentation):**
|
|
453
452
|
```bash
|
|
454
453
|
# Im Projekt-Root:
|
|
455
|
-
git init
|
|
454
|
+
git init -q -b main
|
|
456
455
|
cat > .gitignore << 'EOF'
|
|
457
456
|
node_modules/
|
|
458
457
|
.env
|
|
@@ -469,8 +468,7 @@ target/
|
|
|
469
468
|
bin/
|
|
470
469
|
obj/
|
|
471
470
|
EOF
|
|
472
|
-
git add .
|
|
473
|
-
git commit -m "chore: project setup – PRD + [Stack] scaffold"
|
|
471
|
+
git add . && git commit -q -m "chore: project setup – PRD + [Stack] scaffold"
|
|
474
472
|
```
|
|
475
473
|
|
|
476
474
|
Danach in beiden Varianten: initialen Tag setzen:
|
|
@@ -495,8 +493,7 @@ gh repo create [repo-name] \
|
|
|
495
493
|
--description "[Vision-Satz aus prd.md]"
|
|
496
494
|
|
|
497
495
|
# Erst pushen, dann Tags:
|
|
498
|
-
git push -u origin main
|
|
499
|
-
git push origin --tags
|
|
496
|
+
git push -q -u origin main && git push -q origin --tags
|
|
500
497
|
```
|
|
501
498
|
|
|
502
499
|
Zeige dem User die Repository-URL.
|
|
@@ -111,7 +111,7 @@ grep -r "[geänderte Funktion]" [Codeverzeichnis]/ --include="*.tsx" --include="
|
|
|
111
111
|
|
|
112
112
|
Nach allen Fixes:
|
|
113
113
|
```bash
|
|
114
|
-
git add . && git commit -m "fix: FEAT-[X] – [Zusammenfassung]" && git push
|
|
114
|
+
git add . && git commit -q -m "fix: FEAT-[X] – [Zusammenfassung]" && git push -q
|
|
115
115
|
```
|
|
116
116
|
|
|
117
117
|
## Phase 4.5: Selbstcheck vor Review
|
|
@@ -159,8 +159,7 @@ Status auf "Dev" setzen. STATUS.md aktualisieren.
|
|
|
159
159
|
|
|
160
160
|
```bash
|
|
161
161
|
git add . features/STATUS.md
|
|
162
|
-
git commit -m "feat: implement FEAT-[X] – [Feature Name]"
|
|
163
|
-
git push
|
|
162
|
+
git commit -q -m "feat: implement FEAT-[X] – [Feature Name]" && git push -q
|
|
164
163
|
```
|
|
165
164
|
|
|
166
165
|
## Phase 7: Handoff schreiben
|
|
@@ -190,7 +189,7 @@ Schreibe `context/FEAT-[ID]-dev-handoff.md` (legt Kontext für `/red:proto-qa` i
|
|
|
190
189
|
```bash
|
|
191
190
|
mkdir -p context
|
|
192
191
|
git add context/FEAT-[ID]-dev-handoff.md
|
|
193
|
-
git commit -m "docs: FEAT-[X] dev handoff" && git push
|
|
192
|
+
git commit -q -m "docs: FEAT-[X] dev handoff" && git push -q
|
|
194
193
|
```
|
|
195
194
|
|
|
196
195
|
Sage: "Implementierung abgeschlossen. Handoff geschrieben. **Starte eine neue Session** und führe dort `/red:proto-qa FEAT-[ID]` aus. Nach einer Pause: `/red:proto-workflow` zeigt dir exakt wo du stehst."
|
|
@@ -114,7 +114,7 @@ AskUserQuestion({
|
|
|
114
114
|
multiSelect: false
|
|
115
115
|
},
|
|
116
116
|
{
|
|
117
|
-
question: "Gibt es weitere Einstiegspunkte (z.B. nach Login, nach Onboarding, per
|
|
117
|
+
question: "Gibt es weitere Einstiegspunkte (z.B. nach Login, nach Onboarding, oder per direktem Link z.B. aus einer E-Mail)?",
|
|
118
118
|
header: "Weitere Einstiege",
|
|
119
119
|
options: [
|
|
120
120
|
{ label: "Nein, nur ein Einstieg", description: "" },
|
|
@@ -224,31 +224,17 @@ AskUserQuestion({
|
|
|
224
224
|
})
|
|
225
225
|
```
|
|
226
226
|
|
|
227
|
-
Nach Approval
|
|
228
|
-
|
|
229
|
-
```
|
|
230
|
-
📝 Draft gespeichert: flows/product-flows.md
|
|
231
|
-
|
|
232
|
-
Öffne die Datei, prüfe alle Screens und Transitions und bearbeite direkt falls nötig.
|
|
233
|
-
|
|
234
|
-
→ Schreib `weiter` wenn alles passt
|
|
235
|
-
→ Oder sag mir direkt was geändert werden soll
|
|
236
|
-
```
|
|
227
|
+
Nach Approval: `flows/product-flows.md` ist bereits als Draft gespeichert (Phase 5). User per CONVENTIONS.md §Resume Pattern informieren.
|
|
237
228
|
|
|
238
229
|
## Phase 6b: Finalisieren
|
|
239
230
|
|
|
240
|
-
Nach `weiter` oder Korrekturen
|
|
241
|
-
|
|
242
|
-
1. flows/product-flows.md einlesen, Korrekturen übernehmen
|
|
243
|
-
2. YAML-Frontmatter auf `status: approved` setzen
|
|
244
|
-
3. Commit-Zusammenfassung zeigen und committen:
|
|
231
|
+
Nach `weiter` oder Korrekturen: `flows/product-flows.md` einlesen, Korrekturen übernehmen, `status: approved` setzen.
|
|
245
232
|
|
|
246
233
|
```bash
|
|
247
234
|
echo "Ich committe jetzt:"
|
|
248
235
|
echo " → flows/product-flows.md – Screen-Inventar und Transitions finalisiert"
|
|
249
236
|
git add flows/
|
|
250
|
-
git commit -m "docs: product flows – screen inventory + transitions"
|
|
251
|
-
git push
|
|
237
|
+
git commit -q -m "docs: product flows – screen inventory + transitions" && git push -q
|
|
252
238
|
```
|
|
253
239
|
|
|
254
240
|
Sage dem User: "Flows dokumentiert. Nächster Schritt: `/red:proto-ux` für jedes Feature (einmal pro Feature) – die Transitions aus `flows/product-flows.md` sind die verbindliche Referenz.
|
package/commands/red:proto-qa.md
CHANGED
|
@@ -146,8 +146,8 @@ STATUS.md: QA-Wert auf `✓`.
|
|
|
146
146
|
|
|
147
147
|
```bash
|
|
148
148
|
git add . features/STATUS.md
|
|
149
|
-
git commit -m "release: v[X.Y.Z] – FEAT-[X] [Feature Name]"
|
|
150
|
-
git tag v[X.Y.Z] && git push && git push origin --tags
|
|
149
|
+
git commit -q -m "release: v[X.Y.Z] – FEAT-[X] [Feature Name]"
|
|
150
|
+
git tag v[X.Y.Z] && git push -q && git push -q origin --tags
|
|
151
151
|
```
|
|
152
152
|
|
|
153
153
|
Sage: "v[X.Y.Z] getaggt. FEAT-[X] ist Production-Ready. Nächstes Feature: `/red:proto-requirements`. Nach Pause: `/red:proto-workflow`."
|
|
@@ -193,25 +193,11 @@ AskUserQuestion({
|
|
|
193
193
|
})
|
|
194
194
|
```
|
|
195
195
|
|
|
196
|
-
Nach Approval
|
|
197
|
-
|
|
198
|
-
Dann dem User sagen:
|
|
199
|
-
```
|
|
200
|
-
📝 Draft gespeichert: features/FEAT-[X]-[name].md
|
|
201
|
-
|
|
202
|
-
Öffne die Datei, prüfe sie und bearbeite sie direkt falls nötig.
|
|
203
|
-
|
|
204
|
-
→ Schreib `weiter` wenn alles passt
|
|
205
|
-
→ Oder sag mir direkt was geändert werden soll
|
|
206
|
-
```
|
|
196
|
+
Nach Approval: Feature-File als Draft speichern. `project-config.md` aktualisieren (Nächste freie ID um 1 erhöhen). User per CONVENTIONS.md §Resume Pattern informieren.
|
|
207
197
|
|
|
208
198
|
## Phase 7b: Finalisieren
|
|
209
199
|
|
|
210
|
-
Nach `weiter` oder Korrekturen
|
|
211
|
-
|
|
212
|
-
1. Feature-File einlesen, eventuelle Korrekturen übernehmen
|
|
213
|
-
2. YAML-Frontmatter auf `status: approved` setzen
|
|
214
|
-
3. `## Fortschritt` → `Status: Approved` setzen
|
|
200
|
+
Nach `weiter` oder Korrekturen: Feature-File einlesen, Korrekturen übernehmen, `status: approved` + `## Fortschritt → Status: Approved` setzen.
|
|
215
201
|
|
|
216
202
|
**STATUS.md aktualisieren:** Lies `features/STATUS.md`. Wenn die Datei noch nicht existiert, erstelle sie mit diesem Header:
|
|
217
203
|
|
|
@@ -236,8 +222,7 @@ echo " → features/FEAT-[X]-[name].md – Spec finalisiert"
|
|
|
236
222
|
echo " → features/STATUS.md – Feature eingetragen"
|
|
237
223
|
echo " → project-config.md – Nächste ID aktualisiert"
|
|
238
224
|
git add features/FEAT-[X]-*.md features/STATUS.md project-config.md
|
|
239
|
-
git commit -m "docs: FEAT-[X] spec – [Feature Name]"
|
|
240
|
-
git push
|
|
225
|
+
git commit -q -m "docs: FEAT-[X] spec – [Feature Name]" && git push -q
|
|
241
226
|
```
|
|
242
227
|
|
|
243
228
|
Sage dem User:
|
|
@@ -373,54 +373,11 @@ AskUserQuestion({
|
|
|
373
373
|
})
|
|
374
374
|
```
|
|
375
375
|
|
|
376
|
-
Nach Approval: Problem Statement Map und Personas als Drafts speichern.
|
|
377
|
-
|
|
378
|
-
`research/problem-statement.md`:
|
|
379
|
-
```markdown
|
|
380
|
-
---
|
|
381
|
-
status: draft
|
|
382
|
-
---
|
|
383
|
-
|
|
384
|
-
# Problem Statement Map
|
|
385
|
-
*Erstellt von: /red:proto-research — [Datum]*
|
|
386
|
-
|
|
387
|
-
[Inhalt aus Phase 4]
|
|
388
|
-
```
|
|
389
|
-
|
|
390
|
-
`research/personas.md`:
|
|
391
|
-
```markdown
|
|
392
|
-
---
|
|
393
|
-
status: draft
|
|
394
|
-
---
|
|
395
|
-
|
|
396
|
-
# Personas
|
|
397
|
-
*Erstellt von: /red:proto-research — [Datum]*
|
|
398
|
-
|
|
399
|
-
[Inhalt aus Phase 5]
|
|
400
|
-
```
|
|
401
|
-
|
|
402
|
-
Dann dem User sagen:
|
|
403
|
-
```
|
|
404
|
-
📝 Drafts gespeichert:
|
|
405
|
-
→ research/problem-statement.md
|
|
406
|
-
→ research/personas.md
|
|
407
|
-
(+ research/platform-context.md und research/research-questions.md falls noch offen)
|
|
408
|
-
|
|
409
|
-
Kurze Pause?
|
|
410
|
-
→ Schreib `weiter` wenn du alle Dateien geprüft hast
|
|
411
|
-
|
|
412
|
-
Echter Research (Interviews, Umfragen, Tage)?
|
|
413
|
-
→ Trag deine Findings direkt in die Dateien ein
|
|
414
|
-
→ Dann /red:proto-research erneut aufrufen – ich erkenne die Drafts automatisch
|
|
415
|
-
```
|
|
376
|
+
Nach Approval: Problem Statement Map und Personas als Drafts speichern (YAML `status: draft`, Header mit Dateinamen und Datum). User per CONVENTIONS.md §Resume Pattern (Option 2 – Research) informieren.
|
|
416
377
|
|
|
417
378
|
## Phase 6b: Finalisieren
|
|
418
379
|
|
|
419
|
-
Nach `weiter` oder Korrekturen
|
|
420
|
-
|
|
421
|
-
1. Alle Research-Dateien lesen und eventuelle Chat-Korrekturen einarbeiten
|
|
422
|
-
2. YAML-Frontmatter in allen Dateien auf `status: approved` setzen
|
|
423
|
-
3. Zusammenfassung zeigen und committen:
|
|
380
|
+
Nach `weiter` oder Korrekturen: Alle Research-Dateien einlesen, Korrekturen übernehmen, `status: approved` in allen Dateien setzen.
|
|
424
381
|
|
|
425
382
|
```bash
|
|
426
383
|
echo "Ich committe jetzt:"
|
|
@@ -429,8 +386,7 @@ echo " → research/research-questions.md – Forschungsfragen & Antworten"
|
|
|
429
386
|
echo " → research/problem-statement.md – Problem Statement Map"
|
|
430
387
|
echo " → research/personas.md – Personas"
|
|
431
388
|
git add research/
|
|
432
|
-
git commit -m "docs: add user research, personas and problem statement"
|
|
433
|
-
git push
|
|
389
|
+
git commit -q -m "docs: add user research, personas and problem statement" && git push -q
|
|
434
390
|
```
|
|
435
391
|
|
|
436
392
|
Prüfe den aktuellen Stand:
|
|
@@ -92,50 +92,21 @@ AskUserQuestion({
|
|
|
92
92
|
|
|
93
93
|
## Phase 4: Als Draft speichern
|
|
94
94
|
|
|
95
|
-
> Lies
|
|
95
|
+
> Lies `docs/CONVENTIONS.md` – Draft Convention + Resume Pattern (Option 1) gelten hier.
|
|
96
96
|
|
|
97
|
-
Nach Approval: Speichere
|
|
98
|
-
|
|
99
|
-
```markdown
|
|
100
|
-
---
|
|
101
|
-
status: draft
|
|
102
|
-
---
|
|
103
|
-
|
|
104
|
-
# Product Requirements Document
|
|
105
|
-
...
|
|
106
|
-
|
|
107
|
-
## Scope-Typ
|
|
108
|
-
[Klickbarer Prototyp | Funktionierender Prototyp | Produktionsreifes MVP | Unklar]
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
Dann dem User sagen:
|
|
112
|
-
```
|
|
113
|
-
📝 Draft gespeichert: prd.md
|
|
114
|
-
|
|
115
|
-
Öffne die Datei, prüfe sie und bearbeite sie direkt falls nötig.
|
|
116
|
-
|
|
117
|
-
→ Schreib `weiter` wenn alles passt
|
|
118
|
-
→ Oder sag mir direkt was geändert werden soll
|
|
119
|
-
```
|
|
97
|
+
Nach Approval: Speichere `prd.md` als Draft. YAML `status: draft`. Scope-Typ als Abschnitt `## Scope-Typ` ergänzen. User per CONVENTIONS.md §Resume Pattern informieren.
|
|
120
98
|
|
|
121
99
|
## Phase 4b: Finalisieren
|
|
122
100
|
|
|
123
|
-
Nach `weiter` oder
|
|
124
|
-
|
|
125
|
-
1. Datei einlesen: `cat prd.md`
|
|
126
|
-
2. Falls Korrekturen im Chat: Änderungen in prd.md übernehmen
|
|
127
|
-
3. YAML-Frontmatter auf `status: approved` setzen
|
|
128
|
-
4. Commit (nur wenn Git bereits initialisiert ist – bei Erstnutzung noch nicht vorhanden):
|
|
101
|
+
Nach `weiter` oder Korrekturen: `prd.md` einlesen, Korrekturen übernehmen, `status: approved` setzen.
|
|
129
102
|
|
|
130
103
|
```bash
|
|
131
104
|
if git rev-parse --git-dir > /dev/null 2>&1; then
|
|
132
105
|
echo "Ich committe jetzt:"
|
|
133
106
|
echo " → prd.md – PRD finalisiert"
|
|
134
|
-
git add prd.md
|
|
135
|
-
git commit -m "docs: add/update PRD"
|
|
136
|
-
git push
|
|
107
|
+
git add prd.md && git commit -q -m "docs: add/update PRD" && git push -q
|
|
137
108
|
else
|
|
138
|
-
echo "Kein Git-Repository – prd.md
|
|
109
|
+
echo "Kein Git-Repository – prd.md gespeichert. /red:proto-dev-setup macht den ersten Commit."
|
|
139
110
|
fi
|
|
140
111
|
```
|
|
141
112
|
|
package/commands/red:proto-ux.md
CHANGED
|
@@ -176,35 +176,18 @@ AskUserQuestion({ questions: [{ question: "UX-Entscheidungen vollständig?", hea
|
|
|
176
176
|
], multiSelect: false }] })
|
|
177
177
|
```
|
|
178
178
|
|
|
179
|
-
Nach Approval
|
|
180
|
-
|
|
181
|
-
Dann dem User sagen:
|
|
182
|
-
```
|
|
183
|
-
📝 Draft gespeichert: features/FEAT-[X]-[name].md
|
|
184
|
-
|
|
185
|
-
Öffne die Datei, prüfe die UX-Entscheidungen und bearbeite sie direkt falls nötig.
|
|
186
|
-
|
|
187
|
-
→ Schreib `weiter` wenn alles passt
|
|
188
|
-
→ Oder sag mir direkt was geändert werden soll
|
|
189
|
-
```
|
|
179
|
+
Nach Approval: FEAT-[X].md um Abschnitt `## 2. UX Entscheidungen` erweitern, YAML `status: draft` setzen. User per CONVENTIONS.md §Resume Pattern informieren.
|
|
190
180
|
|
|
191
181
|
## Phase 7b: Finalisieren
|
|
192
182
|
|
|
193
|
-
Nach `weiter` oder Korrekturen
|
|
194
|
-
|
|
195
|
-
1. FEAT-[X].md einlesen, Korrekturen übernehmen
|
|
196
|
-
2. YAML-Frontmatter auf `status: approved` setzen
|
|
197
|
-
3. `## Fortschritt` → `Status: Approved`, `Aktueller Schritt: UX` setzen
|
|
198
|
-
4. STATUS.md aktualisieren (UX-Spalte auf ✓ setzen)
|
|
199
|
-
5. Commit-Zusammenfassung zeigen und committen:
|
|
183
|
+
Nach `weiter` oder Korrekturen: FEAT-[X].md einlesen, Korrekturen übernehmen, `status: approved` + `## Fortschritt → Status: Approved, Aktueller Schritt: UX` setzen. STATUS.md (UX-Spalte ✓).
|
|
200
184
|
|
|
201
185
|
```bash
|
|
202
186
|
echo "Ich committe jetzt:"
|
|
203
187
|
echo " → features/FEAT-[X]-[name].md – UX Entscheidungen finalisiert"
|
|
204
188
|
echo " → features/STATUS.md – UX-Status aktualisiert"
|
|
205
189
|
git add features/FEAT-[X]-*.md flows/product-flows.md features/STATUS.md 2>/dev/null
|
|
206
|
-
git commit -m "docs: FEAT-[X] ux design – [Feature Name]"
|
|
207
|
-
git push
|
|
190
|
+
git commit -q -m "docs: FEAT-[X] ux design – [Feature Name]" && git push -q
|
|
208
191
|
```
|
|
209
192
|
|
|
210
193
|
## Routing nach Approval
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Design System – Index
|
|
2
|
+
|
|
3
|
+
Lade dieses File zuerst. Dann nur die Files, die für das aktuelle Feature relevant sind.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Tokens
|
|
8
|
+
|
|
9
|
+
| File | Inhalt | Wann laden |
|
|
10
|
+
|------|--------|------------|
|
|
11
|
+
| `tokens/colors.md` | Primär-, Sekundär-, Semantic-, Neutral-Farben + Surface-Aliases | Immer bei visueller Implementierung |
|
|
12
|
+
| `tokens/typography.md` | Schriftgrößen, Gewichte, Line-Heights, Font-Stack | Bei Text-Styling |
|
|
13
|
+
| `tokens/spacing.md` | Spacing-Scale (4px-Basis), Named Sizes (xs–2xl) | Bei Layout, Abstände, Padding |
|
|
14
|
+
| `tokens/shadows.md` | Elevation-System (sm, md, lg, xl) | Bei Cards, Modals, Dropdowns |
|
|
15
|
+
| `tokens/motion.md` | Transitions, Durations, Easing-Kurven | Bei Animationen, Hover-Effekten |
|
|
16
|
+
|
|
17
|
+
## Komponenten
|
|
18
|
+
|
|
19
|
+
| File | Varianten | Zustände | Wann laden |
|
|
20
|
+
|------|-----------|----------|------------|
|
|
21
|
+
| `components/button.md` | primary, secondary, ghost, danger, link | default, hover, focus, active, disabled, loading | Bei jeder Aktion/Button |
|
|
22
|
+
| `components/input.md` | text, password, textarea, select | default, focus, error, disabled | Bei Formularen |
|
|
23
|
+
| `components/card.md` | default, interactive, flat | default, hover | Bei Card-Layouts |
|
|
24
|
+
|
|
25
|
+
## Patterns
|
|
26
|
+
|
|
27
|
+
| File | Enthält | Wann laden |
|
|
28
|
+
|------|---------|------------|
|
|
29
|
+
| `patterns/navigation.md` | Header, Sidebar, Breadcrumb, Tab-Navigation | Bei Navigation-Implementierung |
|
|
30
|
+
| `patterns/forms.md` | Formular-Aufbau, Validation, Fehlermeldungen | Bei Formularen |
|
|
31
|
+
| `patterns/feedback.md` | Toasts, Modals, Loading States, Empty States | Bei Feedback-Elementen |
|
|
32
|
+
| `patterns/data-display.md` | Tabellen, Listen, Cards, Badges | Bei Datendarstellung |
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Laderegel für Agents
|
|
37
|
+
|
|
38
|
+
1. Lies dieses INDEX.md
|
|
39
|
+
2. Identifiziere welche Tokens/Komponenten/Patterns das Feature braucht
|
|
40
|
+
3. Lade **nur diese Files** – nicht alles auf einmal
|
|
41
|
+
4. Nicht definierte Elemente: pragmatisch mit vorhandenen Tokens bauen, im Feature-File unter `## Offene Punkte` dokumentieren
|
|
42
|
+
|
|
43
|
+
## Status
|
|
44
|
+
|
|
45
|
+
| Bereich | Status |
|
|
46
|
+
|---------|--------|
|
|
47
|
+
| Tokens | Beispielwerte – vor Projektstart durch eigene Werte ersetzen |
|
|
48
|
+
| Komponenten | 3 Basiskomponenten vorhanden (Button, Input, Card) |
|
|
49
|
+
| Patterns | 4 Patterns vorhanden |
|
|
50
|
+
| Screens | Leer – Figma-Exports hier ablegen |
|