initial: claude code workflow bundle (plan-start, status, handoff, adr)

This commit is contained in:
Kristian
2026-04-17 07:28:49 +02:00
commit 20a0ab38f2
16 changed files with 978 additions and 0 deletions
+15
View File
@@ -0,0 +1,15 @@
# macOS
.DS_Store
.AppleDouble
.LSOverride
# Editor / IDE
.vscode/
.idea/
*.swp
*.swo
*~
# OS / tooling
Thumbs.db
.Trash-*
+173
View File
@@ -0,0 +1,173 @@
# Claude Code Workflow — Universal Bundle
Ein minimaler Satz von vier Skills plus Templates für einen nachvollziehbaren
Planungs-, Bau- und Übergabe-Workflow in Claude Code. Ziel: Projektstatus lebt
auf der Platte (in `docs/`), nicht im Sitzungskontext — und die Skills sorgen
dafür, dass diese Dateien konsistent wachsen statt chaotisch.
Dieses Bundle ist **rechnerübergreifend portabel**: du klonst / kopierst diesen
Ordner auf jede neue Maschine und installierst den globalen Teil mit einem
einzigen Kopier- bzw. Symlink-Schritt.
---
## Speicherorte auf einen Blick
Die Skills teilen sich in zwei Ebenen. Wichtig: in diesem Bundle liegt aktuell
**nur der globale Teil**. Projektspezifische Skills entstehen pro Projekt direkt
im jeweiligen Repo (siehe unten) und gehören nicht hierher, weil sie projekt-
spezifischen Kontext tragen.
| Was | Quelle in diesem Bundle | Ziel auf deinem Rechner | Scope |
|---|---|---|---|
| Globale Skills (plan-start, status, handoff, adr) | `global-skills/` | `~/.claude/skills/` | maschinenweit, alle Projekte |
| Projekt-Wegweiser | wird von `plan-start` erzeugt | `<projekt>/CLAUDE.md` | nur dieses Projekt |
| Projekt-Doku | wird von `plan-start` erzeugt | `<projekt>/docs/` | nur dieses Projekt |
| Projektspezifische Skills (optional) | — (im Projekt anlegen) | `<projekt>/.claude/skills/` | nur dieses Projekt |
Die Trennung ist bewusst: alles unter `~/.claude/skills/` ist **Verb** (Prozess,
überall gleich), alles unter `<projekt>/` ist **Kontext** (Inhalt, projekt-
spezifisch). Skills im Projekt-Repo werden mitcommittet und sind Teil der
Dokumentation.
---
## Installation (pro Rechner, einmalig)
### Option A — symlinken (empfohlen)
Wenn du dieses Bundle per Git versionierst und auf mehreren Rechnern spiegelst,
sind Symlinks der saubere Weg. Änderungen werden zentral gepflegt, jeder
Rechner zieht nach `git pull` automatisch mit.
```bash
# einmalig anlegen
mkdir -p ~/.claude/skills
# für jeden Skill einen Symlink — Pfad auf dein geklontes Bundle anpassen
ln -s "$PWD/global-skills/plan-start" ~/.claude/skills/plan-start
ln -s "$PWD/global-skills/status" ~/.claude/skills/status
ln -s "$PWD/global-skills/handoff" ~/.claude/skills/handoff
ln -s "$PWD/global-skills/adr" ~/.claude/skills/adr
```
### Option B — kopieren
Wenn du lieber unabhängige Kopien willst (z. B. weil du pro Rechner abweichend
tunen möchtest):
```bash
mkdir -p ~/.claude/skills
cp -r global-skills/plan-start ~/.claude/skills/
cp -r global-skills/status ~/.claude/skills/
cp -r global-skills/handoff ~/.claude/skills/
cp -r global-skills/adr ~/.claude/skills/
```
### Prüfen
Nach Install sollte in Claude Code die Skill-Liste die vier Namen enthalten.
Grobe Kontrolle auf der Shell:
```bash
ls ~/.claude/skills/
# plan-start status handoff adr
```
---
## Die vier Skills im Überblick
| Skill | Phase | Was er tut |
|---|---|---|
| `plan-start` | Projektstart | Legt `CLAUDE.md`, `docs/`-Struktur und erste Dateien nach Template an. Einmal pro Projekt. |
| `status` | Wiedereinstieg | Liest `docs/90-status.md` + letztes Session-Log, fasst in 510 Zeilen zusammen. Dein „Wo stehen wir?"-Befehl. |
| `handoff` | Sessionende | Fragt drei kurze Reflexionsfragen, schreibt Session-Log nach `docs/sessions/`, aktualisiert `docs/90-status.md`. |
| `adr` | nach Architektur-Entscheidung | Legt nummerierten ADR nach `docs/30-decisions/` an. Kontext, Entscheidung, Konsequenzen, Alternativen. |
Nicht dabei (bewusst): `/debug-log` und `/concept-lock`. Die baust du nach zwei,
drei Wochen Praxis — dann weißt du, wie sie konkret aussehen müssen. Alles
andere wäre hypothetisch.
---
## Was `plan-start` im Projekt erzeugt
```
<projekt>/
├── CLAUDE.md # Wegweiser, verweist auf docs/90-status.md
├── .claude/
│ └── skills/ # leer — hier landen später projektspezifische Skills
└── docs/
├── 00-overview.md # Zweck, Ziele, Nicht-Ziele
├── 10-plan.md # Phasen, Milestones, aktueller Fokus
├── 20-architecture.md # Stack, Entscheidungen in Kurzform
├── 30-decisions/ # ADRs, einer pro Datei, nummeriert
├── 40-workflows/ # Deploy-, Backup-, Debug-Prozeduren
├── 90-status.md # Single Source of Truth: aktueller Stand
└── sessions/ # Session-Logs chronologisch, YYYY-MM-DD-<slug>.md
```
Die Nummerierung ist kein Selbstzweck — sie sortiert alphabetisch in der
Lese-Reihenfolge, in der eine frische Claude-Code-Instanz die Dateien beim
Scannen wahrnimmt, und gibt dir visuelle Hierarchie im Editor.
`90-status.md` steht bewusst ganz unten: die eine Datei, die du immer
aktualisierst und die jede neue Session zuerst liest.
---
## Projektspezifische Skills (optional, pro Repo)
Wenn du in einem konkreten Projekt merkst, dass du immer wieder denselben
projektspezifischen Handgriff ausführst (z. B. „Deploy-Pipeline prüfen",
„Testdaten regenerieren"), lege ihn als Skill in diesem Repo an:
```
<projekt>/.claude/skills/<skill-name>/SKILL.md
```
Commit mit. Damit ist der Skill Teil der Projekt-Doku — und andere Rechner /
Mitwirkende haben ihn automatisch.
---
## Konventionen, die das Ganze tragen
- **Sprache**: Prosa auf Deutsch, Code / Pfade / Kommandos / Skill-Namen auf
Englisch. Das gilt in allen Templates und Skills konsistent.
- **Single Source of Truth**: `docs/90-status.md`. Kein anderer Ort beschreibt
„wo wir gerade stehen".
- **ADRs sind append-only**: einmal geschrieben, nur noch durch neue ADRs
ersetzt (`Supersedes: 0003`). Nie rückwirkend umschreiben — das killt die
Nachvollziehbarkeit.
- **Session-Logs sind verpflichtend**: `handoff` am Ende jeder relevanten
Session. Wer das überspringt, hat nach drei Sessions wieder das alte Problem
— nur mit mehr Dateien drumherum.
- **CLAUDE.md bleibt schlank** (~5080 Zeilen): Navigation, nicht Enzyklopädie.
Sie verweist auf `docs/`, sie enthält keine Inhalte, die dort hingehören.
---
## Erste Schritte in einem neuen Projekt
```bash
cd ~/projekte/mein-neues-ding
# in Claude Code:
# skill: plan-start "Kurzbeschreibung der Idee"
```
`plan-start` fragt ein paar Basics ab (Name, Zweck, Stack-Hinweise),
generiert die Ordnerstruktur und schreibt eine erste `CLAUDE.md` sowie
`docs/00-overview.md`, `docs/10-plan.md` und `docs/90-status.md`.
Am Ende der Session: `skill: handoff`.
Beim nächsten Einstieg: `skill: status`.
Das ist der komplette Kreislauf.
---
## Lizenz / Umgang
Internes Tooling, keine formelle Lizenz. Passe die Templates an deinen Stil
an — sie sind als Ausgangspunkt gedacht, nicht als Dogma.
+98
View File
@@ -0,0 +1,98 @@
---
name: adr
description: Legt unter docs/30-decisions/ einen neuen Architecture Decision Record an, automatisch hochnummeriert, nach festem Template (Context, Decision, Consequences, Alternatives). Ergänzt gleichzeitig den Abschnitt "Laufende ADRs" in docs/20-architecture.md.
disable-model-invocation: true
argument-hint: "<titel der entscheidung, z. b.: 'pocketbase statt supabase'>"
allowed-tools:
- Read
- Write
- Edit
- Bash
---
# adr — Architecture Decision Record
## Wann der Skill läuft
Immer dann, wenn eine **Entscheidung getroffen wird, die später Kopfschmerzen
kostet, wenn sie niemand dokumentiert**. Typische Beispiele:
- Wahl einer Technologie gegen Alternativen („PocketBase statt Supabase").
- Struktur-Entscheidung, die konkurrierende Optionen hatte („Monorepo statt
mehrerer Repos", „Events statt direktem Call").
- Betriebs-Entscheidung mit Tragweite („Caddy als Reverse-Proxy", „tägliches
Snapshot-Backup auf Hetzner Storage Box").
**Nicht** für triviale Entscheidungen („wir benennen die Variable `user_id`
statt `uid`") — da ist der ADR mehr Last als Nutzen.
## Voraussetzungen
Existiert `docs/30-decisions/`? Wenn nicht → meldet „Kein initialisiertes
Projekt. Erst `plan-start` ausführen." Abbrechen.
## Was der Skill tut
### Schritt 1 — Titel bestimmen
- Titel kommt aus `$ARGUMENTS`. Wenn leer: freundlich nach einem Titel fragen
(eine Zeile), nicht weiter spekulieren.
- Slug aus Titel ableiten: lowercase, Leerzeichen → Bindestrich, Sonderzeichen
raus. Beispiel: `PocketBase statt Supabase``pocketbase-statt-supabase`.
### Schritt 2 — Nummer vergeben
- `ls docs/30-decisions/ | grep -E '^[0-9]{4}-'` listet bestehende ADRs.
- Höchste bestehende Nummer + 1, auf 4 Stellen gepaddet (`0001`, `0042`).
- Erste ADR → `0001`.
### Schritt 3 — Datei anlegen
- Dateiname: `docs/30-decisions/<NNNN>-<slug>.md`.
- Inhalt: aus `templates/adr.md.tmpl`, Platzhalter füllen:
| Platzhalter | Quelle |
|---|---|
| `{{ADR_NUMBER}}` | die vergebene Nummer, 4-stellig |
| `{{ADR_TITLE}}` | der Titel |
| `{{ADR_DATE}}` | `date +%F` |
| `{{ADR_AUTHOR}}` | `git config user.name`, sonst leer |
**Status** ist initial `proposed`. Der Nutzer wechselt ihn später auf
`accepted`, wenn die Entscheidung gelebt wird — oder auf
`superseded by NNNN`, wenn ein späterer ADR sie ablöst.
### Schritt 4 — Abschnitt „Laufende ADRs" in 20-architecture.md ergänzen
Am Ende von `docs/20-architecture.md` steht ein Abschnitt `## Laufende ADRs`.
Dort wird eine Zeile nach folgendem Muster angehängt:
```markdown
- [{{ADR_NUMBER}}](30-decisions/{{ADR_NUMBER}}-{{slug}}.md) — {{ADR_TITLE}} (`proposed`, {{ADR_DATE}})
```
Wenn dort noch der Platzhalter-Text `_(Noch keine ADRs. ...)_` steht: diesen
entfernen und die erste Zeile einfügen.
### Schritt 5 — Kurze Bestätigung
Dem Nutzer den neuen Pfad und die Nummer zurückmelden, und einen knappen
Hinweis: „Datei ist als `proposed` markiert. Wenn die Entscheidung steht: auf
`accepted` setzen."
## Harte Regeln
- **Nie einen bestehenden ADR überschreiben.** Nummerierung ist append-only.
- **Nie den Status eines anderen ADR ändern.** Wenn der neue ADR einen alten
ablöst: das trägt der Nutzer selbst am alten ADR nach (im neuen ADR sollte
er es im Header `Supersedes: NNNN` notieren — aber auch das macht der
Nutzer, der Skill verdrahtet das nicht automatisch, weil das Fehlerquelle
ist).
- **Keine Entscheidung erfinden.** Der Skill legt nur das Gerüst an.
Context / Decision / Consequences füllt der Nutzer. Der Skill darf ruhig
Vorschläge machen, wenn im Chatkontext genug Information da ist — aber er
schreibt nichts in die Datei, was der Nutzer nicht bestätigt hat.
## Template
Siehe `./templates/adr.md.tmpl`.
+59
View File
@@ -0,0 +1,59 @@
# ADR {{ADR_NUMBER}} — {{ADR_TITLE}}
**Status:** proposed
**Datum:** {{ADR_DATE}}
**Autor:** {{ADR_AUTHOR}}
<!-- Bei Ablösung eines früheren ADR: Supersedes: NNNN -->
## Context
<!-- Die Ausgangslage. Welches Problem / welche Anforderung stellt sich?
Welche Randbedingungen (Budget, Zeit, Team-Know-how, Betriebs-Kontext)
schränken die Wahl ein? Dieser Abschnitt soll in einem Jahr noch
verständlich sein, ohne dass jemand den Projekt-Kontext präsent hat. -->
TBD
## Decision
<!-- Was wurde entschieden? In einem klaren Satz. Danach ggf. 25 Sätze zur
Konkretisierung (Version, Variante, Konfiguration). -->
TBD
## Consequences
<!-- Was folgt aus der Entscheidung?
- Positiv: was wird dadurch einfacher / möglich?
- Negativ: welche Kosten / Einschränkungen / Risiken erkauft man sich?
- Neutral / strukturell: was ändert sich im Ablauf, auch wenn's weder
gut noch schlecht ist?
-->
### Positiv
- TBD
### Negativ
- TBD
### Neutral / strukturell
- TBD
## Alternatives considered
<!-- Die Hauptalternativen, die erwogen wurden, jeweils mit einem Satz warum
sie NICHT gewählt wurden. Das ist der Teil, der in zwei Jahren am
wertvollsten ist: „Wir haben X bewusst verworfen, weil …". -->
- **Alternative A:** TBD — verworfen, weil TBD.
- **Alternative B:** TBD — verworfen, weil TBD.
## Rückfallplan
<!-- Falls diese Entscheidung sich später als falsch erweist: wie kommt man
raus? Wie hoch ist der Umstellungsaufwand grob? -->
TBD
+120
View File
@@ -0,0 +1,120 @@
---
name: handoff
description: Schreibt am Ende einer Arbeitssession einen Session-Log nach docs/sessions/YYYY-MM-DD-<slug>.md und aktualisiert docs/90-status.md. Erzwingt eine kurze Reflexion des Nutzers (drei Fragen), bevor geschrieben wird — bewusst NICHT autonom aus dem Sitzungskontext ableiten.
disable-model-invocation: true
argument-hint: "<optional: kurzer slug für den log-dateinamen>"
allowed-tools:
- Read
- Write
- Edit
- Bash
---
# handoff — Sessionende
## Warum es diesen Skill überhaupt gibt
Die Disziplin des ganzen Workflows liegt nicht in den anderen Skills, sondern
in diesem hier. Wer `handoff` am Sessionende überspringt, hat nach drei
Sessions wieder das alte Problem: Kontext verdunstet, „wo war ich stehen-
geblieben?" ist Rateraten.
Und: `handoff` fragt **explizit nach**, statt autonom zusammenzufassen. Das ist
gegen die LLM-Intuition („kann ich doch selbst"), aber genau der Punkt.
Automatisch generierte Session-Logs sind nach drei Wochen formal korrekt und
inhaltlich beliebig. Die fünf Sekunden Reflexion pro Session sind die
Investition, die das System überhaupt tragbar macht.
## Wann der Skill läuft
Auf expliziten Aufruf am Ende einer Session. Vorher prüfen: existiert
`docs/90-status.md`? Wenn nicht → melden „Kein initialisiertes Projekt", abbrechen.
## Was der Skill tut
### Schritt 1 — Drei Fragen an den Nutzer
Nacheinander, nicht als Liste. Auf jede Antwort kurz warten, nicht selbst
vorschlagen. Die Fragen sind bewusst stumpf und weit, damit der Nutzer
reflektiert:
1. **„Was hast du in dieser Session konkret erledigt?"**
(Faktisch. Nicht „wir haben über X gesprochen", sondern „Datei Y angelegt,
Test Z bestanden, Entscheidung A getroffen".)
2. **„Was hast du angefangen und nicht beendet?"**
(Die Dinge, die sonst vergessen werden. Halbe Edits, offene Branches,
angetestete Hypothesen ohne Ergebnis.)
3. **„Was sind die nächsten 13 konkreten Schritte, wenn du das Projekt
wieder aufnimmst?"**
(Klein, prüfbar. Nicht „Feature X bauen", sondern „Funktion `parse_header`
um Content-Type erweitern, dann Test dafür schreiben".)
Zusätzlich darf der Skill **nur wenn nötig** nachfragen:
- Gab es eine größere Entscheidung, die einen ADR verdient? (Falls ja: den
Nutzer an `adr <titel>` erinnern — **nicht** selbst anlegen.)
- Ist der aktuelle Fokus in `docs/10-plan.md` noch korrekt? (Wenn nein: Notiz
machen, dass der Nutzer das beim nächsten Mal anpassen sollte. Nicht selbst
editieren.)
### Schritt 2 — Slug und Dateiname bauen
- Datum: `date +%F``YYYY-MM-DD`.
- Slug: aus `$ARGUMENTS`, sonst aus der Antwort auf Frage 1 automatisch
ableiten (24 Wörter, lowercase, Bindestriche, keine Sonderzeichen).
- Dateiname: `docs/sessions/YYYY-MM-DD-<slug>.md`.
- Kollision vermeiden: wenn die Datei existiert, suffix `-2`, `-3`, … anhängen.
### Schritt 3 — Session-Log schreiben
Nach dem Template `templates/session-log.md.tmpl` (liegt im Skill-Ordner).
Platzhalter füllen:
| Platzhalter | Quelle |
|---|---|
| `{{SESSION_DATE}}` | aktuelles Datum `YYYY-MM-DD` |
| `{{SESSION_SLUG}}` | der Slug von oben |
| `{{WHAT_DONE}}` | Antwort auf Frage 1, als Bulletpoints |
| `{{WHAT_OPEN}}` | Antwort auf Frage 2, als Bulletpoints |
| `{{NEXT_STEPS}}` | Antwort auf Frage 3, als nummerierte Liste |
| `{{DURATION}}` | optional, wenn der Nutzer ihn nennt, sonst weglassen |
### Schritt 4 — `docs/90-status.md` aktualisieren
Keine komplette Neuschreibung. Gezielt:
- Zeitstempel „Letzte Aktualisierung" auf heute setzen.
- Abschnitt **„Aktueller Stand"** ersetzen durch eine Destillation aus Frage 1
+ Frage 2 (24 Sätze).
- Abschnitt **„Nächste Schritte"** ersetzen durch die Antwort auf Frage 3.
- Abschnitt **„Offene Entscheidungen / Blocker"**: nur anfassen, wenn der
Nutzer im Gespräch explizit eine Entscheidung oder einen Blocker erwähnt
hat. Sonst unverändert lassen.
- Abschnitt **„Zuletzt geändert durch"**: auf
`handoff — <slug> am <datum>` setzen.
### Schritt 5 — Kurze Bestätigung
Dem Nutzer in 23 Zeilen zurückmelden: welche Datei wurde geschrieben, was
wurde in `90-status.md` aktualisiert. Keine Zusammenfassung der Zusammenfassung
— der Nutzer weiß, was er gerade gesagt hat.
Optional, wenn relevant: Hinweis auf einen anzulegenden ADR, falls in Schritt 1
eine Architektur-Entscheidung genannt wurde.
## Harte Regeln
- **Nicht automatisch zusammenfassen** ohne die drei Fragen zu stellen. Auch
dann nicht, wenn der Sitzungsverlauf scheinbar alles klar macht. Die Fragen
sind Pflicht.
- **Nichts in `30-decisions/` schreiben.** Dafür gibt's `adr`. Der Nutzer wird
daran erinnert, aber er entscheidet.
- **Nie `git commit`.** Der Nutzer entscheidet, ob und wann.
- **Niemals einen bestehenden Session-Log überschreiben.** Bei Kollision
Suffix anhängen.
## Template
Siehe `./templates/session-log.md.tmpl`.
@@ -0,0 +1,21 @@
# Session {{SESSION_DATE}} — {{SESSION_SLUG}}
**Datum:** {{SESSION_DATE}}
**Dauer:** {{DURATION}}
## Was wurde erledigt
{{WHAT_DONE}}
## Was ist offen / angefangen
{{WHAT_OPEN}}
## Nächste Schritte
{{NEXT_STEPS}}
## Notizen / Überraschungen
<!-- Optional: unerwartete Erkenntnisse, Sackgassen, Dinge, die später noch
mal aufschlagen könnten. Wenn nichts — Abschnitt weglassen. -->
+97
View File
@@ -0,0 +1,97 @@
---
name: plan-start
description: Legt in einem neuen oder leeren Projektordner die standardisierte Dokumentations- und Wegweiser-Struktur an (CLAUDE.md, docs/ mit 00-overview, 10-plan, 20-architecture, 90-status, 30-decisions/, 40-workflows/, sessions/). Nutzt die Templates unter templates/ dieses Skills. Soll nur auf explizite Nutzeranforderung laufen, nie autonom.
disable-model-invocation: true
argument-hint: "<kurzer projekttitel oder eine zeile zur idee>"
allowed-tools:
- Read
- Write
- Edit
- Bash
---
# plan-start — Projekt-Scaffolding
## Wann der Skill läuft
Ausschließlich auf expliziten Aufruf, in einem **neuen oder noch leeren
Projektordner**. Der Skill legt eine Grundstruktur an und darf vorhandene
Dateien nicht überschreiben.
## Was der Skill tut
1. Prüft den aktuellen Arbeitsordner. Wenn dort bereits `CLAUDE.md` oder
`docs/` existiert → **abbrechen** und dem Nutzer melden: „Hier liegt schon
ein initialisiertes Projekt. `plan-start` ist idempotent nicht — du willst
vermutlich `status` oder direkt in `docs/` editieren."
2. Stellt dem Nutzer vor dem Schreiben **kurz und konkret** diese Fragen
(eine nach der anderen, nicht als Sammel-Liste):
- **Projektname** (wird als Titel in CLAUDE.md und Headings verwendet)
- **Ein-Satz-Zweck** („Wofür ist das Projekt da?")
- **Aktuelle Phase** (Planung / Build / Wartung — Default: Planung)
- **Stack in Stichworten** (z. B. „Python + FastAPI + PocketBase",
„NixOS + Caddy + Docker Compose" — darf auch leer sein, wenn noch unklar)
3. Legt folgende Struktur an — relativ zum aktuellen Arbeitsordner:
```
./CLAUDE.md
./.claude/skills/.gitkeep
./docs/00-overview.md
./docs/10-plan.md
./docs/20-architecture.md
./docs/90-status.md
./docs/30-decisions/README.md
./docs/40-workflows/README.md
./docs/sessions/README.md
```
4. Befüllt jede Datei aus dem passenden Template unter
`./templates/` dieses Skills. Platzhalter werden wie folgt ersetzt:
| Platzhalter | Quelle |
|---|---|
| `{{PROJECT_NAME}}` | aus Frage 1 |
| `{{PROJECT_PURPOSE}}` | aus Frage 2 |
| `{{PROJECT_PHASE}}` | aus Frage 3 |
| `{{PROJECT_STACK}}` | aus Frage 4, leer → `TBD` |
| `{{TODAY_ISO}}` | heutiges Datum als `YYYY-MM-DD` via `date +%F` |
| `{{USER_NAME}}` | optional: `git config user.name`, sonst leer |
5. Erzeugt `.claude/skills/.gitkeep` als leere Datei, damit das
projektspezifische Skill-Verzeichnis unter Versionskontrolle bleibt, auch
solange es leer ist.
6. Gibt am Ende eine **kurze Bestandsaufnahme** in 35 Zeilen aus: was wurde
angelegt, was als Nächstes sinnvoll ist (Empfehlung: `docs/00-overview.md`
und `docs/10-plan.md` durchgehen und konkretisieren, dann `handoff`).
## Harte Regeln
- **Nie** Dateien überschreiben. Wenn auch nur eine der Zieldateien existiert:
komplett abbrechen und den Nutzer informieren.
- **Nie** in ein nicht-leeres Git-Repo schreiben, ohne vorher zu warnen. Ein
Repo mit einer `.git/`, aber ohne `CLAUDE.md` und ohne `docs/` ist in Ordnung
— das heißt der Nutzer hat bereits `git init` gemacht, das ist der Normalfall.
- **Nie** `git commit` selbstständig ausführen. Der Nutzer entscheidet, was
committet wird.
## Tonfall in den erzeugten Templates
- Prosa auf Deutsch, kurz, konkret.
- Code, Pfade, Kommandos auf Englisch.
- Platzhalter-Abschnitte sind mit `TBD` oder einem sichtbaren HTML-Kommentar
`<!-- TODO: ... -->` markiert, damit der Nutzer sofort sieht, was noch gefüllt
werden muss.
## Templates
Siehe `./templates/` im Skill-Ordner:
- `CLAUDE.md.tmpl`
- `00-overview.md.tmpl`
- `10-plan.md.tmpl`
- `20-architecture.md.tmpl`
- `90-status.md.tmpl`
- `30-decisions.README.md.tmpl`
- `40-workflows.README.md.tmpl`
- `sessions.README.md.tmpl`
@@ -0,0 +1,49 @@
# 00 — Overview
**Projekt:** {{PROJECT_NAME}}
**Angelegt:** {{TODAY_ISO}}
## Zweck in einem Satz
{{PROJECT_PURPOSE}}
## Warum überhaupt
<!-- TODO: In 36 Sätzen die Motivation. Welches Problem löst das Projekt?
Für wen? Was war der Auslöser? Dieses Feld altert am schnellsten — trotzdem
wichtig, weil es Monate später erklärt, warum das Ding existiert. -->
## Ziele
<!-- TODO: 35 konkrete, prüfbare Ziele. Nicht „schneller sein", sondern
„Antwortzeit < 200 ms bei p95". -->
- TBD
- TBD
- TBD
## Nicht-Ziele
<!-- TODO: Explizit festhalten, was das Projekt NICHT sein will. Spart später
viele Diskussionen. Beispiel: „Kein Multi-Tenant", „Keine Mobile-App",
„Keine Echtzeitfähigkeit im ersten Release". -->
- TBD
- TBD
## Stakeholder / Betroffene
<!-- TODO: Wer nutzt das? Wer zahlt? Wer operiert es? Wer wird wach, wenn es
bricht? -->
- Nutzer: TBD
- Betrieb: TBD
- Auftraggeber: TBD
## Erfolgskriterien
<!-- TODO: Woran messen wir „fertig" und „gut"? Idealerweise eine Kombination
aus quantitativen Kennzahlen und qualitativen Aussagen („Kristian kann
ohne Nachfrage deployen"). -->
- TBD
@@ -0,0 +1,40 @@
# 10 — Plan
**Letzte Aktualisierung:** {{TODAY_ISO}}
Der Plan ist ein **lebendes Dokument**. Er darf sich ändern — jede nicht-
triviale Änderung sollte ein kurzer Eintrag in `docs/sessions/` erklären,
grobe Kursänderungen einen eigenen ADR in `docs/30-decisions/` bekommen.
## Phasen-Übersicht
| Phase | Status | Ziel | Zeitfenster |
|---|---|---|---|
| 1 — Konzept & Planung | in progress | Overview, Plan, erste Architektur-Skizze | {{TODAY_ISO}} TBD |
| 2 — Build / Prototype | pending | TBD | TBD |
| 3 — Härtung / Launch | pending | TBD | TBD |
| 4 — Betrieb / Wartung | pending | laufend | — |
## Aktueller Fokus
<!-- TODO: Der eine oder zwei Punkte, an denen jetzt konkret gearbeitet wird.
Nicht die große Vision — der nächste Schritt. -->
- TBD
## Milestones
<!-- TODO: 37 grobe Marker, nicht mehr. Jeder Milestone sollte demonstrier-
bar sein: „X funktioniert, Y ist dokumentiert". -->
- [ ] M1 — TBD
- [ ] M2 — TBD
- [ ] M3 — TBD
## Offene Fragen / Risiken
<!-- TODO: Was ist noch unklar? Wo liegt das größte Risiko? Explizit festhalten
— das sind die Dinge, die sonst beim nächsten Wiedereinstieg vergessen
werden. -->
- TBD
@@ -0,0 +1,55 @@
# 20 — Architecture
**Letzte Aktualisierung:** {{TODAY_ISO}}
Diese Datei ist **kein Ort für detaillierte Begründungen** — die leben in
`docs/30-decisions/` als ADRs. Hier steht die kompakte Architektur-Sicht, so
wie sie aktuell gilt. Wenn du hier etwas änderst, schreibst du idealerweise
einen ADR, der erklärt warum.
## Stack
**Kurz:** {{PROJECT_STACK}}
<!-- TODO: Aufdröseln nach Schicht. Beispiel:
- Runtime: Python 3.12, uv
- Web-Framework: FastAPI
- Persistenz: PocketBase (SQLite-basiert)
- Reverse-Proxy: Caddy
- Deployment: systemd-Unit auf NixOS
-->
- Runtime: TBD
- Framework: TBD
- Persistenz: TBD
- Infrastruktur: TBD
## Komponenten
<!-- TODO: Kurze Liste der Hauptkomponenten mit je 12 Sätzen Zweck. Ein
simples ASCII-Diagramm oder Mermaid-Block ist oft Gold wert. -->
```
<!-- TODO: Komponenten-Skizze -->
```
## Datenfluss
<!-- TODO: Wie fließen Daten durch das System? Eingänge, Transformationen,
Ausgänge, Persistenzpunkte. Ein Absatz reicht am Anfang. -->
TBD
## Externe Abhängigkeiten
<!-- TODO: APIs, SaaS, Hardware, die wir nicht selbst betreiben. Jede Zeile:
Name, Zweck, was passiert, wenn sie ausfällt. -->
- TBD
## Laufende ADRs
<!-- Dieser Abschnitt wird durch den `adr`-Skill gepflegt: er ergänzt die Liste
unten beim Anlegen eines neuen ADR. -->
_(Noch keine ADRs. `adr <titel>` ausführen, um einen anzulegen.)_
@@ -0,0 +1,32 @@
# 30 — Decisions (ADRs)
Hier leben **Architecture Decision Records** — je eine Markdown-Datei pro
Entscheidung, nummeriert. Neue ADRs werden mit dem `adr`-Skill angelegt, der
automatisch hochzählt und das Template anwendet.
## Regeln
- **Append-only.** Eine einmal getroffene Entscheidung wird nicht rückwirkend
umgeschrieben. Stattdessen wird sie durch einen neuen ADR ersetzt, der
`Supersedes: <nummer>` im Header trägt. Der alte ADR bekommt dann den Status
`superseded by <neue-nummer>`.
- **Ein ADR pro Entscheidung.** Nicht „ADR für Q2" oder „ADR für Auth-Stack
insgesamt", sondern „ADR für: PocketBase statt Supabase".
- **Begründung vor Details.** Der „Warum"-Teil ist der wertvolle. Wenn du in
sechs Monaten auf den ADR zurückkommst, willst du nicht die Spec lesen,
sondern verstehen, warum diese Wahl damals sinnvoll erschien.
## Namensschema
```
NNNN-kurzer-slug.md
```
Beispiel: `0001-pocketbase-statt-supabase.md`, `0002-caddy-als-reverse-proxy.md`.
## Status-Werte
- `proposed` — wird diskutiert, aber noch nicht gelebt.
- `accepted` — gilt, Code / Betrieb folgt dem.
- `superseded by NNNN` — überholt durch einen neueren ADR.
- `deprecated` — gilt nicht mehr, aber es gibt (noch) keinen Nachfolger.
@@ -0,0 +1,41 @@
# 40 — Workflows
Operative Prozeduren: Deploy, Backup, Restore, Debug-Playbooks, Incident-
Response. Jede Datei beschreibt **eine Prozedur**, die man zur Not um 3 Uhr
morgens halbwach abarbeiten kann.
## Was hier hineingehört
- `deploy.md` — wie wird released?
- `backup.md` — was wird gesichert, wohin, wie oft, wie restoren?
- `debug-<thema>.md` — strukturierte Playbooks für wiederkehrende Debug-Situa-
tionen (z. B. „Mail kommt nicht raus", „DB antwortet langsam").
- `incident-response.md` — erste Schritte bei Ausfall.
## Format
Jede Datei folgt einem einfachen Schema:
```markdown
# <Titel>
**Wann anwenden:** <konkreter Auslöser>
**Voraussetzungen:** <was muss verfügbar / installiert sein>
## Ablauf
1. Schritt
2. Schritt
3. Schritt
## Verifikation
Wie erkenne ich, dass der Prozess erfolgreich war?
## Wenn es schiefgeht
Fallback, Rollback, wen ansprechen.
```
Keine Poesie. Kopierbare Kommandos und harte Fakten — Workflows sind für den
schlechten Tag geschrieben, nicht für den guten.
@@ -0,0 +1,37 @@
# 90 — Status
> **Single Source of Truth** für „wo stehen wir gerade?".
> Wird durch den `handoff`-Skill am Sessionende aktualisiert.
> Manuelle Edits sind erlaubt, aber bitte den Zeitstempel oben anpassen.
**Letzte Aktualisierung:** {{TODAY_ISO}} (via `plan-start`)
**Aktuelle Phase:** {{PROJECT_PHASE}}
---
## Aktueller Stand
<!-- 25 Sätze: was funktioniert, was ist der Status des aktuellen Fokus? -->
Projekt gerade initialisiert. Grundstruktur steht, inhaltliche Ausarbeitung
von `docs/00-overview.md` und `docs/10-plan.md` ist der nächste Schritt.
## Nächste Schritte (priorisiert)
<!-- 35 konkrete, kleine Schritte. Keine Jahresziele. -->
1. `docs/00-overview.md` ausfüllen — Zweck, Ziele, Nicht-Ziele konkretisieren.
2. `docs/10-plan.md` ausfüllen — Phasen und Milestones grob setzen.
3. Erste Architektur-Entscheidungen als ADRs festhalten (`adr <titel>`).
## Offene Entscheidungen / Blocker
<!-- Was wartet auf einen Entschluss? Was blockiert den Fortschritt? -->
_Keine offenen Blocker. Noch keine Entscheidungen getroffen._
## Zuletzt geändert durch
<!-- handoff trägt hier Session-Slug und Datum ein. -->
`plan-start` am {{TODAY_ISO}}
@@ -0,0 +1,45 @@
# {{PROJECT_NAME}}
{{PROJECT_PURPOSE}}
**Aktuelle Phase:** {{PROJECT_PHASE}}
**Stack (grob):** {{PROJECT_STACK}}
---
## Wegweiser für Claude Code
Der Projektstatus lebt in `docs/`, **nicht** in dieser Datei. Diese `CLAUDE.md`
ist bewusst kurz und dient nur der Navigation.
**Bevor du arbeitest, lies in dieser Reihenfolge:**
1. `docs/90-status.md` — wo wir gerade stehen. Single Source of Truth.
2. `docs/10-plan.md` — aktueller Plan, Phasen, offene Milestones.
3. Den neuesten Eintrag in `docs/sessions/` — was in der letzten Session
passiert ist und was als Nächstes dran war.
4. Bei Architektur-Fragen: die relevanten ADRs in `docs/30-decisions/`.
## Workflow-Skills (global installiert)
- `status` — Wiedereinstieg nach Pause: liest 90-status + letztes Session-Log.
- `handoff` — am Sessionende: Session-Log schreiben, Status aktualisieren.
- `adr <titel>` — neue Architektur-Entscheidung festhalten.
- `plan-start` — wurde bereits ausgeführt, um dieses Projekt zu scaffolden.
## Wichtigste Konventionen
- **Prosa auf Deutsch, Code / Kommandos auf Englisch.**
- **ADRs sind append-only.** Ersetzt werden sie durch neue ADRs mit
`Supersedes: <nummer>`, nicht durch Umschreiben der alten.
- **`docs/90-status.md` ist die einzige Datei, die den aktuellen Stand
beschreibt.** Wenn es widersprüchliche Angaben gibt, gewinnt 90-status.
- **Session-Logs sind verpflichtend.** Wer `handoff` überspringt, hat nach drei
Sessions wieder keinen Überblick — nur mit mehr Dateien drumherum.
<!-- TODO: Die drei bis fünf wichtigsten projektspezifischen Kommandos hier
ergänzen, sobald der Stack steht. Beispiele:
- `make dev` — lokale Entwicklung starten
- `pytest -x` — Tests bis zum ersten Fehler
- `docker compose up` — Infrastruktur lokal hochfahren
-->
@@ -0,0 +1,28 @@
# Sessions
Chronologische Session-Logs. Je Session eine Datei, Format:
```
YYYY-MM-DD-<kurzer-slug>.md
```
Beispiel: `2026-04-17-mail-unbound-fix.md`.
Werden vom `handoff`-Skill am Sessionende geschrieben. Manuelles Editieren ist
erlaubt — wer hier schreibt, trägt die aktuelle Wahrheit über das, was passiert
ist.
## Was in einen Session-Log gehört
- **Was wurde gemacht?** Faktisch, knapp, mit Dateipfaden wo relevant.
- **Was ist offen?** Was wurde angefangen und nicht beendet?
- **Nächste Schritte.** 13 konkrete Punkte für die nächste Session.
- **Überraschungen / Erkenntnisse.** Was hat nicht so funktioniert, wie erwartet?
## Was NICHT hineingehört
- Vollständige Code-Listings. Dafür gibt's den Commit.
- Begründungen für Architektur-Entscheidungen. Dafür gibt's ADRs.
- Aktueller Gesamtstand. Dafür gibt's `docs/90-status.md`.
Session-Logs sind **Protokoll**, nicht **Referenz**.
+68
View File
@@ -0,0 +1,68 @@
---
name: status
description: Fasst den aktuellen Projektstand in 510 Zeilen zusammen. Liest docs/90-status.md und den jüngsten Eintrag in docs/sessions/ und destilliert daraus "Wo stehen wir, was ist als Nächstes, was ist offen". Der Wiedereinstiegs-Befehl nach einer Pause.
disable-model-invocation: true
allowed-tools:
- Read
- Bash
---
# status — Wiedereinstieg
## Wann der Skill läuft
Auf expliziten Aufruf, typischerweise am Anfang einer neuen Session — bevor
Claude oder Nutzer irgendwas anderes tun. Zweck: in unter 30 Sekunden einen
verlässlichen Lagebericht bekommen, ohne `git log` oder Datei-Archäologie.
## Was der Skill tut
1. Prüft, ob `docs/90-status.md` existiert.
- Wenn **nein**: meldet „Hier scheint noch keine `plan-start`-Struktur zu
liegen. Entweder ist das kein initialisiertes Projekt, oder du bist im
falschen Ordner." Abbrechen.
2. Liest `docs/90-status.md`.
3. Listet `docs/sessions/*.md` (ohne `README.md`) und öffnet die **chronologisch
jüngste** Datei. Sortierung: die Dateinamen beginnen mit `YYYY-MM-DD`, also
reicht `ls -1 | sort -r | head -n 1`.
4. Liest ggf. `docs/10-plan.md`, aber **nur den Abschnitt „Aktueller Fokus"**
nicht das ganze Dokument, um den Kontext klein zu halten.
5. Destilliert daraus eine **kompakte Ausgabe** in genau dieser Struktur:
```
📍 Stand ({{TODAY_ISO}})
Wo wir stehen:
<23 Sätze, direkt aus 90-status.md abgeleitet>
Aktueller Fokus:
<12 Zeilen aus 10-plan.md / „Aktueller Fokus">
Letzte Session (<Dateiname ohne Extension>):
<12 Sätze, was passiert ist und was offen blieb>
Offene Blocker / Entscheidungen:
<aus 90-status.md — wenn keine, dann "keine">
Empfehlung für heute:
<eine einzige konkrete nächste Aktion>
```
6. Gibt diese Ausgabe als reinen Text aus. **Keine** weitere Konversation,
keine Rückfragen, kein „Soll ich …?".
## Harte Regeln
- **Nicht zusammenfassen, was nicht da ist.** Wenn `90-status.md` veraltet ist
(z. B. letzte Änderung älter als das letzte Session-Log), am Ende der Ausgabe
einen knappen Warnhinweis: „⚠️ 90-status ist älter als das letzte Session-Log
— vermutlich wurde beim letzten Handoff nicht aktualisiert."
- **Nicht kreativ werden.** Keine Interpretation, keine „ich würde empfehlen,
Feature X zu bauen" — der Skill referiert, er plant nicht.
- **Keine Schreib-Operationen.** Dieser Skill liest ausschließlich.
## Wenn der Nutzer dann weiterarbeiten will
Nach der Ausgabe ist der Skill fertig. Die nächste Handlung steuert der
Nutzer — typischerweise durch eine konkrete Frage („los, weiter mit Punkt 2
aus dem Fokus") oder einen anderen Skill-Aufruf.