`) and let the attribution `
` handle the spacing with its `mb-6` class.
bun run lint && bun run build
- src/client/hooks/useGlobalItems.ts GlobalItem interface contains `sourceUrl: string | null`
- src/client/hooks/useGlobalItems.ts GlobalItem interface contains `imageCredit: string | null`
- src/client/hooks/useGlobalItems.ts GlobalItem interface contains `imageSourceUrl: string | null`
- src/client/routes/global-items/$globalItemId.tsx contains `item.imageCredit`
- src/client/routes/global-items/$globalItemId.tsx contains `item.imageSourceUrl`
- src/client/routes/global-items/$globalItemId.tsx contains `item.sourceUrl`
- src/client/routes/global-items/$globalItemId.tsx contains `Photo:`
- `bun run build` exits 0 (no TypeScript errors)
- `bun run lint` exits 0
Catalog detail page shows image attribution inline below image (credit + source link) and product page link, client types updated
- `bun test tests/routes/global-items.test.ts` exits 0
- `bun test tests/mcp/tools.test.ts` exits 0
- `bun run build` exits 0
- `bun run lint` exits 0
- `bun test` full suite exits 0
- POST /api/global-items accepts and upserts a single catalog item with attribution fields
- POST /api/global-items/bulk accepts up to 100 items, rejects entire batch on validation failure, returns created/updated counts
- upsert_catalog_item MCP tool writes to globalItems with all attribution fields
- bulk_upsert_catalog MCP tool batch-writes via the bulk service
- Catalog detail page displays image credit and source link below the image when present
- Catalog detail page displays product page link when sourceUrl is present
- All tests pass, build succeeds, lint clean