Repository navigation
CodeMap 1.3.0
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ólnaragSection), 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 ChatBotacodeTour {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"), akcjahotspotDoctor {query?}(domyślnie czoło rankingu). Nowa rozmowa „🩺 plik" w ChatBocie,
cytaty i źródła jak w trybie 📚 (runRagprzyjmuje 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.
Natywnetool_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 jakoerror: …; odpowiedź-wymówka („trzeba by zajrzeć do pliku…")
→ jedno ponaglenie do użycia narzędzia. WynikicodeSearch/readFilenumerowane[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/chatztools, 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 przezrenderOption {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 ChatBotaliveResume. - 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
?zapytaniemalbo#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 zindex.htmlbyło fałszywie „osieroconych" (teraz 1:sw.js).
Zmienione
- Kamera:
toScreenbez sklejania klucza z liczb i bezDOMPoint(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).