وقت القراءة : 12 minutes

قاعدة الكود الخاصة بك تنمو. الاعتمادات بين الوحدات تزداد. توثيق الهندسة يصبح قديمًا قبل حتى أن يُكتب. وإذا كان بإمكان بناء Gradle الخاص بك تلقائيًا إنشاء مخططات محدثة من بنية الكود الفعلية؟ هذا بالضبط ما يفعله خط أنابيب Graphify + Gradle Plugin PlantUML :`graphify . --no-viz`يستخرج Knowledge Graph،`./gradlew generateKnowledgeGraphDiagram`يقوم بتحويله إلى مخططات PlantUML. صفر LLM، صفر دليل، 100% حتمي.

المشكلة: المخططات دائمًا متأخرة عن الكود

كل مشروع يتجاوز بضعة آلاف من الأسطر يعرف هذا المتلازمة :

  1. نرسم مخططًا معماريًا في بداية المشروع

  2. يتطور الكود، وتتغير الاعتمادات

  3. المخطط يصبح كذبة زخرفية

  4. لا أحد يحدّثه لأنه متعب

  5. المستجدون يعتمدون عليه ويخطئون

@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)

  • المجتمعات: تجميعات تلقائية للعقد المرتبطة

مثال للهيكل`graph.json`
{
  "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}
  ]
}

شفرة المصدر (.kt, .java) يتم تحليله محليًا بواسطة tree-sitter,بدون استئناف LLM. فقط ملفات الوثائق (.adoc, .md) تتطلب استدعاء LLM لاستخراج الدلالي. إذن`--update`تنفيذ كود كوتلن فوري تقريبًا.

الخطوة 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

المكونات الداخلية

مكون دور

KnowledgeGraphParser

تحليل`graph.json`— يدعم 3 تنسيقات : graphify أصلي (nodes+links), legacy (communities), flat. يحلّ المعرفات الرقمية إلى تسميات.

KnowledgeGraphRenderer

حوّل حتميًا`KnowledgeGraph`في كود PlantUML. مجموعات حسب النوع، المجتمعات في الحزم، legend التلقائية.

GenerateKnowledgeGraphDiagramTask

مهمة Gradle التي تنظم: parse → render → validate → PNG. قابل للتكوين عبر خصائص Gradle.

kgmodels.kt

نماذج البيانات :`KnowledgeGraph`, KnowledgeGraphNode, KnowledgeGraphEdge, KnowledgeGraphCommunity, EdgeType.

PlantumlService

التحقق من الصياغة + عرض PNG (يُعاد استخدامه من قبل جميع مهام البرنامج المساعد).

قواعد العرض

يُطبق الـrenderer اتفاقيات بصرية حتمية :

نوع الحافة التدوين PlantUML معنى

مستخرج

-→(خط متصل, أسود)

علاقة مستخرجة من شفرة المصدر (اليقين)

مستنتج

..>(خط منقط)

العلاقة المستنتجة من قبل LLM (درجة الثقة)

مبهم

--x(خط أحمر منقط)

علاقة مبهمة (للتحقق)

تُعَرَضُ المجتمعات كحزم 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

المرجع الكامل للخصائص

ملكية عطل الوصف

plantuml.kg.community

(جميع)

تصفية المجتمعات بالاسم (مطابقة جزء من السلسلة)

plantuml.kg.edgeTypes

(الكل)

أنواع الحواف مفصولة بفواصل :`EXTRACTED`, INFERRED, AMBIGUOUS

plantuml.kg.minConfidence

0.0

الحد الأدنى للثقة للحواف

plantuml.kg.maxNodes

(غير محدود)

الحد الأقصى لعدد العقد للعرض

plantuml.kg.nodeTypes

(الجميع)

أنواع العقد المفصولة بفواصل (مثال`class`, code)

plantuml.kg.outputDir

diagrams/knowledge-graph

مجلد الإخراج للملفات`.puml` et .png

الـ بايبلاين الكامل في سير عمل 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

--update`يُستخرج مجددًا فقط الملفات المعدّلة (التي تم اكتشافها باستخدام SHA256 في`graphify-out/cache/). على كود Kotlin، يكون الأمر فوريًا تقريبًا لأن tree-sitter يعمل محليًا دون استدعاء LLM.

الـ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 ? الوصف

generateKnowledgeGraphDiagram

لا

حول`graph.json`في PlantUML (حتمي)

generateDiagramDocs

نعم

ينتج بعضًا`.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 .puml`تم إنشاؤه نص. يمكنناه`diff, المراجع في PR، إصداره في Git.

مخططات خط الأنابيب نفسه

@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 المحلي)

فقط المستندات (.adoc) يستهلكون رموز LLM

ما نحصل عليه في النهاية

@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

المنافع الملموسة :

مقالات ذات صلة