diff --git a/global/settings.json b/global/settings.json index 4f91943..0b598cc 100644 --- a/global/settings.json +++ b/global/settings.json @@ -1,10 +1,4 @@ { - "enabledPlugins": { - "frontend-design@claude-plugins-official": true - }, - "promptSuggestionEnabled": false, - "awaySummaryEnabled": false, - "theme": "dark", "permissions": { "allow": [ "Bash(git add:*)", @@ -19,5 +13,13 @@ "Bash(cd:*)", "Bash(~/claude-projects/global/bin/git-sync:*)" ] - } + }, + "enabledPlugins": { + "frontend-design@claude-plugins-official": true, + "swift-lsp@claude-plugins-official": true + }, + "promptSuggestionEnabled": false, + "awaySummaryEnabled": false, + "tui": "fullscreen", + "theme": "dark" } diff --git a/misc/misc-icon.icns b/misc/misc-icon.icns new file mode 100644 index 0000000..6c57ec7 Binary files /dev/null and b/misc/misc-icon.icns differ diff --git a/misc/misc-icon.png b/misc/misc-icon.png new file mode 100644 index 0000000..8aae406 Binary files /dev/null and b/misc/misc-icon.png differ diff --git a/robotunits/memory/MEMORY.md b/robotunits/memory/MEMORY.md index 2536876..0074d4a 100644 --- a/robotunits/memory/MEMORY.md +++ b/robotunits/memory/MEMORY.md @@ -1,3 +1,7 @@ # Memory Index - [Würth plato-backend ist strikt read-only](wuerth-plato-backend-read-only.md) — niemals Änderungen in /home/marcuh/git/wuerth/fahrzeugeinrichtung-plato-backend +- [adesso-cpq Verbau-Architektur](cpq-verbau-architektur.md) — Product/Modell/Graph, BLAST-Validierung, Speedmaxx-Quelle; morgen früh zuerst: BLAST-Entities + Converter +- [Keine Spekulation/Unterstellung](feedback-keine-intent-unterstellung.md) — keine „vermutlich"-Sätze über Absichten Dritter oder technische Ursachen; bei Unklarheit „weiß ich nicht" +- [adesso-cpq MR-Ziel](cpq-branching-mr-ziel.md) — MRs künftig auf development/Integration statt main; Branch bald einrichten +- [Kein nextTick](feedback-kein-nexttick.md) — Vue nextTick hartes Verbot; Timing reaktiv über watch/v-if lösen diff --git a/robotunits/memory/cpq-branching-mr-ziel.md b/robotunits/memory/cpq-branching-mr-ziel.md new file mode 100644 index 0000000..27a7b5c --- /dev/null +++ b/robotunits/memory/cpq-branching-mr-ziel.md @@ -0,0 +1,16 @@ +--- +name: cpq-branching-mr-ziel +description: "adesso-cpq MRs sollen künftig nicht auf main zielen, sondern auf einen Integrations-/development-Branch" +metadata: + node_type: memory + type: project + originSessionId: 00f129fd-620a-465c-8fdf-02b2ba4c3ba6 +--- + +In adesso-cpq (git.heron.at/pzm/geko/adesso-cpq) sollen Merge Requests **nicht direkt auf `main`** zielen. Der User will einen Integrations-/`development`-Branch als MR-Ziel — existiert noch nicht (Stand 2026-06-24). + +**Why:** Bei MR #12 (chore/dev-tooling-and-hygiene → main) hat der User explizit gesagt, dass ihm `main` als Ziel nicht gefällt. Nicht sofort ändern, aber bald einrichten. + +**How to apply:** Bei neuen MRs nachfragen/prüfen, ob schon ein development-Branch existiert, und dann dorthin statt auf `main` zielen. Default `origin/HEAD → main` nicht blind übernehmen. + +Bezug: [[cpq-verbau-architektur]] diff --git a/robotunits/memory/cpq-verbau-architektur.md b/robotunits/memory/cpq-verbau-architektur.md new file mode 100644 index 0000000..cfbfe0a --- /dev/null +++ b/robotunits/memory/cpq-verbau-architektur.md @@ -0,0 +1,56 @@ +--- +name: cpq-verbau-architektur +description: "adesso-cpq Verbau/Modell-Architektur (Product/Modell/Graph, BLAST-Validierung) + nächster Schritt für morgen früh" +metadata: + node_type: memory + type: project + originSessionId: d789290f-6631-426e-9639-e7ea7a60e8f9 +--- + +Stand der Architektur-Diskussion adesso-cpq (Schutzzaun-Konfigurator). Repos: ~/projects/adesso-cpq (frontend/CPQ), ~/projects/geko-core (Speedmaxx-Backend). Constraint-Typen folgen noch; jetzt erst Infrastruktur. + +## Kernmodell (erarbeitet, trägt) +- **Product = zweigeteilt:** (1) Graph mit PMIs/Collidern/Transforms = der „wertlose" Graph (keine Autorität, nur Darstellung + Approximationsdaten); (2) Variablen = Config + Constraints. +- **Product = Entity** (BaseEntity, BLAST-validiert). **Konstrukt aus Produkten = auch Entity = Modell.** Rekursiv: Modell = Produkt (Blatt) | Konstrukt aus Modellen. Aus den Entities wird am Ende der wertlose Graph projiziert. +- **Quellen (mehrere!):** Speedmaxx ist führend (~60%), daneben eigene Modelle (optimaler gestaltbar) + weitere Lieferanten. Darum muss BLAST gegen ein **normalisiertes** Modell validieren, nicht gegen Quell-Spezifika oder den rohen Graphen. Im Zweifel ein **Converter**, der Speedmaxx & whatever normalisiert. + +## Speedmaxx-Realität (Quelle der Wahrheit, NICHT der cpq-Mock) +- Branch geko-core `feature/get-scene-from-speedmaxx`: `executeCommand` → `ExecuteCommandResponse { ui: Record, viewing, error }`. +- `ui` = Config+Constraints: `domain.{min,max,step,valuelist,default}`, `required/visible/editable/multivalue/datatype/unit/...`. Hier stecken „≤6m / ≤10 Teile". +- `viewing` = die Szene (wertloser Graph). Controller `loadScene` ruft `combo1_cmd`, ProductCategory "Schutzzaun", Variables wizard → gibt `result.viewing`. +- Format des Graphen (= Alttool = `assets/scenes/zaun.json`): `sceneGraph_entity { handles[] }`; Hierarchie flach über `component_transform.key/parentKey` (root → asm_root → produkt-node → ~50 Blatt-Teile); `component_pmi` (z.B. CS_SVS/CS_BASIS am Produkt-Knoten) = Andockpunkte; `component_collider`; Länge teils in `scale.z` eingebacken. +- **FALSCH in cpq:** `packages/frontend/src/util/speedMaxx2Visual.ts` erfindet `{environmentId, nodes:[{id,label}]}` — gibt es bei Speedmaxx nicht. Muss korrigiert werden. + +## Validierung / BLAST (entschieden) +- Variablen → BLAST direkt (per-Produkt + Querregeln). +- Geometrie-Constraints (≤10 Teile, Gesamtlänge, PMI-Kompatibilität, Platz/Kollision) stehen NICHT in Variablen → ergeben sich aus PMIs/Collidern/Transforms. +- Geometrie-RECHNUNG läuft in der Engine (nicht im BLAST-Kern, der ist geometrie-agnostisch). Aber: **Engine wird AUS BLAST getriggert.** BLAST ist der Orchestrator und reaktiv (Änderung → sofort wirksam), Cache sparse pro Entity-ID → Engine läuft nur für den betroffenen Bauzug. +- Zwei Topos-Ebenen: per Einzelteil + konsolidiert (Bauzug). Konsolidierter Topos ruft die Engine, holt Verdikt, validiert. +- Hebel = Abhängigkeitsschärfe (welcher Topos hängt woran). Wird über Constraint-Typen geregelt (kommt noch). +- Roher Graph geht NIE nach BLAST; nur Variablen + destillierte Graph-Fakten/Verdikte. + +## Schichten (Zielbild) +- **UI** spricht nur mit dem **Scene/Model-Service** (Name noch offen), gibt dessen Ergebnis als Graph/Commands an fire. +- **Scene/Model-Service** (core): hält Modell/Bauzüge, PMI-Verbindungen, rechnet Constraints, projiziert Modell → Graph. Intern getrennt: Modell/Constraint (entscheidet, kennt Platz) vs. Projektion (stumpf, entscheidet nichts). +- **ProductService** (gehört nach **core**, FE-agnostisch): getProduct/updateProduct, liefert nur Einzelteile, **quelle-agnostisch** über die Asset-Abstraktion (datamanager-Connectors in environment.config.json: path+typeKey-Templates; dev=Assets, live=Server). Darf NICHT wissen, woher. +- **fire/Graph**: rendert, ist außerhalb unserer Engine interaktiv und arbeitet mit Näherungen (Collider). Wir haben das letzte Wort; nach jeder Interaktion **Vollaustausch** des Graphen. +- **Gemeinsame Constraint-Sprache nötig** (3x bestätigt): zwischen zwei gemeldeten Interaktionen handelt fire autonom; es braucht dieselben Constraints. Lösung: **deklarative Daten im Graph** (Collider/PMI/Grenzen), kein geteilter Code. Offen: diese deklarativen Constraints und die exakten BLAST-Regeln müssen aus EINER Quelle stammen, sonst Drift. + +## Bestand an Typen (adesso-cpq) +- shared: `BaseEntity { id }`. core: nur `EntityStore`, keine Typen. +- blast: `ObjectSchema`, `ToposKey`, `BehaviourResolver`, `HintResolver`, `Diagnostic`, `Severity('error'|'warn'|'info')`, `Behaviours`, `Hint`, `FieldState`, `ItemResult`, `BlastValidator`. +- visual-runtime: `Visual3D` (setScene/execute/subscribe/camera), `CameraTransformation{translation,rotation,scale}`, `ConnectorConfig`, `Visual3DConfig`, `Observable`. +- **Szenegraph-Format-Typen (SceneGraph/Handle/Component, component_transform/pmi/collider) sind HEIMATLOS** — nur in `utils/sceneMerger.ts` (fliegt raus) und als `any` in Fire3D.vue/DefaultCommandProzessor/SceneReplayProcessor. Brauchen EINEN Besitzer (Fundament für Product/Scene/fire). +- `utils/sceneMerger.ts`: addProductInstance/mergeScene/generateUniqueIds/positionScene/calculateNextPosition — fliegt raus (falscher Ort `utils`, zu groß, vermischt Mechanik/Platzierung/Instanz). generateUniqueIds vom User als „Mist" markiert. + +## Offene Baustelle aus dieser Session +- `packages/frontend/src/services/product-service.ts` habe ich angelegt (getProduct/updateProduct, AssetLoader, lokaler SceneGraph-Typ). User-Kritik: zu nah an UI (gehört nach core), zuviel vorab definiert (Interfaces/Typen ohne Plan). Morgen entscheiden: behalten/verschieben/löschen. NICHT eigenmächtig Typen streuen. + +## MORGEN FRÜH ZUERST +1. GENAU auf die **Entities für BLAST** schauen: was ist exakt die normalisierte Entity (Product, Modell). Wahrscheinlich ein **Converter** rein, der Speedmaxx (ui+viewing) und andere Quellen normalisiert. Das MUSS sitzen, sonst Schmerzen. +2. Dann Infrastruktur/Schichten verorten (ProductService → core, Format-Typen-Heimat). +3. Constraint-Typen erst danach. + +## Arbeitsregeln des Users (hart) +- Sehr knapp, exakt das Gefragte, KEINE ungefragten Optionen/Vorschläge/Typen. Eins nach dem anderen, langsam. Nicht 3 Schritte vorausbauen. Keine Antwort mit Rückfrage/Angebot beenden. Kein Claude-Hinweis in Commits. Vor verändernden Aktionen kurz Plan + Go abwarten. +- Branch+MR-Workflow (adesso-CLAUDE.md); frontend→core ist paketübergreifend → nur mit explizitem Go. Git-Remotes heron.at: HTTPS+Token (osxkeychain), SSH (Port 22) ist geblockt. diff --git a/robotunits/memory/feedback-kein-nexttick.md b/robotunits/memory/feedback-kein-nexttick.md new file mode 100644 index 0000000..72c9eac --- /dev/null +++ b/robotunits/memory/feedback-kein-nexttick.md @@ -0,0 +1,16 @@ +--- +name: feedback-kein-nexttick +description: "Hartes Verbot: niemals Vue nextTick verwenden" +metadata: + node_type: memory + type: feedback + originSessionId: 26b7ea78-4681-479e-b73a-64b2ce89a046 +--- + +`nextTick` (Vue) ist verboten — niemals verwenden. + +**Why:** Der User hat sehr deutlich reagiert, als ich ein Timing-Problem (Fire3D liest `props.config` einmalig beim Mount) mit `await nextTick()` gelöst habe. nextTick gilt als Symptombehandlung statt sauberer reaktiver Lösung. + +**How to apply:** Reihenfolge-/Mount-Timing reaktiv lösen — `watch` auf Template-Refs, `v-if`-Gating, eigene ready-Signale. Eingetragen in globaler CLAUDE.md (# Code) und adesso-cpq/CLAUDE.md (### Kein nextTick). + +Bezug: [[cpq-verbau-architektur]] diff --git a/robotunits/memory/feedback-keine-intent-unterstellung.md b/robotunits/memory/feedback-keine-intent-unterstellung.md new file mode 100644 index 0000000..fae5ba6 --- /dev/null +++ b/robotunits/memory/feedback-keine-intent-unterstellung.md @@ -0,0 +1,16 @@ +--- +name: feedback-keine-intent-unterstellung +description: "Keine Vermutungen/Spekulationen anhängen — weder über Personen-Absichten noch über technische Ursachen; nur Fakten, sonst „weiß ich nicht\"" +metadata: + node_type: memory + type: feedback + originSessionId: 00f129fd-620a-465c-8fdf-02b2ba4c3ba6 +--- + +Keine „vermutlich"-Sätze. Gilt zweifach: (1) nicht raten, was ein Dritter (PL, Kollege, fire-Team) „eigentlich meint/will" — Aussagen des Users wörtlich nehmen; (2) keine spekulative Ursache anhängen (z. B. „dein Node liegt vermutlich hinter einem Versionsmanager"). Wenn die Ursache unklar ist: „weiß ich nicht", Punkt. + +**Why:** Zweimal scharf korrigiert in einer Session. Einmal: „der Punkt, den die PL vermutlich meint, ist X" — PL meinte exakt das schon Gesagte. Einmal: nach „node nicht im PATH" eine geratene Begründung angehängt. Beides als Unterstellung empfunden. + +**How to apply:** Frage auf Basis der gegebenen Aussage / der gemessenen Fakten beantworten. Keinen Absatz anhängen, der Intention oder Ursache rekonstruiert/rät. Geht über „Kompetenz unterstellen" hinaus: auch wohlwollende/plausible Spekulation unterlassen. Unklarheit ehrlich als Unklarheit benennen. + +Bezug: [[cpq-verbau-architektur]]