Skip to content

デフォルトコマンドに AI プロンプトコマンドを追加#327

Merged
ujiro99 merged 8 commits intomainfrom
copilot/add-ai-prompt-to-default-commands
Mar 15, 2026
Merged

デフォルトコマンドに AI プロンプトコマンドを追加#327
ujiro99 merged 8 commits intomainfrom
copilot/add-ai-prompt-to-default-commands

Conversation

Copy link
Contributor

Copilot AI commented Mar 13, 2026

各ロケールのデフォルトコマンドに AI プロンプトコマンドが1つ(解説)しか含まれていなかった。ページ概要・YouTube概要・相互翻訳の3コマンドを全ロケールに追加する。

変更内容

新規 AI プロンプトコマンド(全13ロケール対応)

  • ページの概要生成{{Url}} を使用してページ内容を要約
  • YouTubeの概要生成{{Url}} を使用してYouTube動画を要約
  • 選択テキストの相互翻訳{{SelectedText}} を使用して母国語↔英語翻訳
const CMD_PAGE_SUMMARY_JA = {
  id: "648f500a-f8b2-46c7-9683-f1916adcbbb7",
  openMode: OPEN_MODE.AI_PROMPT,
  aiPromptOption: {
    serviceId: "gemini",
    prompt: "以下のURLのページを日本語で要約してください。\n{{Url}}",
    openMode: OPEN_MODE.POPUP,
  },
  ...
}

英語デフォルト(DefaultCommands

  • 既存の PAGE_ACTION Gemini に加え、Page Summary / YouTube Summary / Translation / Gemini(AI_PROMPT)を追加

テスト追加

  • DS-21: 全ロケールに4つ以上の AI プロンプトコマンドが存在することを検証
  • DS-22: ページ/YouTube概要コマンドが {{Url}} のみ使用し {{SelectedText}} を含まないことを検証
Original prompt

This section details on the original issue you should resolve

<issue_title>デフォルトコマンドに AI プロントを追加する
</issue_title>
<issue_description>AiPromptコマンドもデフォルトコマンドに含めるようにする

コマンドのアイデア

  • ページの概要生成
  • Youtubeの概要生成
  • 選択テキストの相互翻訳
  • 選択テキストの解説</issue_description>

Comments on the Issue (you are @copilot in this section)


💬 Send tasks to Copilot coding agent from Slack and Teams to turn conversations into code. Copilot posts an update in your thread when it's finished.

Co-authored-by: ujiro99 <677231+ujiro99@users.noreply.github.com>
Copilot AI changed the title [WIP] Add AI prompt to default commands デフォルトコマンドに AI プロンプトコマンドを追加 Mar 13, 2026
Copilot AI requested a review from ujiro99 March 13, 2026 04:46
@ujiro99 ujiro99 marked this pull request as ready for review March 13, 2026 06:19
@codecov
Copy link

codecov bot commented Mar 13, 2026

Codecov Report

❌ Patch coverage is 89.54672% with 113 lines in your changes missing coverage. Please review.
✅ Project coverage is 25.17%. Comparing base (b2280bb) to head (51eebea).
⚠️ Report is 10 commits behind head on main.

Files with missing lines Patch % Lines
packages/extension/scripts/check-command-ids.ts 2.00% 49 Missing ⚠️
packages/extension/scripts/generate-e2e-urls.ts 2.08% 47 Missing ⚠️
packages/extension/scripts/vite.config.ts 0.00% 15 Missing ⚠️
packages/extension/e2e/fixtures.ts 0.00% 2 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main     #327      +/-   ##
==========================================
+ Coverage   23.25%   25.17%   +1.91%     
==========================================
  Files         322      323       +1     
  Lines       31366    31727     +361     
  Branches     1557     1535      -22     
==========================================
+ Hits         7295     7986     +691     
+ Misses      24071    23741     -330     

☔ 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 14, 2026

PRレビュー: デフォルトコマンドへのAIプロンプトコマンド追加

全体的に機能の実装は適切で、全13ロケールへの対応・リファクタリング・テスト追加も良い方針です。ただし、いくつか確認・修正が必要な点があります。


重大な問題

1. vite-node が devDependencies に未追加

package.json のスクリプトで vite-node を使用していますが、devDependencies に宣言されていません。

ファイル: packages/extension/package.json (L11, L19)

vite のサブパッケージとして自動インストールされる場合もありますが、明示的に devDependencies へ追加してください。未宣言のままだと CI 環境や別マシンでのビルド失敗リスクがあります。


中程度の問題

2. type: module 追加による破壊的変更の懸念

packages/extension/package.json (L7) への type: module 追加は大きな変更です。postcss.config.js から postcss.config.cjs へのリネームは対応済みですが、eslint.config.js など他の .js 設定ファイルも同様の影響を受ける可能性があります。全ビルド・テストが正常に通ることを確認してください。

3. DefaultCommands 新規エントリでハードコード UUID を使用

ロケール固有コマンドでは FOLDER_ACTION 定数を使っているのに、DefaultCommands の新規エントリでは UUID 文字列を直接記述しています。

ファイル: packages/extension/src/services/option/defaultSettings.ts (L361~411 付近)

parentFolderId: FOLDER_ACTION を使用してください。値は同じですが(FOLDER_ACTION = 0f2167ab-2e1b-4972-954c-71eec058ab14)、定数を使う方がメンテナビリティが向上します。

4. check-command-ids.ts が DefaultCommands の ID を検証しない

packages/extension/scripts/check-command-ids.ts (L18-L29) は LOCALE_COMMANDS のみをイテレートしており、DefaultCommands に追加された4つの AI プロンプトコマンドの ID が検証されません。DefaultCommands のコマンドも検証対象に含めることを検討してください。


軽微な問題・改善提案

5. テストでの as any キャストと魔法文字列

packages/extension/src/services/option/defaultSettings.test.ts (DS-21: L268, DS-22: L313) で型安全性を損なう as any と文字列リテラル aiPrompt が使われています。OPEN_MODE.AI_PROMPT 定数を使うことを推奨します。

6. ロケールリストの重複定義

DS-21 (L238-L254) と DS-22 (L293-L309) で同一のロケールリストが重複定義されています。定数として抽出することでメンテナンス性が向上します。

7. インドネシア語(id)とマレー語(ms)でコマンドタイトルが重複

以下のタイトルが重複しています(機能的な問題ではありませんが、将来的に両言語が混在表示されると区別できません):

  • CMD_PAGE_SUMMARY_ID / CMD_PAGE_SUMMARY_MS: 両方 Ringkasan halaman
  • CMD_YOUTUBE_SUMMARY_ID / CMD_YOUTUBE_SUMMARY_MS: 両方 Ringkasan YouTube
  • CMD_TRANSLATE_ID / CMD_TRANSLATE_MS: 両方 Terjemahan teks

意図的であれば問題ありませんが、確認をお願いします。


良い点

  • getDefaultCommands のロジックを LOCALE_COMMANDS マップに集約したリファクタリングは可読性・保守性が大幅に向上しています
  • .mjs スクリプトを TypeScript + vite-node に移行し、@/ / @shared 型エイリアスが使えるようになった点は大きな改善です
  • テスト DS-21 / DS-22 で新機能の要件を具体的に検証している点は良いです
  • pt-br の exact match + prefix match を組み合わせたロジック(defaultSettings.ts 末尾)は正確に機能します

@claude
Copy link

claude bot commented Mar 14, 2026

PR レビューフィードバック

概要

全13ロケールへの AIプロンプトコマンド追加と、スクリプトの .mjs.ts 化という2つの主要変更が含まれています。全体的には良い方向性ですが、いくつか重要な懸念点があります。


🔴 重要な問題

1. 既存コマンドIDの変更(破壊的変更)

packages/extension/src/services/option/defaultSettings.ts の多数の既存コマンドIDが変更されています(例: L203, L218, L278付近など)。

- id: "723ee9f1-150b-54ad-aeac-5fbfd0ae3650",
+ id: "0cb9dbbc-c0cf-53c6-93e5-016363705216",

これらのIDはユーザーのChrome拡張機能設定に保存されている可能性があります。IDが変更されると、既存ユーザーの設定が壊れたり、コマンドが重複インストールされる恐れがあります。

確認事項: これらのID変更は意図的なものですか? check-ids スクリプトによって「MISMATCH」が検出されたため修正した場合、その根本原因を明確にした方が良いです。既存ユーザーへの影響がある場合は、マイグレーション処理が必要です。


🟡 中程度の問題

2. Object.keys() の順序依存によるロケールマッチング

packages/extension/src/services/option/defaultSettings.ts (関数 getDefaultCommands 付近):

const prefixKey = Object.keys(LOCALE_COMMANDS).find((k) => lang.startsWith(k))

Object.keys() の返す順序はオブジェクト定義順に依存します。例えば pt キーが pt-br より前にある場合、lang = "pt-br" のとき exactMatch"pt-br" キーで正しく解決されますが、lang = "pt-pt" のとき ptpt-br の両方がprefixとして合致する可能性があります("pt-pt".startsWith("pt") = true)。

現状は exactMatch が先に評価されるため pt-br は正しく動作しますが、将来的にロケールを追加する際に意図しない挙動が生じる可能性があります。

提案: キーの長さで降順ソートしてからマッチングすることで、より長い(具体的な)キーを優先できます。

const prefixKey = Object.keys(LOCALE_COMMANDS)
  .sort((a, b) => b.length - a.length)
  .find((k) => lang.startsWith(k))

3. テストDS-21の翻訳コマンド検出ロジックの脆弱性

packages/extension/src/services/option/defaultSettings.test.ts (L290付近):

const translationCmd = aiPromptCmds.find((c) =>
  (c as any).aiPromptOption.prompt.includes("{{SelectedText}}") &&
  (c as any).aiPromptOption.prompt.match(
    /translat|[]|||перевод|переве|übersetz|tradu|terjemah|/i,
  ),
)

プロンプトテキストへの依存は脆弱です。翻訳系のコマンドは「{{SelectedText}} を含み、{{Url}} を含まない」という条件で代替できます。DS-22テストとロジックを統一することを検討してください。

4. "type": "module" の追加による影響範囲

packages/extension/package.json (L7):

"type": "module",

この変更により、パッケージ内のすべての .js ファイルがESモジュールとして扱われます。postcss.config.jspostcss.config.cjs のリネームは対処されていますが、他の .js ファイル(設定ファイルや動的インポートを使用するファイル)に影響が出ないか確認が必要です。


🟢 改善点・提案

5. en ロケールが LOCALE_COMMANDS に含まれていない

packages/extension/src/services/option/defaultSettings.ts

テストDS-21では "en" ロケールも検証対象に含まれていますが、LOCALE_COMMANDSen キーはなく、DefaultCommands へのフォールバックが使われます。動作はしますが、一貫性のため LOCALE_COMMANDSen キーを追加するか、テストのコメントで意図を明記すると分かりやすくなります。

6. 型安全性 (as any キャスト)

packages/extension/scripts/check-command-ids.ts (L32付近):

const c = cmd as Record<string, string>

Command 型を Record<string, string> にキャストしているため、型安全性が失われています。Command 型のプロパティを直接使うか、より具体的な型定義を使うことを検討してください。

7. CMD_PAGE_SUMMARY_MSCMD_PAGE_SUMMARY_ID のタイトル重複

packages/extension/src/services/option/defaultSettings.ts (L1290, L1310付近):

両コマンドのタイトルが "Ringkasan halaman" と同一です。インドネシア語とマレー語は語彙が似ていますが、意図的であることをコメントで明記するか、区別する表記にすることを推奨します。


✅ 良い点

  • .mjs スクリプトを vite-node + TypeScript に移行したことで、エイリアス(@/, @shared)が使えるようになり、正規表現ベースの脆弱なソース解析が不要になりました(generate-e2e-urls.ts, check-command-ids.ts
  • getDefaultCommands の if-else チェーンを LOCALE_COMMANDS マップに置き換えたリファクタリングは可読性・保守性が大きく向上しています
  • FOLDER_* 定数の導入でフォルダIDの管理が明確になりました
  • テストDS-21・DS-22は新機能の正確性を検証する適切なカバレッジです

@ujiro99 ujiro99 merged commit e8db6f5 into main Mar 15, 2026
4 checks passed
@ujiro99 ujiro99 deleted the copilot/add-ai-prompt-to-default-commands branch March 15, 2026 03:13
@claude
Copy link

claude bot commented Mar 15, 2026

コードレビュー

PR #327「デフォルトコマンドにAIプロンプトコマンドを追加」のレビューです。


✅ 良い点

1. リファクタリングの質が高い

packages/extension/src/services/option/defaultSettings.ts での getDefaultCommands() のif-chainを LOCALE_COMMANDS オブジェクトに置き換えた変更は保守性を大幅に向上させています。新しいロケールを追加する際も、LOCALE_COMMANDS にエントリを追加するだけで済みます。

2. スクリプトのTypeScript化

  • scripts/check-command-ids.mjs(237行)→ scripts/check-command-ids.ts(73行): 実際のソースコードから直接インポートすることで、テキスト解析という脆弱なアプローチを排除し、型安全性が向上しています。
  • scripts/generate-e2e-urls.mjsscripts/generate-e2e-urls.ts も同様に改善されています。

3. テストの追加(DS-21, DS-22)

packages/extension/src/services/option/defaultSettings.test.ts において it.each を使用してテストをリファクタリングし、DS-21・DS-22を追加したことは良い実践です。


⚠️ 問題点・改善提案

[重要] プレフィックスマッチのロジックが順序依存

ファイル: packages/extension/src/services/option/defaultSettings.ts

現在のコード:

const prefixKey = Object.keys(LOCALE_COMMANDS).find((k) => lang.startsWith(k))

Object.keys() の順序はモダンな JS エンジンでは挿入順が保証されていますが、このロジックには潜在的な問題があります。将来 "pt-b" のような短いキーが追加された場合、"pt-br".startsWith("pt-b")true となり誤った結果を返す可能性があります。

推奨修正:

const prefixKey = Object.keys(LOCALE_COMMANDS)
  .sort((a, b) => b.length - a.length)
  .find((k) => lang.startsWith(k))

[中程度] 英語(DefaultCommands)がDS-21/DS-22でテストされていない

ファイル: packages/extension/src/services/option/defaultSettings.test.ts

LOCALE_COMMANDS には英語が含まれておらず、DefaultCommands(英語のデフォルト)はフォールバックとして返されます。DS-21・DS-22は LOCALE_COMMANDS のみを検証しており、英語の DefaultCommands にAIプロンプトコマンドが正しく設定されているかのテストがありません。


[中程度] "type": "module" 追加による破壊的変更リスク

ファイル: packages/extension/package.json

この変更により、パッケージ内の全 .js ファイルが ESM として扱われます。postcss.config.jspostcss.config.cjs のリネームは対応済みですが、他に影響を受ける .js ファイルがないか確認が必要です。


[軽微] CMD_CHARACTER_COUNTER の追加に関するテスト不足

ファイル: packages/extension/src/services/option/defaultSettings.ts

全ロケールに CMD_CHARACTER_COUNTER が追加されていますが、この追加を検証するテストがありません。将来的に誤って削除された場合に気づきにくくなります。


[軽微] getDefaultCommands のドキュメント不足

ファイル: packages/extension/src/services/option/defaultSettings.ts

新しいロジック(exact match → prefix match → DefaultCommands)にコメントが不足しています。特に pt-brpt の両方が存在する理由や、マッチの優先順位についてコメントがあると可読性が向上します。


📊 総評

PR全体として、コードの品質は高く、既存の問題(issue #326)を適切に解決しています。特にif-chainからデータ駆動アプローチへのリファクタリングとスクリプトのTypeScript化は素晴らしい改善です。主な憸念点はプレフィックスマッチのロジックの堅牢性と、英語デフォルトコマンドのテストカバレッジです。

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.

デフォルトコマンドに AI プロントを追加する

2 participants