Plugin Builder Overview plugin-builder automates the entire Claude Code plugin creation and distribution process. It generates valid plugin structures, manifests, validates compliance, packages existing skills, and prepares plugins for marketplace distribution. Purpose : Transform skills into distributable plugins in minutes instead of hours Key Capabilities : - Initialize plugin directory structure - Generate valid plugin.json and marketplace.json manifests - Validate plugin structure and 2025 schema compliance - Package existing skills into plugin format - Automate repetitive plugin tasks P…

\n if re.match(pattern, version):\n return True, \"\"\n return False, \"Version must follow semver (e.g., 1.0.0, 2.1.3-beta)\"\n\n\ndef validate_email(email):\n \"\"\"Validate email format.\"\"\"\n if not email:\n return True, \"\" # Optional\n pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}

Plugin Builder Overview plugin-builder automates the entire Claude Code plugin creation and distribution process. It generates valid plugin structures, manifests, validates compliance, packages existing skills, and prepares plugins for marketplace distribution. Purpose : Transform skills into distributable plugins in minutes instead of hours Key Capabilities : - Initialize plugin directory structure - Generate valid plugin.json and marketplace.json manifests - Validate plugin structure and 2025 schema compliance - Package existing skills into plugin format - Automate repetitive plugin tasks P…

\n if re.match(pattern, email):\n return True, \"\"\n return False, \"Invalid email format\"\n\n\ndef validate_url(url):\n \"\"\"Validate URL format.\"\"\"\n if not url:\n return True, \"\" # Optional\n if url.startswith('http://') or url.startswith('https://'):\n return True, \"\"\n return False, \"URL must start with http:// or https://\"\n\n\ndef load_existing_manifest(plugin_path):\n \"\"\"Load existing plugin.json if it exists.\"\"\"\n manifest_path = plugin_path / \".claude-plugin\" / \"plugin.json\"\n if manifest_path.exists():\n try:\n with open(manifest_path, 'r') as f:\n return json.load(f)\n except json.JSONDecodeError:\n print(f\"⚠ Warning: Existing plugin.json has invalid JSON\")\n return {}\n return {}\n\n\ndef prompt_with_validation(prompt_text, validator=None, default=\"\", allow_empty=True):\n \"\"\"Prompt user with validation.\"\"\"\n while True:\n if default:\n response = input(f\"{prompt_text} [{default}]: \").strip()\n if not response:\n response = default\n else:\n response = input(f\"{prompt_text}: \").strip()\n\n if not response and allow_empty:\n return \"\"\n\n if not response and not allow_empty:\n print(\"✗ This field is required\")\n continue\n\n if validator:\n is_valid, error_msg = validator(response)\n if not is_valid:\n print(f\"✗ {error_msg}\")\n continue\n\n return response\n\n\ndef interactive_manifest_generation(plugin_path, existing_manifest, template_fields):\n \"\"\"Generate manifest interactively.\"\"\"\n print(f\"\\nGenerating plugin.json for {plugin_path.name}\")\n print(\"=\" * 60)\n print(\"Press Enter to skip optional fields or accept defaults\")\n print()\n\n manifest = {}\n\n # Name (required)\n if 'name' in template_fields:\n default_name = existing_manifest.get('name', plugin_path.name)\n name = prompt_with_validation(\n \"Plugin name\",\n validator=validate_plugin_name,\n default=default_name,\n allow_empty=False\n )\n manifest['name'] = name\n\n # Version (recommended)\n if 'version' in template_fields:\n default_version = existing_manifest.get('version', '1.0.0')\n version = prompt_with_validation(\n \"Version\",\n validator=validate_version,\n default=default_version\n )\n if version:\n manifest['version'] = version\n\n # Description (recommended)\n if 'description' in template_fields:\n default_desc = existing_manifest.get('description', '')\n description = prompt_with_validation(\"Description\", default=default_desc)\n if description:\n manifest['description'] = description\n\n # Author (recommended)\n if 'author' in template_fields:\n existing_author = existing_manifest.get('author', {})\n author_name = prompt_with_validation(\n \"Author name\",\n default=existing_author.get('name', '')\n )\n if author_name:\n author = {'name': author_name}\n\n author_email = prompt_with_validation(\n \"Author email\",\n validator=validate_email,\n default=existing_author.get('email', '')\n )\n if author_email:\n author['email'] = author_email\n\n author_url = prompt_with_validation(\n \"Author URL\",\n validator=validate_url,\n default=existing_author.get('url', '')\n )\n if author_url:\n author['url'] = author_url\n\n manifest['author'] = author\n\n # Homepage (optional)\n if 'homepage' in template_fields:\n homepage = prompt_with_validation(\n \"Homepage URL\",\n validator=validate_url,\n default=existing_manifest.get('homepage', '')\n )\n if homepage:\n manifest['homepage'] = homepage\n\n # Repository (optional)\n if 'repository' in template_fields:\n repository = prompt_with_validation(\n \"Repository URL\",\n validator=validate_url,\n default=existing_manifest.get('repository', '')\n )\n if repository:\n manifest['repository'] = repository\n\n # License (optional)\n if 'license' in template_fields:\n default_license = existing_manifest.get('license', 'MIT')\n license_id = prompt_with_validation(\"License\", default=default_license)\n if license_id:\n manifest['license'] = license_id\n\n # Keywords (optional)\n if 'keywords' in template_fields:\n existing_keywords = existing_manifest.get('keywords', [])\n default_keywords = ', '.join(existing_keywords) if existing_keywords else ''\n keywords_str = prompt_with_validation(\n \"Keywords (comma-separated)\",\n default=default_keywords\n )\n if keywords_str:\n keywords = [k.strip() for k in keywords_str.split(',') if k.strip()]\n if keywords:\n manifest['keywords'] = keywords\n\n # Component paths (optional, advanced)\n print(\"\\nComponent paths (optional - press Enter for defaults):\")\n print(\"Use relative paths starting with ./ (e.g., ./skills/)\")\n print()\n\n skills_path = prompt_with_validation(\n \"Skills path\",\n default=existing_manifest.get('skills', '')\n )\n if skills_path:\n manifest['skills'] = skills_path\n\n commands_path = prompt_with_validation(\n \"Commands path\",\n default=existing_manifest.get('commands', '')\n )\n if commands_path:\n manifest['commands'] = commands_path\n\n agents_path = prompt_with_validation(\n \"Agents path\",\n default=existing_manifest.get('agents', '')\n )\n if agents_path:\n manifest['agents'] = agents_path\n\n return manifest\n\n\ndef save_manifest(plugin_path, manifest):\n \"\"\"Save manifest to plugin.json.\"\"\"\n claude_plugin_dir = plugin_path / \".claude-plugin\"\n claude_plugin_dir.mkdir(parents=True, exist_ok=True)\n\n manifest_path = claude_plugin_dir / \"plugin.json\"\n\n try:\n with open(manifest_path, 'w') as f:\n json.dump(manifest, f, indent=2, sort_keys=False)\n f.write('\\n') # Add newline at end\n\n print(f\"\\n✓ Saved to {manifest_path}\")\n return True\n except Exception as e:\n print(f\"\\n✗ Error saving manifest: {e}\")\n return False\n\n\ndef validate_manifest(manifest):\n \"\"\"Validate generated manifest.\"\"\"\n errors = []\n\n # Required field\n if 'name' not in manifest:\n errors.append(\"Missing required field: name\")\n\n # Validate name format\n if 'name' in manifest:\n is_valid, error = validate_plugin_name(manifest['name'])\n if not is_valid:\n errors.append(f\"Invalid name: {error}\")\n\n # Validate version if present\n if 'version' in manifest:\n is_valid, error = validate_version(manifest['version'])\n if not is_valid:\n errors.append(f\"Invalid version: {error}\")\n\n # Validate author email if present\n if 'author' in manifest and isinstance(manifest['author'], dict):\n if 'email' in manifest['author']:\n is_valid, error = validate_email(manifest['author']['email'])\n if not is_valid:\n errors.append(f\"Invalid author email: {error}\")\n\n # Validate URLs\n for url_field in ['homepage', 'repository']:\n if url_field in manifest:\n is_valid, error = validate_url(manifest[url_field])\n if not is_valid:\n errors.append(f\"Invalid {url_field}: {error}\")\n\n return errors\n\n\ndef print_manifest_preview(manifest):\n \"\"\"Print formatted manifest preview.\"\"\"\n print(\"\\n\" + \"=\" * 60)\n print(\"Generated plugin.json:\")\n print(\"=\" * 60)\n print(json.dumps(manifest, indent=2))\n print(\"=\" * 60)\n\n\ndef main():\n \"\"\"Main entry point.\"\"\"\n parser = argparse.ArgumentParser(\n description=\"Generate plugin.json manifest\",\n formatter_class=argparse.RawDescriptionHelpFormatter,\n epilog=\"\"\"\nExamples:\n python generate_manifest.py my-plugin/ # Interactive\n python generate_manifest.py my-plugin/ --update # Update existing\n python generate_manifest.py my-plugin/ --template standard\n python generate_manifest.py my-plugin/ --template complete\n\nTemplates:\n minimal - Only required fields (name)\n standard - Recommended fields (name, version, description, author)\n complete - All fields with examples\n \"\"\"\n )\n\n parser.add_argument('plugin_path', help='Path to plugin directory')\n parser.add_argument('--update', action='store_true', help='Update existing manifest')\n parser.add_argument('--template', choices=['minimal', 'standard', 'complete'],\n default='standard', help='Manifest template')\n\n args = parser.parse_args()\n\n # Validate plugin path\n plugin_path = Path(args.plugin_path)\n if not plugin_path.exists():\n print(f\"✗ Error: Plugin directory does not exist: {plugin_path}\")\n sys.exit(1)\n\n if not plugin_path.is_dir():\n print(f\"✗ Error: Path is not a directory: {plugin_path}\")\n sys.exit(1)\n\n # Load existing manifest if updating\n existing_manifest = {}\n if args.update or (plugin_path / \".claude-plugin\" / \"plugin.json\").exists():\n existing_manifest = load_existing_manifest(plugin_path)\n if existing_manifest:\n print(f\"✓ Loaded existing manifest\")\n\n # Get template fields\n template_fields = TEMPLATES[args.template]\n\n # Generate manifest interactively\n manifest = interactive_manifest_generation(plugin_path, existing_manifest, template_fields)\n\n # Print preview\n print_manifest_preview(manifest)\n\n # Validate\n errors = validate_manifest(manifest)\n if errors:\n print(\"\\n✗ Validation errors:\")\n for error in errors:\n print(f\" - {error}\")\n sys.exit(1)\n\n print(\"\\n✓ Validation: All checks passed\")\n\n # Save\n success = save_manifest(plugin_path, manifest)\n\n if success:\n print(\"\\nNext steps:\")\n print(f\" 1. Review {plugin_path}/.claude-plugin/plugin.json\")\n if not (plugin_path / \"skills\").exists() and not (plugin_path / \"commands\").exists():\n print(f\" 2. Add components (skills, commands, agents)\")\n print(f\" 3. Validate: python validate_plugin.py {plugin_path}/\")\n sys.exit(0)\n else:\n sys.exit(1)\n\n\nif __name__ == '__main__':\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":12126,"content_sha256":"cea1ffb07d537bcf1971276dde7d6650a901d73432419736cbce24ae19d29d13"},{"filename":"scripts/init_plugin.py","content":"#!/usr/bin/env python3\n\"\"\"\nInitialize Claude Code plugin directory structure.\n\nCreates a new plugin with proper structure, minimal manifest, and README template.\n\nUsage:\n python init_plugin.py # Interactive mode\n python init_plugin.py my-plugin # With plugin name\n python init_plugin.py my-plugin --description \"Plugin description\"\n\"\"\"\n\nimport argparse\nimport json\nimport os\nimport sys\nfrom pathlib import Path\n\n\ndef validate_plugin_name(name):\n \"\"\"Validate plugin name follows kebab-case convention.\"\"\"\n if not name:\n return False, \"Plugin name cannot be empty\"\n\n if ' ' in name:\n return False, \"Plugin name cannot contain spaces (use hyphens)\"\n\n if '_' in name:\n return False, \"Plugin name should use kebab-case (hyphens, not underscores)\"\n\n if name != name.lower():\n return False, \"Plugin name should be lowercase\"\n\n if not name.replace('-', '').isalnum():\n return False, \"Plugin name should only contain lowercase letters, numbers, and hyphens\"\n\n return True, \"\"\n\n\ndef prompt_yes_no(question, default=True):\n \"\"\"Prompt for yes/no answer.\"\"\"\n default_str = \"Y/n\" if default else \"y/N\"\n response = input(f\"{question} ({default_str}): \").strip().lower()\n\n if not response:\n return default\n\n return response in ['y', 'yes']\n\n\ndef create_plugin_structure(plugin_name, description, author_name, author_email, components):\n \"\"\"Create plugin directory structure with minimal configuration.\"\"\"\n plugin_path = Path(plugin_name)\n\n # Check if directory already exists\n if plugin_path.exists():\n print(f\"✗ Error: Directory '{plugin_name}' already exists\")\n return False\n\n try:\n print(f\"\\nCreating plugin structure for '{plugin_name}'...\")\n print(\"=\" * 50)\n\n # Create main plugin directory\n plugin_path.mkdir(parents=True)\n print(f\"✓ Created {plugin_name}/\")\n\n # Create .claude-plugin directory\n claude_plugin_dir = plugin_path / \".claude-plugin\"\n claude_plugin_dir.mkdir()\n print(f\"✓ Created .claude-plugin/\")\n\n # Create minimal plugin.json\n manifest = {\"name\": plugin_name}\n if description:\n manifest[\"description\"] = description\n if author_name:\n manifest[\"author\"] = {\"name\": author_name}\n if author_email:\n manifest[\"author\"][\"email\"] = author_email\n\n manifest_path = claude_plugin_dir / \"plugin.json\"\n with open(manifest_path, 'w') as f:\n json.dump(manifest, f, indent=2)\n print(f\"✓ Created .claude-plugin/plugin.json\")\n\n # Create component directories\n for component in components:\n component_dir = plugin_path / component\n component_dir.mkdir()\n print(f\"✓ Created {component}/\")\n\n # Create README.md\n readme_content = generate_readme(plugin_name, description, components)\n readme_path = plugin_path / \"README.md\"\n with open(readme_path, 'w') as f:\n f.write(readme_content)\n print(f\"✓ Created README.md\")\n\n # Success message\n print(\"\\n\" + \"=\" * 50)\n print(\"✓ Plugin structure created successfully!\")\n print(\"\\nNext steps:\")\n print(f\" 1. cd {plugin_name}\")\n\n if 'skills' in components:\n print(f\" 2. Add your skills to {plugin_name}/skills/\")\n if 'commands' in components:\n print(f\" 3. Add your commands to {plugin_name}/commands/\")\n if 'agents' in components:\n print(f\" 4. Add your agents to {plugin_name}/agents/\")\n\n print(f\" 5. Generate complete manifest:\")\n print(f\" python path/to/generate_manifest.py {plugin_name}/\")\n print(f\" 6. Validate plugin:\")\n print(f\" python path/to/validate_plugin.py {plugin_name}/\")\n\n return True\n\n except Exception as e:\n print(f\"\\n✗ Error creating plugin structure: {e}\")\n # Cleanup on failure\n if plugin_path.exists():\n import shutil\n shutil.rmtree(plugin_path)\n return False\n\n\ndef generate_readme(plugin_name, description, components):\n \"\"\"Generate README.md template.\"\"\"\n readme = f\"\"\"# {plugin_name}\n\n{description or \"Description of what this plugin does.\"}\n\n## Components\n\n\"\"\"\n\n if 'skills' in components:\n readme += \"\"\"### Skills\n\nList of skills included in this plugin:\n\n- **skill-name**: Brief description\n\n\"\"\"\n\n if 'commands' in components:\n readme += \"\"\"### Commands\n\nCustom slash commands:\n\n- `/command-name`: What it does\n\n\"\"\"\n\n if 'agents' in components:\n readme += \"\"\"### Agents\n\nSpecialized agents:\n\n- **agent-name**: Capabilities\n\n\"\"\"\n\n readme += \"\"\"## Installation\n\n### From Marketplace\n\n```bash\n/plugin marketplace add your-username/your-marketplace-repo\n/plugin install \"\"\" + plugin_name + \"\"\"\n```\n\n### From Local Path\n\n```bash\n/plugin install ./path/to/\"\"\" + plugin_name + \"\"\"\n```\n\n## Usage\n\n[Provide usage examples and instructions]\n\n## Configuration\n\n[Document any configuration options]\n\n## Contributing\n\n[Contributing guidelines if applicable]\n\n## License\n\n[Your license here - e.g., MIT, Apache-2.0]\n\"\"\"\n\n return readme\n\n\ndef interactive_mode():\n \"\"\"Run interactive plugin initialization.\"\"\"\n print(\"Claude Code Plugin Initializer\")\n print(\"=\" * 50)\n print()\n\n # Get plugin name\n while True:\n plugin_name = input(\"Plugin name (kebab-case): \").strip()\n is_valid, error_msg = validate_plugin_name(plugin_name)\n if is_valid:\n break\n print(f\"✗ {error_msg}\")\n print()\n\n # Get description\n description = input(\"Description (optional): \").strip()\n\n # Get author info\n author_name = input(\"Author name (optional): \").strip()\n author_email = \"\"\n if author_name:\n author_email = input(\"Author email (optional): \").strip()\n\n # Get components\n print(\"\\nComponents to include:\")\n components = []\n if prompt_yes_no(\"Include skills directory?\", default=True):\n components.append(\"skills\")\n if prompt_yes_no(\"Include commands directory?\", default=False):\n components.append(\"commands\")\n if prompt_yes_no(\"Include agents directory?\", default=False):\n components.append(\"agents\")\n\n # Create structure\n return create_plugin_structure(plugin_name, description, author_name, author_email, components)\n\n\ndef main():\n \"\"\"Main entry point.\"\"\"\n parser = argparse.ArgumentParser(\n description=\"Initialize Claude Code plugin structure\",\n formatter_class=argparse.RawDescriptionHelpFormatter,\n epilog=\"\"\"\nExamples:\n python init_plugin.py # Interactive mode\n python init_plugin.py my-plugin # Create plugin with name\n python init_plugin.py my-plugin \\\\\n --description \"My plugin\" \\\\\n --author \"Your Name\" \\\\\n --email \"[email protected]\" \\\\\n --components skills,commands\n \"\"\"\n )\n\n parser.add_argument('plugin_name', nargs='?', help='Plugin name (kebab-case)')\n parser.add_argument('--description', help='Plugin description')\n parser.add_argument('--author', help='Author name')\n parser.add_argument('--email', help='Author email')\n parser.add_argument('--components', help='Components to include (comma-separated: skills,commands,agents)', default='skills')\n\n args = parser.parse_args()\n\n # Interactive mode if no plugin name provided\n if not args.plugin_name:\n success = interactive_mode()\n sys.exit(0 if success else 1)\n\n # Command-line mode\n plugin_name = args.plugin_name\n\n # Validate plugin name\n is_valid, error_msg = validate_plugin_name(plugin_name)\n if not is_valid:\n print(f\"✗ Error: {error_msg}\")\n sys.exit(1)\n\n # Parse components\n components = [c.strip() for c in args.components.split(',') if c.strip()]\n valid_components = {'skills', 'commands', 'agents'}\n invalid = set(components) - valid_components\n if invalid:\n print(f\"✗ Error: Invalid components: {', '.join(invalid)}\")\n print(f\"Valid components: {', '.join(valid_components)}\")\n sys.exit(1)\n\n # Create structure\n success = create_plugin_structure(\n plugin_name,\n args.description,\n args.author,\n args.email,\n components\n )\n\n sys.exit(0 if success else 1)\n\n\nif __name__ == '__main__':\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":8433,"content_sha256":"e50516ac098834c308082955897571fd4b4fc0e3a0ab34195d3bd631d9bf9b6e"},{"filename":"scripts/package_skills.py","content":"#!/usr/bin/env python3\n\"\"\"\nPackage skills into Claude Code plugin format.\n\nCopies skills from source directory to plugin skills/ directory with validation.\n\nUsage:\n python package_skills.py /source/skills /target/plugin # Package all\n python package_skills.py /source/skills /target/plugin --validate\n python package_skills.py /source/skills /target/plugin --dry-run\n python package_skills.py /source/skills /target/plugin --skills skill1,skill2\n\"\"\"\n\nimport argparse\nimport json\nimport os\nimport shutil\nimport sys\nfrom pathlib import Path\n\n\nclass SkillPackager:\n \"\"\"Package skills into plugin format.\"\"\"\n\n def __init__(self, source_dir, plugin_dir, verbose=False):\n self.source_dir = Path(source_dir)\n self.plugin_dir = Path(plugin_dir)\n self.verbose = verbose\n self.skills_packaged = []\n self.skills_warnings = {}\n self.total_size = 0\n\n def find_skills(self, skill_names=None):\n \"\"\"Find skills in source directory.\"\"\"\n if not self.source_dir.exists():\n print(f\"✗ Error: Source directory does not exist: {self.source_dir}\")\n return []\n\n all_skills = []\n for item in self.source_dir.iterdir():\n if item.is_dir():\n skill_md = item / \"SKILL.md\"\n if skill_md.exists():\n if not skill_names or item.name in skill_names:\n all_skills.append(item)\n\n return sorted(all_skills, key=lambda x: x.name)\n\n def validate_skill_2025(self, skill_dir):\n \"\"\"Check if skill is 2025 compliant (has allowed-tools field).\"\"\"\n skill_md = skill_dir / \"SKILL.md\"\n if not skill_md.exists():\n return False, \"SKILL.md not found\"\n\n try:\n with open(skill_md, 'r') as f:\n content = f.read()\n if not content.startswith('---'):\n return False, \"Missing YAML frontmatter\"\n\n frontmatter_end = content.find('---', 3)\n if frontmatter_end \u003c= 0:\n return False, \"Incomplete YAML frontmatter (missing closing ---)\"\n\n frontmatter = content[3:frontmatter_end]\n if 'allowed-tools:' not in frontmatter and 'allowed_tools:' not in frontmatter:\n return False, \"Missing 'allowed-tools' field (2025 schema)\"\n\n return True, \"2025 compliant\"\n except Exception as e:\n return False, f\"Error reading SKILL.md: {e}\"\n\n def get_directory_size(self, directory):\n \"\"\"Calculate total size of directory.\"\"\"\n total = 0\n for dirpath, dirnames, filenames in os.walk(directory):\n for filename in filenames:\n filepath = os.path.join(dirpath, filename)\n total += os.path.getsize(filepath)\n return total\n\n def format_size(self, size_bytes):\n \"\"\"Format size in human-readable format.\"\"\"\n for unit in ['B', 'KB', 'MB', 'GB']:\n if size_bytes \u003c 1024.0:\n return f\"{size_bytes:.1f} {unit}\"\n size_bytes /= 1024.0\n return f\"{size_bytes:.1f} TB\"\n\n def count_files(self, directory):\n \"\"\"Count total files in directory.\"\"\"\n count = 0\n for _, _, filenames in os.walk(directory):\n count += len(filenames)\n return count\n\n def copy_skill(self, skill_dir, target_skills_dir, dry_run=False):\n \"\"\"Copy a skill to plugin skills directory.\"\"\"\n target_path = target_skills_dir / skill_dir.name\n\n if target_path.exists():\n if self.verbose:\n print(f\" ⚠ Skill '{skill_dir.name}' already exists in target, skipping\")\n return False\n\n size = self.get_directory_size(skill_dir)\n file_count = self.count_files(skill_dir)\n\n if dry_run:\n print(f\" [DRY-RUN] Would copy {skill_dir.name} ({self.format_size(size)}, {file_count} files)\")\n return True\n\n try:\n shutil.copytree(skill_dir, target_path)\n self.total_size += size\n if self.verbose:\n print(f\" ✓ Copied {skill_dir.name} ({self.format_size(size)}, {file_count} files)\")\n return True\n except Exception as e:\n print(f\" ✗ Error copying {skill_dir.name}: {e}\")\n return False\n\n def package_skills(self, skills, validate=False, dry_run=False):\n \"\"\"Package list of skills.\"\"\"\n if not skills:\n print(\"No skills found to package\")\n return False\n\n # Create target skills directory\n target_skills_dir = self.plugin_dir / \"skills\"\n if not dry_run:\n target_skills_dir.mkdir(parents=True, exist_ok=True)\n\n print(f\"\\nFound {len(skills)} skill(s) to package\")\n\n # Validate if requested\n if validate:\n print(\"\\nValidating skills (2025 schema compliance)...\")\n for skill_dir in skills:\n is_valid, message = self.validate_skill_2025(skill_dir)\n if is_valid:\n if self.verbose:\n print(f\" ✓ {skill_dir.name}: {message}\")\n else:\n print(f\" ⚠ {skill_dir.name}: WARNING - {message}\")\n self.skills_warnings[skill_dir.name] = message\n\n valid_count = len(skills) - len(self.skills_warnings)\n print(f\"\\nResults: {valid_count} valid, {len(self.skills_warnings)} warning(s)\")\n\n # Package skills\n print(\"\\nPackaging skills...\")\n for skill_dir in skills:\n success = self.copy_skill(skill_dir, target_skills_dir, dry_run)\n if success:\n self.skills_packaged.append(skill_dir.name)\n\n return True\n\n def update_manifest(self, dry_run=False):\n \"\"\"Update plugin.json with skills reference (optional).\"\"\"\n manifest_path = self.plugin_dir / \".claude-plugin\" / \"plugin.json\"\n if not manifest_path.exists():\n return # No manifest to update\n\n if dry_run:\n print(\"\\n[DRY-RUN] Would update plugin.json with skills reference\")\n return\n\n try:\n with open(manifest_path, 'r') as f:\n manifest = json.load(f)\n\n # Add skills reference if not present\n if 'skills' not in manifest and self.skills_packaged:\n manifest['skills'] = \"./skills/\"\n with open(manifest_path, 'w') as f:\n json.dump(manifest, f, indent=2)\n f.write('\\n')\n if self.verbose:\n print(\"\\n✓ Updated plugin.json with skills reference\")\n except Exception as e:\n print(f\"\\n⚠ Warning: Could not update plugin.json: {e}\")\n\n def print_summary(self):\n \"\"\"Print packaging summary.\"\"\"\n print(\"\\n\" + \"=\" * 60)\n print(f\"✓ {len(self.skills_packaged)} skill(s) packaged successfully\")\n if self.total_size > 0:\n print(f\"✓ Total size: {self.format_size(self.total_size)}\")\n\n if self.skills_warnings:\n print(f\"\\nWarnings ({len(self.skills_warnings)}):\")\n for skill_name, warning in self.skills_warnings.items():\n print(f\" ⚠ {skill_name}: {warning}\")\n if \"2025 schema\" in warning:\n print(f\" FIX: Add to {skill_name}/SKILL.md frontmatter:\")\n print(f\" allowed-tools: Read, Write, Bash\")\n\n\ndef main():\n \"\"\"Main entry point.\"\"\"\n parser = argparse.ArgumentParser(\n description=\"Package skills into Claude Code plugin\",\n formatter_class=argparse.RawDescriptionHelpFormatter,\n epilog=\"\"\"\nExamples:\n # Package all skills\n python package_skills.py .claude/skills my-plugin/\n\n # Package with 2025 compliance validation\n python package_skills.py .claude/skills my-plugin/ --validate\n\n # Package specific skills\n python package_skills.py .claude/skills my-plugin/ \\\\\n --skills skill1,skill2,skill3\n\n # Dry run (preview what would be packaged)\n python package_skills.py .claude/skills my-plugin/ --dry-run\n\n # Verbose output\n python package_skills.py .claude/skills my-plugin/ --verbose\n \"\"\"\n )\n\n parser.add_argument('source_dir', help='Source directory containing skills')\n parser.add_argument('plugin_dir', help='Target plugin directory')\n parser.add_argument('--skills', help='Comma-separated list of specific skills to package')\n parser.add_argument('--validate', action='store_true', help='Validate skills for 2025 compliance')\n parser.add_argument('--dry-run', action='store_true', help='Preview without actually copying')\n parser.add_argument('--verbose', '-v', action='store_true', help='Verbose output')\n\n args = parser.parse_args()\n\n # Parse skill names if provided\n skill_names = None\n if args.skills:\n skill_names = [s.strip() for s in args.skills.split(',') if s.strip()]\n\n # Initialize packager\n packager = SkillPackager(args.source_dir, args.plugin_dir, args.verbose)\n\n # Print header\n print(f\"Packaging skills into plugin: {Path(args.plugin_dir).name}\")\n print(\"=\" * 60)\n print(f\"Source: {args.source_dir}\")\n print(f\"Target: {args.plugin_dir}\")\n if args.dry_run:\n print(\"[DRY-RUN MODE - No files will be copied]\")\n print()\n\n # Find skills\n print(f\"Scanning {args.source_dir} for skills...\")\n skills = packager.find_skills(skill_names)\n\n if not skills:\n if skill_names:\n print(f\"✗ No skills found matching: {', '.join(skill_names)}\")\n else:\n print(f\"✗ No skills found in {args.source_dir}\")\n print(\"\\nNote: Skills must have a SKILL.md file to be recognized\")\n sys.exit(1)\n\n # List found skills\n if args.verbose or len(skills) \u003c= 10:\n for skill in skills:\n print(f\" ✓ {skill.name}\")\n else:\n for skill in skills[:3]:\n print(f\" ✓ {skill.name}\")\n print(f\" ... ({len(skills) - 6} more)\")\n for skill in skills[-3:]:\n print(f\" ✓ {skill.name}\")\n\n # Package skills\n success = packager.package_skills(skills, validate=args.validate, dry_run=args.dry_run)\n\n if not success:\n sys.exit(1)\n\n # Update manifest\n if not args.dry_run:\n packager.update_manifest(args.dry_run)\n\n # Print summary\n packager.print_summary()\n\n # Next steps\n if not args.dry_run:\n print(\"\\nNext steps:\")\n if packager.skills_warnings:\n print(\" 1. Fix warnings (add allowed-tools to skills)\")\n print(f\" 2. Review {args.plugin_dir}/skills/ directory\")\n print(f\" 3. Update README.md with skill list\")\n print(f\" 4. Validate: python validate_plugin.py {args.plugin_dir}/\")\n print(f\" 5. Test: /plugin install {args.plugin_dir}/ (local test)\")\n\n sys.exit(0)\n\n\nif __name__ == '__main__':\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":10921,"content_sha256":"df799477dfd77cc3d81151026bf465874c9ba1f8c206a7f13a871c3f34561076"},{"filename":"scripts/validate_plugin.py","content":"#!/usr/bin/env python3\n\"\"\"\nValidate Claude Code plugin structure and compliance.\n\nComprehensive validation of plugin directory structure, manifests, and components.\n\nUsage:\n python validate_plugin.py /path/to/plugin # Full validation\n python validate_plugin.py /path/to/plugin --verbose # Detailed output\n python validate_plugin.py /path/to/plugin --check structure # Specific check\n\"\"\"\n\nimport argparse\nimport json\nimport os\nimport re\nimport sys\nfrom pathlib import Path\n\n\nclass ValidationResult:\n \"\"\"Store validation results.\"\"\"\n def __init__(self, category):\n self.category = category\n self.errors = []\n self.warnings = []\n self.checks_passed = 0\n self.checks_total = 0\n\n def add_check(self, passed, message=None):\n \"\"\"Add a check result.\"\"\"\n self.checks_total += 1\n if passed:\n self.checks_passed += 1\n else:\n self.errors.append(message or \"Check failed\")\n\n def add_warning(self, message):\n \"\"\"Add a warning.\"\"\"\n self.warnings.append(message)\n\n def is_passed(self):\n \"\"\"Check if all validation passed.\"\"\"\n return len(self.errors) == 0\n\n def print_results(self, verbose=False):\n \"\"\"Print validation results.\"\"\"\n status = \"✓\" if self.is_passed() else \"✗\"\n print(f\"\\n{status} {self.category} ({'passed' if self.is_passed() else 'failed'}) \"\n f\"({self.checks_passed}/{self.checks_total} checks)\")\n\n if verbose or not self.is_passed():\n for i, error in enumerate(self.errors, 1):\n print(f\" ✗ ERROR: {error}\")\n\n if self.warnings:\n for warning in self.warnings:\n print(f\" ⚠ WARNING: {warning}\")\n\n\ndef validate_structure(plugin_path, verbose=False):\n \"\"\"Validate plugin directory structure.\"\"\"\n result = ValidationResult(\"Structure validation\")\n\n # Check .claude-plugin directory exists\n claude_plugin_dir = plugin_path / \".claude-plugin\"\n result.add_check(\n claude_plugin_dir.exists(),\n \".claude-plugin/ directory missing\"\n )\n\n # Check plugin.json exists\n manifest_path = claude_plugin_dir / \"plugin.json\"\n result.add_check(\n manifest_path.exists(),\n \".claude-plugin/plugin.json missing (REQUIRED file)\"\n )\n\n # Check component directories at root (not in .claude-plugin/)\n for component in ['skills', 'commands', 'agents']:\n wrong_location = claude_plugin_dir / component\n if wrong_location.exists():\n result.add_check(\n False,\n f\"{component}/ found in .claude-plugin/ (should be at plugin root). \"\n f\"FIX: Move to {plugin_path}/{component}/\"\n )\n else:\n result.add_check(True) # Correct (not in wrong location)\n\n # Check directory naming (kebab-case recommended)\n for item in plugin_path.iterdir():\n if item.is_dir() and item.name not in ['.claude-plugin', '.git']:\n if '_' in item.name or item.name != item.name.lower():\n result.add_warning(\n f\"Directory '{item.name}' should use kebab-case (lowercase with hyphens)\"\n )\n\n # Check README exists (recommended)\n readme_path = plugin_path / \"README.md\"\n if not readme_path.exists():\n result.add_warning(\"README.md missing (recommended for documentation)\")\n else:\n result.add_check(True)\n\n return result\n\n\ndef validate_manifest(plugin_path, verbose=False):\n \"\"\"Validate plugin.json manifest.\"\"\"\n result = ValidationResult(\"Manifest validation\")\n\n manifest_path = plugin_path / \".claude-plugin\" / \"plugin.json\"\n\n if not manifest_path.exists():\n result.add_check(False, \"plugin.json does not exist\")\n return result\n\n # Check JSON syntax\n try:\n with open(manifest_path, 'r') as f:\n manifest = json.load(f)\n result.add_check(True, \"Valid JSON syntax\")\n except json.JSONDecodeError as e:\n result.add_check(\n False,\n f\"Invalid JSON syntax: {e}. FIX: Check for trailing commas, missing quotes, etc.\"\n )\n return result\n\n # Check required field: name\n if 'name' in manifest:\n name = manifest['name']\n result.add_check(True, \"Required field 'name' present\")\n\n # Validate name format\n if ' ' in name or '_' in name or name != name.lower():\n result.add_check(\n False,\n f\"Plugin name '{name}' should be kebab-case (lowercase with hyphens). \"\n f\"FIX: Change to '{name.lower().replace('_', '-').replace(' ', '-')}'\"\n )\n else:\n result.add_check(True, \"Name format valid (kebab-case)\")\n else:\n result.add_check(False, \"Missing required field: 'name'. FIX: Add \\\"name\\\": \\\"plugin-name\\\"\")\n\n # Validate version format if present\n if 'version' in manifest:\n version = manifest['version']\n semver_pattern = r'^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?(\\+[a-zA-Z0-9.-]+)?

Plugin Builder Overview plugin-builder automates the entire Claude Code plugin creation and distribution process. It generates valid plugin structures, manifests, validates compliance, packages existing skills, and prepares plugins for marketplace distribution. Purpose : Transform skills into distributable plugins in minutes instead of hours Key Capabilities : - Initialize plugin directory structure - Generate valid plugin.json and marketplace.json manifests - Validate plugin structure and 2025 schema compliance - Package existing skills into plugin format - Automate repetitive plugin tasks P…

\n if re.match(semver_pattern, version):\n result.add_check(True, f\"Version format valid: {version}\")\n else:\n result.add_check(\n False,\n f\"Version '{version}' should follow semver (e.g., 1.0.0, 2.1.3-beta). \"\n f\"FIX: Use format MAJOR.MINOR.PATCH\"\n )\n\n # Check for absolute paths (should be relative)\n path_fields = ['skills', 'commands', 'agents', 'hooks', 'mcpServers']\n for field in path_fields:\n if field in manifest:\n path_value = manifest[field]\n if isinstance(path_value, str):\n if os.path.isabs(path_value):\n result.add_check(\n False,\n f\"Field '{field}' has absolute path: {path_value}. \"\n f\"FIX: Use relative path starting with './' (e.g., './{field}')\"\n )\n elif not path_value.startswith('./'):\n result.add_warning(\n f\"Field '{field}' path should start with './' (currently: {path_value})\"\n )\n\n # Check referenced files exist\n for field in path_fields:\n if field in manifest and isinstance(manifest[field], str):\n ref_path = plugin_path / manifest[field].lstrip('./')\n if not ref_path.exists():\n result.add_warning(\n f\"Referenced path '{manifest[field]}' in field '{field}' does not exist\"\n )\n\n # Validate author structure if present\n if 'author' in manifest:\n author = manifest['author']\n if isinstance(author, dict):\n if 'email' in author:\n email = author['email']\n email_pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}

Plugin Builder Overview plugin-builder automates the entire Claude Code plugin creation and distribution process. It generates valid plugin structures, manifests, validates compliance, packages existing skills, and prepares plugins for marketplace distribution. Purpose : Transform skills into distributable plugins in minutes instead of hours Key Capabilities : - Initialize plugin directory structure - Generate valid plugin.json and marketplace.json manifests - Validate plugin structure and 2025 schema compliance - Package existing skills into plugin format - Automate repetitive plugin tasks P…

\n if not re.match(email_pattern, email):\n result.add_warning(f\"Author email format may be invalid: {email}\")\n elif isinstance(author, str):\n result.add_warning(\n \"Author should be an object with 'name' field, not a string. \"\n \"FIX: Change to {\\\"name\\\": \\\"Your Name\\\"}\"\n )\n\n return result\n\n\ndef validate_components(plugin_path, verbose=False):\n \"\"\"Validate plugin components (skills, commands, agents).\"\"\"\n result = ValidationResult(\"Component validation\")\n\n # Validate skills\n skills_dir = plugin_path / \"skills\"\n if skills_dir.exists():\n skill_dirs = [d for d in skills_dir.iterdir() if d.is_dir()]\n if skill_dirs:\n for skill_dir in skill_dirs:\n skill_md = skill_dir / \"SKILL.md\"\n if not skill_md.exists():\n result.add_check(\n False,\n f\"Skill '{skill_dir.name}' missing SKILL.md file. \"\n f\"FIX: Create {skill_md}\"\n )\n else:\n # Validate YAML frontmatter\n try:\n with open(skill_md, 'r') as f:\n content = f.read()\n if content.startswith('---'):\n frontmatter_end = content.find('---', 3)\n if frontmatter_end > 0:\n result.add_check(True, f\"Skill '{skill_dir.name}' has frontmatter\")\n else:\n result.add_check(\n False,\n f\"Skill '{skill_dir.name}' has incomplete frontmatter (missing closing ---)\"\n )\n else:\n result.add_check(\n False,\n f\"Skill '{skill_dir.name}' missing YAML frontmatter. \"\n f\"FIX: Add frontmatter at top of SKILL.md\"\n )\n except Exception as e:\n result.add_check(False, f\"Error reading {skill_md}: {e}\")\n\n # Validate commands\n commands_dir = plugin_path / \"commands\"\n if commands_dir.exists():\n command_files = list(commands_dir.glob(\"*.md\"))\n if command_files:\n for cmd_file in command_files:\n try:\n with open(cmd_file, 'r') as f:\n content = f.read()\n if content.startswith('---'):\n result.add_check(True, f\"Command '{cmd_file.name}' has frontmatter\")\n else:\n result.add_warning(\n f\"Command '{cmd_file.name}' missing YAML frontmatter (recommended)\"\n )\n except Exception as e:\n result.add_warning(f\"Error reading {cmd_file}: {e}\")\n\n # Validate agents\n agents_dir = plugin_path / \"agents\"\n if agents_dir.exists():\n agent_files = list(agents_dir.glob(\"*.md\"))\n if agent_files:\n result.add_check(True, f\"Found {len(agent_files)} agent(s)\")\n\n # Check if plugin has any components\n has_skills = (skills_dir.exists() and any(skills_dir.iterdir()))\n has_commands = (commands_dir.exists() and any(commands_dir.glob(\"*.md\")))\n has_agents = (agents_dir.exists() and any(agents_dir.glob(\"*.md\")))\n\n if not (has_skills or has_commands or has_agents):\n result.add_warning(\n \"Plugin has no components (no skills, commands, or agents). \"\n \"Add components before distributing.\"\n )\n\n return result\n\n\ndef validate_2025_compliance(plugin_path, verbose=False):\n \"\"\"Validate 2025 schema compliance (allowed-tools field in skills).\"\"\"\n result = ValidationResult(\"2025 schema compliance\")\n\n skills_dir = plugin_path / \"skills\"\n if not skills_dir.exists():\n result.add_warning(\"No skills directory (2025 compliance check skipped)\")\n return result\n\n skill_dirs = [d for d in skills_dir.iterdir() if d.is_dir()]\n if not skill_dirs:\n result.add_warning(\"No skills found (2025 compliance check skipped)\")\n return result\n\n for skill_dir in skill_dirs:\n skill_md = skill_dir / \"SKILL.md\"\n if not skill_md.exists():\n continue # Already reported in component validation\n\n try:\n with open(skill_md, 'r') as f:\n content = f.read()\n if content.startswith('---'):\n frontmatter_end = content.find('---', 3)\n if frontmatter_end > 0:\n frontmatter = content[3:frontmatter_end]\n\n # Check for allowed-tools field\n if 'allowed-tools:' in frontmatter or 'allowed_tools:' in frontmatter:\n result.add_check(True, f\"Skill '{skill_dir.name}' has allowed-tools field\")\n else:\n result.add_check(\n False,\n f\"Skill '{skill_dir.name}' missing 'allowed-tools' field (2025 schema requirement). \"\n f\"FIX: Add to SKILL.md frontmatter: allowed-tools: Read, Write, Bash\"\n )\n except Exception as e:\n result.add_warning(f\"Error checking 2025 compliance for {skill_dir.name}: {e}\")\n\n return result\n\n\ndef main():\n \"\"\"Main entry point.\"\"\"\n parser = argparse.ArgumentParser(\n description=\"Validate Claude Code plugin\",\n formatter_class=argparse.RawDescriptionHelpFormatter,\n epilog=\"\"\"\nExamples:\n python validate_plugin.py my-plugin/ # Full validation\n python validate_plugin.py my-plugin/ --verbose # Detailed output\n python validate_plugin.py my-plugin/ --check structure\n python validate_plugin.py my-plugin/ --check manifests\n python validate_plugin.py my-plugin/ --check components\n python validate_plugin.py my-plugin/ --check 2025\n\nExit codes:\n 0 - All validation passed\n 1 - Validation failed (errors found)\n 2 - Script execution error\n \"\"\"\n )\n\n parser.add_argument('plugin_path', help='Path to plugin directory')\n parser.add_argument('--verbose', '-v', action='store_true', help='Verbose output')\n parser.add_argument('--check', choices=['structure', 'manifests', 'components', '2025'],\n help='Run specific validation check only')\n\n args = parser.parse_args()\n\n # Validate plugin path\n plugin_path = Path(args.plugin_path)\n if not plugin_path.exists():\n print(f\"✗ Error: Plugin directory does not exist: {plugin_path}\")\n sys.exit(2)\n\n if not plugin_path.is_dir():\n print(f\"✗ Error: Path is not a directory: {plugin_path}\")\n sys.exit(2)\n\n print(f\"Validating plugin: {plugin_path.name}\")\n print(\"=\" * 60)\n\n # Run validation checks\n results = []\n\n if not args.check or args.check == 'structure':\n results.append(validate_structure(plugin_path, args.verbose))\n\n if not args.check or args.check == 'manifests':\n results.append(validate_manifest(plugin_path, args.verbose))\n\n if not args.check or args.check == 'components':\n results.append(validate_components(plugin_path, args.verbose))\n\n if not args.check or args.check == '2025':\n results.append(validate_2025_compliance(plugin_path, args.verbose))\n\n # Print results\n for result in results:\n result.print_results(args.verbose)\n\n # Summary\n total_errors = sum(len(r.errors) for r in results)\n total_warnings = sum(len(r.warnings) for r in results)\n all_passed = all(r.is_passed() for r in results)\n\n print(\"\\n\" + \"=\" * 60)\n if all_passed:\n print(\"RESULT: PASSED\")\n print(\"=\" * 60)\n print(f\"{total_errors} errors, {total_warnings} warnings\")\n print(\"\\n✓ Plugin is ready for distribution!\")\n else:\n print(\"RESULT: FAILED\")\n print(\"=\" * 60)\n print(f\"{total_errors} errors, {total_warnings} warnings\")\n print(\"\\nFix errors above before distributing plugin.\")\n\n sys.exit(0 if all_passed else 1)\n\n\nif __name__ == '__main__':\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":15345,"content_sha256":"182611b3d1d0696174b7371f30110eab839d44ed5b1a9958dc540a8445b3ec18"},{"filename":"templates/README.md","content":"# {{PLUGIN_NAME}}\n\n{{PLUGIN_DESCRIPTION}}\n\n## Components\n\n### Skills\n\nList of skills included in this plugin:\n\n- **skill-name**: Brief description of what the skill does\n\n### Commands\n\nCustom slash commands (if applicable):\n\n- `/command-name`: What the command does\n\n### Agents\n\nSpecialized agents (if applicable):\n\n- **agent-name**: Agent capabilities and use cases\n\n## Installation\n\n### From Marketplace\n\n```bash\n/plugin marketplace add {{GITHUB_USER}}/{{MARKETPLACE_REPO}}\n/plugin install {{PLUGIN_NAME}}\n```\n\n### From Local Path\n\n```bash\n/plugin install ./path/to/{{PLUGIN_NAME}}\n```\n\n## Usage\n\n[Provide specific usage examples and instructions]\n\n### Example Usage\n\n```bash\n# Example of using a skill from this plugin\n# The skill will be automatically available after installation\n```\n\n## Configuration\n\n[Document any configuration options or requirements]\n\n## Components Detail\n\n### Skills\n\n**skill-name**\n- Purpose: What it does\n- When to use: Situations where this skill helps\n- Usage: How to invoke or use it\n\n## Contributing\n\n[Include contributing guidelines if accepting contributions]\n\n## Version History\n\n- **1.0.0** (YYYY-MM-DD): Initial release\n\n## License\n\n{{LICENSE}} - See LICENSE file for details\n\n## Support\n\n[Contact information or support channels]\n\n---\n\n**Note**: Replace all {{PLACEHOLDERS}} with actual values\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":1334,"content_sha256":"c8091e7a821da7a7d46be3ff9f780af99844f48f64d58f5835d33ac77b3aa969"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"Plugin Builder","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Overview","type":"text"}]},{"type":"paragraph","content":[{"text":"plugin-builder automates the entire Claude Code plugin creation and distribution process. It generates valid plugin structures, manifests, validates compliance, packages existing skills, and prepares plugins for marketplace distribution.","type":"text"}]},{"type":"paragraph","content":[{"text":"Purpose","type":"text","marks":[{"type":"strong"}]},{"text":": Transform skills into distributable plugins in minutes instead of hours","type":"text"}]},{"type":"paragraph","content":[{"text":"Key Capabilities","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Initialize plugin directory structure","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Generate valid plugin.json and marketplace.json manifests","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Validate plugin structure and 2025 schema compliance","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Package existing skills into plugin format","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Automate repetitive plugin tasks","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Pattern","type":"text","marks":[{"type":"strong"}]},{"text":": Task-based (independent operations, flexible order)","type":"text"}]},{"type":"paragraph","content":[{"text":"Time Savings","type":"text","marks":[{"type":"strong"}]},{"text":": 2-4 hours manual work → 15-30 minutes automated","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"What Are Claude Code Plugins?","type":"text"}]},{"type":"paragraph","content":[{"text":"Plugins are distributable packages that extend Claude Code with custom functionality. They can contain:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Skills","type":"text","marks":[{"type":"strong"}]},{"text":": Agent capabilities (what we have 32 of!)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Commands","type":"text","marks":[{"type":"strong"}]},{"text":": Custom slash commands","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Agents","type":"text","marks":[{"type":"strong"}]},{"text":": Specialized subagents","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Hooks","type":"text","marks":[{"type":"strong"}]},{"text":": Event handlers","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"MCP Servers","type":"text","marks":[{"type":"strong"}]},{"text":": External tool integrations","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Distribution","type":"text","marks":[{"type":"strong"}]},{"text":": Plugins are shared via Git-based marketplaces. Users install with:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"/plugin marketplace add owner/repo\n/plugin install plugin-name@marketplace-name","type":"text"}]},{"type":"paragraph","content":[{"text":"Structure","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"plugin-name/\n├── .claude-plugin/\n│ ├── plugin.json # Required: Plugin metadata\n│ └── marketplace.json # Optional: For distribution\n├── skills/ # Your skills go here\n├── commands/ # Custom commands (optional)\n├── agents/ # Subagents (optional)\n└── README.md # Recommended: Documentation","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"When to Use","type":"text"}]},{"type":"paragraph","content":[{"text":"Use plugin-builder when you need to:","type":"text"}]},{"type":"paragraph","content":[{"text":"Creating Plugins","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Package your skills for distribution","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Create installable skill collections","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Share skills with your team","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Publish to community marketplaces","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Validation & Quality","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Validate plugin structure before publishing","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Ensure 2025 schema compliance","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Check manifest correctness","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Verify component formatting","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Distribution Setup","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Create team/organization marketplaces","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Set up GitHub distribution","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Configure multi-plugin catalogs","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Bulk Operations","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Convert multiple skills to plugins","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Package entire skill ecosystems","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Migrate existing skills to plugin format","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Prerequisites","type":"text"}]},{"type":"paragraph","content":[{"text":"Before using plugin-builder:","type":"text"}]},{"type":"paragraph","content":[{"text":"Knowledge","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Basic understanding of Claude Code skills","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Familiarity with terminal/command line","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Basic JSON concepts (scripts generate it for you)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Tools","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Python 3.8+ installed","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Skills/commands/agents to package (for packaging operations)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Git installed (for marketplace distribution)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Optional","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"GitHub account (for public distribution)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Text editor (for manual manifest edits)","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Operations","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Operation 1: Initialize Plugin Structure","type":"text"}]},{"type":"paragraph","content":[{"text":"Create a complete plugin directory structure with minimal configuration.","type":"text"}]},{"type":"paragraph","content":[{"text":"Purpose","type":"text","marks":[{"type":"strong"}]},{"text":": Quickly scaffold a new plugin with correct structure and minimal boilerplate","type":"text"}]},{"type":"paragraph","content":[{"text":"When to Use","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Starting a new plugin from scratch","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Need proper directory layout","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Want generated README template","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Prerequisites","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Plugin name decided (kebab-case recommended)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Basic metadata known (description, author)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Inputs","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Plugin name","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Optional: Description, author information","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Process","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"paragraph","content":[{"text":"Method 1: Interactive Script (Recommended)","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"cd /path/to/your/workspace\npython /path/to/plugin-builder/scripts/init_plugin.py","type":"text"}]},{"type":"paragraph","content":[{"text":"Follow prompts:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Enter plugin name (will create directory with this name)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Enter description (brief, 1-2 sentences)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Enter author name","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Enter author email (optional)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Choose components to include (skills/commands/agents)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Method 2: Command Line","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python /path/to/plugin-builder/scripts/init_plugin.py my-plugin \\\n --description \"My awesome plugin\" \\\n --author \"Your Name\" \\\n --email \"[email protected]\" \\\n --components skills,commands","type":"text"}]},{"type":"paragraph","content":[{"text":"Method 3: Manual Creation","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"mkdir -p my-plugin/.claude-plugin\nmkdir -p my-plugin/skills\nmkdir -p my-plugin/commands # optional\nmkdir -p my-plugin/agents # optional\n\n# Create minimal plugin.json\ncat > my-plugin/.claude-plugin/plugin.json \u003c\u003c'EOF'\n{\n \"name\": \"my-plugin\"\n}\nEOF\n\n# Create README\ncat > my-plugin/README.md \u003c\u003c'EOF'\n# My Plugin\n\nDescription of what this plugin does.\n\n## Installation\n\n\\`\\`\\`bash\n/plugin marketplace add your-username/your-repo\n/plugin install my-plugin\n\\`\\`\\`\nEOF","type":"text"}]},{"type":"paragraph","content":[{"text":"Outputs","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"my-plugin/\n├── .claude-plugin/\n│ └── plugin.json # Minimal manifest (name only)\n├── skills/ # If selected\n├── commands/ # If selected\n├── agents/ # If selected\n└── README.md # Template with installation instructions","type":"text"}]},{"type":"paragraph","content":[{"text":"Validation","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Directory created with correct name","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":".claude-plugin/plugin.json exists with valid JSON","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"README.md exists","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Selected component directories created","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Example","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# Interactive mode\n$ python scripts/init_plugin.py\n\nEnter plugin name (kebab-case): team-toolkit\nEnter description: Development tools for our team\nEnter author name: DevOps Team\nEnter author email (optional): [email protected]\nInclude skills? (y/n): y\nInclude commands? (y/n): y\nInclude agents? (y/n): n\n\nCreating plugin structure...\n✓ Created team-toolkit/\n✓ Created .claude-plugin/plugin.json\n✓ Created README.md\n✓ Created skills/\n✓ Created commands/\n\nNext steps:\n1. Add your skills to team-toolkit/skills/\n2. Add your commands to team-toolkit/commands/\n3. Run: python scripts/generate_manifest.py team-toolkit/\n4. Run: python scripts/validate_plugin.py team-toolkit/","type":"text"}]},{"type":"paragraph","content":[{"text":"See Also","type":"text","marks":[{"type":"strong"}]},{"text":": ","type":"text"},{"text":"templates/plugin.json.minimal","type":"text","marks":[{"type":"link","attrs":{"href":"templates/plugin.json.minimal","title":null}}]},{"text":" for the generated manifest structure","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"Operation 2: Generate plugin.json","type":"text"}]},{"type":"paragraph","content":[{"text":"Create or update the plugin manifest file with complete metadata.","type":"text"}]},{"type":"paragraph","content":[{"text":"Purpose","type":"text","marks":[{"type":"strong"}]},{"text":": Generate a valid, schema-compliant plugin.json with all recommended fields","type":"text"}]},{"type":"paragraph","content":[{"text":"When to Use","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"After initializing plugin structure","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Need to add/update metadata","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Want all optional fields included","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Upgrading from minimal to complete manifest","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Prerequisites","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Plugin directory exists","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Plugin name decided","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Metadata information available","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Inputs","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Plugin name (required)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Version (recommended, default: 1.0.0)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Description (recommended)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Author information (optional but recommended)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Homepage URL (optional)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Repository URL (optional)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"License (optional, default: MIT)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Keywords (optional, for discoverability)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Component paths (optional, uses defaults)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Process","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"paragraph","content":[{"text":"Method 1: Interactive Script (Recommended)","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python scripts/generate_manifest.py /path/to/my-plugin","type":"text"}]},{"type":"paragraph","content":[{"text":"Follow prompts for each field. Press Enter to accept defaults or skip optional fields.","type":"text"}]},{"type":"paragraph","content":[{"text":"Method 2: Update Existing Manifest","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python scripts/generate_manifest.py /path/to/my-plugin --update","type":"text"}]},{"type":"paragraph","content":[{"text":"Loads existing manifest, prompts only for changes/additions.","type":"text"}]},{"type":"paragraph","content":[{"text":"Method 3: Use Template","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python scripts/generate_manifest.py /path/to/my-plugin --template standard","type":"text"}]},{"type":"paragraph","content":[{"text":"Templates available:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"minimal","type":"text","marks":[{"type":"code_inline"}]},{"text":": Name only (valid but basic)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"standard","type":"text","marks":[{"type":"code_inline"}]},{"text":": Name, version, description, author (recommended)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"complete","type":"text","marks":[{"type":"code_inline"}]},{"text":": All fields with examples","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Method 4: Manual Creation","type":"text","marks":[{"type":"strong"}]}]},{"type":"paragraph","content":[{"text":"Copy from ","type":"text"},{"text":"templates/plugin.json.standard","type":"text","marks":[{"type":"link","attrs":{"href":"templates/plugin.json.standard","title":null}}]},{"text":" and edit:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"name\": \"my-plugin\",\n \"version\": \"1.0.0\",\n \"description\": \"Brief description of plugin functionality\",\n \"author\": {\n \"name\": \"Your Name\",\n \"email\": \"[email protected]\"\n },\n \"keywords\": [\"keyword1\", \"keyword2\"],\n \"license\": \"MIT\"\n}","type":"text"}]},{"type":"paragraph","content":[{"text":"Save to ","type":"text"},{"text":"my-plugin/.claude-plugin/plugin.json","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"paragraph","content":[{"text":"Outputs","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Valid ","type":"text"},{"text":"plugin.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" in ","type":"text"},{"text":".claude-plugin/","type":"text","marks":[{"type":"code_inline"}]},{"text":" directory","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"JSON formatted and validated","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"All required fields present","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Optional fields included as specified","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Validation","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"JSON syntax is valid","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Name field present (required)","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Name is kebab-case","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Version follows semver if present","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"No absolute paths","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"File saved in correct location","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Example","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"$ python scripts/generate_manifest.py team-toolkit/\n\nGenerating plugin.json for team-toolkit\n======================================\n\nName: team-toolkit (from directory)\nVersion [1.0.0]: 2.1.0\nDescription: Development and deployment tools for engineering team\nAuthor name: DevOps Team\nAuthor email: [email protected]\nAuthor URL (optional): https://company.com/devops\nHomepage (optional): https://github.com/company/team-toolkit\nRepository (optional): https://github.com/company/team-toolkit\nLicense [MIT]: Apache-2.0\nKeywords (comma-separated): deployment,ci-cd,automation,team\n\nComponent paths (optional, press Enter for defaults):\nSkills path [./skills/]:\nCommands path [./commands/]:\nAgents path:\n\nGenerated plugin.json:\n{\n \"name\": \"team-toolkit\",\n \"version\": \"2.1.0\",\n \"description\": \"Development and deployment tools for engineering team\",\n \"author\": {\n \"name\": \"DevOps Team\",\n \"email\": \"[email protected]\",\n \"url\": \"https://company.com/devops\"\n },\n \"homepage\": \"https://github.com/company/team-toolkit\",\n \"repository\": \"https://github.com/company/team-toolkit\",\n \"license\": \"Apache-2.0\",\n \"keywords\": [\"deployment\", \"ci-cd\", \"automation\", \"team\"]\n}\n\n✓ Saved to team-toolkit/.claude-plugin/plugin.json\n✓ Validation: All checks passed\n\nNext steps:\n1. Review generated manifest\n2. Package your skills: python scripts/package_skills.py\n3. Validate: python scripts/validate_plugin.py team-toolkit/","type":"text"}]},{"type":"paragraph","content":[{"text":"Tips","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Use semantic versioning (MAJOR.MINOR.PATCH)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Include keywords for discoverability","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Add repository URL for open source plugins","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Keep description under 200 characters","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Use kebab-case for plugin name","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"See Also","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/plugin-json-schema.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/plugin-json-schema.md","title":null}}]},{"text":" - Complete field reference","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"templates/","type":"text","marks":[{"type":"link","attrs":{"href":"templates/","title":null}}]},{"text":" - All manifest templates","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"Operation 3: Generate marketplace.json","type":"text"}]},{"type":"paragraph","content":[{"text":"Create a marketplace catalog file for distributing one or more plugins.","type":"text"}]},{"type":"paragraph","content":[{"text":"Purpose","type":"text","marks":[{"type":"strong"}]},{"text":": Set up a marketplace for team/community distribution of plugins","type":"text"}]},{"type":"paragraph","content":[{"text":"When to Use","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Distributing plugins via GitHub repository","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Creating team marketplace","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Publishing multiple plugins","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Setting up plugin catalog","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Prerequisites","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"One or more plugins ready for distribution","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Marketplace name decided","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Owner information available","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Inputs","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Marketplace name (required)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Owner name and email (required)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Plugin entries (required):","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Plugin name","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Source (path, GitHub repo, or git URL)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Description","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Category (optional)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Version (optional)","type":"text"}]}]}]}]}]},{"type":"paragraph","content":[{"text":"Process","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"paragraph","content":[{"text":"Method 1: Interactive Script (Recommended)","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python scripts/generate_marketplace.py","type":"text"}]},{"type":"paragraph","content":[{"text":"Follow prompts:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Marketplace name (kebab-case)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Marketplace description","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Owner name and email","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Plugin source directory (optional, for auto-discovery)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"For each plugin:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Name","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Source (local path, GitHub, git URL)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Description","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Category","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Version","type":"text"}]}]}]}]}]},{"type":"paragraph","content":[{"text":"Method 2: Auto-Discover Plugins","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python scripts/generate_marketplace.py --scan plugins/","type":"text"}]},{"type":"paragraph","content":[{"text":"Automatically finds plugins in directory and prompts for metadata.","type":"text"}]},{"type":"paragraph","content":[{"text":"Method 3: Manual Creation","type":"text","marks":[{"type":"strong"}]}]},{"type":"paragraph","content":[{"text":"Copy from ","type":"text"},{"text":"templates/marketplace.json.minimal","type":"text","marks":[{"type":"link","attrs":{"href":"templates/marketplace.json.minimal","title":null}}]},{"text":" and edit:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"name\": \"my-marketplace\",\n \"description\": \"Curated plugins for my team\",\n \"owner\": {\n \"name\": \"Team Name\",\n \"email\": \"[email protected]\"\n },\n \"plugins\": [\n {\n \"name\": \"plugin-one\",\n \"description\": \"First plugin\",\n \"source\": \"./plugins/plugin-one\",\n \"category\": \"development\"\n }\n ]\n}","type":"text"}]},{"type":"paragraph","content":[{"text":"Save to repository root as ","type":"text"},{"text":".claude-plugin/marketplace.json","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"paragraph","content":[{"text":"Outputs","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Valid ","type":"text"},{"text":"marketplace.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" file","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"All plugins listed with metadata","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Ready for Git repository hosting","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Validation","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"JSON syntax valid","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Required fields present (name, owner, plugins)","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"All plugin sources are valid","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Plugin names are kebab-case","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Categories are standard (development, productivity, security, learning)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Example","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"$ python scripts/generate_marketplace.py --scan company-plugins/\n\nGenerating marketplace.json\n===========================\n\nScanning company-plugins/ for plugins...\nFound 3 plugins:\n - deployment-tools\n - security-scanner\n - test-automation\n\nMarketplace name: company-approved-plugins\nMarketplace description: Approved plugins for Company use\nOwner name: Engineering Team\nOwner email: [email protected]\n\nPlugin 1: deployment-tools\n Description: Automated deployment and rollback tools\n Category [development]:\n Version [1.0.0]: 2.1.0\n Source [./plugins/deployment-tools]:\n\nPlugin 2: security-scanner\n Description: Security analysis and vulnerability detection\n Category [security]:\n Version [1.0.0]: 1.5.0\n Source [./plugins/security-scanner]:\n\nPlugin 3: test-automation\n Description: Automated testing framework and utilities\n Category [development]:\n Version [1.0.0]: 3.0.0\n Source [./plugins/test-automation]:\n\nGenerated marketplace.json (3 plugins)\n✓ Saved to .claude-plugin/marketplace.json\n✓ Validation: All checks passed\n\nNext steps:\n1. Create GitHub repository\n2. Push marketplace.json to repo root\n3. Users can add: /plugin marketplace add company/company-plugins\n4. Users can install: /plugin install deployment-tools@company-approved-plugins","type":"text"}]},{"type":"paragraph","content":[{"text":"Distribution Setup","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"paragraph","content":[{"text":"After generating marketplace.json:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Create GitHub Repository","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"cd /path/to/marketplace\ngit init\ngit add .\ngit commit -m \"Initial marketplace setup\"\ngit remote add origin [email protected]:username/my-marketplace.git\ngit push -u origin main","type":"text"}]},{"type":"ordered_list","attrs":{"order":2,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Users Add Marketplace","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]}]}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"/plugin marketplace add username/my-marketplace","type":"text"}]},{"type":"ordered_list","attrs":{"order":3,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Users Install Plugins","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]}]}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"/plugin install plugin-name@my-marketplace","type":"text"}]},{"type":"paragraph","content":[{"text":"See Also","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/marketplace-json-schema.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/marketplace-json-schema.md","title":null}}]},{"text":" - Complete schema","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/distribution-guide.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/distribution-guide.md","title":null}}]},{"text":" - Setup instructions","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"templates/marketplace.json.multi","type":"text","marks":[{"type":"link","attrs":{"href":"templates/marketplace.json.multi","title":null}}]},{"text":" - Multi-plugin example","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"Operation 4: Validate Plugin","type":"text"}]},{"type":"paragraph","content":[{"text":"Comprehensive validation of plugin structure, manifests, and component compliance.","type":"text"}]},{"type":"paragraph","content":[{"text":"Purpose","type":"text","marks":[{"type":"strong"}]},{"text":": Ensure plugin is correctly structured and ready for distribution","type":"text"}]},{"type":"paragraph","content":[{"text":"When to Use","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Before publishing to marketplace","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"After making changes to plugin","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Before creating GitHub release","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Troubleshooting plugin issues","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Ensuring 2025 schema compliance","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Prerequisites","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Plugin directory exists","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"plugin.json file exists","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Inputs","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Plugin directory path","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Process","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"paragraph","content":[{"text":"Method 1: Script Validation (Comprehensive)","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python scripts/validate_plugin.py /path/to/my-plugin","type":"text"}]},{"type":"paragraph","content":[{"text":"Method 2: Verbose Output","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python scripts/validate_plugin.py /path/to/my-plugin --verbose","type":"text"}]},{"type":"paragraph","content":[{"text":"Shows detailed checks and reasoning.","type":"text"}]},{"type":"paragraph","content":[{"text":"Method 3: Specific Validation Type","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# Structure only\npython scripts/validate_plugin.py /path/to/my-plugin --check structure\n\n# Manifests only\npython scripts/validate_plugin.py /path/to/my-plugin --check manifests\n\n# Components only (skills, commands, agents)\npython scripts/validate_plugin.py /path/to/my-plugin --check components\n\n# 2025 schema compliance\npython scripts/validate_plugin.py /path/to/my-plugin --check 2025","type":"text"}]},{"type":"paragraph","content":[{"text":"Validation Categories","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"paragraph","content":[{"text":"1. Structure Validation","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":true},"content":[{"type":"paragraph","content":[{"text":".claude-plugin/","type":"text","marks":[{"type":"code_inline"}]},{"text":" directory exists","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":true},"content":[{"type":"paragraph","content":[{"text":"plugin.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" exists in ","type":"text"},{"text":".claude-plugin/","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"checkbox_item","attrs":{"checked":true},"content":[{"type":"paragraph","content":[{"text":"Component directories at plugin root (NOT in ","type":"text"},{"text":".claude-plugin/","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":true},"content":[{"type":"paragraph","content":[{"text":"Directory names are kebab-case","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":true},"content":[{"type":"paragraph","content":[{"text":"README.md exists (recommended)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"2. Manifest Validation","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":true},"content":[{"type":"paragraph","content":[{"text":"plugin.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" is valid JSON","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":true},"content":[{"type":"paragraph","content":[{"text":"Required field ","type":"text"},{"text":"name","type":"text","marks":[{"type":"code_inline"}]},{"text":" present","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":true},"content":[{"type":"paragraph","content":[{"text":"Name is kebab-case (no spaces, underscores)","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":true},"content":[{"type":"paragraph","content":[{"text":"Version follows semver if present","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":true},"content":[{"type":"paragraph","content":[{"text":"No absolute paths (all paths relative with ","type":"text"},{"text":"./","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":true},"content":[{"type":"paragraph","content":[{"text":"Referenced files in manifest actually exist","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"3. Component Validation","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":true},"content":[{"type":"paragraph","content":[{"text":"Skills have ","type":"text"},{"text":"SKILL.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" files","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":true},"content":[{"type":"paragraph","content":[{"text":"Skills have valid YAML frontmatter","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":true},"content":[{"type":"paragraph","content":[{"text":"Skills have ","type":"text"},{"text":"allowed-tools","type":"text","marks":[{"type":"code_inline"}]},{"text":" field (2025 schema)","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":true},"content":[{"type":"paragraph","content":[{"text":"Commands have valid markdown with frontmatter","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":true},"content":[{"type":"paragraph","content":[{"text":"Agents have proper markdown structure","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":true},"content":[{"type":"paragraph","content":[{"text":"No placeholder TODO comments in production files","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"4. 2025 Schema Compliance","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":true},"content":[{"type":"paragraph","content":[{"text":"All skills have ","type":"text"},{"text":"allowed-tools","type":"text","marks":[{"type":"code_inline"}]},{"text":" field in frontmatter","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":true},"content":[{"type":"paragraph","content":[{"text":"allowed-tools","type":"text","marks":[{"type":"code_inline"}]},{"text":" lists valid Claude Code tools","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":true},"content":[{"type":"paragraph","content":[{"text":"Frontmatter format is correct","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Outputs","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"paragraph","content":[{"text":"Success Example","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"Validating plugin: team-toolkit\n================================\n\n✓ Structure validation passed (5/5 checks)\n ✓ .claude-plugin/ directory exists\n ✓ plugin.json exists\n ✓ Component directories at root\n ✓ Directory names valid\n ✓ README.md present\n\n✓ Manifest validation passed (6/6 checks)\n ✓ Valid JSON syntax\n ✓ Required fields present\n ✓ Name format valid\n ✓ Version format valid\n ✓ Paths are relative\n ✓ Referenced files exist\n\n✓ Component validation passed (8 skills, 3 commands)\n ✓ All skills have SKILL.md\n ✓ All skills have valid frontmatter\n ✓ All skills have allowed-tools field\n ✓ All commands valid\n\n✓ 2025 schema compliance passed\n\n================\nRESULT: PASSED\n================\n0 errors, 0 warnings\n\n✓ Plugin is ready for distribution!","type":"text"}]},{"type":"paragraph","content":[{"text":"Error Example","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"Validating plugin: my-plugin\n============================\n\n✗ Structure validation failed (4/5 checks)\n ✓ .claude-plugin/ directory exists\n ✓ plugin.json exists\n ✗ Component directories at root\n ERROR: skills/ directory found in .claude-plugin/ (should be at plugin root)\n ✓ Directory names valid\n ✓ README.md present\n\n✗ Manifest validation failed (5/6 checks)\n ✓ Valid JSON syntax\n ✓ Required fields present\n ✗ Paths are relative\n ERROR: \"commands\" field has absolute path: /home/user/commands\n FIX: Change to relative path: ./commands\n ✓ Referenced files exist\n\n✗ Component validation failed (2/3 skills)\n ✓ All skills have SKILL.md\n ✗ Skills missing allowed-tools field\n ERROR: skills/my-skill/SKILL.md missing allowed-tools in frontmatter\n FIX: Add \"allowed-tools: Read, Write, Bash\" to YAML frontmatter\n\n================\nRESULT: FAILED\n================\n3 errors, 0 warnings\n\nFix errors above before distributing plugin.","type":"text"}]},{"type":"paragraph","content":[{"text":"Exit Codes","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"0","type":"text","marks":[{"type":"code_inline"}]},{"text":": All validation passed, plugin ready","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"1","type":"text","marks":[{"type":"code_inline"}]},{"text":": Errors found, plugin not ready","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"2","type":"text","marks":[{"type":"code_inline"}]},{"text":": Script execution error","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Common Errors and Fixes","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"paragraph","content":[{"text":"Error","type":"text","marks":[{"type":"strong"}]},{"text":": Component directory in ","type":"text"},{"text":".claude-plugin/","type":"text","marks":[{"type":"code_inline"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"ERROR: skills/ found in .claude-plugin/ (should be at plugin root)\nFIX: Move skills/ to plugin root directory","type":"text"}]},{"type":"paragraph","content":[{"text":"Error","type":"text","marks":[{"type":"strong"}]},{"text":": Absolute paths in manifest","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"ERROR: \"skills\" field has absolute path: /Users/me/skills\nFIX: Change to relative path: ./skills","type":"text"}]},{"type":"paragraph","content":[{"text":"Error","type":"text","marks":[{"type":"strong"}]},{"text":": Missing ","type":"text"},{"text":"allowed-tools","type":"text","marks":[{"type":"code_inline"}]},{"text":" field","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"ERROR: skill missing allowed-tools in frontmatter (2025 schema)\nFIX: Add to SKILL.md frontmatter:\n---\nname: my-skill\ndescription: ...\nallowed-tools: Read, Write, Glob, Bash\n---","type":"text"}]},{"type":"paragraph","content":[{"text":"Error","type":"text","marks":[{"type":"strong"}]},{"text":": Invalid JSON syntax","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"ERROR: plugin.json has invalid JSON (trailing comma)\nFIX: Remove trailing comma in JSON file","type":"text"}]},{"type":"paragraph","content":[{"text":"Error","type":"text","marks":[{"type":"strong"}]},{"text":": Non-kebab-case name","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"ERROR: Plugin name \"my_plugin\" should be kebab-case\nFIX: Change name to \"my-plugin\"","type":"text"}]},{"type":"paragraph","content":[{"text":"Validation Checklist","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"paragraph","content":[{"text":"Before publishing, ensure all pass:","type":"text"}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Structure validation: 0 errors","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Manifest validation: 0 errors","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Component validation: 0 errors","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"2025 compliance: All skills have allowed-tools","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"README exists and is complete","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Test installation locally","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"See Also","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/validation-rules.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/validation-rules.md","title":null}}]},{"text":" - Complete validation rules","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/plugin-json-schema.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/plugin-json-schema.md","title":null}}]},{"text":" - Schema reference","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"Operation 5: Package Skills","type":"text"}]},{"type":"paragraph","content":[{"text":"Copy existing skills into plugin structure and update manifest.","type":"text"}]},{"type":"paragraph","content":[{"text":"Purpose","type":"text","marks":[{"type":"strong"}]},{"text":": Convert standalone skills into plugin-packaged skills ready for distribution","type":"text"}]},{"type":"paragraph","content":[{"text":"When to Use","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Converting ","type":"text"},{"text":".claude/skills/","type":"text","marks":[{"type":"code_inline"}]},{"text":" to plugin format","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Packaging skill collections","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Migrating existing skills to plugins","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Creating skill-focused plugins","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Prerequisites","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Plugin structure initialized","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Skills exist in source directory","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Skills are 2025-compliant (or will be validated and flagged)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Inputs","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Source skills directory path","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Target plugin path","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Optional: Specific skills to package (default: all)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Optional: Validation mode (strict/warn)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Process","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"paragraph","content":[{"text":"Method 1: Package All Skills","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python scripts/package_skills.py /path/to/skills /path/to/plugin","type":"text"}]},{"type":"paragraph","content":[{"text":"Copies all skills from source to plugin/skills/ directory.","type":"text"}]},{"type":"paragraph","content":[{"text":"Method 2: Package Specific Skills","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python scripts/package_skills.py /path/to/skills /path/to/plugin \\\n --skills skill1,skill2,skill3","type":"text"}]},{"type":"paragraph","content":[{"text":"Method 3: Package with Validation","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python scripts/package_skills.py /path/to/skills /path/to/plugin --validate","type":"text"}]},{"type":"paragraph","content":[{"text":"Validates each skill for 2025 compliance before packaging.","type":"text"}]},{"type":"paragraph","content":[{"text":"Method 4: Dry Run (Preview)","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python scripts/package_skills.py /path/to/skills /path/to/plugin --dry-run","type":"text"}]},{"type":"paragraph","content":[{"text":"Shows what would be packaged without actually copying.","type":"text"}]},{"type":"paragraph","content":[{"text":"What Happens","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Scans Source Directory","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Finds all skill directories","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Identifies skills with SKILL.md files","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Lists skills to be packaged","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Validates Skills","type":"text","marks":[{"type":"strong"}]},{"text":" (if --validate):","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Checks SKILL.md exists","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Validates YAML frontmatter","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Checks for ","type":"text"},{"text":"allowed-tools","type":"text","marks":[{"type":"code_inline"}]},{"text":" field (2025 schema)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Reports warnings for missing fields","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Copies Skills","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Creates plugin/skills/ if doesn't exist","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Copies each skill directory","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Preserves structure (SKILL.md, references/, scripts/)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Copies all files (no modification)","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Updates Manifest","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Adds skills to plugin.json","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Updates skills array (if field exists)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Preserves existing manifest fields","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Reports Results","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Number of skills packaged","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Any warnings or issues","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Next steps","type":"text"}]}]}]}]}]},{"type":"paragraph","content":[{"text":"Outputs","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"plugin/\n├── .claude-plugin/\n│ └── plugin.json # Updated with skills reference\n├── skills/\n│ ├── skill1/\n│ │ ├── SKILL.md\n│ │ ├── references/\n│ │ └── scripts/\n│ ├── skill2/\n│ │ └── SKILL.md\n│ └── skill3/\n│ ├── SKILL.md\n│ └── references/\n└── README.md","type":"text"}]},{"type":"paragraph","content":[{"text":"Validation","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"All skills copied successfully","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Directory structure preserved","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"SKILL.md files exist in each skill","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"plugin.json updated (if applicable)","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"2025 compliance checked","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Example","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"$ python scripts/package_skills.py .claude/skills skrillz-ecosystem --validate\n\nPackaging skills into plugin: skrillz-ecosystem\n==============================================\n\nScanning .claude/skills for skills...\nFound 32 skills:\n ✓ analysis\n ✓ anthropic-expert\n ✓ auto-updater\n ... (29 more)\n\nValidating skills (2025 schema compliance)...\n ✓ analysis: Valid (allowed-tools present)\n ✓ anthropic-expert: Valid (allowed-tools present)\n ⚠ legacy-skill: WARNING - Missing allowed-tools field\n ... (checking all 32)\n\nResults: 31 valid, 1 warning\n\nPackaging skills...\n ✓ Copied analysis (245 KB, 3 files)\n ✓ Copied anthropic-expert (1.2 MB, 12 files)\n ✓ Copied auto-updater (180 KB, 5 files)\n ... (29 more)\n\n✓ 32 skills packaged successfully\n✓ Total size: 15.8 MB\n✓ Updated plugin.json\n\nWarnings:\n ⚠ legacy-skill missing allowed-tools field (2025 compliance)\n Add to SKILL.md frontmatter: allowed-tools: Read, Write, Bash\n\nNext steps:\n1. Fix warnings (add allowed-tools to legacy-skill)\n2. Review plugin/skills/ directory\n3. Update README.md with skill list\n4. Validate: python scripts/validate_plugin.py skrillz-ecosystem\n5. Test: /plugin install skrillz-ecosystem (local test)","type":"text"}]},{"type":"paragraph","content":[{"text":"Handling 2025 Compliance","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"paragraph","content":[{"text":"If skills are missing ","type":"text"},{"text":"allowed-tools","type":"text","marks":[{"type":"code_inline"}]},{"text":" field:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Manual Fix","type":"text","marks":[{"type":"strong"}]},{"text":": Add to SKILL.md frontmatter:","type":"text"}]}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"yaml"},"content":[{"text":"---\nname: my-skill\ndescription: Skill description\nallowed-tools: Read, Write, Edit, Glob, Bash\n---","type":"text"}]},{"type":"ordered_list","attrs":{"order":2,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Common Tool Sets","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Read-only analysis","type":"text","marks":[{"type":"strong"}]},{"text":": ","type":"text"},{"text":"Read, Grep, Glob","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"File editing","type":"text","marks":[{"type":"strong"}]},{"text":": ","type":"text"},{"text":"Read, Write, Edit","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Automation","type":"text","marks":[{"type":"strong"}]},{"text":": ","type":"text"},{"text":"Read, Write, Bash","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Research","type":"text","marks":[{"type":"strong"}]},{"text":": ","type":"text"},{"text":"Read, WebSearch, WebFetch","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"All tools","type":"text","marks":[{"type":"strong"}]},{"text":": ","type":"text"},{"text":"Read, Write, Edit, Glob, Grep, Bash, WebSearch, WebFetch","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"ordered_list","attrs":{"order":3,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Re-package","type":"text","marks":[{"type":"strong"}]},{"text":" after fixing:","type":"text"}]}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python scripts/package_skills.py .claude/skills plugin --validate","type":"text"}]},{"type":"paragraph","content":[{"text":"Tips","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Use ","type":"text"},{"text":"--validate","type":"text","marks":[{"type":"code_inline"}]},{"text":" to catch issues early","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Use ","type":"text"},{"text":"--dry-run","type":"text","marks":[{"type":"code_inline"}]},{"text":" to preview before packaging","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Fix 2025 compliance warnings before distribution","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Keep original skills as backup","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Test plugin installation locally before publishing","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"See Also","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/component-packaging-guide.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/component-packaging-guide.md","title":null}}]},{"text":" - Detailed packaging guide","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/validation-rules.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/validation-rules.md","title":null}}]},{"text":" - 2025 compliance rules","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Best Practices","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Plugin Development","type":"text"}]},{"type":"paragraph","content":[{"text":"1. Start with MVP","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Get basic plugin working first","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Add optional metadata later","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Test early, test often","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"2. Use Semantic Versioning","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Format: MAJOR.MINOR.PATCH (e.g., 1.2.3)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"MAJOR: Breaking changes","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"MINOR: New features, backward compatible","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"PATCH: Bug fixes","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"3. Write Good Descriptions","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Clear, concise (under 200 chars)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Explain what plugin does","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Mention key features","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Include use cases","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"4. Include Comprehensive README","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Installation instructions","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Usage examples","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"List of components","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Configuration options","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Troubleshooting","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"5. Validate Before Publishing","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python scripts/validate_plugin.py my-plugin/\n# Should show 0 errors","type":"text"}]},{"type":"paragraph","content":[{"text":"6. Test Installation Locally","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# Create local marketplace\npython scripts/generate_marketplace.py\n\n# Test installation (if possible)\n/plugin marketplace add ./my-marketplace\n/plugin install my-plugin","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Manifest Best Practices","type":"text"}]},{"type":"paragraph","content":[{"text":"1. Always Include","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"name","type":"text","marks":[{"type":"code_inline"}]},{"text":": Clear, kebab-case identifier","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"version","type":"text","marks":[{"type":"code_inline"}]},{"text":": Semantic version","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"description","type":"text","marks":[{"type":"code_inline"}]},{"text":": What it does","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"author","type":"text","marks":[{"type":"code_inline"}]},{"text":": Who maintains it","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"2. Highly Recommended","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"keywords","type":"text","marks":[{"type":"code_inline"}]},{"text":": For discoverability","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"license","type":"text","marks":[{"type":"code_inline"}]},{"text":": Legal clarity (MIT, Apache-2.0, etc.)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"repository","type":"text","marks":[{"type":"code_inline"}]},{"text":": Source code location","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"homepage","type":"text","marks":[{"type":"code_inline"}]},{"text":": Documentation URL","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"3. Path Rules","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Always use relative paths: ","type":"text"},{"text":"./skills/","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Never use absolute paths: ","type":"text"},{"text":"/Users/me/skills","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Use forward slashes (cross-platform): ","type":"text"},{"text":"./path/to/file","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"paragraph","content":[{"text":"4. Naming Conventions","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Plugin names: ","type":"text"},{"text":"kebab-case","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"No spaces, underscores, or special chars","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Descriptive and memorable","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"2025 Schema Compliance","type":"text"}]},{"type":"paragraph","content":[{"text":"1. All Skills Must Have allowed-tools","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"yaml"},"content":[{"text":"---\nname: my-skill\ndescription: What it does\nallowed-tools: Read, Write, Bash\n---","type":"text"}]},{"type":"paragraph","content":[{"text":"2. Common Tool Combinations","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Analysis: ","type":"text"},{"text":"Read, Grep, Glob","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Editing: ","type":"text"},{"text":"Read, Write, Edit","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Automation: ","type":"text"},{"text":"Read, Write, Bash","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Research: ","type":"text"},{"text":"Read, WebSearch, WebFetch","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"paragraph","content":[{"text":"3. Be Specific","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Only list tools skill actually uses","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Don't include all tools if not needed","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Helps Claude optimize execution","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Distribution Best Practices","type":"text"}]},{"type":"paragraph","content":[{"text":"1. GitHub Repository Setup","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Clear repository name","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Comprehensive README.md","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"LICENSE file","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":".gitignore for OS files","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"2. Version Management","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Tag releases: ","type":"text"},{"text":"git tag v1.0.0","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Write changelogs","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Follow semver strictly","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"3. Documentation","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Installation instructions","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Usage examples","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Component documentation","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Troubleshooting guide","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"4. Team Distribution","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Use ","type":"text"},{"text":".claude/settings.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" for team-wide:","type":"text"}]}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"extraKnownMarketplaces\": [\n {\"source\": \"github\", \"repo\": \"company/approved-plugins\"}\n ]\n}","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Common Mistakes","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Mistake 1: Component Directories in Wrong Location","type":"text"}]},{"type":"paragraph","content":[{"text":"❌ Wrong","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"my-plugin/\n└── .claude-plugin/\n ├── plugin.json\n └── skills/ # WRONG LOCATION","type":"text"}]},{"type":"paragraph","content":[{"text":"✅ Correct","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"my-plugin/\n├── .claude-plugin/\n│ └── plugin.json\n└── skills/ # AT PLUGIN ROOT","type":"text"}]},{"type":"paragraph","content":[{"text":"Why","type":"text","marks":[{"type":"strong"}]},{"text":": Claude looks for components at plugin root, not in ","type":"text"},{"text":".claude-plugin/","type":"text","marks":[{"type":"code_inline"}]}]},{"type":"paragraph","content":[{"text":"Fix","type":"text","marks":[{"type":"strong"}]},{"text":": Move component directories to plugin root","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"Mistake 2: Absolute Paths in Manifests","type":"text"}]},{"type":"paragraph","content":[{"text":"❌ Wrong","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"name\": \"my-plugin\",\n \"skills\": \"/Users/me/my-plugin/skills\"\n}","type":"text"}]},{"type":"paragraph","content":[{"text":"✅ Correct","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"name\": \"my-plugin\",\n \"skills\": \"./skills\"\n}","type":"text"}]},{"type":"paragraph","content":[{"text":"Why","type":"text","marks":[{"type":"strong"}]},{"text":": Absolute paths break on other machines","type":"text"}]},{"type":"paragraph","content":[{"text":"Fix","type":"text","marks":[{"type":"strong"}]},{"text":": Use relative paths starting with ","type":"text"},{"text":"./","type":"text","marks":[{"type":"code_inline"}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"Mistake 3: Non-Kebab-Case Names","type":"text"}]},{"type":"paragraph","content":[{"text":"❌ Wrong","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"name\": \"My_Plugin\" // Underscores and capitals\n}","type":"text"}]},{"type":"paragraph","content":[{"text":"✅ Correct","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"name\": \"my-plugin\" // Kebab-case\n}","type":"text"}]},{"type":"paragraph","content":[{"text":"Why","type":"text","marks":[{"type":"strong"}]},{"text":": Naming convention expected by Claude Code","type":"text"}]},{"type":"paragraph","content":[{"text":"Fix","type":"text","marks":[{"type":"strong"}]},{"text":": Use lowercase with hyphens","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"Mistake 4: Missing allowed-tools (2025 Schema)","type":"text"}]},{"type":"paragraph","content":[{"text":"❌ Wrong","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"yaml"},"content":[{"text":"---\nname: my-skill\ndescription: What it does\n---","type":"text"}]},{"type":"paragraph","content":[{"text":"✅ Correct","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"yaml"},"content":[{"text":"---\nname: my-skill\ndescription: What it does\nallowed-tools: Read, Write, Bash\n---","type":"text"}]},{"type":"paragraph","content":[{"text":"Why","type":"text","marks":[{"type":"strong"}]},{"text":": 2025 schema requires explicit tool permissions","type":"text"}]},{"type":"paragraph","content":[{"text":"Fix","type":"text","marks":[{"type":"strong"}]},{"text":": Add ","type":"text"},{"text":"allowed-tools","type":"text","marks":[{"type":"code_inline"}]},{"text":" field to all skills","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"Mistake 5: Invalid JSON Syntax","type":"text"}]},{"type":"paragraph","content":[{"text":"❌ Wrong","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"name\": \"my-plugin\",\n \"version\": \"1.0.0\", // Trailing comma\n}","type":"text"}]},{"type":"paragraph","content":[{"text":"✅ Correct","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"name\": \"my-plugin\",\n \"version\": \"1.0.0\"\n}","type":"text"}]},{"type":"paragraph","content":[{"text":"Why","type":"text","marks":[{"type":"strong"}]},{"text":": JSON doesn't allow trailing commas","type":"text"}]},{"type":"paragraph","content":[{"text":"Fix","type":"text","marks":[{"type":"strong"}]},{"text":": Remove trailing commas, validate JSON","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"Mistake 6: No README","type":"text"}]},{"type":"paragraph","content":[{"text":"❌ Wrong","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"my-plugin/\n├── .claude-plugin/plugin.json\n└── skills/","type":"text"}]},{"type":"paragraph","content":[{"text":"✅ Correct","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"my-plugin/\n├── .claude-plugin/plugin.json\n├── README.md # Installation & usage\n└── skills/","type":"text"}]},{"type":"paragraph","content":[{"text":"Why","type":"text","marks":[{"type":"strong"}]},{"text":": Users need to understand what plugin does and how to install it","type":"text"}]},{"type":"paragraph","content":[{"text":"Fix","type":"text","marks":[{"type":"strong"}]},{"text":": Create README with installation instructions","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"Mistake 7: Not Validating Before Publishing","type":"text"}]},{"type":"paragraph","content":[{"text":"❌ Wrong","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"git push origin main # Push without validation","type":"text"}]},{"type":"paragraph","content":[{"text":"✅ Correct","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python scripts/validate_plugin.py my-plugin/\n# Fix any errors\ngit push origin main","type":"text"}]},{"type":"paragraph","content":[{"text":"Why","type":"text","marks":[{"type":"strong"}]},{"text":": Catch errors before users try to install","type":"text"}]},{"type":"paragraph","content":[{"text":"Fix","type":"text","marks":[{"type":"strong"}]},{"text":": Always validate before publishing","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"Mistake 8: No Version Bumping","type":"text"}]},{"type":"paragraph","content":[{"text":"❌ Wrong","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"version\": \"1.0.0\" // Never changes\n}","type":"text"}]},{"type":"paragraph","content":[{"text":"✅ Correct","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"version\": \"1.1.0\" // Bumped for each release\n}","type":"text"}]},{"type":"paragraph","content":[{"text":"Why","type":"text","marks":[{"type":"strong"}]},{"text":": Users need to know when updates are available","type":"text"}]},{"type":"paragraph","content":[{"text":"Fix","type":"text","marks":[{"type":"strong"}]},{"text":": Bump version for each release following semver","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Quick Reference","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Essential Commands","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# Initialize new plugin\npython scripts/init_plugin.py my-plugin\n\n# Generate manifest (interactive)\npython scripts/generate_manifest.py my-plugin/\n\n# Generate marketplace\npython scripts/generate_marketplace.py\n\n# Validate plugin\npython scripts/validate_plugin.py my-plugin/\n\n# Package skills\npython scripts/package_skills.py .claude/skills my-plugin/\n\n# Package with validation\npython scripts/package_skills.py .claude/skills my-plugin/ --validate","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Plugin Structure","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"plugin-name/\n├── .claude-plugin/\n│ ├── plugin.json # Required: Metadata\n│ └── marketplace.json # Optional: Distribution\n├── skills/ # Your skills\n├── commands/ # Custom slash commands\n├── agents/ # Specialized agents\n└── README.md # Recommended: Docs","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"plugin.json Minimal","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"name\": \"my-plugin\"\n}","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"plugin.json Standard","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"name\": \"my-plugin\",\n \"version\": \"1.0.0\",\n \"description\": \"What this plugin does\",\n \"author\": {\n \"name\": \"Your Name\",\n \"email\": \"[email protected]\"\n },\n \"keywords\": [\"keyword1\", \"keyword2\"],\n \"license\": \"MIT\"\n}","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"marketplace.json","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"name\": \"my-marketplace\",\n \"description\": \"Plugin marketplace\",\n \"owner\": {\n \"name\": \"Maintainer\",\n \"email\": \"[email protected]\"\n },\n \"plugins\": [\n {\n \"name\": \"plugin-one\",\n \"description\": \"First plugin\",\n \"source\": \"./plugins/plugin-one\",\n \"category\": \"development\"\n }\n ]\n}","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"2025 Skill Frontmatter","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"yaml"},"content":[{"text":"---\nname: my-skill\ndescription: What it does. Use when [triggers].\nallowed-tools: Read, Write, Bash\n---","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Validation Checklist","type":"text"}]},{"type":"paragraph","content":[{"text":"Before publishing:","type":"text"}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Run ","type":"text"},{"text":"python scripts/validate_plugin.py my-plugin/","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"0 errors, 0 warnings","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"README.md exists and is complete","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"All skills have allowed-tools field","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Version number bumped (if updating)","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Git tag created for release","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Test installation locally","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Distribution Workflow","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Create Plugin","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python scripts/init_plugin.py my-plugin\npython scripts/generate_manifest.py my-plugin/\npython scripts/package_skills.py .claude/skills my-plugin/","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Validate","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python scripts/validate_plugin.py my-plugin/","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Create Marketplace","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python scripts/generate_marketplace.py","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Push to GitHub","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"cd my-marketplace\ngit init\ngit add .\ngit commit -m \"Initial plugin marketplace\"\ngit remote add origin [email protected]:username/my-marketplace.git\ngit push -u origin main","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Users Install","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"/plugin marketplace add username/my-marketplace\n/plugin install my-plugin@my-marketplace","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Common Tool Sets (2025)","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Read-only","type":"text","marks":[{"type":"strong"}]},{"text":": ","type":"text"},{"text":"Read, Grep, Glob","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"File editing","type":"text","marks":[{"type":"strong"}]},{"text":": ","type":"text"},{"text":"Read, Write, Edit","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Automation","type":"text","marks":[{"type":"strong"}]},{"text":": ","type":"text"},{"text":"Read, Write, Bash","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Research","type":"text","marks":[{"type":"strong"}]},{"text":": ","type":"text"},{"text":"Read, WebSearch, WebFetch","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Full access","type":"text","marks":[{"type":"strong"}]},{"text":": ","type":"text"},{"text":"Read, Write, Edit, Glob, Grep, Bash, WebSearch, WebFetch","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Script Help","type":"text"}]},{"type":"paragraph","content":[{"text":"All scripts support ","type":"text"},{"text":"--help","type":"text","marks":[{"type":"code_inline"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python scripts/init_plugin.py --help\npython scripts/generate_manifest.py --help\npython scripts/validate_plugin.py --help\npython scripts/package_skills.py --help","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Next Steps After MVP","type":"text"}]},{"type":"paragraph","content":[{"text":"This MVP includes the core operations needed to package and distribute plugins. Future enhancements could include:","type":"text"}]},{"type":"paragraph","content":[{"text":"Additional Operations","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Package commands (Operation 6)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Package agents (Operation 7)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Update existing plugin (Operation 9)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Bulk package multiple plugins (Operation 10)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Enhanced Features","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Automated GitHub repo creation","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Change log generation","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Dependency resolution","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Plugin analytics","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"For Now","type":"text","marks":[{"type":"strong"}]},{"text":": The MVP operations (1-5) are sufficient to:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Create plugins","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Package your 32 skills","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Distribute via GitHub","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Validate compliance","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Share with team or community","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"References","type":"text"}]},{"type":"paragraph","content":[{"text":"Detailed guides for advanced topics:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"plugin-json-schema.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/plugin-json-schema.md","title":null}},{"type":"strong"}]},{"text":" - Complete field reference, all options, examples","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"marketplace-json-schema.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/marketplace-json-schema.md","title":null}},{"type":"strong"}]},{"text":" - Marketplace structure, source types, plugin entries","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"validation-rules.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/validation-rules.md","title":null}},{"type":"strong"}]},{"text":" - All validation checks, error fixes, 2025 compliance","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"plugin-builder","type":"text","marks":[{"type":"strong"}]},{"text":" makes plugin creation fast, validated, and reliable. Use it to package your skills and share them with your team or the community!","type":"text"}]}]},"metadata":{"date":"2026-06-05","name":"plugin-builder","author":"@skillopedia","source":{"stars":11,"repo_name":"skrillz","origin_url":"https://github.com/adaptationio/skrillz/blob/HEAD/skills/plugin-builder/SKILL.md","repo_owner":"adaptationio","body_sha256":"c5ccc4c844098b0846b961898cea952aa2c40708823815e24e8c2c0a188bd131","cluster_key":"fb8e652cb372ad269cd8b95b39d865f04d9b68beeba979e544d981187f788759","clean_bundle":{"format":"clean-skill-bundle-v1","source":"adaptationio/skrillz/skills/plugin-builder/SKILL.md","attachments":[{"id":"adbe58aa-1e2f-5f75-bdd0-c643c79a9eb4","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/adbe58aa-1e2f-5f75-bdd0-c643c79a9eb4/attachment.md","path":"README.md","size":6249,"sha256":"c035f380d08d12db6db8851f25c78a954864b086a8c6a98f2f7659a88c83efd7","contentType":"text/markdown; charset=utf-8"},{"id":"846cdc28-d4ef-5baf-9f32-a0ae1feeb371","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/846cdc28-d4ef-5baf-9f32-a0ae1feeb371/attachment.md","path":"references/marketplace-json-schema.md","size":4059,"sha256":"3e27c111fe80a29cc34d88485100d0df4df9c8d03749b673b05daef1b77e464b","contentType":"text/markdown; charset=utf-8"},{"id":"cd738b93-7488-594d-989e-a8a96ee9bae0","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/cd738b93-7488-594d-989e-a8a96ee9bae0/attachment.md","path":"references/plugin-json-schema.md","size":3673,"sha256":"5ad0a49e1e8abc70d3936958d32e5e99a473d055684445f656c561120c29957c","contentType":"text/markdown; charset=utf-8"},{"id":"f5c15603-75a6-5e67-a9b2-f99e1bfcdfaa","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f5c15603-75a6-5e67-a9b2-f99e1bfcdfaa/attachment.md","path":"references/validation-rules.md","size":5958,"sha256":"45b488d1c18832eaa15615d3f37174653396df4b9c38dfaba14909d6801941f6","contentType":"text/markdown; charset=utf-8"},{"id":"ce50d70d-c12b-5baf-9f09-8d8b64cca0cf","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ce50d70d-c12b-5baf-9f09-8d8b64cca0cf/attachment.py","path":"scripts/generate_manifest.py","size":12126,"sha256":"cea1ffb07d537bcf1971276dde7d6650a901d73432419736cbce24ae19d29d13","contentType":"text/x-python; charset=utf-8"},{"id":"1af17468-b5c8-52fb-821a-140ffbf52332","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/1af17468-b5c8-52fb-821a-140ffbf52332/attachment.py","path":"scripts/init_plugin.py","size":8433,"sha256":"e50516ac098834c308082955897571fd4b4fc0e3a0ab34195d3bd631d9bf9b6e","contentType":"text/x-python; charset=utf-8"},{"id":"bc0a238d-b59d-55d6-a1e5-21d572dca2d6","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/bc0a238d-b59d-55d6-a1e5-21d572dca2d6/attachment.py","path":"scripts/package_skills.py","size":10921,"sha256":"df799477dfd77cc3d81151026bf465874c9ba1f8c206a7f13a871c3f34561076","contentType":"text/x-python; charset=utf-8"},{"id":"5260c5fd-4f56-5b9a-be70-7db9e53c3c7c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/5260c5fd-4f56-5b9a-be70-7db9e53c3c7c/attachment.py","path":"scripts/validate_plugin.py","size":15345,"sha256":"182611b3d1d0696174b7371f30110eab839d44ed5b1a9958dc540a8445b3ec18","contentType":"text/x-python; charset=utf-8"},{"id":"a7ff7e98-9e97-5656-baa7-ec1a5220cec5","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a7ff7e98-9e97-5656-baa7-ec1a5220cec5/attachment.md","path":"templates/README.md","size":1334,"sha256":"c8091e7a821da7a7d46be3ff9f780af99844f48f64d58f5835d33ac77b3aa969","contentType":"text/markdown; charset=utf-8"},{"id":"efd7ccd6-203e-54a1-80f1-87e9d9e41eb0","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/efd7ccd6-203e-54a1-80f1-87e9d9e41eb0/attachment.minimal","path":"templates/marketplace.json.minimal","size":416,"sha256":"3645f79825f7af11d4e02c2b5a41498b5ad3c611c6e4ec5e3783634a4cdaaffa","contentType":"text/plain; charset=utf-8"},{"id":"160ce505-3742-529b-a8e0-6a8caaa74a27","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/160ce505-3742-529b-a8e0-6a8caaa74a27/attachment.multi","path":"templates/marketplace.json.multi","size":1083,"sha256":"44ee95679b0f4c9fd57dbfc6c8a68f9a23fa7ed2290e4ea128b8008ded636270","contentType":"text/plain; charset=utf-8"},{"id":"0bc79304-b421-56c9-8386-75be971dae95","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/0bc79304-b421-56c9-8386-75be971dae95/attachment.complete","path":"templates/plugin.json.complete","size":501,"sha256":"350a112a7669821ffe44d3693913f8cfc24d404fc84c1001273781a69ff7b72b","contentType":"text/plain; charset=utf-8"},{"id":"f61499b4-0549-5f23-97d9-cd9b09b22b46","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f61499b4-0549-5f23-97d9-cd9b09b22b46/attachment.minimal","path":"templates/plugin.json.minimal","size":32,"sha256":"bb827b300b18d9ed588fcde546f6e598c4242c0ec6609fb178ec92d82088cf00","contentType":"text/plain; charset=utf-8"},{"id":"9c12971d-710b-50b2-b6cf-5baa20c64b08","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/9c12971d-710b-50b2-b6cf-5baa20c64b08/attachment.standard","path":"templates/plugin.json.standard","size":247,"sha256":"66a145d09624310ae92fb6cbfc789a4f2a66879f1bf631ba7219b9023d70fafb","contentType":"text/plain; charset=utf-8"}],"bundle_sha256":"3e77c374e585bb2a8030eec3c3089f9438f6e6eabd1161bb688c5f03e724b392","attachment_count":14,"text_attachments":9,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":5,"excluded_attachments":[]},"cluster_size":2,"skill_md_path":"skills/plugin-builder/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"web-development","category_label":"Web"},"exact_dupes_collapsed_into_this":1},"version":"v1","category":"web-development","import_tag":"clean-skills-v1","description":"Automate Claude Code plugin creation, packaging, validation, and distribution. Use when creating plugins, packaging skills, generating manifests, validating plugin structure, setting up marketplaces, or distributing skill collections.","allowed-tools":"Read, Write, Edit, Glob, Bash"}},"renderedAt":1782979221074}

Plugin Builder Overview plugin-builder automates the entire Claude Code plugin creation and distribution process. It generates valid plugin structures, manifests, validates compliance, packages existing skills, and prepares plugins for marketplace distribution. Purpose : Transform skills into distributable plugins in minutes instead of hours Key Capabilities : - Initialize plugin directory structure - Generate valid plugin.json and marketplace.json manifests - Validate plugin structure and 2025 schema compliance - Package existing skills into plugin format - Automate repetitive plugin tasks P…