feat: Knoten-IDs (#auth) parsen — doppelte ID warnt (SPEC §1, D36)
Extraktionsschritt 6 (nach den Tags): das erste alleinstehend angesetzte `#name`-Token wird die Knoten-ID (Zeichenmenge wie `@name`); weitere `#`-Token bleiben im Label (reservierte Ticket-Referenzen), `:#a,#b` und `C#` werden nicht gefressen. Doppelte ID → Warnung duplicateId an der späteren Zeile mit Nennung der ersten; die spätere gilt trotzdem. Sichtbar im Tooltip (erste Position) und als a11yId im aria-label — noch keine eigene Diagramm-Darstellung. Legendenzeile + Warntext in allen 9 Sprachen; die drei `#`-Erwähnungen im mitgelieferten Plan sind eingeklammert, damit sie Erwähnungen bleiben. 12 neue Tests (tests/ids.test.js). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
d276c94840
commit
6ecf3e4c69
@@ -1660,3 +1660,45 @@ kopierten Regeln — hätte jede künftige Layoutänderung doppelt pflegen lasse
|
||||
Im Modell ist `'xor'` ein eigener Gate-Wert (`gateOf`), damit die
|
||||
`mixedGate`-Warnung Mischungen mit `|` von selbst meldet; alle
|
||||
Disjunktiv-Abfragen prüfen `!== 'and'`.
|
||||
|
||||
## D36 — Knoten-IDs (`#auth`) umgesetzt: eng gefasst, sichtbar nur im Tooltip
|
||||
Der erste Baustein der Phase-4-Kette (ohne IDs keine Abhängigkeiten, ohne die
|
||||
kein effektiver Status). Vier Festlegungen, die §11 offen ließ:
|
||||
|
||||
**Zeichenmenge wie `@name`, nicht „whitespace-frei“.** §11 sagte „ein
|
||||
whitespace-freier Bezeichner“; umgesetzt ist die engere Menge aus §7
|
||||
(Unicode-Buchstaben, Ziffern, `.`, `_`, `-`). Drei Gründe: Konsistenz mit den
|
||||
beiden Nachbarn (`@name` heute, `&tag` reserviert mit derselben Menge, D34);
|
||||
ein `#a/b` oder `#a:b` liefe sonst in dieselben Kollisionen, vor denen §11 bei
|
||||
`:` und Pfaden gerade ausweicht; und enger → weiter ist später kompatibel
|
||||
möglich, umgekehrt nicht.
|
||||
|
||||
**Nur alleinstehend angesetzt** (`(^|\s)#…`, wie beim reservierten `&tag`):
|
||||
„C#“ bleibt ein Label, und — entscheidend für den nächsten Schritt — die
|
||||
Abhängigkeits-Schreibweise `:#a,#b` wird **nicht** als ID gefressen, weil dort
|
||||
`:` bzw. `,` vor dem `#` steht. Die ID-Extraktion muss beim Bau der
|
||||
Abhängigkeiten also nicht angefasst werden.
|
||||
|
||||
**Das erste Token ist die ID, weitere bleiben im Label.** Die ID benennt genau
|
||||
einen Knoten — mehr als eine pro Zeile ergibt keinen Sinn. Alles nach dem
|
||||
ersten Treffer bleibt unangetastet stehen, denn dort wohnt die reservierte
|
||||
Ticket-Referenz (`… #123 …`, §11): Sie soll sichtbar im Label bleiben, bis das
|
||||
Taiga-Feature sie auflöst. Deshalb wurden auch die drei `#`-Vorkommen im
|
||||
mitgelieferten Plan eingeklammert (`(#auth)`, `(#123)`) — als Erwähnungen sind
|
||||
sie keine IDs, und `#123` wäre sonst doppelt vergeben gewesen (Zeile 25/162).
|
||||
|
||||
**Sichtbar im Tooltip und `aria-label`, sonst nirgends.** Die ID gehört nicht
|
||||
zum Label (sonst änderte das spätere Entfernen die Knoten-Identität der
|
||||
„Was ist neu?“-Anzeige, D28). Ganz unsichtbar wäre aber nutzerfeindlich —
|
||||
getippter Text verschwände spurlos. Der Tooltip zeigt `#id` als erste Zeile,
|
||||
der Screenreader bekommt `a11yId`; ein eigenes Badge bekommt sie erst, wenn
|
||||
etwas darauf zeigt (Querverbindungen, §11) — die Knoten-Ecken sind belegt
|
||||
(D18).
|
||||
|
||||
**Doppelte ID: Warnung an der späteren Zeile, mit Nennung der ersten.** Die
|
||||
Meldung zeigt dorthin, wo man eingreifen muss, und `{firstLine}` erspart das
|
||||
Suchen. Die spätere ID gilt trotzdem am Knoten (fehlertolerant wie §4);
|
||||
welcher Knoten bei Verweisen „gewinnt“, entscheidet erst die
|
||||
Abhängigkeits-Auflösung — dort ist die Warnung dann schon da. Eine Zeile, die
|
||||
**nur** aus einer ID besteht, wird wie jede leere Zeile ignoriert und belegt
|
||||
die ID nicht.
|
||||
|
||||
+31
-7
@@ -19,8 +19,27 @@ dieser Reihenfolge (wichtig für Kollisionsfreiheit):
|
||||
3. URL: erstes Token, das auf `https?://\S+` passt (dadurch stören `@` in URLs nicht).
|
||||
4. Größe: erstes `(XS|S|M|L|XL|XXL)`, Groß-/Kleinschreibung egal.
|
||||
5. Tags: alle `@name`-Vorkommen.
|
||||
6. Fokusmarke: `!!!` als **alleinstehendes** Token (siehe unten).
|
||||
7. Rest, whitespace-normalisiert = Label. Leeres Label ⇒ Zeile ignorieren.
|
||||
6. Knoten-ID: das **erste** alleinstehend angesetzte `#name`-Token (siehe unten).
|
||||
7. Fokusmarke: `!!!` als **alleinstehendes** Token (siehe unten).
|
||||
8. Rest, whitespace-normalisiert = Label. Leeres Label ⇒ Zeile ignorieren.
|
||||
|
||||
**Knoten-ID `#name`** — benennt einen Knoten im **ganzen Dokument** eindeutig;
|
||||
sie ist die Adresse für Abhängigkeiten und Beschreibungsblöcke (§11).
|
||||
|
||||
- Zeichenmenge wie bei `@name` (§7): Unicode-Buchstaben, Ziffern, `.`, `_`, `-`.
|
||||
(Enger als das frühere „whitespace-frei“ aus §11 — Begründung: D36.)
|
||||
- Erkannt nur **alleinstehend angesetzt** (`(^|\s)#…`): „C#“ bleibt damit ein
|
||||
Label, und der für Abhängigkeiten reservierte Doppelpunkt `:#a,#b` (§11)
|
||||
kollidiert nicht.
|
||||
- Das **erste** solche Token der Zeile ist die ID; weitere `#`-Token bleiben im
|
||||
Label stehen (dort liegt die reservierte Ticket-Referenz `#123`, §11). Eine
|
||||
rein numerische ID ist zugleich die künftige Ticket-Referenz — oft ist die
|
||||
Ticket-Nummer die natürliche Knoten-ID (D34).
|
||||
- Die ID gehört **nicht** zum Label. Eine eigene Darstellung im Diagramm hat
|
||||
sie (noch) nicht; sichtbar ist sie im Knoten-Tooltip und im `aria-label`.
|
||||
- **Doppelte ID:** Warnung `duplicateId` mit beiden Zeilennummern; die spätere
|
||||
ID gilt trotzdem am Knoten (fehlertolerant wie §4 — die Zeile geht nicht
|
||||
verloren).
|
||||
|
||||
**Fokusmarke `!!!`** — „schau hier hin": Der Knoten wird im Diagramm
|
||||
hervorgehoben und ins Bild geholt (§9). Gedacht für das gemeinsame Arbeiten an
|
||||
@@ -45,7 +64,13 @@ Referenz-Regex der Implementierung:
|
||||
^([ \t]*)([-|+]|=(?=[ \t]))?\s*(?:\[([ ?~xX^/-])\]\s*)?(.*)$
|
||||
```
|
||||
|
||||
Für die Fokusmarke (Schritt 6):
|
||||
Für die Knoten-ID (Schritt 6, nur der erste Treffer):
|
||||
|
||||
```
|
||||
(^|\s)#([\p{L}\p{N}._-]+)
|
||||
```
|
||||
|
||||
Für die Fokusmarke (Schritt 7):
|
||||
|
||||
```
|
||||
(^|\s)!!!(?=\s|$)
|
||||
@@ -532,10 +557,9 @@ das auch. Begründung und Zusammenhang: D34.
|
||||
- `#123` — Referenz auf externe Tickets (geplant für Taiga-Integration).
|
||||
Ticket-Referenzen werden **so** notiert, weil es die etablierte
|
||||
Kurzschreibweise ist; sie haben unter den `#`-Verwendungen Vorrang.
|
||||
- `#auth` — **Knoten-ID**: ein whitespace-freier Bezeichner, der einen Knoten im
|
||||
ganzen Dokument eindeutig benennt. Ziel für Abhängigkeiten und
|
||||
Beschreibungsblöcke (siehe unten). Zwei Knoten mit derselben ID sind ein
|
||||
Fehler und bekommen eine Warnung mit Zeilennummer (§4).
|
||||
- `#auth` — **Knoten-ID**: **umgesetzt**, Definition jetzt in §1 (Zeichenmenge,
|
||||
Alleinstehend-Regel, Warnung `duplicateId`). Ziel für Abhängigkeiten und
|
||||
Beschreibungsblöcke (siehe unten).
|
||||
|
||||
Beide Rollen vertragen sich: Oft **ist** die Ticket-Nummer die natürliche
|
||||
Knoten-ID. Als Ticket-Link behandelt wird heuristisch das rein **numerische**
|
||||
|
||||
+6
-1
@@ -71,7 +71,12 @@ entscheiden, **bevor** Code entsteht.
|
||||
numerisch, oft zugleich die natürliche Knoten-ID; notfalls Präfix wie
|
||||
`#t123`); Schlagworte gehen auf `&tag` — niedrig priorisiert, gebaut
|
||||
erst mit dem ersten Konsumenten (D34-Nachtrag).
|
||||
- [ ] Knoten-IDs parsen; doppelte ID → Warnung mit Zeilennummer.
|
||||
- [x] Knoten-IDs parsen; doppelte ID → Warnung mit Zeilennummer.
|
||||
→ Umgesetzt (D36): Zeichenmenge wie `@name`, nur alleinstehend angesetzt
|
||||
und nur das erste Token je Zeile (`:#a,#b` und Ticket-Erwähnungen bleiben
|
||||
unberührt); Warnung `duplicateId` nennt beide Zeilen; sichtbar im
|
||||
Tooltip + `aria-label`; SPEC-§11-Teil nach §1 überführt;
|
||||
`tests/ids.test.js`.
|
||||
- [ ] Abhängigkeiten `:#a,#b` parsen; unbekannte ID → Warnung, Zyklen erlaubt.
|
||||
- [ ] Effektiven Status rechnen (intrinsisch + Abhängigkeiten); Darstellung
|
||||
entscheiden — die Knotenfarbe zeigt heute den intrinsischen Status.
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
- [^] People tags, bare URLs, %% comments (XS)
|
||||
- [^] And/or decomposition (S)
|
||||
- [^] Optional nodes — neither required nor an alternative (S)
|
||||
- [?] Node IDs, #auth (S) %% often just the ticket number, see SPEC §11
|
||||
- [x] Node IDs (#auth) (S) %% often just the ticket number, see SPEC §11
|
||||
+ [?] Free tags, &tag (M) %% only together with a consumer, see D34
|
||||
- [?] A lens: highlight every node tagged &x (S)
|
||||
- [?] Dependencies across the tree, :#auth,#api (M)
|
||||
@@ -22,7 +22,7 @@
|
||||
- [?] A short text right at the node (S) %% indentation already means hierarchy
|
||||
- [?] A long block at the end, addressed by its id (S)
|
||||
- [-] A separate storage format for the structure (L) %% the text is the format
|
||||
- [ ] Ticket references #123 (S)
|
||||
- [ ] Ticket references (#123) (S)
|
||||
- [?] Benefit per node, not only cost (M)
|
||||
| [?] Another sigil next to the size (S)
|
||||
| [?] Story points behind the T-shirt sizes (M)
|
||||
@@ -159,7 +159,7 @@
|
||||
| [?] Run the one JS parser inside the IDE (M)
|
||||
- [?] Tracker integration (XL)
|
||||
| [?] Taiga (L) https://taiga.io
|
||||
- [ ] Resolve #123 over the REST API (M)
|
||||
- [ ] Resolve "#123" over the REST API (M)
|
||||
- [ ] Read title, link and status (S)
|
||||
- [ ] Map the workflow onto the states (S)
|
||||
- [?] Write the status back (M)
|
||||
|
||||
Reference in New Issue
Block a user