Hub外部呼び出しでCommand編集ダイアログ起動と保存時Hub同期を追加#401
Conversation
Agent-Logs-Url: https://github.com/ujiro99/selection-command/sessions/c73e060c-0682-4ef9-9fca-6e2dca2af861 Co-authored-by: ujiro99 <677231+ujiro99@users.noreply.github.com>
Agent-Logs-Url: https://github.com/ujiro99/selection-command/sessions/c73e060c-0682-4ef9-9fca-6e2dca2af861 Co-authored-by: ujiro99 <677231+ujiro99@users.noreply.github.com>
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #401 +/- ##
==========================================
+ Coverage 27.19% 27.38% +0.18%
==========================================
Files 316 316
Lines 31899 32140 +241
Branches 1732 1764 +32
==========================================
+ Hits 8676 8802 +126
- Misses 23223 23338 +115 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
Pull request overview
概要
Hub から拡張機能へ「既存コマンドの編集ダイアログ起動」を要求できるようにし、保存時に Hub へ更新を同期する導線を追加するPRです。Options 画面のクエリ解釈による自動ダイアログ起動と、Hub とのポート通信(edit-command / ack)を新設しています。
懸念点
- Hub 編集同期の実装で、
SubmitCommandInput(locale/targetUrl付き)をそのままローカルコマンドとして永続化してしまう不具合があります。 hub-editのonConnectExternal受付で接続元検証がなく、想定外の外部タブ/オリジンから_hubEditPortを差し替え可能です(セキュリティ/誤動作リスク)。- listener/レスポンスが ack 前提で解放されず、接続不成立・ack未達時にリーク/ハングし得ます(タイムアウトや失敗時クリーンアップ不足)。
- Share 操作でコマンドIDを UUIDv7 に強制置換するため、ショートカット等の
commandId参照が壊れる可能性が高いです(永続IDの変更)。
改善提案
- Hub送信用の付加情報(
locale/targetUrl)は保存前に除去し、保存対象は純粋なSelectionCommandに限定してください。 hub-edit接続はport.sender.tab.id === _hubTabIdなどで厳密に検証し、タイムアウト/エラー時に listener を確実に解除してください。- ack待ちの
responseについてタイムアウト導入、または即時レスポンス+非同期でack処理など、未応答時にチャネルが残らない設計にしてください。 - Shareボタンで
command.idを書き換えない(UUIDv4も許容する/Hub用に別IDを持つ)か、どうしても変えるならshortcuts等の参照も同時更新する仕組みを追加してください。
Changes:
- Hub→Extension の外部メッセージに
EditCommandを追加し、Options ページをクエリ付きで起動 - Options 側でクエリを解釈して該当コマンドの編集ダイアログを自動オープンし、保存時に Hub へ同期
- ID生成を
crypto.randomUUID()からuuidベースのgenerateId()(UUIDv7)へ置換
Reviewed changes
Copilot reviewed 17 out of 19 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
| packages/extension/src/services/hub/background.ts | Hub外部メッセージに EditCommand を追加し、Hub同期用のポート通信とローカル更新処理を追加 |
| packages/extension/src/components/option/editor/CommandList.tsx | クエリ解析による自動編集起動と、保存時の Hub 同期呼び出しを追加 |
| packages/extension/src/services/hubShare.ts | Hub同期用に editCommandToHub を追加 |
| packages/extension/src/components/option/ShareButton.tsx | 共有時にUUIDv7でないIDを生成し直すロジックを追加 |
| packages/extension/src/lib/utils.ts | generateId(UUIDv7)と isUUIDv7 を追加 |
| packages/extension/src/services/settings/settings.ts / settings.test.ts | マイグレーションとテストを generateId に追従 |
| packages/extension/src/services/ipc.ts / src/background_script.ts | BgCommand.editCommandToHub を追加して background に配線 |
| packages/extension/package.json / yarn.lock | uuid を ^14.0.0 へ更新 |
| packages/extension/src/services/hub/background.test.ts | EditCommand の外部メッセージケースを追加 |
| .gitignore / packages/extension/.env.development | .env.development をリポジトリ管理から外す変更 |
| .serena/project.yml / .claude/settings.local.json | 開発ツール設定の更新 |
|
|
||
| let commandToShare = command | ||
| if (!isUUIDv7(command.id)) { | ||
| const newId = generateId() | ||
| commandToShare = { ...command, id: newId } | ||
| onCommandIdChange?.(newId) | ||
| } | ||
|
|
||
| const ok = shareCommandToHub(commandToShare) | ||
| setStatus(ok ? "sent" : "error") |
| const idx = commandArray.fields.findIndex((f) => f.id === commandId) | ||
| if (idx >= 0) { | ||
| commandArray.update(idx, { ...commandArray.fields[idx], id: newId }) | ||
| } |
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
コードレビューPR の概要を把握しました。Hub から拡張機能の編集ダイアログを起動し、保存後に Hub へ同期する機能追加です。全体的な設計は明確ですが、いくつかの重要な問題点があります。 🔴 重要な問題1. グローバルミュータブル状態の競合(並行
|
Agent-Logs-Url: https://github.com/ujiro99/selection-command/sessions/b925ede3-7371-4ee2-b80e-8aad6b4acc21 Co-authored-by: ujiro99 <677231+ujiro99@users.noreply.github.com>
Agent-Logs-Url: https://github.com/ujiro99/selection-command/sessions/d12aa823-8068-4dae-91c8-437827bdd35d Co-authored-by: ujiro99 <677231+ujiro99@users.noreply.github.com>
Agent-Logs-Url: https://github.com/ujiro99/selection-command/sessions/d12aa823-8068-4dae-91c8-437827bdd35d Co-authored-by: ujiro99 <677231+ujiro99@users.noreply.github.com>
Agent-Logs-Url: https://github.com/ujiro99/selection-command/sessions/d12aa823-8068-4dae-91c8-437827bdd35d Co-authored-by: ujiro99 <677231+ujiro99@users.noreply.github.com>
コードレビュー概要このPRは、Hub外部から拡張機能の「コマンド編集ダイアログ」を起動できるようにし、保存時にHubへ同期する機能を追加します。ID生成を 重要なバグ・問題点1. ストレージ更新成功前に
|
| ファイル | パッチカバレッジ |
|---|---|
background.ts |
28.98% (49行未カバー) |
CommandList.tsx |
0% (44行未カバー) |
hubShare.ts |
14.28% (12行未カバー) |
ShareButton.tsx |
0% (9行未カバー) |
特に CommandList.tsx の editCommand URLパラメータ処理と Hub同期ロジックはテストがなく、バグ混入リスクが高い部分です。UIコンポーネントのテストは難しいですが、useEffect ロジックを純粋な関数に抽出してユニットテストできる設計を検討してください。
マイナーな指摘
7. uuid のメジャーバージョン大幅アップグレード
packages/extension/package.json, packages/shared/package.json
v11.1.0 → v14.0.0 と2メジャーバージョンのアップグレードです。v7 API自体は維持されていますが、破壊的変更がないか変更履歴の確認を推奨します。
8. handleUpdateCommandId でショートカット更新漏れの可能性
packages/extension/src/components/option/editor/CommandList.tsx (L320-332付近)
getValues("shortcuts.shortcuts") でショートカットのIDを更新していますが、コマンドIDが他の場所でも参照されている場合(例: ネストしたフォルダの設定など)に漏れが生じる可能性があります。
総評
EditCommand機能の基本設計(外部メッセージ → タブ起動 → ポート接続 → ack確認)は適切です。タイムアウト・重複リクエスト防止・クリーンアップの仕組みも実装されており、既存のCopilotレビューで指摘されていた懸念事項の多くは対処済みです。
ただし、「ストレージ更新成功前にresponse(true)を送信する」バグ(問題点1)は確実に修正が必要です。その他の問題点についても対応を検討いただければ幸いです。
レビュー by Claude (claude-sonnet-4-6)
コードレビュー概要このPRはHubから拡張機能への 全体的な設計方針は明確で、セキュリティ検証(originチェック・tab IDチェック)やタイムアウト処理の追加など、改善されている点は評価できます。ただし、いくつかの問題点を指摘します。 🐛 バグ1.
|
| ファイル | カバレッジ | 未カバー行 |
|---|---|---|
background.ts |
28.98% | 49行 |
CommandList.tsx |
0.00% | 44行 |
hubShare.ts |
14.28% | 12行 |
ShareButton.tsx |
0.00% | 9行 |
CommandTreeRenderer.tsx |
0.00% | 6行 |
CommandList.tsx の URL クエリパラメータ解析ロジック(useEffect 内のダイアログ自動起動フロー)はコア機能であり、テストがゼロなのが気になります。
✅ 良い点
- セキュリティ検証:
onHubEditConnectでport.sender?.tab?.id !== _hubTabIdとport.sender?.origin !== hubOriginの両方をチェックしている(EC-03, EC-04 のテストも追加済み) locale/targetUrlの除外: ack 受信時に Hub 用フィールドをストレージ保存から除外している(...commandToStoreによる分割代入)- ショートカット参照の更新:
handleUpdateCommandIdでコマンドIDが変わった際にショートカットのcommandIdも更新している - 重複セッション防止:
_hubTabId !== undefinedと_editPendingResponseの二重チェックで並行リクエストを拒否 - テスト改善:
crypto.randomUUIDのモック方法をvi.spyOn(utils, "generateId")に整理(settings.test.ts)
💡 その他の提案
packages/extension/src/services/hub/background.tsのタイムアウト定数EDIT_CONNECT_TIMEOUT_MSとEDIT_COMMAND_ACK_TIMEOUT_MSが同じ値(10秒)ですが、2つの異なるフェーズのタイムアウトとして意味が異なります。コメントでそれぞれの意図を明示すると可読性が上がります。uuidの^11.1.0→^14.0.0のメジャーバージョン更新が含まれています。v7API の互換性は保たれていますが、yarn.lockの差分が大きい点は確認してください。
コードレビュー概要このPRは、Hub(外部サービス)から拡張機能へ「既存コマンドの編集ダイアログ起動」を要求できるようにし、保存時にHubへ更新を同期する機能を追加するものです。 全体的な設計方針は理解できますが、以下にいくつかの問題点を指摘します。 重要な問題1.
|
Uh oh!
There was an error while loading. Please reload this page.