Nachtrag zum Tailwind-Rauswurf: dx legt die Datei bei jedem vollen Build neu
an - auch nachdem die Eingabedatei geloescht wurde und main.rs sie nicht mehr
verlinkt. Offenbar aus einem eigenen Cache; ein Schalter dagegen war nicht zu
finden.
Statt dagegen anzukaempfen wandert sie in die .gitignore. Sie ist ein lokales
Nebenprodukt ohne Leser, und so taucht sie nicht bei jedem Build als
vermeintliche Aenderung auf.
Die App hat nie eine Tailwind-Utility benutzt - saemtliche Klassen im Code
sind eigene (btn, files-bar, empty-state, ...), und den Reset liefert
base.css selbst. Damit standen package.json, node_modules und ein
Build-Schritt fuer eine Stylesheet-Datei, die nichts beigetragen hat.
Aufgefallen ist es, weil der letzte Commit ungefragt zwoelf Zeilen in
assets/tailwind.css mitbrachte: Der Generator scannt auch docs/ und erzeugte
Utilities fuer Woerter, die er in Prosa fand.
Die npm-Abhaengigkeit war ohnehin wirkungslos - Dioxus 0.7 bringt Tailwind
selbst mit (erzeugt wurde 4.1.5, nicht die in package.json deklarierte 4.3.3).
Ohne die Eingabedatei tailwind.css im Projektwurzelverzeichnis erzeugt dx
nichts mehr; verifiziert durch einen vollstaendigen Build.
Das --dn-Praefix der Tokens bleibt: Es war urspruenglich Schutz vor Tailwinds
eigenen :root-Variablen, taugt aber weiterhin als Namensraum.
README auf den tatsaechlichen Projektstand gebracht - er beschrieb noch die
Dioxus-Vorlage mit einer einzelnen main.rs.
Die App hatte zwei Routable-Enums, zwischen denen ein Signal<bool> umschaltete.
Der Schalter wurde nie gesetzt - beim ersten Umlegen waere aufgefallen, dass
sich beide Router dieselbe History teilen und beide "/" belegen: Wer im
Selector auf "Open Workspace" klickt, steht auf /ws_open, und der
Editor-Router kennt nur / und /editor.
Jetzt ein Enum, der Editor-Teil unter #[nest("/workspace")]. An die Stelle des
bool tritt Signal<Option<Workspace>> in einem Context-Provider - Props
scheiden aus, weil sich durch ein Outlet keine durchreichen lassen. Fehlt der
Workspace, schickt ein Guard im EditorShell-Layout zurueck zum Selector; der
Fall tritt real bei Hot-Reload auf, wo der Context faellt und die Route bleibt.
Der Selector verliert seine Reiter und wird eine einzige Route. Das folgt aus
dem UI-Prototyp in Issue #8: Oeffnen ist der Alltagsfall, Hinzufuegen passiert
pro Workspace einmal - zwei gleichrangige Reiter verlangten bei jedem Start
eine Entscheidung, die fast immer dieselbe ist. Damit entfallen der leere
Stub create_new_workspace.rs, die Tab-Konstante fuer den Selector und die
zugehoerigen CSS-Klassen.
Weil EnumIter nicht mehr gebraucht wird, faellt strum_macros als direkte
Abhaengigkeit weg; strum re-exportiert die Derives bereits.
Entscheidungen dazu in den Issues #5, #6 und #8.
Waehrend der Workspace-Planung sind die Begriffe scharf geworden: Workspace,
Marker, Workspace-Liste, Notiz, Selector, Editor. docs/agents/domain.md sieht
CONTEXT.md als Ort dafuer vor, und die Skills lesen es, bevor sie den Code
erkunden.
Ausserdem festgehalten, dass dieses Projekt seine Entscheidungen im Tracker
fuehrt statt in docs/adr/ - sonst sucht die naechste Session an der falschen
Stelle.
Beide Recherchen lagen bisher nur auf lokalen Wegwerf-Branches. Die
Kurzfassung steht an den Tickets #2 und #3, die Langfassungen sind mit
Quellenangaben und einer Trennung zwischen Belegtem und Vermutetem aber das,
worauf man zurueckkommt, wenn spaeter jemand fragt, warum unter Windows Local
statt Roaming gewaehlt wurde.
Damit sind research/ordner-dialog und research/config-ablageort ueberfluessig
und koennen geloescht werden.
tea issues edit --add-assignees ruft POST /issues/<index>/assignees auf, den
Gitea nicht kennt - der Aufruf endet in einem nackten 404, ohne dass tea das
als Fehlbedienung kenntlich macht. Assignees werden stattdessen per PATCH auf
das Issue gesetzt.
Betrifft direkt den Claim-Schritt jeder Wayfinder-Session, deshalb an beiden
Stellen korrigiert.
Der Endpoint war als ungeprueft markiert. Beim Verdrahten der ersten
Wayfinder-Map hat sich gezeigt: owner und repo muessen im Body wiederholt
werden, der Pfad allein reicht nicht. Ohne sie schlaegt der Aufruf mit
"repository does not exist [owner_name: ]" fehl, was in eine falsche Richtung
zeigt. Die von tea dokumentierten {owner}/{repo}-Platzhalter werden hier
ebenfalls nicht ersetzt.
Die Engineering-Skills (wayfinder, triage, to-tickets, to-spec) erwarten pro
Repo eine Tracker-Beschreibung. Hier ist das Gitea, nicht GitHub oder GitLab -
der Host heisst zwar gitlab.hive-brain.de, spricht aber die Gitea-API, also
tea statt glab.
Issue-Dependencies und Sub-Issues kann tea 0.15 nicht abbilden; beides ist in
der Doku als ungeprueft bzw. mit Body-Konvention als Fallback vermerkt, damit
keine Session sich auf ungetestete Kommandos verlaesst.
Fuenf Formular-Komponenten nach dem Muster von CustomLink: eigene
Props-Struct plus Komponentenfunktion, controlled - der Zustand bleibt beim
Aufrufer, die Komponente meldet Aenderungen per Callback.
Bewusst native HTML-Elemente statt eigener Popups und Listen: <select> fuers
Dropdown, <input type=checkbox|radio> fuer Multi- und Single-Select. Damit
kommen Tastaturbedienung, Screenreader-Support und die Auswahldialoge auf
Mobilgeraeten ohne eigenen Code.
CustomMultiSelect liefert dem Callback die vollstaendige neue Auswahl statt
nur der angeklickten Option, sonst muesste jede Aufrufstelle die
Umschaltlogik nachbauen. Diese Logik steckt in toggled() und ist getestet.
Zwei Router: WorkspaceRoute (Workspace anlegen/oeffnen) und EditorRoute
(Home/Editor), umgeschaltet ueber ein Signal in App.
Die Navigationslinks werden nicht mehr einzeln ausgeschrieben, sondern aus
dem Routen-Enum erzeugt (strum EnumIter). Die Beschriftung haengt per
#[strum(message = "...")] an der Variante selbst, damit eine neue Route nur
an einer Stelle gepflegt werden muss.
CustomLink kapselt Link und markiert den aktiven Eintrag ueber active_class
statt ueber eigenen Klick-Zustand - das funktioniert auch bei Deep-Links und
dem Zurueck-Button.
Cargo-, Dioxus- und Tailwind-Konfiguration, Clippy-Regeln, Assets und
Stylesheets (tokens/base/layout/components). Cargo.lock wird eingecheckt,
da es sich um ein Binary-Crate handelt.
node_modules/ und .idea/ per .gitignore ausgeschlossen.