Commit Graph

571 Commits

Author SHA1 Message Date
c98995288b docs(phase-26): evolve PROJECT.md after phase completion
Some checks failed
CI / ci (push) Failing after 10s
CI / deploy (push) Has been skipped
CI / e2e (push) Has been skipped
2026-04-10 15:08:50 +02:00
c892800969 docs(phase-26): complete phase execution 2026-04-10 15:08:18 +02:00
31a72c68f3 docs(26-03): complete discovery landing page plan
- 26-03-SUMMARY.md: landing page rewrite and PublicSetupCard enhancement
- STATE.md: advanced to phase complete, recorded decisions
- ROADMAP.md: phase 26 marked complete (3/3 plans)
- REQUIREMENTS.md: DISC-01 through DISC-05 marked complete
2026-04-10 15:03:00 +02:00
8aaf4352ed feat(26-03): rewrite landing page as public discovery page
- Replace DashboardPage with LandingPage using discovery hooks
- Add HeroSection with Discover Gear heading and catalog search trigger
- Add PopularSetupsSection using useDiscoverySetups with PublicSetupCard
- Add RecentItemsSection using useDiscoveryItems with GlobalItemCard
- Add TrendingCategoriesSection using useDiscoveryCategories with pills
- Conditional Go to Collection CTA for authenticated users
- Loading skeletons with animate-pulse for all three sections
- Empty state handling: sections return null when no data
- SectionSkeleton helper for consistent loading states
- All clickable elements have cursor-pointer
2026-04-10 15:01:49 +02:00
0bf1c68043 feat(26-03): enhance PublicSetupCard with itemCount and creatorName
- Add optional itemCount and creatorName fields to PublicSetupCardProps
- Render item count badge (blue pill) when itemCount > 0
- Render creator attribution line when creatorName is present
- Reorder card layout: name, creator, then count/date row
- Add cursor-pointer to Link className
- Backward compatible: existing usages passing only id/name/createdAt unaffected
2026-04-10 15:00:57 +02:00
0b2e355bf8 docs(26-02): complete discovery routes and hooks plan 2026-04-10 14:59:58 +02:00
747a1c3727 feat(26-02): React Query hooks for discovery data
- Create useDiscoverySetups, useDiscoveryItems, useDiscoveryCategories hooks
- Export DiscoverySetup and DiscoveryCategory interfaces
- Set staleTime 2min for setups/items, 5min for categories
2026-04-10 14:57:53 +02:00
0323e0cd33 feat(26-02): discovery HTTP routes, server registration, and route tests
- Create src/server/routes/discovery.ts with GET /setups, /items, /categories handlers
- Register discoveryRoutes in src/server/index.ts with browseTier rate limiting
- Add auth skip for /api/discovery/* GET requests in auth middleware
- Create tests/routes/discovery.test.ts with 10 tests covering all endpoints and pagination
2026-04-10 14:57:35 +02:00
a00b90d97a docs(26-01): complete discovery service plan
- SUMMARY.md: discovery service with cursor pagination
- STATE.md: advanced to plan 2, added decisions, updated progress to 71%
- ROADMAP.md: phase 26 in progress (1/3 plans)
- REQUIREMENTS.md: DISC-02, DISC-03, DISC-04, INFR-02 marked complete
2026-04-10 14:55:15 +02:00
d1f8a7aa4c feat(26-01): implement discovery service with cursor pagination
- getPopularSetups: public setups ordered by item count desc, composite cursor pagination
- getRecentGlobalItems: global items ordered by createdAt desc, ISO timestamp cursor
- getTrendingCategories: category counts ordered desc, null categories excluded, simple limit
- Shared CursorPage<T> response shape with hasMore and nextCursor fields
2026-04-10 14:54:13 +02:00
06b6e935f2 test(26-01): add failing tests for discovery service
- getPopularSetups: ordering, privacy filter, cursor pagination, creatorName
- getRecentGlobalItems: ordering, cursor pagination, second page deduplication
- getTrendingCategories: ordering by count desc, null category exclusion, empty state
2026-04-10 14:53:09 +02:00
2f88ead599 fix(26): revise plans based on checker feedback 2026-04-10 14:48:44 +02:00
9226dd3d90 docs(26): create phase plan 2026-04-10 14:45:38 +02:00
9336cd80ed docs(phase-26): add research and validation strategy 2026-04-10 14:38:53 +02:00
6b446033b5 docs(phase-26): research discovery landing page
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 14:38:10 +02:00
274bced96d docs(state): record phase 26 context session 2026-04-10 14:33:04 +02:00
dbab91a3c7 docs(26): capture phase context 2026-04-10 14:32:56 +02:00
b01625473f docs: capture 4 todos - storage tests, image bugs, manufacturer entity
All checks were successful
CI / ci (push) Successful in 1m5s
CI / deploy (push) Has been skipped
CI / e2e (push) Has been skipped
2026-04-10 11:24:26 +02:00
77b84dd208 docs: capture todo - Add cursor pointer to all clickable links 2026-04-10 11:17:56 +02:00
6a1572a817 docs(phase-25): evolve PROJECT.md after phase completion
All checks were successful
CI / ci (push) Successful in 1m18s
CI / e2e (push) Has been skipped
CI / deploy (push) Has been skipped
2026-04-10 11:13:50 +02:00
1789ee9093 docs(phase-25): complete phase execution 2026-04-10 11:13:18 +02:00
aeb3402576 docs(25-02): complete HTTP routes, MCP catalog tools, and attribution display plan 2026-04-10 11:08:16 +02:00
fc9a9134e8 chore(25-02): apply biome formatter to task 1 and 2 files 2026-04-10 11:06:11 +02:00
e4a65314bd feat(25-02): add attribution display on catalog detail page
- GlobalItem interface extended with sourceUrl, imageCredit, imageSourceUrl fields
- Attribution block below image: Photo credit and source link when present
- Product page link (sourceUrl) at bottom of detail page
- Image div mb-6 moved to attribution paragraph for consistent spacing
2026-04-10 11:05:52 +02:00
df6c75f164 feat(25-02): add MCP catalog tools upsert_catalog_item and bulk_upsert_catalog
- New catalog.ts with catalogToolDefinitions and registerCatalogTools
- upsert_catalog_item: single item upsert with full attribution fields (SEED-03)
- bulk_upsert_catalog: batch upsert up to 100 items with created/updated counts
- Registered in createMcpServer after image tools
- 6 new MCP catalog tool tests passing
2026-04-10 11:03:50 +02:00
6491615b1d feat(25-02): add POST single and bulk upsert routes for global items
- POST /api/global-items upserts single item via upsertGlobalItem service
- POST /api/global-items/bulk upserts up to 100 items via bulkUpsertGlobalItems service
- Zod validation via @hono/zod-validator with upsertGlobalItemSchema and bulkUpsertGlobalItemsSchema
2026-04-10 11:02:49 +02:00
25f590247c test(25-02): add failing tests for POST single and bulk upsert routes 2026-04-10 11:02:28 +02:00
9dbf019466 docs(25-01): complete catalog enrichment data layer plan
- SUMMARY.md: attribution columns, upsert service, Zod schemas
- STATE.md: advance to plan 2, add decisions
- ROADMAP.md: update phase 25 progress
- REQUIREMENTS.md: mark CATL-01, CATL-02, CATL-05 complete
2026-04-10 10:59:58 +02:00
c8ebbf8139 feat(25-01): Zod schemas, upsert service functions, passing tests
- Add upsertGlobalItemSchema and bulkUpsertGlobalItemsSchema to schemas.ts
- Add UpsertGlobalItemInput and BulkUpsertGlobalItemsInput types to types.ts
- Implement upsertGlobalItem with onConflictDoUpdate and tag sync
- Implement bulkUpsertGlobalItems processing array in single transaction
- Fix migration 0003 to only add new columns + unique constraint
- All 21 tests pass including 8 new upsert operation tests
2026-04-10 10:58:36 +02:00
9093a2c8f6 test(25-01): add failing tests for upsertGlobalItem and bulkUpsertGlobalItems
- Import upsertGlobalItem and bulkUpsertGlobalItems (not yet exported)
- Tests cover: create, conflict update, attribution fields, tag sync
- Tests cover: empty tags clear, tags omitted leaves untouched
- Tests cover: bulk upsert counts (created vs updated)
2026-04-10 10:56:54 +02:00
39ef9cc433 feat(25-01): add attribution columns and unique constraint to globalItems
- Add sourceUrl, imageCredit, imageSourceUrl nullable columns
- Add unique constraint on (brand, model) pair
- Generate migration 0003_loving_serpent_society.sql
2026-04-10 10:55:55 +02:00
b6970c9a04 fix(25): revise plans based on checker feedback 2026-04-10 10:51:30 +02:00
d9d9532399 docs(25): create phase plan for catalog enrichment and agent tools 2026-04-10 10:45:22 +02:00
6c0c31350e docs(phase-25): add validation strategy 2026-04-10 10:39:10 +02:00
bc2a532238 docs(25): research catalog enrichment and agent tools phase 2026-04-10 10:38:26 +02:00
e805269485 docs(state): record phase 25 context session 2026-04-10 10:33:15 +02:00
56bea00e61 docs(25): capture phase context 2026-04-10 10:33:06 +02:00
e7a9cdb71a docs(phase-24): evolve PROJECT.md after phase completion 2026-04-10 10:18:03 +02:00
a28ff90b35 docs(phase-24): complete phase execution 2026-04-10 10:17:40 +02:00
e1afd542ac fix(24): add withImageUrls to public setup endpoint
Public setup view was missing image URL enrichment, causing item images
to be absent for anonymous visitors. Matches the private endpoint pattern.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 10:17:32 +02:00
9177296223 docs(24-02): complete public access client layer plan
- SUMMARY.md created for 24-02 (auth prompt modal, render-first root, public setup viewing)
- STATE.md updated: plan advanced, progress 100%, decisions recorded
- ROADMAP.md updated: phase 24 complete (2/2 plans with SUMMARYs)
- REQUIREMENTS.md: PUBL-01 through PUBL-05 marked complete
2026-04-10 10:11:17 +02:00
7b0efae0c4 feat(24-02): render-first root layout, guarded write actions, public setup viewing
- Remove authLoading spinner gate — app renders immediately for all visitors
- Expand isPublicRoute to include /, /global-items/*, /setups/*, /users/, /login
- Replace hard window.location.href redirect with soft navigate() after auth resolves
- Remove onboarding loading spinner — pass isAuthenticated as enabled to guard query
- Add AuthPromptModal to root JSX for global availability
- Guard Add to Collection and Add to Thread buttons with isAuthenticated check
- Rework setup detail page to use usePublicSetup for anonymous visitors
- Wrap all write action UI (Add Items, Delete, Public toggle, remove/classify) in isAuthenticated guards
2026-04-10 10:09:41 +02:00
50f9629707 docs(24-01): complete rate limiter factory and tiered public endpoint limits plan
- Add 24-01-SUMMARY.md with execution results
- Advance plan counter to 2/2
- Update progress to 50% (1 of 2 plans complete)
- Mark INFR-01 requirement complete
- Add factory pattern and tier decisions to STATE.md
2026-04-10 10:08:50 +02:00
5619016e41 feat(24-01): apply tiered rate limits to public GET endpoints
- Import createRateLimit in server index
- Create browseTier (120 req/min) for list/search endpoints
- Create detailTier (60 req/min) for individual resource endpoints
- Apply browseTier to /api/global-items and /api/tags GET routes
- Apply detailTier to /api/global-items/:id, /api/setups/:id/public, /api/users/:id/profile GET routes
- Rate limits placed before auth middleware per D-07, D-08
2026-04-10 10:07:38 +02:00
cd85715d05 feat(24-02): add auth prompt state, modal, usePublicSetup hook, guard onboarding
- Extend uiStore with showAuthPrompt/openAuthPrompt/closeAuthPrompt state
- Create AuthPromptModal component with sign in/sign up CTAs pointing to /login
- Add usePublicSetup hook to useSetups for anonymous setup viewing via public API
- Rework useOnboardingComplete to accept enabled param (guards auth-gated call)
2026-04-10 10:06:59 +02:00
afab8175f9 feat(24-01): refactor rateLimit to factory pattern with createRateLimit
- Add createRateLimit(maxAttempts, windowMs) factory function
- Rewrite rateLimit export to delegate to factory (backward compatible)
- Keep shared store, getClientIp, cleanup, and _resetForTesting unchanged
- Add createRateLimit factory test suite with 5 test cases
- All existing rateLimit middleware tests still pass
2026-04-10 10:06:19 +02:00
08ff7d59bf docs(24): create phase plan 2026-04-10 10:02:35 +02:00
2a8a479012 docs(24): add validation strategy 2026-04-10 09:57:52 +02:00
2a55b282cb docs(24): research public access and infrastructure phase 2026-04-10 09:57:11 +02:00
01373260bd Graphify output
All checks were successful
CI / ci (push) Successful in 1m17s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
2026-04-09 15:18:36 +02:00