ادغام Graphify در یک گردش کار Gradle: از Knowledge Graph به نمودار PlantUML در یک دستور
منتشر شده در 19 April 2026
- مشکل: نمودارها همیشه در عقب از کد میمانند
- راهحل: یک خط لوله déterministe Knowledge Graph → PlantUML
- مرحله ۱: Graphify را نصب کنید و Knowledge Graph را استخراج کنید
- مرحله ۲: پلاگین Gradle Knowledge Graph را به PlantUML تبدیل میکند
- مرحله 3: استفاده روزانه
- پایپلاین کامل در گردش کار گرادل
- دگفودینگ: پلاگین خود را مستند میکند
- چرا این تعیینپذیر است (و چرا مهم است)
- دیاگرامهای خود pipeline
- یکپارچهسازی در مدیریت پروژه
- پیکربندی: چکلیست در ۵ دقیقه
- فخها و کاهشها
- چیزی که در نهایت به دست میآوریم
- لینکها
زمان خواندن : 12 minutes
کدپای شما در حال رشد است. وابستگیها بین ماژولها بهسرعت در حال افزایش هستند. مستندات معماری قبل از نوشتن، منقضی میشود. و اگر ساخت Gradle شما بتواند بهصورت خودکار diagramهای بروز شده را از ساختار واقعی کد تولید کند؟ این دقیقاً چیزی است که پیلاین Graphify + PlantUML Gradle Plugin انجام میدهد:`graphify . --no-viz`Knowledge Graph را استخراج میکند,`./gradlew generateKnowledgeGraphDiagram`او آن را به نمودارهای PlantUML تبدیل میکند. صفر LLM، صفر دستورالعمل، 100% قطعی.
- تیک
-
[]
مشکل: نمودارها همیشه در عقب از کد میمانند
هر پروژهای که بیش از چند هزار خط دارد، این سندرم را میشناسد:
-
در ابتدای پروژه، یک نمودار معماری رسم میکنیم.
-
کد توسعه مییابد، وابستگیها تغییر میکنند
-
نمودار یک دروغ تزئینی میشود
-
هیچکس آن را بهروز نمیکند چون این کار خستهکننده است.
-
به تازگی آمدهها بر آن استناد میکنند و اشتباه میکنند
@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
سوال این نیست که آیا باید نمودار داشته باشیم؟ — همهٔ میدانند بله. سوال این است :کی آنها را بهروز میدارد؟
پاسخ: هیچکس. مگر اینکه خودکار باشد.
راهحل: یک خط لوله déterministe Knowledge Graph → PlantUML
مبدأ ساده است : به جای رسم دستی نمودارها، ما آنهااز ساختار واقعی کد تولید میشود.
@startuml skinparam backgroundColor #FEFEFE skinparam componentStyle rectangle actor Développeur component "Graphify (نصب graphifyy با pip)" as Graphify collections "graphify-out/graph.json (گراف دانش)" as KGJSON component "افزونه Gradle PlantUML (generateKnowledgeGraphDiagram)" as Plugin component "KnowledgeGraphParser" as Parser component "KnowledgeGraphRenderer" as Renderer component "PlantumlService (اعتبارسنجی + رندر 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
نتیجه؟ فایلها`.puml` et .png`در`diagrams/knowledge-graph/, نسخهٔگذاریشده در Git, همیشه بهروز با کد.
مرحله ۱: Graphify را نصب کنید و Knowledge Graph را استخراج کنید
نصب
Graphify یک ابزار پایتون است که کدبیس شما را تجزیه و تحلیل میکند و یک گراف دانش منظم میسازد:
# Méthode recommandée
uv tool install graphifyy && graphify install --platform opencode
# Alternative avec pip
pip install graphifyy && graphify install --platform opencode
تنظیم استثناها
یک فایل ایجاد کن`.graphifyignore`در ریشه پروژه برای استبعاد فایلهایی که بخشی از منطق کسبوکار نیستند :
# Secrets — JAMAIS dans le graphe
*-context.yml
*.env
# Fichiers générés
build/
.gradle/
# Tests fonctionnels
src/functionalTest/
استخراج Knowledge Graph
graphify . --no-viz
پرچم`--no-viz`تولید HTML را رد میکند (در یک pipeline Gradle بیفایده است). نتیجه یک فایل است`graphify-out/graph.json`شامل :
-
گرهها: کلاسها، توابع، فایلها — با نوعشان و جامعه
-
لبهها: رابطهها بین گرهها (EXTRACTED از کد, INFERRED توسط LLM)
-
جامعات: گروهبندی خودکار گرههای مرتبط
{
"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}
]
}
|
کد منبع ( |
مرحله ۲: پلاگین Gradle Knowledge Graph را به PlantUML تبدیل میکند
معماری لاینپایپ
پلاگین`com.cheroliv.plantuml`یک تسک را یکساز می-conduct`generateKnowledgeGraphDiagram`که تبدیل میکند`graph.json`در نمودارهای PlantUML به صورتکاملاً تعیینمند:
@startuml
skinparam backgroundColor #FEFEFE
participant "Gradle" as G
participant "GenerateKnowledgeGraphDiagramTask" as Task
participant "KnowledgeGraphParser" as Parser
participant "KnowledgeGraphRenderer" as Renderer
participant "سرویس PlantUML" 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
قطعات داخلی
| جزء | نقش |
|---|---|
|
تجزیه`graph.json`— پشتیبانی ۳ فرمت : graphify natif ( |
|
به صورت deterministic یک`KnowledgeGraph`در کد PlantUML. گروهها بر اساس نوع، جوامع در بستهها، راهنمای خودکار. |
|
وظیفه Gradle که : parse → render → validate → PNG را orchestre میکند. قابل تنظیم از طریق ویژگیهای Gradle. |
|
مدلهای donnée :`KnowledgeGraph`, |
|
اعتبارسنجی نحوی + رندر PNG (بازکاربرد شده توسط تمام وظایف پلاگین). |
قوانین رnderینگ
renderer اعمال می-conduct مقررات بصری حتمی :
| نوع لبه | نوتیشن PlantUML | معنی |
|---|---|---|
استخراج شده |
|
رابطه استخراج شده از کد منبع (اطمینان) |
استنتاج شده |
|
رابطه استنتاجی توسط LLM (امتیاز اعتماد) |
مبهم |
|
رابطه مبهم (باید بررسی شود) |
جامعات به عنوان بستههای PlantUML با یک پالت رنگ خودکار نمایش داده میشوند
مرحله 3: استفاده روزانه
دیاگرام کامل
# Générer le diagramme du Knowledge Graph complet
./gradlew generateKnowledgeGraphDiagram
خروج:`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
دایرکتوری خروجی سفارشی
./gradlew generateKnowledgeGraphDiagram \
-Pplantuml.kg.outputDir=docs/architecture
مرجع کامل ویژگیها
| مالکیت | عيب | توضیحات |
|---|---|---|
|
(همه) |
فیلتر کردن جوامع بر اساس نام (مطابقت زیررشته) |
|
(همه) |
انواع لبهها جدا شده با کاما :`EXTRACTED`, |
|
|
حداقل آستانه اطمینان برای لبهها |
|
(بیحد) |
حداکثر تعداد گرهها برای نمایش |
|
(همه) |
انواع گرهها جدا شده با کاما (مثال. |
|
|
دایرکتوری خروجی برای فایلها`.puml` et |
پایپلاین کامل در گردش کار گرادل
نوع گردش کار
@startuml
skinparam backgroundColor #FEFEFE
skinparam ActivityBackgroundColor #E8F4FD
skinparam ActivityDiamondBackgroundColor #FFF3CD
skinparam ActivityBorderColor #2C3E50
start
partition "استخراج" {
: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 "تولید" {
:./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
ادغام در چرخه توسعه
پایپلاین بهطور طبیعی در مراحل کلی توسعه ادغام میشود :
@startuml skinparam backgroundColor #FEFEFE state "توسعه" as dev state "استخراج graphify . --no-viz" as extract state "ایجاد ./gradlew generateKnowledgeGraphDiagram" as generate state "کمیتی دیاگرامهای نسخهگذاریشده" 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
بهروزرسانی افزایشی
وقتی کد تغییر میکند، تمام گراف را از صفر بازسازی نمیکنیم :
# Mise à jour incrémentale (fichiers modifiés uniquement)
graphify . --update
# Puis régénérer les diagrammes
./gradlew generateKnowledgeGraphDiagram
|
|
دگفودینگ: پلاگین خود را مستند میکند
پلاگین PlantUML برای تبدیل پرامپتها به نمودار موجود است. این پلاگین همچنین میتواند Knowledge Graph کدبیس propre خود را به نمودارهای مستندات تبدیل کند. این dogfooding است: پلاگین سرویس خود را مصرف میکند.
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
package "خط لوله عادی
(کاربر → نمودارها)" 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
(تعیین شده، بدون 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 → مستندات پلاگین)" 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 "همان LlmService، همان ApiKeyPool،
همان PlantumlService
— بدون هیچ تکرار" as N
@enduml
وظائف Gradle مرتبط :
| وظیفه | LLM ? | توضیح |
|---|---|---|
|
نه |
تبدیل کن`graph.json`در PlantUML (قطعی) |
|
بله |
تولید کن`.prompt`از گراف، آنها را از طریق LLM (dogfooding) پردازش میکند |
# Documentation déterministe (rapide, pas de LLM)
./gradlew generateKnowledgeGraphDiagram
# Documentation LLM (plus riche, consomme des tokens)
./gradlew generateDiagramDocs
چرا این تعیینپذیر است (و چرا مهم است)
نکته کلیدی پایپ لاین`generateKnowledgeGraphDiagram` : او هیچ LLM را صدا نمیزند. تبدیل`graph.json`PlantUML یک تابع صاف است.
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
rectangle "خط لولDeterministic
(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 "خط لول LLM
(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
مزایای ملموس :
| مزیت | اثر |
|---|---|
قابلیت بازتولید |
همان`graph.json`→ همان نمودار. دقیقاً. همیشه. |
هزینهٔ صفر |
بدون تماس LLM = بدون توکن = بدون صورتحساب API |
تأخیر صفر |
پارس + رندر حدود ۱۰۰ میلیثانیه طول میکشد، نه ۱ تا ۵ ثانیه. |
سازگار CI |
کلید API لازم نیست. هیچ تست ناپایداری به دلیل پاسخ LLM متغیر وجود ندارد. |
قابل نسخهسازی |
Le |
دیاگرامهای خود pipeline
برای بستن حلقه، اینجا نمودار پایپ لاین است که توسط پلاگین تولید میشود :
@startuml
skinparam backgroundColor #FEFEFE
participant "توسعهدهنده" as Dev
participant "گریدل" as G
participant "ایجاد نمودار گراف دانش" as Task
participant "KnowledgeGraphParser" 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
یکپارچهسازی در مدیریت پروژه
در پروژه ما، این pipeline در یک استراتژی مدیریت زمینه EAGER/LAZY برای عامل هوش مصنوعی ادغام میشود. Knowledge Graph مستندسازی دستی معماری را جایگزین کرده و به جای آن یک گراف ساختاریافته، قابل-query و بهروزرسانی خودکار را فراهم میسازد.
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
package "EAGER\n(همیشه بارگذاری شده)" 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 — استراتژی
(بهطلب)" as lazy_strat {
[Méthodologies] as meth
[Archives sessions] as sessions
}
package "LAZY — Graphify
(درخواستهای هدفمند)" as lazy_graph {
[graph.json] as gj
[Queries\n(query/path/explain)] as queries
}
package "پایپ لاین PlantUML
(خود-تولید شده)" 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
ازدواج دو سیستم مکمل است :
-
استراتژی مدیریت زمان و روش را بر عهده دارد.— حاکمیت، فرآیند کار، بایگانی
-
Graphify مدیریت میکند چی و کجا— ساختار کد، روابط، کوئریهای هدفمند
</think> استراتژی جلسه آن را مدیریت میکندوقتی et le چطور(حاکمیت, گردش کار, آستانهها), Graphify مدیریت میکندچی et le کجا(ساختار کد، روابط، کوئریهای هدفمند). خط لول PlantUML آن را مدیریت میکندبا چه چیزی (diagrammes déterministes, versionnés, toujours à jour). __
پیکربندی: چکلیست در ۵ دقیقه
| (Empty) | مرحله | سفارش |
|---|---|---|
1 |
Graphify را نصب کنید |
|
2 |
پیکربندی استثناها |
ایجاد کن`.graphifyignore` |
3 |
استخراج گراف دانش |
|
4 |
دیآگرامها را تولید کنید |
|
5 |
نتایج را commit کنید |
|
# 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/
فخها و کاهشها
| پینجه | توضیح | کاهش |
|---|---|---|
گراف بسیار چگال |
یک پروژه بزرگ صدها گره غیر قابلخواندن ایجاد میکند. |
استفاده کردن`-Pplantuml.kg.maxNodes=30`و فیلتر بر پایهٔ جامعه |
استثناءهای بسیار گسترده |
فایلهای بیش از حد در`.graphifyignore`مقدار گراف را کاهش میدهد |
شروع کنید با حذف فقط credentials و build |
جهت فلشها |
لبههای INFERRED میتوانند جهت مبهمی داشته باشند |
فیلتر بر حسب`-Pplantuml.kg.edgeTypes=EXTRACTED`فقط برای روابط مطمئن |
گراف منسوخ |
کد تغییر میکند اما گراف بازسازی نمیشود |
استفاده کردن`graphify . --update`بهصورت منظم یا هوک گیت`graphify hook install` |
هزین بهروزرسانی شدهمع |
بهروزرسانیهای افزایشی تقریباً رایگان هستند (tree-sitter محلی) |
فقط اسناد ( |
چیزی که در نهایت به دست میآوریم
@startuml
skinparam backgroundColor #FEFEFE
rectangle "قبل" as avant {
card "نمودارهای کشیدهشده دستی
همیشه منسوخ
هیچکس آنها را بهروزرسانی نمیکند" as av1 #FDEDEC
}
rectangle "بعد" as apres {
card "دیاگرامهای تولید شده بهصورت خودکار
همیشه بهروز با کد
نسخهگذاری شده در گیت
دترمینیستیک و قابل بازتولید" as ap1 #E8F8E8
}
avant --> apres : graphify . --no-viz\n+ ./gradlew generateKnowledgeGraphDiagram
@enduml
فواید ملموس:
| بازده | جزئی |
|---|---|
مستندات همیشه بهروز |
دآیگرامها کد فعلی را منعکس میکنند، نه یک اسنپشات دستی |
بدون تلاش برای نگهداری |
دیاگرامها در هر ساخت بازسازی میشوند |
کاهش بدهی فنی |
حالا دیگر نیاز به نگهداری دستی نمودارها نیست. |
سیاق بصری برای جدیدها |
یک توسعهدهندهٔ جدید با نگاه به نمودارها، معماری را درک میکند. |
تنظیم دقیق پتانسیل |
جفتهای (زیرگراف → نمودار) نمونههای آموزش هوش مصنوعی هستند |
اعتبارسنجی خودکار |
`PlantumlService.validateSyntax()`هر نمودار تولید شده را بررسی میکند |
بوردینگ سریع |
5 نمودار = نمای کامل از معماری |
_ که کسی که یک _pourquoi دارد، میتواند تمام commentها را تحمل کند. __
چرا : نمودارهای همیشه بهروز. چطور : دو دستور در یک لایپلاین Gradle.
لینکها
-
نکات برتر دستور fg— مقالة قبلی concerning terminal workflow