Skip to content

suggestコマンドがナレッジグラフを参照していない #157

@Kewton

Description

@Kewton

概要

suggest --for コマンドがナレッジグラフ(issue コマンドで利用可能な知識グラフ)を参照しておらず、Issue番号を含むクエリでも的外れな推薦を返す。

再現手順

commandindexdev suggest --for "Issue #299のiPadレイアウト修正の設計判断を理解したい"

期待される結果

Issue #299関連文書(設計ポリシー、レビュー、作業計画)を推薦する。
commandindexdev issue 299 で取得できる文書群が推薦に含まれるべき。

実際の結果

1. commandindexdev context -- '.claude/commands/worktree-setup.md' ...
2. commandindexdev search --related '.claude/commands/worktree-setup.md' ...

worktree-setup.md(無関係)を最上位に推薦。Issue #299の文書は一切含まれない。

原因の推定

  • suggestはBM25全文検索の上位結果に基づいて戦略を生成している(セマンティック検索も使用するがナレッジグラフは不使用)
  • クエリ中のIssue番号(#299)を認識してナレッジグラフを参照する仕組みがない
  • 汎用語(「設計判断」「理解したい」)がBM25で高スコアになり、的外れなファイルが上位に来る

スコープ

本Issueのスコープは「suggestコマンドへのナレッジグラフ参照の統合」(改善案1+2)に限定する。
ストップワード処理の改善(旧改善案3)は別Issueとして分離する。

改善案

  1. クエリにIssue番号パターン(#NNN, Issue #NNN, issue-NNN)が含まれる場合、既存の extract_issue_numbers() でIssue番号を抽出し、find_documents_by_issue() でナレッジグラフから関連文書を取得して推薦に優先的に含める
  2. ナレッジグラフ結果は戦略ステップとして独立に追加する方式を採用する(RRFへの組み込みは入力形式が異なるため不要な複雑さを招く)。具体的には、commandindexdev issue NNN ステップを戦略の先頭に挿入し、さらにナレッジグラフで取得した各文書に対する context ステップを追加する

受け入れ基準

  1. クエリに #NNN / Issue #NNN / issue-NNN パターンが含まれる場合、ナレッジグラフからの関連文書が戦略ステップに含まれること
  2. ナレッジグラフ結果は戦略の先頭に挿入され、BM25/セマンティック検索結果の前に表示されること
  3. symbols.db が存在しない場合はナレッジグラフ参照をスキップし、従来のBM25+セマンティック検索のみで戦略を生成すること(フォールバック動作)
  4. ナレッジグラフにマッチするIssueがない場合(関連文書が0件)も正常に動作し、BM25/セマンティック検索結果のみで戦略を生成すること
  5. 複数Issue番号がクエリに含まれる場合、全Issue番号について参照し結果を合算すること(上限: 最大3 Issueまで)

実装上の注意点

エラー型の拡張

  • SuggestErrorSymbolStore(SymbolStoreError) バリアントを追加し、From<SymbolStoreError> を実装する
  • issue.rs (L40-44) のパターンを参考にする

Modifies リレーション対応

  • find_documents_by_issue は現在 modifies リレーションをパースできない(InvalidEmbeddingエラー)
  • find_knowledge_by_issue を使用するか、find_documents_by_issue にmodifiesパースを追加する

ロジックの分離

  • ナレッジグラフ参照ロジックは独立した関数に切り出す(例: maybe_add_knowledge_steps
  • run_suggest の複雑度増加を抑制する

SuggestResult の拡張(検討事項)

  • has_knowledge_graph: boolmatched_issues: Vec<String> フィールドの追加を検討
  • JSON出力でナレッジグラフ参照があったことを示すメタ情報として有用

テストケース

  1. extract_issue_numbers がクエリからIssue番号を正しく抽出する単体テスト
  2. Issue番号検出時にナレッジグラフのステップが戦略に含まれることのテスト
  3. symbols.db が存在しない場合のフォールバック動作テスト
  4. ナレッジグラフにマッチするIssueがない場合のテスト
  5. 複数Issue番号を含むクエリのテスト

影響範囲

  • 変更対象: src/cli/suggest.rs のみ(主要変更)
  • 他サブコマンド: 影響なし(suggest.rsは独立モジュール)
  • 出力形式: 戦略ステップの追加のみのため既存フォーマッタはそのまま動作
  • パフォーマンス: SymbolStore::open のSQLite接続オーバーヘッドは軽微(数ms以下)
  • 設定: 新たな設定項目や環境変数の追加は不要

技術的ノート

  • src/indexer/knowledge.rsISSUE_RE 正規表現と extract_issue_numbers() 関数が既に存在(自然言語クエリにも対応済み)
  • src/indexer/symbol_store.rsfind_documents_by_issue() / find_knowledge_by_issue() メソッドが既に存在
  • SearchContextsymbol_db_path() メソッドが既に存在
  • symbols.db のオプショナルな扱いは EmbeddingStore と同様のパターンで実装可能
  • symbols.db は既に index コマンドで生成されており、SearchContext.symbol_db_path() で取得可能

テスト環境

  • commandindex 0.1.0 (スキーマv4)
  • CommandMateリポジトリ(2910ファイル、124690セクション)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions