Skip to content

issue listサブコマンドの追加 #169

@Kewton

Description

@Kewton

概要

現在issueコマンドはIssue番号を引数に取るが、インデックス内にどのIssueが含まれるかを知る手段がない。Issue番号を知らないユーザーやAIエージェントはissueコマンドの入口がない。

現状

commandindexdev issue 299     # Issue番号を知っていれば使える
commandindexdev issue ???     # 何番があるか知る方法がない

期待される結果

commandindexdev issue list
# Issue #47   (5 docs)  terminal-search
# Issue #99   (5 docs)  markdown-editor-display-improvement
# Issue #104  (7 docs)  ipad-fullscreen-bugfix
# Issue #112  (6 docs)  sidebar-transform
# ...
# Total: 142 issues

commandindexdev issue list --format json
# [{"number": 47, "doc_count": 5, "label": "terminal-search", "has_design": true, "has_workplan": true, "has_review": true, "has_progress": false}, ...]

CLI設計方針

既存の issue コマンド(issue <number>)をサブコマンド構造に変更する:

  • issue list — インデックス内の全Issue一覧を表示
  • issue show <number> — 既存の Issue 詳細表示(現在の issue <number> を移行)
  • Config コマンドと同様の IssueCommands enum パターンを使用
  • Breaking Change: issue <number>issue show <number> に変更(旧構文は完全廃止、clapのサブコマンドエラーが返る)

データ取得方法

  • knowledge_nodes テーブルで type='issue' のノードを取得
  • knowledge_edges テーブルと JOIN し、各Issue に紐づくドキュメントを集計
  • doc_count のカウント対象: has_design, has_review, has_workplan, has_progress リレーションのみ(modifies は対象外)
  • SymbolStorelist_all_issues() メソッドを追加
  • ソート順: Issue番号の昇順(自然数順)

SQLクエリ設計

SELECT
  kn_issue.identifier AS issue_number,
  COUNT(CASE WHEN ke.relation IN ('has_design','has_review','has_workplan','has_progress')
             AND kn_doc.type = 'document' THEN 1 END) AS doc_count,
  COUNT(CASE WHEN ke.relation = 'has_design' THEN 1 END) > 0 AS has_design,
  COUNT(CASE WHEN ke.relation = 'has_review' THEN 1 END) > 0 AS has_review,
  COUNT(CASE WHEN ke.relation = 'has_workplan' THEN 1 END) > 0 AS has_workplan,
  COUNT(CASE WHEN ke.relation = 'has_progress' THEN 1 END) > 0 AS has_progress
FROM knowledge_nodes kn_issue
LEFT JOIN knowledge_edges ke ON ke.source_id = kn_issue.id
LEFT JOIN knowledge_nodes kn_doc ON ke.target_id = kn_doc.id AND kn_doc.type = 'document'
WHERE kn_issue.type = 'issue'
GROUP BY kn_issue.identifier
ORDER BY CAST(kn_issue.identifier AS INTEGER)

パフォーマンス: knowledge_nodes の idx_kn_type インデックスが活用される。現在の規模では問題ないが、Issue/edge数が大幅に増えた場合は EXPLAIN QUERY PLAN で確認し、必要に応じて --limit オプション追加を検討する。

label取得ロジック

  1. 設計書ファイル名から正規表現で抽出(issue-{number}-{label}-design-policy.md{label} 部分)
  2. 設計書がない場合は空文字列
  3. 正規表現は静的に再利用(毎回組み立てない)

出力フォーマット

format 出力内容
human Issue #N (M docs) label 形式 + Total行
json [{"number": N, "doc_count": M, "label": "...", "has_design": bool, "has_review": bool, "has_workplan": bool, "has_progress": bool}, ...]
path Issue番号を1行1つで出力
llm Markdownテーブル形式

0件時の挙動

  • 終了コード: 0(成功)
  • human: No issues found.\nTotal: 0 issues
  • json: []
  • path: 空出力
  • llm: No issues found.

symbols.db 未作成時の挙動

  • issue list: 既存の issue show と同様にエラー終了(DBファイルが見つからないエラー)
  • 0件とDB未作成は明確に区別する

影響範囲

変更が必要なファイル

ファイル 変更内容
src/cli/issue.rs サブコマンド構造化、list 関数追加
src/main.rs IssueCommands enum 定義、ディスパッチャー変更
src/indexer/symbol_store.rs list_all_issues() メソッド追加 + 単体テスト
src/cli/help_llm.rs LLMガイダンスの issue コマンド説明・全参照箇所を更新
src/cli/suggest.rs 生成コマンドを issue show <number> に更新
tests/e2e_issue.rs 全テスト issue show 形式に更新 + issue list テスト追加
tests/cli_args.rs 全テスト更新 + issue list パーステスト追加

機能本体は影響なし(ヘルプ/ガイダンス文脈の整合確認は必要)

  • src/cli/before_change.rs, src/cli/why.rs — SymbolStore API を直接利用

受け入れ基準

  • issue list で全Issueが番号昇順で表示される
  • --format json で有効なJSON配列が出力される(has_design, has_review, has_workplan, has_progress を含む)
  • --format human で Total行が表示される
  • Issue が0件の場合に No issues found. + Total: 0 issues が表示され、終了コード0
  • symbols.db 未作成時にエラー終了する
  • --format path でIssue番号が1行ずつ出力される
  • --format llm でMarkdownテーブル形式で出力される
  • 各Issueのdoc_count(modifies除外)、has_design、has_review、has_workplan、has_progressが正しく集計される
  • 既存の issue show <number> が従来と同じ動作をする
  • 旧構文 issue <number> がclapのサブコマンドエラーを返す
  • issue --help が list/show サブコマンドを表示する
  • src/cli/suggest.rs の生成コマンドが issue show <number> に更新されている
  • help_llm.rs のLLMガイダンスが全箇所更新されている(旧構文の参照がコードベース内に残っていない)
  • tests/e2e_issue.rs の全テストがパスする
  • tests/cli_args.rs のissue関連テストがパスする
  • src/indexer/symbol_store.rslist_all_issues() 単体テストがパスする(modifies混在ケース含む)
  • clapのエラーメッセージテストは部分一致で検証する

実装案

  • Config コマンドと同様の IssueCommands enum パターンでサブコマンド化
  • SymbolStorelist_all_issues() メソッドを追加(条件付きJOIN + GROUP BY、1クエリで集計)
  • 各Issueのドキュメント件数、設計書の有無、ラベルを表示
  • --format human/json/path/llm 対応
  • list_all_issues() はページネーションやフィルタ追加に拡張しやすい設計にする

対象バリュー

  • Issue中心: Issue番号を知らなくても、インデックス内の全Issueを俯瞰できる

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