Files
agenticCode/x-docs/ui-proposal.md
Ingo Schnabel fe9fd3064d Roadmap UI
2026-07-12 18:47:52 +02:00

7.6 KiB
Raw Permalink Blame History

Proposal: Web-UI zum Verstehen & Navigieren des Codes

Status: Diskussionsgrundlage (noch keine Implementierung). Dieses Dokument hält die abgestimmte Vision, Architektur, die nötigen Backend-Voraussetzungen und einen Milestone-Plan fest. Sprache: Deutsch (Diskussionskontext); bei Bedarf auf Englisch umstellbar — der Rest von x-docs/ ist englisch.

1. Ziel & Kontext

Eine React/TypeScript-Weboberfläche, die den AgenticCode-Graphen für Menschen begreifbar macht: durch Legacy-Quellen (v. a. Software AG Natural) navigieren, den Code sehen (Call-Graph, Datenfluss, DB-Zugriffe) und ihn verstehen. Sie setzt auf der bestehenden REST-API auf (/api/projects/{p}/…).

Primärer Nutzer & Hauptziel (abgestimmt): Entwickler, die Legacy-Natural verstehen, um es nach Java zu migrieren. Der Wert liegt darin, das Verhalten eines Moduls schnell vollständig zu erfassen: Wer ruft es? Was ruft es (inkl. dynamischer CALLNAT)? Welche Felder fließen wohin? Welche DB-Tabellen liest/schreibt es? Was bricht, wenn ich etwas ändere?

2. Abgestimmte Entscheidungen (prägen die Architektur)

Frage Entscheidung Konsequenz
Primärnutzer/Ziel Migration Natural→Java Leitmotiv „Migrations-Dossier" pro Modul (M3/M4)
Projektgröße Groß (upms ~1000–6000+ Module) Query-getrieben, WebGL-Viz, serverseitiger Subgraph
API-Vertrag OpenAPI zuerst SmallRye-OpenAPI am Server + generierter TS-Client (kein Typ-Drift)
Lazy-Ingest Automatisch + Statusanzeige Navigation triggert Deep-Ingest transparent; Status/Ladezustände überall

3. Architektur-Grundsätze

  • Query-getrieben, nie „ganzen Graphen laden". Bei 6000+ Modulen wird immer nur eine begrenzte Nachbarschaft um den aktuellen Knoten geladen.
  • WebGL-Graph-Rendering. Sigma.js (auf graphology) für Tausende Knoten flüssig. React Flow bleibt für kuratierte Kleindiagramme (ein Datenfluss-Pfad, eine direkte Nachbarschaft), ist aber für den großen Graphen ungeeignet (DOM-basiert).
  • OpenAPI-first. Der Server bekommt eine OpenAPI-Spec; der TS-Client wird generiert (openapi-typescript + openapi-fetch). Ein stabiler Vertrag statt handgepflegter Typen.
  • Auto-Ingest mit Statusanzeige. Klick auf ein noch flaches Modul triggert den Deep-Ingest transparent; die UI zeigt INGESTING und lädt nach. Refresh explizit verfügbar.
  • Stabile Identität statt Node-ID. Node-ids werden bei Re-Ingest neu vergeben — die UI keyed auf name + sourceFile und refetcht nach einem Ingest.

4. Technischer Stack (Vorschlag)

  • React + TypeScript + Vite, React Router (URL-getriebener State → teilbare Deep-Links auf einen Knoten/eine Ansicht).
  • Datenschicht: TanStack Query über den generierten OpenAPI-Client.
  • Graph-Viz: Sigma.js/graphology (+ graphology-layout-forceatlas2/dagre-artige Layouts); React Flow für Kleindiagramme.
  • Code-Viewer: CodeMirror 6 mit eigenem Natural-Sprachmodus (kein OSS-Highlighting vorhanden) + Java eingebaut.
  • Styling: Tailwind oder CSS-Module (Detail offen).

5. Backend-Voraussetzungen (die die UI erzwingt)

Diese Punkte sind Bring-Schulden am Server, bevor die UI tragfähig ist:

  1. OpenAPI-Spec (quarkus-smallrye-openapi) + saubere Annotation der Response-DTOs.
  2. Ego-Graph-Endpoint — GET /modules/{name}/graph?depth=&direction=&limit=, der einen begrenzten Subgraphen (Nodes + Edges) um einen Knoten liefert. Heute gibt es nur call-tree/callers/callees getrennt; die Viz braucht einen echten, gebündelten Nachbarschafts-Endpoint. (Neuer Roadmap-Kandidat.)
  3. Ingest-Status im Response — die UI muss ingestStatus/ingestDepth je Modul kennen (großteils vorhanden über moduleIngestState/inspect_node).
  4. CORS/Serving — SPA-Auslieferung + CORS-Konfiguration am Quarkus-Server.
  5. Später: Auth/Multi-User (heute keine), Cross-Project-Sichten.

Verfügbar & wiederverwendbar (heute): list_modules, module_context, callers/callees, call-tree, db-accesses/sql-statements, data-structures/ fields/columns, dispatch-table, search/identifier|value|annotation, variables/{n}/reads|writes|flow-forward|flow-backward|field-flow, nodes/{id}, modules|nodes/{…}/source, refresh.

6. Kern-Ansichten (was der Mensch tun können soll)

  1. Projekt- & Modul-Explorer — Liste/Baum, Filter (Sprache, moduleKind, sourceFile), globale Suche.
  2. Modul-Detail — module_context gebündelt: Funktionen, Caller/Callee, DB-Zugriffe, Datenstrukturen, Ingest-Status, Refresh.
  3. Quelltext-Viewer mit Graph-Overlay — Syntax-Highlighting; klickbare Identifier → Definition/Referenzen; CALLNAT/PERFORM-Ziele als Links; dynamische/unaufgelöste Referenzen markiert.
  4. Interaktiver Call-Graph (Sigma/WebGL) — Ego-Graph, Expand/Collapse, Dispatch- & unresolved-Styling, Auto-Layout.
  5. Datenfluss-Visualisierung — flow-forward/backward/field-flow als Pfad/Sankey.
  6. DB-Zugriffs-Karte — Matrix/Graph Modul ↔ Tabelle (READ/WRITE), Dispatch-Tabellen, SQL.
  7. Impact-Analyse — „Feld/Tabelle ändern → betroffene Module".
  8. Migrations-Dossier — pro Modul alle obigen Facetten gebündelt als „Portier-Steckbrief".

7. Milestones

  • M0 · Fundament + API-Vertrag — OpenAPI am Server + generierter TS-Client; Ego-Graph-Endpoint; CORS/SPA-Serving; React/Vite-Grundgerüst; Projekt-/Modul-Liste
    • Suche; Ingest-Status-Badges + Refresh. → Browsen & Lesen; kritischer Pfad.
  • M1 · Navigation — Quelltext-Viewer (CodeMirror 6 + Natural-Modus), klickbare Identifier (Def/Refs), Caller/Callee-Panels, lazy Call-Tree, Deep-Links.
  • M2 · Call-Graph-Visualisierung — Ego-Graph interaktiv (Sigma), Expand/Collapse, Dispatch/Unresolved-Styling, Layout.
  • M3 · Migrations-Dossier — Datenstrukturen/Felder, DB-Zugriffs-Matrix, Dispatch-Tabellen, SQL — pro Modul gebündelt.
  • M4 · Datenfluss & Impact — Flow-Visualisierung, Impact-Analyse „was bricht?".
  • M5 · Verständnis-Booster — Quelle + geparste Struktur nebeneinander, Notizen/ gespeicherte Views, Diff nach Refresh, optional LLM-Zusammenfassungen aus module_context.
  • M6 · Skalierung & Politur — Virtualisierung/Große-Graph-Performance, Multi-Projekt, Auth, Theming, Export (SVG/PNG/Report).

Kritischer Pfad: M0 (OpenAPI + Ego-Graph-Endpoint) trägt alles Weitere.

8. Risiken & offene Punkte

  • Latenz durch Auto-Ingest bei großen Projekten: Erkunden triggert Deep-Ingests; der Concurrency-Cap (Default 2) kann unter Mehr-Nutzer-Last transient flachere Antworten liefern. Für 1 Analyst ok; sonst Cap konfigurierbar/erhöhen.
  • STALE_SOURCE & Warm-Nebenwirkung: eine wärmende Abfrage (z. B. search_identifier) re-ingestiert und re-hasht ein Modul und löscht damit dessen Staleness — die UI muss Ingest-Status als „wahr im Moment der Abfrage" behandeln.
  • Node-ID-Instabilität nach Re-Ingest (Keying auf name+sourceFile).
  • Natural-Highlighting existiert nicht fertig — eigener CodeMirror-Modus nötig.
  • Auth/Multi-User und Deploy-Modell (Standalone-SPA vs. eingebettet) noch offen.

9. Nicht in diesem Vorhaben

  • Änderungen an der Parser-/Ingest-Semantik (die UI ist ein Konsument).
  • Schreibender Zugriff auf den Code (read-only Verständnis-Tool; Notizen sind UI-seitig).