Integrisanje Graphify u Gradle workflow: od Knowledge Grapha do PlantUML dijagrama jednim komandom
Објављено 19 April 2026
- Проблем: дијаграми увек у назаду у односу на код
- Решение : детерминисански конвејер Knowledge Graph → PlantUML
- Корак 1: Инсталирај Graphify и извлекни знања граф
- Korak 2: Gradle plugin pretvara Knowledge Graph u PlantUML
- Корак 3: Коришћење у свакиданском живу
- Пуни pipeline у Gradle workflow-у
- Dogfooding: plugin se dokumentira samo
- Zašto je determinističko (i zašto je bitno)
- Dijagrami samog pipeline-a
- Интеграција у управљање пројектом
- Postavljanje : lista kontrola za 5 minuta
- Пешке и ускрављања
- Šta na kraju dobijamo
- Veze
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.
-
Crtamo dijagram arhitekture na početku projekta.
-
Kod se razvija, zavisnosti se menja
-
Dijagram postaje dekorativna laž
-
Niko ne ažurira to jer je mrsko.
-
Нови долазаци се ослањају на то и грешу
@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
{
"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 ( |
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 | Улага |
|---|---|
|
parsirati`graph.json`— Podržava tri formata: grafify natif ( |
|
Transformiši determinirano jedan`KnowledgeGraph`u kodu PlantUML. Grupe po tipu, zajednice u paketima, automatska legenda. |
|
Gradle zadatak koji orkestriše: parse → render → validate → PNG. Podešivo preko Gradle svojstava. |
|
Modeli podataka:`KnowledgeGraph`, |
|
Синтаксичка провјера + рендерирање PNG (поновно коришћен свим задацима плагина). |
Правила рендеринга
Renderer primenjuje determinističke vizuelne konvencije:
| Tip ivice | Notacija PlantUML | Значење |
|---|---|---|
извадак |
|
Однос изведен из изворног кода (сигурност) |
zaključen |
|
Izvedena relacija od strane LLM (rezultat poverenja) |
неједназначан |
|
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 | Опис |
|---|---|---|
|
(све) |
Filtriranje zajednica po imenu (podnizno podudaranje) |
|
(svi) |
Tipovi granica odvojeni zarezom:`EXTRACTED`, |
|
|
Minimalni prag poverenja za ivice |
|
(неограничен) |
Maksimalni broj čvorova za prikaz |
|
(svi) |
Tipovi čvorova odvojeni zarezom (npr. |
|
|
Izlazni direktorijum za fajlove`.puml` et |
Пуни 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
|
|
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 ? | Опис |
|---|---|---|
|
Ne |
Transformi`graph.json`у PlantUML (детерминистски) |
|
Да |
Генериши неких`.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 |
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 |
|
2 |
Настроји искључиве |
креирати`.graphifyignore` |
3 |
Извлачење графа знања |
|
4 |
Генериши dijagrame |
|
5 |
Commitovati rezultate |
|
# 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 () |
Š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
-
Super tips komande fg— prethodni članak o terminalnom radnom toku