16058d0f4d
chore: update bun.lock for @anthropic-ai/sdk
...
CI / ci (push) Failing after 15s
CI / e2e (push) Has been skipped
CI / deploy (push) Has been skipped
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-18 16:49:33 +02:00
065b262b5b
chore: add db:crawl and db:crawl-all npm scripts
2026-04-18 16:45:54 +02:00
44602d409e
feat: crawl-all batch runner — iterate active manufacturers by tier
2026-04-18 16:45:39 +02:00
3d2911cedc
feat: crawl-manufacturer agent script — Haiku tool-use loop + bulk upsert
2026-04-18 16:45:17 +02:00
b2a725a646
feat: canonical taxonomy — categories and tags for ingestion
2026-04-18 16:44:32 +02:00
44b1eac0ba
feat(catalog): migrate dev seed data to manufacturer-slug-based global items
...
Replace brand text field with manufacturerSlug in DEV_GLOBAL_ITEMS,
global-items-seed.json, and seed-global-items.ts. Add DEV_MANUFACTURERS
for dev-only brands not in SEED_MANUFACTURERS. Expand SEED_MANUFACTURERS
with 8 additional manufacturers referenced by seed JSON (Nemo, Therm-a-Rest,
Toaks, Katadyn, HydraPak, Nitecore, Outdoor Research, Exposure Lights).
Update dev-seed.ts to resolve slug→id before insert and use manufacturerId
as the deduplication key.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-18 16:37:27 +02:00
0b4715b80c
fix: update all tests and MCP catalog tool for manufacturerId schema migration
2026-04-18 16:30:11 +02:00
a508773809
feat: all services join manufacturers for global item brand display
2026-04-18 16:24:24 +02:00
2924c2269c
feat: item service joins manufacturers for brand display
2026-04-18 16:22:10 +02:00
12b3f8e380
feat: upsertGlobalItemSchema — brand → manufacturerSlug
2026-04-18 16:21:32 +02:00
5037350aa0
feat: global-item service uses manufacturerSlug, joins manufacturers for brand
2026-04-18 16:21:25 +02:00
8ff680ef92
feat: migrate globalItems — drop brand text, add manufacturerId FK
2026-04-18 16:19:31 +02:00
f868bbdecf
feat: seed manufacturers list, update seedGlobalItems to resolve by name
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-18 16:16:52 +02:00
ec27df1d0f
feat: manufacturers route — list, get, create
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-18 16:16:27 +02:00
8c1b19f07d
feat: manufacturer service with list, get, create
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-18 16:15:40 +02:00
7de3e9e957
feat: add manufacturers table to schema
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-18 14:54:23 +02:00
2cb83a63f1
docs: catalog population implementation plans (schema migration + ingestion script)
2026-04-18 14:49:34 +02:00
bea386e7db
style(i18n): fix lint — formatting and import ordering across 21 files
...
CI / ci (push) Successful in 1m21s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 1m15s
Biome auto-fix for formatting (line length, ternary wrapping) and
import organization in files touched by phase 34 i18n work.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-18 14:49:10 +02:00
1b2ddcd0bd
docs(phase-34): evolve PROJECT.md after phase completion
CI / ci (push) Failing after 27s
CI / e2e (push) Has been skipped
CI / deploy (push) Has been skipped
2026-04-18 14:42:16 +02:00
be5b318041
docs(phase-34): complete phase execution
2026-04-18 14:41:42 +02:00
dbab84ef2a
fix(i18n): wire useTranslation into SetupsView — close verification gap
...
Replace hardcoded English strings in SetupsView.tsx with t() calls
using existing setups namespace keys. Closes the 1 gap found during
phase 34 verification.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-18 14:41:23 +02:00
fefef38e9b
docs: add agent execution model to catalog population spec
2026-04-18 14:39:59 +02:00
4ba42f521c
docs(34): add code review report
2026-04-18 14:13:08 +02:00
26e20bd0d2
docs: catalog population design spec
2026-04-18 14:11:50 +02:00
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
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
0570ee3ed5
chore: merge executor worktree (worktree-agent-a3da6e62 — plan 34-04)
2026-04-18 14:07:22 +02:00
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
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
bf64b8f6a5
chore: merge executor worktree (worktree-agent-a1291d63 — plan 34-02)
2026-04-18 14:04:14 +02:00
3ff3ff4cb9
chore: merge executor worktree (worktree-agent-a5cefc89 — plan 34-08)
2026-04-18 14:03:25 +02:00
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
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
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
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
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
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
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
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
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
6376cfcb8d
docs(34): add code review report
2026-04-17 20:34:56 +02:00
3c973e8ec1
docs(34-07): complete German umlaut correction plan summary
2026-04-17 20:31:24 +02:00
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
4a23904c3f
docs(34-06): complete i18n gap closure — routes and components plan summary
2026-04-17 20:27:39 +02:00
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
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
b21ba0d97b
docs(34): create gap closure plans for missing i18n wiring and German umlauts
2026-04-17 20:09:47 +02:00
459a4ed4b0
test(34): UAT complete — 6 passed, 1 issue (incomplete German translation coverage)
2026-04-17 20:05:31 +02:00
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
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