shopify-theme — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited shopify-theme (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
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]].
python3 scripts/theme_proxy.py list.push refuses if it finds — – — – (override --force only if truly intentional).?preview_theme_id=<id> link./tmp/.th_env (chmod 600), use, delete. It's a shptka_ Theme Access password generated from the TARGET store's "Theme Access" app — a token from another store 404s on every call.templateSuffix → templates/product.<suffix>.json. Editing the default templates/product.json does NOTHING. To change a PDP block you must edit ALL templates/product.*.json. Self-scoping snippets (render only if product in a collection) make it safe to add a block to every template.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).qk6w18-bw.myshopify.com. Override with --shop <handle>.myshopify.com or $SHOPIFY_SHOP. Confirm the handle via the admin URL admin.shopify.com/store/<handle>.python3 scripts/theme_proxy.py list.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_envRun the engine with dangerouslyDisableSandbox (it needs network).
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.liquidkey is the theme-relative path (snippets/…, templates/…, assets/…, sections/…).
X-Shopify-Shop header is absent (the script always sends it).admin.shopify.com/store/<handle> resolves. Regenerate the password from THIS store's Theme Access app.templates/product.*.json): loop get→edit→push per file, or edit the local pulled copies then push each. For a brand-new snippet you can push it without a prior get.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.