---
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)