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 prakashsunil@proton.me.
| 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! 🎉