Skip to content
Merged
Show file tree
Hide file tree
Changes from 147 commits
Commits
Show all changes
151 commits
Select commit Hold shift + click to select a range
afe8ca6
Initial commit
block-open-source[bot] Mar 27, 2026
c4c3728
prepare repo template
Mar 27, 2026
70acf22
feat: scaffold Goose2 desktop app with full UI and testing infrastruc…
wesbillman Mar 29, 2026
efec889
feat: port floating sidebar from goose2.0 (#3)
wesbillman Mar 29, 2026
ea7d712
feat: add Skills and Agents pages with sidebar navigation (#4)
wesbillman Mar 30, 2026
e6750f0
chore(deps): update all non-major dependencies (#5)
renovate[bot] Mar 30, 2026
cca7907
feat: chat experience preparation — UI components, stores, and goose2…
wesbillman Mar 30, 2026
aed88d7
chore(deps): update actions/cache action to v5 (#6)
renovate[bot] Mar 30, 2026
a088b17
feat: personas & skills — rename, import/export, creation, and layout…
wesbillman Mar 30, 2026
3b8baf0
fix: persona & skill dialog layouts + drag-and-drop on new cards (#9)
wesbillman Mar 30, 2026
fde43f3
Replace default Tauri icons with Goose app icon (#11)
wesbillman Mar 30, 2026
5b1a8ba
feat: add ACP client integration for multi-agent support (#12)
wesbillman Mar 30, 2026
c6739f6
fix: settings modal X button not dismissing dialog (#13)
matt2e Mar 30, 2026
e2fa4e8
fix: prevent horizontal scrolling in sidebar nav (#14)
matt2e Mar 30, 2026
a1893bb
feat: add projects feature to sidebar (#15)
wesbillman Mar 31, 2026
c7ec58f
refactor: remove unused root-level stores and types (#16)
wesbillman Mar 31, 2026
8c3471f
Fix settings page (#17)
wesbillman Mar 31, 2026
dc516fd
feat: add ACP provider selector to chat and home (#18)
wesbillman Mar 31, 2026
cf68533
feat: add branch-based dev icons and stable ports for worktree disamb…
matt2e Mar 31, 2026
bffcea2
feat: use acp-client from builderbot repo as git dependency (#20)
matt2e Mar 31, 2026
1b628a5
feat: add doctor health-check UI and backend to preferences dialog (#21)
matt2e Mar 31, 2026
d6d58df
feat: session persistence with tab state and sidebar recents (#22)
matt2e Mar 31, 2026
20f9ce4
chore: bump acp-client to latest builderbot HEAD (dbd5bc9c) (#23)
matt2e Mar 31, 2026
f5c8ba1
feat: persona picker with @ mention support (#24)
wesbillman Mar 31, 2026
f29cebb
feat: wire up ACP session metadata and persist across restarts (#25)
wesbillman Mar 31, 2026
562deaf
[codex] Archive chats and restore them from settings (#26)
wesbillman Mar 31, 2026
ef9aaf6
feat: clean up chat message rendering (#27)
wesbillman Mar 31, 2026
f63fa19
[codex] Use project settings in project chats (#29)
wesbillman Mar 31, 2026
24d1e44
fix: remove backtick decorations from inline code elements (#30)
wesbillman Mar 31, 2026
a213317
fix: start app on Home screen and use ACP title logic for project cha…
wesbillman Mar 31, 2026
430d5ba
add inline rename for sidebar chats (#28)
tulsi-builder Mar 31, 2026
bd459e2
add shared agent skills for code-review and create-pr (#32)
morgmart Mar 31, 2026
8341420
maximize desktop window on startup (#33)
morgmart Mar 31, 2026
21af4ce
fix: reuse open empty new chat tabs (#34)
morgmart Apr 1, 2026
971064c
fix: resume existing ACP sessions instead of always creating new ones…
matt2e Apr 1, 2026
7c127ea
refactor: split doctor.rs and acp.rs into sub-modules (#36)
matt2e Apr 1, 2026
7d5d789
Revert "maximize desktop window on startup (#33)" (#37)
morgmart Apr 1, 2026
3eff914
refactor: consume shared doctor crate from builderbot (#38)
matt2e Apr 1, 2026
3085e15
add shadcn compatibility layer and separate brand from accent colors …
morgmart Apr 1, 2026
76495b5
feat: add prompt editor to project creation (#40)
matt2e Apr 1, 2026
5cf78e7
expand design system primitives with shadcn compatibility (#41)
morgmart Apr 1, 2026
5ae0292
unify chat input project and provider controls (#43)
morgmart Apr 1, 2026
903f78a
feat: add multi-persona chat context and attribution (#42)
matt2e Apr 1, 2026
39fbd47
feat: add local persona avatars with drag-and-drop upload (#44)
matt2e Apr 1, 2026
6bf9eff
Remove unused goosed sidecar and HTTP fetch infrastructure (#45)
baxen Apr 1, 2026
71d5c94
refactor: use ~/.agents/skills as standard skill storage path (#46)
baxen Apr 1, 2026
b056a77
fix: adjust protocol name in AGENTS.md (#47)
alexhancock Apr 1, 2026
93f3509
centralize built-in personas in the backend (#48)
wesbillman Apr 1, 2026
5bdb225
fix: restore project prompt editor workflow (#49)
morgmart Apr 1, 2026
188ca21
feat: add e2e tests for personas and skills views (#50)
wesbillman Apr 1, 2026
c515bb4
feat: make personas optional (#51)
wesbillman Apr 1, 2026
10632df
chore: migrate biome from hermit to pnpm devDependency (#52)
wesbillman Apr 1, 2026
396ab41
feat: surface ACP model and token info in status bar and chat input (…
wesbillman Apr 1, 2026
38423ed
centralize provider selection state in agentStore (#54)
morgmart Apr 1, 2026
1af6e66
polish sidebar hierarchy and speed up sidebar reloads (#61)
morgmart Apr 1, 2026
64eaaa7
track chat activity and unread state per session (#62)
wesbillman Apr 1, 2026
a0bd7cb
Make Cmd+W close the active tab instead of the window (#64)
wesbillman Apr 1, 2026
517e59c
ship artifact v1 file viewing with ranked open actions (#63)
tulsi-builder Apr 1, 2026
d340829
fix: update chat title immediately on send (#66)
wesbillman Apr 1, 2026
8d8a2fd
Prevent tab name text from being selectable (#67)
wesbillman Apr 1, 2026
905c857
feat: add image paste support to chat input (#68)
morgmart Apr 2, 2026
25710dc
refactor: remove top-level chat tabs (#70)
matt2e Apr 2, 2026
d152447
fix: prevent file drags from replacing the app view (#71)
matt2e Apr 2, 2026
096baec
fix: resolve ACP working directories to absolute paths (#72)
matt2e Apr 2, 2026
8036e81
fix: set binary name to 'Goose' for macOS Dock and App Switcher (#75)
matt2e Apr 2, 2026
1915aa4
fix: persist ACP streaming messages incrementally (#76)
matt2e Apr 2, 2026
4b1d9e7
fix: add new project includes to the bottom instead of the top (#77)
matt2e Apr 2, 2026
9d268e6
document setup flow and clean node_modules (#80)
wesbillman Apr 2, 2026
15f512e
fix: restore sidebar goose icon (#81)
wesbillman Apr 2, 2026
7b09bdc
add project colors and icon support to chat input toolbar (#83)
morgmart Apr 2, 2026
e6e7c8b
Allow opening explicit outputs outside artifact roots (#82)
tulsi-builder Apr 2, 2026
99a4d62
feat: import boss-ui components + Tailwind v4 upgrade (#85)
tellaho Apr 2, 2026
a229803
resize large images before sending and preserve images across home-to…
morgmart Apr 2, 2026
ffed317
Sort project chats newest-first and increase show-more limit to 5 (#84)
wesbillman Apr 2, 2026
d6e9359
fix: update E2E tests for Radix dialog component changes (#87)
wesbillman Apr 2, 2026
9660b4a
Remove unused use-text-animator hook (#90)
nahiyankhan Apr 2, 2026
a0bbe23
add context panel with git workspace details to chat view (#92)
morgmart Apr 3, 2026
970d99b
fix: sidebar hover text and project item styling (#89)
nahiyankhan Apr 3, 2026
7f6db5b
polish chat toolbar and sidebar with provider icons and cleaner label…
morgmart Apr 3, 2026
97b5ba3
fix: refresh sidebar when project is edited (#95)
wesbillman Apr 3, 2026
481af65
context panel: default closed, widget UI, and worktree list (#98)
morgmart Apr 3, 2026
d12acb0
polish chat input and sidebar interactions (#99)
morgmart Apr 3, 2026
3b156b6
feat: wire output files into Context Panel files tab (#100)
tulsi-builder Apr 3, 2026
bc3f2f5
refactor(acp): route goose2 through goose serve (#101)
baxen Apr 4, 2026
446e06f
fix: display all project directories in sidebar and toolbar (#96)
wesbillman Apr 4, 2026
4eb5e7f
Remove header and footer border separators (#102)
baxen Apr 4, 2026
c294b0a
fix: improve ensure-local-goose error handling and resilience (#103)
baxen Apr 4, 2026
9f78bba
feat: add native zoom support (Cmd+/- and Cmd+0) (#97)
tellaho Apr 5, 2026
da703c6
fix: sidebar UI polish — menus, rename, hover, new chat button (#106)
tulsi-builder Apr 6, 2026
db3b31a
feat: auto-hide scrollbars globally, show on scroll (#107)
morgmart Apr 6, 2026
55f153d
lazy session creation with draft persistence (#108)
morgmart Apr 6, 2026
0a8f17d
fix: sidebar dropdown padding and border-radius tokens (#109)
tulsi-builder Apr 6, 2026
db6edb0
feat: add rounded-overlay token and apply to all floating surfaces (#…
tulsi-builder Apr 6, 2026
027aa3f
feat: sidebar polish — resize, ordering, button visibility (#111)
tulsi-builder Apr 6, 2026
00b167b
add session history, search, and smart naming (#113)
tulsi-builder Apr 7, 2026
baf56fb
drag and drop chats between projects in sidebar (#114)
tulsi-builder Apr 7, 2026
354ac35
feat: add single-message queue during agent streaming (#112)
tellaho Apr 7, 2026
2a8fa0d
Wire up ACP session lifecycle: create, load, list, and stream (#115)
baxen Apr 8, 2026
7ff4d2a
fix: highlight project row in sidebar for new conversations, clear fo…
matt2e Apr 8, 2026
5b8aebd
fix: don't bump session updatedAt on metadata-only updates (#117)
matt2e Apr 8, 2026
08106b6
fix: treat Option+Return as newline in multiline text inputs (#118)
matt2e Apr 8, 2026
3fd6c9b
fix: preserve newlines in user message display (#120)
matt2e Apr 8, 2026
6474330
chore: bump acp-client to 6cb674a (raw_input support) (#122)
matt2e Apr 8, 2026
1fb4429
fix: use real start time for tool call elapsed timer (#123)
matt2e Apr 8, 2026
29dfc25
fix: move tool elapsed time to stable badge before chevron (#124)
matt2e Apr 8, 2026
a28d5a4
fix: sidebar highlight pill follows active session after list re-sort…
matt2e Apr 8, 2026
bbdce16
fix: preserve tool call expand/collapse state across re-renders (#119)
matt2e Apr 8, 2026
84df964
simplify focus-visible behavior and remove keyboard nav detection (#127)
morgmart Apr 8, 2026
8fc12a9
add app localization and i18n guardrails (#126)
wesbillman Apr 8, 2026
07b278f
add shared provider UI primitives (#129)
morgmart Apr 8, 2026
d9ed14b
add provider setup infrastructure (#130)
morgmart Apr 8, 2026
29bb56f
add providers settings UI (#131)
morgmart Apr 8, 2026
d7a8069
fix: open context menu on right-click in sidebar chat rows (#133)
matt2e Apr 9, 2026
e21f6fd
fix: app freeze while loading session history (#134)
matt2e Apr 9, 2026
4fc2918
fix(deps): update acp-client digest to db184d2 (#104)
renovate[bot] Apr 9, 2026
ec78c03
fix(deps): update doctor digest to 8e1c3ec (#105)
renovate[bot] Apr 9, 2026
890dee8
fix: auto-focus chat textarea when starting a new conversation (#136)
matt2e Apr 9, 2026
3b0da20
fix: remove message count from session history cards (#135)
matt2e Apr 9, 2026
45b0638
add session import, export, and duplicate support (#132)
tulsi-builder Apr 9, 2026
c617744
add agent model picker and session model sync (#137)
morgmart Apr 9, 2026
10413b5
feat: migrate from boss-ui to Ghost UI foundation (#125)
tellaho Apr 9, 2026
55d47ca
polish chat, persona, history, and skills ui (#138)
tulsi-builder Apr 9, 2026
c127c90
fix: home clock text clipping on macOS (#140)
tellaho Apr 9, 2026
72d3255
fix: pin tauri-plugin-dialog to <2.7 to match NPM package version (#144)
matt2e Apr 10, 2026
090f858
fix project chat persistence and artifact routing (#141)
tulsi-builder Apr 10, 2026
c68a06b
fix: sidebar selection frame misaligned after expand/collapse (#145)
matt2e Apr 10, 2026
ccd56e3
refactor: replace custom dropdown menus with shared DropdownMenu (#139)
tellaho Apr 10, 2026
28f68f7
feat: add Cmd/Ctrl+N shortcut to open new conversation (#146)
matt2e Apr 10, 2026
8972d7b
improve sidebar contrast and constrain model picker (#149)
tulsi-builder Apr 10, 2026
c5798cd
feat: add file @-mention autocomplete with project file scanning (#147)
tellaho Apr 10, 2026
86cd8ab
fix: strip XML wrapper from replayed user messages (#150)
tellaho Apr 10, 2026
d4b781f
add workspace widget with git branch and worktree management (#151)
morgmart Apr 10, 2026
907ac54
search session message content (#152)
tulsi-builder Apr 10, 2026
32584a9
Add i18n and cross-boundary dead data checks to code review skill (#153)
morgmart Apr 11, 2026
4f7d032
add file-aware widgets to context panel, simplify session search (#154)
morgmart Apr 11, 2026
f7c1aa4
show per-message assistant identity from metadata instead of props (#…
morgmart Apr 12, 2026
8b9b1e4
pin rust version to have consistent dev experience (#159)
lifeizhou-ap Apr 13, 2026
b4843fd
feat: app e2e test (#162)
lifeizhou-ap Apr 13, 2026
9e008a0
fix: drain pending replay notifications before emitting replay_comple…
matt2e Apr 13, 2026
dbdf69d
Merge goose2 repo into ui/goose2 with full history
jamadeo Apr 13, 2026
93e9a96
Clean up goose2 after merge: remove redundant files, integrate into w…
jamadeo Apr 13, 2026
bede5a5
Fix directories
jamadeo Apr 13, 2026
0dfd4bc
Add Goose 2 CI workflow
jamadeo Apr 13, 2026
de6ddad
Remove tokio-stream, regenerate lockfile
jamadeo Apr 13, 2026
cd874dc
pnpm version
jamadeo Apr 13, 2026
ff12d2f
Fix matchers
jamadeo Apr 13, 2026
40308ba
A proper fix
jamadeo Apr 13, 2026
eb3c97f
add edge-case-finder agent skill (#164)
morgmart Apr 13, 2026
daa64aa
Replace artifact files tab with project tree (#165)
tulsi-builder Apr 13, 2026
491683b
recipe to cherry pick from goose2
jamadeo Apr 13, 2026
2d5ade3
Merge remote-tracking branch 'origin/main' into move-goose2
jamadeo Apr 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
162 changes: 162 additions & 0 deletions .github/workflows/goose2-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
name: "Goose 2 CI"

on:
push:
branches: [main]
paths:
- "ui/goose2/**"
pull_request:
branches: [main]
paths:
- "ui/goose2/**"
merge_group:
branches: [main]
workflow_dispatch:

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

defaults:
run:
working-directory: ui/goose2

jobs:
lint:
name: Lint & Format
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v4.4.0
with:
version: 10.30.3
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 24
cache: pnpm
cache-dependency-path: ui/goose2/pnpm-lock.yaml
- run: pnpm install --frozen-lockfile
- run: pnpm check
- run: pnpm typecheck

test:
name: Unit Tests
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v4.4.0
with:
version: 10.30.3
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 24
cache: pnpm
cache-dependency-path: ui/goose2/pnpm-lock.yaml
- run: pnpm install --frozen-lockfile
- run: pnpm test

desktop:
name: Desktop Build & E2E
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v4.4.0
with:
version: 10.30.3
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 24
cache: pnpm
cache-dependency-path: ui/goose2/pnpm-lock.yaml

- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
libgtk-3-dev \
libwebkit2gtk-4.1-dev \
libappindicator3-dev \
librsvg2-dev \
patchelf

- name: Install Rust
uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable

- name: Cache Rust
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
with:
path: |
~/.cargo/registry
~/.cargo/git
ui/goose2/src-tauri/target
key: ${{ runner.os }}-goose2-cargo-${{ hashFiles('ui/goose2/src-tauri/Cargo.lock') }}

- run: pnpm install --frozen-lockfile

- name: Build frontend
run: pnpm build

- name: Check Tauri
run: cd src-tauri && cargo check

- name: Clippy
run: cd src-tauri && cargo clippy -- -D warnings

- name: Format check
run: cd src-tauri && cargo fmt --check

- name: Install Playwright Chromium
run: pnpm exec playwright install --with-deps chromium

- name: Run E2E tests
run: pnpm exec playwright test

- name: Upload test artifacts
if: failure()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: playwright-report
path: |
ui/goose2/playwright-report/
ui/goose2/test-results/
retention-days: 7

rust-lint:
name: Rust Lint
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1

- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
libgtk-3-dev \
libwebkit2gtk-4.1-dev \
libappindicator3-dev \
librsvg2-dev \
patchelf

- name: Install Rust
uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
with:
components: rustfmt, clippy

- name: Cache Rust
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
with:
path: |
~/.cargo/registry
~/.cargo/git
ui/goose2/src-tauri/target
key: ${{ runner.os }}-goose2-cargo-${{ hashFiles('ui/goose2/src-tauri/Cargo.lock') }}

- name: Format check
run: cd src-tauri && cargo fmt --check

- name: Clippy
run: cd src-tauri && cargo clippy -- -D warnings
1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ members = [
# Mainly for cargo-machete to not error out during inspection.
"vendor/v8"
]
exclude = ["ui/goose2/src-tauri"]
resolver = "2"

[workspace.package]
Expand Down
196 changes: 196 additions & 0 deletions ui/goose2/.agents/skills/code-review/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,196 @@
---
name: code-review
description: >-
Senior engineer code review focused on catching issues before they become PR
comments. Reviews only changed lines, categorizes issues by priority, and fixes
them one by one. Use when the user says "code review", "review my code",
"review this branch", or wants pre-PR feedback.
---

# Pre-PR Code Review

You are a senior engineer conducting a thorough code review. Review **only the lines that changed** in this branch (via `git diff main...HEAD`) and provide actionable feedback on code quality. Do not flag issues in unchanged code.

## Determine Files to Review

**Before starting the review**, identify which files to review by checking:

1. **Run git commands** to check both:
- Committed changes: `git diff --name-only main...HEAD`
- Unstaged/staged changes: `git status --short`

2. **Ask the user which set to review** if both exist:
- If there are both committed changes AND unstaged/staged changes, ask: "I see you have both committed changes and unstaged/staged changes. Which would you like me to review?"
- **Option A**: Committed changes in this branch (compare against main)
- **Option B**: Current unstaged/staged changes
- **Option C**: Both

3. **Proceed automatically** if only one set exists:
- If only committed changes exist → review those
- If only unstaged/staged changes exist → review those
- If neither exist → inform the user there are no changes to review

4. **Get the file list** based on the user's choice:
- For committed changes: Use `git diff --name-only main...HEAD`
- For unstaged/staged: Use `git diff --name-only` and `git diff --cached --name-only`
- Filter to only include files that exist (some may be deleted)

**Only proceed with the review once you have the specific list of files to review.**

## Review Checklist

### React Best Practices
- **Components**: Are functional components with hooks used consistently?
- **State Management**: Is `useState` and `useEffect` used properly? Any unnecessary re-renders?
- **Props**: Are prop types properly defined with TypeScript interfaces?
- **Keys**: Are list items using proper unique keys (not array indices)?
- **Hooks Rules**: Are hooks called at the top level and in the correct order?
- **Custom Hooks**: Could any logic be extracted into reusable custom hooks?

### TypeScript Best Practices
- **const vs let vs var**: Is `const` used by default? Is `let` only used when reassignment is needed? Is `var` avoided entirely?
- **Type Safety**: Are types explicit and avoiding `any`? Are proper interfaces/types defined?
- **Type Assertions**: Are type assertions (`as`) used sparingly and only when necessary?
- **Non-null Assertions**: Are non-null assertions (`!`) avoided? They bypass TypeScript's null safety and hide bugs. Use proper null checks or optional chaining instead.
- **React Ref Types**: Are React refs properly typed as nullable (`useRef<T>(null)` with `RefObject<T | null>`)? Refs are null on first render and during unmount.
- **Optional Chaining**: Is optional chaining (`?.`) used appropriately for potentially undefined values?
- **Enums vs Union Types**: Are union types preferred over enums where appropriate?

### Design System & Styling
- **Component Usage**: Are design system components used instead of raw HTML elements (`<Button>` not `<button>`, `<Input>` not `<input>`)?
- **No Custom Styling**: Is custom inline styling or CSS avoided in favor of design system utilities?
- **Tailwind Classes**: Are Tailwind utility classes used properly and consistently?
- **Tailwind JIT Compilation**: Are Tailwind classes using static strings? JavaScript variables in template literals (e.g., `` `max-w-[${variable}]` ``) break JIT compilation. Use static strings or conditional logic instead (e.g., `condition ? 'max-w-[100px]' : 'max-w-[200px]'`).
- **Theme Tokens**: Are theme tokens used for colors that adapt to light/dark mode (e.g., `text-foreground`, `bg-card`, `text-muted-foreground`) instead of hardcoded colors (e.g., `text-black`, `bg-white`)?
- **Variants**: Could any components benefit from additional variants or properties in the design system?
- **Light and Dark Mode Support**: Are colors working properly in both light and dark modes? No broken colors?
- **Responsive Layout**: Does the layout work correctly at all breakpoints? No broken layout on mobile, tablet, or desktop?

### Localization (i18n)
- **New Keys**: When new translation keys are added to one locale (e.g., `en`), are all other supported locales updated too? i18next falls back gracefully, but incomplete locales should be flagged.
- **Removed Keys**: When UI text is removed, are the corresponding translation keys removed from all locale files?
- **Raw Strings**: Are user-facing strings wrapped in `t()` calls instead of hardcoded in JSX? Non-translatable symbols (icons, punctuation, HTML entities) are acceptable with an `i18n-check-ignore` annotation.

### Code Simplicity (DRY Principle)
- **Duplication**: Is there any repeated code that could be extracted into functions or components?
- **Complexity**: Are there overly complex functions that could be broken down?
- **Logic**: Is the logic straightforward and easy to follow?
- **Abstractions**: Are abstractions appropriate (not too early, not too late)?
- **Guard Clauses**: Are early-return guards used to keep code shallow and readable?

### Code Cleanliness
- **Comments**: Are there unnecessary comments explaining obvious code? (Remove them)
- **Console Logs**: Are there leftover `console.log` statements? (Remove them)
- **Dead Code**: Is there unused code, commented-out code, or unused imports?
- **Cross-Boundary Dead Data**: Are there struct/interface fields computed on one side of a boundary (e.g., Rust backend) but never consumed on the other (e.g., TypeScript frontend)? This wastes computation and adds noise to data contracts.
- **Naming**: Are variable and function names clear and descriptive?
- **Magic Numbers**: Are there magic numbers without explanation? Should they be named constants?

### Animation & UI Polish
- **Race Conditions**: Are there any animation race conditions or timing issues?
- **Single Source of Truth**: Is state managed in one place to avoid conflicts?
- **AnimatePresence**: Is it used properly with unique keys for dialog/modal transitions?
- **Reduced Motion**: Is `useReducedMotion()` respected for accessibility?

### General Code Quality
- **Error Handling**: Are errors handled gracefully with user-friendly messages?
- **Loading States**: Are loading states shown during async operations?
- **Accessibility**: Are ARIA labels, keyboard navigation, and screen reader support considered?
- **Performance**: Are there any obvious performance issues (unnecessary re-renders, heavy computations)?
- **Git Hygiene**: Are there any files that shouldn't be committed (env files, etc.)?
- **Unrelated Changes**: Are there any stray files or changes that don't relate to the branch's main purpose? (Accidental commits, unrelated fixes)

## Review & Fix Process

### Step 0: Run Quality Checks

Before reading any code, run the project's CI gate to establish a baseline:

```bash
just ci
```

This runs: `pnpm check` (Biome lint/format + file sizes), `pnpm typecheck`, `just clippy` (Rust linting), `pnpm test`, `pnpm build`, and `just tauri-check` (Rust type checking).

Report the results as pass/fail. Any failures are automatically **P0** issues and should appear at the top of the findings list. Do not skip this step even if the user only wants a quick review.

### Step 1: Conduct Review

For each file in the list:

1. Run `git diff main...HEAD -- <file>` to get the exact lines that changed
2. Review **only those changed lines** against the Review Checklist — do not flag issues in unchanged code
3. Note the file path and line numbers from the diff output for each issue found

### Step 2: Categorize Issues

Assign each issue a priority level:
- **P0**: Breaks functionality, TypeScript errors, security issues
- **P1–P2**: Performance problems, accessibility issues, code quality, unnecessary complexity, poor practices, design system violations
- **P3**: Style inconsistencies, minor improvements, missing type safety, animation issues, theme token usage
- **P4**: Cleanup — console logs, unused imports, dead code, unnecessary comments, unrelated changes

If many high-severity issues exist in a file, assess whether a full refactor would be simpler than individual fixes.

### Step 3: Present Findings

After reviewing all files, provide:
- **Summary**: Total files reviewed, overall quality rating (1-5 stars)
- **Issues**: A single numbered list ordered by priority (P0 first, P4 last). Each issue must follow this exact format:

```
1. Short Issue Title (P0) [Must Fix]
- Description of the issue and why it matters
- Recommended fix

2. Short Issue Title (P3) [Your Call]
- Description of the issue and why it may or may not need addressing
- Recommended fix if the user chooses to act on it
```

Use a short, descriptive title (3–6 words max) so issues can be referenced by number (e.g. "fix issue 3").

### Step 3b: Self-Check

Before presenting findings to the user, silently review the issue list two more times:

1. **Pass 1**: For each issue, ask — is this genuinely a problem, or could it be intentional/acceptable? Remove false positives.
2. **Pass 2**: For each remaining issue, ask — does the recommended fix actually improve the code, or is it a matter of preference?

After both passes, tag each surviving issue as one of:
- **[Must Fix]** — clear violation, will likely get flagged in PR review
- **[Your Call]** — valid concern but may be intentional or a reasonable tradeoff (e.g. stepping outside the design system for a specific reason). Present it but let the user decide.

Only present issues that survived both passes.

### Step 4: Fix Issues

**Before fixing**, ask: "Would you like me to fix these issues in order? Or do you have questions about any of them first? I will fix each issue one by one and ask for approval before moving to the next one."

**When approved**, work through issues one at a time in numbered order (P0 → P4). After each fix:
1. Explain what was changed and why
2. Ask: "Does that look good? Ready to move on to issue [N]?"
3. Wait for confirmation before proceeding to the next issue

**Important**: When adding documentation comments:
- Only add comments for non-obvious things: magic numbers, complex logic, design decisions, or workarounds
- If you call out something as confusing or hard-coded in your review and suggest adding documentation, it's acceptable to add a comment when approved
- Don't add comments that just restate what the code does

Explain each change as you make it. If an issue is too subjective or minor, skip it and note why.

**Remember**: Cleanup tasks like removing comments should always be done LAST, because earlier fixes might introduce new comments that also need removal.

### Step 5: Ready to Ship

Once all issues are fixed, display:

---

**✅ Code review complete! All issues have been addressed.**

Your code is ready to commit and push. Lefthook will run the full CI gate (`just ci`) automatically when you push.

Next steps: generate a PR summary that explains the intent of this change, what files were modified and why, and how to verify the changes work.

---
Loading
Loading