First off — thank you for considering a contribution to Jam! Every bug report, feature request, documentation fix, and code change makes this project better for everyone.
- Code of Conduct
- How Can I Contribute?
- Getting Started
- Development Workflow
- Pull Request Process
- Coding Standards
- Commit Messages
- Reporting Bugs
- Suggesting Features
- Security Vulnerabilities
This project and everyone participating in it is governed by our Code of Conduct. By participating, you are expected to uphold this code. Please report unacceptable behavior to [email protected].
| Type | Description |
|---|---|
| 🐛 Bug Reports | Found a bug? Open an issue with reproduction steps |
| 💡 Feature Requests | Have an idea? Open an issue to discuss it first |
| 📖 Documentation | Fix typos, improve explanations, add examples |
| 🧪 Tests | Add missing tests or improve existing ones |
| 🔧 Code | Fix bugs, implement features, refactor code |
| 🌍 Providers | Add support for new LLM providers |
| 🛠 Tools | Create new model-callable tools for jam run |
- Node.js 20+ (check with
node --version) - Ollama running locally for integration testing
- Git (obviously 😄)
# Fork the repo on GitHub, then:
git clone https://github.com/<your-username>/jam-cli.git
cd jam-cli
npm installnpm run build # Compile TypeScript
npm test # Run unit tests
npm run typecheck # Type-check without emitting
npm run lint # Lint with ESLintAll four commands should pass before you start making changes.
git checkout -b feat/my-new-feature # for features
git checkout -b fix/describe-the-bug # for bug fixes
git checkout -b docs/what-you-changed # for docs# Run from source during development
npm run dev -- ask "Does this work?"
# Run tests in watch mode
npm run test:watchnpm test # All tests must pass
npm run typecheck # No type errors
npm run lint # No lint errors
npm run test:coverage # Check coverage isn't regressedgit add .
git commit -m "feat: add support for Anthropic provider"
git push origin feat/my-new-featureHead to GitHub and open a PR against the main branch.
- Fill out the PR template — it exists for a reason
- Keep PRs focused — one feature or fix per PR
- Add tests — new features require tests; bug fixes should add a regression test
- Update documentation — if you changed behavior, update the README or relevant docs
- Ensure CI passes — all checks must be green before review
- Be responsive — address review feedback promptly
- Squash if needed — we may ask you to squash commits for a clean history
- Tests pass locally (
npm test) - Type-check passes (
npm run typecheck) - Lint passes (
npm run lint) - Documentation updated (if applicable)
- No secrets, credentials, or personal data in the diff
- Commit messages follow convention (see below)
- Strict TypeScript — no
anyunless absolutely unavoidable (with a comment explaining why) - ESM modules — use
.jsextensions in imports (TypeScript ESM requirement) - Explicit types — prefer explicit return types on exported functions
- Readonly where possible — use
readonlyfor properties that shouldn't change
We use Prettier for formatting. Run npm run format before committing or set up your editor to format on save.
npm run format # Auto-format all source filesESLint is configured with TypeScript rules. Fix any warnings before submitting.
npm run lint # Check for issues- One command per file in
src/commands/ - One tool per file in
src/tools/ - One provider per file in
src/providers/ - Tests colocated with source:
foo.ts→foo.test.ts
We follow Conventional Commits:
<type>(<optional scope>): <short description>
<optional body>
<optional footer>
| Type | When to use |
|---|---|
feat |
A new feature |
fix |
A bug fix |
docs |
Documentation only |
style |
Formatting, missing semicolons, etc. (no logic change) |
refactor |
Code change that neither fixes a bug nor adds a feature |
perf |
Performance improvement |
test |
Adding or updating tests |
chore |
Build process, CI, tooling changes |
feat(providers): add Anthropic Claude provider
fix(tools): handle symlinks in read_file tool
docs: add contributing guide
test(config): add tests for profile merging
chore: update dependencies
Use the Bug Report issue template and include:
- What you expected to happen
- What actually happened (include error messages, screenshots)
- Steps to reproduce — the more specific, the better
- Environment — OS, Node.js version, Ollama version, Jam version (
jam --version) - Configuration — relevant parts of your
.jam/config.json(redact secrets!)
Use the Feature Request issue template and include:
- Problem statement — what pain point does this solve?
- Proposed solution — how should it work?
- Alternatives considered — what else did you think about?
- Context — are you willing to implement this yourself?
💡 Tip: For large features, open an issue to discuss the approach before writing code. This saves everyone time.
Do NOT open a public issue for security vulnerabilities.
Please report them responsibly via the process described in SECURITY.md. We take security seriously and will respond promptly.
See the Adding a New Provider section in the README for the implementation pattern, then:
- Create
src/providers/yourprovider.tsimplementingProviderAdapter - Create
src/providers/yourprovider.test.tswith unit tests - Register in
src/providers/factory.ts - Update README with usage examples
- Create
src/tools/your_tool.tsimplementing theToolDefinitioninterface - Create
src/tools/your_tool.test.ts - Register in
src/tools/index.ts - Update README tool table
By contributing to Jam CLI, you agree that your contributions will be licensed under the MIT License.
Thank you for helping make Jam better! 🎉