Repository navigation
Conversation
|
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:
📝 WalkthroughWalkthroughAdds backend grouped personal-tasks endpoint and schemas, enriches tasks with team/device metadata, introduces a simple team editor and save utilities, refactors chat input/toolbar and sidebar/history rendering, updates i18n/test infra, and adds many unit/E2E tests. ChangesUnified Feature: Simple editor, grouped tasks, and UI refactors
Estimated code review effort Poem
✨ Finishing Touches🧪 Generate unit tests (beta)
|
There was a problem hiding this comment.
Actionable comments posted: 11
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
docs/superpowers/specs/2026-05-27-agent-simple-edit-design.md (1)
1-135:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winMove Chinese documentation to
docs/zh/directory.This Chinese design specification should be placed in
docs/zh/according to the coding guidelines, which state: "Write Chinese docs first indocs/zh/, then create English versions indocs/en/". The current locationdocs/superpowers/specs/does not follow this convention and will cause inconsistency in documentation organization.As per coding guidelines: Write Chinese docs first in
docs/zh/, then create English versions indocs/en/📁 Suggested relocation
Move this file to:
docs/zh/superpowers/specs/2026-05-27-agent-simple-edit-design.mdThen create the English version at:
docs/en/superpowers/specs/2026-05-27-agent-simple-edit-design.md🤖 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 `@docs/superpowers/specs/2026-05-27-agent-simple-edit-design.md` around lines 1 - 135, The Chinese spec "智能体简洁编辑设计" currently under docs/superpowers/specs should be moved into the Chinese docs folder and an English counterpart created: relocate the file named docs/superpowers/specs/2026-05-27-agent-simple-edit-design.md into docs/zh/superpowers/specs/2026-05-27-agent-simple-edit-design.md (preserve frontmatter like sidebar_position) and add a corresponding English file at docs/en/superpowers/specs/2026-05-27-agent-simple-edit-design.md with the translated content; also scan for and update any internal links or sidebar references that pointed to the old path so navigation and sidebars remain correct.frontend/src/features/tasks/components/chat/QuickAccessCards.tsx (1)
492-507:⚠️ Potential issue | 🟠 Major | ⚡ Quick winUse a semantic button for the quick-create trigger and add a test id.
Line 492 uses a clickable
divfor a primary interaction, which is not keyboard-accessible by default and misses the required interactivedata-testid.Suggested fix
- <div - onClick={handleOpenCreateAgent} + <button + type="button" + onClick={handleOpenCreateAgent} + data-testid="create-agent-button" className="group relative flex flex-col justify-center items-center cursor-pointer transition-all duration-200 border border-dashed border-border bg-base hover:border-primary hover:bg-primary/5 hover:shadow-[0_2px_12px_0_rgba(0,0,0,0.1)]" style={{ width: SMALL_BUTTON_WIDTH, height: 78, padding: '8px 12px', borderRadius: 20, flexShrink: 0, flexGrow: 0, }} > <SparklesIcon className="w-4 h-4 text-primary mb-1 transition-colors" /> <span className="text-[10px] font-medium text-text-primary group-hover:text-primary transition-colors text-center leading-tight"> {t('teams.create_first_team')} </span> - </div> + </button>As per coding guidelines:
Add data-testid attributes to all interactive elements ...and interactive elements should be implemented accessibly.🤖 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 `@frontend/src/features/tasks/components/chat/QuickAccessCards.tsx` around lines 492 - 507, Replace the non-semantic clickable div in QuickAccessCards.tsx with a real <button> element (keep the same className, inline styles, and the onClick handler handleOpenCreateAgent) and set type="button" so it remains non-submit; also add an interactive data-testid like data-testid="quick-create-agent" to that button to satisfy tests and keyboard accessibility (keep SparklesIcon and the span text as-is inside the button).
🧹 Nitpick comments (3)
backend/app/api/endpoints/adapter/tasks.py (1)
183-205: ⚡ Quick winAdd tracing on the new sync endpoint.
get_personal_task_groups_liteis a newly added sync API handler but isn’t decorated with@trace_sync(), so this path won’t be traced consistently with the guideline.As per coding guidelines: "Use
@trace_async()decorator for tracing entire async functions,@trace_sync()for sync functions, andadd_span_event()orset_span_attribute()for telemetry".🤖 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 `@backend/app/api/endpoints/adapter/tasks.py` around lines 183 - 205, The new synchronous endpoint function get_personal_task_groups_lite lacks tracing; add the `@trace_sync`() decorator above its definition and ensure the trace_sync symbol is imported (or available) in that module so the entire handler is traced consistently; alternatively, if you prefer manual spans, call add_span_event() or set_span_attribute() inside get_personal_task_groups_lite at key points, but the preferred fix is to annotate the function with `@trace_sync`() to match the tracing guidelines.frontend/src/features/settings/components/team-edit/simple-team-edit-utils.ts (1)
88-106: Use ofshell.shellTypestrings'Chat'/'ClaudeCode'is consistent with the existing frontend contract (88-106)
resolveShellForExecutor’s checks forshell.shellType === 'Chat'(simple) and=== 'ClaudeCode'(complex) align with other feature logic (e.g.,BotEdit.tsx,chatStreamContext.tsx,ThinkingDisplay.tsx) that uses the same literal values.- Unit tests construct
UnifiedShellobjects withshellType: 'Chat'andshellType: 'ClaudeCode'and assert the resolver returns those shells.Optional: update the misleading inline comment in
frontend/src/apis/shells.ts/frontend/src/types/api.tsthat lists example shell types without including'Chat', since'Chat'is clearly used as a valid shell type in the codebase.🤖 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 `@frontend/src/features/settings/components/team-edit/simple-team-edit-utils.ts` around lines 88 - 106, The comment notes that literal shellType checks in resolveShellForExecutor (function resolveShellForExecutor inspecting shell.shellType === 'Chat' and === 'ClaudeCode') are correct and used across the codebase; fix the misleading example comments in the API/type declarations by updating the example values in the comment(s) in the shells API/type files (referenced in frontend/src/apis/shells.ts and frontend/src/types/api.ts) to include 'Chat' (and 'ClaudeCode' if missing) or reword the comment to say the list is non-exhaustive so it no longer implies those types are invalid; no code changes to resolveShellForExecutor are needed.frontend/src/features/tasks/components/sidebar/TaskSidebar.tsx (1)
511-518: ⚡ Quick winAdd
data-testidto newly introduced interactive elements.These new buttons are interactive but don’t include
data-testid, which makes E2E targeting inconsistent with the project rule.As per coding guidelines: “Add
data-testidattributes to all interactive elements (buttons, inputs, links, selects, etc.) with naming format{action}-{element-type}”.Also applies to: 569-574, 632-635
🤖 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 `@frontend/src/features/tasks/components/sidebar/TaskSidebar.tsx` around lines 511 - 518, The new interactive buttons in TaskSidebar.tsx lack data-testid attributes; add data-testid to each button using the `{action}-{element-type}` convention (e.g., the button that calls handleNewAgentClick should get data-testid="new-agent-button"). Locate the other two buttons referenced in the file (the interactive elements in the blocks around the other diffs) and add appropriate ids derived from their handler names or visible action (e.g., handleNewTaskClick -> "new-task-button", handleAddSomething -> "add-something-button") so all buttons follow the project testid naming rule.
🤖 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 `@backend/app/services/adapters/task_kinds/helpers.py`:
- Around line 530-538: The current public_team_kinds query uses independent .in_
checks for Kind.name and Kind.namespace which allows cross-pairing; instead
construct paired lookups and filter on the (name, namespace) tuple to only match
exact pairs. Build a list of missing_team_pairs from the refs (e.g. [(name,
namespace), ...] derived from missing_team_names and missing_team_namespaces or
the original refs), then replace the separate Kind.name.in_(...) and
Kind.namespace.in_(...) filters with a single tuple_(Kind.name,
Kind.namespace).in_(missing_team_pairs) in the public_team_kinds query so only
exact (name, namespace) combinations are returned.
In
`@frontend/src/features/settings/components/team-edit/simple-team-edit-save.ts`:
- Around line 40-47: getSimpleBotName currently returns `${teamName.trim()}-bot`
even if teamName is only whitespace, producing `-bot`; update getSimpleBotName
to compute a trimmedTeamName = teamName.trim() and if trimmedBotName is empty
return trimmedTeamName-based fallback only when trimmedTeamName is non-empty,
otherwise return a safe default like 'bot' or 'team-bot' (or throw/validate
upstream), so replace the final return to use trimmedTeamName when present and a
sensible default when it's empty.
In `@frontend/src/features/settings/components/team-edit/SimpleTeamEditForm.tsx`:
- Around line 90-110: Extract the duplicated toModelSelectValue and
parseModelSelectValue helpers into a single utility module that exports both
functions, then replace the local implementations in SimpleTeamEditForm.tsx and
SimpleBotCoreConfigForm.tsx with imports from that module; ensure the exported
functions keep the same signatures and behavior (including the '__none__'
sentinel and default namespace handling) and update import statements in both
components to use the shared helpers.
In `@frontend/src/features/settings/components/TeamEditDialog.tsx`:
- Around line 284-288: The current call to
setBindMode(normalizeSimpleBindMode(formTeam)) forces bind_mode to only
chat|code|task and will overwrite custom modes; instead, check
formTeam.bind_mode and if it exists and is not one of the simple modes
('chat','code','task') preserve it by calling setBindMode(formTeam.bind_mode),
otherwise fall back to setBindMode(normalizeSimpleBindMode(formTeam)); use the
same symbols (formTeam, setBindMode, normalizeSimpleBindMode, bind_mode) and
ensure this branch runs when initializing the dialog (alongside
setMode/setAdvancedOpen) so advanced teams retain their original bind_mode.
In `@frontend/src/features/tasks/components/chat/QuickAccessCards.tsx`:
- Around line 343-361: handleCreateAgentClose currently calls _onRefreshTeams on
every dialog close which triggers unnecessary network calls; change the logic to
only call _onRefreshTeams when a team was actually created
(createdTeamRef.current / createdTeam is non-null). Specifically, inside
handleCreateAgentClose, check if createdTeam is truthy before calling
_onRefreshTeams and before calling onTeamSelect with refreshedTeams, and keep
the existing fallback to onTeamSelect(createdTeam) in the catch block; remove
the unconditional refresh/return path so closing/cancel without creation does
not call _onRefreshTeams.
In `@frontend/src/features/tasks/components/input/InputMoreActionsMenu.tsx`:
- Around line 74-78: The ActionButton inside PopoverTrigger currently also
toggles open via its onClick (ActionButton.onClick -> setOpen), which conflicts
with PopoverTrigger's own state handling; remove the onClick handler (the
setOpen toggle) from ActionButton and rely solely on Popover's onOpenChange to
update open via setOpen so there is a single source of truth (refer to
PopoverTrigger, ActionButton, setOpen, and onOpenChange in the component).
In `@frontend/src/features/tasks/components/selector/TeamSelectorButton.tsx`:
- Around line 165-216: Add data-testid attributes to the two interactive footer
controls in TeamSelectorButton: the quick-create control (the div using
SparklesIcon and handleCreateClick) should get data-testid="quick-create-button"
and the settings control (the div using Cog6ToothIcon and
router.push(paths.settings.team.getHref())) should get
data-testid="settings-button"; place these attributes on the divs that already
have role="button" so E2E tests can reliably target them, keeping existing
onClick/onKeyDown behavior unchanged.
- Line 65: Replace the array namespace usage in TeamSelectorButton by calling
useTranslation with a single feature namespace that matches this feature (e.g.,
useTranslation('tasks')) and ensure the hook is imported from
"`@/hooks/useTranslation`" (not from "react-i18next"); then update any translation
keys in TeamSelectorButton that currently rely on the second namespace to use
prefixed keys like "common:..." or "wizard:..." so cross-namespace lookups
remain explicit while keeping the feature namespace single-valued.
In `@frontend/src/features/tasks/components/sidebar/TaskListSection.tsx`:
- Around line 729-734: The show-more toggle button in TaskListSection uses
`h-8`, which is below the 44×44 touch target; update the button's className on
the element with data-testid="task-list-section-show-more" (inside
TaskListSection component) to use mobile-compliant sizing by replacing `h-8`
with `h-11 min-w-[44px]` while preserving the rest of the classes, attributes,
and the onClick behavior.
In `@frontend/src/features/tasks/components/sidebar/TaskSidebar.tsx`:
- Around line 395-405: The Button components (e.g., the Button with
data-testid="task-sidebar-more-button" that calls openMoreNavigation(menuId))
use small height classes like h-8/h-7 which violate the 44×44 mobile minimum;
update their className to use the recommended sizing (replace h-8 or h-7 with
h-11 and add min-w-[44px]) so each interactive element meets the mobile target,
and apply the same change to the other Button instances mentioned (around the
other occurrences at the same component: the blocks referenced in the review:
569-574 and 1103-1109).
In `@frontend/src/features/tasks/contexts/taskContext.tsx`:
- Around line 272-277: The pagination termination is wrong: change the hasMore
computation so it becomes false when the last loaded page is not full. Replace
the current condition (using flattenTaskHistoryGroups(results[results.length -
1]?.items || []).length > 0) with a check that the length equals the page size
used for loading pages (e.g., flattenTaskHistoryGroups(...).length === pageSize
or === personalTasksPageSize), so hasMore only stays true when the last page is
full; update the hasMore assignment in the same block where results, pagesArr
and allItems are assembled (referencing flattenTaskHistoryGroups and the
hasMore/hasMorePersonalTasks usage).
---
Outside diff comments:
In `@docs/superpowers/specs/2026-05-27-agent-simple-edit-design.md`:
- Around line 1-135: The Chinese spec "智能体简洁编辑设计" currently under
docs/superpowers/specs should be moved into the Chinese docs folder and an
English counterpart created: relocate the file named
docs/superpowers/specs/2026-05-27-agent-simple-edit-design.md into
docs/zh/superpowers/specs/2026-05-27-agent-simple-edit-design.md (preserve
frontmatter like sidebar_position) and add a corresponding English file at
docs/en/superpowers/specs/2026-05-27-agent-simple-edit-design.md with the
translated content; also scan for and update any internal links or sidebar
references that pointed to the old path so navigation and sidebars remain
correct.
In `@frontend/src/features/tasks/components/chat/QuickAccessCards.tsx`:
- Around line 492-507: Replace the non-semantic clickable div in
QuickAccessCards.tsx with a real <button> element (keep the same className,
inline styles, and the onClick handler handleOpenCreateAgent) and set
type="button" so it remains non-submit; also add an interactive data-testid like
data-testid="quick-create-agent" to that button to satisfy tests and keyboard
accessibility (keep SparklesIcon and the span text as-is inside the button).
---
Nitpick comments:
In `@backend/app/api/endpoints/adapter/tasks.py`:
- Around line 183-205: The new synchronous endpoint function
get_personal_task_groups_lite lacks tracing; add the `@trace_sync`() decorator
above its definition and ensure the trace_sync symbol is imported (or available)
in that module so the entire handler is traced consistently; alternatively, if
you prefer manual spans, call add_span_event() or set_span_attribute() inside
get_personal_task_groups_lite at key points, but the preferred fix is to
annotate the function with `@trace_sync`() to match the tracing guidelines.
In
`@frontend/src/features/settings/components/team-edit/simple-team-edit-utils.ts`:
- Around line 88-106: The comment notes that literal shellType checks in
resolveShellForExecutor (function resolveShellForExecutor inspecting
shell.shellType === 'Chat' and === 'ClaudeCode') are correct and used across the
codebase; fix the misleading example comments in the API/type declarations by
updating the example values in the comment(s) in the shells API/type files
(referenced in frontend/src/apis/shells.ts and frontend/src/types/api.ts) to
include 'Chat' (and 'ClaudeCode' if missing) or reword the comment to say the
list is non-exhaustive so it no longer implies those types are invalid; no code
changes to resolveShellForExecutor are needed.
In `@frontend/src/features/tasks/components/sidebar/TaskSidebar.tsx`:
- Around line 511-518: The new interactive buttons in TaskSidebar.tsx lack
data-testid attributes; add data-testid to each button using the
`{action}-{element-type}` convention (e.g., the button that calls
handleNewAgentClick should get data-testid="new-agent-button"). Locate the other
two buttons referenced in the file (the interactive elements in the blocks
around the other diffs) and add appropriate ids derived from their handler names
or visible action (e.g., handleNewTaskClick -> "new-task-button",
handleAddSomething -> "add-something-button") so all buttons follow the project
testid naming rule.
🪄 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: defaults
Review profile: CHILL
Plan: Pro
Run ID: 0d694998-1101-426f-aa4a-32b244301c85
📒 Files selected for processing (65)
backend/app/api/endpoints/adapter/tasks.pybackend/app/schemas/task.pybackend/app/services/adapters/task_kinds/helpers.pybackend/app/services/adapters/task_kinds/queries.pybackend/tests/services/test_task_lite_batch_loading.pydocs/superpowers/specs/2026-05-27-agent-simple-edit-design.mdfrontend/jest.config.tsfrontend/src/__mocks__/jspdf-stub.tsfrontend/src/__tests__/features/projects/components/project-sidebar-behavior.test.tsxfrontend/src/__tests__/features/settings/components/SimpleTeamEditDialog.test.tsxfrontend/src/__tests__/features/settings/components/TeamEditDialog.display-name.test.tsxfrontend/src/__tests__/features/settings/components/team-edit/ExecutorModeSelector.test.tsxfrontend/src/__tests__/features/settings/components/team-edit/SimpleBotCoreConfigForm.test.tsxfrontend/src/__tests__/features/settings/components/team-edit/TeamBindModeCards.test.tsxfrontend/src/__tests__/features/settings/components/team-edit/simple-team-edit-save.test.tsfrontend/src/__tests__/features/settings/components/team-edit/simple-team-edit-utils.test.tsfrontend/src/__tests__/features/tasks/components/chat/QuickAccessCards.test.tsxfrontend/src/__tests__/features/tasks/components/chat/context-selector.test.tsxfrontend/src/__tests__/features/tasks/components/input/ChatInputControls.toolbar.test.tsxfrontend/src/__tests__/features/tasks/components/input/chat-context-visibility.test.tsxfrontend/src/__tests__/features/tasks/components/message/MessageBubble.test.tsxfrontend/src/__tests__/features/tasks/components/sidebar/TaskListSection.test.tsxfrontend/src/__tests__/features/tasks/components/sidebar/TaskSidebar.test.tsxfrontend/src/__tests__/features/tasks/contexts/taskContext.group-loading.test.tsxfrontend/src/__tests__/i18n/missing-console-keys.test.tsfrontend/src/apis/tasks.tsfrontend/src/features/projects/components/ProjectSection.tsxfrontend/src/features/settings/components/McpConfigSection.tsxfrontend/src/features/settings/components/TeamApiCallButton.tsxfrontend/src/features/settings/components/TeamEditDialog.tsxfrontend/src/features/settings/components/TeamList.tsxfrontend/src/features/settings/components/knowledge/KnowledgeBaseMultiSelector.tsxfrontend/src/features/settings/components/team-edit/ExecutorModeSelector.tsxfrontend/src/features/settings/components/team-edit/SimpleBotCoreConfigForm.tsxfrontend/src/features/settings/components/team-edit/SimpleConfigLayout.tsxfrontend/src/features/settings/components/team-edit/SimpleTeamEditForm.tsxfrontend/src/features/settings/components/team-edit/TeamBindModeCards.tsxfrontend/src/features/settings/components/team-edit/index.tsfrontend/src/features/settings/components/team-edit/simple-team-edit-save.tsfrontend/src/features/settings/components/team-edit/simple-team-edit-utils.tsfrontend/src/features/tasks/components/CorrectionModeToggle.tsxfrontend/src/features/tasks/components/chat/AddContextButton.tsxfrontend/src/features/tasks/components/chat/ChatContextInput.tsxfrontend/src/features/tasks/components/chat/ContextSelector.tsxfrontend/src/features/tasks/components/chat/QuickAccessCards.tsxfrontend/src/features/tasks/components/clarification/ClarificationToggle.tsxfrontend/src/features/tasks/components/input/AgentSkillSelectorMenu.tsxfrontend/src/features/tasks/components/input/ChatInputControls.tsxfrontend/src/features/tasks/components/input/CodeModeButton.tsxfrontend/src/features/tasks/components/input/InputMoreActionsMenu.tsxfrontend/src/features/tasks/components/message/MessageBubble.tsxfrontend/src/features/tasks/components/selector/TeamSelectorButton.tsxfrontend/src/features/tasks/components/sidebar/TaskListSection.tsxfrontend/src/features/tasks/components/sidebar/TaskSidebar.tsxfrontend/src/features/tasks/contexts/taskContext.tsxfrontend/src/i18n/locales/en/common.jsonfrontend/src/i18n/locales/en/feed.jsonfrontend/src/i18n/locales/en/settings.jsonfrontend/src/i18n/locales/en/wizard.jsonfrontend/src/i18n/locales/zh-CN/common.jsonfrontend/src/i18n/locales/zh-CN/feed.jsonfrontend/src/i18n/locales/zh-CN/settings.jsonfrontend/src/i18n/locales/zh-CN/wizard.jsonfrontend/src/lib/runtime-config.tsfrontend/src/types/api.ts
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (1)
backend/app/services/adapters/task_kinds/queries.py (1)
158-163:set()passed to_filter_personal_tasksis redundant for personal queries
get_personal_task_ids_and_totalpulls IDs/count using_PERSONAL_COUNT_SQL/_PERSONAL_IDS_SQL, both of which includek.is_group_chat = 0, sotaskswill never contain group tasks; thetask.id in all_group_task_idsskip path won’t affect this result. Also,restore_task_ordercapsordered_taskstolimit, somax(total_personal, len(ordered_tasks))appears unnecessary (though harmless).🤖 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 `@backend/app/services/adapters/task_kinds/queries.py` around lines 158 - 163, The call to _filter_personal_tasks with an empty set() is redundant because get_personal_task_ids_and_total already restricts results to personal tasks via _PERSONAL_COUNT_SQL/_PERSONAL_IDS_SQL, so remove the empty set argument when calling _filter_personal_tasks (i.e., call self._filter_personal_tasks(tasks, types) or adjust signature usage accordingly) and simplify the returned total to use total_personal directly (replace max(total_personal, len(ordered_tasks)) with total_personal) while keeping the restore_task_order and build_lite_task_list calls unchanged.
🤖 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
`@frontend/src/features/settings/components/team-edit/simple-team-edit-utils.ts`:
- Around line 118-120: The early return when mode === 'custom' skips validation
and lets code/task binds use non-ClaudeCode executors; change the branch in the
function that checks mode to additionally validate the selected custom executor
(the selected custom shell/executor variable used in this file) whenever the
bind mode is 'code' or 'task', and only return { mode, reason: null } if that
selected executor equals the ClaudeCode executor identifier; otherwise return a
validation error reason (or disallow saving) so non-ClaudeCode executors cannot
be used for 'code'/'task' binds.
In `@frontend/src/features/settings/components/TeamList.tsx`:
- Around line 548-560: The device filter button in TeamList.tsx (the button that
sets modeFilter to 'task' and uses CpuChipIcon) is below the required mobile
touch size; update its className to include the mobile minimum sizing by adding
h-11 and min-w-[44px] (e.g., append "h-11 min-w-[44px]" to the existing classes)
so the interactive target meets the 44×44px guideline while preserving the
existing conditional bg/text classes.
---
Nitpick comments:
In `@backend/app/services/adapters/task_kinds/queries.py`:
- Around line 158-163: The call to _filter_personal_tasks with an empty set() is
redundant because get_personal_task_ids_and_total already restricts results to
personal tasks via _PERSONAL_COUNT_SQL/_PERSONAL_IDS_SQL, so remove the empty
set argument when calling _filter_personal_tasks (i.e., call
self._filter_personal_tasks(tasks, types) or adjust signature usage accordingly)
and simplify the returned total to use total_personal directly (replace
max(total_personal, len(ordered_tasks)) with total_personal) while keeping the
restore_task_order and build_lite_task_list calls unchanged.
🪄 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: defaults
Review profile: CHILL
Plan: Pro
Run ID: 3754485f-960b-482c-903e-c3a04b05b094
📒 Files selected for processing (42)
backend/app/api/endpoints/adapter/tasks.pybackend/app/services/adapters/task_kinds/helpers.pybackend/app/services/adapters/task_kinds/queries.pybackend/app/services/adapters/task_kinds/query_utils.pybackend/tests/services/test_task_group_lite_db_pagination.pybackend/tests/services/test_task_lite_batch_loading.pyfrontend/src/__tests__/features/settings/components/SettingsTabNav.navigation.test.tsxfrontend/src/__tests__/features/settings/components/SimpleTeamEditDialog.test.tsxfrontend/src/__tests__/features/settings/components/TeamEditDialog.display-name.test.tsxfrontend/src/__tests__/features/settings/components/TeamList.mode-filter.test.tsxfrontend/src/__tests__/features/settings/components/team-edit/ExecutorModeSelector.test.tsxfrontend/src/__tests__/features/settings/components/team-edit/TeamBindModeCards.test.tsxfrontend/src/__tests__/features/settings/components/team-edit/simple-team-edit-save.test.tsfrontend/src/__tests__/features/settings/components/team-edit/simple-team-edit-utils.test.tsfrontend/src/__tests__/features/tasks/components/chat/QuickAccessCards.test.tsxfrontend/src/__tests__/features/tasks/components/selector/TeamSelectorButton.test.tsxfrontend/src/__tests__/features/tasks/components/selector/team-selector-utils.test.tsfrontend/src/__tests__/features/tasks/components/sidebar/TaskListSection.test.tsxfrontend/src/__tests__/features/tasks/components/sidebar/TaskSidebar.test.tsxfrontend/src/__tests__/features/tasks/contexts/taskContext.group-loading.test.tsxfrontend/src/apis/shells.tsfrontend/src/features/settings/components/SettingsTabNav.tsxfrontend/src/features/settings/components/TeamEditDialog.tsxfrontend/src/features/settings/components/TeamList.tsxfrontend/src/features/settings/components/team-edit/ExecutorModeSelector.tsxfrontend/src/features/settings/components/team-edit/SimpleBotCoreConfigForm.tsxfrontend/src/features/settings/components/team-edit/SimpleTeamEditForm.tsxfrontend/src/features/settings/components/team-edit/TeamBindModeCards.tsxfrontend/src/features/settings/components/team-edit/model-select-utils.tsfrontend/src/features/settings/components/team-edit/simple-choice-card-styles.tsfrontend/src/features/settings/components/team-edit/simple-team-edit-save.tsfrontend/src/features/settings/components/team-edit/simple-team-edit-utils.tsfrontend/src/features/tasks/components/chat/QuickAccessCards.tsxfrontend/src/features/tasks/components/input/InputMoreActionsMenu.tsxfrontend/src/features/tasks/components/selector/TeamSelectorButton.tsxfrontend/src/features/tasks/components/selector/team-selector-utils.tsfrontend/src/features/tasks/components/sidebar/TaskListSection.tsxfrontend/src/features/tasks/components/sidebar/TaskSidebar.tsxfrontend/src/features/tasks/contexts/taskContext.tsxfrontend/src/i18n/locales/en/settings.jsonfrontend/src/i18n/locales/zh-CN/settings.jsonfrontend/src/types/api.ts
💤 Files with no reviewable changes (1)
- frontend/src/features/tasks/components/input/InputMoreActionsMenu.tsx
✅ Files skipped from review due to trivial changes (4)
- frontend/src/apis/shells.ts
- frontend/src/i18n/locales/en/settings.json
- frontend/src/features/settings/components/team-edit/simple-choice-card-styles.ts
- frontend/src/i18n/locales/zh-CN/settings.json
🚧 Files skipped from review as they are similar to previous changes (17)
- frontend/src/features/settings/components/team-edit/ExecutorModeSelector.tsx
- backend/app/api/endpoints/adapter/tasks.py
- frontend/src/tests/features/settings/components/team-edit/simple-team-edit-save.test.ts
- frontend/src/tests/features/tasks/components/chat/QuickAccessCards.test.tsx
- frontend/src/tests/features/settings/components/team-edit/simple-team-edit-utils.test.ts
- frontend/src/tests/features/tasks/components/sidebar/TaskListSection.test.tsx
- frontend/src/features/tasks/components/selector/TeamSelectorButton.tsx
- frontend/src/features/settings/components/team-edit/TeamBindModeCards.tsx
- frontend/src/features/tasks/components/sidebar/TaskListSection.tsx
- frontend/src/features/settings/components/team-edit/SimpleTeamEditForm.tsx
- frontend/src/features/settings/components/team-edit/simple-team-edit-save.ts
- frontend/src/types/api.ts
- frontend/src/features/tasks/components/chat/QuickAccessCards.tsx
- frontend/src/features/settings/components/team-edit/SimpleBotCoreConfigForm.tsx
- frontend/src/features/settings/components/TeamEditDialog.tsx
- backend/tests/services/test_task_lite_batch_loading.py
- frontend/src/features/tasks/components/sidebar/TaskSidebar.tsx
| if (mode === 'custom') { | ||
| return { mode, reason: null } | ||
| } |
There was a problem hiding this comment.
Avoid bypassing ClaudeCode enforcement for custom executor in code/task bind modes.
This branch allows custom to pass without validating the selected custom shell type, so code/task can be saved with a non-ClaudeCode executor.
Suggested fix
- if (mode === 'custom') {
- return { mode, reason: null }
- }
+ if (mode === 'custom') {
+ const customShell = resolveShellForExecutor(shells, 'custom', customShellName)
+ if (isClaudeCodeShell(customShell)) {
+ return { mode, reason: null }
+ }
+
+ const complexShell = resolveShellForExecutor(shells, 'complex')
+ if (complexShell) {
+ return { mode: 'complex', reason: 'requires_claude_code' }
+ }
+
+ return { mode, reason: 'requires_claude_code' }
+ }🤖 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
`@frontend/src/features/settings/components/team-edit/simple-team-edit-utils.ts`
around lines 118 - 120, The early return when mode === 'custom' skips validation
and lets code/task binds use non-ClaudeCode executors; change the branch in the
function that checks mode to additionally validate the selected custom executor
(the selected custom shell/executor variable used in this file) whenever the
bind mode is 'code' or 'task', and only return { mode, reason: null } if that
selected executor equals the ClaudeCode executor identifier; otherwise return a
validation error reason (or disallow saving) so non-ClaudeCode executors cannot
be used for 'code'/'task' binds.
| <button | ||
| type="button" | ||
| onClick={() => setModeFilter('task')} | ||
| data-testid="team-mode-filter-device" | ||
| className={`flex items-center gap-1.5 px-3 py-1.5 text-sm font-medium rounded-md transition-colors ${ | ||
| modeFilter === 'task' | ||
| ? 'bg-primary text-white' | ||
| : 'bg-muted text-text-secondary hover:text-text-primary hover:bg-hover' | ||
| }`} | ||
| > | ||
| <CpuChipIcon className="w-4 h-4" /> | ||
| {t('settings:team.list.filterDevice')} | ||
| </button> |
There was a problem hiding this comment.
Increase mobile touch target size for the new device mode button.
The new filter button is smaller than the required minimum interactive size, which can hurt mobile usability.
Suggested fix
- className={`flex items-center gap-1.5 px-3 py-1.5 text-sm font-medium rounded-md transition-colors ${
+ className={`flex h-11 min-w-[44px] items-center gap-1.5 px-3 text-sm font-medium rounded-md transition-colors ${📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| <button | |
| type="button" | |
| onClick={() => setModeFilter('task')} | |
| data-testid="team-mode-filter-device" | |
| className={`flex items-center gap-1.5 px-3 py-1.5 text-sm font-medium rounded-md transition-colors ${ | |
| modeFilter === 'task' | |
| ? 'bg-primary text-white' | |
| : 'bg-muted text-text-secondary hover:text-text-primary hover:bg-hover' | |
| }`} | |
| > | |
| <CpuChipIcon className="w-4 h-4" /> | |
| {t('settings:team.list.filterDevice')} | |
| </button> | |
| <button | |
| type="button" | |
| onClick={() => setModeFilter('task')} | |
| data-testid="team-mode-filter-device" | |
| className={`flex h-11 min-w-[44px] items-center gap-1.5 px-3 text-sm font-medium rounded-md transition-colors ${ | |
| modeFilter === 'task' | |
| ? 'bg-primary text-white' | |
| : 'bg-muted text-text-secondary hover:text-text-primary hover:bg-hover' | |
| }`} | |
| > | |
| <CpuChipIcon className="w-4 h-4" /> | |
| {t('settings:team.list.filterDevice')} | |
| </button> |
🤖 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 `@frontend/src/features/settings/components/TeamList.tsx` around lines 548 -
560, The device filter button in TeamList.tsx (the button that sets modeFilter
to 'task' and uses CpuChipIcon) is below the required mobile touch size; update
its className to include the mobile minimum sizing by adding h-11 and
min-w-[44px] (e.g., append "h-11 min-w-[44px]" to the existing classes) so the
interactive target meets the 44×44px guideline while preserving the existing
conditional bg/text classes.
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (2)
frontend/e2e/tests/tasks/chat-image-browser-e2e.spec.ts (2)
342-521: 🏗️ Heavy liftSplit
selectTestTeaminto smaller strategy helpers.
selectTestTeamis now very large and handles many responsibilities in one function, which makes maintenance and failures harder to reason about.As per coding guidelines, "Maximum 50 lines per function (preferred) in Python and TypeScript code".
🤖 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 `@frontend/e2e/tests/tasks/chat-image-browser-e2e.spec.ts` around lines 342 - 521, The selectTestTeam function is too large; refactor by extracting each selection strategy into its own async helper that returns a boolean and is invoked by a small orchestrator in selectTestTeam. Create helpers named strategyCurrentAgentSelector(page), strategyQuickAccessCards(page), strategyTeamSelectorButton(page), strategyTeamSelectorByText(page), strategyDataTourSelector(page), and strategyDirectTeamCard(page) that encapsulate the logic for the corresponding blocks (use the existing locators and dismissOnboardingTour calls), keep screenshot/error handling in selectTestTeam, and have selectTestTeam call each helper in order and return true as soon as one returns true or false after all fail. Ensure each helper preserves the same timeouts, clicks, and waits and only references TEST_TEAM_NAME and page.
330-335: ⚡ Quick winReplace fixed sleep with state-based waiting in navigation helper.
Line 334 uses a fixed
waitForTimeout(1500), which is brittle under variable CI timing. Waiting for a concrete ready element is more reliable.Suggested change
async function gotoChatWithTestTeam(page: Page): Promise<void> { await skipOnboardingTour(page) await page.goto(`/chat?teamId=${createdTeamId}`) - await page.waitForLoadState('domcontentloaded') - await page.waitForTimeout(1500) + await page.waitForLoadState('networkidle') + await expect(page.locator('[data-testid="message-input"]')).toBeVisible({ timeout: 15000 }) }🤖 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 `@frontend/e2e/tests/tasks/chat-image-browser-e2e.spec.ts` around lines 330 - 335, In gotoChatWithTestTeam replace the brittle fixed sleep (page.waitForTimeout(1500)) with a state-based wait: after page.goto and waitForLoadState('domcontentloaded') wait for a concrete ready element that indicates the chat UI is usable (for example the chat message list or message input) using page.waitForSelector('<chat-ready-selector>') or equivalent; update the function (which calls skipOnboardingTour and uses createdTeamId) to await that selector so tests proceed only when the chat UI is fully rendered instead of relying on a timeout.
🤖 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 `@frontend/e2e/tests/tasks/chat-image-browser-e2e.spec.ts`:
- Around line 100-101: Replace the full JSON dump of lastCapturedRequests with a
sanitized summary: in the block that currently calls console.log('Captured
requests:', JSON.stringify(lastCapturedRequests, null, 2)) and then throws
Error('No chat completion request captured by mock model server'), redact or
omit request bodies and headers (especially base64 image data), and log only
non-sensitive metadata such as request counts, endpoints, HTTP methods, status
codes, and truncated body sizes (or first N chars) for lastCapturedRequests;
keep the thrown Error but change its message if needed to reference the
sanitized summary so CI logs do not contain full payloads.
---
Nitpick comments:
In `@frontend/e2e/tests/tasks/chat-image-browser-e2e.spec.ts`:
- Around line 342-521: The selectTestTeam function is too large; refactor by
extracting each selection strategy into its own async helper that returns a
boolean and is invoked by a small orchestrator in selectTestTeam. Create helpers
named strategyCurrentAgentSelector(page), strategyQuickAccessCards(page),
strategyTeamSelectorButton(page), strategyTeamSelectorByText(page),
strategyDataTourSelector(page), and strategyDirectTeamCard(page) that
encapsulate the logic for the corresponding blocks (use the existing locators
and dismissOnboardingTour calls), keep screenshot/error handling in
selectTestTeam, and have selectTestTeam call each helper in order and return
true as soon as one returns true or false after all fail. Ensure each helper
preserves the same timeouts, clicks, and waits and only references
TEST_TEAM_NAME and page.
- Around line 330-335: In gotoChatWithTestTeam replace the brittle fixed sleep
(page.waitForTimeout(1500)) with a state-based wait: after page.goto and
waitForLoadState('domcontentloaded') wait for a concrete ready element that
indicates the chat UI is usable (for example the chat message list or message
input) using page.waitForSelector('<chat-ready-selector>') or equivalent; update
the function (which calls skipOnboardingTour and uses createdTeamId) to await
that selector so tests proceed only when the chat UI is fully rendered instead
of relying on a timeout.
🪄 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: defaults
Review profile: CHILL
Plan: Pro
Run ID: 8ef0331b-5196-4a27-a43d-50bd5695a4d2
📒 Files selected for processing (1)
frontend/e2e/tests/tasks/chat-image-browser-e2e.spec.ts
| console.log('Captured requests:', JSON.stringify(lastCapturedRequests, null, 2)) | ||
| throw new Error('No chat completion request captured by mock model server') |
There was a problem hiding this comment.
Avoid dumping full captured request payloads to logs.
Line 100 can print full message bodies (including base64 image data and headers), which risks sensitive-data leakage and can flood CI logs on failures.
Suggested change
- console.log('Captured requests:', JSON.stringify(lastCapturedRequests, null, 2))
+ console.log(
+ 'Captured requests summary:',
+ lastCapturedRequests.map(req => ({
+ timestamp: req.timestamp,
+ method: req.method,
+ url: req.url,
+ messageCount: req.body?.messages?.length ?? 0,
+ }))
+ )📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| console.log('Captured requests:', JSON.stringify(lastCapturedRequests, null, 2)) | |
| throw new Error('No chat completion request captured by mock model server') | |
| console.log( | |
| 'Captured requests summary:', | |
| lastCapturedRequests.map(req => ({ | |
| timestamp: req.timestamp, | |
| method: req.method, | |
| url: req.url, | |
| messageCount: req.body?.messages?.length ?? 0, | |
| })) | |
| ) | |
| throw new Error('No chat completion request captured by mock model server') |
🤖 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 `@frontend/e2e/tests/tasks/chat-image-browser-e2e.spec.ts` around lines 100 -
101, Replace the full JSON dump of lastCapturedRequests with a sanitized
summary: in the block that currently calls console.log('Captured requests:',
JSON.stringify(lastCapturedRequests, null, 2)) and then throws Error('No chat
completion request captured by mock model server'), redact or omit request
bodies and headers (especially base64 image data), and log only non-sensitive
metadata such as request counts, endpoints, HTTP methods, status codes, and
truncated body sizes (or first N chars) for lastCapturedRequests; keep the
thrown Error but change its message if needed to reference the sanitized summary
so CI logs do not contain full payloads.
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)
frontend/src/features/tasks/contexts/taskContext.tsx (1)
257-262:⚠️ Potential issue | 🟠 Major | ⚡ Quick winDeduplicate newly fetched group tasks against each other before appending.
loadedItems.filter(...)only checks IDs already in previous state. If fetched pages overlap, duplicates insideloadedItemscan still be appended.Proposed patch
setGroupTasks(prev => { - const existingIds = new Set(prev.map(t => t.id)) - const newItems = loadedItems.filter(t => !existingIds.has(t.id)) + const existingIds = new Set(prev.map(t => t.id)) + const newItems = loadedItems.filter(t => { + if (existingIds.has(t.id)) return false + existingIds.add(t.id) + return true + }) return [...prev, ...newItems] })🤖 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 `@frontend/src/features/tasks/contexts/taskContext.tsx` around lines 257 - 262, The current append logic in setGroupTasks adds loadedItems without deduplicating among themselves, so duplicates from overlapping fetched pages can be appended; update the handler that calls setGroupTasks (the block using loadedItems and loadedPagesToAdd) to first deduplicate loadedItems by id (e.g., build a Set/Map of seen ids and filter loadedItems to unique ids) and then filter those unique loadedItems against existingIds before returning [...prev, ...newItems], ensuring newItems are unique both vs. prev and vs. each other.
🧹 Nitpick comments (1)
frontend/src/features/settings/components/teams/TeamIconPicker.tsx (1)
40-40: ⚡ Quick winAlign
data-testidnames with the required{action}-{element-type}pattern.Current IDs are descriptive but not in the mandated format. Please rename them to an action-first pattern for consistency across E2E selectors.
Proposed patch
- data-testid="team-icon-picker-trigger" + data-testid="open-button" @@ - data-testid={`team-icon-option-${iconConfig.id}`} + data-testid={`select-button-${iconConfig.id}`}As per coding guidelines, "Add
data-testidattributes to all interactive elements (buttons, inputs, links, selects, etc.) with naming format{action}-{element-type}".Also applies to: 71-71
🤖 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 `@frontend/src/features/settings/components/teams/TeamIconPicker.tsx` at line 40, Rename the current data-testid attributes in the TeamIconPicker component to follow the required "{action}-{element-type}" pattern: locate the data-testid on the picker trigger in TeamIconPicker and change it to an action-first name (e.g., "open-button" or "open-picker-button"), and also rename the second data-testid used for the icon/select control (the attribute around the icon button/select inside TeamIconPicker) to a matching action-first name (e.g., "select-icon-button" or "choose-icon-control"); update any tests or references that rely on the old test ids to use the new names.
🤖 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 `@frontend/src/features/tasks/components/sidebar/TaskSidebar.tsx`:
- Around line 952-961: The TaskSidebar.tsx file is growing too large; extract
the TaskHistorySection and FixedGroupChatsSection components into their own
modules to keep TaskSidebar small. Create two new files exporting the components
(e.g., TaskHistorySection.tsx and FixedGroupChatsSection.tsx), move the
component definitions and any local helper functions/props types they use into
those files, update imports in TaskSidebar to import TaskHistorySection and
FixedGroupChatsSection, and ensure any shared types or utilities referenced by
both are either re-exported from a common module or imported from their original
locations; run type checks to fix any broken imports or missing props.
---
Outside diff comments:
In `@frontend/src/features/tasks/contexts/taskContext.tsx`:
- Around line 257-262: The current append logic in setGroupTasks adds
loadedItems without deduplicating among themselves, so duplicates from
overlapping fetched pages can be appended; update the handler that calls
setGroupTasks (the block using loadedItems and loadedPagesToAdd) to first
deduplicate loadedItems by id (e.g., build a Set/Map of seen ids and filter
loadedItems to unique ids) and then filter those unique loadedItems against
existingIds before returning [...prev, ...newItems], ensuring newItems are
unique both vs. prev and vs. each other.
---
Nitpick comments:
In `@frontend/src/features/settings/components/teams/TeamIconPicker.tsx`:
- Line 40: Rename the current data-testid attributes in the TeamIconPicker
component to follow the required "{action}-{element-type}" pattern: locate the
data-testid on the picker trigger in TeamIconPicker and change it to an
action-first name (e.g., "open-button" or "open-picker-button"), and also rename
the second data-testid used for the icon/select control (the attribute around
the icon button/select inside TeamIconPicker) to a matching action-first name
(e.g., "select-icon-button" or "choose-icon-control"); update any tests or
references that rely on the old test ids to use the new names.
🪄 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: defaults
Review profile: CHILL
Plan: Pro
Run ID: 39310a19-7751-4adf-9853-ccf43be2fb43
⛔ Files ignored due to path filters (1)
knowledge_runtime/uv.lockis excluded by!**/*.lock
📒 Files selected for processing (13)
frontend/src/__tests__/features/settings/components/SimpleTeamEditDialog.test.tsxfrontend/src/__tests__/features/settings/constants/team-icons.test.tsfrontend/src/__tests__/features/tasks/components/sidebar/TaskListSection.test.tsxfrontend/src/__tests__/features/tasks/components/sidebar/TaskSidebar.test.tsxfrontend/src/__tests__/features/tasks/contexts/taskContext.group-loading.test.tsxfrontend/src/features/settings/components/team-edit/SimpleTeamEditForm.tsxfrontend/src/features/settings/components/teams/TeamIconPicker.tsxfrontend/src/features/settings/constants/team-icons.tsfrontend/src/features/tasks/components/sidebar/TaskListSection.tsxfrontend/src/features/tasks/components/sidebar/TaskSidebar.tsxfrontend/src/features/tasks/contexts/taskContext.tsxfrontend/src/types/api.tsknowledge_runtime/pyproject.toml
💤 Files with no reviewable changes (1)
- frontend/src/types/api.ts
🚧 Files skipped from review as they are similar to previous changes (3)
- frontend/src/tests/features/settings/components/SimpleTeamEditDialog.test.tsx
- frontend/src/features/tasks/components/sidebar/TaskListSection.tsx
- frontend/src/features/settings/components/team-edit/SimpleTeamEditForm.tsx
There was a problem hiding this comment.
🧹 Nitpick comments (1)
.github/workflows/e2e-tests.yml (1)
78-78: ⚡ Quick winPin action to a specific commit SHA for supply chain security.
The
actions/setup-python@v5action uses a tag reference rather than a commit SHA. Pinning to a SHA prevents potential supply chain attacks if the tag is moved to malicious code.🔒 Proposed fix to pin the action
- - name: Set up Python - uses: actions/setup-python@v5 + - name: Set up Python + uses: actions/setup-python@0b93645e9bc87f85b8e95210b7e0e1c029e0462c # v5.0.0 with: python-version: "3.11"Note: You can find the commit SHA for v5.0.0 (or latest v5.x) from the actions/setup-python releases page.
As per coding guidelines from static analysis: "action is not pinned to a hash (required by blanket policy)".
🤖 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 @.github/workflows/e2e-tests.yml at line 78, Replace the floating tag reference to the GitHub Action with a pinned commit SHA: locate the line using the setup-python action (uses: actions/setup-python@v5) in the workflow and change it to the corresponding commit SHA for the desired v5 release (e.g., uses: actions/setup-python@<commit-sha>) so the workflow references an immutable commit; obtain the correct SHA from the actions/setup-python releases page and update the uses entry accordingly.
🤖 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.
Nitpick comments:
In @.github/workflows/e2e-tests.yml:
- Line 78: Replace the floating tag reference to the GitHub Action with a pinned
commit SHA: locate the line using the setup-python action (uses:
actions/setup-python@v5) in the workflow and change it to the corresponding
commit SHA for the desired v5 release (e.g., uses:
actions/setup-python@<commit-sha>) so the workflow references an immutable
commit; obtain the correct SHA from the actions/setup-python releases page and
update the uses entry accordingly.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 5baadef1-c437-40ef-a9ea-aed630b5bf5f
📒 Files selected for processing (1)
.github/workflows/e2e-tests.yml
Summary by CodeRabbit
New Features
UI/UX Updates
Documentation