Commit Graph
100 Commits
Author SHA1 Message Date
makiolaj fefef38e9b docs: add agent execution model to catalog population spec 2026-04-18 14:39:59 +02:00
makiolaj 4ba42f521c docs(34): add code review report 2026-04-18 14:13:08 +02:00
makiolaj 26e20bd0d2 docs: catalog population design spec 2026-04-18 14:11:50 +02:00
makiolaj fd874a3ff2 docs(34-05): complete German translations plan summary
- All 6 German locale namespaces verified complete and passing
- Key parity test passes (22/22)
- Build passes with both locales
2026-04-18 14:09:20 +02:00
makiolaj 31297a3921 fix(34-05): add missing German translation keys to collection namespace
- Add form.msrp, form.purchasePrice, form.itemNamePlaceholder, form.optionalNotes
- Fixes key parity test failure in tests/i18n/locales.test.ts
2026-04-18 14:08:51 +02:00
makiolaj 0570ee3ed5 chore: merge executor worktree (worktree-agent-a3da6e62 — plan 34-04) 2026-04-18 14:07:22 +02:00
makiolaj a1ffcf3061 docs(34-03): complete locale-aware formatter integration plan summary
- All 5 tasks verified complete: useLanguage hook, formatPrice/formatWeight
  with Intl.NumberFormat, useFormatters locale wiring, formatter tests
- 15 tests passing, build clean, CURRENCY_SYMBOLS removed
2026-04-18 14:07:09 +02:00
makiolaj d08a49e8ab docs(34-04): complete language picker and i18n sync plan summary
- Language picker in settings using pill-toggle pattern (English/Deutsch)
- i18n sync with DB setting on load via useEffect in RootLayout
- Both tasks verified complete at commit 46715cc
2026-04-18 14:06:48 +02:00
makiolaj bf64b8f6a5 chore: merge executor worktree (worktree-agent-a1291d63 — plan 34-02) 2026-04-18 14:04:14 +02:00
makiolaj 3ff3ff4cb9 chore: merge executor worktree (worktree-agent-a5cefc89 — plan 34-08) 2026-04-18 14:03:25 +02:00
makiolajandClaude Sonnet 4.6 f91417a24b docs(34-02): complete extract hardcoded strings plan summary
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-18 14:02:41 +02:00
makiolaj 2aa156a6b7 feat(34-02): extract hardcoded strings from modals, routes, and catalog
- AddToCollectionModal: all labels, placeholders, toast messages
- collection/index.tsx: tab labels (Gear/Planning)
- threads/$threadId/index.tsx: thread detail page and AddCandidateModal
- items/$itemId.tsx: back links, action buttons, field labels, metadata
- setups/$setupId.tsx: all setup detail strings and confirm dialog
- users/$userId.tsx: public profile page strings
- global-items/index.tsx: discover/catalog filter UI strings
- Added catalog.json namespace (en + de) and registered in i18n.ts
- Extended en/de threads, setups, collection, common locales with missing keys
2026-04-18 14:01:09 +02:00
makiolaj 6fd8874970 feat(34-02): extract hardcoded strings from thread/candidate components
- CandidateCard: replace all hardcoded titles and badge text with t()
- CandidateListItem: add useTranslation, replace winner/delete/open labels and +/- Notes badge
- CandidateForm: add useTranslation, replace all form labels, placeholders, validation errors, submit button
- ComparisonTable: move STATUS_LABELS inside component with t(), replace all ATTRIBUTE_ROWS labels, View button, impact row labels
- StatusBadge: refactor STATUS_CONFIG to STATUS_ICONS + runtime STATUS_LABELS via t()
- CreateThreadModal: replace title, thread name label, category label, placeholder, cancel/submit buttons, error messages
- AddToThreadModal: replace modal titles, labels, placeholders, back/cancel/submit buttons, error messages
- threads.json: extend candidateForm with category, notes, pros, cons, product link labels and all placeholders
2026-04-18 13:44:26 +02:00
makiolaj c5af1247c0 feat(34-02): i18n collection and item components
- CollectionView: t() for empty state, stats labels, filter text
- ItemCard: t() for tooltip title attributes
- ItemForm: t() for all form labels, placeholders, error messages, buttons
- CategoryPicker: t() for search placeholder, create button, no results
- CategoryFilterDropdown: t() for all categories label, search placeholder
- CategoryHeader: t() for save/cancel buttons, item count
- WeightSummaryCard: t() for title, legend labels, view mode toggle
- ItemPicker: t() for panel title, empty state, action buttons
- ManualEntryForm: t() for all form labels, error messages, submit button
- LinkToGlobalItem: t() for all UI chrome strings
- ProfileSection: t() for all form labels, messages, buttons
- collection.json: added new keys for categoryPicker, categoryFilter, weightSummary, itemPicker, categoryHeader, linkToGlobal, manualEntry, profileSection, itemCard
2026-04-18 13:35:59 +02:00
makiolaj f4e93bf554 docs(34-08): complete German translation gap closure plan summary
- 58 missing German keys added across 5 de/*.json files
- 19/19 i18n parity tests pass
- 1 deviation: fixed JSON syntax error from smart quotes
2026-04-18 13:29:38 +02:00
makiolaj 23172f794f fix(34-08): add 58 missing German translations to 5 de/*.json locale files
- de/common.json: add home, imageUpload, profile sections (34 keys)
- de/settings.json: add currency.suggestion, currency.switch, showConversions (4 keys)
- de/threads.json: add card.candidates, card.candidates_one, planning section (11 keys)
- de/setups.json: add card.by, card.anonymous, impact.compareWith (3 keys)
- de/collection.json: add tabs.setups, totals, classificationBadge (6 keys)
- Fixed JSON syntax error: replaced smart quotes in dangerZoneDescription with single quotes
- All German text uses proper Unicode umlauts throughout
- bun test tests/i18n/locales.test.ts: 19 pass, 0 fail
2026-04-18 13:29:12 +02:00
makiolaj e27c919430 docs(34-01): complete i18n foundation plan summary
- Install react-i18next, i18next, i18next-browser-languagedetector
- Create 6 English namespace JSON files from component string extraction
- Initialize i18n with LanguageDetector before React rendering
2026-04-18 13:28:35 +02:00
makiolajandClaude Opus 4.6 8634ca41c1 docs(34-08): gap closure plan for 58 missing German translations
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-18 13:22:25 +02:00
makiolaj 95c0ab4037 test(34): gap closure verification — 2 gaps found (missing German keys)
CI / ci (push) Failing after 21s
CI / deploy (push) Has been skipped
CI / e2e (push) Has been skipped
2026-04-17 20:38:39 +02:00
makiolaj 6376cfcb8d docs(34): add code review report 2026-04-17 20:34:56 +02:00
makiolaj 3c973e8ec1 docs(34-07): complete German umlaut correction plan summary 2026-04-17 20:31:24 +02:00
makiolaj 1963faea84 fix(34-07): replace ASCII umlaut fallbacks with proper Unicode in all German locale files
- common.json: Löschen, Schließen, Zurück, Bestätigen, Änderungen, Überspringen, Gegenstände, etc.
- collection.json: Ausrüstung, Gegenstände, Zusätzliche, Hinzufügen
- threads.json: wählen, Kategorie, hinzufügen, Sammlung, hinzugefügt
- setups.json: Ausrüstung, Gegenstände, Öffentlich, Läuft, können, Zurückschalten
- onboarding.json: Ausrüstung, Gegenstände, wählen, fügen, überspringen, prüfen, Stöbern
- settings.json: Schlüssel, Währung, Wählen, Ändern, Gegenstände, Ausrüstung
2026-04-17 20:30:48 +02:00
makiolaj 4a23904c3f docs(34-06): complete i18n gap closure — routes and components plan summary 2026-04-17 20:27:39 +02:00
makiolaj 480abdd17f feat(34-06): wire useTranslation into 10 remaining components
- ThreadTabs: tab labels (gear, planning, setups) via collection namespace
- PlanningView: section title, tab labels, empty state steps, CTAs via threads namespace
- TotalsBar: 'Sign in' link via common.auth.signIn
- ThreadCard: resolved badge and candidate count (plural) via threads namespace
- PublicSetupCard: by/anonymous and item count (plural) via setups namespace
- SetupImpactSelector: compare dropdown placeholder via setups.impact.compareWith
- ClassificationBadge: base/worn/consumable labels via collection.classificationBadge
- ImpactDeltaBadge: add mode label via setups.impact.adding
- ImageUpload: click-to-add, error messages via common.imageUpload
- DashboardCard: skipped (renders props only, no hardcoded UI strings)
- Add card, planning keys to en/de threads.json
- Add classificationBadge, tabs, totals keys to en/de collection.json
- Add card.by, card.anonymous, impact.compareWith to en/de setups.json
- Add imageUpload keys to en/de common.json
- Build passes, all 19 i18n parity tests pass
2026-04-17 20:26:50 +02:00
makiolaj 755c0ab89f feat(34-06): wire useTranslation into routes and settings currency suggestion
- Add useTranslation to routes/index.tsx: home section headings use t()
- Add useTranslation to routes/profile.tsx: all profile/security/danger zone strings use t()
- Wire currency suggestion banner in settings.tsx with t() interpolation
- Wire showConversions section title/description in settings.tsx
- Add home and profile keys to en/common.json
- Add currency.suggestion, currency.switch, showConversions to en/settings.json
- Add corresponding German translations with proper umlauts to de/common.json and de/settings.json
2026-04-17 20:21:54 +02:00
makiolaj b21ba0d97b docs(34): create gap closure plans for missing i18n wiring and German umlauts 2026-04-17 20:09:47 +02:00
makiolaj 459a4ed4b0 test(34): UAT complete — 6 passed, 1 issue (incomplete German translation coverage) 2026-04-17 20:05:31 +02:00
makiolajandClaude Opus 4.6 28dfef555c feat: wire currency conversion into price display
CI / ci (push) Successful in 1m22s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
useFormatters().price() now accepts an optional sourceCurrency param.
When showConversions is enabled and the source differs from the user's
currency, it converts via ECB rates and shows dual format:
"€200.00 (~$218.00)". ItemCard and CollectionView pass priceCurrency
through from API data. Setup detail items also pass priceCurrency.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 21:44:32 +02:00
makiolajandClaude Opus 4.6 c4ddc573d4 fix: price labels use user's selected currency instead of hardcoded $
CI / ci (push) Successful in 1m21s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 15s
Replaced hardcoded "Price ($)" labels across 6 components and 2 locale
files to display the user's selected currency (EUR, GBP, USD, etc.).
AddToCollectionModal also updated to show correct currency.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 21:33:32 +02:00
makiolajandClaude Opus 4.6 23027551b4 fix: currency suggestion uses region detection, seed adds market prices
CI / ci (push) Successful in 1m24s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 15s
- Currency auto-suggestion now uses locale region subtag (en-US → US → USD,
  en-DE → DE → EUR) instead of language prefix. Fixes wrong suggestion for
  users with English browser locale in European countries.
- Added dismiss button (X) to suggestion banner
- Dev seed script now clears existing dev data before re-seeding (safe to
  run repeatedly without manual DB cleanup)
- Added DEV_MARKET_PRICES with multi-market UVP data for 10 global items
  (EU/US/UK prices) and community prices for 5 owned items

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 21:27:57 +02:00
makiolajandClaude Opus 4.6 51c8703a3d fix: share modal UX improvements and creator name fallback
CI / ci (push) Successful in 1m26s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 21s
- Share links section always visible (not just in link/public mode),
  supporting future write-access link shares on public setups
- Link list layout improved: URL and expiration stacked vertically,
  action buttons have hover backgrounds, trash icon replaces X
- Public setup cards show "by Anonymous" when creator has no display name

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 20:49:28 +02:00
makiolajandClaude Opus 4.6 4c80e9aa3c fix: allow unauthenticated access to /items/* with setup context
CI / ci (push) Successful in 1m23s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 15s
Items accessed via ?setup= or ?share= query params are now treated as
public routes, preventing the auth redirect to /login.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 20:34:13 +02:00
makiolajandClaude Opus 4.6 4b26a6c88e feat: public item detail view for shared and public setups
CI / ci (push) Successful in 1m23s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 15s
Items in shared/public setups are now viewable without auth. Clicking
an item in a shared setup navigates to /items/:id?setup=:setupId&share=token
which fetches the item via a public endpoint authorized by the setup's
visibility or share token. Read-only mode hides all owner controls.

- Added getSetupItemById service function
- Added GET /api/shared/:token/items/:itemId endpoint
- Added GET /api/setups/:setupId/items/:itemId/public endpoint
- Added usePublicSetupItem and useSharedSetupItem hooks
- Item detail page detects setup context and switches to public fetch
- Back link returns to setup instead of collection in setup context

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 20:17:54 +02:00
makiolajandClaude Opus 4.6 731d677da6 fix: shared setup items link to catalog instead of requiring auth
Items with a globalItemId now link to /global-items/:id (public) in
shared and public setup views. Items without a catalog link are not
clickable. Owner view behavior unchanged.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 20:10:02 +02:00
makiolajandClaude Opus 4.6 1fbd9bc609 fix: inject db context for /s/* short share URL route
CI / ci (push) Successful in 1m22s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 15s
The /s/:token route was registered outside the /api/* db middleware
scope, causing db to be undefined and a 500 error on share link access.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 20:01:48 +02:00
makiolajandClaude Opus 4.6 e21e1ec523 fix: allow visibility-only setup updates without name
CI / ci (push) Successful in 1m24s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
updateSetupSchema required name as mandatory, causing ZodError when
ShareModal sent visibility-only updates. Made name optional in update
schema and guarded against setting undefined name in service layer.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:43:10 +02:00
makiolajandClaude Opus 4.6 8d7a668da4 fix: resolve lint errors from phase 32/33/34 execution
CI / ci (push) Successful in 1m23s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 1m20s
Auto-fixed formatting issues and removed unused imports introduced
by background execution agents across currency, i18n, and sharing code.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:32:32 +02:00
makiolaj ceee6c0f13 docs(phase-34): complete i18n foundation phase execution
CI / ci (push) Failing after 11s
CI / e2e (push) Has been skipped
CI / deploy (push) Has been skipped
2026-04-13 18:24:22 +02:00
makiolaj 5e731b436b feat(i18n): add German translations and key parity test
- Create all 6 German namespace JSON files (common, collection, threads, setups, onboarding, settings)
- Register German locale in i18n configuration with supportedLngs
- Add key parity test ensuring en/de have identical key structures
- All 19 locale parity tests pass, all 15 formatter tests pass

Phase 34, Plan 05
2026-04-13 18:23:45 +02:00
makiolaj 46715cc793 feat(i18n): add language picker to settings and sync i18n with persisted preference
- Add language picker (English/Deutsch) to settings page using pill-toggle pattern
- Import useLanguage hook and i18n instance in settings
- Language change persists via updateSetting and calls i18n.changeLanguage
- Add useEffect in RootLayout to sync i18n language with DB setting on load
- Language labels use native names (English, Deutsch) for identification

Phase 34, Plan 04
2026-04-13 18:21:30 +02:00
makiolaj f759dd0fde feat(i18n): locale-aware formatters and useLanguage hook
- Create useLanguage() hook following useCurrency/useWeightUnit pattern
- Update formatPrice() to use Intl.NumberFormat for locale-aware currency display
- Update formatWeight() to use Intl.NumberFormat for locale-aware number formatting
- Update formatDualPrice() to pass locale through
- Update useFormatters() to pass locale to all formatters
- Add formatter tests for en/de locales (15 tests passing)

Phase 34, Plan 03
2026-04-13 18:20:23 +02:00
makiolaj 672b17fd13 feat(i18n): extract strings from navigation, dialogs, onboarding, settings, and login
- Add useTranslation() to TopNav, BottomTabBar, FabMenu, UserMenu
- Internationalize ConfirmDialog, AuthPromptModal, ExternalLinkDialog
- Extract all onboarding flow strings (Welcome, HobbyPicker, ItemBrowser, Review, Done)
- Internationalize settings page (weight unit, currency, API keys, import/export)
- Internationalize login page and root error boundary
- All dialogs in __root.tsx use t() for UI chrome

Phase 34, Plan 02 (core navigation and global UI)
2026-04-13 18:19:29 +02:00
makiolaj 8c0fb31df2 feat(i18n): install react-i18next, create English locale files, and initialize i18n framework
- Install i18next, react-i18next, i18next-browser-languagedetector
- Create 6 namespace JSON files (common, collection, threads, setups, onboarding, settings)
- Initialize i18n with language detection (localStorage + navigator)
- Wire i18n import in main.tsx before React rendering

Phase 34, Plan 01
2026-04-13 18:13:55 +02:00
makiolajandClaude Opus 4.6 de82eefa74 docs(phase-33): complete phase execution
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:10:47 +02:00
makiolaj 24304aa8aa docs(34): create phase plans for i18n foundation 2026-04-13 18:10:36 +02:00
makiolajandClaude Opus 4.6 e2127ebb84 docs(33): add summaries for plans 05 and 06 (wave 3 complete)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:10:24 +02:00
makiolajandClaude Opus 4.6 37edd0edfd feat(33-06): add market prices section to catalog detail page
- Add useGlobalItemPrices and useGlobalItemCommunityStats hooks
- Add MarketPricesSection component with user's market MSRP prominent
- Show community price stats per market with median and report count
- Collapsible "Other Markets" section (collapsed by default)
- Import useCurrency, useExchangeRates, formatPrice for market display

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:09:56 +02:00
makiolajandClaude Opus 4.6 02fcae12f0 feat(33-05): market/currency selector, dual price format, conversion toggle
- Add formatDualPrice() with ~prefix for approximate conversions (D-14)
- Evolve useCurrency() to return CurrencyContext with currency, market, showConversions
- Create useExchangeRates hook + convertClientPrice utility
- Redesign settings: Market & Currency selector, Show Converted Prices toggle
- Add locale-based auto-suggestion banner for first-time currency selection (D-13)
- Update useFormatters to destructure from new CurrencyContext

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:08:53 +02:00
makiolajandClaude Opus 4.6 d0bbf48bb5 docs(33): add summaries for plans 03 and 04 (wave 2 complete)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:07:16 +02:00
makiolajandClaude Opus 4.6 3df9eece83 feat(33-04): add community price service, API routes, and setup currency metadata
- Create community-price.service.ts with ownership validation, upsert, median aggregation
- Create community-prices route (GET stats public, POST requires auth + ownership)
- Register community-prices route with public GET access
- Add priceCurrency to both getSetupWithItems and getSetupWithItemsById
- Aggregation uses PERCENTILE_CONT(0.5) with 3-report minimum threshold

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:06:48 +02:00
makiolajandClaude Opus 4.6 7d6c548811 docs: add phase 32 decisions to STATE.md
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:05:54 +02:00
makiolajandClaude Opus 4.6 52dce7b72b feat(33-03): add market prices API, exchange rates endpoint, currency context
- Create market-price.service.ts with getMarketPrices, upsertMarketPrice
- Create exchange-rates route (GET /api/exchange-rates, public)
- Create market-prices route (GET/POST /api/market-prices/global-items/:id/prices)
- Register new routes in server index with public GET access
- Add priceCurrency to item service getAllItems/getItemById/createItem
- Add foundPriceCents/Currency/Date to thread candidate select and create/update

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:05:24 +02:00
makiolajandClaude Opus 4.6 7eb5335a88 docs: add phase 32 plan summaries
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:05:24 +02:00
makiolajandClaude Opus 4.6 0b46eff243 feat: add shared setup viewer with token detection and read-only mode
Detect ?share=token query param on setup detail page, fetch via
/api/shared/:token, and display read-only view with "Shared setup"
banner. Hide all owner controls (add items, share, delete, classification)
in shared view. Show "Link not available" error for invalid tokens.

Plan: 32-04 (Setup Sharing System - Shared Setup Viewer)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:04:41 +02:00
makiolaj a531581623 docs(34): add research and validation strategy 2026-04-13 18:03:57 +02:00
makiolajandClaude Opus 4.6 f8ab69684a docs(33): add summaries for plans 01 and 02 (wave 1 complete)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:02:57 +02:00
makiolajandClaude Opus 4.6 7003e998f9 feat: add share modal with visibility picker and link management
Create ShareModal component with three-tier visibility picker
(private/link/public), share link creation with configurable expiration,
clipboard copy, and link revocation. Wire into setup detail page
replacing the static visibility badge with an interactive share button.

Plan: 32-03 (Setup Sharing System - Share Modal UI)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:02:41 +02:00
makiolajandClaude Opus 4.6 e10f0eda3d feat(33-02): generate migration for market_prices, community_prices tables
- CREATE TABLE market_prices with unique(global_item_id, market, currency)
- CREATE TABLE community_prices with unique(global_item_id, user_id, source_type)
- ALTER TABLE items ADD COLUMN price_currency
- ALTER TABLE thread_candidates ADD COLUMN found_price_cents, found_price_currency, found_price_date
- Note: db:push requires running PostgreSQL — apply on deployment

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:02:40 +02:00
makiolajandClaude Opus 4.6 50bc11c7ed feat(33-01): add currency conversion service with exchange rate caching
- Create currency.service.ts with frankfurter.app ECB rate fetching
- 24h in-memory cache with stale-serve fallback on fetch failure
- convertPrice() handles EUR-base cross-currency conversion
- CURRENCY_MARKET_MAP maps currencies to market regions
- 12 unit tests covering conversion, rounding, unknowns, and mapping

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:02:06 +02:00
makiolajandClaude Opus 4.6 298fa6d586 feat(33-01): add market_prices, community_prices tables and currency columns
- Add marketPrices table with unique(globalItemId, market, currency) constraint
- Add communityPrices table with unique(globalItemId, userId, sourceType) constraint
- Add priceCurrency column to items table (default EUR)
- Add foundPriceCents, foundPriceCurrency, foundPriceDate to threadCandidates
- Add Zod schemas for market price upsert and community price submission
- Export new types from shared/types.ts

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 18:02:00 +02:00
makiolaj 1d15d4b336 docs(state): record phase 34 context session 2026-04-13 18:00:10 +02:00
makiolaj 1992778ce6 docs(34): capture phase context 2026-04-13 18:00:10 +02:00
makiolajandClaude Opus 4.6 da159d10b8 feat: add share link service, API routes, and short URL redirect
Create share.service.ts with token generation (128-bit base64url),
CRUD operations, validation, and visibility transition side effects.
Add share endpoints under /api/setups/:id/shares, shared access at
/api/shared/:token, and /s/:token short URL redirect.

Plan: 32-02 (Setup Sharing System - Share Link Backend)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 17:59:39 +02:00
makiolajandClaude Opus 4.6 7a696f39a5 docs(33): create phase plans for currency system
6 plans across 3 waves covering market-aware pricing, exchange rates,
community price data, and currency-normalized display.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 17:58:37 +02:00
makiolajandClaude Opus 4.6 edc9793c2d feat: migrate setup visibility from boolean to three-tier system
Replace isPublic boolean with visibility enum (private/link/public) across
the full stack. Add shares table to schema for future share link support.
Update all services, routes, schemas, hooks, components, and tests.

Plan: 32-01 (Setup Sharing System - Schema Migration)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 17:55:46 +02:00
makiolajandClaude Opus 4.6 727abf1528 docs(33): add research, validation strategy, and UI design contract
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 17:52:18 +02:00
makiolaj d928634e57 docs(state): record phase 33 context session 2026-04-13 17:45:50 +02:00
makiolaj 634ac298d1 docs(33): capture phase context 2026-04-13 17:45:45 +02:00
makiolajandClaude Opus 4.6 338a78122d docs(32): fix wave assignment — Plan 04 bumped to wave 4
Plans 03 and 04 both modify setups/$setupId.tsx. Per wave assignment
rules, file overlap requires sequential execution. Plan 04 now depends
on Plan 03 and runs in Wave 4.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 17:06:39 +02:00
makiolajandClaude Opus 4.6 81a654085d docs(32): create phase plans for setup sharing system
4 plans in 3 waves:
- Wave 1: Schema migration (isPublic→visibility) + shares table
- Wave 2: Share link service + API routes
- Wave 3: Share modal UI + shared setup viewer

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 17:05:36 +02:00
makiolajandClaude Opus 4.6 9965e356de docs(32): add research and validation strategy for setup sharing system
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 16:59:54 +02:00
makiolaj cb0c1e8c9a docs(32): UI design contract 2026-04-13 16:59:25 +02:00
makiolaj 49c59fded9 docs(state): record phase 32 context session 2026-04-13 16:51:32 +02:00
makiolaj 6833b90795 docs(32): capture phase context 2026-04-13 16:51:23 +02:00
makiolajandClaude Opus 4.6 2853477a75 chore: archive v2.2 User Experience Polish milestone
CI / ci (push) Successful in 1m15s
CI / e2e (push) Has been skipped
CI / deploy (push) Has been skipped
Phases 28-31 archived to milestones/v2.2-phases/
Requirements and roadmap snapshots archived to milestones/

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 16:00:35 +02:00
makiolaj 92b84d2cd6 docs: capture todo - Auth prompt sign-in should redirect directly to Logto 2026-04-13 15:53:07 +02:00
makiolajandClaude Opus 4.6 ebf031a62c fix: cap onboarding to 5 categories with 4 items each
CI / ci (push) Successful in 1m15s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 15:23:10 +02:00
makiolajandClaude Opus 4.6 03e0fe99fa feat: group onboarding items by category
CI / ci (push) Successful in 1m17s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 15:19:02 +02:00
makiolajandClaude Opus 4.6 adbc13eb15 fix: SelectableItemCard used wrong formatter names, globalItems imageFilename→imageUrl
CI / ci (push) Successful in 1m12s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 15:13:23 +02:00
makiolajandClaude Opus 4.6 2beabe88f9 fix: popular-items query referenced non-existent imageFilename on globalItems
CI / ci (push) Successful in 1m17s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 16s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 15:07:38 +02:00
makiolajandClaude Opus 4.6 29f925027c chore: one-liner fixing script for docker exec
CI / ci (push) Successful in 1m15s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 15s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 14:58:19 +02:00
makiolajandClaude Opus 4.6 32fa261ec2 chore: diagnostic and fix script for catalog seeding
CI / deploy (push) Has been cancelled
CI / e2e (push) Has been cancelled
CI / ci (push) Has been cancelled
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 14:57:27 +02:00
makiolajandClaude Opus 4.6 9864a09fc1 chore: shell script for nuke-and-reseed (runs inside container)
CI / ci (push) Successful in 1m16s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 14:20:03 +02:00
makiolajandClaude Opus 4.6 c3874d031a chore: temp script to nuke dev seed user
CI / ci (push) Successful in 1m13s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 14:15:54 +02:00
makiolaj cd55f3c282 fix: seedTags inserts missing tags instead of skipping when any exist
CI / ci (push) Successful in 1m15s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 15s
2026-04-13 14:09:28 +02:00
makiolaj 80f4d1d9ae fix: lint formatting for seed data and item detail page
CI / ci (push) Successful in 1m14s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 17s
2026-04-13 14:03:25 +02:00
makiolaj ba13fa8ded docs: update roadmap, config, and UAT state
CI / ci (push) Failing after 20s
CI / deploy (push) Has been skipped
CI / e2e (push) Has been skipped
2026-04-13 13:56:56 +02:00
makiolaj 13883ea14d fix: add hobby tags to catalog seed data for onboarding discovery 2026-04-13 13:48:40 +02:00
makiolaj bedef04581 test(30): re-test UAT - 3 passed, 1 cosmetic, 3 blocked (catalog seed) 2026-04-13 13:45:47 +02:00
makiolaj c1177764ef docs(29-05): add execution summary 2026-04-13 13:42:20 +02:00
makiolaj ded6bf521e fix(29-05): add local crop state to ImageUpload for immediate preview 2026-04-13 13:42:06 +02:00
makiolaj d91d32deaf docs: capture todo - Fix Add Candidate button shows wrong modal on thread page 2026-04-13 13:39:58 +02:00
makiolaj c98ac6e46f docs(29): create gap closure plan for crop preview state 2026-04-13 13:37:57 +02:00
makiolaj e536f68bd1 docs(29): diagnose crop preview gap - ImageUpload missing local crop state 2026-04-13 13:36:50 +02:00
makiolaj 80cb313b08 test(29): re-test UAT - 4 passed, 2 issues (crop conflicts) 2026-04-13 13:34:00 +02:00
makiolajandClaude Opus 4.6 159ff824b2 fix: position crop button as overlay next to trash icon on image
CI / ci (push) Successful in 1m11s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 13s
Moved the crop button from below the image into the ImageUpload
component as an absolute-positioned overlay next to the trash icon,
matching the visual pattern.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 23:49:10 +02:00
makiolajandClaude Opus 4.6 09952e37b4 fix: move crop button into edit mode so it's reachable
CI / ci (push) Successful in 1m12s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
The crop icon button was in the view-mode branch but conditioned on
isEditing, making it unreachable. Moved it below ImageUpload in the
edit-mode branch where it belongs.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 23:44:56 +02:00
makiolajandClaude Opus 4.6 fe5bd49b75 fix: save dominant color from image upload to item record
CI / ci (push) Successful in 1m12s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 13s
ImageUpload was discarding the dominantColor returned by the upload
API. Now it passes the color through onChange and the item detail
page saves it to the item record immediately after upload.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 23:39:13 +02:00
makiolajandClaude Opus 4.6 ef531f79b2 fix: update email display in UI after email change
CI / ci (push) Successful in 1m11s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
The OIDC session token retains the old email after a Logto email
change. Now the server returns the new email in the response and
the frontend optimistically updates the auth cache.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 23:31:24 +02:00
makiolajandClaude Opus 4.6 6108db3dab debug: add detailed error logging for Logto M2M token request failures
CI / ci (push) Successful in 1m10s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 13s
Logs the URL, resource, app ID prefix, and response body when the
token request fails — helps diagnose 400 errors from Logto.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 23:18:05 +02:00