Eingangsordner input/ und Skill sn-einlesen (#5)

- input/ ist lokal und nicht versioniert (.gitignore); scripts/einlesen.py
  legt ihn bei Bedarf an.
- scripts/einlesen.py ordnet jede Datei ein: abgelehnt (kein .md, nicht
  UTF-8, leer, Unterordner), neu, geändert, eingelesen. Für neue und
  geänderte Dateien: Prozessname, Ordnernamen-Vorschlag, ob schon eine
  Arbeitsschritt-.md, und ähnliche Prozesse aus prozesse/ und entwuerfe/.
  „vermerk“ schreibt nach Erfolg eine erste Zeile
  <!-- eingelesen: <Zeitstempel> | neu|aktualisiert | <Ziel> | inhalt: <sha> -->;
  die Prüfsumme erkennt spätere Änderungen. Zeilenenden bleiben erhalten.
- Skill sn-einlesen: Übersicht, Bestandsvergleich, Entscheidung des
  Nutzers, neue Prozesse durch sn-bpmn, Vermerk nur bei Erfolg.
- docs/leitfaden/07_prozesse_einlesen.md: Ablauf für neue Nutzer.
- AGENTS.md, README, Leitfaden 03, Skill sn-bpmn, Fallstricke, STATUS.
- Tests: python -m pytest -q -> 79 bestanden (18 neu in
  tests/test_einlesen.py).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-09-23 14:09:48 +02:00
co-authored by Claude Opus 5.5
parent 47b59e2d83
commit 27589749ff
13 changed files with 769 additions and 7 deletions
+3 -1
View File
@@ -19,7 +19,9 @@ schreibst oder bearbeitest.
## Ablauf
1. **Quelle ermitteln.** Frage nach der Rohtext-, Word- oder PDF-Quelle,
falls keine angegeben oder angehängt wurde. Gibt es den Prozess schon
falls keine angegeben oder angehängt wurde. Liegen Beschreibungen im
Eingangsordner `input/`, übernimmt der Skill `sn-einlesen` die Steuerung
und ruft diesen Skill je Datei auf. Gibt es den Prozess schon
unter `prozesse/<name>/`, ist dessen `<name>.md` der Ausgangspunkt:
dann auf einem Arbeitsbranch direkt dort ändern statt in `entwuerfe/`,
und nach Schritt 3 mit Schritt 5 weitermachen.
+97
View File
@@ -0,0 +1,97 @@
---
name: sn-einlesen
description: Liest den Eingangsordner input/ ein - prüft die Dateien (vorerst nur .md), sucht zu jeder neuen Prozessbeschreibung bereits vorhandene Prozesse, lässt den Nutzer über das weitere Vorgehen entscheiden, führt neue Prozesse durch den Skill sn-bpmn und vermerkt erfolgreiches Einlesen mit Zeitstempel in der Datei. Verwenden bei "lies input ein", "einlesen", "neue Prozesse im Eingang", "was liegt in input".
---
# Eingangsordner einlesen
`input/` im Workspace-Root ist der Eingang für Prozessbeschreibungen. Er ist **nicht versioniert** (`.gitignore`)
und kann interne Inhalte enthalten. Ablauf für Menschen: `docs/leitfaden/07_prozesse_einlesen.md`.
**Grundregeln**
- Dateien in `input/` werden **nie gelöscht, verschoben oder umbenannt**. Der einzige Eingriff ist der Vermerk
nach erfolgreichem Einlesen – über das Skript, nie von Hand.
- **Eine Datei nach der anderen**, jede bis zu einer Entscheidung des Nutzers. Nicht mehrere Prozesse parallel
entwerfen.
- Inhalte aus `input/` landen nur bereinigt (ohne Namen, Aktenzeichen, Verfahrensdaten) in `entwuerfe/` oder
`prozesse/`.
## 1. Eingang prüfen
```bash
python scripts/einlesen.py --json
```
Das Skript legt `input/` an, falls es fehlt, und ordnet jede Datei ein:
| Status | Bedeutung | Was tun |
|---|---|---|
| `abgelehnt` | kein `.md` (vorerst nur Markdown), keine UTF-8-Datei, leer oder Unterordner | Nur melden, mit Grund. Nicht öffnen, nicht umwandeln. Hinweis, wie es geht (`07_prozesse_einlesen.md` Abschnitt 2). |
| `eingelesen` | Vermerk vorhanden, Inhalt seitdem unverändert | Überspringen, nur in der Zusammenfassung nennen. |
| `neu` | `.md` ohne Vermerk | Abschnitt 2. |
| `geändert` | Vermerk vorhanden, Inhalt danach geändert | Abschnitt 2; dem Nutzer sagen, wann und wohin sie zuletzt eingelesen wurde (`vermerk`). |
Dem Nutzer zuerst eine kurze Übersicht geben (je Status die Dateien), dann mit der ersten neuen oder
geänderten Datei beginnen. Ist nichts zu tun: ein Satz, fertig.
## 2. Je Datei: Gibt es den Prozess schon?
1. Datei lesen. In zwei Sätzen zusammenfassen, welchen Prozess sie beschreibt (Anlass, Ergebnis, Beteiligte
als Funktionen).
2. Bestand prüfen. Das Skript liefert `kandidaten` (Name und Wortüberschneidung, Schwelle 0,25) und die Liste
`bestand` aller Prozesse unter `prozesse/` und lokalen Entwürfe in `entwuerfe/`. **Die Zahl ist nur ein
Hinweis:** die `.md` der Kandidaten lesen und fachlich beurteilen, ob derselbe Ablauf gemeint ist. Auch die
Titel in `bestand` durchgehen – ein anders benannter Prozess kann derselbe sein.
3. Ergebnis mitteilen: „kein vorhandener Prozess“ oder „ähnlich zu …, weil …“ mit den Unterschieden.
## 3. Nutzer entscheiden lassen
**Gibt es einen passenden vorhandenen Prozess**, den Nutzer fragen (in Claude Code mit der Rückfrage-Funktion,
eine Frage je Datei) – und nichts tun, bevor er geantwortet hat:
| Option | Folge |
|---|---|
| **Vorhandenen Prozess aktualisieren** | Abschnitt 4b |
| **Als neuen, eigenen Prozess anlegen** (Namen vorschlagen, `vorschlag_name` als Ausgangspunkt, nicht gleich dem vorhandenen) | Abschnitt 4a |
| **Datei überspringen** | Kein Vermerk; die Datei erscheint beim nächsten Mal wieder als `neu`/`geändert`. |
| **Einlesen beenden** | Zusammenfassung (Abschnitt 6), restliche Dateien unberührt. |
**Gibt es keinen passenden Prozess**, ist die Datei ein neuer Prozess: Namensvorschlag nennen und mit 4a
beginnen. Der Nutzer kann den Namen dabei ändern.
## 4a. Neuer Prozess – wie im Skill `sn-bpmn`
Den Skill `sn-bpmn` ab Schritt 2 durchlaufen, mit der Datei aus `input/` als Quelle:
- Ist die Datei schon eine gültige Arbeitsschritt-`.md` (`arbeitsschritt_md: true`), sie nach
`entwuerfe/<name>.md` kopieren (ohne Vermerkzeilen), gegen `Modellierregeln.md` prüfen und Abweichungen nennen.
Sonst den Entwurf aus dem Rohtext ableiten, wie in `sn-bpmn` Schritt 2.
- **Auf Freigabe warten** (`sn-bpmn` Schritt 3). Vorschau anbieten: `python scripts/vorschau.py entwuerfe/<name>.md`.
- Nach Freigabe umwandeln (`sn-bpmn` Schritt 4). Das ist der **Erfolg** für einen neuen Prozess.
- Ablegen unter `prozesse/` nur auf Wunsch (`sn-bpmn` Schritt 5; braucht ein Issue und einen Pull Request).
## 4b. Vorhandenen Prozess aktualisieren
- **Liegt er unter `prozesse/`:** Änderungen an versionierten Modellen gehen über Issue, Branch und Pull Request
(`AGENTS.md`). Gibt es kein Issue, einen Entwurf vorbereiten (Skill `sn-ticket`) und warten. Dann auf dem
Branch `prozesse/<name>/<name>.md` um die neuen Inhalte ergänzen, Unterschiede dem Nutzer zeigen, auf
Freigabe warten, `python scripts/pruefe_prozesse.py --erzeugen`, `python -m pytest -q`, im Steckbrief unter
„Änderungen“ eintragen. **Erfolg** = Änderung committet.
- **Ist er nur ein lokaler Entwurf in `entwuerfe/`:** den Entwurf ergänzen, Unterschiede zeigen, auf Freigabe
warten, neu umwandeln. **Erfolg** = neue `.bpmn` erzeugt.
## 5. Vermerk – nur bei Erfolg
```bash
python scripts/einlesen.py vermerk input/<datei>.md --ergebnis neu --ziel entwuerfe/<name>.md
python scripts/einlesen.py vermerk input/<datei>.md --ergebnis aktualisiert --ziel prozesse/<name>/
```
Das Skript schreibt als erste Zeile einen HTML-Kommentar mit Zeitstempel, Ergebnis, Ziel und Inhalts-Prüfsumme;
ältere Vermerke bleiben darunter stehen. Kein Vermerk bei Überspringen, Abbruch, fehlender Freigabe oder
fehlgeschlagener Umwandlung.
## 6. Zusammenfassung
Am Ende eine Tabelle: Datei | Status vorher | Entscheidung | Ergebnis (Pfad) | Vermerk ja/nein. Dazu abgelehnte
Dateien mit Grund und, falls etwas unter `prozesse/` geändert wurde, den vorbereiteten Pull-Request-Text
(vollständig nach `docs/vorlagen/pull_request.md`). Push und Pull Request macht der Mensch.