[object Object]

← back to Dwjs Consolidation 2026 04 23

chore: macstudio3 migration — reconcile from mac2 + repoint paths (stevestudio2→macstudio3, node/npm/npx→/opt/homebrew)

2d8f74e658c9f860a5ae040a4a366f8f423211fd · 2026-07-03 08:08:02 -0700 · Steve

Files touched

Diff

commit 2d8f74e658c9f860a5ae040a4a366f8f423211fd
Author: Steve <steve@designerwallcoverings.com>
Date:   Fri Jul 3 08:08:02 2026 -0700

    chore: macstudio3 migration — reconcile from mac2 + repoint paths (stevestudio2→macstudio3, node/npm/npx→/opt/homebrew)
---
 audit_completeness.js       |  4 ++--
 autofix_inventory.js        | 10 +++++-----
 dwqw_survey.js              |  2 +-
 fix_bodies.js               |  4 ++--
 hollywood_archived_audit.js |  4 ++--
 qty_backfill.js             |  2 +-
 reactivate.js               |  6 +++---
 send_sku_csv.js             |  2 +-
 yb_analyze.js               |  2 +-
 yb_qty_backfill.js          |  2 +-
 yb_qty_coverage_audit.js    |  2 +-
 yb_vendor_audit.js          |  2 +-
 12 files changed, 21 insertions(+), 21 deletions(-)

diff --git a/audit_completeness.js b/audit_completeness.js
index 04735e5..92742b5 100644
--- a/audit_completeness.js
+++ b/audit_completeness.js
@@ -71,7 +71,7 @@ function dl(url,file){return new Promise((r,j)=>{const out=fs.createWriteStream(
 (async()=>{
   console.log('scoping new DWJS-9xxxx products...');
   const url = await bulk();
-  const file = '/Users/stevestudio2/Projects/dwjs-consolidation-2026-04-23/audit_completeness.jsonl';
+  const file = '/Users/macstudio3/Projects/dwjs-consolidation-2026-04-23/audit_completeness.jsonl';
   await dl(url, file);
   const products = new Map();
   for (const line of fs.readFileSync(file,'utf8').split('\n').filter(Boolean)) {
@@ -141,7 +141,7 @@ function dl(url,file){return new Promise((r,j)=>{const out=fs.createWriteStream(
   const cols = ['id','title','status','oldSku','mfr','boltPrice','samplePrice','boltInv','sampleInv','flags'];
   const csvEsc = s => { if (s==null) return ''; const str=String(s); return /[",\n]/.test(str) ? '"'+str.replace(/"/g,'""')+'"' : str; };
   const lines = [cols.join(',')].concat(issues.map(i => cols.map(c => csvEsc(i[c])).join(',')));
-  fs.writeFileSync('/Users/stevestudio2/Projects/dwjs-consolidation-2026-04-23/completeness_issues.csv', lines.join('\n'));
+  fs.writeFileSync('/Users/macstudio3/Projects/dwjs-consolidation-2026-04-23/completeness_issues.csv', lines.join('\n'));
   console.log(`\nsaved: completeness_issues.csv (${issues.length} rows)`);
   // sample
   console.log('\nfirst 5 issue rows:');
diff --git a/autofix_inventory.js b/autofix_inventory.js
index 046dae1..db5f0b9 100644
--- a/autofix_inventory.js
+++ b/autofix_inventory.js
@@ -16,10 +16,10 @@ const path = require('path');
 const STORE='designer-laboratory-sandbox.myshopify.com';
 const TOKEN='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';
 
-const LOG = '/Users/stevestudio2/Projects/dwjs-consolidation-2026-04-23/autofix_inventory.log';
-const EXEC = '/Users/stevestudio2/Projects/dwjs-consolidation-2026-04-23/autofix_inventory.ndjson';
-const FAIL = '/Users/stevestudio2/Projects/dwjs-consolidation-2026-04-23/autofix_failures.ndjson';
-const STATE = '/Users/stevestudio2/Projects/dwjs-consolidation-2026-04-23/autofix_state.json';
+const LOG = '/Users/macstudio3/Projects/dwjs-consolidation-2026-04-23/autofix_inventory.log';
+const EXEC = '/Users/macstudio3/Projects/dwjs-consolidation-2026-04-23/autofix_inventory.ndjson';
+const FAIL = '/Users/macstudio3/Projects/dwjs-consolidation-2026-04-23/autofix_failures.ndjson';
+const STATE = '/Users/macstudio3/Projects/dwjs-consolidation-2026-04-23/autofix_state.json';
 
 function log(m){ const l=`[${new Date().toISOString().replace('T',' ').slice(0,19)}] ${m}\n`; process.stdout.write(l); fs.appendFileSync(LOG,l); }
 
@@ -46,7 +46,7 @@ function gql(body, retry=0) {
 }
 
 // Load the audit jsonl to find targets
-const audit = fs.readFileSync('/Users/stevestudio2/Projects/dwjs-consolidation-2026-04-23/audit_completeness.jsonl','utf8').split('\n').filter(Boolean).map(JSON.parse);
+const audit = fs.readFileSync('/Users/macstudio3/Projects/dwjs-consolidation-2026-04-23/audit_completeness.jsonl','utf8').split('\n').filter(Boolean).map(JSON.parse);
 const products = new Map();
 for (const o of audit) {
   if (o.id?.includes('/Product/')) products.set(o.id, { id:o.id, title:o.title, status:o.status, variants: [] });
diff --git a/dwqw_survey.js b/dwqw_survey.js
index 164e8d1..ca3898f 100644
--- a/dwqw_survey.js
+++ b/dwqw_survey.js
@@ -34,7 +34,7 @@ function gql(b){return new Promise((res,rej)=>{const d=JSON.stringify(b);const r
   const chunks=[]; await new Promise((r,j)=>{https.get(url,res=>{res.on('data',d=>chunks.push(d));res.on('end',r)}).on('error',j)});
   const fs=require('fs');
   const data = Buffer.concat(chunks).toString();
-  fs.writeFileSync('/Users/stevestudio2/Projects/dwjs-consolidation-2026-04-23/dwqw_active.jsonl', data);
+  fs.writeFileSync('/Users/macstudio3/Projects/dwjs-consolidation-2026-04-23/dwqw_active.jsonl', data);
   const products = [];
   for (const l of data.split('\n').filter(Boolean)){
     const o=JSON.parse(l);
diff --git a/fix_bodies.js b/fix_bodies.js
index 8c82dc4..f289b8c 100644
--- a/fix_bodies.js
+++ b/fix_bodies.js
@@ -15,7 +15,7 @@ const fs = require('fs');
 
 const STORE='designer-laboratory-sandbox.myshopify.com';
 const TOKEN='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';
-const LOG = '/Users/stevestudio2/Projects/dwjs-consolidation-2026-04-23/fix_bodies.log';
+const LOG = '/Users/macstudio3/Projects/dwjs-consolidation-2026-04-23/fix_bodies.log';
 const log = m => { const l=`[${new Date().toISOString().slice(0,19)}] ${m}\n`; process.stdout.write(l); fs.appendFileSync(LOG,l); };
 
 function gql(body, retry=0) {
@@ -32,7 +32,7 @@ function gql(body, retry=0) {
 }
 
 // Load issue list
-const csv = fs.readFileSync('/Users/stevestudio2/Projects/dwjs-consolidation-2026-04-23/completeness_issues.csv','utf8').split('\n').filter(Boolean);
+const csv = fs.readFileSync('/Users/macstudio3/Projects/dwjs-consolidation-2026-04-23/completeness_issues.csv','utf8').split('\n').filter(Boolean);
 const rows = [];
 const header = csv[0].split(',');
 for (const l of csv.slice(1)) {
diff --git a/hollywood_archived_audit.js b/hollywood_archived_audit.js
index 0e58c99..e73045f 100644
--- a/hollywood_archived_audit.js
+++ b/hollywood_archived_audit.js
@@ -60,9 +60,9 @@ async function gql(q,vars){
   console.log(`  skip — bolt or sample $0:  ${skipNoPrice.length}`);
   console.log(`  skip — no body:            ${skipNoBody.length}`);
 
-  fs.writeFileSync('/Users/stevestudio2/Projects/dwjs-consolidation-2026-04-23/hollywood_eligible.json',
+  fs.writeFileSync('/Users/macstudio3/Projects/dwjs-consolidation-2026-04-23/hollywood_eligible.json',
     JSON.stringify(eligible.map(p=>({id:p.id,title:p.title,sku:p.variants.nodes[0]?.sku})),null,2));
-  fs.writeFileSync('/Users/stevestudio2/Projects/dwjs-consolidation-2026-04-23/hollywood_archived_skips.json',
+  fs.writeFileSync('/Users/macstudio3/Projects/dwjs-consolidation-2026-04-23/hollywood_archived_skips.json',
     JSON.stringify({skipNoImg:skipNoImg.length,skipNoBolt:skipNoBolt.length,skipNoSample:skipNoSample.length,skipNoPrice:skipNoPrice.length,skipNoBody:skipNoBody.length},null,2));
   console.log(`\nWrote ${eligible.length} eligible IDs to hollywood_eligible.json`);
 })();
diff --git a/qty_backfill.js b/qty_backfill.js
index 079d610..9849459 100644
--- a/qty_backfill.js
+++ b/qty_backfill.js
@@ -8,7 +8,7 @@ const fs = require('fs');
 
 const STORE='designer-laboratory-sandbox.myshopify.com';
 const TOKEN='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';
-const LOG = '/Users/stevestudio2/Projects/dwjs-consolidation-2026-04-23/qty_backfill.log';
+const LOG = '/Users/macstudio3/Projects/dwjs-consolidation-2026-04-23/qty_backfill.log';
 const log = m => { const l=`[${new Date().toISOString().slice(0,19)}] ${m}\n`; process.stdout.write(l); fs.appendFileSync(LOG,l); };
 
 function gql(b, retry=0){return new Promise((res,rej)=>{const d=JSON.stringify(b);const r=https.request({hostname:STORE,path:'/admin/api/2024-10/graphql.json',method:'POST',headers:{'X-Shopify-Access-Token':TOKEN,'Content-Type':'application/json','Content-Length':Buffer.byteLength(d)}},R=>{let c='';R.on('data',x=>c+=x);R.on('end',async()=>{try{const j=JSON.parse(c);const tri=j?.extensions?.cost?.throttleStatus;const isThr=j.errors&&/throttle/i.test(JSON.stringify(j.errors));if(isThr&&retry<6){await new Promise(r=>setTimeout(r,2000*(retry+1)));return res(gql(b,retry+1))}if(tri&&tri.currentlyAvailable<300)await new Promise(r=>setTimeout(r,800));res(j)}catch{if(retry<3)setTimeout(()=>res(gql(b,retry+1)),2000);else res({error:c.slice(0,500)})}})});r.on('error',err=>{if(retry<3)setTimeout(()=>res(gql(b,retry+1)),2000);else rej(err)});r.setTimeout(45000,()=>{r.destroy();if(retry<3)res(gql(b,retry+1));else rej(new Error('t'))});r.write(d);r.end()});}
diff --git a/reactivate.js b/reactivate.js
index 3893d23..6d5ab64 100644
--- a/reactivate.js
+++ b/reactivate.js
@@ -3,11 +3,11 @@
 // Status → ACTIVE via productChangeStatus mutation.
 const https = require('https');
 const fs = require('fs');
-const { isProtected } = require('/Users/stevestudio2/Projects/_shared/archive-guard');
+const { isProtected } = require('/Users/macstudio3/Projects/_shared/archive-guard');
 
 const STORE='designer-laboratory-sandbox.myshopify.com';
 const TOKEN='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';
-const LOG = '/Users/stevestudio2/Projects/dwjs-consolidation-2026-04-23/reactivate.log';
+const LOG = '/Users/macstudio3/Projects/dwjs-consolidation-2026-04-23/reactivate.log';
 const log = m => { const l=`[${new Date().toISOString().slice(0,19)}] ${m}\n`; process.stdout.write(l); fs.appendFileSync(LOG,l); };
 
 function gql(body, retry=0) {
@@ -34,7 +34,7 @@ function gql(body, retry=0) {
 
 // Rebuild qualifiers from audit jsonl
 const products = {};
-for (const l of fs.readFileSync('/Users/stevestudio2/Projects/dwjs-consolidation-2026-04-23/audit_completeness.jsonl','utf8').split('\n').filter(Boolean)) {
+for (const l of fs.readFileSync('/Users/macstudio3/Projects/dwjs-consolidation-2026-04-23/audit_completeness.jsonl','utf8').split('\n').filter(Boolean)) {
   const o = JSON.parse(l);
   if (o.id?.includes('/Product/')) products[o.id] = {...o, variants:[]};
   else if (o.id?.includes('/ProductVariant/') && o.__parentId) {
diff --git a/send_sku_csv.js b/send_sku_csv.js
index bc43e66..35a657a 100644
--- a/send_sku_csv.js
+++ b/send_sku_csv.js
@@ -7,7 +7,7 @@ const fs = require('fs');
 const http = require('http');
 const path = require('path');
 
-const EXEC = '/Users/stevestudio2/Projects/dwjs-consolidation-2026-04-23/phase3_legacy_execution.ndjson';
+const EXEC = '/Users/macstudio3/Projects/dwjs-consolidation-2026-04-23/phase3_legacy_execution.ndjson';
 const GEORGE_HOST = '45.61.58.125';
 const GEORGE_PORT = 9850;
 const TO = 'info@designerwallcoverings.com';
diff --git a/yb_analyze.js b/yb_analyze.js
index 7c50dc0..687d834 100644
--- a/yb_analyze.js
+++ b/yb_analyze.js
@@ -1,7 +1,7 @@
 #!/usr/bin/env node
 // READ-ONLY classifier over the saved bulk jsonl (no network). Corrected ROLL logic.
 const fs=require('fs');
-const DIR='/Users/stevestudio2/Projects/dwjs-consolidation-2026-04-23/yb-audit';
+const DIR='/Users/macstudio3/Projects/dwjs-consolidation-2026-04-23/yb-audit';
 const CONFIRMED=new Set(['Jeffrey Stevens','Malibu Wallpaper']); // DTD-committed York/Brewster identity
 // York/Brewster LINEAGE vendors surfaced live but NOT in the committed scope -> report, do not gate.
 const LINEAGE=new Set(['LA Walls','York','York Contract']);
diff --git a/yb_qty_backfill.js b/yb_qty_backfill.js
index d872834..4529edd 100644
--- a/yb_qty_backfill.js
+++ b/yb_qty_backfill.js
@@ -13,7 +13,7 @@ const os=require('os');
 function loadToken(){const k=process.env.SHOPIFY_ADMIN_TOKEN;if(k)return k;try{const e=fs.readFileSync(os.homedir()+'/Projects/secrets-manager/.env','utf8');const m=e.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m);if(m)return m[1].trim();}catch{}throw new Error('SHOPIFY_ADMIN_TOKEN not found (export it or set in secrets-manager/.env)');}
 let TOKEN; // set below via loadToken()
 TOKEN=loadToken();
-const DIR='/Users/stevestudio2/Projects/dwjs-consolidation-2026-04-23/yb-audit';
+const DIR='/Users/macstudio3/Projects/dwjs-consolidation-2026-04-23/yb-audit';
 const LOG=`${DIR}/yb_qty_backfill.log`;
 const APPLY=process.argv.includes('--apply');
 const INCLUDE_ARCHIVED=process.argv.includes('--include-archived');
diff --git a/yb_qty_coverage_audit.js b/yb_qty_coverage_audit.js
index 719f59c..4a7ee4b 100644
--- a/yb_qty_coverage_audit.js
+++ b/yb_qty_coverage_audit.js
@@ -22,7 +22,7 @@ const os=require('os');
 function loadToken(){const k=process.env.SHOPIFY_ADMIN_TOKEN;if(k)return k;try{const e=fs.readFileSync(os.homedir()+'/Projects/secrets-manager/.env','utf8');const m=e.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m);if(m)return m[1].trim();}catch{}throw new Error('SHOPIFY_ADMIN_TOKEN not found (export it or set in secrets-manager/.env)');}
 let TOKEN; // set below via loadToken()
 TOKEN=loadToken();
-const OUTDIR='/Users/stevestudio2/Projects/dwjs-consolidation-2026-04-23/yb-audit';
+const OUTDIR='/Users/macstudio3/Projects/dwjs-consolidation-2026-04-23/yb-audit';
 fs.mkdirSync(OUTDIR,{recursive:true});
 
 const IN_SCOPE_VENDORS = new Set(['Jeffrey Stevens','Malibu Wallpaper']);
diff --git a/yb_vendor_audit.js b/yb_vendor_audit.js
index 1207c18..6889416 100644
--- a/yb_vendor_audit.js
+++ b/yb_vendor_audit.js
@@ -9,7 +9,7 @@ const os=require('os');
 function loadToken(){const k=process.env.SHOPIFY_ADMIN_TOKEN;if(k)return k;try{const e=fs.readFileSync(os.homedir()+'/Projects/secrets-manager/.env','utf8');const m=e.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m);if(m)return m[1].trim();}catch{}throw new Error('SHOPIFY_ADMIN_TOKEN not found (export it or set in secrets-manager/.env)');}
 let TOKEN; // set below via loadToken()
 TOKEN=loadToken();
-const DIR='/Users/stevestudio2/Projects/dwjs-consolidation-2026-04-23/yb-audit';
+const DIR='/Users/macstudio3/Projects/dwjs-consolidation-2026-04-23/yb-audit';
 fs.mkdirSync(DIR,{recursive:true});
 
 function gql(b,retry=0){return new Promise((res,rej)=>{const d=JSON.stringify(b);const r=https.request({hostname:STORE,path:'/admin/api/2024-10/graphql.json',method:'POST',headers:{'X-Shopify-Access-Token':TOKEN,'Content-Type':'application/json','Content-Length':Buffer.byteLength(d)}},R=>{let c='';R.on('data',x=>c+=x);R.on('end',()=>{try{res(JSON.parse(c))}catch{if(retry<3)setTimeout(()=>res(gql(b,retry+1)),2000);else res({error:c.slice(0,300)})}})});r.on('error',e=>{if(retry<3)setTimeout(()=>res(gql(b,retry+1)),2000);else rej(e)});r.setTimeout(60000,()=>{r.destroy();if(retry<3)res(gql(b,retry+1));else rej(new Error('t'))});r.write(d);r.end()});}

← 37ff1dc Mural refinement (Steve): revert 10 explicit-mural Malibu it  ·  back to Dwjs Consolidation 2026 04 23  ·  Strip hardcoded Shopify API tokens from source (env-first); d50c409 →