Skip to content

fix: refs で解析できない言語のファイルを申告し、検索できない範囲をエラーにする - #48

Merged
owayo merged 2 commits into
mainfrom
fix/issue-47-refs-unsupported-language
Oct 9, 2026
Merged

owayo merged 2 commits into
mainfrom
fix/issue-47-refs-unsupported-language

Conversation

@owayo

@owayo owayo commented Oct 9, 2026

Copy link
Copy Markdown
Owner

概要

refs は、解析できない言語のファイル (.applescript など) を検索範囲に含めても黙って外しており、そのファイルにしか無い参照を探すと警告なしの 0 件・終了コード 0 になっていました。--glob sample.applescript でそのファイルだけを指定しても同じで、symbols --path が UNSUPPORTED_LANGUAGE を返すのと食い違っていました。

この PR では次の 2 点を直します。

  • 検索範囲にある解析できないソースを、dead-code / review と同じ truncations の unanalyzable_source で申告する
  • 検索範囲にファイルはあるのに、検索できる入力が 1 件も無いときは UNSUPPORTED_LANGUAGE にする

原因と修正

refs/files.rs の classify_candidate は、言語の決まらないファイルを「ソースだと確実に言える拡張子 (UnanalyzableSource)」と「それ以外 (Ignore)」に分けます。前者を申告していたのは dead-code / review だけで、refs はどちらも捨てていました。.applescript は前者の一覧にも入っていませんでした。

  • RefScan に申告 (unanalyzable) と「検索できる入力が無い」判定 (unsupported_only) を持たせ、RefsResult.truncations (空なら出力しない) に載せる。input_is_complete() も申告があれば false にし、省略が起きたときの result_summary.complete_input に反映する

  • refs --names では、申告を skipped と同じく先頭の結果にだけ付ける。後続の名前の complete_input も、apply_refs_batch_limits が全結果を集約するので false になる

  • 「検索できる入力が無い」判定 (FileCollection::unsupported_only) では、画像・文書・未知の拡張子も含めて範囲に入ったファイルをすべて数える。glob の書き方 (sample.applescript / *.applescript) では変えない。次のどれかがあればエラーにしない

    • 対応言語のファイル
    • 生成物として外したファイル (skipped で申告済み)
    • 拡張子が無く、先頭を読めなかったファイル (CandidateDecision::Unreadable。対応言語のスクリプトかもしれない)
    • component に紐付いた Angular テンプレート (AngularBatchContext::input_count。--glob '**/*.html' でも検索できる。判定にヒット数は使わない)

    範囲に 1 件もファイルが無い場合は、従来どおり空の結果を返します

  • エラーにするのは利用者向けの経路 (CLI / session / MCP が呼ぶ find_references_with_generated / find_references_batch_with_generated) だけ。API 差分の内部検索 (find_symbol_references_batch) は RefSearchAudience::Internal としてエラーにせず、従来どおり参照 0 件として扱う

  • 申告する拡張子に applescript を足す (dead-code / review の申告にも効く)

  • Angular の単一名経路も AngularBatchContext::prepare を 1 回だけ呼び、テンプレート数とヒットを同じ前処理から取る。公開 API の find_angular_template_references(_batch) は残す

設計の判断 (codex と相談)

採ったもの:

  • 新しいキー (skipped_unsupported など) を作らず、既存の truncations / unanalyzable_source に寄せる
  • エラー判定には allowlist 外のファイル (md / png など) も数える。混在する範囲で申告するのは allowlist の拡張子だけなので、両者の非対称は「エラー = 検索できる入力が無い」「申告 = 検索はしたが一部のソースを扱えなかった」という区別として受け入れる
  • glob の書き方による分岐はしない (同じ入力集合なら同じ結果)
  • stderr には出さない (stdout の JSON に載せる)

採らなかったもの:

  • --names の全結果への申告: 申告は 1 拡張子あたり推定 88〜135 トークン (estimated_tokens の実測、代表パス 1〜3 件) あり、名前ごとに繰り返すと既定の予算 3,000 トークンを申告だけで使い切るため
  • .elm / .rkt などの追加: 報告のある .applescript だけに留めた
  • 参照 0 件で申告だけが予算を超えたときの budget_exceeded: 「省略が 1 件も無ければ result_summary を出さない」は既存の意図的な契約 (skipped も同じ)。申告は最大 10 件なので、通常の長さのパスなら既定の予算を申告だけで超えることはない。契約そのものを変えるのは別の設計にする

今回の範囲外 (別対応):

  • 読み込み・parse の失敗 (failed_files) と Angular テンプレートの読み込み失敗は、出力の省略が起きたときの complete_input にしか現れない
  • symbols --dir も、未対応言語のファイルしか無い範囲では黙って何も出さない

検証

  • make ci: pass (unit 1,668 件 / integration 517 件)
  • astro-sight review --dir . --git --base <base> --hook: exit 0 (参考情報の共変更の履歴だけ)
  • 回帰テスト (修正前のコードでは失敗する内容。どれも対照ケースを含む)
    • refs_declares_unsupported_language_sources: 混在する範囲で .applescript / .vue を申告し、README.md は申告しない。--names では先頭だけに付き、後続の complete_input も false。--glob '*.sh' に絞れば申告なし・complete_input: true
    • refs_rejects_scope_without_any_searchable_file: --glob sample.applescript / *.applescript / docs/** (md だけ) / --names が UNSUPPORTED_LANGUAGE。対照として、何にも当たらない glob・生成物だけ・対応言語だけの範囲は成功
    • refs_html_glob_counts_linked_angular_templates_as_searchable_input: --glob '**/*.html' で紐付いたテンプレートを検索でき、ヒット 0 件でもエラーにしない。紐付かない index.html だけならエラー
    • session_refs_reports_unsupported_language_scope_and_sources / mcp_refs_search_rejects_scope_without_searchable_file: session と MCP も同じ
    • unsupported_only_scope_is_an_error_only_for_user_searches: 内部の API 判定はエラーにしない
    • collect_files_scan_detects_scope_without_searchable_input / unsupported_scope_caps_extensions_and_reports_the_rest / unreadable_extensionless_file_is_not_treated_as_unsupported: 拡張子の内訳と代表パスが決定的なこと (作成順を辞書順と逆にしても先頭 3 件)、hidden 配下は数えないこと、上限、読めないファイルの扱い
    • unanalyzable_sources_make_the_input_incomplete_and_count_toward_the_budget: 採寸用の描画にも申告が載る
  • Issue の再現手順を修正後のバイナリで実行し、混在する範囲では truncations が付き、--glob sample.applescript は UNSUPPORTED_LANGUAGE (終了コード 1) になることを確認

Closes #47

🤖 Generated with Claude Code

owayo and others added 2 commits October 9, 2026 12:48
refs は解析できない言語のファイル (.applescript など) を黙って走査から外しており、
そのファイルにしか無い参照を探すと警告なしの 0 件・終了コード 0 になっていた。
--glob でそのファイルだけを指定しても同じで、symbols --path が
UNSUPPORTED_LANGUAGE を返すのと食い違っていた。

- 検索範囲の解析できないソースを、dead-code / review と同じ truncations の
  unanalyzable_source で申告する。refs --names では skipped と同じく先頭の結果に
  だけ付ける。この申告があれば complete_input も false にする
- 範囲にファイルはあるのに検索できる入力が 1 件も無いときは UNSUPPORTED_LANGUAGE
  にする。対応言語のファイル・生成物・先頭を読めなかった拡張子なしファイル・
  component に紐付いた Angular テンプレートのどれかがあれば従来どおり空の結果を返す
- エラーにするのは CLI / session / MCP の利用者向けの経路だけで、API 差分の内部検索は
  従来どおり参照 0 件として扱う
- 申告する拡張子に applescript を足す

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
usage (日英) に「解析できない言語のファイル」の節を足し、truncations の申告と、
UNSUPPORTED_LANGUAGE になる条件・ならない条件を書く。complete_input の説明も更新する。
README・skills/SKILL.md・AGENTS.md にも要点を足す。

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@owayo owayo self-assigned this Oct 9, 2026
@coderabbitai

coderabbitai Bot commented Oct 9, 2026

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration
  • Configuration used: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 2dee5f2f-2f3e-4d54-94b2-885251a7bf8f
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@owayo
owayo merged commit a69e379 into main Oct 9, 2026
9 checks passed
@owayo
owayo deleted the fix/issue-47-refs-unsupported-language branch October 9, 2026 04:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant