{"slug":"tools-dw-hub","total":28,"limit":100,"offset":0,"since":null,"commits":[{"hash":"45c34ca","date":"2026-09-01 13:06:09 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-01T12:55:30 (1 data files) — package-lock.json","body":""},{"hash":"79a3488","date":"2026-08-20 08:14:35 -0700","author":"Steve Abrams","subject":"nav-agent: sync v1.3 (host left-sidebar collapse on load)","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"a7fe9a5","date":"2026-08-19 14:31:03 -0700","author":"Steve","subject":"nav-agent: List data full-width tight columns (grid) — layout fix","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"3fc70f1","date":"2026-08-19 14:05:24 -0700","author":"Steve","subject":"Refresh nav-agent to v1.2 (adds kv-list compact List view, default-off)","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"8c962db","date":"2026-08-13 09:27:28 -0700","author":"Steve Abrams","subject":"nav-agent: universal grid-controls drop-in on internal dashboard/command-center pages (STRONG-only)","body":""},{"hash":"1b68235","date":"2026-08-01 01:57:09 -0700","author":"Steve Abrams","subject":"tools-dw-hub: href-drill — card category is a filter-link + URL-addressable state","body":"Each card's category is now an <a href=\"?category=…\"> to its filtered view (href-drill\nHARD rule); left-panel facets (category/status/type) + search are URL-addressable. Click\nfilters in place + reflects into the URL, cmd/ctrl-click opens the shareable href,\nback-button + deep-link restore via popstate/readURL.\n\nVerified (Playwright + basic auth, live :9950): click category 'Room Settings' -> ?category\n+ grid 29->3 all-matching; deep-link restores; back-button->29; canary FLAT->DONE; 0 err.\nhref-drill backlog grid 7/92. TK-10089."},{"hash":"3e7e390","date":"2026-07-31 04:05:50 -0700","author":"Steve","subject":"security: remove DW2024! hardcoded creds from pm2 WRAP — now sourced from secrets .env at runtime (TK-10045/TK-10071)","body":""},{"hash":"fda8808","date":"2026-07-30 18:23:57 -0700","author":"Steve","subject":"tools-dw-hub deploy: INSTALL_CMD=true (no npm deps → npm ci fails without a lockfile)","body":"The hub is a zero-dependency static server (server.js uses only Node built-ins),\nso the default 'npm ci --omit=dev' aborted the deploy (no package-lock.json).\nSet INSTALL_CMD=\"true\" so deploys skip the no-op install.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"e4ef8df","date":"2026-07-30 18:19:11 -0700","author":"Steve","subject":"mood-board-studio: pre-deploy hardening (closes DTD contrarian's export/tablet dissent)","body":"The /dtd panel voted A (deploy) but the contrarian reviewer's FIX-FIRST dissent\nflagged real, localhost-unverifiable risks on the public origin. Closed all three:\n\n1. Export no longer fails silently: canvas.toDataURL() is wrapped in try/catch —\n   on a SecurityError (canvas tainted) it shows a 'right-click the preview → Save\n   image as…' toast instead of a dead button.\n2. CORS taint PREVENTED at the source: product-image src now carries a\n   tool-specific cache-bust param (&mbc=1) so the crossorigin=anonymous request\n   gets a distinct cache key and can't collide with a credentialed cdn.shopify.com\n   entry warmed by the storefront (the taint vector). Verified CDN still 200+ACAO\n   with the param; export stays untainted.\n3. Tablet controls: sidebar hides <=900px (iPad portrait = 820px lost all layer\n   controls + Tips). Added a mobile control bar (Tap a swatch, then: To Front /\n   To Back / Delete / Reset) that delegates to the existing handlers.\n\nVerified: desktop 1440 (bar hidden, 12/12 load w/ cache-bust, export OK 1.9MB);\niPad 820 (bar visible + functional — To Front changed z 1→102, no h-scroll);\n0 console errors. Deploy itself remains Steve-gated.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"0a30fa2","date":"2026-07-30 18:16:02 -0700","author":"steve","subject":"start-fleet-persistent.sh: accept optional slug args to (re)start a subset","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"a020519","date":"2026-07-30 18:08:11 -0700","author":"steve","subject":"Add start-fleet-persistent.sh: full Mac2 tool set reboot-persistent, secrets never in dump.pm2","body":"Each tool self-sources secrets-manager/.env at RUNTIME in its bash child, so pm2's dump.pm2\nholds only the command, never token VALUES (verified 0, was 26). Supersedes start-fleet.sh's\nexport-then-save leak. Boot hook com.steve.pm2-resurrect resurrects from dump.pm2 -> reboot-safe.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"b514256","date":"2026-07-30 17:59:50 -0700","author":"Steve","subject":"mood-board-studio: fix mobile horizontal-scroll (public-readiness)","body":"Now that the studio is public-facing (tools.designerwallcoverings.com), audited it\non a 390px phone viewport: the fixed 42px/.18em/nowrap wordmark forced the page to\n1298px wide -> horizontal scroll (classic mobile bug). The existing @media(<=900px)\nhid the sidebar but never touched the header.\n\nFix (scoped to <=900px, desktop untouched):\n- wordmark font-size clamp(18px,6vw,34px) + reduced letter-spacing + allow wrap\n- header flex-wrap so action buttons drop below the wordmark\n- canvasWrap overflow:auto so board-panning stays inside the canvas, not the page\n\nVerified :9815 @390px: horizontalScroll NO (375<390), wordmark wraps + fits, all\nbuttons visible; @1440: wordmark 42px/nowrap intact, sidebar visible, 12/12 load.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"6a8e49a","date":"2026-07-30 17:58:36 -0700","author":"steve","subject":"Fix sku-to-blog start command (npm start → npm run server; project has no start script)","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"a0b95db","date":"2026-07-30 17:51:39 -0700","author":"Steve","subject":"mood-board-studio: diversify grasscloth pool (was 7/8 Phillipe Romano)","body":"Pool-concentration audit flagged grasscloth as vendor-heavy (2 vendors, PR x7).\nReplaced 2 PR entries (Garamendi, Nantucket) with grasscloth from 2 new houses —\nMatera Sisal (Fentucci) + Grasscloth Sublimer (Elitis) — both true flat\ngrasscloth-family textures, images verified 200 + visually confirmed flat.\nGrasscloth now 4 vendors (Phillipe Romano, Groundworks, Fentucci, Elitis).\n\nSkipped Mind the Gap Koralion (a seagrass-PRINT pattern, not a grasscloth\ntexture) to keep material fidelity. (grasscloth naturally stays PR-leaning — PR\nis DW's private grasscloth line.)\n\nApplied to the relocated canonical file (studio moved model-arena -> tools-dw-hub\nin commit 3d80c93). Verified on live host :9815: 4 grasscloth vendors render,\n12/12 photos load, 0 console errors.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"3d80c93","date":"2026-07-30 17:46:26 -0700","author":"steve","subject":"Add Mood Board Studio to tools.dw hub (moved from model-arena)","body":"Self-contained client-side design tool (83KB, no backend/Shopify writes/DB — Tier-1 SAFE\nper SCOPE-tools-public.md). Served under the hub as a same-origin static tool (new href\ntool-type: zero new DNS, one auth gate — SCOPE Path-A). Verified locally on :9815:\n/api/tools lists it, file serves 200 behind auth / 401 without.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"117e94f","date":"2026-07-29 07:03:43 -0700","author":"Steve","subject":"chore: v1.1.0 (session close) — start/stop from hub + internal-line-viewer facet UI","body":""},{"hash":"366d33f","date":"2026-07-28 16:32:58 -0700","author":"Steve","subject":"hub: Start/Stop buttons local-only (public site is launch-only, no RCE surface)","body":""},{"hash":"2c90036","date":"2026-07-28 16:31:55 -0700","author":"Steve","subject":"hub UI → internal-line-viewer pattern: left aside with collapsed Category/Status/Type facet tables (values+counts, click-to-filter, teal badge, collapsed on load), right grid opens/launches on card click; dark theme, density type-scale, no <a>-wrapped cards, location.origin fetches, compact/img-only toggle","body":""},{"hash":"080da47","date":"2026-07-28 16:25:43 -0700","author":"Steve","subject":"start-fleet: inject DW_BASIC_AUTH so room-setting-app password auth works out of the box","body":""},{"hash":"ae319d6","date":"2026-07-28 15:29:27 -0700","author":"Steve","subject":"start-fleet.sh: keep the curated 13-tool set always-on via pm2 (secrets injected at spawn, taggers DRY_RUN, pm2 save reboot-safe) — makes the public hub actually launchable","body":""},{"hash":"94b2c2b","date":"2026-07-28 15:11:07 -0700","author":"Steve","subject":"start/stop from the hub: local mode spawns manifest start-commands with runtime secret injection (DRY_RUN=1 default), remote mode proxies to Mac2 hub over tailnet; UI Start/Stop buttons with boot-polling","body":""},{"hash":"337ae8b","date":"2026-07-28 14:15:26 -0700","author":"Steve","subject":"per-tool probePath (scraper-api probes /health on Kamatera-local)","body":""},{"hash":"5170814","date":"2026-07-28 14:14:49 -0700","author":"Steve","subject":"scraper-api → Kamatera :8124 (option A executed): per-tool probeHost support, manifest updated","body":""},{"hash":"f12c756","date":"2026-07-28 13:31:33 -0700","author":"Steve","subject":"Cody-gate: surface 2 MISSING-SOURCE tools in manifest with ⚠️ badge (28 entries)","body":""},{"hash":"1cdc418","date":"2026-07-28 13:22:28 -0700","author":"Steve","subject":"fleet-revival hub correction (TK-10017): 26-tool manifest on 8101-8124 with per-tool markers + onDemand/cli/static flags; probe rewritten TCP→HTTP marker-match with 401-alive + one-hop redirect follow (kills squatted-port false positives); dropped 2 missing-source entries","body":""},{"hash":"7e42fdb","date":"2026-07-28 11:16:34 -0700","author":"Steve","subject":"add SCOPE-tools-public.md: tiered plan for publishing individual tools","body":""},{"hash":"d1d5a15","date":"2026-07-28 11:08:55 -0700","author":"Steve","subject":"wire TOOL_HOST/PROBE_HOST for public deploy (tailnet-reachable launch links + probes)","body":""},{"hash":"cf9e9dc","date":"2026-07-28 10:48:00 -0700","author":"Steve","subject":"initial scaffold: tools.designerwallcoverings launcher + live-status hub","body":""}]}