# Publishing the Postiz CLI to npm ## Quick Publish (Current Name: "postiz") ```bash # From apps/cli directory pnpm run build pnpm publish --access public ``` Then users can install: ```bash npm install -g postiz # or pnpm install -g postiz # And use: postiz --help ``` ## Publishing with a Different Package Name If you want to publish as a different npm package name (e.g., "agent-postiz"): ### 1. Change Package Name Edit `apps/cli/package.json`: ```json { "name": "agent-postiz", // ← Changed package name "version": "1.0.0", "bin": { "postiz": "./dist/index.js" // ← Keep command name! } } ``` **Important:** The `bin` field determines the command name, NOT the package name! ### 2. Publish ```bash cd apps/cli pnpm run build pnpm publish --access public ``` ### 3. Users Install ```bash npm install -g agent-postiz # or pnpm install -g agent-postiz ``` ### 4. Users Use Even though the package is called "agent-postiz", the command is still: ```bash postiz --help # ← Command name from "bin" field postiz posts:create -c "Hello!" -i "twitter-123" ``` ## Package Name vs Command Name | Field | Purpose | Example | |-------|---------|---------| | `"name"` | npm package name (what you install) | `"agent-postiz"` | | `"bin"` | Command name (what you type) | `"postiz"` | **Examples:** 1. **Same name:** ```json "name": "postiz", "bin": { "postiz": "./dist/index.js" } ``` Install: `npm i -g postiz` Use: `postiz` 2. **Different names:** ```json "name": "agent-postiz", "bin": { "postiz": "./dist/index.js" } ``` Install: `npm i -g agent-postiz` Use: `postiz` 3. **Multiple commands:** ```json "name": "agent-postiz", "bin": { "postiz": "./dist/index.js", "pz": "./dist/index.js" } ``` Install: `npm i -g agent-postiz` Use: `postiz` or `pz` ## Publishing Checklist ### Before First Publish - [ ] Verify package name is available on npm ```bash npm view postiz # If error "404 Not Found" - name is available! ``` - [ ] Update version if needed ```json "version": "1.0.0" ``` - [ ] Review files to include ```json "files": [ "dist", "README.md", "SKILL.md" ] ``` - [ ] Build the package ```bash pnpm run build ``` - [ ] Test locally ```bash pnpm link --global postiz --help ``` ### Publish to npm ```bash # Login to npm (first time only) npm login # From apps/cli pnpm run build pnpm publish --access public # Or use the root script cd /path/to/monorepo/root pnpm run publish-cli ``` ### After Publishing Verify it's published: ```bash npm view postiz # Should show your package info ``` Test installation: ```bash npm install -g postiz postiz --version ``` ## Using from Monorepo Root The root `package.json` already has: ```json { "scripts": { "publish-cli": "pnpm run --filter ./apps/cli publish" } } ``` So you can publish from the root: ```bash # From monorepo root pnpm run publish-cli ``` ## Version Updates ### Patch Release (1.0.0 → 1.0.1) ```bash cd apps/cli npm version patch pnpm publish --access public ``` ### Minor Release (1.0.0 → 1.1.0) ```bash cd apps/cli npm version minor pnpm publish --access public ``` ### Major Release (1.0.0 → 2.0.0) ```bash cd apps/cli npm version major pnpm publish --access public ``` ## Scoped Packages If you want to publish under an organization scope: ```json { "name": "@yourorg/postiz", "bin": { "postiz": "./dist/index.js" } } ``` Install: ```bash npm install -g @yourorg/postiz ``` Use: ```bash postiz --help ``` ## Testing Before Publishing ### Test the Build ```bash pnpm run build node dist/index.js --help ``` ### Test Linking ```bash pnpm link --global postiz --help pnpm unlink --global ``` ### Test Publishing (Dry Run) ```bash npm publish --dry-run # Shows what would be published ``` ### Test with `npm pack` ```bash npm pack # Creates a .tgz file # Test installing the tarball npm install -g ./postiz-1.0.0.tgz postiz --help npm uninstall -g postiz ``` ## Continuous Publishing ### Using GitHub Actions Create `.github/workflows/publish-cli.yml`: ```yaml name: Publish CLI to npm on: push: tags: - 'cli-v*' jobs: publish: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: pnpm/action-setup@v2 - uses: actions/setup-node@v3 with: node-version: '20' registry-url: 'https://registry.npmjs.org' - run: pnpm install - run: pnpm run build:cli - name: Publish to npm run: pnpm --filter ./apps/cli publish --access public env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} ``` Then publish with: ```bash git tag cli-v1.0.0 git push origin cli-v1.0.0 ``` ## Common Issues ### "You do not have permission to publish" - Make sure you're logged in: `npm login` - Check package name isn't taken: `npm view postiz` - If scoped, ensure org access: `npm org ls yourorg` ### "Package name too similar to existing package" - Choose a more unique name - Or use a scoped package: `@yourorg/postiz` ### "Missing required files" - Check `"files"` field in package.json - Run `npm pack` to see what would be included - Make sure `dist/` exists and is built ### Command not found after install - Check `"bin"` field is correct - Ensure `dist/index.js` has shebang: `#!/usr/bin/env node` - Try reinstalling: `npm uninstall -g postiz && npm install -g postiz` ## Recommended Names If "postiz" is taken, consider: - `@postiz/cli` - `postiz-cli` - `postiz-agent` - `agent-postiz` - `@yourorg/postiz` Remember: The package name is just for installation. The command can still be `postiz`! ## Summary ✅ Current setup works perfectly! ✅ `bin` field defines the command name ✅ `name` field defines the npm package name ✅ They can be different! **To publish now:** ```bash cd apps/cli pnpm run build pnpm publish --access public ``` **Users install:** ```bash npm install -g postiz # or pnpm install -g postiz ``` **Users use:** ```bash postiz --help postiz posts:create -c "Hello!" -i "twitter-123" ``` 🚀 **Ready to publish!**