{"slug":"sku-check-skill","total":17,"limit":100,"offset":0,"since":null,"commits":[{"hash":"a55b434","date":"2026-07-10 08:14:19 -0700","author":"Steve","subject":"pills app: parse yorkwall trade price + stock, show Retail/Net/Stock boxes","body":"- parseYorkwall(bodyText): MSRP (retail), NET PRICE (trade cost + discount%),\n  Quantity Available (summed batches), roll width/length — scoped by section\n  header since values are unlabeled table cells.\n- Attach parsed to live + lastLive; robust JSON extraction from scraper stdout.\n- pills.html parsedBoxes() renders Retail/Net/Stock. Verified live: 437-RD336\n  = MSRP $40, Net $20 (50% off), 412 single rolls in stock."},{"hash":"803ecd6","date":"2026-07-10 07:51:03 -0700","author":"Steve","subject":"pills app: add last-portal-pull cache (reads yw-results, write-through on live)","body":"- readLastLive(mfr): newest saved portal result by mtime, matched on the file's\n  mfr field (unifies the 3 AM overnight job + app-triggered pulls).\n- Endpoint attaches out.lastLive always; a successful fresh live pull is written\n  back via saveLive() so the next locked/cooldown request shows it instantly.\n- Use process.execPath (not bare 'node') to spawn the scraper — PATH-safe.\n- pills.html renders a 'Last portal pull · Nm ago' section (hidden when a fresh\n  live pull succeeded)."},{"hash":"59bd09a","date":"2026-07-10 07:36:53 -0700","author":"Steve","subject":"Add pills live-check app: enter MFR or DW number, tick stock/price, check live","body":"- POST /api/check/live resolves either a DW number or MFR number (dash-insensitive)\n  via dw_mfr_crossref, returns cached catalog price instantly + attempts the live\n  yorkwall trade-portal pull (Brewster/York family) via yw-costcheck.js.\n- Live pull is guarded: single-flight mutex, 20s min-gap, and a 30-min lockout\n  backoff whenever the portal reports locked — the UI can never hammer the login.\n- public/pills.html: pill-styled input + Stock/Price pill checkboxes + Check Live.\n- De-fang stale hardcoded yorkwall password; creds now come from the secrets store."},{"hash":"799c755","date":"2026-07-10 00:12:57 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-10T00:12:54 (1 files) — package-lock.json","body":""},{"hash":"082a8fb","date":"2026-07-10 00:02:29 -0700","author":"Steve","subject":"chore: v1.1.0 (dryRun feature, session close)","body":""},{"hash":"6ebeddb","date":"2026-07-09 22:24:00 -0700","author":"Steve","subject":"feat: dryRun flag on /api/check/sku (read-only preview, no tag/slack/db write)","body":""},{"hash":"6456c3e","date":"2026-07-09 22:09:04 -0700","author":"Steve","subject":"chore: v1.0.1 (session close) — 127.0.0.1 bind fix + .deploy.conf","body":""},{"hash":"df9809b","date":"2026-07-09 20:42:09 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-09T20:42:07 (1 files) — .gitignore","body":""},{"hash":"7329227","date":"2026-07-09 19:07:28 -0700","author":"Steve","subject":"fix: bind to 127.0.0.1 (HOST-overridable) to avoid tailscale :9963 EADDRINUSE","body":""},{"hash":"1c12bfb","date":"2026-05-30 21:21:51 -0700","author":"Steve Abrams","subject":"fix: read GEMINI_API_KEY from process.env instead of literal unexpanded shell string","body":"Line 28 used single-quoted '${GEMINI_API_KEY}' which is a literal string, not an env var expansion. All Gemini AI analysis calls were sending a garbage key and failing silently.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>"},{"hash":"008f261","date":"2026-05-30 09:32:49 -0700","author":"steve","subject":"security: strip hardcoded dw_admin DSN password -> env-first. No rotation/deploy.","body":""},{"hash":"46a693f","date":"2026-05-19 18:34:24 -0700","author":"Steve Abrams","subject":"ui: add rel=noopener noreferrer to all target=_blank anchors","body":""},{"hash":"1f37fd0","date":"2026-05-19 18:32:16 -0700","author":"Steve Abrams","subject":"server: 404-guard for .bak/.pre-/.orig/.swp paths before static mount","body":""},{"hash":"5417edf","date":"2026-05-19 18:32:00 -0700","author":"Steve Abrams","subject":"gitignore: broaden backup/swap file exclusions","body":""},{"hash":"460f702","date":"2026-05-13 08:58:01 -0700","author":"Steve","subject":"snapshot: 1 file(s) changed, ~1 modified","body":""},{"hash":"64a2269","date":"2026-05-12 17:52:37 -0700","author":"Steve","subject":"sku-check: log Gemini sku-image-analysis usage to cost-tracker","body":""},{"hash":"5f2d884","date":"2026-05-06 10:25:48 -0700","author":"Steve Abrams","subject":"initial scaffold (gitify-all 2026-05-06)","body":""}]}