Skip to content

Feat/fix UI#330

Merged
ujiro99 merged 4 commits intomainfrom
feat/fix-ui
Mar 16, 2026
Merged

Feat/fix UI#330
ujiro99 merged 4 commits intomainfrom
feat/fix-ui

Conversation

@ujiro99
Copy link
Owner

@ujiro99 ujiro99 commented Mar 15, 2026

close #264

@claude
Copy link

claude bot commented Mar 15, 2026

PR #330「Feat/fix UI」コードレビュー


1. バグ修正 / 機能改善(重要度: 高)

targetUrl の導入

ファイル: packages/extension/src/background_script.ts (行232付近)

const targetUrl = sender.tab?.url ?? sender.url

これは実質的なバグ修正として評価できます。chrome.runtime.MessageSenderurl プロパティはサービスワーカーやバックグラウンドページからの送信時にのみ設定されるため、コンテンツスクリプトからの場合は sender.tab?.url を参照すべきです。

懸念点: sender.tab?.urlundefined になり得るケース(タブが閉じられた後に非同期処理が走った場合など)があります。targetUrlundefined になった場合でも現状は動作しますが、意図しないページが開かれる可能性があります。

// 推奨: undefinedチェックの追加を検討
const targetUrl = sender.tab?.url ?? sender.url
if (!targetUrl) return

2. コード品質・スタイルの問題(重要度: 中)

IIFEのインデント崩れ

ファイル: packages/extension/src/background_script.ts (行548-558付近)

  ; (async () => {
    ...
  })()

トップレベルのIIFEが4スペースのインデントで記述されており、ネストされているように見え可読性を損なっています。変更前の形式(インデントなし)の方が正しいスタイルです。フォーマッターの誤適用が疑われますが、意図的なものかどうかが不明瞭です。

三項演算子のインデント不一致

ファイル: packages/extension/src/background_script.ts (行171-190付近)

const cmd = isSearch
  ? {
    id: params.id,        // ← 2スペース
    ...
  }
  : isPageAction
    ? {
      id: params.id,      // ← 4スペース

isSearch ブランチと isPageAction ブランチでインデント量が統一されていません。yarn pretty-quick などで一貫したフォーマットの適用を確認してください。

関数定義のスペース変更

ファイル: packages/extension/src/background_script.ts (行62, 75付近)

// 変更前
const onConnect = async function (port: chrome.runtime.Port) {
// 変更後
const onConnect = async function(port: chrome.runtime.Port) {

この変更がプロジェクトのPrettier設定と一致しているか確認が必要です。


3. アーキテクチャ上の重要な変更(重要度: 高)

AI_SERVICES_FALLBACK のJSONインポートへの変更

ファイル: packages/extension/src/services/aiPrompt.ts (行5, 65付近)

import aiServicesJson from "../../../hub/public/data/ai-services.json"
const AI_SERVICES_FALLBACK: AiService[] = normalizeServices(aiServicesJson)

メリット:

  • フォールバックデータと実際のHTTPエンドポイントのデータが単一の真実の源に統一される
  • 手動の二重管理が解消され、データの乖離リスクがなくなる

懸念点:

  1. パッケージ境界の越境: packages/extension から ../../../hub/public/data/ への相対パスインポートはモノレポにおけるパッケージ境界を越えています。packages/hubpackages/extension のビルド依存になる形となり、将来的なパッケージの分離・デプロイに影響する可能性があります。

  2. selectorType フィールドの欠如: ai-services.json には selectorType フィールドがありませんが、normalizeServices がデフォルトで SelectorType.css を設定するため動作上の問題はありません。ただし、将来の変更時に見落とすリスクがあります。


4. データの変更(重要度: 中)

ClaudeのfaviconURLの変更

ファイル: packages/hub/public/data/ai-services.json (行29付近)

// 変更前
"faviconUrl": "https://claude.ai/favicon.ico"
// 変更後
"faviconUrl": "https://favicon.im/claude.ai"

favicon.im はサードパーティのファビコン取得サービスです。ChatGPTやGeminiはオリジナルURLを使用しているのに対し、ClaudeとPerplexityのみサードパーティ経由となっています。以下のリスクがあります。

  • サービス停止による画像の表示失敗
  • CSP違反のリスク
  • ユーザーのIPアドレスが第三者に送信されるプライバシー上の懸念

推奨: https://claude.ai/favicon.ico の公式URLを維持するか、バンドルしたSVGアイコンの使用を検討してください。変更前のURLが機能しなくなった特定の理由があれば、コメントに記載いただけると助かります。


5. UI順序の変更(重要度: 低)

ファイル: packages/extension/src/const.ts (行109-114付近)

// 変更後の順序
COMMAND_TYPE.SEARCH,
COMMAND_TYPE.AI_PROMPT,   // ← AI_PROMPTを先に
COMMAND_TYPE.PAGE_ACTION,

AI_PROMPTPAGE_ACTION より前に表示するUI上の変更です。動作上の問題はありませんが、この変更の意図(ユーザビリティ改善?ユースケースの頻度順?)をPR説明に記載いただけると分かりやすいです。


6. テストカバレッジ(重要度: 中)

このPRには新規テストが含まれていません。

  • aiPrompt.ts のフォールバック生成ロジックが変更されたにもかかわらず、aiPrompt.test.ts が存在しない(または追加されていない)
  • background_script.tstargetUrl 修正は実質的なバグ修正ですが、回帰テストが追加されていない

バグ修正に対するテストの追加を推奨します。


まとめ

カテゴリ 評価
バグ修正(targetUrl 良好、ただしnullガードの追加を推奨
フォールバックのJSON化 設計として良いが、パッケージ境界の越境が懸念
フォーマット変更 一部に一貫性のない変更あり(IIFEのインデント)
テストカバレッジ 不足
サードパーティfavicon プライバシー・可用性の懸念
UI順序変更 問題なし

最も対応を推奨する点:

  1. IIFEのインデント崩れの修正(または意図的な変更であればコメントを追加)
  2. favicon.im 使用の再検討
  3. aiPrompt.ts のパッケージ境界越境インポートの設計上の正当性の確認

🤖 Generated with Claude Code

@codecov
Copy link

codecov bot commented Mar 15, 2026

Codecov Report

❌ Patch coverage is 25.00000% with 39 lines in your changes missing coverage. Please review.
✅ Project coverage is 25.32%. Comparing base (80e6f02) to head (a89d473).
⚠️ Report is 5 commits behind head on main.

Files with missing lines Patch % Lines
packages/extension/vite.config.ts 0.00% 19 Missing ⚠️
packages/extension/src/background_script.ts 40.00% 15 Missing ⚠️
packages/extension/vitest.config.ts 0.00% 5 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main     #330      +/-   ##
==========================================
- Coverage   25.39%   25.32%   -0.07%     
==========================================
  Files         323      323              
  Lines       31738    31691      -47     
  Branches     1551     1556       +5     
==========================================
- Hits         8059     8027      -32     
+ Misses      23679    23664      -15     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@claude
Copy link

claude bot commented Mar 16, 2026

PR #330 コードレビュー

全体的にコードの品質は良く、特に AI_SERVICES_FALLBACK をビルド時定数として共有 JSON から生成するアイデアは優れたリファクタリングです。


バグ修正の評価

packages/extension/src/background_script.ts:232 の修正は正しいアプローチです。

サイドパネルやポップアップコンテキストでは sender.url が拡張機能の内部URLを返す場合があり、sender.tab?.url を優先するのは適切です。


懸念事項

1. JSON ファイルの扱い方(堅牢性)

packages/extension/vite.config.ts:110-113 および packages/extension/vitest.config.ts:17-20

fs.readFileSync の戻り値(生のJSON文字列)を直接 define に渡しています。これは動作しますが、JSONが不正な場合にビルド時に検出されないリスクがあります。

JSON.parseJSON.stringify を組み合わせることで、ビルド時に不正なJSONを検出でき、より安全です:

__AI_SERVICES_JSON__: JSON.stringify(
  JSON.parse(
    fs.readFileSync(
      path.resolve(__dirname, "../hub/public/data/ai-services.json"),
      "utf-8",
    )
  )
),

同様の修正を vitest.config.ts にも適用することを推奨します。


2. IIFE のフォーマットが不自然

packages/extension/src/background_script.ts:548-557

変更後のコードではトップレベルのIIFEが2スペースインデントされており、さらにセミコロンとカッコの間にスペースが入る形式(; (async () =>)になっています。これは元の形式より読みにくく、標準的でもありません。

元の形式(;(async () =>)の方がより適切です。Prettierの設定により自動フォーマットされた可能性もありますが、意図的な変更かご確認ください。


3. サードパーティ favicon サービスへの依存

packages/hub/public/data/ai-services.json:28

Claudeのファビコン URL を https://claude.ai/favicon.ico から https://favicon.im/claude.ai に変更しています。

Perplexity との一貫性を持たせる意図は理解できますが、favicon.im はサードパーティのプロキシサービスです。このサービスが停止・変更された場合、ファビコンが表示されなくなります。claude.ai の公式ファビコン URL を使い続ける方が安定性の観点から望ましい可能性があります。


4. テストカバレッジ

packages/extension/src/background_script.ts:229-265(バグ修正箇所)

sender.tab?.url ?? sender.url の修正は重要なバグフィックスですが、対応するテストが追加されていません。サイドパネルコンテキストでの openInTab の動作を検証するテストケースを追加することを推奨します。


良い点

  • packages/extension/src/services/aiPrompt.ts: AI_SERVICES_FALLBACK のハードコード削除とビルド時定数への移行は、データの重複排除として優れた設計です。
  • packages/extension/src/const.ts:112: AI_PROMPTPAGE_ACTION の順序変更はUIの一貫性改善として適切です。
  • packages/extension/src/types/vite-env.d.ts:12: 新しいビルド時定数の型宣言が適切に追加されています。

全体的に変更の意図は明確で、バグフィックスとリファクタリングの方向性は正しいです。上記の懸念点を確認いただければと思います。

@ujiro99 ujiro99 merged commit 5e98414 into main Mar 16, 2026
5 of 6 checks passed
@ujiro99 ujiro99 deleted the feat/fix-ui branch March 16, 2026 00:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

タブで開くときに今のURLにならない

1 participant