vreme čitanja : 12 minutes

Vaša codebase raste. Ovisnosti između modula se množavaju. Arhitektura dokumentacija postaje zastarela još pre nego što je napisana. I da li vaš Gradle build može automatski generisati ażurne dijagrame iz stvarne strukture koda? To je tačno ono što radi Graphify + PlantUML Gradle Plugin pipeline:`graphify . --no-viz`izvlači Knowledge Graph`./gradlew generateKnowledgeGraphDiagram`Pretvara ga u PlantUML dijagrame. Nula LLM, nula ručnog, 100% deterministički.

toc

[]

Проблем: дијаграми увек у назаду у односу на код

Svaki projekat koji prelazi nekoliko hiljada linija susreće ovaj sindrom.

  1. Crtamo dijagram arhitekture na početku projekta.

  2. Kod se razvija, zavisnosti se menja

  3. Dijagram postaje dekorativna laž

  4. Niko ne ažurira to jer je mrsko.

  5. Нови долазаци се ослањају на то и грешу

@startuml
skinparam backgroundColor #FEFEFE
skinparam ActivityBackgroundColor #FDEDEC
skinparam ActivityDiamondBackgroundColor #FFF3CD

start

:Diagramme d'architecture créé\n(manuellement, à la main);

:Le code évolue\n(nouvelles classes, nouvelles dépendances);

:Diagramme obsolète\n(ne reflète plus le code);

if (Qui met à jour ?) then (Personne)
    :Documentation mensongère;
    note right: Les nouveaux développeurs\nse basent dessus... et font des erreurs
else (Quelqu'un)
    :Mise à jour manuelle\n(2-3 heures de travail);
    note right: Déjà obsolète\nà la prochaine PR
endif

stop

@enduml

Pitanje nije da li su potrebni dijagrami? — svi znaju da je da. Pitanje je :Ko ih održava ažurnim?

Odgovor: nitko. Osim ako je automatsko.

Решение : детерминисански конвејер Knowledge Graph → PlantUML

Princip je jednostavan: umesto da crtamo dijagrame ručno, mi ihgeneriše iz stvarne strukture koda.

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

actor Développeur
component "Graphify
(pip install graphifyy)" as Graphify
collections "graphify-out/graph.json\n(Znanje graf)" as KGJSON
component "PlantUML Gradle dodatak
(generateKnowledgeGraphDiagram)" as Plugin
component "KnowledgeGraphParser" as Parser
component "KnowledgeGraphRenderer" as Renderer
component "PlantumlService\n(validacija + renderovanje PNG)" as PS
collections "diagrams/knowledge-graph/
(.puml + .png)" as Output

Développeur --> Graphify : graphify . --no-viz
Graphify --> KGJSON : extrait la structure\ndu code source
Développeur --> Plugin : ./gradlew generateKnowledgeGraphDiagram
Plugin --> Parser : parse(graph.json)
Parser --> Plugin : KnowledgeGraph\n(noeuds + arêtes + communautés)
Plugin --> Renderer : render(graph, filters)
Renderer --> Plugin : code PlantUML\ndéterministe
Plugin --> PS : validateSyntax + generateImage
PS --> Output : .puml + .png

note bottom of Plugin
  Pipeline DÉTERMINISTE
  Aucun appel LLM
  Résultat reproductible
end note

@enduml

Две команде. Само то.

# Étape 1 : extraire le Knowledge Graph
graphify . --no-viz

# Étape 2 : générer les diagrammes PlantUML
./gradlew generateKnowledgeGraphDiagram

Rezultat? Datoteke`.puml` et .png`у`diagrams/knowledge-graph/, verzionisani u Gitu, uvek ażurirani sa kodom.

Корак 1: Инсталирај Graphify и извлекни знања граф

Инсталација

Graphify je alat u Pythonu koji analizira vašu kodnu bazu i gradi strukturiran graf znanja:

# Méthode recommandée
uv tool install graphifyy && graphify install --platform opencode

# Alternative avec pip
pip install graphifyy && graphify install --platform opencode

Настроји искључаје

Создај датотеку`.graphifyignore`у корену пројекта како би се искључили датотеке које nisu део пословне логике:

# Secrets — JAMAIS dans le graphe
*-context.yml
*.env

# Fichiers générés
build/
.gradle/

# Tests fonctionnels
src/functionalTest/

Извлеци граф знања

graphify . --no-viz

Флаг`--no-viz`preskaže generisanje HTML (nije korisno u Gradle pipelinu). Rezultat je fajl`graphify-out/graph.json`sadrži :

  • Čvorovi: klase, funkcije, fajlovi — sa njihovim tipom i zajednicom

  • Ивице: odnosi između čvorova (EXTRACTED iz koda, INFERRED od LLM)

  • Zajednice: automatska grupisanja povezanih čvorova

Пример структуре`graph.json`
{
  "nodes": [
    {"id": "0", "label": "LlmService", "file_type": "code", "community": 0},
    {"id": "1", "label": "ApiKeyPool", "file_type": "code", "community": 0},
    {"id": "2", "label": "PlantumlService", "file_type": "code", "community": 1}
  ],
  "links": [
    {"source": "1", "target": "0", "relation": "uses", "confidence": "EXTRACTED", "weight": 0.9},
    {"source": "0", "target": "2", "relation": "calls", "confidence": "INFERRED", "weight": 0.7}
  ]
}

Izvorni kod (.kt, .java) se analizira lokalno putem tree-sitter,bez apelacije LLM. Samo dokumentacione datoteke (.adoc, .md) Требају LLM позив за семантчко извађање. Дакле`--update`Izmena Kotlin koda je skoro мгновена.

Korak 2: Gradle plugin pretvara Knowledge Graph u PlantUML

Arhitektura pipeline

Plugin`com.cheroliv.plantuml`uključuje jedno zadatak`generateKnowledgeGraphDiagram`koji pretvara`graph.json`у PlantUML дијаграми на начинpotpuno deterministički:

@startuml
skinparam backgroundColor #FEFEFE

participant "Gradle" as G
participant "GenerateKnowledgeGraphDiagramTask" as Task
participant "KnowledgeGraphParser" as Parser
participant "KnowledgeGraphRenderer" as Renderer
participant "PlantumlService" as PS

collections "graphify-out/graph.json" as JSON

G -> Task : execute
Task -> JSON : read
Task -> Parser : parse(graph.json)
Parser --> Task : KnowledgeGraph\n(noeuds + arêtes + communautés)
Task -> Renderer : render(graph, filters)
Renderer --> Task : code PlantUML\n(déterministe)
Task -> PS : validateSyntax(plantumlCode)
alt syntaxe valide
    Task -> PS : generateImage → .png
else syntaxe invalide
    Task -> Task : save .puml avec warning
end

@enduml

Unutrašnji komponenti

komponenta Улага

KnowledgeGraphParser

parsirati`graph.json`— Podržava tri formata: grafify natif (nodes+links), héritage (communities), flat. Решава numeričke ID-e у oznake.

KnowledgeGraphRenderer

Transformiši determinirano jedan`KnowledgeGraph`u kodu PlantUML. Grupe po tipu, zajednice u paketima, automatska legenda.

GenerateKnowledgeGraphDiagramTask

Gradle zadatak koji orkestriše: parse → render → validate → PNG. Podešivo preko Gradle svojstava.

kgmodels.kt

Modeli podataka:`KnowledgeGraph`, KnowledgeGraphNode, KnowledgeGraphEdge, KnowledgeGraphCommunity, EdgeType.

PlantumlService

Синтаксичка провјера + рендерирање PNG (поновно коришћен свим задацима плагина).

Правила рендеринга

Renderer primenjuje determinističke vizuelne konvencije:

Tip ivice Notacija PlantUML Значење

извадак

-→(pun linija, crna)

Однос изведен из изворног кода (сигурност)

zaključen

..>(tačkasta linija)

Izvedena relacija od strane LLM (rezultat poverenja)

неједназначан

--x(crvena tackasta linija)

Nejedнозначни odnos (за proveru)

Komunauti se prikazuju kao PlantUML paketi sa automatskom paletom boja.

Корак 3: Коришћење у свакиданском живу

Potpuni dijagram

# Générer le diagramme du Knowledge Graph complet
./gradlew generateKnowledgeGraphDiagram

Izlaz :`diagrams/knowledge-graph/knowledge-graph-full.puml`+.png

Филтрирај по заједници

# Une seule communauté
./gradlew generateKnowledgeGraphDiagram \
  -Pplantuml.kg.community=community_0

# Limiter le nombre de noeuds (lisibilité)
./gradlew generateKnowledgeGraphDiagram \
  -Pplantuml.kg.community=community_0 \
  -Pplantuml.kg.maxNodes=15

Филтрирај по типу ивице

# Uniquement les relations certaines (EXTRACTED)
./gradlew generateKnowledgeGraphDiagram \
  -Pplantuml.kg.edgeTypes=EXTRACTED

# Relations certaines + inférées
./gradlew generateKnowledgeGraphDiagram \
  -Pplantuml.kg.edgeTypes=EXTRACTED,INFERRED

Филтрирај по типу чвора и уверености

# Uniquement les classes de code
./gradlew generateKnowledgeGraphDiagram \
  -Pplantuml.kg.nodeTypes=code

# Seuil de confiance minimum (pour les INFERRED)
./gradlew generateKnowledgeGraphDiagram \
  -Pplantuml.kg.minConfidence=0.7

Prilagođeni izlazni direktorijum

./gradlew generateKnowledgeGraphDiagram \
  -Pplantuml.kg.outputDir=docs/architecture

Puna referencia svojstava

Својство nedostatak Опис

plantuml.kg.community

(све)

Filtriranje zajednica po imenu (podnizno podudaranje)

plantuml.kg.edgeTypes

(svi)

Tipovi granica odvojeni zarezom:`EXTRACTED`, INFERRED, AMBIGUOUS

plantuml.kg.minConfidence

0.0

Minimalni prag poverenja za ivice

plantuml.kg.maxNodes

(неограничен)

Maksimalni broj čvorova za prikaz

plantuml.kg.nodeTypes

(svi)

Tipovi čvorova odvojeni zarezom (npr.class, code)

plantuml.kg.outputDir

diagrams/knowledge-graph

Izlazni direktorijum za fajlove`.puml` et .png

Пуни pipeline у Gradle workflow-у

Tip radnog toka

@startuml
skinparam backgroundColor #FEFEFE
skinparam ActivityBackgroundColor #E8F4FD
skinparam ActivityDiamondBackgroundColor #FFF3CD
skinparam ActivityBorderColor #2C3E50

start

partition "извлаčenje" {
    :graphify . --no-viz;
    note right: Analyse le code source\ntree-sitter (local, pas de LLM)

    :graphify-out/graph.json;
    note right: Noeuds + arêtes\n+ communautés
}

partition "GENERACIJA" {
    :./gradlew generateKnowledgeGraphDiagram;
    note right: Pipeline déterministe\nparse → render → validate → PNG

    if (Filtres actifs ?) then (Oui)
        :Appliquer filtres\n(community, edgeTypes,\nmaxNodes, nodeTypes);
    else (Non)
        :Diagramme complet;
    endif

    :diagrams/knowledge-graph/\nknowledge-graph-full.puml\nknowledge-graph-full.png;
}

partition "ИНТЕГРАЦИЈА" {
    :git add diagrams/knowledge-graph/;
    :git commit;
    note right: Diagrammes versionnés\ntoujours à jour avec le code
}

stop

@enduml

Интеграција у циклусу развоја

pipeline se prirodno uklapa u ključni koraci razvoja:

@startuml
skinparam backgroundColor #FEFEFE

state "Razvoj" as dev
state "Extraction\ngraphify . --no-viz" as extract
state "Generisanje
./gradlew generateKnowledgeGraphDiagram" as generate
state "Commit
verzijski dijagrami" as commit

[*] --> dev
dev --> extract : Code modifié
extract --> generate : graph.json à jour
generate --> commit : .puml + .png générés
commit --> dev : Diagrammes dans le repo

note right of extract
  Quasi instantané sur du code Kotlin
  (tree-sitter, pas de LLM)
end note

note right of generate
  Déterministe
  Pas de LLM
  Résultat reproductible
end note

@enduml

inkrementalno ažuriranje

Kada se kod promeni, ne reconstruisemo ceo graf od nule:

# Mise à jour incrémentale (fichiers modifiés uniquement)
graphify . --update

# Puis régénérer les diagrammes
./gradlew generateKnowledgeGraphDiagram

--update`ponovo izvuče samo modificirane fajlove (detektovane SHA256 u`graphify-out/cache/). Na Kotlin kodu, to je skoro instantno jer tree-sitter radi lokalno bez poziva LLM.

Dogfooding: plugin se dokumentira samo

Plugin PlantUML postoji za transformisanje promptova u dijagram. Može i da pretvori Knowledge Graph svoje propre kodne baze u dokumentacione dijagrame. To je dogfooding : plugin potrošuje svoju uslugu.

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

package "Normalni pipeline
(korisnik → dijagrami)" as normal {
    [Fichier .prompt] as prompt
    [LlmService\n+ ApiKeyPool] as llm1
    [ProcessPlantumlPromptsTask] as task1
    [Diagramme PNG] as out1

    prompt --> task1
    task1 --> llm1
    llm1 --> out1
}

package "Pipeline Knowledge Graph
(deterministički, bez LLM)" as kg {
    [graphify-out/graph.json] as kgjson
    [KnowledgeGraphParser] as parser
    [KnowledgeGraphRenderer] as renderer
    [PlantumlService] as ps
    [Diagramme PNG\n(documentation du plugin)] as out2

    kgjson --> parser
    parser --> renderer
    renderer --> ps
    ps --> out2
}

package "Pipeline Dogfooding
(LLM → dokumentacija plugina)" as dogfood {
    [GraphifyPromptAdapter] as gpa
    [Fichiers .prompt\nauto-générés] as auto_prompt
    [LlmService\n+ ApiKeyPool] as llm2
    [ProcessPlantumlPromptsTask] as task2
    [Diagramme PNG\n(documentation LLM)] as out3

    kgjson --> gpa
    gpa --> auto_prompt
    auto_prompt --> task2
    task2 --> llm2
    llm2 --> out3
}

note "Isti LlmService, isti ApiKeyPool,
isti PlantumlService
— Nula duplikacije" as N

@enduml

Povezani Gradle zadaci :

Задатак LLM ? Опис

generateKnowledgeGraphDiagram

Ne

Transformi`graph.json`у PlantUML (детерминистски)

generateDiagramDocs

Да

Генериши неких`.prompt`od grafa, procesuira ih pomocu LLM (dogfooding)

# Documentation déterministe (rapide, pas de LLM)
./gradlew generateKnowledgeGraphDiagram

# Documentation LLM (plus riche, consomme des tokens)
./gradlew generateDiagramDocs

Zašto je determinističko (i zašto je bitno)

Ključna tačka konvejora`generateKnowledgeGraphDiagram` : Он не позива ниједан LLM. Трансформација`graph.json`→ PlantUML je čista funkcija.

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

rectangle "Deterministicki pipeline
(generateKnowledgeGraphDiagram)" as det {
    [graph.json] as json
    [KnowledgeGraphParser] as parser
    [KnowledgeGraphRenderer] as renderer
    [PlantUML code] as puml

    json --> parser : parse
    parser --> renderer : KnowledgeGraph
    renderer --> puml : render (fonction pure)
}

rectangle "Pipeline LLM\n(processPlantumlPrompts)" as llm {
    [.prompt] as prompt
    [LlmService] as llmSvc
    [ChatModel] as model
    [PlantUML code] as puml2

    prompt --> llmSvc
    llmSvc --> model : API call
    model --> puml2 : réponse non-déterministe
}

note bottom of det
  Même entrée → même sortie
  Pas de latence réseau
  Pas de coût en tokens
  Reproductible en CI
end note

note bottom of llm
  Même entrée → sortie variable
  Latence réseau (1-5s)
  Coût en tokens
  Nécessite une clave API
end note

@enduml

Конкретна предност :

Prednost Uticaj

Репродуктивност

исте`graph.json`→ isti dijagram. Tačno. Svaki put.

Bez troška

Nema poziva LLM = nema tokena = nema API računa.

Nula latencije

Parsiranje + renderovanje traje oko 100ms, nije 1-5 sekundi.

Kompatibilan CI

Ne treba API ključ. Nema flaky test zbog varijabilnog LLM odgovora.

способан за верзионирање

Le .puml`Генерисан је текст. Можемо га`diff, pregledač u PR, verzionirati u Git

Dijagrami samog pipeline-a

Da zatvorimo krug, evo dijagrama pipeline-a kako bi ga generirao dodatak :

@startuml
skinparam backgroundColor #FEFEFE

participant "Развојник" as Dev
participant "Gradle" as G
participant "GenerisiGrafZnanjaDijagramZadatak" as Task
participant "Parser grafa znanja" as Parser
participant "KnowledgeGraphRenderer" as Renderer
participant "Сервис PlantUML" as PS
collections "graphify-out/graph.json" as JSON
collections "дијаграме/знање-граф/" as Out

Dev -> G : ./gradlew generateKnowledgeGraphDiagram
G -> Task : execute
Task -> JSON : read
Task -> Parser : parse(graph.json)
Parser --> Task : KnowledgeGraph

alt filtres actifs
    Task -> Task : appliquer filtres\n(community, edgeTypes, maxNodes…)
end

Task -> Renderer : render(graph, filters)
Renderer --> Task : code PlantUML

Task -> PS : validateSyntax()
alt valide
    Task -> PS : generateImage()
    PS --> Out : .puml + .png
else invalide
    Task -> Out : .puml (avec warning)
end

@enduml

Интеграција у управљање пројектом

U našem projektu, ovaj pipeline se uklapa u strategiju upravljanja kontekstom EAGER/LAZY za AI agenta. Knowledge Graph zamjenjuje ručnu arhitektonsku dokumentaciju strukturom, upitom i automatski ažuriranim grafom.

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

package "EAGER
(uvek opterećen)" as eager {
    [PROMPT_REPRISE.adoc\n(contexte session)] as pr
    [INDEX.adoc\n(vue d'ensemble)] as idx
    [GRAPH_REPORT.adoc\n(~50 lignes)] as gr
}

package "LAZY — Strategija
(na zahtev)" as lazy_strat {
    [Méthodologies] as meth
    [Archives sessions] as sessions
}

package "LAZY — Graphify
(ciljeni upiti)" as lazy_graph {
    [graph.json] as gj
    [Queries\n(query/path/explain)] as queries
}

package "Pipeline PlantUML
(automatski generisani)" as puml {
    [generateKnowledgeGraphDiagram] as kgTask
    [generateDiagramDocs] as ddTask
    [Diagrammes PNG] as diagrams
}

Agent --> eager : Lit en début de session
Agent ..> lazy_strat : Charge si type détecté
Agent ..> lazy_graph : Query si besoin structurel
kgTask --> diagrams : Déterministe
ddTask --> diagrams : Via LLM

note right of gr
  Condensé du Knowledge Graph
  God nodes + communautés
  Remplace ECOSYSTEM_OVERVIEW
  (225 lignes → 50 lignes)
end note

@enduml

Brak dva sistema je komplementaran:

  • Strategija upravlja KAD i KAKO— upravljanje, radni tok, arhiviranje

  • Graphify upravlja šta i gdestruktura koda, odnosi, ciljani upiti

_ Strategija sesije upravljaKADA et le kako(управљање, ток рада, прагови), Graphify гаШта et le gde(struktura koda, odnosi, ciljani upiti). PlantUML pipeline upravljaSA ŠTA?(deterministički dijagrami, verzionirani, uvek ažurirani) _

Postavljanje : lista kontrola za 5 minuta

# Етап Porudžbina

1

Инсталирај Graphify

uv tool install graphifyy

2

Настроји искључиве

креирати`.graphifyignore`

3

Извлачење графа знања

graphify . --no-viz

4

Генериши dijagrame

./gradlew generateKnowledgeGraphDiagram

5

Commitovati rezultate

git add diagrams/knowledge-graph/

# Script complet en 5 commandes
uv tool install graphifyy
cat > .graphifyignore << 'EOF'
*-context.yml
*.env
build/
.gradle/
EOF
graphify . --no-viz
./gradlew generateKnowledgeGraphDiagram
git add graphify-out/GRAPH_REPORT.adoc graphify-out/graph.json diagrams/knowledge-graph/

Пешке и ускрављања

застан Opis унажавање

Previše gusto graf

Veliki projekat generiše stotine nečitljivih čvorova

koristiti`-Pplantuml.kg.maxNodes=30`и филтрирај по заједници

Preširoka isključivanja

Previše fajlova u`.graphifyignore`smanjuje vrednost grafa

Početi isključivanjem samo credentials i build

Смер стрелица

Grane INFERRED mogu imati nejednoznačan smer

Филтер по`-Pplantuml.kg.edgeTypes=EXTRACTED`само за одређене односе

Застарео граф

Kod se menja ali graf nije ponovo konstruisan

Koristiti`graphify . --update`redovito ili git hook`graphify hook install`

Ажуриран кошт

Inkrementalna ažuriranja su skoro besplatna (tree-sitter lokalno)

Само docs ().adoc) potrošaju LLM tokene

Šta na kraju dobijamo

@startuml
skinparam backgroundColor #FEFEFE

rectangle "пре" as avant {
    card "Дијаграми цртани руком
Увек застарели
Нико не ажурира их" as av1 #FDEDEC
}

rectangle "posle" as apres {
    card "Automatski generisani dijagrami
Uvek ažurirani sa kodom
Verzionisani u Gitu
Deterministični i reproducibili" as ap1 #E8F8E8
}

avant --> apres : graphify . --no-viz\n+ ./gradlew generateKnowledgeGraphDiagram

@enduml

Конкретне koristi :

dobit detalj

Увијек ажурирана документација

Dijagrami refleksuju trenutni kod, a ne ručnij snapshot

Nula napora održavanja

Dijagrami se ponovo generiraju pri svakom build-u

Smanjenje tehničkog duga

Више не треба да одржавате дијаграме рачно.

Vizuelni kontekst za nove

Novi programer razume arhitekturu gledajući dijagrame

potencijalno podešavanje

Parovi (potgraf → dijagram) su primeri obuke veštačke inteligencije.

Automatska validacija

`PlantumlService.validateSyntax()`проверуј сваки генерисани дијаграм

Brzo onboardovanje

5 dijagrama = puni pogled na arhitekturu

_ Tko ima _zašto može da nosi sve kako __

zašto : dijagrami uvek ažurirani. komentar : dve komande u Gradle pipeline-u.

Veze

Повезани чланци