[object Object]

← back to Designer Wallcoverings

TK-135: add resume (progress log) to palette apply; canary 20 verified live (metafield+tag ok)

f6f5377e88a5adcd1a2860b729a50181457a88d3 · 2026-07-27 18:54:07 -0700 · Steve

Files touched

Diff

commit f6f5377e88a5adcd1a2860b729a50181457a88d3
Author: Steve <steve@designerwallcoverings.com>
Date:   Mon Jul 27 18:54:07 2026 -0700

    TK-135: add resume (progress log) to palette apply; canary 20 verified live (metafield+tag ok)
---
 shopify/scripts/tk135-apply-palette.js | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/shopify/scripts/tk135-apply-palette.js b/shopify/scripts/tk135-apply-palette.js
index 47d80e2e..ee1bbad5 100644
--- a/shopify/scripts/tk135-apply-palette.js
+++ b/shopify/scripts/tk135-apply-palette.js
@@ -23,6 +23,7 @@ const arg = (k, d) => { const i = args.indexOf(k); return i >= 0 ? args[i + 1] :
 const LIMIT = parseInt(arg('--limit', '0'), 10) || Infinity;
 const IN = arg('--in', path.join(__dirname, 'data/tk135/palette-proposed.tsv'));
 const REPORT = arg('--report', null);
+const PROGRESS = arg('--progress', path.join(__dirname, 'data/tk135/apply-progress.log')); // resume: gids done
 
 const env = fs.readFileSync(os.homedir() + '/Projects/secrets-manager/.env', 'utf8');
 const TOKEN = (env.match(/^SHOPIFY_ADMIN_TOKEN=(.*)$/m) || [])[1].replace(/['"]/g, '').trim();
@@ -82,6 +83,13 @@ function load() {
 
 (async () => {
   let rows = load();
+  // resume: drop gids already completed in a prior run (append-only progress log)
+  if (fs.existsSync(PROGRESS)) {
+    const done = new Set(fs.readFileSync(PROGRESS, 'utf8').split('\n').filter(Boolean));
+    const before = rows.length;
+    rows = rows.filter(r => !done.has(r.gid));
+    if (before !== rows.length) console.log(`resume: skipping ${before - rows.length} already-done (progress log)\n`);
+  }
   if (LIMIT !== Infinity) rows = rows.slice(0, LIMIT);
   console.log(`tk135-apply-palette — ${rows.length} products — ${APPLY ? '🔴 LIVE' : 'DRY-RUN'}\n  in: ${IN}\n`);
   const report = { ticket: 'TK-135', started: new Date().toISOString(), apply: APPLY, updated: [], failed: [] };
@@ -103,7 +111,8 @@ function load() {
     const tg = await gqlR(M_TAG, { id: r.gid, tags: [r.tag] });
     const te = tg.data?.tagsAdd?.userErrors || [];
     if (me.length || te.length) { report.failed.push({ gid: r.gid, me, te }); console.log(`  ❌ ${r.gid.split('/').pop()} ${JSON.stringify(me.concat(te))}`); }
-    else report.updated.push(r.gid);
+    else { report.updated.push(r.gid); fs.appendFileSync(PROGRESS, r.gid + '\n'); }
+    if (report.updated.length % 500 === 0) console.log(`  …${report.updated.length} updated`);
     await sleep(150);
   }
   report.finished = new Date().toISOString();

← 97023338 auto-save: 2026-07-27T18:53:10 (2 files) — shopify/scripts/d  ·  back to Designer Wallcoverings  ·  TK-135: fix PG-mirror trigger abort — skip DW-prefix mfr_sku f26f24ae →