[object Object]

← back to Animals

yolo: Pet store detail: 'what they sell' section

33ff0081218b10c60c0ec27bb4885773e5a8fee1 · 2026-05-08 14:32:07 -0700 · animal-yolo

Task: yolo.pet-store-products
Prompt: In ~/Projects/animals: /clinic/:id pages where category='pet_store' should show a generic services/inventory blurb. Add a `products_carried` text[] column to businesses (migration needed). Default com

Files touched

Diff

commit 33ff0081218b10c60c0ec27bb4885773e5a8fee1
Author: animal-yolo <steve@designerwallcoverings.com>
Date:   Fri May 8 14:32:07 2026 -0700

    yolo: Pet store detail: 'what they sell' section
    
    Task: yolo.pet-store-products
    Prompt: In ~/Projects/animals: /clinic/:id pages where category='pet_store' should show a generic services/inventory blurb. Add a `products_carried` text[] column to businesses (migration needed). Default com
---
 agents/animal-yolo/state.json                |  4 ++--
 migrations/014_business_products_carried.sql | 27 +++++++++++++++++++++++++++
 src/server/render.js                         | 20 ++++++++++++++++++++
 3 files changed, 49 insertions(+), 2 deletions(-)

diff --git a/agents/animal-yolo/state.json b/agents/animal-yolo/state.json
index a2e732c..cab1b8f 100644
--- a/agents/animal-yolo/state.json
+++ b/agents/animal-yolo/state.json
@@ -1,5 +1,5 @@
 {
-  "cursor": 5,
-  "runs": 5,
+  "cursor": 6,
+  "runs": 6,
   "started_at": "2026-05-08T07:01:22.386Z"
 }
\ No newline at end of file
diff --git a/migrations/014_business_products_carried.sql b/migrations/014_business_products_carried.sql
new file mode 100644
index 0000000..5d791f4
--- /dev/null
+++ b/migrations/014_business_products_carried.sql
@@ -0,0 +1,27 @@
+-- Project: Animals — pet_store inventory hint.
+--
+-- Adds a `products_carried text[]` column to businesses so /clinic/:id pages
+-- for pet_store rows can show a chips list of brands/items the store stocks.
+-- We don't actually scrape inventory from each store — it's a generic seed
+-- list of the obvious common items so the page isn't empty for stores we
+-- haven't enriched yet. Stores with real, enriched inventory will get their
+-- list overwritten by the enrichment job; the seed is just a default.
+
+BEGIN;
+
+ALTER TABLE businesses
+  ADD COLUMN IF NOT EXISTS products_carried TEXT[];
+
+-- Seed common inventory for pet_store rows that don't already have one.
+-- Idempotent — only fills NULLs, won't clobber enriched data.
+UPDATE businesses
+   SET products_carried = ARRAY[
+         'Chewy',
+         'Blue Buffalo',
+         'Kong',
+         'Petco house brand'
+       ]
+ WHERE category = 'pet_store'
+   AND products_carried IS NULL;
+
+COMMIT;
diff --git a/src/server/render.js b/src/server/render.js
index 048bc22..c2b2924 100644
--- a/src/server/render.js
+++ b/src/server/render.js
@@ -668,6 +668,25 @@ export function renderCategory({ category, dbCategory, businesses, ad }) {
 }
 
 export function renderBusiness({ biz, audit, ad, animals = [] }) {
+  const products = Array.isArray(biz.products_carried) ? biz.products_carried.filter(Boolean) : [];
+  const petStoreBlock = biz.category === 'pet_store' ? `
+    <section class="petstore-services">
+      <h2>Services & inventory</h2>
+      <p>Neighborhood pet store carrying food, treats, toys, and basic supplies for dogs, cats, and small pets. Most independent pet stores stock a mix of national brands and house labels — call ahead to confirm a specific item is in stock${biz.phone ? ` (<a href="tel:${esc(biz.phone)}">${esc(biz.phone)}</a>)` : ''}.</p>
+      ${products.length ? `
+        <h3>Products carried</h3>
+        <ul class="chips">
+          ${products.map(p => `<li class="chip">${esc(p)}</li>`).join('')}
+        </ul>
+      ` : ''}
+    </section>
+    <style>
+      .petstore-services{margin:24px 0}
+      .petstore-services h2{font-weight:400;margin-bottom:8px}
+      .petstore-services h3{font-weight:500;font-size:14px;margin:16px 0 8px;color:#5a6f63;text-transform:uppercase;letter-spacing:.06em}
+      .petstore-services .chips{list-style:none;padding:0;margin:0;display:flex;flex-wrap:wrap;gap:8px}
+      .petstore-services .chip{background:#eef4ea;border:1px solid #c8d4be;color:#0f4d3a;padding:4px 12px;border-radius:999px;font-size:13px}
+    </style>` : '';
   const animalsBlock = animals.length ? `
     <section class="adoptable">
       <h2>Adoptable animals <span class="muted small">(${animals.length})</span></h2>
@@ -742,6 +761,7 @@ export function renderBusiness({ biz, audit, ad, animals = [] }) {
       ${adSlot(ad, 'sidebar', `/clinic/${biz.id}`)}
     </div>
   </div>
+  ${petStoreBlock}
   ${animalsBlock}
   ${leadForm()}
 </main>` + footer() + '</body></html>';

← d1144d1 yolo: 3D dog park: use dog's actual photo as billboard textu  ·  back to Animals  ·  yolo: Business owners can claim their listing 2fa8980 →