`) 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
+
+
+