Thank you for your interest in contributing to oh-my-claudecode (OMC). This guide covers everything from forking to submitting your PR.
Before you start, make sure you have:
- Node.js ≥ 20 (required; check with
node --version) - npm (comes with Node.js)
- git (for version control)
- Claude Code installed (to test in-session skills and commands)
- Basic familiarity with TypeScript, ESBuild, and git workflows
This guide assumes you're comfortable with terminal commands and git branching.
-
Fork the repository on GitHub by clicking the "Fork" button at https://github.com/Yeachan-Heo/oh-my-claudecode
-
Clone your fork:
git clone https://github.com/<your-username>/oh-my-claudecode.git cd oh-my-claudecode
-
Add the upstream remote so you can sync with the main repository:
git remote add upstream https://github.com/Yeachan-Heo/oh-my-claudecode.git
-
Verify your remotes:
git remote -v # origin https://github.com/<your-username>/oh-my-claudecode.git (fetch) # origin https://github.com/<your-username>/oh-my-claudecode.git (push) # upstream https://github.com/Yeachan-Heo/oh-my-claudecode.git (fetch) # upstream https://github.com/Yeachan-Heo/oh-my-claudecode.git (read-only)
-
Check available branches:
git branch -r # origin/HEAD -> origin/main # origin/main # upstream/dev # upstream/main
Note: The repo has two main branches:
upstream/dev— development branch (default for feature work)upstream/main— release branch (stable, production-ready)
-
Install dependencies:
npm install
-
Understand the build chain (from
package.json):npm run build # Runs: tsc && build-skill-bridge && build-mcp-server && build-bridge-entry && compose-docs && build:runtime-cli && build:team-server && build:clitsc— TypeScript compilation to JavaScriptbuild-skill-bridge.mjs— Bundles skills for plugin systembuild-mcp-server.mjs— Builds MCP server for Claude Code integrationbuild-bridge-entry.mjs— Builds the plugin entry pointcompose-docs— Assembles documentation from partialsbuild:runtime-cli.mjs— Bundles the CLI runtimebuild:team-server.mjs— Builds the team serverbuild:cli.mjs— Bundles the CLI entry point
-
Build once:
npm run build
All TypeScript and bundling steps are handled. The output goes to dist/ and bridge/.
Once built, you need to tell Claude Code to use your local checkout. Here are three flows:
All three flows below use the omc CLI. If you don't have it installed globally (via npm i -g oh-my-claude-sisyphus), create a symlink from your checkout:
# Create ~/.local/bin if it doesn't exist
mkdir -p ~/.local/bin
# Symlink omc to the checkout's bridge entry point
ln -sf "$PWD/bridge/cli.cjs" ~/.local/bin/omc
# Verify (you may need ~/.local/bin on your PATH)
omc --versionAdvantages: Single command, automatic env var handling, matches the OMC philosophy.
# From your checkout directory
omc --plugin-dir "$PWD" setup --plugin-dir-modeThen launch Claude Code normally — it will use your local checkout.
Disable the .mcp.json server conflict: The repo ships .mcp.json with an MCP server named "t" (the OMC bridge). When using --plugin-dir, the plugin also registers its own "t" server, causing a name collision. To resolve this, add to your ~/.claude/settings.json (or $CLAUDE_CONFIG_DIR/settings.json):
{
"disabledMcpjsonServers": ["t"]
}This tells Claude Code to ignore the repo's .mcp.json entry and use the plugin's version instead.
Inside Claude Code:
/autopilot "your task here"Rebuilding: After code changes:
npm run build
omc setup --plugin-dir-mode # or just re-run build and restart Claude CodeAdvantages: Uses Claude Code's native plugin system, marketplace semantics.
# Add local directory as a marketplace source
claude plugin marketplace add /path/to/oh-my-claudecode
# Install the plugin
claude plugin install oh-my-claudecode@oh-my-claudecode
# Run setup
/setupRebuilding: After code changes:
npm run build
claude plugin marketplace update oh-my-claudecode
claude plugin update oh-my-claudecode@oh-my-claudecode
/setupAdvantages: Forces local bundled skills to ~/.claude/skills/, no plugin system.
omc --plugin-dir "$PWD" setup --no-pluginThis skips the plugin system entirely and installs agents/skills to your home directory.
| Flow | Command | Plugin system? | Files location | Rebuild cost | Use when |
|---|---|---|---|---|---|
| A (recommended) | omc --plugin-dir "$PWD" setup --plugin-dir-mode |
Yes, via --plugin-dir |
Live from checkout | Low (no copy on rebuild) | Developing OMC itself |
| B | claude plugin marketplace add + install |
Yes, full marketplace | Plugin cache | Medium (marketplace update) | Testing plugin isolation |
| C | omc setup --no-plugin |
No | ~/.claude/skills/ |
Low (direct copy) | Fallback / troubleshooting |
Add these to your .bashrc / .zshrc for a smoother dev workflow:
# Your OMC dev root (change path as needed)
export OMC_DEV_ROOT="$HOME/_Git/_Claude/oh-my-claudecode"
# Run OMC from your local checkout
alias omcdev='omc --plugin-dir "$OMC_DEV_ROOT"'
# Build quickly
alias omcbuild='(cd "$OMC_DEV_ROOT" && npm run build)'
# Run tests
alias omctest='(cd "$OMC_DEV_ROOT" && npm run test:run)'
# Full watch mode (tsc + esbuild)
alias omcwatch='(cd "$OMC_DEV_ROOT" && npm run dev:full)'Then you can use:
omcbuild # Rebuild in 10–15 seconds
omcdev setup --plugin-dir-mode # Link your checkout
omcwatch # Auto-rebuild on file changes
omctest # Run test suiteIf you only edited .ts files in src/ (no agent/skill markdown changes), choose one of:
# Option A: tsc-only quick feedback (no bundle rebuild)
npm run dev
# Option B: full bundle watch — tsc + esbuild steps in watch mode (recommended)
npm run dev:fullChoose one, not both. npm run dev gives faster feedback for type-checking but does not rebuild bundles under dist/ or bridge/. npm run dev:full rebuilds everything on every change — use this when you need the full artifact up to date (e.g., testing the CLI end-to-end).
After editing markdown files in agents/, skills/, or commands/:
npm run build
omc setup --plugin-dir-modeThe setup command re-reads the markdown files and refreshes the in-session command registry.
npm run buildRuns the complete pipeline: tsc → esbuild bundles → docs composition → all bridge artifacts.
# Interactive watch mode
npm test
# Run once and exit
npm run test:run
# Generate coverage report
npm run test:coveragenpm run lintnpm run formatAll of these should pass before you submit a PR. GitHub CI will verify them.
When you're ready to sync with the latest upstream changes:
# Fetch the latest from upstream
git fetch upstream
# Rebase your branch onto dev
git rebase upstream/dev
# If conflicts: resolve them, then `git rebase --continue`
# Force-push to your fork (safe if no one else is on your branch)
git push --force-with-lease origin <your-branch>
# Re-run tests after rebase
npm run build
npm run test:run# Fetch the latest from upstream
git fetch upstream
# Rebase your branch onto main (only if your PR targets main)
git rebase upstream/main
# Force-push to your fork
git push --force-with-lease origin <your-branch>
# Re-run tests
npm run build
npm run test:runWhy --force-with-lease? It's safer than --force because it aborts if someone else pushed to your branch since the last fetch.
-
Push your branch to your fork:
git push origin <your-branch>
-
Open a PR on GitHub:
- Go to https://github.com/Yeachan-Heo/oh-my-claudecode/pulls
- Click "New pull request"
- Select your fork and branch
- Fill in the PR title and description
- Reference any related issues (e.g., "Fixes #123")
-
PR templates (if present):
- Check
.github/pull_request_template.mdfor required sections - GitHub will auto-populate the template when you open the PR
- Check
-
Release workflow (advanced):
- If your PR should trigger a release, you can invoke the
/oh-my-claudecode:releaseskill - This is typically for maintainers; ask in the PR if unsure
- If your PR should trigger a release, you can invoke the
-
What happens next:
- GitHub Actions will run tests, linting, and build checks
- Reviewers will provide feedback
- Update your PR by pushing more commits to the same branch
- Once approved, a maintainer will merge your PR
You're using claude --plugin-dir directly without the omc shim. Export it:
export OMC_PLUGIN_ROOT=/path/to/oh-my-claudecode
claude --plugin-dir /path/to/oh-my-claudecodeOr use the omc shim which sets it automatically:
omc --plugin-dir /path/to/oh-my-claudecodeAfter npm run build, you must re-run setup to refresh the in-session command registry:
omc setup --plugin-dir-modeThen restart Claude Code.
npm install
npm run buildIf that doesn't work, clear and reinstall:
rm -rf node_modules package-lock.json
npm install
npm run build# Clear caches and reinstall
npm ci
npm run test:runThe plugin cache may need a refresh:
npm run build
omc setup --plugin-dir-mode
# Restart Claude CodeRun the diagnostics tool:
omc doctor
omc doctor conflicts
omc doctor --plugin-dir /path/to/oh-my-claudecodeOr check the troubleshooting sections in:
- Main README: README.md
- Quick Start: README.md#quick-start
- Reference Docs: docs/REFERENCE.md
- Local Plugin Install: docs/LOCAL_PLUGIN_INSTALL.md
- Getting Started: docs/GETTING-STARTED.md
- GitHub Issues: https://github.com/Yeachan-Heo/oh-my-claudecode/issues
- Discord Community: https://discord.gg/PUwSMR9XNk
Happy contributing!