{"_id":"@airsoko/cli","_rev":"6-f4c0b8f2ee0522d15f82ad77dd01c8f2","name":"@airsoko/cli","dist-tags":{"latest":"1.0.1"},"versions":{"0.1.0":{"name":"@airsoko/cli","version":"0.1.0","keywords":["airsoko","cli","partner-app","nextjs","scaffold","create-app","Airsoko-cli"],"license":"MIT","_id":"@airsoko/cli@0.1.0","maintainers":[{"name":"cluewax","email":"cluewaxing@gmail.com"}],"homepage":"https://github.com/airsoko/airsoko-backend-panels#readme","bugs":{"url":"https://github.com/airsoko/airsoko-backend-panels/issues"},"bin":{"airsoko":"dist/bin.js","create-airsoko-app":"dist/create.js"},"dist":{"shasum":"ed7fd54b03e000edb0f2c9126441ec75540e1e72","tarball":"https://registry.npmjs.org/@airsoko/cli/-/cli-0.1.0.tgz","fileCount":98,"integrity":"sha512-xeTmPqYbc/p6EHd6FsJ3cuC5skCA7IhlvkyU5F2vWqjyg/JCcw0CfuxWLNuLcD/o2A5rZZEFboFdDY2sN1D4cw==","signatures":[{"sig":"MEQCIC8hUEgxc+bH6IQePNOB+EbCp6bhkxguPXrmm7EGN+i3AiAYl12bu+lUX8ja4/KynO5JAz7qz4NW+VWsFCRC8/8KqQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":139521},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","engines":{"node":">=18"},"gitHead":"b4ee77791b00278c31c7889d449a3dacf2dbd558","private":false,"scripts":{"dev":"tsc --build --watch","build":"tsc --build --force && node -e \"console.log('@airsoko/cli: build complete → dist/')\"","clean":"tsc --build --clean","prepack":"npm run build","rebuild":"npm run clean && npm run build","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"cluewax","email":"cluewaxing@gmail.com"},"repository":{"url":"git+https://github.com/airsoko/airsoko-backend-panels.git","type":"git","directory":"packages/airsoko-cli"},"_npmVersion":"10.9.8","description":"Airsoko CLI — scaffold partner apps and themes (Airsoko-style developer experience)","directories":{},"_nodeVersion":"22.22.3","dependencies":{"commander":"^12.1.0","picocolors":"^1.1.1","@clack/prompts":"^0.10.0","validate-npm-package-name":"^5.0.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^4.9.5","@types/node":"18.11.18","@macive/tsconfig":"*","@types/validate-npm-package-name":"^4.0.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.1.0_1780921665386_0.21827737203096498","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@airsoko/cli","version":"0.1.1","keywords":["airsoko","cli","partner-app","nextjs","scaffold","create-app","Airsoko-cli"],"license":"MIT","_id":"@airsoko/cli@0.1.1","maintainers":[{"name":"cluewax","email":"cluewaxing@gmail.com"}],"homepage":"https://github.com/airsoko/airsoko-backend-panels#readme","bugs":{"url":"https://github.com/airsoko/airsoko-backend-panels/issues"},"bin":{"airsoko":"dist/bin.js","create-airsoko-app":"dist/create.js"},"dist":{"shasum":"2df964db5b4e22872a4aa366a9ec30ef25f49431","tarball":"https://registry.npmjs.org/@airsoko/cli/-/cli-0.1.1.tgz","fileCount":98,"integrity":"sha512-qxuorXLgYT1MCASvZbLv1tPmZFBtWzJi1+9txeeLnypjbr8fHXQ3NGbqpPFQQ/zHDrfHDl4nTBwTHM3rKmYGMg==","signatures":[{"sig":"MEYCIQCD/G41r7IJwe38PQ/T0M6Ger0CArK7M4m/5mEDuTRs6gIhAM5OsHb51lhA5vHUmzxqqGtDdiQoOE/NOcEu+F+hss2e","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":142641},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","engines":{"node":">=18"},"gitHead":"b4ee77791b00278c31c7889d449a3dacf2dbd558","private":false,"scripts":{"dev":"tsc --build --watch","build":"tsc --build --force && node -e \"console.log('@airsoko/cli: build complete → dist/')\"","clean":"tsc --build --clean","prepack":"npm run build","rebuild":"npm run clean && npm run build","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"cluewax","email":"cluewaxing@gmail.com"},"repository":{"url":"git+https://github.com/airsoko/airsoko-backend-panels.git","type":"git","directory":"packages/airsoko-cli"},"_npmVersion":"10.9.8","description":"Airsoko CLI — scaffold partner apps and themes (Airsoko-style developer experience)","directories":{},"_nodeVersion":"22.22.3","dependencies":{"commander":"^12.1.0","picocolors":"^1.1.1","@clack/prompts":"^0.10.0","validate-npm-package-name":"^5.0.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^4.9.5","@types/node":"18.11.18","@macive/tsconfig":"*","@types/validate-npm-package-name":"^4.0.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.1.1_1780923381826_0.8702159704201693","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@airsoko/cli","version":"0.1.2","keywords":["airsoko","cli","partner-app","nextjs","scaffold","create-app","Airsoko-cli"],"license":"MIT","_id":"@airsoko/cli@0.1.2","maintainers":[{"name":"cluewax","email":"cluewaxing@gmail.com"}],"homepage":"https://github.com/airsoko/airsoko-backend-panels#readme","bugs":{"url":"https://github.com/airsoko/airsoko-backend-panels/issues"},"bin":{"airsoko":"dist/bin.js","create-airsoko-app":"dist/create.js"},"dist":{"shasum":"4813efdeff29d41e3f3a3da1d08dafc211a9b814","tarball":"https://registry.npmjs.org/@airsoko/cli/-/cli-0.1.2.tgz","fileCount":130,"integrity":"sha512-lm+9vmkIm5iXkYtLakYTtmgLv6V0grWPGlJ3uP5iGdF/dqNEtPudasuaF5ILHibMGQJ1mKZtyVjDJvxp65cMkw==","signatures":[{"sig":"MEUCIDww7i40P7/Uyro8WQ9X6Wl266KR2q3GIr9NBVxlM8/PAiEAkIRsaNK87yO3Us0QUhkuKIQloTGE9HVKYpcgeH5O/0Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":204482},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","engines":{"node":">=18"},"gitHead":"e89997c0d1aaa0dd1ef9179b4868134dcca6bd51","private":false,"scripts":{"dev":"tsc --build --watch","build":"tsc --build --force && node -e \"console.log('@airsoko/cli: build complete → dist/')\"","clean":"tsc --build --clean","prepack":"npm run build","rebuild":"npm run clean && npm run build","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"cluewax","email":"cluewaxing@gmail.com"},"repository":{"url":"git+https://github.com/airsoko/airsoko-backend-panels.git","type":"git","directory":"packages/airsoko-cli"},"_npmVersion":"10.9.8","description":"Airsoko CLI — scaffold partner apps and themes (Airsoko-style developer experience)","directories":{},"_nodeVersion":"22.22.3","dependencies":{"liquidjs":"^10.27.0","commander":"^12.1.0","picocolors":"^1.1.1","@clack/prompts":"^0.10.0","validate-npm-package-name":"^5.0.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^4.9.5","@types/node":"18.11.18","@macive/tsconfig":"*","@types/validate-npm-package-name":"^4.0.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.1.2_1780958215126_0.4701469803547196","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@airsoko/cli","version":"0.1.4","keywords":["airsoko","cli","partner-app","nextjs","scaffold","create-app","Airsoko-cli"],"license":"MIT","_id":"@airsoko/cli@0.1.4","maintainers":[{"name":"cluewax","email":"cluewaxing@gmail.com"}],"homepage":"https://github.com/airsoko/airsoko-backend-panels#readme","bugs":{"url":"https://github.com/airsoko/airsoko-backend-panels/issues"},"bin":{"airsoko":"dist/bin.js","create-airsoko-app":"dist/create.js"},"dist":{"shasum":"0a35f3143e46695f88f4de81ee8fa9dec0e7c7ad","tarball":"https://registry.npmjs.org/@airsoko/cli/-/cli-0.1.4.tgz","fileCount":161,"integrity":"sha512-PnZqCXORFBvF8ktcqzXej9n3Swvr6la3dwFlC5mYInKqLYzMt1h2qshYxbpAQlP9AJpEIjAnU1ObHNmqPJA5pw==","signatures":[{"sig":"MEUCIQDyAAJuOZXUrKbtu1XtZPUrglKJa20lBNKHHjUt5274KAIgcMnpR+BbQYTkimUj/wij+z+sq9gGmqXSv+3qTu4QHME=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":246788},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","engines":{"node":">=18"},"gitHead":"c19bbebba557ff80f5170e856adfae6c029fbeeb","private":false,"scripts":{"dev":"tsc --build --watch","build":"tsc --build --force && node -e \"console.log('@airsoko/cli: build complete → dist/')\"","clean":"tsc --build --clean","prepack":"npm run build","rebuild":"npm run clean && npm run build","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"cluewax","email":"cluewaxing@gmail.com"},"repository":{"url":"git+https://github.com/airsoko/airsoko-backend-panels.git","type":"git","directory":"packages/airsoko-cli"},"_npmVersion":"10.9.8","description":"Airsoko CLI — scaffold partner apps and themes (Airsoko-style developer experience)","directories":{},"_nodeVersion":"22.22.3","dependencies":{"liquidjs":"^10.27.0","commander":"^12.1.0","picocolors":"^1.1.1","@clack/prompts":"^0.10.0","validate-npm-package-name":"^5.0.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^4.9.5","@types/node":"18.11.18","@macive/tsconfig":"*","@types/validate-npm-package-name":"^4.0.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.1.4_1781020779840_0.3912937415387878","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@airsoko/cli","version":"1.0.0","keywords":["airsoko","cli","partner-app","nextjs","scaffold","create-app","Airsoko-cli"],"license":"MIT","_id":"@airsoko/cli@1.0.0","maintainers":[{"name":"cluewax","email":"cluewaxing@gmail.com"}],"homepage":"https://github.com/airsoko/airsoko-backend-panels#readme","bugs":{"url":"https://github.com/airsoko/airsoko-backend-panels/issues"},"bin":{"airsoko":"dist/bin.js","create-airsoko-app":"dist/create.js"},"dist":{"shasum":"896dcce23f1e0ccd4629a2ff51086101be77d219","tarball":"https://registry.npmjs.org/@airsoko/cli/-/cli-1.0.0.tgz","fileCount":205,"integrity":"sha512-MnF2MdeYfLlWAC2kNLJdD2vCxULcy5bLzTIZPhk3/aly7sAwVp5prjMdS4Mct1gvKBFZmkBRrzpJdiKHT93WFg==","signatures":[{"sig":"MEUCIQDHMMcWPyWZNFdLuASsNk+i5+wwkk/z2dMM0PrRTwHtxQIgRmsY6neGNDYMAFQoOuLtHdAFjzbVHf294aSIgoRXnmA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":318359},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","engines":{"node":">=18"},"gitHead":"3e05847547c0b38e060128e4c5048afd88335ecb","private":false,"scripts":{"dev":"tsc --build --watch","build":"tsc --build --force && node -e \"console.log('@airsoko/cli: build complete → dist/')\"","clean":"tsc --build --clean","prepack":"npm run build","rebuild":"npm run clean && npm run build","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"cluewax","email":"cluewaxing@gmail.com"},"repository":{"url":"git+https://github.com/airsoko/airsoko-backend-panels.git","type":"git","directory":"packages/airsoko-cli"},"_npmVersion":"10.9.8","description":"Airsoko CLI — scaffold partner apps and themes (Airsoko-style developer experience)","directories":{},"_nodeVersion":"22.22.3","dependencies":{"liquidjs":"^10.27.0","commander":"^12.1.0","picocolors":"^1.1.1","@clack/prompts":"^0.10.0","validate-npm-package-name":"^5.0.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^4.9.5","@types/node":"18.11.18","@macive/tsconfig":"*","@types/validate-npm-package-name":"^4.0.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_1.0.0_1781026227294_0.8066432836863435","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@airsoko/cli","version":"1.0.1","description":"Airsoko CLI — scaffold partner apps and themes (Airsoko-style developer experience)","license":"MIT","private":false,"type":"commonjs","main":"./dist/index.js","types":"./dist/index.d.ts","bin":{"airsoko":"dist/bin.js","create-airsoko-app":"dist/create.js"},"scripts":{"build":"tsc --build --force && node -e \"console.log('@airsoko/cli: build complete → dist/')\"","rebuild":"npm run clean && npm run build","clean":"tsc --build --clean","typecheck":"tsc --noEmit","dev":"tsc --build --watch","prepublishOnly":"npm run build","prepack":"npm run build"},"engines":{"node":">=18"},"dependencies":{"@clack/prompts":"^0.10.0","commander":"^12.1.0","liquidjs":"^10.27.0","picocolors":"^1.1.1","validate-npm-package-name":"^5.0.1"},"devDependencies":{"@macive/tsconfig":"*","@types/node":"18.11.18","@types/validate-npm-package-name":"^4.0.2","typescript":"^4.9.5"},"keywords":["airsoko","cli","partner-app","nextjs","scaffold","create-app","Airsoko-cli"],"repository":{"type":"git","url":"git+https://github.com/airsoko/airsoko-backend-panels.git","directory":"packages/airsoko-cli"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_id":"@airsoko/cli@1.0.1","gitHead":"5641605aacd8744af35fa1f1dbea888b3e5e1d4b","bugs":{"url":"https://github.com/airsoko/airsoko-backend-panels/issues"},"homepage":"https://github.com/airsoko/airsoko-backend-panels#readme","_nodeVersion":"22.22.3","_npmVersion":"10.9.8","dist":{"integrity":"sha512-42CQLeyTxyYmt2lxsJChztDPPh28p5EERLfo4MyRuy9C43DbK2kG5qHJKMwg69nIljPNzguFB+JmOAc3KDl7zQ==","shasum":"07c9285b0cd4f88977c885377fe7c5b22cfdc030","tarball":"https://registry.npmjs.org/@airsoko/cli/-/cli-1.0.1.tgz","fileCount":221,"unpackedSize":360663,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDRFTy2IjoV6fKlsUPsLbYD/PU7/6q02bB9HPCYxPZONQIgTnIClJNydOZ2vadZU7EaWcegsr8EHsjxHRXZgnjIZ3Q="}]},"_npmUser":{"name":"cluewax","email":"cluewaxing@gmail.com"},"directories":{},"maintainers":[{"name":"cluewax","email":"cluewaxing@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cli_1.0.1_1781287222588_0.004671575151611096"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-08T12:27:45.167Z","modified":"2026-06-12T18:00:22.900Z","0.1.0":"2026-06-08T12:27:45.549Z","0.1.1":"2026-06-08T12:56:21.964Z","0.1.2":"2026-06-08T22:36:55.283Z","0.1.4":"2026-06-09T15:59:39.983Z","1.0.0":"2026-06-09T17:30:27.470Z","1.0.1":"2026-06-12T18:00:22.770Z"},"bugs":{"url":"https://github.com/airsoko/airsoko-backend-panels/issues"},"license":"MIT","homepage":"https://github.com/airsoko/airsoko-backend-panels#readme","keywords":["airsoko","cli","partner-app","nextjs","scaffold","create-app","Airsoko-cli"],"repository":{"type":"git","url":"git+https://github.com/airsoko/airsoko-backend-panels.git","directory":"packages/airsoko-cli"},"description":"Airsoko CLI — scaffold partner apps and themes (Airsoko-style developer experience)","maintainers":[{"name":"cluewax","email":"cluewaxing@gmail.com"}],"readme":"# @airsoko/cli\n\nOfficial command-line tool for building on the Airsoko platform. Scaffold partner apps and storefront themes with the conventions, dependencies, and configuration needed to connect to Merchant Admin and MAPI.\n\n## Requirements\n\n- **Node.js** 18 or later\n- **npm** (used for installing scaffolded projects)\n\n## Installation\n\n```bash\nnpm install -g @airsoko/cli\n```\n\nOr run without a global install:\n\n```bash\nnpx @airsoko/cli app init\nnpx create-airsoko-app my-app\n```\n\n## Quick start\n\nCreate a partner app, register it in the partner dashboard, then run it locally:\n\n```bash\nnpm install -g @airsoko/cli   # or: npx @airsoko/cli app init\nmkdir my-partner-app && cd my-partner-app\nairsoko app init my-partner-app -y --install\n```\n\n1. Register the app in the **partner dashboard** (handle, app URL, OAuth redirect).\n2. Set `MACIVE_APP_CLIENT_ID`, `MACIVE_APP_CLIENT_SECRET`, and `MACIVE_APP_ID` in `.env.local`.\n3. Start development:\n\n```bash\nairsoko app dev\n```\n\nRegister this OAuth redirect URI (replace `<port>` with your dev port, default `3011`):\n\n```\nhttp://localhost:<port>/api/oauth/callback\n```\n\nThe generated project includes a setup guide in `docs/APP.md`.\n\n**Full partner development guide (deploy, scenarios, theme zip upload):** MAPI repo [`docs/app-platform/development-guide.md`](https://github.com/airsoko/mapi/blob/main/docs/app-platform/development-guide.md) (local: `/var/www/html/mapi/docs/app-platform/development-guide.md`).\n\n## Commands\n\n### Authentication\n\nSign in through **accounts.airsoko.com** (platform OAuth + PKCE). Tokens are saved to `~/.airsoko/credentials.json` and used automatically by theme commands when your project `.env` does not override them.\n\n| Command | Description |\n|---------|-------------|\n| `airsoko auth login` | Interactive picker (Partner default, Shop, or Both) |\n| `airsoko auth login partner` | Partner token → `AIRSOKO_PARTNER_TOKEN` (theme push) |\n| `airsoko auth login shop` | Shop token + shop id → `AIRSOKO_SHOP_TOKEN`, `AIRSOKO_SHOP_ID` (`theme push --live`) |\n| `airsoko auth login all` | Partner then shop in one session |\n| `airsoko auth status` | Show saved credentials |\n| `airsoko auth logout [kind]` | Clear partner, shop, or all |\n\n```bash\n# From a theme directory — also writes ~/.airsoko/credentials.json into .env\nairsoko auth login partner -d .\nairsoko auth login shop -d .\nairsoko theme push --bump --live\n```\n\nUse `--no-open` to print the authorize URL without launching a browser. Default callback: `http://127.0.0.1:8976/callback`.\n\n### Partner apps\n\n| Command | Description |\n|---------|-------------|\n| `airsoko app init [name]` | Create a new partner app |\n| `airsoko app dev` | Start the Next.js dev server |\n| `airsoko app build` | Production build |\n| `airsoko app start` | Run the production server |\n\n`create-airsoko-app [name]` is an alias for `airsoko app init`.\n\n#### `app init` options\n\n| Flag | Description |\n|------|-------------|\n| `-d, --directory <path>` | Output directory — use `.` for cwd (default when `[name]` is passed) |\n| `-t, --title <title>` | App title in Merchant Admin |\n| `--handle <handle>` | Partner dashboard slug |\n| `-p, --port <port>` | Dev server port (default `3011`) |\n| `--mapi <url>` | MAPI base URL |\n| `--admin <url>` | Merchant admin origin |\n| `--marketplace <url>` | Marketplace origin |\n| `--install` | Run `npm install` after scaffolding (default: off — files only) |\n| `--skip-install` | Skip `npm install` (default; same as omitting `--install`) |\n| `-y, --yes` | Non-interactive mode (requires app name) |\n\n```bash\n# Interactive — pre-filled dev settings; scaffolds into cwd by default\nairsoko app init\n\n# Non-interactive — files only (no npm install)\nairsoko app init my-app -y\n\n# Non-interactive — scaffold and install dependencies\nairsoko app init my-app -y --install\n```\n\n**Pre-filled defaults** (third-party devs can press Enter through most prompts):\n\n| Setting | Default |\n|---------|---------|\n| Directory | Current folder (`.`) |\n| Handle | Same as app name |\n| Port | `3011` |\n| MAPI | `https://api.airsoko.com` |\n| Admin | `https://admin.airsoko.com` |\n| Marketplace | `https://marketplace.airsoko.com` |\n| App URL (local dev) | `http://localhost:3011` |\n\nAfter project files are created, the CLI asks whether to **install dependencies** or **continue without installing**. Default selection is continue (files only). Pass `--install` or `--skip-install` to skip that prompt.\n\n### Storefront themes\n\n| Command | Description |\n|---------|-------------|\n| `airsoko theme init [name]` | Scaffold a storefront theme |\n\n```bash\nairsoko theme init my-theme\ncd my-theme && npm run validate\n```\n\nGenerated themes include a customization guide in `docs/THEME.md`.\n\n#### Theme env (`.env` in theme directory)\n\n| Variable | Purpose |\n|----------|---------|\n| `AIRSOKO_API_BASE` | MAPI URL (e.g. `https://api.airsoko.com` or `http://localhost:8000`) |\n| `AIRSOKO_PARTNER_TOKEN` | Partner session token — Partner dashboard → **Themes** → CLI credentials card, or `loginPartner` GraphQL ([docs](https://github.com/airsoko/airsoko-backend-panels/blob/main/packages/airsoko-cli/README.md#getting-airsoko_partner_token)) |\n| `STOREFRONT_SHOP_HANDLE` | Shop handle for `airsoko theme dev` preview |\n\n```bash\ncp .env.example .env\n# Fill AIRSOKO_PARTNER_TOKEN, then:\nairsoko theme push\n```\n\n## What you get\n\n**Partner app** scaffolds include:\n\n- Next.js (App Router) project structure\n- `@airsoko/partner-app` SDK — GraphQL, OAuth, webhooks, embedded admin bridge\n- `@macive/ui` — admin-aligned UI components\n- Authentication, installation storage, and environment configuration\n- Sample pages and install flow (`/install`, `/install/connect`)\n\n**Theme** scaffolds include Liquid-style templates, `theme.json`, sections, assets, and validation scripts.\n\n## Getting `AIRSOKO_PARTNER_TOKEN`\n\nUsed by `airsoko theme push` (Partner GraphQL `uploadPartnerTheme`). This is your **partner account** session token — not a shop/app token.\n\n### Easiest: CLI browser login\n\n```bash\nairsoko auth login partner -d .\n# Or partner + shop for --live publish:\nairsoko auth login all -d .\n```\n\nYou will be redirected to **accounts.airsoko.com** to sign in and approve access. Tokens are stored in `~/.airsoko/credentials.json`.\n\n### Partner dashboard\n\n1. Log in to the [Partner dashboard](https://partner.airsoko.com).\n2. Open **Themes**.\n3. Copy **AIRSOKO_PARTNER_TOKEN** from the **CLI credentials** card (or the full `.env` snippet).\n\n### Alternative: `loginPartner` mutation\n\n```bash\ncurl -s -X POST \"$MAPI_URL/graphql/partner/2025-04\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"query\":\"mutation($e:String!,$p:String!){loginPartner(email:$e,password:$p){accessToken}}\",\"variables\":{\"e\":\"you@partner.com\",\"p\":\"secret\"}}' \\\n  | jq -r '.data.loginPartner.accessToken'\n```\n\nPut the result in your theme `.env` as `AIRSOKO_PARTNER_TOKEN`.\n\nFull guide: MAPI `docs/partner-cli-token.md`.\n\n## Related packages\n\n- [@airsoko/partner-app](https://www.npmjs.com/package/@airsoko/partner-app) — Partner app runtime SDK\n- [@macive/ui](https://www.npmjs.com/package/@macive/ui) — Admin design system\n- [@airsoko/oauth-client](https://www.npmjs.com/package/@airsoko/oauth-client) — Customer OAuth client\n\n## License\n\nMIT\n","readmeFilename":"README.md"}