Repository navigation
CodeMap 1.1.0
Najważniejsze: historia git w przeglądarce (lokalny .git bez serwera — właściciele, bus factor, hotspoty zmian, oś czasu), graf symboli tree-sitter, testy ↔ kod i pokrycie, kolorowanie wg danych, pytania o kod z lokalnym AI (RAG), CLI + GitHub Action z raportem SARIF, linki #repo= / #gist= / #share=.
Fazy 2–4 planu rozwoju — głębsza analiza, inteligencja git, ekosystem (docs/ROADMAP.md).
Dodane — Faza 4 (ekosystem)
- Tryb headless — CLI
codemap analyze(cli/, bez zależności, te samejs/*.jsw kontekścievm): raporty
w terminalu, JSON, Markdown, SARIF 2.1.0 (reguły Inspect,relatedLocationsdla cykli i duplikatów, stabilne
odciski, URI względne od korzenia repo), mapa.codemap.json, DOT / Mermaid / GraphML; historia git z.git
(także z katalogu nadrzędnego i worktree), testy i pokrycie; progi--min-score/--fail-on/--max-findings
(kody 0/1/2); APIanalyzeProject(). CodeMap: ~1 s, Odysseus-Lab (1649 plików, 464 tys. linii): ~6 s. - GitHub Action (
action.yml, kompozytowa): raport w podsumowaniu kroku, SARIF, progi, wyjściascore/
findings/sarif-file; jobcodemapw CI tego repozytorium; przykład z code scanning wdocs/github-action.md. - Deep-linki:
#repo=owner/nazwa[@gałąź[/podkatalog]](także pełne URL GitHub/GitLab/Bitbucket,&layout=),
#gist=<id>,#share=<id>; link wklejony do otwartej aplikacji wczytuje mapę (z potwierdzeniem). - Publiczne linki do map (backend): „Udostępnij publiczny link…" z wygasaniem i opcjami prywatności
(domyślnie bez podglądu treści), lista z unieważnianiem w Ustawienia → Konto;POST/GET/DELETE /api/shares,
publicznyGET /api/share/:id(no-store, bez CORS i ciasteczek, ta sama 404 dla nieistniejących/wygasłych);
treść w magazynie blobów wliczana do quoty; testy backendu (server/test,app.inject) w CI. - Eksport do Gista kopiuje link
…/#gist=<id>otwierający mapę w CodeMap. - Pytania o kod — RAG dla modeli lokalnych (
js/rag.js, tryb 📚 w ChatBocie): pliki dzielone na fragmenty
wg granic symboli (scalanie krótkich, okno 60 linii dla długich), wyszukiwanie BM25 zawsze (rozbijanie
identyfikatorów camelCase/snake_case, polskie pojęcia rozszerzane o angielskie odpowiedniki) + semantyczne
z embeddingami Ollamy (/api/embed,bge-m3,nomic-embed-textz właściwymi prefiksami), ranking
hybrydowy, max 2 fragmenty z pliku, odcięcie słabych trafień. Wektory w IndexedDB per projekt i model,
przeliczane tylko dla zmienionych fragmentów (CodeMap: 596 fragmentów ≈ 46 s pierwszy raz, ≈ 6 s po zmianie
3 plików). Odpowiedź tekstowa z cytatami[n]i listą źródeł — klik otwiera plik przewinięty do linii.
Tylko WebLLM / Ollama; dla modeli w chmurze tryb 📚 odmawia (treść kodu nie opuszcza komputera).
Ustawienia → AI: wybór modelu embeddingów, budowanie / usuwanie indeksu;/codeSearch {query}bez modelu.
Dodane — Faza 3 (historia git, testy i pokrycie)
- Czytnik lokalnego
.gitw przeglądarce (js/git-local.js+js/git-worker.js, bez zależności): HEAD i refy
(luźne,packed-refs, tagi adnotowane), obiekty luźne i paczki (.idxv1/v2 z offsetami 64-bit, OFS_DELTA,
REF_DELTA), czytanie wycinkamiBlob.slice(paczki nie są ładowane w całości), LRU zdekodowanych obiektów,
historia w kolejnościgit logz diffem drzew i dokładnym wykrywaniem zmian nazw, płytkie klony,
anulowanie; w Web Workerze z przejściem na wątek główny. Zgodność zgit logsprawdzatools/git-probe.mjs
(wnpm run verify); 2000 commitów dużego repozytorium ≈ 1 s. - Historia git (
js/git-core.js,js/git-remote.js,js/git.js): folder wczytany razem z katalogiem
.gitjest analizowany sam, lokalnie i bez sieci; repozytorium z GitHub / GitLab / Bitbucket — na żądanie
(Projekt → Historia git) przez API hostingu, z oszczędzaniem limitu zapytań (pliki dla najnowszych commitów,
pełna historia z tokenem). Zmiany nazw plików są śledzone wstecz, tożsamości autorów scalane (e-maile,
login z noreply GitHuba, imię), boty nie zostają właścicielami. - Własność i bus factor: właściciel każdego pliku, udziały autorów w panelu szczegółów (plik, folder,
projekt), bus factor projektu i każdego folderu (zachłannie wg Avelino i in. 2016); awatary (API) albo
inicjały (lokalnie) właścicieli na węzłach. - Hotspoty churn × złożoność (jak CodeScene): okno „Hotspoty" liczy (zmiany + zmiany z 90 dni) ×
(1 + złożoność), gdy jest historia;topFiles {metric:"churn"|"hotspot"}w ChatBocie. - Kolorowanie węzłów wg danych (
js/overlays.js, lewy panel „Kolorowanie"): język, złożoność, data
modyfikacji, a z historią — właściciel, częstość zmian, hotspoty, ostatnia zmiana; legenda z licznikami,
klik podświetla pliki; akcja ChatBotacolorBy {mode}. - Oś czasu — ewolucja projektu (Gource-lite): pliki pojawiają się na mapie w kolejności powstania,
zmienione świecą kolorem autora, nad nimi etykiety autorów z promieniami; odtwarzanie 0,5×–40×, suwak;
bez historii git — oś czasu z migawek projektu. - ChatBot:
gitHistory,owners {query?},busFactor {query?},churn {n?},timeline {action},colorBy. - Inspect: reguły „hotspoty zmian" (zmiany × złożoność, górne 10 %) i „wiedza w jednej głowie" (≥ 90 % zmian
złożonego, często zmienianego pliku od jednej osoby; projekty z ≥ 2 autorami). - Testy ↔ kod i pokrycie (
js/testmap.js,js/tests-ui.js): mapowanie testów do kodu po nazwie (także
ścieżki lustrzanetest/↔src/,src/test/java↔src/main/java) i po importach, dla kilkunastu języków;
krawędzie „Testy (test → kod)". Pokrycie z lcov, Istanbul (coverage-final.jsonicoverage-summary.json),
Cobertura, JaCoCo i Clover — automatycznie zcoverage/, z menu „Projekt → Wczytaj pokrycie testów" albo przez
upuszczenie raportu na mapę. Nakładki „Testy" i „Pokrycie", sekcja „Testy i pokrycie" w panelu szczegółów,
niepokryte linie w podglądzie pliku, reguły Inspect „złożone pliki bez testów" i „niskie pokrycie testami",
akcje ChatBotatests,coverage,loadCoverage; dwa pliki testowe w demo. - Loader przekazuje „pliki boczne" (uchwyty katalogu
.giti raportów pokrycia, także z pomijanego
coverage/) bez ich czytania; historia i dane git zapisują się w pliku mapy.
Dodane — Faza 2
- Eksport widocznego grafu do DOT (Graphviz, klastry = foldery, kolory wg języka), Mermaid
(flowchart LR, subgraph per folder) i GraphML (yEd: atrybuty type/lang/size/lines, grupy) —
menu Projekt, paleta Ctrl+K, akcja ChatBotaexportGraph {format}(js/export.js). - Metryki sprzężeń w panelu szczegółów: Ca / Ce / I (afferent, efferent, niestabilność Martina)
dla plików i folderów (agregacja po plikach potomnych, krawędzie wewnętrzne pomijane) (js/metrics.js). - Reguły architektury z pliku
.codemap.rules.jsonw repozytorium (warstwy = globy*/**,
forbidmiędzy warstwami lub globami,noCycles) — reguła Inspect „naruszenia architektury"
(krytyczne); brak pliku = cisza, niepoprawny plik = informacja (js/rules.js). Przykład dla
samego CodeMap: rdzeń (analysis/graph/layouts) nie importuje UI (chrome/navigation/ui). - Inspect: reguła zduplikowany kod — winnowing (k=5 tokenów, okno 4, ≥ 8 wspólnych odcisków)
na treści plików ≥ 20 linii, próbka 1500 największych, liczone w chunkach; zastępuje dawną
regułę porównującą same nazwy plików. - Graf symboli i wywołań (tree-sitter) — przełącznik „Symbole (tree-sitter)" w lewym panelu (opt-in,
pierwsze włączenie pobieraweb-tree-sitter0.22.6 i gramatyki ztree-sitter-wasms0.1.12 z jsdelivr):
funkcje, metody, klasy, struktury, interfejsy, enumy, traity/impl z 12 języków jako węzły-romby pod plikiem,
wywołania rozwiązane w tym samym pliku i w plikach importowanych jako przerywane krawędziecall
(przełącznik „Wywołania"). Parsowanie w Web Workerze z postępem; pliki zwinięte (dwuklik rozwija), przy
zwiniętych wywołania łączą pliki; panel szczegółów: rodzaj, linie, „wywołuje" / „wywoływany przez";
symbole zapisują się w mapie; akcja ChatBotasymbols {on};tools/symbols-probe.mjswnpm run verify. - Analiza plików w Web Workerze (
js/analysis-worker.js): metryki, importy, symbole i hash liczone
poza głównym wątkiem, chunkami, z postępem „Analiza plików N / M" i anulowaniem; główny wątek składa
z wyników tylko strukturę i krawędzie (bez Workera: te same kroki z oddawaniem wątku). Jeden przebieg
stripNonCodedla importów i symboli (analyzeFile). - Rozwiązywanie zależności: aliasy
tsconfig/jsconfigper katalog zextends(najbliższy config
wygrywa, monorepo się nie miesza), workspaces (import po nazwie pakietu zpackage.json→
exports/module/main/folder), dynamiczne odwołania JS (new Worker,new URL(…, import.meta.url),
importScripts,require.resolve,import.meta.glob), SCSS@use/@forward, C#using→ pliki
znamespace, Rustuse crate::/self::/super::, Python: moduł z katalogu importera i nazwy po
from X import; nowe parsery: Swift, Dart, Elixir, Lua, Zig, Haskell, Shell (js/analysis.js). - ChatBot: menu narzędzi po wpisaniu
/(54 narzędzia, filtrowanie,/nazwa argument), nowe
narzędziastats,topFiles,findText(szukanie w treści plików z podświetleniem na mapie),
listLang,dependsOn,dependencies,explain,exportGraph,clearChat. - ChatBot: okno rozciągane za 8 uchwytów, lista rozmów o zmiennej szerokości (przeciągnij do 0 = zwiń),
elementy mapy jako załączniki — przeciągnij węzeł do okna czatu (miniaturka z nazwą i krzyżykiem,
maks. 30), panel myśli w pełni widoczny i zwijany, przycisk ⚡ Szybka odpowiedź dla modeli myślących. - Modele lokalne: 18 wyselekcjonowanych modeli WebLLM + pełna lista silnika (135), pobieranie modeli
do Ollamy z Ustawień (postęp, propozycje); strumień rozumowania Ollamy pokazywany na żywo.
Zmienione
#v=niesie podkatalog repozytorium oraz źródło gist / publiczny link; podkatalog działa też dla GitLab i Bitbucket.- Inspect: pozycje znalezisk z własną ważnością i powiązanymi plikami, raport Markdown bez DOM (
toMarkdown). - Inspect: reguła duplikatów bez fałszywych alarmów —
k=15, okno 10, min. 12 wspólnych odcisków, odciski
obecne w > 8 plikach pomijane (boilerplate), pliki blokad (package-lock.json,yarn.lock…) wykluczone.
Na samym CodeMap 2034 → 44 par, health score 6 → 42.
Naprawione
- Workery (
analysis-worker.js,symbols-worker.js) importują moduły z tym samym stemplem?v=co strona —
bez niegoimportScriptsdostawał nieaktualną kopię z cache service workera. - ChatBot wykonywał auto-akcje z pustymi argumentami (
setLayout→ „Nieznany układ",setThemezawsze
ciemny) — główna przyczyna, dla której modele lokalne „nie sterowały aplikacją". - Gramatyka JSON Ollamy tylko dla małych modeli i nigdy z rozumowaniem (z nią ~1 tok/s; duże modele
trzymają JSON z promptu). - ChatBot bez błędów przy małych modelach lokalnych (zgłoszenie z Llama 3.2 3B, „wymień wszystkie dostępne
komędy" → seria czerwonych chipów): akcje modelu walidowane przed wykonaniem (wymagane argumenty, znana
nazwa, maks. 4 naraz); pytanie bez czasownika-polecenia nie uruchamia żadnych akcji; prośba o listę
komend/narzędzi (także z literówkami) i komendy/…działają bez modelu i bez klucza; zamiast pustego
„✓ wykonano" — odpowiedź tekstowa albo wskazówka; błędy dostawców jako krótki komunikat ze szczegółami;
uszkodzone rozmowy wlocalStoragesą naprawiane przy wczytaniu; brakUncaught AbortErrorpo
zatrzymaniu strumienia (reader.cancel()). - ChatBot: wyniki narzędzi informacyjnych (
/stats,/topFiles,/findText,/dependsOn…) są treścią
odpowiedzi (markdown), a nie ściśniętym chipem; opisy w menu/i w pomocy po polsku (model nadal
dostaje angielski katalog); awatar asystenta przy początku dymka. /statsliczył węzły symboli tree-sittera jako foldery („foldery: 1281").- Legenda „Typy plików":
.jsi.mjsto dwa wiersze „JavaScript" — przy powtórzonej nazwie pokazuje
rozszerzenie. - Testy:
test/export.test.mjs,test/metrics.test.mjs,test/rules.test.mjs; smoke sprawdza eksport
trzech formatów na grafie demo oraz ChatBota bez modelu (pomoc, walidacja akcji, 0 chipów błędu).
Bezpieczeństwo
- Walidacja źródeł z linków (także ze starego
#v=, które trafiało do loadera bez kontroli); czyszczenie adresów
repozytorium i awatarów w mapach wczytywanych z pliku lub linku (javascript:, obrazki śledzące).
Dokumentacja
- Nowe zrzuty w README (mapa repozytorium CodeMap, graf symboli, ChatBot z menu
/) zamiast
docs/screenshot-demo.png; generuje jenode tools/screenshots.mjs(headless Chrome, powtarzalnie).