Enforce all react-next ESLint rules#154
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
Walkthrough新規フック ChangesComprehensive Hook Optimization and Component Refactor
Sequence Diagram(s)sequenceDiagram
participant User
participant MainContent
participant ToastLib
participant UndoToast
User->>MainContent: bulk-delete -> dispatch(show undo toast)
MainContent->>ToastLib: toast(UndoToast, { id: toastId })
UndoToast->>ToastLib: toast.dismiss(toastId) after onUndo completes
UndoToast->>MainContent: onDismiss -> dispatch(clearUndoToast)
Estimated code review effort🎯 4 (Complex) | ⏱️ ~65 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #154 +/- ##
==========================================
+ Coverage 52.43% 52.56% +0.12%
==========================================
Files 176 177 +1
Lines 4350 4429 +79
Branches 915 920 +5
==========================================
+ Hits 2281 2328 +47
- Misses 1872 1903 +31
- Partials 197 198 +1
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
Actionable comments posted: 5
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
src/renderer/src/components/skills/UnlinkDialog.tsx (1)
107-111: 🧹 Nitpick | 🔵 Trivial | ⚡ Quick win
handleUnlinkの依存配列がコールバック再生成を引き起こしています(Line 139)Line 107-111の
copyは毎レンダー新しいオブジェクトが生成されるため、Line 139の依存配列に含めるとhandleUnlinkは毎回再生成されます。React.memoでコンポーネント化されていても、不安定なコールバック参照が下流への不要な再レンダーを引き起こす可能性があります。copyをuseMemoでメモ化してください。差分案
-import React, { useCallback } from 'react' +import React, { useCallback, useMemo } from 'react' @@ - const copy = getUnlinkCopy( - variant, - skillToUnlink?.skill.name ?? '', - skillToUnlink?.symlink.agentName ?? '', - ) + const copy = useMemo( + () => + getUnlinkCopy( + variant, + skillToUnlink?.skill.name ?? '', + skillToUnlink?.symlink.agentName ?? '', + ), + [variant, skillToUnlink?.skill.name, skillToUnlink?.symlink.agentName], + )🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/renderer/src/components/skills/UnlinkDialog.tsx` around lines 107 - 111, getUnlinkCopyで毎レンダー新しいオブジェクトを作っているためhandleUnlinkの依存配列に入れるとコールバックが毎回再生成されます。解決するには現在のconst copy = getUnlinkCopy(...)をuseMemoでラップして、依存関係にvariant、skillToUnlink?.skill.name、skillToUnlink?.symlink.agentNameだけを入れてメモ化し、handleUnlinkの依存配列にはそのメモ化されたcopyを使うようにしてください(参照シンボル: getUnlinkCopy, copy, handleUnlink)。src/renderer/src/components/layout/MainContent.tsx (1)
404-423:⚠️ Potential issue | 🟠 Major | ⚡ Quick winUndoトーストのdismissで新しいUndo状態を誤って消す競合があります。
Line 404-406 / 421-423 は
clearUndoToast()を無条件実行しているため、先に出したトーストが閉じたタイミングで、後続トーストのundoToastまで消える可能性があります。toastId一致時のみクリアする形にしてください。差分案(このファイル内)
- const handleToastDismissed = (): void => { - dispatch(clearUndoToast()) - } const toastId: ToastId = `bulk-delete-${Date.now()}` + const handleToastDismissed = (): void => { + dispatch(clearUndoToast({ id: toastId })) + }追加実装案(reducer側のガード)
// uiSlice 側のイメージ clearUndoToast: (state, action: PayloadAction<{ id: ToastId }>) => { if (state.undoToast?.id === action.payload.id) { state.undoToast = null } }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/renderer/src/components/layout/MainContent.tsx` around lines 404 - 423, The current handleToastDismissed unconditionally dispatches clearUndoToast(), which can clear a newer toast's state; update handleToastDismissed to dispatch clearUndoToast with the toastId (use the toastId constant captured by the closure) and change the ui reducer clearUndoToast to accept a payload { id: ToastId } and only clear state.undoToast when state.undoToast?.id === action.payload.id; keep the toast invocation (toast(..., { id: toastId, duration: UNDO_WINDOW_MS, onDismiss: handleToastDismissed, onAutoClose: handleToastDismissed })) and ensure the reducer name clearUndoToast and the toastId variable are used to locate the changes.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@eslint.config.mjs`:
- Around line 6-11: 現在の自動有効化ロジック (laststanceReactNextRules =
Object.fromEntries(Object.keys(laststanceReactNextPlugin.rules ?? {}).map(...)))
はプラグイン更新で新ルールが勝手に error 有効化されCI破壊を招くため、laststanceReactNextPlugin.rules
の全キーを使う代わりに明示的なルールリストを用いるよう修正してください — 具体的には laststanceReactNextRules
を自動生成から、既知の許可されたルール名の配列(whitelistedRules など)を定義してその配列を map/fromEntries して
'error' を割り当てるか、既存の Object.keys(...) をフィルタして許可リストに存在するものだけを有効化する実装に置き換えてください。
In `@src/renderer/settings/sections/General.tsx`:
- Around line 161-172: handleSaveCurrentSize currently awaits
window.electron.window.getMainBounds() without catching a rejection, causing
unhandled promise rejections when invoked via handleSaveCurrentSizeClick; wrap
the await in a try/catch inside handleSaveCurrentSize, and in the catch
setIsMainWindowAvailable(false) and return (optionally log the error), ensuring
updateSettings({ windowSize: bounds }) only runs on success and existing
handleSaveCurrentSizeClick can continue to call void handleSaveCurrentSize().
In `@src/renderer/src/components/sidebar/SourceCard.tsx`:
- Around line 51-57: handleRefresh currently fires multiple thunks via
Promise.all but doesn't detect rejection; change handleRefresh into an async
callback that awaits Promise.all of the dispatched thunks' unwrap() results
(e.g., await Promise.all([dispatch(fetchSourceStats()).unwrap(),
dispatch(fetchSkills()).unwrap(), dispatch(fetchAgents()).unwrap()])) and wrap
that await in try/catch to handle failures (notify user/log error inside catch).
Keep useCallback and dispatch references (handleRefresh, fetchSourceStats,
fetchSkills, fetchAgents) and ensure the caller still uses void handleRefresh()
if previously used.
In `@src/renderer/src/components/skills/UndoToast.tsx`:
- Around line 32-34: The JSDoc for UndoToast is out of date: update comment text
around the toastId usage to remove references to onUndoComplete and instead
document that UndoToast (used by MainContent) will dismiss via
toast.dismiss(toastId); specifically, edit the JSDoc entries that mention
onUndoComplete (the blocks around lines referencing the example/description) to
explain the explicit Sonner id (toastId) and show using toast.dismiss(toastId)
as the undo completion mechanism so the docs match the UndoToast component and
its toastId prop.
In `@src/renderer/src/components/UpdateToast.tsx`:
- Around line 41-43: The close-button handler handleCloseButtonClick is not
memoized like the other handlers; either wrap it with useCallback (e.g., create
handleCloseButtonClick = useCallback(() => handleDismiss(), [handleDismiss])) to
match the pattern used for other handlers, or remove the wrapper entirely and
pass handleDismiss directly to the onClick prop; update the reference in the
component (where handleCloseButtonClick is used) to reflect the chosen approach
so handlers remain consistent and stable.
---
Outside diff comments:
In `@src/renderer/src/components/layout/MainContent.tsx`:
- Around line 404-423: The current handleToastDismissed unconditionally
dispatches clearUndoToast(), which can clear a newer toast's state; update
handleToastDismissed to dispatch clearUndoToast with the toastId (use the
toastId constant captured by the closure) and change the ui reducer
clearUndoToast to accept a payload { id: ToastId } and only clear
state.undoToast when state.undoToast?.id === action.payload.id; keep the toast
invocation (toast(..., { id: toastId, duration: UNDO_WINDOW_MS, onDismiss:
handleToastDismissed, onAutoClose: handleToastDismissed })) and ensure the
reducer name clearUndoToast and the toastId variable are used to locate the
changes.
In `@src/renderer/src/components/skills/UnlinkDialog.tsx`:
- Around line 107-111:
getUnlinkCopyで毎レンダー新しいオブジェクトを作っているためhandleUnlinkの依存配列に入れるとコールバックが毎回再生成されます。解決するには現在のconst
copy =
getUnlinkCopy(...)をuseMemoでラップして、依存関係にvariant、skillToUnlink?.skill.name、skillToUnlink?.symlink.agentNameだけを入れてメモ化し、handleUnlinkの依存配列にはそのメモ化されたcopyを使うようにしてください(参照シンボル:
getUnlinkCopy, copy, handleUnlink)。
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: dee2bf2f-a80c-4434-8d10-337e5ca2b330
📒 Files selected for processing (43)
.storybook/stories/Skills.stories.tsxeslint.config.mjssrc/renderer/settings/sections/About.tsxsrc/renderer/settings/sections/Agents.tsxsrc/renderer/settings/sections/General.tsxsrc/renderer/src/App.tsxsrc/renderer/src/components/SkipToMainContentLink.tsxsrc/renderer/src/components/UpdateToast.tsxsrc/renderer/src/components/dashboard/DashboardCanvas.tsxsrc/renderer/src/components/dashboard/DashboardEditToolbar.tsxsrc/renderer/src/components/dashboard/DashboardPageTabs.tsxsrc/renderer/src/components/dashboard/widgets/BookmarksWidget.tsxsrc/renderer/src/components/dashboard/widgets/CoverageWidget.tsxsrc/renderer/src/components/dashboard/widgets/LeaderboardWidget.tsxsrc/renderer/src/components/layout/MainContent.tsxsrc/renderer/src/components/marketplace/InstallModal.tsxsrc/renderer/src/components/marketplace/MarketplaceSearch.tsxsrc/renderer/src/components/marketplace/MarketplaceSkillPreview.tsxsrc/renderer/src/components/marketplace/RankingTabs.tsxsrc/renderer/src/components/marketplace/SkillRowMarketplace.tsxsrc/renderer/src/components/marketplace/SkillsMarketplace.tsxsrc/renderer/src/components/sidebar/AgentDeleteDialog.tsxsrc/renderer/src/components/sidebar/AgentItem.tsxsrc/renderer/src/components/sidebar/AgentsSection.tsxsrc/renderer/src/components/sidebar/BookmarkDetailModal.tsxsrc/renderer/src/components/sidebar/CleanupAgentDialog.tsxsrc/renderer/src/components/sidebar/SidebarFooter.tsxsrc/renderer/src/components/sidebar/SourceCard.tsxsrc/renderer/src/components/sidebar/SyncConfirmDialog.tsxsrc/renderer/src/components/sidebar/SyncConflictDialog.tsxsrc/renderer/src/components/sidebar/SyncResultDialog.tsxsrc/renderer/src/components/skills/AddSymlinkModal.tsxsrc/renderer/src/components/skills/CopyToAgentsModal.tsxsrc/renderer/src/components/skills/FileContent.tsxsrc/renderer/src/components/skills/SearchBox.tsxsrc/renderer/src/components/skills/SelectionToolbar.tsxsrc/renderer/src/components/skills/SkillItem.tsxsrc/renderer/src/components/skills/SkillsList.tsxsrc/renderer/src/components/skills/UndoToast.tsxsrc/renderer/src/components/skills/UnlinkDialog.tsxsrc/renderer/src/components/theme/ThemeSelector.tsxsrc/renderer/src/components/ui/FilterPill.tsxsrc/renderer/src/hooks/useComponentEffect.ts
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
src/renderer/src/components/skills/UndoToast.tsx (1)
103-114: 🧹 Nitpick | 🔵 Trivial | ⚡ Quick winuseCallback の依存配列が派生値と基底値を混在させている。
Line 114 の deps
[canUndo, onUndo, toastId, tombstoneIds]は、派生値canUndo(isUndoableOperation && !isRestoring && remainingMs > 0から計算)と、その計算元であるtombstoneIdsの両方を含んでいる。これにより不要な callback 再生成が発生する。2つの修正案:
案1(推奨):
canUndoの計算をコールバック内に移動し、基底値のみを deps に含める。案2:
canUndoを削除し、基底値[isRestoring, remainingMs, tombstoneIds, onUndo, toastId]を deps に列挙。♻️ 案1の実装例
- const canUndo = isUndoableOperation && !isRestoring && remainingMs > 0 - const handleUndoClick = useCallback(async (): Promise<void> => { + const canUndo = isUndoableOperation && !isRestoring && remainingMs > 0 if (!canUndo) return setIsRestoring(true) try { await onUndo(tombstoneIds) } finally { toast.dismiss(toastId) } - }, [canUndo, onUndo, toastId, tombstoneIds]) + }, [isUndoableOperation, isRestoring, remainingMs, onUndo, toastId, tombstoneIds])Line 160 の
disabled={!canUndo}のため、外側でcanUndoは引き続き必要。🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/renderer/src/components/skills/UndoToast.tsx` around lines 103 - 114, The useCallback for handleUndoClick currently mixes a derived value canUndo with its bases causing needless re-renders; move the canUndo calculation (isUndoableOperation && !isRestoring && remainingMs > 0) into handleUndoClick so the callback uses only base values, keep the external canUndo (used for disabled={!canUndo}) as-is, and update the dependency array of handleUndoClick to the base symbols [isUndoableOperation, isRestoring, remainingMs, tombstoneIds, onUndo, toastId] so the callback only re-creates when underlying inputs change.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/renderer/src/components/skills/CopyToAgentsModal.tsx`:
- Around line 43-45: selectedAgents is currently local state reset in
CopyToAgentsModal via useComponentEffect (setSelectedAgents) and must be moved
to the skills Redux slice: add selectedAgents state to skillsSlice, implement
actions like toggleSelectedAgent(agentId) and clearSelectedAgents(), update
selectors (selectSelectedAgents) and replace all local
useState/setSelectedAgents usage in CopyToAgentsModal to
useSelector(selectSelectedAgents) and dispatch(toggleSelectedAgent(...)) /
dispatch(clearSelectedAgents()) (including the effect that currently resets on
skillToCopy — replace setSelectedAgents([]) with dispatch(clearSelectedAgents())
inside the useComponentEffect). Ensure existing component logic references the
new selector/action names and remove the local selectedAgents state and its
setters.
---
Outside diff comments:
In `@src/renderer/src/components/skills/UndoToast.tsx`:
- Around line 103-114: The useCallback for handleUndoClick currently mixes a
derived value canUndo with its bases causing needless re-renders; move the
canUndo calculation (isUndoableOperation && !isRestoring && remainingMs > 0)
into handleUndoClick so the callback uses only base values, keep the external
canUndo (used for disabled={!canUndo}) as-is, and update the dependency array of
handleUndoClick to the base symbols [isUndoableOperation, isRestoring,
remainingMs, tombstoneIds, onUndo, toastId] so the callback only re-creates when
underlying inputs change.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 894311fb-f862-4063-a3fb-91cd0a0991db
📒 Files selected for processing (9)
eslint.config.mjssrc/renderer/settings/sections/General.tsxsrc/renderer/src/App.tsxsrc/renderer/src/components/UpdateToast.tsxsrc/renderer/src/components/sidebar/SourceCard.tsxsrc/renderer/src/components/skills/AddSymlinkModal.tsxsrc/renderer/src/components/skills/CopyToAgentsModal.tsxsrc/renderer/src/components/skills/UndoToast.tsxsrc/renderer/src/components/ui/FilterPill.tsx
There was a problem hiding this comment.
Actionable comments posted: 2
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
src/renderer/src/redux/slices/skillsSlice.ts (1)
449-455:⚠️ Potential issue | 🟡 Minor | ⚡ Quick wincopyToAgents.fulfilled で Add関連stateをクリアする必要性を確認
Line 452-453 で
skillToAddSymlinksとselectedAddAgentIdsをクリアしていますが、Copy操作は Add操作と独立しているため、Add関連stateをクリアする論理的根拠が不明確です。createSymlinks.fulfilled(436-440) では Add関連stateのみクリアしており、非対称です。2つのモーダルが同時に開かないなら影響は小さいですが、意図的な"全モーダルクリア"ポリシーでない限り、Copy完了時は Copy関連state(
skillToCopy,selectedCopyAgentIds)のみクリアする方が明確です。🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/renderer/src/redux/slices/skillsSlice.ts` around lines 449 - 455, The copyToAgents.fulfilled reducer is clearing Add-related state (skillToAddSymlinks, selectedAddAgentIds) even though Add and Copy are independent; update the copyToAgents.fulfilled handler to only clear copy-related fields (set copying = false, skillToCopy = null, selectedCopyAgentIds = []), leaving skillToAddSymlinks and selectedAddAgentIds untouched (match the asymmetry used in createSymlinks.fulfilled which only clears Add-related state).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/renderer/src/components/skills/CopyToAgentsModal.tsx`:
- Around line 194-202: Wrap handleRowClick in useCallback to keep consistency
with handleToggle: change the plain function handleRowClick to a memoized
callback (useCallback) that calls handleToggle, with the same dependency set
(agentId, disabled, onToggle) or simply [handleToggle] if you prefer; update the
reference where the intrinsic <div> row click handler uses handleRowClick so it
receives the memoized function. Ensure the exported/local symbol names remain
handleRowClick and handleToggle.
- Line 223: The Checkbox handler handleToggle used in CopyToAgentsModal should
accept the Radix signature (checked: boolean | 'indeterminate') => void instead
of () => void; update the handleToggle function declaration (and any references)
to receive a single parameter typed as boolean | 'indeterminate' and simply
ignore or use it as needed, ensuring the onCheckedChange={handleToggle} is
type-safe in the CopyToAgentsModal component.
---
Outside diff comments:
In `@src/renderer/src/redux/slices/skillsSlice.ts`:
- Around line 449-455: The copyToAgents.fulfilled reducer is clearing
Add-related state (skillToAddSymlinks, selectedAddAgentIds) even though Add and
Copy are independent; update the copyToAgents.fulfilled handler to only clear
copy-related fields (set copying = false, skillToCopy = null,
selectedCopyAgentIds = []), leaving skillToAddSymlinks and selectedAddAgentIds
untouched (match the asymmetry used in createSymlinks.fulfilled which only
clears Add-related state).
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: aaba11c7-e6a4-438a-aa49-95c5f3a4ae05
📒 Files selected for processing (5)
src/renderer/src/components/skills/CopyToAgentsModal.tsxsrc/renderer/src/components/skills/SkillsList.browser.test.tsxsrc/renderer/src/redux/selectors.test.tssrc/renderer/src/redux/slices/skillsSlice.test.tssrc/renderer/src/redux/slices/skillsSlice.ts
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/renderer/src/components/skills/CopyToAgentsModal.tsx`:
- Around line 121-141: The JSX currently computes selection/disabled state
inline inside targetAgents.map using occupiedAgentReasonById, selectedAgents,
copying and isSourceUnavailable and passes them to CopyToAgentOption; extract
that conditional logic into a pure helper in agentSelectionHelpers (e.g., a
function buildAgentViewModel(agent, { occupiedAgentReasonById, selectedAgents,
copying, isSourceUnavailable }) that returns { agentId, name, exists, checked,
disabled, occupiedReason }) and change the map to consume the view model and
only render CopyToAgentOption and pass viewModel fields plus onToggle
(handleAgentToggle); apply the same extraction for the similar block around
lines 236-245 so rendering code is purely presentational and the logic is
unit-testable.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: d4ab28b6-e12f-420e-aa17-cba9f44c0a1c
📒 Files selected for processing (1)
src/renderer/src/components/skills/CopyToAgentsModal.tsx
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/renderer/src/components/skills/CopyToAgentsModal.tsx`:
- Around line 46-49: The effect using useComponentEffect currently depends on
the entire skillToCopy object which causes clearCopyAgentSelection() to run on
any reference change; update the dependency to a stable identifier or modal-open
flag instead (e.g., use skillToCopy?.id or an isModalOpen prop/state) so that
clearCopyAgentSelection() only runs when the modal actually opens/closes; keep
the effect and dispatch(clearCopyAgentSelection()) but replace the dependency
array entry skillToCopy with the chosen stable symbol and ensure the modal
open/close lifecycle drives the reset.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 603c7041-53e7-4a0b-82c5-2a28bde7e570
📒 Files selected for processing (3)
src/renderer/src/components/skills/CopyToAgentsModal.tsxsrc/renderer/src/components/skills/agentSelectionHelpers.test.tssrc/renderer/src/components/skills/agentSelectionHelpers.ts
Summary
Validation
Summary by CodeRabbit
リリースノート
新機能
バグ修正
パフォーマンス改善
使い勝手改善