.claude/skills/query-graph/SKILL.md
GraphDB探索エージェント - RyuGraphデータベースを自然言語またはCypherで探索し、関連するコードや仕様書を返却。/query-graph [クエリ] で呼び出し。
npx skillsauth add wfukatsu/architecture-redesign-agent query-graphInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
RyuGraphに構築されたナレッジグラフを探索し、ユビキタス言語に基づいて関連するコードや仕様を返却するエージェントです。
このエージェントは以下を実行します:
/build-graph が実行済みで knowledge.ryugraph が存在すること日本語で質問すると、Cypherクエリに変換して実行します。
例:
/query-graph 「注文」に関連するクラスを教えて
/query-graph 認証フローに関わるメソッドは?
/query-graph CustomerServiceが依存しているエンティティを探して
直接Cypherクエリを入力して実行します。
例:
/query-graph MATCH (e:Entity)-[:HAS_TERM]->(t:UbiquitousTerm {name_ja: '注文'}) RETURN e
/query-graph MATCH (m:Method)-[:CALLS*1..3]->(target:Method) WHERE m.name = 'processOrder' RETURN target
あなたはGraphDBを探索する専門家エージェントです。以下の手順でクエリを処理してください。
ユーザーのクエリを分析し、以下を判定:
クエリタイプ
探索パターン
自然言語クエリの場合、以下のパターンでCypherに変換:
「Xに関連するクラス」
↓
MATCH (e:Entity)-[:HAS_TERM]->(t:UbiquitousTerm)
WHERE t.name_ja = 'X' OR t.name = 'X'
RETURN e.name, e.file_path, e.type
「Xクラスの詳細」
↓
MATCH (e:Entity {name: 'X'})
OPTIONAL MATCH (e)-[:DEFINED_IN]->(f:File)
OPTIONAL MATCH (e)-[:BELONGS_TO]->(d:Domain)
RETURN e, f, d
「Xが依存しているもの」
↓
MATCH (source:Entity {name: 'X'})-[:REFERENCES]->(target)
RETURN target.name, labels(target)[0] AS type
「Xを呼び出しているメソッド」
↓
MATCH (caller:Method)-[:CALLS]->(target:Method {name: 'X'})
RETURN caller.name, caller.file_path
「XとYの関係」
↓
MATCH path = shortestPath((a)-[*..5]-(b))
WHERE a.name = 'X' AND b.name = 'Y'
RETURN path
「注文処理のフロー」
↓
MATCH (p:BusinessProcess)-[:HAS_ACTIVITY]->(a:Activity)
WHERE p.name_ja CONTAINS '注文'
OPTIONAL MATCH (a)-[n:NEXT_ACTIVITY]->(next:Activity)
RETURN p.name_ja AS process, a.name_ja AS activity, a.sequence_order, next.name_ja AS next_activity, n.condition
ORDER BY a.sequence_order
「Sagaの補償フローを見せて」
↓
MATCH (sp:SystemProcess {type: 'saga'})-[:COMPENSATES]->(comp:SystemProcess)
RETURN sp.name AS saga_step, comp.name AS compensating_step
「誰が承認を行うか」
↓
MATCH (actor:Actor)-[:PERFORMS]->(a:Activity)
WHERE a.name_ja CONTAINS '承認'
RETURN actor.name AS performer, a.name_ja AS activity
「注文処理に関わるエンティティ」
↓
MATCH (e:Entity)-[:PARTICIPATES_IN]->(p:BusinessProcess)
WHERE p.name_ja CONTAINS '注文'
RETURN e.name, e.type, e.file_path
Pythonスクリプトでクエリを実行:
python scripts/query_graph.py \
--db-path ./knowledge.ryugraph \
--query "MATCH ..."
または Python コードを直接実行:
import ryugraph
db = ryugraph.Database("./knowledge.ryugraph")
conn = ryugraph.Connection(db)
result = conn.execute("""
MATCH (e:Entity)-[:HAS_TERM]->(t:UbiquitousTerm)
WHERE t.name_ja = '注文'
RETURN e.name AS entity, e.file_path AS file, e.line_number AS line
""")
for row in result:
print(row)
グラフクエリの結果に基づいて、追加情報を取得:
# クエリ結果のファイルパスと行番号を使用
mcp__serena__find_symbol で該当シンボルの詳細を取得
# または
Read ツールで該当ファイルを表示
分析結果から該当する仕様を検索:
reports/01_analysis/domain-code-mapping.md
reports/01_analysis/ubiquitous-language.md
以下の形式で結果を返却:
## 検索結果
### 実行クエリ
```cypher
MATCH (e:Entity)-[:HAS_TERM]->(t:UbiquitousTerm {name_ja: '注文'})
RETURN e.name, e.file_path
| エンティティ | ファイル | 行番号 | |------------|---------|-------| | Order | src/domain/order.ts | 10 | | OrderService | src/service/orderService.ts | 5 |
export class Order {
private id: string;
private items: OrderItem[];
// ...
}
| 用語 | 定義 | |-----|------| | 注文 | 顧客が商品を購入する単位 | | 注文アイテム | 注文に含まれる個別の商品 |
## よく使うクエリテンプレート
### 1. ドメイン内のすべてのエンティティ
```cypher
MATCH (e:Entity)-[:BELONGS_TO]->(d:Domain {name: 'OrderManagement'})
RETURN e.name, e.type
ORDER BY e.name
MATCH (m:Method)-[:DEFINED_IN]->(f:File)
WHERE f.path CONTAINS 'OrderService'
RETURN m.name, m.signature
MATCH (a:Entity)-[:REFERENCES]->(b:Entity)-[:REFERENCES]->(a)
RETURN a.name, b.name
MATCH (e:Entity)<-[:REFERENCES]-(other)
RETURN e.name, count(other) AS references
ORDER BY references DESC
LIMIT 10
MATCH (a:Actor {name: '管理者'})-[:HAS_ROLE]->(r:Role)
RETURN a.name, r.name, r.permissions
MATCH (t1:UbiquitousTerm)<-[:HAS_TERM]-(e:Entity)-[:HAS_TERM]->(t2:UbiquitousTerm)
WHERE t1 <> t2
RETURN t1.name_ja, t2.name_ja, collect(e.name) AS shared_entities
MATCH (f1:File)<-[:DEFINED_IN]-(e1:Entity)-[:REFERENCES]->(e2:Entity)-[:DEFINED_IN]->(f2:File)
WHERE f1 <> f2
RETURN f1.path, f2.path, count(*) AS dependencies
ORDER BY dependencies DESC
MATCH (p:BusinessProcess {name: 'OrderProcessing'})-[:HAS_ACTIVITY]->(a:Activity)
OPTIONAL MATCH (a)-[n:NEXT_ACTIVITY]->(next:Activity)
OPTIONAL MATCH (actor:Actor)-[:PERFORMS]->(a)
RETURN a.name_ja AS activity,
a.sequence_order AS order,
next.name_ja AS next_activity,
n.condition AS condition,
actor.name AS performer
ORDER BY a.sequence_order
MATCH (sp:SystemProcess {type: 'saga'})-[:HAS_ACTIVITY]->(a:Activity)
OPTIONAL MATCH (a)-[:INVOKES]->(m:Method)
OPTIONAL MATCH (sp)-[:COMPENSATES]->(comp:SystemProcess)
RETURN sp.name AS saga,
a.name AS step,
m.name AS method,
comp.name AS compensating_action
MATCH (actor:Actor)-[:PERFORMS]->(a:Activity)<-[:HAS_ACTIVITY]-(p:BusinessProcess)
RETURN actor.name AS actor,
p.name_ja AS process,
collect(a.name_ja) AS activities
MATCH (e:Entity)-[:PARTICIPATES_IN]->(p:BusinessProcess)
OPTIONAL MATCH (e)-[:HAS_TERM]->(t:UbiquitousTerm)
RETURN p.name_ja AS process,
e.name AS entity,
t.name_ja AS term
ORDER BY p.name_ja
MATCH (a:Activity)-[t:TRIGGERS]->(sp:SystemProcess)
OPTIONAL MATCH (sp)-[:INVOKES]->(m:Method)
RETURN a.name_ja AS triggering_activity,
t.event_name AS event,
sp.name AS system_process,
sp.type AS process_type,
collect(m.name) AS methods
MATCH (sp:SystemProcess)
WHERE sp.is_async = true
OPTIONAL MATCH (sp)-[:INVOKES]->(m:Method)
RETURN sp.name AS process,
sp.type AS type,
sp.timeout_ms AS timeout,
collect(m.name) AS methods
ユーザーとの対話を通じて、段階的に探索を深めることができます:
User: 注文に関連するものを教えて
Agent: [用語「注文」に関連するエンティティを表示]
User: その中でOrderServiceの詳細を見せて
Agent: [OrderServiceのソースコードと依存関係を表示]
User: このサービスを呼び出しているのは?
Agent: [OrderServiceを呼び出しているメソッドを表示]
User: 注文処理のフローを教えて
Agent: [BusinessProcess "OrderProcessing" のアクティビティ一覧を表示]
1. ValidateOrder (注文検証)
2. CheckInventory (在庫確認)
3. IsHighValue (高額判定) ← 分岐点
4. ProcessPayment (決済処理)
5. SendConfirmation (確認送信)
User: 高額判定で分岐した後はどうなる?
Agent: [IsHighValue の NEXT_ACTIVITY を表示]
- amount < 100000 → ProcessPayment
- amount >= 100000 → ApprovalRequired (承認必要)
User: 承認は誰が行うの?
Agent: [PERFORMS リレーションを検索]
承認者: SalesManager (営業マネージャー)
User: 決済処理でエラーが起きたらどうなる?
Agent: [OrderSaga の COMPENSATES を表示]
補償アクション:
- ProcessPayment → RefundPayment (返金処理)
- ReserveInventory → ReleaseInventory (在庫解放)
/build-graph の実行を提案| スキル | 用途 |
|-------|-----|
| /build-graph | グラフ構築(前提) |
| /visualize-graph | グラフ可視化(補完) |
| /analyze-system | システム分析(入力元) |
tools
インタラクティブワークフロー選択 - 実行したい処理を段階的に選択して実行。/workflow で呼び出し。
development
GraphDB可視化エージェント - RyuGraphデータベースの内容をMermaid/DOT/HTML形式で可視化。/visualize-graph [出力パス] で呼び出し。
tools
システム調査エージェント - コードベースの構造・技術スタック・問題点・DDD適合性を調査。/system-investigation [対象パス] で呼び出し。
databases
ScalarDBエディション選定エージェント - 対話形式で最適なScalarDBエディション(OSS/Enterprise Standard/Premium)を選定。/select-scalardb-edition で呼び出し。