ادغام Graphify در یک گردش کار Gradle : از Knowledge Graph به نمودار PlantUML در یک دستور
منتشر شده در 19 April 2026
- مشکل: نمودارها همیشه به کد عقب میمانند
- راهحل: یک لولهخط determinist Knowledge Graph → PlantUML
- مرحله 1: Graphify را نصب کنید و دانش گراف را استخراج کنید
- مرحله ۲ : پلاگین Gradle Knowledge Graph را به PlantUML تبدیل میکند
- مرحله ۳ : استفاده روزانه
- پایپلاین کامل در یک گردش کار Gradle
- Dogfooding : پلاگین خود را مستند میسازد
- چرا این تعیینمند است (و چرا اهمیت دارد)
- نمودارهای خود پایپ لاین
- ادغام در حاکمیت پروژه
- آمادهسازی: چکلیست ۵ دقیقهای
- پنجهها و کاهشات
- چه چیزی که در نهایت به دست میآوریم
- لینکها
کدپای شما در حال گسترش است. وابستگیهای بین ماژولها به سرعت افزایش مییابند. مستندات معماری قبل از اینکه نوشته شوند، منسوخ میشوند. و اگر ساخت Gradle شما بتواند بهصورت automatiquement diagramهای بهروز را از ساختار واقعی کد تولید کند؟ این دقیقاً همان کاری است که پالین Graphify + PlantUML Gradle Plugin انجام میدهد :`graphify . --no-viz`Knowledge Graph را استخراج می-conducts,`./gradlew generateKnowledgeGraphDiagram`او را به نمودارهای PlantUML تبدیل میکند. صفر LLM, صفر راهنمایی, 100% deterministik.
- تک
-
[]
مشکل: نمودارها همیشه به کد عقب میمانند
هر پروژهای که بیش از چند هزار خط دارد این سندروم را میشناسد :
-
یک نمودار معماری در ابتدای پروژه رسم میشود
-
کد تکامل مییابد، وابستگیها تغییر میکنند
-
نمودار یک دروغ تزئینی میشود.
-
هیچ کس آن را بهروزرسانی نمیکند چون خستهکننده است.
-
وافدین جدید بر آن استناد دارند و اشتباه میکنند
@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
سوال این نیست faut-il des diagrammes ? — همه میدانند که بله. سوال این است:کی آنها را بهروز میدارد؟
جواب: هیچ کس. مگر خودکار باشد.
راهحل: یک لولهخط determinist Knowledge Graph → PlantUML
مبدأ ساده است : به جای نمودارها به صورت دستی رسم کردن, ما آنهااز ساختار واقعی کد تولید میشود.
@startuml skinparam backgroundColor #FEFEFE skinparam componentStyle rectangle actor Développeur component "Graphify\n(pip install graphifyy)" 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\n(اعتبارسنجی + ارائه PNG)" as PS collections "نمودارها/گراف دانش/\n(.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, همیشه بهروز با کد.
مرحله 1: Graphify را نصب کنید و دانش گراف را استخراج کنید
نصب
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/
استخراج گراف دانش
graphify . --no-viz
پرچم`--no-viz`ایجاد HTML را رد میکند (در یک خط لول 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`یک وظیفه را ادغام میکند`generateKnowledgeGraphDiagram`که تبدیل میکند`graph.json`به صورت diagramهای PlantUMLکاملاً تعیینکننده(Output empty)
@startuml
skinparam backgroundColor #FEFEFE
participant "Gradle" as G
participant "وظیفه تولید نمودار گراف دانش" 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
اجزای داخلی
| بخش | نقش |
|---|---|
|
پارس`graph.json`— پشتیبانی میکند 3 فرمت: graphify natif ( |
|
یک را به صورت deterministic تبدیل کنید`KnowledgeGraph`در کد PlantUML. گروهها بر اساس نوع،جامعات در بستهها،توضیح خودکار |
|
وظیفهٔ Gradle که orchestra میکند : parse → render → validate → PNG. قابل تنظیم از طریق ویژگیهای Gradle. |
|
مدلهای داده:`KnowledgeGraph`, |
|
اعتبارسنجی نحوی + رندر PNG (باز به کار گرفته شده توسط تمام وظایف پلاگین). |
قوانین رندرینگ
رندر معیارات بصری قطعی اعمال می-conduct :
| نوع لبه | نوتیشن PlantUML | معنی |
|---|---|---|
استخراج شده |
|
رابطه استخراجشده از کد منبع (اطمینان) |
استنتاج شده |
|
رابطه استنتاجشده توسط LLM (امتیاز اطمینان) |
مبهم |
|
ربط مبهم (باید بررسی شود) |
جامعهها به صورت بستههای PlantUML با یک پالت رنگ خودکار نمایش داده میشوند.
مرحله ۳ : استفاده روزانه
دیاگرام کامل
# 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 |
پایپلاین کامل در یک گردش کار Gradle
نوع گردش کار
@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 "کامیتر دیاگرامها نسخهدar" 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
|
|
Dogfooding : پلاگین خود را مستند میسازد
افزونه PlantUML برای تبدیل پرامپتها به نمودار وجود دارد. همچنین میتواند Knowledge Graph کد پایهٔ خود (propre) را به نمودارهای مستندات تبدیل کند. این dogfooding است: افزونه servicios خود را مصرف میکند.
@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 est une fonction pure.
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
rectangle "خط لوله قطعی
(تولید نمودار گراف دانش)" 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
مزایای ملموس :
| مزیت | تأثیر |
|---|---|
قابلیت بازتولید |
هم`graph.json`→ همان نمودار. دقیقاً. هر بار. |
هزینه صفر |
هیچ تماس LLM = هیچ توکن = هیچ صورتحساب API |
تأخیر صفر |
Parse + render ~100ms زمان میبرد، نه 1-5 ثانیه. |
سازگار CI |
کلید API لازم نیست. هیچ تست نامطمئن به دلیل پاسخ متغیر LLM وجود ندارد. |
قابل نسخهگذاری |
Le |
نمودارهای خود پایپ لاین
برای بستن حلقه، این نمودار خط لوله به شکل که توسط پلاگین تولید میشود:
@startuml
skinparam backgroundColor #FEFEFE
participant "توسعهدهنده" as Dev
participant "Gradle" as G
participant "GenerateKnowledgeGraphDiagramTask" as Task
participant "KnowledgeGraphParser" as Parser
participant "رندر گراف دانش" 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
ادغام در حاکمیت پروژه
در پروژه ما، خط لوله در یک استراتژی مدیریت زمینه EAGER/LAZY برای عامل هوش مصنوعی گنجانده میشود. گراف دانش جایگزین documentation arquitectura دستی با یک گراف ساختاریافته، قابلپرس و جو و بهروزرسانی خودکار میشود.
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
package "EAGER
(همیشه بارگذاری شده)" 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 "Pipeline PlantUML\n(بهصورت خودکار تولید شده)" 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
ازدواج دو سیستم تکمیلی است:
-
استراتژی QUAND و COMMENT را مدیریت میکند— حاکمیت, گردش کار, بایگانی
-
Graphify چه و کجا را مدیریت میکند— ساختار کد، روابط، کوئریهای هدفمند
_ استراتژی جلسه مدیریتکی et le چطور(حاکمیت, جریان کاری, آستانهها)، Graphify مدیریت میکندچی et le کجا(ساختار کد، روابط، استعلامات هدفمند). خط لوله PlantUML مدیریت میکندبا چه(نمودارهای تعیینمحور، نسخهبندی شده، همیشه بهروز) _
آمادهسازی: چکلیست ۵ دقیقهای
| # | مرحله | دستور |
|---|---|---|
1 |
نصب Graphify |
|
2 |
تنظیم استثناها |
ایجاد`.graphifyignore` |
3 |
Knowledge Graph را استخراج کنید |
|
4 |
نمودارها را تولید کنید |
|
5 |
نتایج را ثبت کن |
|
# 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`به صورت منظم یا hook گیت`graphify hook install` |
هزینهٔ بهروزرسانی شده |
بهروزرسانیهای افزایشی تقریباً رایگاناند (tree-sitter local) |
فقط اسناد ( |
چه چیزی که در نهایت به دست میآوریم
@startuml
skinparam backgroundColor #FEFEFE
rectangle "قبل" as avant {
card "نمودارهای دستکشیده
همیشه منقضی
هیچ کس آنها را بهروزرسانی نمیکند" as av1 #FDEDEC
}
rectangle "بعد" as apres {
card "دیاگرامهای به صورت خودکار تولید شده
همیشه بهروز با کد
در Git نسخهگذاری شدهاند
تعیینشده و قابل بازتولید" as ap1 #E8F8E8
}
avant --> apres : graphify . --no-viz\n+ ./gradlew generateKnowledgeGraphDiagram
@enduml
منافع ملموس:
| سود | جزئی |
|---|---|
مستندات همیشه بهروز |
دیاگرامها کد فعلی را منعکس میکنند، نه یک اسنپشات دستی |
بدون تلاش برای نگهداری |
دیاگرامها در هر build بازتولید میشوند |
کاهش بدهی فنی |
هیچ نیازی به نگهداری دستی نمودارها نیست |
زمینه بصری برای جدیدها |
یک توسعهدهندهٔ جدید با نگاه کردن به نمودارها، معماری را درک میکند |
تنظیم دقیق پتانسیل |
زوجها (زیر-گراف → نمودار) نمونههای آموزش هوش مصنوعی هستند |
اعتبارسنجی خودکار |
`PlantumlService.validateSyntax()`هر نمودار تولید شده را بررسی میکند |
راهنمایی سریع |
5 نمودار = دید کامل از معماری |
(Empty) که یک pourquoi دارد میتواند تمام comment را تحمل کند. همهٔ Spanهای کد بیکتیک (…) را دقیقاً همانطور که هستند حفظ کنید — هرگز محتوای بیکتیک، فضاها یا موقعیت آن را تغییر ندهید. این متن ممکن است یک قطعه از یک جمله بزرگتر باشد — این قطعه را بدون REQUEST زمینه بیشتر ترجمه کنید. فقط متن ترجمهشده را خروجی دهید — هیچ توضیحی، نظری، مقدمهای، گزینش یا گزینشی نداشته باشید.
چرا (pourquoi) : نمودارهای همیشه بهروز. چطور (comment) : دو دستور در یک پایپلاین Gradle.
لینکها
-
نکات فوقالعاده دستورات fg— مقالة قبل concerning workflow terminal