[object Object]

← back to Designer Wallcoverings

stage yorkwall trade-portal cost/stock scraper + overnight one-shot runner

9d2b6d26d1196eb07a2cac51db48fe3698887d39 · 2026-07-09 23:52:04 -0700 · Steve

Files touched

Diff

commit 9d2b6d26d1196eb07a2cac51db48fe3698887d39
Author: Steve <steve@designerwallcoverings.com>
Date:   Thu Jul 9 23:52:04 2026 -0700

    stage yorkwall trade-portal cost/stock scraper + overnight one-shot runner
---
 DW-Programming/ImportNewSkufromURL/yw-costcheck.js |  7 +++++-
 .../ImportNewSkufromURL/yw-overnight-run.sh        | 27 ++++++++++++++++++++++
 2 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/DW-Programming/ImportNewSkufromURL/yw-costcheck.js b/DW-Programming/ImportNewSkufromURL/yw-costcheck.js
index 43a9b747..5b5032c3 100644
--- a/DW-Programming/ImportNewSkufromURL/yw-costcheck.js
+++ b/DW-Programming/ImportNewSkufromURL/yw-costcheck.js
@@ -2,7 +2,12 @@
 // One login, then internal navigation (does NOT re-lock). Aborts hard if the
 // account still reads locked. Password supplied via YW_PASS env (never written).
 const fs = require('fs'), os = require('os'), path = require('path');
-try { require('dotenv').config(); } catch { /* dotenv optional */ }
+try {
+  const dotenv = require('dotenv');
+  dotenv.config(); // local .env (if any)
+  // Canonical secrets store — holds YORKWALL_* (parsed safely, no bash sourcing).
+  dotenv.config({ path: path.join(os.homedir(), 'Projects/secrets-manager/.env') });
+} catch { /* dotenv optional */ }
 const { chromium } = require('playwright');
 const md = fs.readFileSync(path.join(os.homedir(), '.claude/skills/brewster-scraper-manager/SKILL.md'), 'utf8');
 // Prefer the secrets-routed YORKWALL_* (loaded from .env); fall back to inline YW_* / skill username.
diff --git a/DW-Programming/ImportNewSkufromURL/yw-overnight-run.sh b/DW-Programming/ImportNewSkufromURL/yw-overnight-run.sh
new file mode 100644
index 00000000..fed7afe0
--- /dev/null
+++ b/DW-Programming/ImportNewSkufromURL/yw-overnight-run.sh
@@ -0,0 +1,27 @@
+#!/bin/zsh
+# Overnight one-shot: pull yorkwall trade cost/stock for a SKU during the deep-quiet
+# window when the lockout is long-cleared. Reads creds from the master secrets .env
+# via the node script's dotenv (never bash-sources it). Self-unloads on success.
+set -u
+DIR="/Users/macstudio3/Projects/Designer-Wallcoverings/DW-Programming/ImportNewSkufromURL"
+cd "$DIR" || exit 1
+MFR="${1:-437-RD336}"
+TS="$(date +%Y%m%dT%H%M%S)"
+OUT="$DIR/yw-results/${MFR}-${TS}.json"
+LOG="$DIR/yw-results/overnight.log"
+
+node yw-costcheck.js "$MFR" > "$OUT" 2>>"$LOG"
+cp "$OUT" "$DIR/yw-results/latest.json"
+
+if grep -q '"loggedIn": true' "$OUT"; then
+  echo "[$TS] SUCCESS $MFR — logged in, result: $OUT" >> "$LOG"
+  touch "$DIR/yw-results/DONE"
+else
+  ABORT="$(grep -o '"abort": *"[^"]*"' "$OUT" | head -1)"
+  echo "[$TS] no-data $MFR — ${ABORT:-no-login}; ping Steve to re-run" >> "$LOG"
+fi
+
+# TRUE ONE-SHOT: always self-remove after this single run so this can never
+# become a standing recurring job. Fires once at 3 AM, then unloads itself.
+launchctl bootout "gui/$(id -u)/com.steve.yw-costcheck" 2>/dev/null
+rm -f "$HOME/Library/LaunchAgents/com.steve.yw-costcheck.plist"

← a4a39262 auto-save: 2026-07-09T23:42:48 (4 files) — pending-approval/  ·  back to Designer Wallcoverings  ·  auto-save: 2026-07-10T00:12:54 (6 files) — pending-approval/ e468b2fd →