Skip to content

CodeMap 1.3.0

Choose a tag to compare

@RaCzKoViC RaCzKoViC released this 27 Sep 08:17
· 68 commits to main since this release

Najważniejsze / Highlights: rysowanie dużych map na GPU (WebGL2, 20 tys. plików ~1–2 ms/klatkę), pamięć analizy w OPFS (ponowne wczytanie 2800 plików 0,2 s) i analiza w 4 workerach, wznowienie folderu na żywo po przeładowaniu, agent kodu z narzędziami w pętli (Ollama) i showOnMap, 🩺 Doktor hotspotów (plan refaktoryzacji z cytatami), 🧭 trasy po kodzie (CodeTour, linki #tour=), embeddingi w przeglądarce (WebLLM) oraz poprawka analizy ścieżek z ?v= / ?raw.

Skala i lokalne AI: rysowanie na GPU, pamięć analizy, folder na żywo po przeładowaniu (faza 6) oraz agent kodu —
narzędzia w pętli, Doktor hotspotów, trasy po kodzie, embeddingi w przeglądarce (faza 7) — docs/ROADMAP.md.

Dodane — Faza 7 (agent z narzędziami)

  • Agent: narzędzie widokowe showOnMap {paths} — podświetla pliki, o których jest odpowiedź, i ustawia na nich
    kamerę (tylko widok, bez zmian w danych); prompt zachęca, by pokazywać pliki. qwen3:8b na „Które pliki importują
    format.js? Pokaż je na mapie.": dependents → showOnMap → poprawna odpowiedź z podświetleniem, 16 s.
  • Embeddingi w przeglądarce (WebLLM) — semantyczny RAG bez Ollamy: CM.LocalAI.embed() na osobnym silniku
    w workerze (niezależnym od modelu czatu), modele typu embedding z konfiguracji WebLLM (snowflake-arctic-embed-s/-m,
    partie -b4 / -b32, tekst ucięty do okna 512 tokenów). RAG: lista modeli z obu źródeł (🌐 = w przeglądarce, z VRAM),
    jedno miejsce liczenia wektorów dla indeksu i zapytań; Ollama nadal domyślna (bge-m3 lepszy po polsku). Sekcja
    „Indeks kodu (RAG)" w Ustawieniach → AI jest teraz też przy WebLLM (wspólna ragSection), z postępem ładowania
    modelu. Sprawdzone na RTX 4060: indeks demo 18,8 s z pobraniem modelu, zapytanie hybrydowe ~28 ms.
  • 🧭 Trasy po kodzie (js/tour.js, js/tour-ui.js; Projekt → „Trasa po kodzie…"): trasa automatyczna ze struktury
    (opis → punkty wejścia — importy przychodzące liczone tylko z kodu → rdzeń wg liczby zależnych → hotspot → testy
    rdzenia; bez importów po jednym pliku z największych folderów) albo ułożona przez model z samej struktury (ścieżki,
    metryki, zależności, nazwy symboli — także model w chmurze; odpowiedź JSON walidowana, zła → trasa automatyczna).
    Odtwarzacz: karta kroku z notatką i kropkami, kamera na pliku, podświetlenie trasy, ponumerowane kroki ze strzałkami
    (dekorator — działa też na GPU), ← / → / Esc, klik w ścieżkę otwiera plik. Notatki edytowalne w oknie trasy; trasa
    zapisuje się w mapie (graph.tour), eksport / import VS Code CodeTour (.tour), link #tour=… (deflate +
    base64url; sam — na bieżącą mapę, albo z #repo= / #gist= / #share= — po wczytaniu mapy; limit hasha 8192).
    Akcja ChatBota codeTour {action}. Na qwen3:8b trasa z AI dla CodeMap: 9 kroków w 22 s. 6 testów + 1 deep-linków,
    krok smoke.
  • 🩺 Doktor hotspotów (js/doctor.js, js/doctor-ui.js): plan refaktoryzacji jednego pliku liczony modelem
    lokalnym. Kartoteka pliku (linie, złożoność, liczba funkcji, miejsce w rankingu ryzyka — z git częstość zmian ×
    złożoność, bez git rozmiar × zależne × złożoność — zmiany i autorzy, testy i pokrycie, pliki zależne bezpośrednio
    i pośrednio) + ponumerowane fragmenty najdłuższych funkcji (budżet dzielony równo, całe linie); prompt z czterema
    stałymi sekcjami: diagnoza, 3–5 małych kroków z cytatami [n], testy przed zmianą, ryzyko (bez zgadywania zależnych
    i autorów spoza kartoteki). Wejścia: sekcja „Doktor hotspotów" w panelu pliku (miejsce w rankingu + przycisk
    „🩺 Plan refaktoryzacji"), akcja hotspotDoctor {query?} (domyślnie czoło rankingu). Nowa rozmowa „🩺 plik" w ChatBocie,
    cytaty i źródła jak w trybie 📚 (runRag przyjmuje własne przygotowanie kontekstu); model w chmurze → komunikat
    o modelach lokalnych. Sprawdzone na qwen3:8b: 30–40 s, każdy krok cytuje właściwy fragment. 6 testów, krok smoke.
  • Agent kodu w trybie 📚 z Ollamą (js/agent.js): gdy fragmenty z RAG nie wystarczą, model sam woła narzędzia
    tylko do odczytu — codeSearch, readFile (do 150 linii), findFiles, dependencies, dependents,
    fileInfo, hotspots, owners (autorzy i bus factor z git), tests (testy pliku, folderu, najbardziej złożone
    pliki bez testów) — na grafie i kodzie wczytanego projektu, najwyżej 5 kroków, potem odpowiedź bez narzędzi.
    Natywne tool_calls (Llama 3.x, Qwen 3) albo JSON wywołania w treści (Qwen 2.5 Coder, także z opisem narzędzia
    zamiast nazwy); wymyślone narzędzie → model dostaje listę prawdziwych, powtórzone wywołanie nie jest wykonywane
    drugi raz, błąd narzędzia wraca do modelu jako error: …; odpowiedź-wymówka („trzeba by zajrzeć do pliku…")
    → jedno ponaglenie do użycia narzędzia. Wyniki codeSearch / readFile numerowane [n] wspólnie
    z fragmentami, więc cytaty i klik w źródło działają jak w RAG; kroki w zwijanej liście „🔧 Kroki agenta".
    Model bez obsługi narzędzi → zwykły tryb 📚. Przełącznik w Ustawieniach → AI → Ollama.
  • CM.Ollama.chatTools() (wywołanie /api/chat z tools, bez strumienia, think:false), 12 testów pętli i narzędzi
    ze skryptowanym modelem, krok smoke w przeglądarce.

Dodane — Faza 6 (skala: rysowanie na GPU)

  • Renderer WebGL2 (js/gl-layer.js): osobny <canvas> pod mapą 2D; tło, siatka, wszystkie krawędzie (łuki
    liczone w shaderze z tym samym punktem kontrolnym co w canvas, grubość w px z wygładzaniem, linie przerywane
    i kropkowane, nakładki wpływu, cykli i wybranej krawędzi) oraz figury (koła z obwódką, romby symboli, poświata
    „cosmic") jako instancje; kamera to uniform, więc przesuwanie i przybliżanie nie przebudowuje buforów
    (przebudowa po zmianie danych, kolorów, podświetlenia albo pozycji — podpis liczony co klatkę). Etykiety,
    pierścienie zaznaczenia, strzałka krawędzi i dekoratory modułów zostają na przezroczystym canvas 2D, eksport PNG
    też. Tryb automatyczny od 3000 widocznych węzłów + krawędzi, wybór w lewym panelu → Mapa („Rysowanie mapy")
    i przez renderOption {backend}; utrata kontekstu albo błąd GL → canvas 2D. Gęste zależności są wygaszane według
    pokrycia pikseli w oknie (długość krawędzi przyciętych do okna / pole mapy) zamiast pomijane jak w LOD canvas.
    20 tys. plików / 60 tys. krawędzi: ~1–2 ms na klatkę (canvas 2D 30–150 ms).
  • Pamięć analizy w OPFS (js/analysis-cache.js): wyniki analizy plików (metryki, importy, symbole — bez treści)
    zapamiętane per projekt (gzip, indeks, najwyżej 12 projektów / 200 MB, najstarsze wypadają), unieważniane stemplem
    wersji zasobów. Niezmieniony plik — ten sam rozmiar i data modyfikacji z dysku albo sha bloba git — nie jest
    analizowany ani nawet haszowany; zgodny sam rozmiar → worker porównuje skrót treści. Ponowne wczytanie 2800 plików:
    analiza 2,4 s → 0,05 s (całość 2,6 → 0,2 s); zmiana jednego pliku analizuje tylko ten plik. Ustawienia → Instalacja
    → „Wyczyść pamięć analizy" (z liczbą projektów i rozmiarem); „Usuń wszystkie dane" też ją czyści. Zapis
    zaplanowany przed czyszczeniem jest porzucany (epoka), więc pamięć nie odradza się po „Wyczyść".
  • Wznowienie folderu na żywo po przeładowaniu (js/live.js): uchwyt folderu zapamiętany w IndexedDB
    (codemap-live); po przeładowaniu strony pasek stanu pokazuje „↻ Wznów na żywo: nazwa” (kliknięcie = gest,
    którego przeglądarka wymaga do ponownej zgody na odczyt) i „×” (nie wznawiaj); zakończenie obserwacji, wczytanie
    innego projektu albo „Wyczyść” zapominają folder; akcja ChatBota liveResume.
  • Analiza w kilku workerach naraz (do 4, pliki rozdzielone po rozmiarze od największych): pierwsze wczytanie
    ok. 2,3× szybsze niż w jednym workerze (pomiar: 1 → 5,9 s, 4 → 2,6 s; 8 workerów nie przyspiesza).
  • tools/bench.mjs (npm run bench): syntetyczne projekty 5k / 20k plików, wczytanie + klatka z wymuszoną
    rasteryzacją dla obu backendów, --json, --summary, --max-frame; krok informacyjny w CI z artefaktem.
  • Kroki smoke: demo wymuszone na GPU — piksel w środku węzła ma kolor węzła, hit-test i eksport PNG działają;
    pamięć analizy — drugie wczytanie bez analizy i bez workerów, zmieniony plik od nowa, graf identyczny.

Poprawione

  • Analiza: ścieżka z ?zapytaniem albo #kotwicą (<script src="js/a.js?v=…">, Vite ./a.svg?raw, ?worker) nie
    rozwiązywała się do pliku — w samym CodeMap 48 skryptów z index.html było fałszywie „osieroconych" (teraz 1: sw.js).

Zmienione

  • Kamera: toScreen bez sklejania klucza z liczb i bez DOMPoint (cam.xf() = współczynniki jako liczby),
    etykiety odrzucają za małe węzły przed liczeniem pozycji — klatka canvas 2D przy 20 tys. węzłów 74 → 32 ms.
  • RAG: plik wymieniony w pytaniu z nazwy (co robi agent.js…), którego wyszukiwanie nie zwróciło, dostaje dwa
    najlepsze fragmenty na początku kontekstu (CM.RAG.mentionedFiles).