دمج Graphify في سير عمل Gradle: من Knowledge Graph إلى رسم بياني PlantUML بأمر واحد
نُشر في 19 April 2026
- المشكلة: المخططات دائمًا متأخرة عن الكود
- الحل: مسار محدد Knowledge Graph → PlantUML
- الخطوة 1: تثبيت Graphify واستخراج Knowledge Graph
- الخطوة 2 : الإضافة Gradle تُحَوِّل Knowledge Graph إلى PlantUML
- الخطوة 3: الاستخدام اليومي
- الـ بايبلاين الكامل في سير عمل Gradle
- الـdogfooding : البرنامج يوثق نفسه
- لماذا هو حتمي (لماذا ذلك مهم)
- مخططات خط الأنابيب نفسه
- التكامل في حوكمة المشروع
- الإعداد: قائمة التحقق في 5 دقائق
- المصائد والتخفيفات
- ما نحصل عليه في النهاية
قاعدة الكود الخاصة بك تنمو. الاعتمادات بين الوحدات تزداد. توثيق الهندسة يصبح قديمًا قبل حتى أن يُكتب. وإذا كان بإمكان بناء Gradle الخاص بك تلقائيًا إنشاء مخططات محدثة من بنية الكود الفعلية؟ هذا بالضبط ما يفعله خط أنابيب Graphify + Gradle Plugin PlantUML :`graphify . --no-viz`يستخرج Knowledge Graph،`./gradlew generateKnowledgeGraphDiagram`يقوم بتحويله إلى مخططات PlantUML. صفر LLM، صفر دليل، 100% حتمي.
المشكلة: المخططات دائمًا متأخرة عن الكود
كل مشروع يتجاوز بضعة آلاف من الأسطر يعرف هذا المتلازمة :
-
نرسم مخططًا معماريًا في بداية المشروع
-
يتطور الكود، وتتغير الاعتمادات
-
المخطط يصبح كذبة زخرفية
-
لا أحد يحدّثه لأنه متعب
-
المستجدون يعتمدون عليه ويخطئون
@startuml
skinparam backgroundColor #FEFEFE
skinparam ActivityBackgroundColor #FDEDEC
skinparam ActivityDiamondBackgroundColor #FFF3CD
start
:تم إنشاء مخطط البنية\n(manuellement, à la main);
:الكود يتطور\n(nouvelles classes, nouvelles dépendances);
:مخطط قديم\n(ne reflète plus le code);
if (Qui met à jour ?) then (Personne)
:توثيق كاذب;
note right: المطوّرون الجدد\nيستندون إليه ... و يرتكبون أخطاء
else (Quelqu'un)
:تحديث يدوي\n(2-3 heures de travail);
note right: قديم بالفعل\nللـ PR القادم
endif
stop
@enduml
السؤال ليس هل يجب أن تكون هناك مخططات؟ — الجميع يعلم أن نعم. السؤال هو :من يحافظ على تحديثهم؟
الجواب: لا أحد. ما لم يكن تلقائيًا
الحل: مسار محدد 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\n(Knowledge Graph)" as KGJSON component "PlantUML Gradle Plugin\n(generateKnowledgeGraphDiagram)" as Plugin component "KnowledgeGraphParser" as Parser component "KnowledgeGraphRenderer" as Renderer component "PlantumlService\n(validation + rendu PNG)" as PS collections "diagrams/knowledge-graph/\n(.puml + .png)" as Output Développeur --> Graphify : ارسم بيانيًا . --no-viz Graphify --> KGJSON : استخراج البنية\nمن الكود المصدر 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 : كود PlantUML\nمحدّد Plugin --> PS : validateSyntax + generateImage PS --> Output : .puml + .png note bottom of Plugin خط أنابيب DÉTERMINISTE لا يوجد استدعاء LLM نتيجة قابلة للتكرار 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 واستخراج 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/
استخراج رسم المعرفة
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}
]
}
|
شفرة المصدر ( |
الخطوة 2 : الإضافة Gradle تُحَوِّل Knowledge Graph إلى PlantUML
هيكل خط الأنابيب
الإضافة`com.cheroliv.plantuml`يتضمن مهمة`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 "PlantumlService" as PS
collections "graphify-out/graph.json" as JSON
G -> Task : نفّذ
Task -> JSON : قرأ�؟ Actually imperative is "اقرأ". We'll output that.\n\n</think>\nاقرأ
Task -> Parser : parse(graph.json)
Parser --> Task : KnowledgeGraph\n(noeuds + arêtes + communautés)
Task -> Renderer : render(graph, filters)
Renderer --> Task : كود PlantUML\n(déterministe)
Task -> PS : validateSyntax(plantumlCode)
alt syntaxe valide
Task -> PS : generateImage → .png
else syntaxe invalide
Task -> Task : احفظ .puml مع تحذير
end
@enduml
المكونات الداخلية
| مكون | دور |
|---|---|
|
تحليل`graph.json`— يدعم 3 تنسيقات : graphify أصلي ( |
|
حوّل حتميًا`KnowledgeGraph`في كود PlantUML. مجموعات حسب النوع، المجتمعات في الحزم، legend التلقائية. |
|
مهمة Gradle التي تنظم: parse → render → validate → PNG. قابل للتكوين عبر خصائص Gradle. |
|
نماذج البيانات :`KnowledgeGraph`, |
|
التحقق من الصياغة + عرض PNG (يُعاد استخدامه من قبل جميع مهام البرنامج المساعد). |
قواعد العرض
يُطبق الـrenderer اتفاقيات بصرية حتمية :
| نوع الحافة | التدوين PlantUML | معنى |
|---|---|---|
مستخرج |
|
علاقة مستخرجة من شفرة المصدر (اليقين) |
مستنتج |
|
العلاقة المستنتجة من قبل LLM (درجة الثقة) |
مبهم |
|
علاقة مبهمة (للتحقق) |
تُعَرَضُ المجتمعات كحزم PlantUML مع لوحة ألوان تلقائية.
الخطوة 3: الاستخدام اليومي
مخطط كامل
# Générer le diagramme du Knowledge Graph complet
./gradlew generateKnowledgeGraphDiagram
المخرج :`diagrams/knowledge-graph/knowledge-graph-full.puml`+
(Note: spaces preserved as in original).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`, |
|
|
الحد الأدنى للثقة للحواف |
|
(غير محدود) |
الحد الأقصى لعدد العقد للعرض |
|
(الجميع) |
أنواع العقد المفصولة بفواصل (مثال`class`, |
|
|
مجلد الإخراج للملفات`.puml` et |
الـ بايبلاين الكامل في سير عمل Gradle
@startuml
skinparam backgroundColor #FEFEFE
skinparam ActivityBackgroundColor #E8F4FD
skinparam ActivityDiamondBackgroundColor #FFF3CD
skinparam ActivityBorderColor #2C3E50
start
partition "EXTRACTION" {
:graphify . --no-viz;
note right: تحليل الكود المصدر\ntree-sitter (محلي، بدون LLM)
:graphify-out/graph.json;
note right: عُقد + حواف\n+ مجتمعات
}
partition "GÉNÉRATION" {
:./gradlew generateKnowledgeGraphDiagram;
note right: خط أنابيب محدد\nالتحليل → العرض → التحقق → PNG
if (Filtres actifs ?) then (Oui)
:تطبيق الفلاتر\n(community, edgeTypes,\nmaxNodes, nodeTypes);
else (Non)
:مخطط كامل;
endif
:الرسوم البيانية/knowledge-graph/\nknowledge-graph-full.puml\nknowledge-graph-full.png;
}
partition "INTÉGRATION" {
:git add diagrams/knowledge-graph/;
:إيداع جيت;
note right: الرسوم البيانية المصدّرة بنسخة\nدائمًا محدث مع الكود
}
stop
@enduml
@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 "استخراج\ngraphify . --no-viz" as extract state "الإنتاج\n./gradlew generateKnowledgeGraphDiagram" as generate state "Commit\nالرسوم البيانية المصدّرة" as commit [*] --> dev dev --> extract : الكود المعدل extract --> generate : graph.json محدث generate --> commit : .puml + .png تم إنشاؤها commit --> dev : مخططات في المستودع note right of extract شبه فوري على كود Kotlin (tree-sitter، لا LLM) end note note right of generate محدَّد لا LLM نتيجة قابلة للتكرار end note @enduml
@startuml skinparam backgroundColor #FEFEFE state "التطوير" as dev state "استخراج\ngraphify . --no-viz" as extract state "إنشاء\n./gradlew generateKnowledgeGraphDiagram" as generate state "Commit\nمخططات ذات إصدارات" 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 : البرنامج يوثق نفسه
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
package "خط أنابيب طبيعي\n(utilisateur → diagrammes)" 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 "خط أنابيب رسم بياني للمعرفة\n(déterministe, pas de 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 "خط أنابيب استخدام المنتج الداخلي\n(LLM → documentation du plugin)" 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،\nنفس PlantumlService\n— عدم التكرار" as N
@enduml
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
package "خط أنابيب عادي\n(المستخدم → المخططات)" 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 "مخطط معرفة الأنابيب\n(تحديدي، بدون 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 "Dogfooding لخط أنابيب\n(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,\nنفس PlantumlService\n— لا تكرار" 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
لماذا هو حتمي (لماذا ذلك مهم)
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
rectangle "خط أنابيب DÉTERMINISTE\n(generateKnowledgeGraphDiagram)" as det {
[graph.json] as json
[KnowledgeGraphParser] as parser
[KnowledgeGraphRenderer] as renderer
[PlantUML code] as puml
json --> تحليلr : تحليل
parser --> renderer : KnowledgeGraph
renderer --> puml : عرض (دالة نقية)
}
rectangle "خط أنابيب LLM\n(processPlantumlPrompts)" as llm {
[.prompt] as prompt
[LlmService] as llmSvc
[ChatModel] as model
[PlantUML code] as puml2
prompt --> llmSvc
llmSvc --> model : API اتصال
model --> puml2 : رد غير حتمي
}
note bottom of det
نفس المدخل → نفس المخرج
لا توجد تأخيرات الشبكة
لا توجد تكلفة بالرموز
قابلة للتكرار في CI
end note
note bottom of llm
نفس المدخل → مخرج متغير
زمن استجابة الشبكة (1-5ث)
التكلفة بالرموز
يتطلب مفتاح API
end note
@enduml
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
rectangle "خط أنابيب حتمي\n(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\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 |
صفر زمن الاستجابة |
التحليل + العرض يستغرق ~100 مللي ثانية، وليس 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 "KnowledgeGraphRenderer" as Renderer
participant "PlantumlService" as PS
collections "graphify-out/graph.json" as JSON
collections "diagrams/knowledge-graph/" 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
@startuml
skinparam backgroundColor #FEFEFE
participant "مطور" as Dev
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
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
التكامل في حوكمة المشروع
@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 — Stratégie\n(عند الطلب)" as lazy_strat {
[Méthodologies] as meth
[Archives sessions] as sessions
}
package "LAZY — Graphify\n(طلبات مستهدفة)" 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
ملخص الرسم البياني للمعرفة (Knowledge Graph)
God nodes + المجتمعات
يحل محل `ECOSYSTEM_OVERVIEW`
(225 سطر ← 50 سطر)
end note
@enduml
@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 — استراتيجية\n(عند الطلب)" as lazy_strat {
[Méthodologies] as meth
[Archives sessions] as sessions
}
package "LAZY — Graphify\n(استعلامات مستهدفة)" 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
زواج النظامين مكمل:
-
الاستراتيجية تدير متى وكيف— الحكم, سير العمل, الأرشفة
-
Graphify يدير ما وأين— هيكل الكود, العلاقات, الاستعلامات المستهدفة
(Empty output) الاستراتيجية الخاصة بالجلسة تديرعندما et le كيف(الحكم، سير العمل، العتبات)، Graphify dienter? Wait I wrote "Graphify يدير". Yes.
Make sure we have correct spelling: "يدير". Good.
Return exactly that.
</think>
(الحكم، سير العمل، العتبات)، Graphify يديرماذا et le أين(هيكل الكود، العلاقات، الاستعلامات المستهدفة). يدير خط أنابيب PlantUMLبِمَ(المخططات المحددة, ذات إصدارات, دائمًا محدثة). __
الإعداد: قائمة التحقق في 5 دقائق
@startuml
skinparam backgroundColor #FEFEFE
rectangle "قبل" as avant {
card "مخططات مرسومة يدويًا\nقديمة دائمًا\nلا أحد يقوم بتحديثها" as av1 #FDEDEC
}
rectangle "بعد" as apres {
card "مخططات يتم إنشاؤها تلقائيًا\nمحدثة دائمًا مع الكود\nمؤرشفة في Git\nحتمية وقابلة للتكرار" as ap1 #E8F8E8
}
avant --> apres : graphify . --no-viz\n+ ./gradlew generateKnowledgeGraphDiagram
@enduml
# 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 "رسوم بيانية مرسومة يدويًا\nدائمًا عفا عليها الزمن\nلا أحد يقوم بتحديثها" as av1 #FDEDEC
}
rectangle "بعد" as apres {
card "مخططات تم إنشاؤها تلقائيًا\nدائماً محدثة مع الكود\nمُدارَة بالإصدار في Git\nحتمية وقابلة للتكرار" as ap1 #E8F8E8
}
avant --> apres : graphify . --no-viz\n+ ./gradlew generateKnowledgeGraphDiagram
@enduml
المنافع الملموسة :