How Plugins Are Structured and Managed in the PM Skills Marketplace
PM Skills Marketplace plugins are self-contained directories that follow a standardized layout comprising a JSON manifest, markdown-based skills with YAML front-matter, command definitions, and required documentation sections, all validated by automated checks before merging.
The PM Skills Marketplace is a curated collection of Claude-Code plugins designed for product management workflows. Each plugin resides in its own top-level directory within the phuryn/pm-skills repository and adheres to a machine-readable structure that enables automated validation and discovery. Understanding this architecture is essential for contributing new functionality or customizing existing plugins.
Plugin Directory Structure
Every plugin in the marketplace follows an identical layout to ensure consistency across the ecosystem.
The Manifest File
Each plugin must contain a plugin.json file located at .claude-plugin/plugin.json relative to the plugin root. This manifest declares the plugin's metadata including name, version, description, author, keywords, and license. According to the source code in validate_plugins.py, the validator checks that the plugin name matches the directory name and that the version follows semantic versioning (x.y.z) format.
Skills Directory
Skills are defined in markdown files stored under skills/<skill-name>/SKILL.md. Each file must include a YAML front-matter block specifying the name and description fields, followed by the skill logic, inputs, and output format documentation. For example, pm-toolkit/skills/review-resume/SKILL.md defines the resume review functionality with the required front-matter headers.
Commands Directory
Commands expose a command-line-style interface used by Claude, accessible via the syntax /plugin-name:command. These are defined in commands/<command-name>.md files and must include YAML front-matter with at least a description field and optionally an argument-hint field. The validator parses these files to ensure they reference valid skills within the same plugin.
README Documentation
Every plugin must include a README.md file containing specific required sections: overview, install, skill, and command. The validate_plugins.py script checks for the presence of these sections to ensure users have complete documentation before the plugin can be merged.
Marketplace Index and Discovery
All plugins are cataloged in a central marketplace manifest located at .claude-plugin/marketplace.json. Each entry contains the plugin name, description, source directory path, and category classification. This file serves as the authoritative source for the marketplace UI and command-line interfaces, enabling users to discover available plugins across the repository.
Validation and Quality Assurance
Before any plugin can be published, the repository runs validate_plugins.py to enforce structural integrity. The validator performs the following checks:
- Schema validation: Verifies that
plugin.jsoncontains all required fields including matching directory names, valid semantic versions, author fields, and keywords - Skill verification: Ensures each
SKILL.mdfile exists and contains valid YAML front-matter withnameanddescriptionfields - Command validation: Confirms command files include proper front-matter with descriptions and valid cross-references to existing skills
- Documentation completeness: Checks that README files contain the four required sections (
overview,install,skill,command)
If validation fails, the CI pipeline blocks the merge, ensuring the marketplace maintains high quality standards.
Managing the Plugin Lifecycle
Adding New Plugins
To contribute a new plugin, create a top-level directory with the plugin name, add the .claude-plugin/plugin.json manifest, populate the skills/ and commands/ directories with properly formatted markdown files, and write a compliant README. Run python validate_plugins.py locally before submitting to ensure compliance with marketplace requirements.
Updating Existing Plugins
When modifying an existing plugin, increment the version field in plugin.json following semantic versioning principles. Update descriptions or documentation as needed, then execute the validator. The repository's CI automatically synchronizes the central marketplace.json file when individual plugin versions change.
Removing Plugins
To remove a plugin, delete its directory and remove the corresponding entry from .claude-plugin/marketplace.json. The validator will flag any dangling references in other plugins that might depend on the removed functionality.
Working with Plugin Files
Loading a Plugin Manifest
import json
import pathlib
def load_manifest(plugin_name: str) -> dict:
manifest_path = pathlib.Path(plugin_name) / ".claude-plugin" / "plugin.json"
with manifest_path.open() as f:
return json.load(f)
pm_toolkit = load_manifest("pm-toolkit")
print(pm_toolkit["description"])
# → PM utility skills: resume review, NDA drafting, …
Calling Plugin Commands
Users interact with plugins through Claude using the command syntax:
/pm-toolkit:review-resume $RESUME="…your text…" $JOB_POSTING="…"
This triggers the review-resume skill defined in pm-toolkit/skills/review-resume/SKILL.md.
Listing Available Plugins
import { readFile } from 'fs/promises';
import path from 'path';
async function listPlugins() {
const data = await readFile(
path.resolve('.claude-plugin/marketplace.json'), 'utf8'
);
const { plugins } = JSON.parse(data);
return plugins.map(p => p.name);
}
listPlugins().then(console.log);
// → [ 'pm-product-discovery', 'pm-product-strategy', … ]
Summary
- PM Skills Marketplace plugins are self-contained directories under the repository root with a standardized five-component structure
- Required files include
.claude-plugin/plugin.json,skills/*/SKILL.md,commands/*.md, andREADME.mdwith specific required sections - Validation occurs through
validate_plugins.py, which checks schemas, YAML front-matter, cross-references between commands and skills, and documentation completeness - Discovery happens through
.claude-plugin/marketplace.json, which serves as the centralized catalog for the UI and CLI - Versioning follows semantic versioning (
x.y.z) and must be updated when modifying existing plugins, triggering automatic marketplace synchronization
Frequently Asked Questions
What happens if my plugin fails validation?
The validate_plugins.py script prints specific error messages indicating which checks failed. Common issues include missing required fields in plugin.json, malformed YAML front-matter in skills or commands, missing README sections, or invalid cross-references between commands and non-existent skills. The CI pipeline will block merging until all errors are resolved and the structure conforms to marketplace standards.
Can I include assets like images in my plugin?
Yes, while not required for marketplace validation, you may include optional assets such as images, examples, or tests within your plugin directory. These files help users understand and utilize your plugin but are not validated by the automated checks, allowing flexibility in documentation and demonstration materials.
How does the marketplace stay synchronized with individual plugin changes?
The repository's CI pipeline automatically updates .claude-plugin/marketplace.json when detecting version changes in individual plugin manifests. You only need to manually update the marketplace file when adding or removing entire plugins; version bumps in existing plugin.json files are handled automatically by the validation workflow.
What is the relationship between commands and skills?
Commands provide the user-facing interface accessible via /plugin:command syntax, while skills contain the actual implementation logic. Each command must reference a skill that exists within the same plugin directory, creating a binding between the CLI interface and the underlying functionality defined in the SKILL.md files. The validator enforces this relationship to ensure all commands point to valid implementations.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →