دمج Graphify في سير عمل Gradle : من رسم المعرفة إلى مخطط PlantUML في أمر واحد
Publié le 19 April 2026
- المشكلة: المخططات دائماً متأخرة عن الكود
- الحل : خط أنابيب حتمي Knowledge Graph → PlantUML
- الخطوة 1: تثبيت Graphify واستخراج Knowledge Graph
- الخطوة 2 : يحول المكون الإضافي Gradle رسم المعرفة إلى PlantUML
- الخطوة 3: الاستخدام اليومي
- الحل الكامل في سير عمل Gradle
- الـ dogfooding : الإضافة توثق نفسها
- لماذا هو حتمي (ولماذا هذا مهم)
- مخططات خط الأنابيب نفسه
- التكامل في حوكمة المشروع
- الإعداد: قائمة مراجعة في 5 دقائق
- الفخاخ والتخفيف
- ما يحصل عليه في النهاية
- روابط
قاعدة الكود الخاصة بك تنمو. الاعتمادات بين الوحدات تتكاثر. تصبح وثائق الهندسة قديمة قبل حتى كتابتها. وماذا لو كان بإمكان بناء Gradle الخاص بك إنشاء مخططات محدثة تلقائيًا من هيكل الكود الفعلي؟ هذا بالضبط ما يفعله خط أنابيب Graphify + PlantUML Gradle Plugin :`graphify . --no-viz`يستخرج Knowledge Graph,`./gradlew generateKnowledgeGraphDiagram`يحوّله إلى رسوم بيانية PlantUML. صفر LLM, صفر دليل, 100% حتمي.
- دق
-
[]
المشكلة: المخططات دائماً متأخرة عن الكود
كل مشروع يتجاوز بضعة آلاف من الأسطر يعرف هذا المتلازمة :
-
نرسم مخططًا معماريًا في بداية المشروع
-
يتطور الكود، وتتغير التبعيات
-
المخطط يصبح كذبة زخرفية
-
لا أحد يحدّثه لأنه مزعج
-
الوافدون الجدد يعتمدون عليه و يرتكبون أخطاء
السؤال ليس هل يجب أن تكون هناك مخططات؟ — الجميع يعرف أن الجواب نعم. السؤال هو :من يُحدثهم؟
الجواب: لا أحد. إلا إذا كان تلقائيًا.
الحل : خط أنابيب حتمي Knowledge Graph → PlantUML
المبدأ بسيط: بدلاً من رسم المخططات يدويًا، نقوم بهايولّد من البنية الفعلية للرمز.
Failed to generate image: PlantUML preprocessing failed: [From <input> (line 6) ] @startuml skinparam backgroundColor #FEFEFE skinparam componentStyle rectangle actor Développeur component "Graphify ^^^^^ Syntax Error? (Assumed diagram type: sequence) @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، دائمًا محدث مع الكود.
الخطوة 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 رسم المعرفة إلى PlantUML
بنية الخط المتسلسل
الإضافة`com.cheroliv.plantuml`يضم مهمة`generateKnowledgeGraphDiagram`الذي يحول`graph.json`في مخططات PlantUML بطريقةتمامًا حتمي:
المكونات الداخلية
| مكوّن | دور |
|---|---|
|
(No text provided to translate.) |
|
يُحوِّل بشكل حتمي واحد`KnowledgeGraph`في كود PlantUML. مجموعات حسب النوع، المجتمعات في الحزم، أسطورة تلقائية. |
|
مهمة Gradle التي تنظّم: التحليل → العرض → التحقق → PNG. قابلة للتكوين عبر خصائص Gradle. |
|
نماذج البيانات :`KnowledgeGraph`, |
|
التحقق من الصياغة + عرض PNG (يُعاد استخدامه من قبل جميع مهام البرنامج المساعد). |
قواعد العرض
يُطبِّق المُحرِّك قواعد بصرية محدَّدة :
| نوع الحافة | التدوين 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`, |
|
|
الحد الأدنى للثقة للحواف |
|
(غير محدود) |
العدد الأقصى للعقد للعرض |
|
(الجميع) |
أنواع العقد مفصولة بفواصل (ex. |
|
|
مجلد الإخراج للملفات`.puml` et |
الحل الكامل في سير عمل Gradle
نوع سير العمل
التكامل في دورة التطوير
يتكامل خط الأنابيب بشكل طبيعي في المراحل الرئيسية للتطوير :
Failed to generate image: PlantUML preprocessing failed: [From <input> (line 6) ] @startuml skinparam backgroundColor #FEFEFE state "التطوير" as dev state "Extraction\ngraphify . --no-viz" as extract state "الإنتاج ^^^^^ Syntax Error? (Assumed diagram type: state) @startuml skinparam backgroundColor #FEFEFE state "التطوير" as dev state "Extraction\ngraphify . --no-viz" as extract state "الإنتاج ./gradlew generateKnowledgeGraphDiagram" as generate state "Commit الرسوم البيانية المصدرة" 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 : الإضافة تستهلك خدمتها الخاصة.
Failed to generate image: PlantUML preprocessing failed: [From <input> (line 16) ]
@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 "Pipeline Knowledge Graph
^^^^^
Syntax Error? (Assumed diagram type: component)
@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 "Pipeline Knowledge Graph
(mحدد، بدون 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 "بايبلاين دوجفودينغ
(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 هي دالة نقية.
Failed to generate image: PlantUML preprocessing failed: [From <input> (line 16) ]
@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
^^^^^
Syntax Error? (Assumed diagram type: component)
@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
(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. |
صفر زمن الوصول |
التحليل + العرض يستغرق ~100ms، وليس 1-5 ثوانٍ. |
CI متوافق |
لا يلزم وجود مفتاح API. لا يوجد اختبار غير مستقر بسبب استجابة LLM متغيرة. |
قابل للإصدار |
Le |
مخططات خط الأنابيب نفسه
لإتمام الحلقة، إليك مخطط الأنابيب كما لو تم إنشاؤه بواسطة الإضافة :
التكامل في حوكمة المشروع
في مشروعنا، يتكامل هذا المسار في استراتيجية إدارة السياق EAGER/LAZY للوكيل الذكي الاصطناعي. يحل مخطط المعرفة محل وثائق الهندسة المعمارية اليدوية برسم بياني منظم، قابل للاستعلام، ويتم تحديثه تلقائيًا.
Failed to generate image: PlantUML preprocessing failed: [From <input> (line 11) ]
@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 — استراتيجية
^^^^^
Syntax Error? (Assumed diagram type: component)
@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 "Pipeline PlantUML\n(auto-généré)" 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 تدير ما هو وأين— هيكل الكود، العلاقات، الاستعلامات المستهدفة
_ استراتيجية الجلسة تديرعندما et le كيف(الحوكمة, سير العمل, العتبات), Graphify تدير الما et le أين(هيكل الكود، العلاقات، الاستعلامات المستهدفة). يتعامل خط أنابيب PlantUML معبماذا(مخططات حتمية، مصدّرة، دائمًا محدثة). _
الإعداد: قائمة مراجعة في 5 دقائق
| # | خطوة | أمر |
|---|---|---|
1 |
تثبيت Graphify |
|
2 |
ضبط الاستثناءات |
إنشاء`.graphifyignore` |
3 |
استخراج مخطط المعرفة |
|
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`بشكل منتظم أو هوك git`graphify hook install` |
التكلفة المحدثة |
التحديثات التزايدية مجانية تقريبًا (tree-sitter local) |
فقط المستندات ( |
ما يحصل عليه في النهاية
Failed to generate image: PlantUML preprocessing failed: [From <input> (line 6) ]
@startuml
skinparam backgroundColor #FEFEFE
rectangle "قبل" as avant {
card "الرسوم البيانية المرسومة يدويًا
دائمًا قديمة
^^^^^
Syntax Error? (Assumed diagram type: activity)
@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 مخططات = نظرة كاملة على الهندسة المعمارية |
_ من لديه _pourquoi يستطيع أن يتحمل كل comment. __
السبب : رسومات محدثة دائمًا. الطريقة : أمرين في خط أنابيب Gradle.
روابط
-
نصائح السوبر لأمر fg— المقال السابق حول سير عملterminal