4.2 KiB
React and shadcn Fixes Implementation Plan
For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [ ]) syntax for tracking.
Goal: Fix the security-sensitive share-link authorization gap and the highest-confidence shadcn Base UI composition issues from the audit.
Architecture: Add registry-level share authorization callbacks and require them in the generic share service before token creation and shared data loading. Update current modules to provide household/user-scoped authorization and share loaders, then align selected UI call sites with shadcn Base API.
Tech Stack: Next.js 15 App Router, TypeScript, Drizzle, shadcn/ui Base UI, Tailwind v4, Node test runner via tsx --test.
Task 1: Share Authorization Helper
Files:
-
Create:
tests/unit/share-authorization.test.ts -
Create:
src/modules/_core/share-authorization.ts -
Modify:
src/modules/_core/module.ts -
Step 1: Write the failing test
Create tests for missing callbacks, denied callbacks, and allowed callbacks.
- Step 2: Run test to verify it fails
Run: pnpm exec tsx --test tests/unit/share-authorization.test.ts
Expected: failure because share-authorization.ts does not exist.
- Step 3: Implement the helper and registry types
Add ShareContext, ensureEntityShareAuthorized, EntityTypeRegistration.canShareEntity, and scoped loadForShare context typing.
- Step 4: Run test to verify it passes
Run: pnpm exec tsx --test tests/unit/share-authorization.test.ts
Expected: all tests pass.
Task 2: Wire Authorization Into Share Service
Files:
-
Modify:
src/modules/_core/share.ts -
Modify:
src/app/s/[token]/page.tsx -
Step 1: Call
ensureEntityShareAuthorizedincreateShareLink
Require the active user and household to be authorized before token insertion.
- Step 2: Pass household context into public share loading
Call entityReg.loadForShare(resolved.entityId, { householdId: resolved.householdId }).
- Step 3: Run typecheck
Run: pnpm typecheck
Expected: type errors until module adapters are updated.
Task 3: Add Module Share Adapters
Files:
-
Modify:
src/modules/calendar/manifest.tsx -
Modify:
src/modules/calendar/server/share-queries.ts -
Modify:
src/modules/lists/manifest.tsx -
Modify:
src/modules/lists/server/share-queries.ts -
Modify:
src/modules/notes/manifest.tsx -
Modify:
src/modules/notes/server/share-queries.ts -
Modify:
src/modules/garden/manifest.tsx -
Modify:
src/modules/garden/server/share-queries.ts -
Step 1: Implement
canShareEntityfor every shareable entity
Use household scoping and existing private-calendar rules.
- Step 2: Scope
loadForSharequeries by token household
Require the public token household to match the entity household.
- Step 3: Run typecheck
Run: pnpm typecheck
Expected: pass.
Task 4: Fix Base UI Select Composition
Files:
-
Modify:
src/modules/calendar/components/calendar-shell.tsx -
Modify:
src/components/theme-picker.tsx -
Step 1: Add
itemsarrays andSelectGroupwrappers
Keep existing labels and values; do not redesign layout.
- Step 2: Run typecheck
Run: pnpm typecheck
Expected: pass.
Task 5: Targeted shadcn Menu and Icon Cleanup
Files:
-
Modify:
src/components/dashboard-switcher.tsx -
Modify:
src/components/dashboard-editor.tsx -
Modify:
src/components/share-button.tsx -
Step 1: Wrap dropdown items in
DropdownMenuGroup
Preserve menu behavior.
- Step 2: Replace icon sizing inside shadcn buttons/menu items
Use data-icon where icons sit in Button; remove explicit size-4 mr-* from dropdown item icons.
- Step 3: Run lint
Run: pnpm lint
Expected: no new errors; existing warnings may remain.
Task 6: Final Verification
Files:
-
No direct edits.
-
Step 1: Run targeted test
Run: pnpm exec tsx --test tests/unit/share-authorization.test.ts
Expected: pass.
- Step 2: Run typecheck
Run: pnpm typecheck
Expected: pass.
- Step 3: Run lint
Run: pnpm lint
Expected: exit 0; warnings only if pre-existing.