# Contributing to Claude Forge
Thank you for your interest in contributing to Claude Forge!
## How to Contribute
1. **Fork** the repository
2. **Create a branch** for your feature or fix
```bash
git checkout -b feat/your-feature
```
3. **Make your changes** following the coding standards below
4. **Commit** with conventional commit messages
```bash
git commit -m "feat: add new agent for X"
```
5. **Push** and create a **Pull Request**
## Adding New Components
### Agents (`agents/`)
**File structure:**
```markdown
# Part of Claude Forge — github.com/sangrokjung/claude-forge
---
name: my-agent
description: One-line description of the agent's purpose
tools: ["Read", "Grep", "Glob"]
model: opus
---
You are a [role description]...
- Constraint 1
- Constraint 2
1. Step 1
2. Step 2
[Define expected output structure]
```
**Guidelines:**
- One `.md` file per agent
- Follow the `` structure with ``, ``, ``, `` sections
- Specify `model` (opus for deep analysis, sonnet for fast execution, haiku for quick tasks)
- Include the Claude Forge attribution header at the top
- Keep agent descriptions focused and specific
### Commands (`commands/`)
**Simple command (single file):**
```markdown
---
description: What this command does
argument-hint: ""
allowed-tools: ["Read", "Bash", "Glob"]
---
# /my-command
Instructions for Claude Code to follow when this command is invoked.
## Steps
1. Step 1
2. Step 2
```
**Complex command (directory with SKILL.md):**
```
commands/my-command/
├── SKILL.md # Entry point
└── references/ # Supplementary docs
└── guide.md
```
### Skills (`skills/`)
Each skill is a directory with `SKILL.md` as entry point:
```
skills/my-skill/
├── SKILL.md # Entry point
├── hooks/ # Optional event hooks
│ └── pre-check.sh
└── references/ # Supplementary docs
└── patterns.md
```
### Hooks (`hooks/`)
- Shell scripts (`.sh`) that execute on Claude Code events
- **Must complete within 5 seconds** -- keep hooks lightweight
- Add timeout in `settings.json` for potentially slow hooks
- Test on both macOS and Linux/WSL
### Rules (`rules/`)
- Markdown files loaded automatically every session
- Keep rules concise and actionable
- Use `(CRITICAL)` suffix for mandatory rules
- Rules should be self-contained and not depend on other rules
## Coding Standards
- Follow `rules/coding-style.md` conventions
- Immutability: never mutate objects
- Small files (< 800 lines), small functions (< 50 lines)
- Validate inputs at system boundaries (zod schemas)
- No hardcoded secrets
## Commit Messages
Format: `: `
Types: `feat`, `fix`, `refactor`, `docs`, `test`, `chore`, `perf`, `ci`
## Contributor Benefits
- **README recognition**: All contributors are permanently featured in the Contributors section via [contrib.rocks](https://contrib.rocks)
- **Agent author credit**: When you create a new agent, your GitHub username is credited in the agent file's frontmatter (`author` field)
- **Good First Issues**: Look for issues labeled `good first issue` for a great starting point
## Publishing to the Plugin Directory
Since v3.0.1 claude-forge is distributed as a Claude Code plugin. That adds a short
checklist whenever you cut a release or register with a marketplace.
### Version Bump Checklist (run on every release)
Every version bump touches **three fields across two files**. The CI job
`marketplace-schema` fails the build if any of them drift apart.
1. `.claude-plugin/plugin.json` → `.version`
2. `.claude-plugin/marketplace.json` → `.version`
3. `.claude-plugin/marketplace.json` → `.plugins[].version` for the `claude-forge` entry
Example (`3.0.1` → `3.0.2`):
```bash
jq '.version = "3.0.2"' .claude-plugin/plugin.json | sponge .claude-plugin/plugin.json
jq '.version = "3.0.2"
| .plugins = (.plugins | map(if .name == "claude-forge" then .version = "3.0.2" else . end))' \
.claude-plugin/marketplace.json | sponge .claude-plugin/marketplace.json
```
Also update any count fields embedded in `description` when component inventory changes
(agents, commands, skills, hooks, rules, MCP servers).
### Pre-release QA
Before tagging a release, all of the following must be green:
- [ ] `./install.sh --dry-run` succeeds with no missing paths
- [ ] GitHub Actions `validate.yml` passes all 5 jobs
(`json`, `marketplace-schema`, `frontmatter`, `installer`, `security`)
- [ ] `claude mcp list` shows 0 unexpected failures for default servers
- [ ] Local smoke: run `/plugin marketplace add sangrokjung/claude-forge` followed by
`/plugin install claude-forge` in a throwaway Claude Code session and confirm the
expected `version` lands. (This exercises the same path a first-time user takes.
See [`docs/PLUGIN-VS-INSTALL-SH.md`](docs/PLUGIN-VS-INSTALL-SH.md) for what the
plugin loader does and does not cover.)
### Release Tag & GitHub Release
After the PR is merged to `main`:
```bash
git checkout main && git pull
git tag -a v3.0.2 -m "v3.0.2: "
git push origin v3.0.2
gh release create v3.0.2 --generate-notes
```
GitHub's auto-generated notes are fine for patch releases. For major/minor releases,
attach a `MIGRATION.md` diff and a short "what's new" header.
### Submitting to the Official Directory
The public Anthropic directory lives at
[`github.com/anthropics/claude-plugins-official`](https://github.com/anthropics/claude-plugins-official),
with community entries under `external_plugins/`. To propose inclusion:
1. Open a submission at .
2. Reference this repo's `docs/MARKETPLACE-SUBMISSION.md` (the prepared submission
packet — contains the required metadata and the security review summary).
3. Once approved, users can install via either path:
- Self-hosted marketplace (two-step, available today):
`/plugin marketplace add sangrokjung/claude-forge` → `/plugin install claude-forge`
- Official directory (after approval):
`/plugin install claude-forge@claude-plugins-official`
Until approved, the self-hosted-marketplace path is the canonical one and must keep
working. Note the scope limitation documented in
[`docs/PLUGIN-VS-INSTALL-SH.md`](docs/PLUGIN-VS-INSTALL-SH.md): the plugin loader
currently wires only Commands + most Skills; Agents / Hooks / Rules / MCP / statusLine
still require `./install.sh`.
### PR Template Additions (recommended)
When opening a release PR, include:
- [ ] Version bumped in all 3 fields (plugin.json, marketplace.json root,
marketplace.json plugins[].version)
- [ ] Breaking change? → link a Migration note in `MIGRATION.md`
- [ ] New MCP server added? → documented in `docs/MCP-MIGRATION.md` with license/source
- [ ] CI `marketplace-schema` job green locally (run via `act` or push to a draft PR)
## Skills vs Commands
Claude Forge v3.0 follows a hybrid policy: `skills//SKILL.md` hosts auto-invocable knowledge and reusable workflows, while `commands/*.md` hosts explicit side-effect actions that the user times by typing `/name`. If the surface benefits from bundled `references/` or should be discovered automatically, it is a skill; if it commits, pushes, deploys, or notifies, it is a command.
See [`docs/SKILLS-VS-COMMANDS.md`](docs/SKILLS-VS-COMMANDS.md) for the full policy, gray-zone examples, frontmatter standards, and the authoring checklist.
## Questions?
Open an issue on [GitHub](https://github.com/sangrokjung/claude-forge/issues).