Shopify theme
Skill NovateStudioGit/novate-studio-skills/ecommerce/shopify-theme
Edit and push ExampleBrand (or any) Shopify theme files reliably via the Theme Access proxy. Use when Will says "edit the theme", "push that to the widget/PDP", "update the bundle snippet", or any in-place Shopify theme file change. Resolves the unpublished theme, edits locally, dash-checks, and PUTs through the proxy (bypasses the flaky MCP and the CLI's broken push).From its SKILL.md
npx -y skills add NovateStudioGit/novate-studio-skills --skill shopify-themeAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
4.6 KB, ~1.1k tokens by cl100k_base, as published. Nobody here has run it
/shopify-theme
In-place Shopify theme file edits, the way that actually works. Born from a session
that burned ~6 turns fighting push channels: the MCP themeFilesUpsert expires
mid-session, and the Shopify CLI theme push 404s with a Theme Access token
(even though theme list/pull work). The reliable channel is the Theme Access
proxy Asset API via curl/urllib — that's what this skill defaults to.
Engine: scripts/theme_proxy.py (stdlib only). Recipe + history: memory
[[shopify-theme-edit-via-api]], [[ExampleBrand-theme-numbered]], [[ExampleBrand-3for100-bundle]].
Guardrails (read first)
- Unpublished theme only. Never write the live/MAIN theme. Re-verify role every time (roles + the copy's id change):
python3 scripts/theme_proxy.py list. - No em/en dashes, ever ([[no-em-en-dashes]]).
pushrefuses if it finds—–—–(override--forceonly if truly intentional). - Verify it renders, don't just trust the 200 ([[feedback-verify-render-before-claiming-done]]). A successful PUT means the bytes landed, not that it looks right. Give Will the
?preview_theme_id=<id>link. - Never echo the token. Write it to
/tmp/.th_env(chmod 600), use, delete. It's ashptka_Theme Access password generated from the TARGET store's "Theme Access" app — a token from another store 404s on every call. - Per-product-template gotcha ([[ExampleBrand-theme-numbered]]): ExampleBrand products use
templateSuffix→templates/product.<suffix>.json. Editing the defaulttemplates/product.jsondoes NOTHING. To change a PDP block you must edit ALLtemplates/product.*.json. Self-scoping snippets (render only if product in a collection) make it safe to add a block to every template.
Setup each run
- Token: ask Will to paste the
shptka_...password (Settings → Apps → Theme Access, in the target store). Save it: write/tmp/.th_env,chmod 600. The script reads it from there (or$SHOPIFY_CLI_THEME_TOKEN, or--token). - Store: default is ExampleBrand
qk6w18-bw.myshopify.com. Override with--shop <handle>.myshopify.comor$SHOPIFY_SHOP. Confirm the handle via the admin URLadmin.shopify.com/store/<handle>. - Confirm the unpublished theme id:
python3 scripts/theme_proxy.py list.
Pipeline
1. LIST theme_proxy.py list -> pick the UNPUBLISHED theme id
2. GET theme_proxy.py get <id> <key> /tmp/f -> pull the file to edit (or use the working copy)
3. EDIT edit /tmp/f locally:
- JSON templates: strip leading /* ... */ header -> json.loads -> mutate
blocks / block_order -> json.dumps(indent=2, ensure_ascii=False) -> re-prepend header
- snippets / *.liquid / *.css: edit directly
4. CHECK grep -c -e '—' -e '–' -e '—' -e '–' /tmp/f (must be 0; push also enforces)
5. PUSH theme_proxy.py push <id> <key> /tmp/f -> expect "OK HTTP 200"
6. VERIFY give Will https://<domain>/products/<handle>?preview_theme_id=<id> and ask him to hard-refresh
7. CLEAN rm -f /tmp/.th_env
Run the engine with dangerouslyDisableSandbox (it needs network).
Commands
python3 scripts/theme_proxy.py list
python3 scripts/theme_proxy.py get <theme_id> snippets/foo.liquid /tmp/foo.liquid
python3 scripts/theme_proxy.py push <theme_id> snippets/foo.liquid /tmp/foo.liquid
key is the theme-relative path (snippets/…, templates/…, assets/…, sections/…).
Errors
- 401 "Invalid API key" = missing/wrong token, or the
X-Shopify-Shopheader is absent (the script always sends it). - 404 on every call = the token is for a different store, or the Theme Access app isn't installed on this store. NOT a handle problem if
admin.shopify.com/store/<handle>resolves. Regenerate the password from THIS store's Theme Access app. - Bulk edits (many
templates/product.*.json): loopget→edit→pushper file, or edit the local pulled copies then push each. For a brand-new snippet you canpushit without a priorget.
Handoffs
- Offer/discount economics → [[midas-ecomcfo-skill|/midas]]. Native discount setup (BXGY, free-ship) is Admin API, not this skill. Checkout branding has no API ([[ExampleBrand-checkout-branding-no-api]]).
What ships with it: 1 file
4.6 KB alongside SKILL.md, 1 of them executable
scripts/
- theme_proxy.pyruns4.6 KB