← 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
M audit_completeness.jsM autofix_inventory.jsM dwqw_survey.jsM fix_bodies.jsM hollywood_archived_audit.jsM qty_backfill.jsM reactivate.jsM send_sku_csv.jsM yb_analyze.jsM yb_qty_backfill.jsM yb_qty_coverage_audit.jsM yb_vendor_audit.js
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 →