docs: Beispiel-Dokument zeigt die neuen Features (INITIAL, D27-Nachtrag)

Das mitgelieferte „Example" führt jetzt alles vor: eingeklapptes
Concept-Kapitel (>) mit "-Hinweis am Wurzelknoten, Knoten-ID #cms mit
Langbeschreibung hinter ---, eine Abhängigkeit samt bewusster Diskrepanz
(Landing page [x], effektiv geplant — Farbe + [x]-Marke + gepunktete
Kante), eine Zugabe (+ Dark mode) und die Hosting-Wahl als =-Gruppe.
Damit Bestandsnutzer die neue Fassung sehen, zieht seedShippedDocs das
Beispiel jetzt wie das Werkbaum-Dokument per Fingerabdruck nach
(werkbaum-seeded-example, D27-Nachtrag) — nur bei unverändertem Text,
der Reset setzt beide Merker. 21 Knoten, 0 Warnungen.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
mhoennig
2026-08-22 19:34:00 +02:00
co-authored by Claude Fable 5
parent 1cd1d30d1b
commit c6f42f8da1
3 changed files with 43 additions and 6 deletions
+11
View File
@@ -698,6 +698,17 @@ Der Altwert `'1'` aus der ersten Fassung sagt nichts über den Textstand; dort
wird bewusst nichts überschrieben, nur der Merker ersetzt. Wer aus dieser kurzen wird bewusst nichts überschrieben, nur der Merker ersetzt. Wer aus dieser kurzen
Zwischenfassung kommt, holt den aktuellen Stand über den Reset. Zwischenfassung kommt, holt den aktuellen Stand über den Reset.
**Nachtrag — das Nachziehen gilt jetzt auch für das Beispiel-Dokument.** Als
das Beispiel die neuen Notations-Features (IDs, Abhängigkeiten, `=`, Falten,
Beschreibungen) vorführen sollte, stand es vor demselben Problem wie damals
der Werkbaum-Plan: Ohne Merker erreicht eine neue INITIAL-Fassung
Bestandsnutzer nie — ihr unverändertes Beispiel sieht nur wie „bearbeitet“
aus. Ein zweiter Fingerabdruck (`werkbaum-seeded-example`) überträgt die
D27-Regeln wörtlich: nachgezogen wird nur, solange der Text exakt die zuletzt
ausgelieferte Fassung ist; bearbeitete Texte werden nie angefasst; ein
gelöschtes Beispiel wird vom Nachziehen nicht wiederbelebt (das macht bei
Bedarf `deleteDoc`/Reset). Der Reset setzt beide Merker mit.
## D28 — „Was ist neu?": neu in Produktion, gelber Strahlenkranz ## D28 — „Was ist neu?": neu in Produktion, gelber Strahlenkranz
Dokumente von außen (mitgeliefert, D27; per `?sourceUrl=`, D23) ändern sich, Dokumente von außen (mitgeliefert, D27; per `?sourceUrl=`, D23) ändern sich,
ohne dass der Betrachter es merkt. Sie zeigen deshalb, was sich seit seinem ohne dass der Betrachter es merkt. Sie zeigen deshalb, was sich seit seinem
+4 -1
View File
@@ -102,7 +102,10 @@ verworfene Elemente. Quelle sind ES-Module unter `src/`; `index.html` ist der
- Beispiel-Dokument (D22): reservierte id `EXAMPLE_ID = 'example'`, fester - Beispiel-Dokument (D22): reservierte id `EXAMPLE_ID = 'example'`, fester
englischer Name `EXAMPLE_NAME = 'Example'` (nicht lokalisiert). `loadDocs()` englischer Name `EXAMPLE_NAME = 'Example'` (nicht lokalisiert). `loadDocs()`
adoptiert einen Alt-Zustand (zufällige id, „Beispiel") nur, wenn dessen adoptiert einen Alt-Zustand (zufällige id, „Beispiel") nur, wenn dessen
`text === INITIAL` (nie echte Nutzerinhalte). `resetToDefaults()` setzt **nur** `text === INITIAL` (nie echte Nutzerinhalte). Eine neue INITIAL-Fassung wird
wie beim Werkbaum-Dokument per Fingerabdruck nachgezogen
(`werkbaum-seeded-example`, D27-Nachtrag) — nur bei unverändertem Text; der
Reset setzt beide Merker. `resetToDefaults()` setzt **nur**
das Beispiel-Dokument (id `example`) auf `INITIAL`/„Example" zurück und verwirft das Beispiel-Dokument (id `example`) auf `INITIAL`/„Example" zurück und verwirft
`werkbaum-ui`/`werkbaum-lang`/Update-Flags — **andere Dokumente bleiben stehen** `werkbaum-ui`/`werkbaum-lang`/Update-Flags — **andere Dokumente bleiben stehen**
(nicht mehr pauschal alle `werkbaum-*` löschen!). Das letzte gelöschte Dokument (nicht mehr pauschal alle `werkbaum-*` löschen!). Das letzte gelöschte Dokument
+28 -5
View File
@@ -12,7 +12,8 @@ import WERKBAUM_DOC from '../../docs/examples/werkbaum.werkbaum?raw';
const INITIAL = `%% Project structure Sprint 14 const INITIAL = `%% Project structure Sprint 14
[~] Website relaunch (XL) https://wiki.example.com/relaunch [~] Website relaunch (XL) https://wiki.example.com/relaunch
- [x] Concept (M) " Folded chapters are done — click the ▸ to peek inside.
- > [x] Concept (M)
- [x] Audience analysis (S) - [x] Audience analysis (S)
- [x] Sitemap (XS) - [x] Sitemap (XS)
- [~] Implementation (XL) - [~] Implementation (XL)
@@ -23,13 +24,20 @@ const INITIAL = `%% Project structure Sprint 14
- [ ] Android (M) - [ ] Android (M)
- [ ] iOS (M) - [ ] iOS (M)
- [!] Backend (L) @ben @carla - [!] Backend (L) @ben @carla
- [ ] CMS integration (M) - [ ] CMS integration #cms (M)
| [ ] WordPress | [ ] WordPress
| [?] Headless CMS | [?] Headless CMS
| [-] Custom build %% too much effort | [-] Custom build %% too much effort
- [?] Hosting (M) - [x] Landing page (S) :#cms %% done, but effectively waiting for the CMS
| Cooperative Community Cloud https://hostsharing.net + [?] Dark mode (S) %% nice to have, never on the cheapest path
| On-premise`; - [?] Hosting (M) %% exactly one of these, hence =
= [ ] Cooperative Community Cloud https://hostsharing.net
= [?] On-premise
---
#cms
The articles live in the CMS, so everything that shows content
depends on it — the dotted arrows point at what is needed.`;
const src = document.getElementById('src'); const src = document.getElementById('src');
const out = document.getElementById('out'); const out = document.getElementById('out');
@@ -2029,6 +2037,7 @@ fsBtn.addEventListener('click', () => {
const LS_UI = 'werkbaum-ui', LS_SRC = 'werkbaum-src'; const LS_UI = 'werkbaum-ui', LS_SRC = 'werkbaum-src';
const LS_DOCS = 'werkbaum-docs', LS_ACTIVE = 'werkbaum-active'; const LS_DOCS = 'werkbaum-docs', LS_ACTIVE = 'werkbaum-active';
const LS_SEEDED = 'werkbaum-seeded'; /* mitgelieferte Dokumente schon angelegt? */ const LS_SEEDED = 'werkbaum-seeded'; /* mitgelieferte Dokumente schon angelegt? */
const LS_SEEDED_EXAMPLE = 'werkbaum-seeded-example'; /* Fingerabdruck der ausgelieferten INITIAL-Fassung (D27-Nachtrag) */
let restoring = false; /* unterdrückt Speichern während des Wiederherstellens */ let restoring = false; /* unterdrückt Speichern während des Wiederherstellens */
let hadStoredUI = false; /* gab es beim Laden schon gespeicherte GUI-Einstellungen? */ let hadStoredUI = false; /* gab es beim Laden schon gespeicherte GUI-Einstellungen? */
@@ -2094,6 +2103,19 @@ function seedShippedDocs(){
doc.text = WERKBAUM_DOC; doc.text = WERKBAUM_DOC;
} }
try{ localStorage.setItem(LS_SEEDED, fp); }catch(_){} try{ localStorage.setItem(LS_SEEDED, fp); }catch(_){}
/* Dasselbe Nachziehen für das Beispiel-Dokument (D27-Nachtrag): Ohne den
Merker erreichte eine neue Fassung von INITIAL Bestandsnutzer nie —
ihr unverändertes Beispiel sähe nur wie „bearbeitet" aus. Nachgezogen
wird nur, solange der Text exakt die zuletzt ausgelieferte Fassung ist;
ein gelöschtes Beispiel wird hier nicht wiederbelebt. */
const exFp = fingerprint(INITIAL);
let exSeen = null;
try{ exSeen = localStorage.getItem(LS_SEEDED_EXAMPLE); }catch(_){}
const ex = docs.find(d => d.id === EXAMPLE_ID);
if(exSeen && exSeen !== exFp && ex && fingerprint(ex.text) === exSeen){
ex.text = INITIAL;
}
try{ localStorage.setItem(LS_SEEDED_EXAMPLE, exFp); }catch(_){}
/* Nur vergleichen, solange der Text der ausgelieferte ist — hat der Nutzer ihn /* Nur vergleichen, solange der Text der ausgelieferte ist — hat der Nutzer ihn
bearbeitet, gibt es keine saubere Vergleichsbasis (D28). */ bearbeitet, gibt es keine saubere Vergleichsbasis (D28). */
const shipped = docs.find(d => d.id === WERKBAUM_ID); const shipped = docs.find(d => d.id === WERKBAUM_ID);
@@ -3162,6 +3184,7 @@ function resetToDefaults(){
/* Merker auf den jetzt ausgelieferten Stand setzen (D27) — sonst hielte ein /* Merker auf den jetzt ausgelieferten Stand setzen (D27) — sonst hielte ein
Altwert die spätere Nachzieh-Logik davon ab, den Text je zu aktualisieren. */ Altwert die spätere Nachzieh-Logik davon ab, den Text je zu aktualisieren. */
try{ localStorage.setItem(LS_SEEDED, fingerprint(WERKBAUM_DOC)); }catch(_){} try{ localStorage.setItem(LS_SEEDED, fingerprint(WERKBAUM_DOC)); }catch(_){}
try{ localStorage.setItem(LS_SEEDED_EXAMPLE, fingerprint(INITIAL)); }catch(_){}
activeId = EXAMPLE_ID; activeId = EXAMPLE_ID;
persistDocs(); persistDocs();
logUpdate('🔄 Mitgelieferte Dokumente und Einstellungen zurückgesetzt'); logUpdate('🔄 Mitgelieferte Dokumente und Einstellungen zurückgesetzt');