{"_id":"@conducivemammal/shopify-liquidator","_rev":"3-e52b355eb445c1b8a097a01c177848d7","name":"@conducivemammal/shopify-liquidator","dist-tags":{"latest":"0.1.4"},"versions":{"0.1.0":{"name":"@conducivemammal/shopify-liquidator","version":"0.1.0","keywords":["shopify","cli","themes","ink"],"author":{"name":"Conducive Mammal"},"license":"MIT","_id":"@conducivemammal/shopify-liquidator@0.1.0","maintainers":[{"name":"conducivemammal","email":"l.merlyn@hotmail.co.uk"}],"homepage":"https://github.com/ConduciveMammal/shopify-liquidator#readme","bugs":{"url":"https://github.com/ConduciveMammal/shopify-liquidator/issues"},"bin":{"theme-liquidate":"dist/cli.js"},"dist":{"shasum":"08661bece9df50c3345c240f3e714b6f76062aa2","tarball":"https://registry.npmjs.org/@conducivemammal/shopify-liquidator/-/shopify-liquidator-0.1.0.tgz","fileCount":3,"integrity":"sha512-iEXr1CjHyfSD3t2mRFB+njOAoaRWitvjNK2+0kv5rSWF1kP2h4bQxDgpDJNHj5vbDai9DyFs+dF/K8ipgxcz3w==","signatures":[{"sig":"MEQCIF3pT3OIwKpWoyj38YboM/UPNMQkMtaGDMbi5bXOyDQdAiAJAI/DyPCMN3pt9LIVwgf/iyGViwKRSdJwD/si3frczA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":93803},"type":"module","engines":{"node":"20.x"},"gitHead":"16658a6545e22abc9acf2251d8e038f89518611d","scripts":{"test":"node --test","build":"node ./scripts/build.mjs","start":"node ./dist/cli.js","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"conducivemammal","email":"l.merlyn@hotmail.co.uk"},"repository":{"url":"git+https://github.com/ConduciveMammal/shopify-liquidator.git","type":"git"},"_npmVersion":"11.9.0","description":"Interactive CLI for deleting selected Shopify themes","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ink":"^6.3.1","react":"^19.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/shopify-liquidator_0.1.0_1774313298170_0.2800933021787757","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@conducivemammal/shopify-liquidator","version":"0.1.2","keywords":["shopify","cli","themes","ink"],"author":{"name":"Liam Merlyn"},"license":"MIT","_id":"@conducivemammal/shopify-liquidator@0.1.2","maintainers":[{"name":"conducivemammal","email":"l.merlyn@hotmail.co.uk"}],"homepage":"https://github.com/ConduciveMammal/shopify-liquidator#readme","bugs":{"url":"https://github.com/ConduciveMammal/shopify-liquidator/issues"},"bin":{"theme-liquidate":"dist/cli.js"},"dist":{"shasum":"ebd2add9d45aa73e938a6619f0ea425d70d03e16","tarball":"https://registry.npmjs.org/@conducivemammal/shopify-liquidator/-/shopify-liquidator-0.1.2.tgz","fileCount":3,"integrity":"sha512-56O+oIV7JFXaEClEFPUyR7qoJ3G+V2h4+JfueLapTpauzfEpqx69vhdh4xrvZ8Og4qREqp9CYbNzXvj1FiEcLQ==","signatures":[{"sig":"MEUCIQCwfah6Fpq8AIw52kL+6qGH7zSMmk1ihh4PMCriKLIsdgIgDYLXESaFOh+zDAadIzBccq3eup3FhywzfyTtgLxfwEE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":90954},"type":"module","engines":{"node":"20.x"},"gitHead":"9c2311b5c7c62df7f90bf23046c9de5b1ef5f107","scripts":{"test":"node --test","build":"node ./scripts/build.mjs","start":"node ./dist/cli.js","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"conducivemammal","email":"l.merlyn@hotmail.co.uk"},"repository":{"url":"git+https://github.com/ConduciveMammal/shopify-liquidator.git","type":"git"},"_npmVersion":"11.9.0","description":"Interactive CLI for deleting selected Shopify themes","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ink":"^6.3.1","react":"^19.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.1"},"optionalDependencies":{"keytar":"^7.9.0"},"_npmOperationalInternal":{"tmp":"tmp/shopify-liquidator_0.1.2_1774315010042_0.7449591693209536","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@conducivemammal/shopify-liquidator","version":"0.1.4","description":"Interactive CLI for deleting selected Shopify themes","type":"module","bin":{"theme-liquidate":"dist/cli.js"},"engines":{"node":"24.x"},"scripts":{"build":"node ./scripts/build.mjs","format":"prettier --write \"{index.html,api/**/*.html,src/**/*.js,scripts/**/*.mjs,test/**/*.js}\"","format:check":"prettier --check \"{index.html,api/**/*.html,src/**/*.js,scripts/**/*.mjs,test/**/*.js}\"","start":"node ./dist/cli.js","test":"node --test","prepublishOnly":"npm run build && npm test"},"keywords":["shopify","cli","themes","ink"],"author":{"name":"Liam Merlyn"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/ConduciveMammal/shopify-liquidator.git"},"homepage":"https://github.com/ConduciveMammal/shopify-liquidator#readme","bugs":{"url":"https://github.com/ConduciveMammal/shopify-liquidator/issues"},"publishConfig":{"access":"public"},"dependencies":{"ink":"^6.3.1","react":"^19.2.0"},"optionalDependencies":{"keytar":"^7.9.0"},"devDependencies":{"esbuild":"^0.25.1","prettier":"^3.8.1"},"gitHead":"3d23811c665da9753f1065ab56e81db03c793428","_id":"@conducivemammal/shopify-liquidator@0.1.4","_nodeVersion":"24.14.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-9Pcx6N4bv6b9NwJ0GGqa1j1xVzUgqEu+0ecbX+Qck28hgtlqKigFDWC7u99mTAxh7UFIUN34ponia7LsYigw4g==","shasum":"370cc75e968055fcbcbae9cc3256b51b0a2f92be","tarball":"https://registry.npmjs.org/@conducivemammal/shopify-liquidator/-/shopify-liquidator-0.1.4.tgz","fileCount":3,"unpackedSize":91173,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@conducivemammal%2fshopify-liquidator@0.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDRIoVYN3Gpb6isqVH7FjGMvmZsdCFEo5Q2jTSscQ1tTQIhAKeXGpdpNGimRaRt5L6hD6knu2JDd/IV0/gP6XspsDto"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:65e6a46b-182d-418f-a56c-ffaeff12eded"}},"directories":{},"maintainers":[{"name":"conducivemammal","email":"l.merlyn@hotmail.co.uk"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/shopify-liquidator_0.1.4_1774353802942_0.6797768431559099"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-24T00:48:18.112Z","modified":"2026-03-24T12:03:23.359Z","0.1.0":"2026-03-24T00:48:18.292Z","0.1.2":"2026-03-24T01:16:50.176Z","0.1.4":"2026-03-24T12:03:23.090Z"},"bugs":{"url":"https://github.com/ConduciveMammal/shopify-liquidator/issues"},"author":{"name":"Liam Merlyn"},"license":"MIT","homepage":"https://github.com/ConduciveMammal/shopify-liquidator#readme","keywords":["shopify","cli","themes","ink"],"repository":{"type":"git","url":"git+https://github.com/ConduciveMammal/shopify-liquidator.git"},"description":"Interactive CLI for deleting selected Shopify themes","maintainers":[{"name":"conducivemammal","email":"l.merlyn@hotmail.co.uk"}],"readme":"<img width=\"1780\" height=\"1186\" alt=\"CleanShot 2026-03-20 at 11 00 28\" src=\"https://github.com/user-attachments/assets/af826a9d-5516-4e88-b596-b6e95a9271f7\" />\n\n# Shopify Liquidator\n\nInteractive terminal UI for reviewing Shopify themes, shortlisting the ones you want to remove, and deleting them with an explicit confirmation step.\n\nShopify Liquidator is built for users delete Shopify themes en masse from a store. It opens a browser-based Shopify install flow when needed, stores reusable login details locally, hides protected themes from the selection list, supports dry runs, and processes deletions sequentially so failures are easier to understand.\n\nTo use the CLI, the store needs the companion Shopify app installed so the authentication flow can complete and the CLI can access the Theme API on that shop.\n\n## Install with npm\n\n### Requirements\n\n- Node.js `24.x`\n- A supported desktop credential store:\n  - macOS Keychain\n  - Windows Credential Manager\n  - Linux Secret Service keyring such as GNOME Keyring or KWallet\n\nInstall the published CLI globally:\n\n```bash\nnpm install -g @conducivemammal/shopify-liquidator\n```\n\nAfter installation, use:\n\n```bash\ntheme-liquidate\n```\n\nCheck the available commands:\n\n```bash\ntheme-liquidate --help\n```\n\n## Use it\n\n### Quick start\n\nFor most users, the quickest path is:\n\n```bash\ntheme-liquidate --shop <store> --dry\n```\n\nOn first run, the CLI:\n\n- normalises the shop identifier\n- opens the browser-based Shopify install flow\n- asks the merchant to install or authorise the companion app on the store\n- stores the resulting login details locally for later runs\n\nStart with a dry run so you can review the shortlist without deleting anything. If the result looks right, rerun without `--dry`:\n\n```bash\ntheme-liquidate --shop <store>\n```\n\n### Common commands\n\nRun the deletion UI:\n\n```bash\ntheme-liquidate [--shop <store>] [--dry] [--verbose]\n```\n\nExamples:\n\n```bash\ntheme-liquidate --shop <store>\ntheme-liquidate --shop <store>.myshopify.com --dry\ntheme-liquidate --shop https://admin.shopify.com/store/<store>\ntheme-liquidate --verbose\n```\n\nOptions:\n\n- `--shop`: Store handle, `.myshopify.com` domain, or Shopify admin store URL\n- `--dry`: Simulate deletions without sending the delete mutation\n- `--verbose`: Show full theme objects in the completion view\n- `--help`, `-h`: Show usage text\n\nIf `--shop` is omitted, the CLI uses the current default authenticated shop.\n\n### Manage authentication\n\nOpen the browser login flow without entering the deletion UI:\n\n```bash\ntheme-liquidate auth login --shop <store>\n```\n\nInspect stored auth state:\n\n```bash\ntheme-liquidate auth list\n```\n\nSet the default shop:\n\n```bash\ntheme-liquidate auth use --shop <store>\n```\n\nRemove one stored shop:\n\n```bash\ntheme-liquidate auth remove --shop <store>\n```\n\nClear all stored login data:\n\n```bash\ntheme-liquidate auth logout\n```\n\n### Interactive workflow\n\nThe UI is designed to slow destructive work down just enough to avoid mistakes:\n\n- The opening list only shows themes that are eligible for deletion\n- Live themes and still-processing themes are excluded from the list entirely\n- `↑` / `↓` or `j` / `k` move through themes\n- `Space` toggles selection\n- `Enter` advances from selection to review\n- `Backspace` returns to the previous step during review and confirmation\n- You must type `DELETE` exactly before a dry run or live delete can start\n- Dry-run results can immediately transition into a real delete with `D`\n- After a run, `M` reloads the list so you can select more themes\n\nDeletion is processed sequentially. If Shopify rejects theme deletion because the exemption is missing, the CLI stops immediately and marks remaining themes as skipped.\n\n### Environment variables\n\nDirect local OAuth mode only:\n\n- `SHOPIFY_CLIENT_ID`\n- `SHOPIFY_CLIENT_SECRET`\n\nShared CLI overrides:\n\n- `SHOPIFY_STORE_DOMAIN`\n- `SHOPIFY_SCOPES`\n- `SHOPIFY_LIQUIDATOR_CONFIG_DIR`\n\nDirect local OAuth overrides:\n\n- `SHOPIFY_OAUTH_REDIRECT_URI`\n\nThe CLI stores saved shop metadata in its config and keeps sensitive login details in the native OS credential store.\n\nIf secure storage is unavailable, the CLI asks you to enable an OS credential store instead of writing secrets into the JSON config file.\n\n### Storage model\n\nShopify Liquidator stores data in two places:\n\n- Config file:\n  - macOS default: `~/Library/Application Support/shopify-liquidator/config.json`\n  - Windows default: `%APPDATA%\\\\shopify-liquidator\\\\config.json`\n  - Linux default: `${XDG_CONFIG_HOME:-~/.config}/shopify-liquidator/config.json`\n  - override: `SHOPIFY_LIQUIDATOR_CONFIG_DIR`\n- Native OS credential store:\n  - shared app client secret in direct local OAuth mode\n  - per-shop login details in direct local OAuth mode\n\nThe config file tracks the default shop and saved shop metadata such as scopes and validation timestamps. Secrets are not written to the JSON config file.\n\n## Develop locally\n\n> [!WARNING]\n> Shopify currently protects live theme deletion behind separate Theme API access. `write_themes` on its own is not enough. Without Shopify granting the app the theme modification exemption, authentication, theme discovery, and dry runs still work, but the live `themeDelete` mutation will be blocked.\n\n### Install dependencies\n\n```bash\nnpm install\n```\n\n### Build and run\n\nBuild the CLI:\n\n```bash\nnpm run build\n```\n\nRun the built CLI:\n\n```bash\nnpm start -- --shop <store>\n```\n\nRun tests:\n\n```bash\nnpm test\n```\n\nIf you want the local checkout installed as a global command while developing:\n\n```bash\nnpm install -g .\ntheme-liquidate --help\n```\n\nThe published CLI entry point is:\n\n```text\ndist/cli.js\n```\n\n### Shopify app setup\n\nFor local development, create or use a Shopify app with:\n\n- `read_themes`\n- `write_themes`\n\nExport your Shopify app credentials:\n\n```bash\nexport SHOPIFY_CLIENT_ID=\"your-client-id\"\nexport SHOPIFY_CLIENT_SECRET=\"your-client-secret\"\n```\n\nThe local OAuth callback URL is:\n\n```text\nhttp://127.0.0.1:3457/oauth/callback\n```\n\nDefault requested scopes:\n\n```text\nread_themes,write_themes\n```\n\n### Publishing\n\nPublish from the repo root:\n\n```bash\nnpm login\nnpm pack --dry-run\nnpm publish\n```\n\nBecause this package is scoped, `package.json` already sets public access through `publishConfig.access`.\n\nFor later releases:\n\n```bash\nnpm version patch\nnpm publish\n```\n\n## Shopify caveat\n\nThe CLI supports live deletion, but Shopify may still block it for your app. When that happens, you will typically see a failure indicating that theme modification access is protected.\n\nThat access is tied to the Shopify app used for authentication. Installing the companion app lets the CLI authenticate against the store, but live deletion still depends on Shopify granting that app the separate theme modification exemption.\n\nShopify exemption form:\n\n[Theme modification exemption request](https://docs.google.com/forms/d/e/1FAIpQLSfZTB1vxFC5d1-GPdqYunWRGUoDcOheHQzfK2RoEFEHrknt5g/viewform)\n\nThis means the tool is currently useful in two modes:\n\n- fully operational deletion tool for a hosted app that already has the exemption\n- safe review and dry-run workflow for teams preparing to use deletion once access is granted\n\n## Features\n\n- Hosted broker mode for public distribution through your own Shopify app\n- Browser-based Shopify install flow for merchant authorisation\n- Reusable broker session tokens or offline access tokens stored locally per shop\n- Interactive checklist UI built for terminal use\n- Shop input normalisation for store handles, `.myshopify.com` domains, and `admin.shopify.com/store/...` URLs\n- Automatic protection for live (`MAIN`) and still-processing themes\n- Dry-run mode for previewing the shortlist before live deletion\n- Sequential deletion with per-theme success and failure reporting\n- Multi-shop auth management, including default shop selection\n- Verbose completion mode for inspecting returned theme objects\n\n## Credits\n\nPrimary packages used in this project:\n\n- [Ink](https://github.com/vadimdemedes/ink) for the interactive terminal UI\n- [React](https://react.dev/) for component-driven state and rendering\n- [esbuild](https://esbuild.github.io/) for producing the distributable CLI bundle\n","readmeFilename":"README.md"}