--- name: plugin-packaging description: Create branded PKG installers for plugin distribution. Use when user requests to package a plugin, create installer, share plugin with others, or mentions distributing/sending plugin to someone. Invoked by /package command or natural language like 'create installer for TapeAge' or 'package GainKnob'. --- # plugin-packaging Skill **Purpose:** Create professional PKG installers for sharing plugins with others. ## Overview Generates macOS PKG installers with branded UI, automated plugin installation, and Gatekeeper bypass instructions. ## Workflow **Track your progress:** ``` Plugin Packaging Progress: - [ ] 1. Prerequisites verified (plugin installed, binaries exist) - [ ] 2. Metadata extracted (contracts read, version/description/parameters) - [ ] 3. Branding files created (Welcome, ReadMe, Conclusion) - [ ] 4. Base package built (pkgbuild complete) - [ ] 5. Branded installer created (productbuild complete) - [ ] 6. Distribution package output (dist/ created, committed, PLUGINS.md updated) ``` --- ### 1. Verify Prerequisites Check plugin is ready for packaging: - Read PLUGINS.md, verify status is πŸ“¦ Installed - Verify VST3 exists: `~/Library/Audio/Plug-Ins/VST3/[ProductName].vst3` - Verify AU exists: `~/Library/Audio/Plug-Ins/Components/[ProductName].component` **Blocking:** If not installed, guide user to run `/install-plugin [PluginName]` first. **Preconditions verified in this step:** - Plugin status is πŸ“¦ Installed - VST3 and AU binaries exist in system folders ### 2. Extract Plugin Metadata **Read multiple files in parallel** using multiple Read tool calls: - PLUGINS.md entry for plugin (version, description, parameter list, use cases) - `plugins/[PluginName]/CMakeLists.txt` (for PRODUCT_NAME extraction) - `plugins/[PluginName]/.ideas/parameter-spec.md` (detailed parameter descriptions) - `plugins/[PluginName]/.ideas/creative-brief.md` (features, use cases, design rationale) Extract PRODUCT_NAME using grep + sed (see Section 1.2 in references/pkg-creation.md). **Template variables to extract:** - {{PLUGIN_NAME}}, {{VERSION}}, {{DESCRIPTION}} - {{PRODUCT_NAME}}, {{PARAM_COUNT}}, {{PARAMETERS}} - {{FEATURES}}, {{QUICK_START_PRESETS}} ### 3. Create Branding Files Generate Welcome.txt, ReadMe.txt, and Conclusion.txt by reading templates from `assets/` and replacing {{VARIABLE}} placeholders with metadata from contracts (.ideas/parameter-spec.md and creative-brief.md provide richer content than PLUGINS.md). See Section 3 in references/pkg-creation.md for complete bash implementation. ### 4. Build Base Package Create foundational PKG with installation logic: **4a. Create temp directory structure** (see Section 4a in references/pkg-creation.md) **4b. Copy binaries to payload** (see Section 4a in references/pkg-creation.md) **Validation:** Verify binaries copied successfully. ONLY proceed to 4c when both files are present. **4c. Create postinstall script** (see Section 4b in references/pkg-creation.md for complete script) **4d. Run pkgbuild** (see Section 4c in references/pkg-creation.md for complete command) **Validation:** Verify base PKG created. ONLY proceed to step 5 when PKG file exists. ### 5. Build Branded Installer Wrap base package with branding: **5a. Create Distribution.xml** (see Section 5a in references/pkg-creation.md for complete XML structure) **5b. Run productbuild** (see Section 5b in references/pkg-creation.md for complete command) **Validation:** Verify branded PKG created. ONLY proceed to step 6 when branded PKG exists. ### 6. Output Distribution Package Finalize and present to user: **6a. Create dist directory** (see Section 6a in references/pkg-creation.md) **6b. Copy installer** (see Section 6b in references/pkg-creation.md) **6c. Generate install-readme.txt** (see Section 6c in references/pkg-creation.md for complete template) **6d. Commit distribution package:** ```bash git add plugins/[PluginName]/dist/ git commit -m "feat([PluginName]): create v[X.Y.Z] distribution package" ``` **6e. Update PLUGINS.md** with packaging metadata: ```markdown **Last Packaged:** YYYY-MM-DD **Distribution:** plugins/[PluginName]/dist/[PluginName]-by-TACHES.pkg (X.X MB) ``` **6f. Display summary:** ``` βœ“ [PluginName] packaged successfully Created: plugins/[PluginName]/dist/[PluginName]-by-TACHES.pkg (X.X MB) Distribution package includes: - [PluginName]-by-TACHES.pkg (branded installer) - install-readme.txt (installation guide) Send both files to your friend. ``` --- ## Integration Points **Invoked by:** - `/package [PluginName]` command - Natural language: "Create installer for TapeAge", "Package GainKnob" **Invokes:** - None (terminal skill - does not invoke other skills) **Reads:** - `PLUGINS.md` β†’ Plugin metadata - `plugins/[PluginName]/CMakeLists.txt` β†’ PRODUCT_NAME extraction - `~/Library/Audio/Plug-Ins/VST3/[Product].vst3` β†’ Source binary - `~/Library/Audio/Plug-Ins/Components/[Product].component` β†’ Source binary **Creates:** - `plugins/[PluginName]/dist/[PluginName]-by-TACHES.pkg` β†’ Branded installer - `plugins/[PluginName]/dist/install-readme.txt` β†’ Installation guide **Updates:** - `PLUGINS.md` β†’ Add **Last Packaged:** timestamp and **Distribution:** package path/size - Git repository β†’ Commit dist/ folder with distribution package --- ## Decision Menu After successful packaging, present this menu and WAIT for user response: ``` βœ“ [PluginName] packaged successfully Created: plugins/[PluginName]/dist/[PluginName]-by-TACHES.pkg (X.X MB) What's next? 1. Test installer (recommended) β†’ Verify PKG works correctly 2. Package another plugin β†’ /package [OtherPlugin] 3. View installation guide β†’ Show install-readme.txt contents 4. Share distribution files β†’ Instructions for sending to friend 5. Other Choose (1-5): _ ``` **Option handlers:** 1. **Test installer** β†’ Provide testing checklist (see Testing Checklist in references/pkg-creation.md Section 6) 2. **Package another** β†’ Prompt for plugin name, re-invoke skill 3. **View guide** β†’ Display install-readme.txt with `cat` command 4. **Share instructions** β†’ Explain what files to send, how to compress if needed 5. **Other** β†’ Open-ended response --- ## Error Handling For error scenarios and troubleshooting, see references/pkg-creation.md Section 6 (Error Scenarios). --- ## Success Criteria Packaging succeeds when: - βœ… Base PKG created with postinstall script - βœ… Branded PKG created with Welcome/ReadMe/Conclusion screens - βœ… Installer file copied to `plugins/[PluginName]/dist/` - βœ… Installation guide generated - βœ… File sizes reported (PKG should be 3-5 MB typically) - βœ… User knows what files to share **NOT required for success:** - Actually testing installer (recommended but not blocking) - Signing/notarization (future enhancement) - Multi-format packages (DMG, ZIP - future modes) --- ## Notes for Claude **When executing this skill:** 1. Extract PRODUCT_NAME carefully (may contain spaces, use quotes) 2. Populate branding templates with actual plugin metadata (not placeholders) 3. Postinstall script must handle user detection (can't assume /Users/[name]) 4. Clean up temp files after success (`rm -rf /tmp/[PluginName]-installer`) 5. Report file size to user (helpful for sharing over email/Dropbox) **Branding consistency:** - Always use "TΓ‚CHES" in title, welcome, conclusion - Format: "[PluginName] by TΓ‚CHES" - Include Gatekeeper steps in ReadMe (critical for unsigned plugins)