Commit Graph
100 Commits
Author SHA1 Message Date
makiolajandClaude Opus 4.6 684cfd3789 fix: stabilize drag-to-reorder with layout animation fixes
- Remove transition-all from list items (fights framer-motion layout)
- Add layout="position" to Reorder.Item for proper sibling tracking
- Replace CSS gap with marginBottom (gap confuses layout engine)
- Add explicit short transition duration for snappy reorder

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 18:44:39 +02:00
makiolajandClaude Opus 4.6 52751ae9d4 fix: use onDragEnd on Reorder.Item instead of onPointerUp on Group
The previous approach used onPointerUp on the Reorder.Group which
fired unreliably — triggering on non-drag clicks and sometimes not
at all after a drag. Moving to onDragEnd on each Reorder.Item gives
clean, predictable drag-to-reorder behavior.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 18:42:16 +02:00
makiolajandClaude Opus 4.6 3fc737c872 fix: add tab navigation to collection page and skip 404 retries
Adds Gear/Planning/Setups pill tabs to the collection page so users
can switch tabs without going back to the dashboard. Also skips
React Query retries on 404 responses for immediate error display.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 18:31:57 +02:00
makiolajandClaude Opus 4.6 b993a0a831 fix: skip retries on 404 for single-resource queries
Prevents 10-second loading skeleton when navigating to non-existent
threads, setups, or items. Shows error/not-found state immediately.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 18:28:04 +02:00
makiolajandClaude Opus 4.6 a8696c2a85 fix: commit missing migration metadata and run CI on all branches
CI / ci (push) Successful in 25s
CI / ci (pull_request) Successful in 26s
CI / e2e (push) Successful in 1m24s
CI / e2e (pull_request) Successful in 1m23s
The Drizzle migration journal and snapshot for 0008 (quantity column)
were not committed, causing test failures in CI. Also updates CI to
trigger on all branches, not just Develop.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 18:18:12 +02:00
makiolajandClaude Sonnet 4.6 15f146ee89 feat: add CSV import/export for gear collection
CI / ci (pull_request) Failing after 22s
CI / e2e (pull_request) Has been skipped
Adds export (GET /api/items/export) and import (POST /api/items/import) routes
backed by a pure csv.service with no external deps, plus useExportItems/useImportItems
hooks and an Import/Export section in the Settings page.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 18:12:07 +02:00
makiolajandClaude Sonnet 4.6 8c1fe47a99 feat: add setup impact preview UI with delta badges across all views
Adds SetupImpactSelector dropdown and ImpactDeltaBadge inline badge, wired into the thread detail page. Delta badges appear on CandidateListItem, CandidateCard, and ComparisonTable (Weight Impact / Price Impact rows) whenever a setup is selected for comparison.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 18:11:57 +02:00
makiolajandClaude Sonnet 4.6 b9a06dd244 feat: add item duplication with copy-and-edit workflow
Adds POST /api/items/:id/duplicate endpoint, useDuplicateItem hook, and a
Duplicate button on ItemCard (collection view only) that opens the new item
for editing immediately after creation.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 18:07:20 +02:00
makiolajandClaude Sonnet 4.6 818db73432 feat: add impact delta computation with TDD tests
Implements computeImpactDeltas pure function with 8 TDD tests covering replace/add/none modes and null weight/price handling. Adds useImpactDeltas hook, categoryId to ThreadWithCandidates, and selectedSetupId state to uiStore.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 18:06:46 +02:00
makiolajandClaude Sonnet 4.6 1a5e6a303e feat: add quantity support to totals, UI, and thread resolution
- totals.service: multiply weight/cost sums by quantity in category and global totals
- setup.service: multiply by quantity in getAllSetups SQL subqueries; expose quantity in getSetupWithItems item list
- thread.service: explicitly pass quantity: 1 when inserting resolved item
- ItemForm: add Quantity number input (min=1, default=1) after price field
- ItemCard: show ×N badge next to item name when quantity > 1
- CollectionView: pass quantity prop to ItemCard in both filtered and grouped views
- $setupId.tsx: pass quantity to ItemCard; multiply by quantity in client-side per-setup totals
- WeightSummaryCard: multiply by quantity in all chart and legend weight calculations
- useItems / useSetups: add quantity to ItemWithCategory / SetupItemWithCategory interfaces

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 18:04:27 +02:00
makiolajandClaude Sonnet 4.6 923a0f66b0 feat: add quantity field to items schema
Add integer quantity column (default 1) to the items table, generate
the corresponding Drizzle migration, and extend createItemSchema /
updateItemSchema with an optional positive-integer quantity field.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 18:04:15 +02:00
makiolajandClaude Opus 4.6 1b492f2ac2 docs: add v1.4 Collection Tools design spec
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 18:00:02 +02:00
makiolajandClaude Opus 4.6 70466a9a1c fix(ci): install unzip before Bun in E2E job
CI / ci (push) Successful in 25s
CI / e2e (push) Successful in 1m21s
The Playwright Docker image lacks unzip, which Bun's install script requires.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 17:47:50 +02:00
makiolajandClaude Opus 4.6 5e0771d929 ci: add Playwright E2E tests to CI pipeline
CI / ci (push) Successful in 25s
CI / e2e (push) Failing after 55s
Runs as a separate job after unit tests pass, using the official
Playwright Docker image with Chromium pre-installed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 17:45:52 +02:00
makiolajandClaude Opus 4.6 70211bdc57 fix: add bunfig.toml to scope bun test to tests/ directory
CI / ci (push) Successful in 26s
Prevents bare `bun test` from picking up Playwright .spec.ts files
in the e2e/ directory.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 17:43:53 +02:00
makiolajandClaude Opus 4.6 35989f8120 docs: update CLAUDE.md with branching workflow, E2E testing commands
CI / ci (push) Failing after 22s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 17:42:01 +02:00
makiolajandClaude Opus 4.6 b974675b11 fix: scope bun test to tests/ directory to exclude Playwright files
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 16:25:56 +02:00
makiolajandClaude Sonnet 4.6 c4ce96ce4f test: add E2E tests for threads, auth, and error handling
Also fix CandidateListItem to not use Reorder.Item when isActive=false,
which caused a framer-motion crash on resolved thread detail pages.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 16:23:26 +02:00
makiolajandClaude Sonnet 4.6 60db8bd9de test: add E2E tests for dashboard and collection views
Covers dashboard card rendering (item count, nav links, active thread/setup counts)
and collection page (gear display, search, category filter, tab switching).
Updates playwright config to serve production build with pre-seeded test DB.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 16:14:07 +02:00
makiolajandClaude Sonnet 4.6 ecbfbc00e9 test: add E2E database seed and Playwright global setup
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 16:10:12 +02:00
makiolajandClaude Opus 4.6 f7ce380104 chore: install Playwright and add E2E test configuration
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 16:07:50 +02:00
makiolaj 0d7c4f476a test: add unit tests for rate limiter middleware 2026-04-03 16:05:54 +02:00
makiolajandClaude Opus 4.6 86a4a747b5 test: add unit tests for parseId helper
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 16:05:35 +02:00
makiolajandClaude Sonnet 4.6 e9d33e59e9 refactor: add useFormatters hook to reduce boilerplate across 14 components
Created useFormatters() combining useWeightUnit + useCurrency + formatWeight/formatPrice
into a single hook returning weight(grams) and price(cents) bound functions plus
raw unit and currency values. Updated all 14 consumer files to use the new hook,
removing the repeated 4-import + 2-hook-call pattern from each.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 15:49:16 +02:00
makiolajandClaude Sonnet 4.6 5308991123 refactor: replace hand-written test SQL with Drizzle migration runner
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 15:44:42 +02:00
makiolajandClaude Opus 4.6 a6e7035aab chore: mark planning category filter todo as done
The icon-aware CategoryFilterDropdown was already wired into PlanningView
during Phase 8 (v1.2), replacing the native <select>.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 15:43:45 +02:00
makiolajandClaude Opus 4.6 0eaf401cce docs: update PROJECT.md constraints to reflect auth implementation
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 15:38:27 +02:00
makiolajandClaude Sonnet 4.6 a3061b22ca refactor: extract tab views from collection route into separate components
Moves CollectionView, PlanningView, and SetupsView out of the 634-line collection/index.tsx into dedicated component files. Pure extraction — zero logic changes.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 15:37:44 +02:00
makiolajandClaude Opus 4.6 1dff6abb3b feat: add error boundary to root route for crash resilience
Adds a TanStack Router error boundary to the root route so rendering errors or uncaught React Query failures show a friendly error page instead of white-screening the app. The error boundary displays a professional error message with a "Try again" button that resets state and invalidates router data.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 15:36:11 +02:00
makiolajandClaude Opus 4.6 2dddba9a08 feat: add rate limiting on login and setup endpoints
Implement in-memory rate limiter with 5 attempts per 15-minute window per IP address. Protects brute-force attacks on credential endpoints.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 15:36:03 +02:00
makiolajandClaude Opus 4.6 41a2910aeb fix: add centralized error handler for unhandled exceptions
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 15:34:51 +02:00
makiolajandClaude Sonnet 4.6 ecff58500e fix: validate route ID parameters, return 400 for invalid IDs
Adds parseId helper in src/server/lib/params.ts and applies it across
all route files so non-positive-integer IDs return 400 instead of
silently passing NaN to services.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 15:34:06 +02:00
makiolajandClaude Sonnet 4.6 3016eb1a1a fix: add explicit DB context middleware for all API routes
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 15:31:11 +02:00
makiolajandClaude Opus 4.6 4f434f39bf fix: replace @/ path alias with relative imports in MCP server
CI / ci (push) Successful in 33s
The @/ alias resolves via tsconfig but not in production where
Bun runs server files directly. Use relative paths instead.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 14:22:23 +02:00
makiolajandClaude Opus 4.6 6ae41c4ffa fix: add missing framer-motion dependency
CI / ci (push) Successful in 24s
Was imported in collection/index.tsx but not in package.json,
causing build failures in CI.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 14:08:37 +02:00
makiolajandClaude Opus 4.6 be168c8329 fix: replace network-dependent image tests with local HTTP server
CI / ci (push) Failing after 25s
Use Bun.serve to create a local test server instead of hitting
external URLs. Fixes flaky test in CI environments without
network access.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 14:07:16 +02:00
makiolajandClaude Opus 4.6 9191f0fe24 fix: resolve all lint errors — exclude generated dirs, auto-fix source
CI / ci (push) Failing after 20s
Exclude drizzle/ and .planning/ from Biome (generated files with
incompatible formatting). Auto-fix import ordering and formatting
in existing source files.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 14:05:10 +02:00
makiolajandClaude Opus 4.6 e34a2cad11 docs: add authentication, API reference, and MCP server guides
CI / ci (push) Failing after 11s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 14:00:03 +02:00
makiolajandClaude Opus 4.6 790fc07f5a docs: expand CLAUDE.md with auth details and MCP tool reference
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:55:59 +02:00
makiolajandClaude Opus 4.6 4148833644 fix: only show onboarding wizard after account setup
The wizard creates categories via POST which requires auth.
Gate the wizard on isAuthenticated so users create their
account first via Sign In, then the wizard appears.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:49:44 +02:00
makiolajandClaude Opus 4.6 17d76761bb fix: address code review issues — MCP auth, error handling, password route
- MCP auth middleware now rejects requests without API key when users exist
- Image /from-url route distinguishes validation errors (400) from server errors (500)
- Password change route returns 401 when no session cookie instead of crashing

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:42:34 +02:00
makiolajandClaude Opus 4.6 ba9662aeaf docs: add MCP server configuration and auth docs to CLAUDE.md
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:39:07 +02:00
makiolajandClaude Opus 4.6 6f51432d42 feat: add MCP server with streamable HTTP transport at /mcp
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:38:18 +02:00
makiolajandClaude Opus 4.6 8919829167 feat: add MCP tool handlers, definitions, and collection resource
Wrap existing service layer with MCP-compatible tool handlers for items,
categories, threads/candidates, setups, and image fetching. Add collection
summary resource for overview data. All 14 MCP-specific tests passing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:35:27 +02:00
makiolajandClaude Opus 4.6 a10156142f chore: install @modelcontextprotocol/sdk
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:31:46 +02:00
makiolajandClaude Opus 4.6 5bb728e545 feat: add password change and API key management to settings
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:30:50 +02:00
makiolajandClaude Opus 4.6 511fece4c7 feat: add login button to header and conditional edit UI
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:29:01 +02:00
makiolajandClaude Opus 4.6 87a367d41b feat: add useAuth hook and login page
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:27:23 +02:00
makiolajandClaude Opus 4.6 66dc8ec8ee feat: register auth routes and apply write-protection middleware
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:25:51 +02:00
makiolajandClaude Opus 4.6 e0e7bfce3e feat: add auth routes for login, setup, and API key management
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:24:26 +02:00
makiolajandClaude Opus 4.6 8138458d8d feat: add auth middleware for write endpoint protection
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:22:00 +02:00
makiolajandClaude Opus 4.6 7c4fa9d9d2 feat: add auth service with user, session, and API key management
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:20:27 +02:00
makiolajandClaude Opus 4.6 32c7b41ce5 feat: add users, sessions, and api_keys tables
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:18:07 +02:00
makiolajandClaude Opus 4.6 b3a13fa974 feat: add POST /api/images/from-url route
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:17:10 +02:00
makiolajandClaude Opus 4.6 0004329895 feat: add image URL fetching service with tests
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:15:56 +02:00
makiolajandClaude Opus 4.6 d104e9788f feat: add imageSourceUrl to Zod schemas and service functions
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:14:13 +02:00
makiolajandClaude Opus 4.6 1eb4a786ce feat: add imageSourceUrl column to items and threadCandidates
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:12:33 +02:00
makiolajandClaude Opus 4.6 0998f65c6f chore: add .worktrees/ to gitignore
CI / ci (push) Failing after 19s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:09:50 +02:00
makiolajandClaude Opus 4.6 a6a4ffda2e docs: add implementation plans for image URL fetching, auth, and MCP server
Three detailed implementation plans with TDD, exact code, and step-by-step tasks:
- Image URL fetching: 4 tasks (schema, Zod, service, route)
- Authentication: 9 tasks (tables, service, middleware, routes, frontend)
- MCP server: 9 tasks (SDK, tools, resources, Hono integration)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 13:06:46 +02:00
makiolajandClaude Opus 4.6 dde2fc241d docs: add design specs for image URL fetching, auth, and MCP server
Three independent feature specs covering:
- API endpoint for fetching images from URLs with local storage
- Public-read/authenticated-write auth with sessions and API keys
- Built-in MCP server for Claude Code/Desktop integration

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 12:53:51 +02:00
makiolaj 32d6babf24 update lock file
CI / ci (push) Has been cancelled
2026-03-26 08:41:21 +01:00
makiolaj 6fe029f531 Use prebuilt image and rename compose file
CI / ci (push) Failing after 14s
Replace local build with prebuilt image
Image: gitea.jeanlucmakiola.de/makiolaj/gearbox:latest
2026-03-24 09:28:31 +01:00
makiolaj 725901623b chore: unify dev setup with concurrently
Adds concurrently to start both the Vite frontend and Hono backend simultaneously in one terminal via the `bun run dev` command. Also updates documentation in README.md and CLAUDE.md to reflect the new development workflow.
2026-03-24 09:28:31 +01:00
makiolaj a826381981 docs(13): create phase plan
CI / ci (push) Failing after 19s
2026-03-17 16:53:47 +01:00
makiolaj 79d84f1333 docs(13): add research and validation strategy 2026-03-17 16:48:51 +01:00
makiolajandClaude Sonnet 4.6 798bd51597 docs(phase-13): research setup impact preview
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-17 16:47:43 +01:00
makiolaj 14a4c65b94 docs(phase-12): complete phase execution 2026-03-17 15:35:45 +01:00
makiolaj 53c2bd1614 docs(12-01): complete comparison view plan
- ComparisonTable component with 10 attribute rows and sticky label column
- Delta highlighting: blue-50 lightest weight, green-50 cheapest price, gray delta text
- Compare toggle in thread detail toolbar (visible for 2+ candidates)
- All COMP-01 through COMP-04 requirements marked complete
2026-03-17 15:32:24 +01:00
makiolaj 5b4026d36f feat(12-01): wire compare toggle and ComparisonTable into thread detail
- Extend uiStore candidateViewMode union to include "compare" value
- Add columns-3 compare toggle button, shown only when thread has 2+ candidates
- Hide "Add Candidate" button when in compare view (read-only intent)
- Import and render ComparisonTable when candidateViewMode === "compare"
- Pass displayItems so compare view reflects any pending reorder state
- Existing list/grid views unchanged; all 135 tests pass
2026-03-17 15:30:38 +01:00
makiolaj e442b33a59 feat(12-01): add ComparisonTable component
- Side-by-side tabular comparison with all 10 attribute rows (Image, Name, Rank, Weight, Price, Status, Link, Notes, Pros, Cons)
- useMemo delta computation: blue-50 highlight on lightest weight, green-50 on cheapest price
- Gray delta string (+Xg, +$X.XX) shown below non-best cells
- Sticky left column with bg-white to prevent bleed-through on horizontal scroll
- Amber tint + trophy icon on winner column for resolved threads
- Em dash for missing weight/price data (never zero)
- Declarative ATTRIBUTE_ROWS array pattern for clean, maintainable row rendering
2026-03-17 15:29:30 +01:00
makiolaj b090da05fa docs(12): create phase plan 2026-03-17 15:24:49 +01:00
makiolaj bb8fb0a323 docs(phase-12): add validation strategy 2026-03-17 15:21:23 +01:00
makiolaj 918282ff9d docs(phase-12): research comparison view phase 2026-03-17 15:20:11 +01:00
makiolajandClaude Opus 4.6 50672cb662 docs(phase-11): complete phase execution
CI / ci (push) Failing after 11s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 22:39:22 +01:00
makiolajandClaude Opus 4.6 7e06c8526b fix(11): wire handleDragEnd to Reorder.Group for active threads
onPointerUp was incorrectly placed on the resolved-thread div instead
of the active-thread Reorder.Group, causing drag reorder to not persist.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 22:36:40 +01:00
makiolajandClaude Opus 4.6 4304d0fcd7 docs(11-02): complete drag-to-reorder ranking UI plan
- Add 11-02-SUMMARY.md with implementation details and deviation docs
- Update STATE.md: progress 100%, decisions, session record
- Update ROADMAP.md: phase 11 complete (2/2 plans with summaries)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 22:30:32 +01:00
makiolaj 94c07e79c2 feat(11-02): add view toggle, Reorder.Group drag-to-reorder, and rank badges in grid view
- Thread detail page: list/grid view toggle with LayoutList/LayoutGrid icons
- List view (active threads): Reorder.Group with CandidateListItem for drag-to-reorder
- List view (resolved threads): static CandidateListItem with rank badges, no drag handles
- Grid view: CandidateCard components with rank badges (gold/silver/bronze)
- tempItems pattern prevents React Query flicker during drag
- handleDragEnd fires PATCH /candidates/reorder after drag completes
- View toggle defaults to list view via uiStore candidateViewMode
2026-03-16 22:28:53 +01:00
makiolaj acfa99516d feat(11-02): add useReorderCandidates hook, candidateViewMode, and CandidateListItem component
- Add useReorderCandidates mutation hook with apiPatch to /candidates/reorder endpoint
- Add candidateViewMode (list|grid) state and setCandidateViewMode to uiStore
- Create CandidateListItem component with drag handle, rank badge, horizontal layout
- Export RankBadge helper (gold/silver/bronze medal icons for top 3)
- Add style prop support to LucideIcon component
- Add pros/cons fields to CandidateWithCategory in useThreads.ts
2026-03-16 22:27:18 +01:00
makiolaj 495a2eabf5 docs(11-01): complete sort_order + reorder backend plan
- Create 11-01-SUMMARY.md with full execution record
- Update STATE.md: progress 89%, decisions, metrics, session
- Update ROADMAP.md: phase 11 marked in-progress (1/2 plans)
- Mark requirements RANK-01, RANK-04, RANK-05 complete
2026-03-16 22:24:08 +01:00
makiolaj d6acfcb126 feat(11-01): PATCH /api/threads/:id/candidates/reorder route + tests
- Import reorderCandidatesSchema and reorderCandidates into threads route
- Add PATCH /:id/candidates/reorder route with Zod validation
- Returns 200 + { success: true } on active thread, 400 on resolved thread
- Add 5 route tests: success, order persists, resolved guard, empty array, missing field
2026-03-16 22:22:31 +01:00
makiolaj f01d71d6b4 feat(11-01): schema, service, and tests for sort_order + reorderCandidates
- Add sortOrder REAL column to threadCandidates schema (default 0)
- Add sort_order column to test helper CREATE TABLE
- Add reorderCandidatesSchema to shared/schemas.ts
- Add ReorderCandidates type to shared/types.ts
- getThreadWithCandidates now orders candidates by sort_order ASC
- createCandidate appends at max sort_order + 1000 (first = 1000)
- Add reorderCandidates service function (transaction, active-only guard)
- Add 5 new tests: ordering, appending, reorder success, resolved guard, missing thread
2026-03-16 22:21:42 +01:00
makiolaj 2986bdd2e5 docs(11-candidate-ranking): create phase plan 2026-03-16 22:15:56 +01:00
makiolaj 11ee50db49 docs(phase-11): add validation strategy 2026-03-16 22:08:30 +01:00
makiolaj a55d58cef3 docs(phase-11): research candidate ranking phase 2026-03-16 22:07:36 +01:00
makiolaj d380e756ea docs(state): record phase 11 context session 2026-03-16 22:02:31 +01:00
makiolaj e4c6991ec6 docs(11): capture phase context 2026-03-16 22:02:20 +01:00
makiolaj 685acd2ab2 docs(phase-10): complete phase execution 2026-03-16 21:42:18 +01:00
makiolaj 2ce54e5990 chore(10-01): add Drizzle migration for pros/cons columns
- drizzle/0004_soft_synch.sql: ALTER TABLE thread_candidates ADD COLUMN pros/cons
- drizzle/meta/0004_snapshot.json: updated schema snapshot
- drizzle/meta/_journal.json: migration journal entry
2026-03-16 21:38:55 +01:00
makiolaj 11912a9416 docs(10-01): complete pros/cons schema foundation plan
- Add 10-01-SUMMARY.md with TDD execution results
- STATE.md: updated metrics, decisions, session, progress
- ROADMAP.md: phase 10 marked complete (1/1 plans)
- REQUIREMENTS.md: RANK-03 marked complete
2026-03-16 21:38:40 +01:00
makiolaj 4f2aefe7a4 feat(10-01): wire pros/cons through client hooks, form, and card indicator
- CandidateResponse: add pros/cons string|null fields
- CandidateForm: add pros/cons to FormData, INITIAL_FORM, pre-fill, payload
- CandidateForm: add Pros/Cons textarea inputs (after Notes, before Product Link)
- CandidateCard: add pros/cons props, render purple +/- Notes badge when present
- Thread detail route: pass pros/cons props to CandidateCard
2026-03-16 21:36:10 +01:00
makiolaj 7a64a1887d feat(10-01): add pros/cons columns through backend
- Add pros/cons nullable TEXT columns to threadCandidates schema
- Generate and apply Drizzle migration (0004_soft_synch.sql)
- Mirror pros/cons columns in test helper CREATE TABLE
- createCandidate: pass pros/cons to values() object
- updateCandidate: add pros/cons to Partial type
- getThreadWithCandidates: include pros/cons in select projection
- createCandidateSchema: add optional pros/cons string fields
2026-03-16 21:32:38 +01:00
makiolaj 719f7082da test(10-01): add failing tests for pros/cons on thread candidates
- createCandidate stores and returns pros/cons fields
- createCandidate returns null when pros/cons not provided
- updateCandidate can set and clear pros/cons
- getThreadWithCandidates includes pros/cons on each candidate
2026-03-16 21:31:39 +01:00
makiolaj 67044f8f2e docs(10): create phase plan 2026-03-16 21:26:59 +01:00
makiolaj 66d1cf2f55 docs(10): add research and validation strategy 2026-03-16 21:23:32 +01:00
makiolaj fbc856b885 docs(10): research phase schema foundation pros/cons fields 2026-03-16 21:22:12 +01:00
makiolaj b43472b09a docs: create milestone v1.3 roadmap (4 phases) 2026-03-16 21:14:53 +01:00
makiolaj e44807fd37 docs: define milestone v1.3 requirements 2026-03-16 21:11:56 +01:00
makiolaj 4689d49b93 docs: complete project research 2026-03-16 21:08:09 +01:00
makiolaj 2fa4427de5 docs: start milestone v1.3 Research & Decision Tools 2026-03-16 20:53:52 +01:00
makiolajandClaude Opus 4.6 9647f5759d feat: redesign weight summary legend and add currency selector
Redesign WeightSummaryCard stats from a disconnected 4-column grid to a
compact legend-style list with color dots, percentages, and a divider
before the total row. Switch chart and legend colors to a neutral gray
palette.

Add a currency selector to settings (USD, EUR, GBP, JPY, CAD, AUD) that
changes the displayed symbol across the app. This is visual only — no
value conversion is performed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 20:33:07 +01:00