ui/goose2/ui_improvements/state_management/phase-6-project-store.md
Phase 6: Refactor Project Store Into Clearer Layers
Status
Goal
projectStore responsibility overload.Scope
ui/goose2/src/features/projects/stores/projectStore.tsuseProjectCommands.ts or projectCommands.tsProjectsView.tsx, Sidebar.tsx, and SettingsModal.tsxOut Of Scope
Execution Steps
Document the current mutation policy.
AppShell, Sidebar, and project views depend on project list lookup by id, while projectStore also owns API orchestration and cache persistence.fetchProjects: pessimistic load with cached bootstrap.addProject, editProject, removeProject: backend first, local update after success.reorderProjects: local optimistic reorder, persist cache, fire backend reorder without rollback.Add local state actions.
setProjectsLocalupsertProjectLocalremoveProjectLocalreorderProjectsLocalsetProjectsLoadingsetActiveProjectAdd project commands.
Migrate consumers gradually.
fetchProjects, addProject, editProject, and removeProject consumers to commands.Recheck project-related component responsibility.
AppShell currently orchestrates project fetch, project creation/edit/archive callbacks, project selection for new chats, sidebar project actions, and chat/session setup. After project-store policy is clarified, decide whether some project orchestration should move into a project controller hook or smaller app-shell child component.Sidebar currently combines project display, session grouping by project, expanded-project persistence, runtime badges, and search resolver support. After project selectors/helpers are settled, decide whether project/session grouping belongs in a pure helper or a smaller sidebar controller.projects + projectId; if repeated lookup logic is noisy, use a pure helper over the project list instead of storing duplicate active/current project objects.projectStore.getActiveProject. It is an imperative derived helper over projects + activeProjectId; keep it only if useful for getState()/callback code, and prefer selectors or pure helpers for React reads.Make reorder policy explicit.
Reduce persistence coupling, but do not standardize persistence yet.
Add focused tests.
Validation
cd ui/goose2 && pnpm test -- projectrg "useProjectStore\\(\\)" ui/goose2/srcSuccess Criteria
projectStore no longer owns every project workflow directly.