← back to Groundworks Activation
Groundworks activation complete: 94 SKUs live, 5-field clean, collection published; bake image-resize into publish.js
e5e782b45e9ac4ee91217861289a1e5c0731ff80 · 2026-07-22 08:07:31 -0700 · Steve Abrams
Files touched
A data/fix-images-results.jsonM data/publish-results.jsonA data/verify-results.jsonA scripts/fix-images.jsM scripts/publish.jsA scripts/verify.js
Diff
commit e5e782b45e9ac4ee91217861289a1e5c0731ff80
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Wed Jul 22 08:07:31 2026 -0700
Groundworks activation complete: 94 SKUs live, 5-field clean, collection published; bake image-resize into publish.js
---
data/fix-images-results.json | 38 +++
data/publish-results.json | 633 ++++++++++++++++++++++++++++++++++++++++++-
data/verify-results.json | 4 +
scripts/fix-images.js | 53 ++++
scripts/publish.js | 17 +-
scripts/verify.js | 34 +++
6 files changed, 771 insertions(+), 8 deletions(-)
diff --git a/data/fix-images-results.json b/data/fix-images-results.json
new file mode 100644
index 0000000..6969fac
--- /dev/null
+++ b/data/fix-images-results.json
@@ -0,0 +1,38 @@
+[
+ {
+ "dw": "DWKK-158004",
+ "fixed": true
+ },
+ {
+ "dw": "DWKK-158014",
+ "fixed": true
+ },
+ {
+ "dw": "DWKK-158024",
+ "fixed": true
+ },
+ {
+ "dw": "DWKK-158034",
+ "fixed": true
+ },
+ {
+ "dw": "DWKK-158044",
+ "fixed": true
+ },
+ {
+ "dw": "DWKK-158324",
+ "fixed": true
+ },
+ {
+ "dw": "DWKK-158334",
+ "fixed": true
+ },
+ {
+ "dw": "DWKK-158344",
+ "fixed": true
+ },
+ {
+ "dw": "DWKK-158354",
+ "fixed": true
+ }
+]
\ No newline at end of file
diff --git a/data/publish-results.json b/data/publish-results.json
index 7968b0d..d70e591 100644
--- a/data/publish-results.json
+++ b/data/publish-results.json
@@ -1,9 +1,632 @@
[
{
- "mfr_sku": "GWP-3766.6.0",
- "dwSku": "DWKK-157424",
- "pid": "7896260313139",
- "title": "Argus Antique | Groundworks",
- "price": "562.50"
+ "mfr_sku": "GWP-3738.155.0",
+ "dwSku": "DWKK-157464",
+ "pid": "7896260870195",
+ "title": "Bleecker Paper Capri/Navy | Groundworks",
+ "price": "681.00"
+ },
+ {
+ "mfr_sku": "GWP-3738.353.0",
+ "dwSku": "DWKK-157474",
+ "pid": "7896260902963",
+ "title": "Bleecker Paper Lake/Fern | Groundworks",
+ "price": "681.00"
+ },
+ {
+ "mfr_sku": "GWP-3738.424.0",
+ "dwSku": "DWKK-157484",
+ "pid": "7896260935731",
+ "title": "Bleecker Paper Spice/Gold | Groundworks",
+ "price": "681.00"
+ },
+ {
+ "mfr_sku": "GWP-3737.530.0",
+ "dwSku": "DWKK-157494",
+ "pid": "7896260968499",
+ "title": "Bond Paper Aegean | Groundworks",
+ "price": "321.00"
+ },
+ {
+ "mfr_sku": "GWP-3737.516.0",
+ "dwSku": "DWKK-157504",
+ "pid": "7896261001267",
+ "title": "Bond Paper Blue | Groundworks",
+ "price": "321.00"
+ },
+ {
+ "mfr_sku": "GWP-3737.610.0",
+ "dwSku": "DWKK-157514",
+ "pid": "7896261066803",
+ "title": "Bond Paper Multi | Groundworks",
+ "price": "321.00"
+ },
+ {
+ "mfr_sku": "GWP-3737.611.0",
+ "dwSku": "DWKK-157524",
+ "pid": "7896261132339",
+ "title": "Bond Paper Pebble | Groundworks",
+ "price": "321.00"
+ },
+ {
+ "mfr_sku": "GWP-3752.8.0",
+ "dwSku": "DWKK-157534",
+ "pid": "7896261197875",
+ "title": "Bunny Wall Small Black | Groundworks",
+ "price": "622.50"
+ },
+ {
+ "mfr_sku": "GWP-3752.101.0",
+ "dwSku": "DWKK-157544",
+ "pid": "7896261230643",
+ "title": "Bunny Wall Small Ivory | Groundworks",
+ "price": "622.50"
+ },
+ {
+ "mfr_sku": "GWP-3751.8.0",
+ "dwSku": "DWKK-157554",
+ "pid": "7896261263411",
+ "title": "Bunny Wall Black | Groundworks",
+ "price": "1410.00"
+ },
+ {
+ "mfr_sku": "GWP-3751.101.0",
+ "dwSku": "DWKK-157564",
+ "pid": "7896261296179",
+ "title": "Bunny Wall Ivory | Groundworks",
+ "price": "1410.00"
+ },
+ {
+ "mfr_sku": "GWP-3763.6106.0",
+ "dwSku": "DWKK-157574",
+ "pid": "7896261361715",
+ "title": "Calista Agate | Groundworks",
+ "price": "592.50"
+ },
+ {
+ "mfr_sku": "GWP-3763.4.0",
+ "dwSku": "DWKK-157584",
+ "pid": "7896261394483",
+ "title": "Calista Gold | Groundworks",
+ "price": "592.50"
+ },
+ {
+ "mfr_sku": "GWP-3763.13.0",
+ "dwSku": "DWKK-157594",
+ "pid": "7896261427251",
+ "title": "Calista Jade | Groundworks",
+ "price": "592.50"
+ },
+ {
+ "mfr_sku": "GWP-3763.1111.0",
+ "dwSku": "DWKK-157604",
+ "pid": "7896261460019",
+ "title": "Calista Pearl | Groundworks",
+ "price": "592.50"
+ },
+ {
+ "mfr_sku": "GWP-3763.30.0",
+ "dwSku": "DWKK-157614",
+ "pid": "7896261492787",
+ "title": "Calista Peridot | Groundworks",
+ "price": "592.50"
+ },
+ {
+ "mfr_sku": "GWP-3763.11.0",
+ "dwSku": "DWKK-157624",
+ "pid": "7896261525555",
+ "title": "Calista Silver | Groundworks",
+ "price": "592.50"
+ },
+ {
+ "mfr_sku": "GWP-3763.124.0",
+ "dwSku": "DWKK-157634",
+ "pid": "7896261558323",
+ "title": "Calista Terra | Groundworks",
+ "price": "592.50"
+ },
+ {
+ "mfr_sku": "GWP-3765.166.0",
+ "dwSku": "DWKK-157644",
+ "pid": "7896261591091",
+ "title": "Clio Jute Brass | Groundworks",
+ "price": "337.50"
+ },
+ {
+ "mfr_sku": "GWP-3765.1161.0",
+ "dwSku": "DWKK-157654",
+ "pid": "7896261656627",
+ "title": "Clio Jute Champagne | Groundworks",
+ "price": "337.50"
+ },
+ {
+ "mfr_sku": "GWP-3765.1611.0",
+ "dwSku": "DWKK-157664",
+ "pid": "7896261689395",
+ "title": "Clio Jute Platinum | Groundworks",
+ "price": "337.50"
+ },
+ {
+ "mfr_sku": "GWP-3745.16.0",
+ "dwSku": "DWKK-157674",
+ "pid": "7896261722163",
+ "title": "Flash Alabaster | Groundworks",
+ "price": "319.50"
+ },
+ {
+ "mfr_sku": "GWP-3745.1121.0",
+ "dwSku": "DWKK-157684",
+ "pid": "7896261754931",
+ "title": "Flash Cinder | Groundworks",
+ "price": "319.50"
+ },
+ {
+ "mfr_sku": "GWP-3745.917.0",
+ "dwSku": "DWKK-157694",
+ "pid": "7896261787699",
+ "title": "Flash Desert | Groundworks",
+ "price": "319.50"
+ },
+ {
+ "mfr_sku": "GWP-3745.166.0",
+ "dwSku": "DWKK-157704",
+ "pid": "7896261820467",
+ "title": "Flash Sepia | Groundworks",
+ "price": "319.50"
+ },
+ {
+ "mfr_sku": "GWP-3758.106.0",
+ "dwSku": "DWKK-157714",
+ "pid": "7896261853235",
+ "title": "Gesso Clay | Groundworks",
+ "price": "298.50"
+ },
+ {
+ "mfr_sku": "GWP-3758.111.0",
+ "dwSku": "DWKK-157724",
+ "pid": "7896261886003",
+ "title": "Gesso Ivory | Groundworks",
+ "price": "298.50"
+ },
+ {
+ "mfr_sku": "GWP-3758.21.0",
+ "dwSku": "DWKK-157734",
+ "pid": "7896261951539",
+ "title": "Gesso Obsidian | Groundworks",
+ "price": "298.50"
+ },
+ {
+ "mfr_sku": "GWP-3758.4.0",
+ "dwSku": "DWKK-157744",
+ "pid": "7896261984307",
+ "title": "Gesso Ochre | Groundworks",
+ "price": "298.50"
+ },
+ {
+ "mfr_sku": "GWP-3758.116.0",
+ "dwSku": "DWKK-157754",
+ "pid": "7896262017075",
+ "title": "Gesso Sand | Groundworks",
+ "price": "298.50"
+ },
+ {
+ "mfr_sku": "GWP-3744.1121.0",
+ "dwSku": "DWKK-157764",
+ "pid": "7896262049843",
+ "title": "Glyph Charcoal | Groundworks",
+ "price": "319.50"
+ },
+ {
+ "mfr_sku": "GWP-3744.16.0",
+ "dwSku": "DWKK-157774",
+ "pid": "7896262082611",
+ "title": "Glyph Sandstone | Groundworks",
+ "price": "319.50"
+ },
+ {
+ "mfr_sku": "GWP-3744.86.0",
+ "dwSku": "DWKK-157784",
+ "pid": "7896262115379",
+ "title": "Glyph Sparrow | Groundworks",
+ "price": "319.50"
+ },
+ {
+ "mfr_sku": "GWP-3744.1311.0",
+ "dwSku": "DWKK-157794",
+ "pid": "7896262148147",
+ "title": "Glyph Steel | Groundworks",
+ "price": "319.50"
+ },
+ {
+ "mfr_sku": "GWP-3739.5.0",
+ "dwSku": "DWKK-157804",
+ "pid": "7896262180915",
+ "title": "Greene Paper Blue | Groundworks",
+ "price": "297.00"
+ },
+ {
+ "mfr_sku": "GWP-3739.16.0",
+ "dwSku": "DWKK-157814",
+ "pid": "7896262213683",
+ "title": "Greene Paper Buff | Groundworks",
+ "price": "297.00"
+ },
+ {
+ "mfr_sku": "GWP-3739.24.0",
+ "dwSku": "DWKK-157824",
+ "pid": "7896262246451",
+ "title": "Greene Paper Clay | Groundworks",
+ "price": "297.00"
+ },
+ {
+ "mfr_sku": "GWP-3739.4.0",
+ "dwSku": "DWKK-157834",
+ "pid": "7896262279219",
+ "title": "Greene Paper Gold | Groundworks",
+ "price": "297.00"
+ },
+ {
+ "mfr_sku": "GWP-3739.8.0",
+ "dwSku": "DWKK-157844",
+ "pid": "7896262311987",
+ "title": "Greene Paper Noir | Groundworks",
+ "price": "297.00"
+ },
+ {
+ "mfr_sku": "GWP-3739.50.0",
+ "dwSku": "DWKK-157854",
+ "pid": "7896262344755",
+ "title": "Greene Paper Pacific | Groundworks",
+ "price": "297.00"
+ },
+ {
+ "mfr_sku": "GWP-3739.3.0",
+ "dwSku": "DWKK-157864",
+ "pid": "7896262377523",
+ "title": "Greene Paper Spruce | Groundworks",
+ "price": "297.00"
+ },
+ {
+ "mfr_sku": "GWP-3748.7.0",
+ "dwSku": "DWKK-157874",
+ "pid": "7896262410291",
+ "title": "Hula Sisal Bloom | Groundworks",
+ "price": "252.00"
+ },
+ {
+ "mfr_sku": "GWP-3748.8.0",
+ "dwSku": "DWKK-157884",
+ "pid": "7896262443059",
+ "title": "Hula Sisal Ink | Groundworks",
+ "price": "252.00"
+ },
+ {
+ "mfr_sku": "GWP-3748.50.0",
+ "dwSku": "DWKK-157894",
+ "pid": "7896262475827",
+ "title": "Hula Sisal Navy | Groundworks",
+ "price": "252.00"
+ },
+ {
+ "mfr_sku": "GWP-3748.3.0",
+ "dwSku": "DWKK-157904",
+ "pid": "7896262508595",
+ "title": "Hula Sisal Sage | Groundworks",
+ "price": "252.00"
+ },
+ {
+ "mfr_sku": "GWP-3749.513.0",
+ "dwSku": "DWKK-157914",
+ "pid": "7896262541363",
+ "title": "Hutch Ombre Paper Blue | Groundworks",
+ "price": "747.00"
+ },
+ {
+ "mfr_sku": "GWP-3749.719.0",
+ "dwSku": "DWKK-157924",
+ "pid": "7896262574131",
+ "title": "Hutch Ombre Paper Pink | Groundworks",
+ "price": "747.00"
+ },
+ {
+ "mfr_sku": "GWP-3747.319.0",
+ "dwSku": "DWKK-157934",
+ "pid": "7896262606899",
+ "title": "Hutch Patchwork Multi | Groundworks",
+ "price": "627.00"
+ },
+ {
+ "mfr_sku": "GWP-3750.816.0",
+ "dwSku": "DWKK-157944",
+ "pid": "7896262934579",
+ "title": "Hutch Raffia Ink | Groundworks",
+ "price": "6103.50"
+ },
+ {
+ "mfr_sku": "GWP-3768.21.0",
+ "dwSku": "DWKK-157954",
+ "pid": "7896262967347",
+ "title": "Maia Flock Basalt | Groundworks",
+ "price": "517.50"
+ },
+ {
+ "mfr_sku": "GWP-3768.919.0",
+ "dwSku": "DWKK-157964",
+ "pid": "7896263000115",
+ "title": "Maia Flock Garnet | Groundworks",
+ "price": "517.50"
+ },
+ {
+ "mfr_sku": "GWP-3768.116.0",
+ "dwSku": "DWKK-157974",
+ "pid": "7896263032883",
+ "title": "Maia Flock Sand | Groundworks",
+ "price": "517.50"
+ },
+ {
+ "mfr_sku": "GWP-3768.505.0",
+ "dwSku": "DWKK-157984",
+ "pid": "7896263065651",
+ "title": "Maia Flock Sapphire | Groundworks",
+ "price": "517.50"
+ },
+ {
+ "mfr_sku": "GWP-3768.66.0",
+ "dwSku": "DWKK-157994",
+ "pid": "7896263098419",
+ "title": "Maia Flock Tiger Eye | Groundworks",
+ "price": "517.50"
+ },
+ {
+ "mfr_sku": "GWP-3755.535.0",
+ "dwSku": "DWKK-158004",
+ "pid": "7896263163955",
+ "title": "Mar Paper Aqualis | Groundworks",
+ "price": "447.00"
+ },
+ {
+ "mfr_sku": "GWP-3755.421.0",
+ "dwSku": "DWKK-158014",
+ "pid": "7896263196723",
+ "title": "Mar Paper Sahara | Groundworks",
+ "price": "447.00"
+ },
+ {
+ "mfr_sku": "GWP-3755.33.0",
+ "dwSku": "DWKK-158024",
+ "pid": "7896263229491",
+ "title": "Mar Paper Seaglass | Groundworks",
+ "price": "447.00"
+ },
+ {
+ "mfr_sku": "GWP-3755.416.0",
+ "dwSku": "DWKK-158034",
+ "pid": "7896263262259",
+ "title": "Mar Paper Shell | Groundworks",
+ "price": "447.00"
+ },
+ {
+ "mfr_sku": "GWP-3755.1521.0",
+ "dwSku": "DWKK-158044",
+ "pid": "7896263295027",
+ "title": "Mar Paper Siren | Groundworks",
+ "price": "447.00"
+ },
+ {
+ "mfr_sku": "GWP-3741.311.0",
+ "dwSku": "DWKK-158054",
+ "pid": "7896263327795",
+ "title": "Riven Aegean | Groundworks",
+ "price": "1216.50"
+ },
+ {
+ "mfr_sku": "GWP-3741.106.0",
+ "dwSku": "DWKK-158064",
+ "pid": "7896263360563",
+ "title": "Riven Bone | Groundworks",
+ "price": "1216.50"
+ },
+ {
+ "mfr_sku": "GWP-3741.113.0",
+ "dwSku": "DWKK-158074",
+ "pid": "7896263393331",
+ "title": "Riven Cloud | Groundworks",
+ "price": "1216.50"
+ },
+ {
+ "mfr_sku": "GWP-3741.811.0",
+ "dwSku": "DWKK-158084",
+ "pid": "7896263426099",
+ "title": "Riven Jet | Groundworks",
+ "price": "1216.50"
+ },
+ {
+ "mfr_sku": "GWP-3741.917.0",
+ "dwSku": "DWKK-158094",
+ "pid": "7896263458867",
+ "title": "Riven Rose Taupe | Groundworks",
+ "price": "1216.50"
+ },
+ {
+ "mfr_sku": "GWP-3754.815.0",
+ "dwSku": "DWKK-158104",
+ "pid": "7896263491635",
+ "title": "Sift Blueprint | Groundworks",
+ "price": "892.50"
+ },
+ {
+ "mfr_sku": "GWP-3754.124.0",
+ "dwSku": "DWKK-158114",
+ "pid": "7896263524403",
+ "title": "Sift Blush | Groundworks",
+ "price": "892.50"
+ },
+ {
+ "mfr_sku": "GWP-3754.421.0",
+ "dwSku": "DWKK-158124",
+ "pid": "7896263589939",
+ "title": "Sift Citron/Charcoal | Groundworks",
+ "price": "892.50"
+ },
+ {
+ "mfr_sku": "GWP-3754.1621.0",
+ "dwSku": "DWKK-158134",
+ "pid": "7896263852083",
+ "title": "Sift Espresso/Cream | Groundworks",
+ "price": "892.50"
+ },
+ {
+ "mfr_sku": "GWP-3754.13.0",
+ "dwSku": "DWKK-158144",
+ "pid": "7896263884851",
+ "title": "Sift Shadowplay | Groundworks",
+ "price": "892.50"
+ },
+ {
+ "mfr_sku": "GWP-3754.11.0",
+ "dwSku": "DWKK-158154",
+ "pid": "7896263917619",
+ "title": "Sift Silvermist | Groundworks",
+ "price": "892.50"
+ },
+ {
+ "mfr_sku": "GWP-3740.513.0",
+ "dwSku": "DWKK-158164",
+ "pid": "7896263950387",
+ "title": "Signal Paper Ocean | Groundworks",
+ "price": "1140.00"
+ },
+ {
+ "mfr_sku": "GWP-3740.1121.0",
+ "dwSku": "DWKK-158174",
+ "pid": "7896263983155",
+ "title": "Signal Paper Steel | Groundworks",
+ "price": "1140.00"
+ },
+ {
+ "mfr_sku": "GWP-3740.1624.0",
+ "dwSku": "DWKK-158184",
+ "pid": "7896264015923",
+ "title": "Signal Paper Terra | Groundworks",
+ "price": "1140.00"
+ },
+ {
+ "mfr_sku": "GWP-3742.116.0",
+ "dwSku": "DWKK-158194",
+ "pid": "7896264048691",
+ "title": "Sonoma Oatmeal | Groundworks",
+ "price": "438.00"
+ },
+ {
+ "mfr_sku": "GWP-3742.106.0",
+ "dwSku": "DWKK-158204",
+ "pid": "7896264081459",
+ "title": "Sonoma Sand | Groundworks",
+ "price": "438.00"
+ },
+ {
+ "mfr_sku": "GWP-3742.52.0",
+ "dwSku": "DWKK-158214",
+ "pid": "7896264114227",
+ "title": "Sonoma Stoke | Groundworks",
+ "price": "438.00"
+ },
+ {
+ "mfr_sku": "GWP-3764.1116.0",
+ "dwSku": "DWKK-158224",
+ "pid": "7896264146995",
+ "title": "Tetra Champagne | Groundworks",
+ "price": "262.50"
+ },
+ {
+ "mfr_sku": "GWP-3764.8.0",
+ "dwSku": "DWKK-158234",
+ "pid": "7896264179763",
+ "title": "Tetra Coal | Groundworks",
+ "price": "262.50"
+ },
+ {
+ "mfr_sku": "GWP-3764.4.0",
+ "dwSku": "DWKK-158244",
+ "pid": "7896264212531",
+ "title": "Tetra Gold | Groundworks",
+ "price": "262.50"
+ },
+ {
+ "mfr_sku": "GWP-3764.5.0",
+ "dwSku": "DWKK-158254",
+ "pid": "7896264245299",
+ "title": "Tetra Peacock | Groundworks",
+ "price": "262.50"
+ },
+ {
+ "mfr_sku": "GWP-3764.606.0",
+ "dwSku": "DWKK-158264",
+ "pid": "7896264278067",
+ "title": "Tetra Walnut | Groundworks",
+ "price": "262.50"
+ },
+ {
+ "mfr_sku": "GWP-3743.121.0",
+ "dwSku": "DWKK-158274",
+ "pid": "7896264310835",
+ "title": "Torin Ash | Groundworks",
+ "price": "318.00"
+ },
+ {
+ "mfr_sku": "GWP-3743.1617.0",
+ "dwSku": "DWKK-158284",
+ "pid": "7896264376371",
+ "title": "Torin Blush | Groundworks",
+ "price": "318.00"
+ },
+ {
+ "mfr_sku": "GWP-3743.16.0",
+ "dwSku": "DWKK-158294",
+ "pid": "7896264409139",
+ "title": "Torin Sandstone | Groundworks",
+ "price": "318.00"
+ },
+ {
+ "mfr_sku": "GWP-3743.1613.0",
+ "dwSku": "DWKK-158304",
+ "pid": "7896264441907",
+ "title": "Torin Seaglass | Groundworks",
+ "price": "318.00"
+ },
+ {
+ "mfr_sku": "GWP-3743.52.0",
+ "dwSku": "DWKK-158314",
+ "pid": "7896264474675",
+ "title": "Torin Slate | Groundworks",
+ "price": "318.00"
+ },
+ {
+ "mfr_sku": "GWP-3753.424.0",
+ "dwSku": "DWKK-158324",
+ "pid": "7896264507443",
+ "title": "Veda Clay | Groundworks",
+ "price": "1495.50"
+ },
+ {
+ "mfr_sku": "GWP-3753.1621.0",
+ "dwSku": "DWKK-158334",
+ "pid": "7896264540211",
+ "title": "Veda Limestone/Bark | Groundworks",
+ "price": "1495.50"
+ },
+ {
+ "mfr_sku": "GWP-3753.517.0",
+ "dwSku": "DWKK-158344",
+ "pid": "7896264900659",
+ "title": "Veda Mineral | Groundworks",
+ "price": "1495.50"
+ },
+ {
+ "mfr_sku": "GWP-3753.324.0",
+ "dwSku": "DWKK-158354",
+ "pid": "7896265228339",
+ "title": "Veda Patina | Groundworks",
+ "price": "1495.50"
}
]
\ No newline at end of file
diff --git a/data/verify-results.json b/data/verify-results.json
new file mode 100644
index 0000000..32af8fd
--- /dev/null
+++ b/data/verify-results.json
@@ -0,0 +1,4 @@
+{
+ "ok": 94,
+ "fails": []
+}
\ No newline at end of file
diff --git a/scripts/fix-images.js b/scripts/fix-images.js
new file mode 100644
index 0000000..a929d49
--- /dev/null
+++ b/scripts/fix-images.js
@@ -0,0 +1,53 @@
+#!/usr/bin/env node
+// Remediate the 9 image-FAILED products: try resized re-upload; if still failing, draft + Needs-Image tag.
+const { Client } = require('pg');
+const fs = require('fs');
+const { execSync } = require('child_process');
+const os = require('os');
+const DOMAIN='designer-laboratory-sandbox.myshopify.com', API='2024-10';
+const TOKEN=(fs.readFileSync(process.env.HOME+'/Projects/secrets-manager/.env','utf8').split('\n').find(l=>l.startsWith('SHOPIFY_ADMIN_TOKEN='))||'').split('=').slice(1).join('=').trim();
+const GQL=`https://${DOMAIN}/admin/api/${API}/graphql.json`;
+const REST=`https://${DOMAIN}/admin/api/${API}`;
+const sleep=ms=>new Promise(r=>setTimeout(r,ms));
+async function gql(q,v){const r=await fetch(GQL,{method:'POST',headers:{'Content-Type':'application/json','X-Shopify-Access-Token':TOKEN},body:JSON.stringify({query:q,variables:v})});return (await r.json()).data;}
+
+(async()=>{
+ const pg=new Client({host:'/tmp',database:'dw_unified'});await pg.connect();
+ const failed=JSON.parse(fs.readFileSync(__dirname+'/../data/verify-results.json')).fails.filter(f=>f.issues&&f.issues.includes('image'));
+ const out=[];
+ for(const f of failed){
+ const pid=f.pid;
+ const row=(await pg.query(`SELECT mfr_sku,image_url,name FROM groundworks_catalog WHERE dw_sku=$1`,[f.dw])).rows[0];
+ // download + resize with sips to <=2000px, re-upload via staged? Simpler: use REST product image with a resized data URL is not allowed.
+ // Resize locally then upload via REST images.json with attachment (base64).
+ let attached=false;
+ try{
+ const tmp=`${os.tmpdir()}/gw_${f.dw}.jpg`;
+ execSync(`curl -sL -A "Mozilla/5.0" -e "https://www.kravet.com/" "${row.image_url}" -o "${tmp}"`,{stdio:'ignore'});
+ // resize longest side to 2000, quality via sips
+ execSync(`sips -Z 2000 "${tmp}" --out "${tmp}" >/dev/null 2>&1`);
+ const b64=fs.readFileSync(tmp).toString('base64');
+ const r=await fetch(`${REST}/products/${pid}/images.json`,{method:'POST',headers:{'Content-Type':'application/json','X-Shopify-Access-Token':TOKEN},body:JSON.stringify({image:{attachment:b64,filename:`${row.mfr_sku}.jpg`}})});
+ const jr=await r.json();
+ if(jr.image&&jr.image.id) attached=true;
+ fs.unlinkSync(tmp);
+ }catch(e){out.push({dw:f.dw,resize_err:String(e).slice(0,120)});}
+ await sleep(1500);
+ // verify featuredImage now present
+ const d=await gql(`query($id:ID!){product(id:$id){featuredImage{url}}}`,{id:`gid://shopify/Product/${pid}`});
+ if(d.product.featuredImage){
+ // ensure ACTIVE (it already is) and record fixed
+ out.push({dw:f.dw,fixed:true});
+ console.log(` ✓ image fixed ${f.dw}`);
+ }else{
+ // draft + Needs-Image
+ await gql(`mutation($input:ProductInput!){productUpdate(input:$input){userErrors{message}}}`,{input:{id:`gid://shopify/Product/${pid}`,status:'DRAFT',tags:['Wallcovering','Groundworks','Needs-Image']}});
+ out.push({dw:f.dw,drafted:true});
+ console.log(` ⚠ drafted + Needs-Image ${f.dw}`);
+ }
+ await sleep(600);
+ }
+ await pg.end();
+ fs.writeFileSync(__dirname+'/../data/fix-images-results.json',JSON.stringify(out,null,2));
+ console.log('fixed=',out.filter(o=>o.fixed).length,'drafted=',out.filter(o=>o.drafted).length);
+})();
diff --git a/scripts/publish.js b/scripts/publish.js
index 0e9e94d..db00968 100644
--- a/scripts/publish.js
+++ b/scripts/publish.js
@@ -159,9 +159,20 @@ async function main() {
if (perr && perr.length) { results.push({ mfr_sku: row.mfr_sku, err: JSON.stringify(perr) }); continue; }
const pid = cr.productCreate.product.id;
- // 2) media (featured image)
- await shopify(`mutation($pid:ID!,$media:[CreateMediaInput!]!){productCreateMedia(productId:$pid,media:$media){userErrors{field message}}}`,
- { pid, media: [{ originalSource: row.image_url, mediaContentType: 'IMAGE' }] });
+ // 2) media (featured image). Brandfolder serves oversized print-masters that Shopify
+ // rejects ("image too large") — so resize locally to <=2000px and upload as attachment.
+ try {
+ const os = require('os'); const { execSync } = require('child_process');
+ const numericPidTmp = pid.split('/').pop();
+ const tmp = `${os.tmpdir()}/gw_${dwSku}.jpg`;
+ execSync(`curl -sL -A "Mozilla/5.0" -e "https://www.kravet.com/" "${row.image_url}" -o "${tmp}"`, { stdio: 'ignore' });
+ execSync(`sips -Z 2000 "${tmp}" --out "${tmp}" >/dev/null 2>&1`);
+ const b64 = fs.readFileSync(tmp).toString('base64');
+ await fetch(`https://${DOMAIN}/admin/api/${API}/products/${numericPidTmp}/images.json`,
+ { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Shopify-Access-Token': TOKEN },
+ body: JSON.stringify({ image: { attachment: b64, filename: `${row.mfr_sku}.jpg` } }) });
+ fs.unlinkSync(tmp);
+ } catch (e) { /* image will be caught by the 5-field verify pass */ }
// 3) variants: rename option "Title"->"Size" + its value -> sellable label, set price+sku, then add sample
const sellLabel = unitLabel(row);
diff --git a/scripts/verify.js b/scripts/verify.js
new file mode 100644
index 0000000..8bd768a
--- /dev/null
+++ b/scripts/verify.js
@@ -0,0 +1,34 @@
+#!/usr/bin/env node
+// Post-publish 5-field audit of every Groundworks product on the LIVE store.
+const { Client } = require('pg');
+const fs = require('fs');
+const DOMAIN='designer-laboratory-sandbox.myshopify.com', API='2024-10';
+const TOKEN=(fs.readFileSync(process.env.HOME+'/Projects/secrets-manager/.env','utf8').split('\n').find(l=>l.startsWith('SHOPIFY_ADMIN_TOKEN='))||'').split('=').slice(1).join('=').trim();
+const GQL=`https://${DOMAIN}/admin/api/${API}/graphql.json`;
+const sleep=ms=>new Promise(r=>setTimeout(r,ms));
+async function gql(q,v){const r=await fetch(GQL,{method:'POST',headers:{'Content-Type':'application/json','X-Shopify-Access-Token':TOKEN},body:JSON.stringify({query:q,variables:v})});return (await r.json()).data;}
+(async()=>{
+ const pg=new Client({host:'/tmp',database:'dw_unified'});await pg.connect();
+ const rows=(await pg.query(`SELECT dw_sku,shopify_product_id FROM groundworks_catalog WHERE shopify_product_id IS NOT NULL ORDER BY dw_sku`)).rows;
+ let fails=[];let ok=0;
+ for(const r of rows){
+ const d=await gql(`query($id:ID!){product(id:$id){status featuredImage{url} tags description variants(first:10){nodes{sku price selectedOptions{value}}}}}`,{id:`gid://shopify/Product/${r.shopify_product_id}`});
+ const p=d.product; if(!p){fails.push({dw:r.dw_sku,why:'missing'});continue;}
+ const vs=p.variants.nodes;
+ const sample=vs.find(v=>v.sku && v.sku.endsWith('-Sample'));
+ const sell=vs.find(v=>v.sku && !v.sku.endsWith('-Sample'));
+ const issues=[];
+ if(!sample||Number(sample.price)!==4.25) issues.push('sample');
+ if(!sell||!(Number(sell.price)>0)) issues.push('sellable/price');
+ if(!p.featuredImage) issues.push('image');
+ if(!p.description||p.description.length<20) issues.push('description');
+ if(!p.tags||p.tags.length<2) issues.push('tags<2');
+ if(p.status!=='ACTIVE') issues.push('status='+p.status);
+ if(issues.length){fails.push({dw:r.dw_sku,pid:r.shopify_product_id,issues});}else ok++;
+ await sleep(120);
+ }
+ await pg.end();
+ console.log(`5-FIELD AUDIT: pass=${ok} fail=${fails.length} total=${rows.length}`);
+ if(fails.length)console.log(JSON.stringify(fails,null,2));
+ fs.writeFileSync(__dirname+'/../data/verify-results.json',JSON.stringify({ok,fails},null,2));
+})();
← 228360c Fix variant mutation sequence (option rename via optionValue
·
back to Groundworks Activation
·
Add deferred-150 escalation memo + blocked-SKU lists 6b72f52 →