GraphifyをGradleワークフローに統合:ナレッジグラフからPlantUML図までを1コマンドで
公開日: 19 April 2026
- 問題:図は常にコードに遅れている
- 解決策:決定論的パイプライン Knowledge Graph → PlantUML
- ステップ1 : Graphifyをインストールし、Knowledge Graphを抽出する
- ステップ 2 : Gradle プラグインは Knowledge Graph を PlantUML に変換します
- ステップ 3: 日常での使用
- Gradle ワークフローにおける完全なパイプライン
- ドッグフーディング:プラグインは自分自身をドキュメント化する
- なぜそれが決定的なのか (そしてそれが重要である理由)
- パイプライン自体の図
- プロジェクトガバナンスへの統合
- 準備 : 5分のチェックリスト
- 罠と軽減策
- 最終的に得られるもの
- リンク
コードベースは大きくなっています。モジュール間の依存関係が増え続けています。アーキテクチャのドキュメントは、書かれる前に古くなります。あなたのGradleビルドが、実際のコード構造から最新の図を 自動的に 生成できたらどうでしょう?これは、Graphify + PlantUML Gradle Plugin パイプラインがまさに行うことです:graphify . --no-viz`Knowledge Graphを抽出する,./gradlew generateKnowledgeGraphDiagram`これはPlantUMLのダイアグラムに変換します。LLMゼロ、マニュアルゼロ、100%決定論的。
- 強迫性障害
-
(empty)
問題:図は常にコードに遅れている
数千行を超えるプロジェクトはこの症候群を経験する:
-
プロジェクトの初期にアーキテクチャ図を描きます
-
コードは進化し、依存関係は変わる
-
�図は装飾的な嘘になる
-
誰もそれを更新しないのは、面倒だから
-
新参者はそれに基づいて行動し、間違いを犯す
@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
問題は 図が必要か? — みんなが知っている通り、はいです。問題は:誰がそれらを最新に保っていますか?
答え:だれもいない。ただし、自動の場合は除きます。
解決策:決定論的パイプライン 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 "PlantUML Gradleプラグイン\n(generateKnowledgeGraphDiagram)" as Plugin component "KnowledgeGraphParser" as Parser component "ナレッジグラフレンダラー" as Renderer component "PlantumlService (検証 + PNGレンダリング)" as PS collections "diagrams/knowledge-graph/\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
2つのコマンド。それだけです。
# É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 は、コードベースを分析し、構造化されたナレッジグラフを構築する Python ツールです:
# 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`含む :
-
ノードクラス、関数、ファイル — それらのタイプとコミュニティ
-
エッジ: ノード間の関係 (コードから抽出, 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 "知識グラフ図生成タスク" 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 ネイティブ ( |
|
決定的に変換する`KnowledgeGraph`PlantUMLコード。タイプ別にグループ化、パッケージ内のコミュニティ、自動凡例。 |
|
パース → レンダリング → バリデーション → PNG をオーケストレーションするGradleタスク。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`, |
|
|
エッジの最小信頼度しきい値 |
|
(無制限) |
表示する最大のノード数 |
|
(皆) |
カンマで区切られたノードの種類(例`class`, |
|
|
ファイルの出力ディレクトリ`.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 "�抽出 グラフ化 . --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
|
|
ドッグフーディング:プラグインは自分自身をドキュメント化する
PlantUML プラグインは、プロンプトを図に変換します。さらに、自身の propre codebase の Knowledge Graph をドキュメント用の図にも変換できます。これは dogfooding です:プラグインは自身のサービスを利用します。
@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 "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を利用して(ドッグフーディングとして)処理します |
# 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 "決定論的パイプライン
(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 の請求書がない |
ゼロレイテンシ |
Parse + renderは約100msかかり、1~5秒ではありません。 |
互換性のあるCI |
APIキーは必要ありません。変動するLLM応答によるフレークなテストはありません。 |
バージョン可能な |
Le |
パイプライン自体の図
ループを閉じるために、プラグインによって生成されるパイプライン図をここに示します:
@startuml
skinparam backgroundColor #FEFEFE
participant "開発者" as Dev
participant "グレードル" as G
participant "知識グラフダイアグラム生成タスク" as Task
participant "知識グラフパーサー" as Parser
participant "知識グラフレンダラー" as Renderer
participant "プラントUMLサービス" 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
プロジェクトガバナンスへの統合
私たちのプロジェクトでは、このパイプラインはAIエージェントのEAGER/LAZYコンテキスト管理戦略に組み込まれています。Knowledge Graph は、手動のアーキテクチャドキュメントを構造化され、クエリ可能で、自動的に更新されるグラフに置き換えます。
@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 — 戦略\n(オンデマンド)" 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
2つのシステムの結合は補完的です:
-
戦略は、いつとどのようにを管理します— ガバナンス, ワークフロー, アーカイブ
-
Graphifyは、WHATとWHEREを管理します— コードの構造、関係、対象クエリ
_ セッション戦略は管理するいつ et le どうやって(ガバナンス、ワークフロー、しきい値)、 Graphifyは管理する何 et le どこ(コード構造, 関係, ターゲットクエリ). PlantUML パイプラインは何で(決定論的な図、バージョン管理された、常に最新の) _
準備 : 5分のチェックリスト
| (No output, as there is no French text provided to translate) | ステップ | 注文 |
|---|---|---|
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`定期的に または git フック`graphify hook install` |
更新されたコスト |
増分アップデートはほぼ無料です (tree-sitter local) |
ドキュメントのみ (`.adoc`LLMのトークンを消費する |
最終的に得られるもの
@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
具体的な利益:
| 利益 | 詳細 |
|---|---|
常に最新のドキュメンテーション |
図は現在のコードを反映しており、手動スナップショットではありません。 |
メンテナンスの手間ゼロ |
�図面は各ビルドごとに再生成されます |
技術的負債の削減 |
�図を手動で維持する必要はありません。 |
新しい人へのビジュアルコンテキスト |
新しい開発者は図を見てアーキテクチャを理解する。 |
潜在的なファインチューニング |
ペア(サブグラフ → ダイアグラム)は AI のトレーニング例です。 |
自動検証 |
`PlantumlService.validateSyntax()`生成された各図を確認します |
素早いオンボーディング |
5つのダイアグラム = アーキテクチャの完全なビュー |
_ なぜ(_pourquoi)を持つ人は、すべての(comment)に耐えることができる。 __
pourquoi : 常に最新の図。 comment : Gradle パイプライン内の2つのコマンド。
リンク
-
fgコマンドのスーパーヒント— ターミナルワークフローに関する前の記事
関連記事
31 May 2026
14 May 2026