This guide is for AI coding agents working in the OpenClaude repository. Read it before changing code, and also follow CONTRIBUTING.md for contributor policy, PR expectations, review follow-up, and project scope.
OpenClaude is a coding-agent CLI for cloud and local model providers. It supports OpenAI-compatible APIs, Anthropic, Gemini, DeepSeek, Ollama, MCP, local backends, slash commands, tools, agents, and a React/Ink terminal UI.
The installed CLI runs on Node.js >=24.22.1 (Node 26 recommended/default). Bun is used for source builds, scripts, dependency management, and tests.
- Keep changes focused on one problem.
- Prefer existing patterns in the file or nearby module.
- Avoid unrelated formatting, renames, dependency changes, or broad rewrites.
- Add or update tests when behavior changes.
- Update docs when setup, commands, provider behavior, or user-facing behavior changes.
- For new features, larger refactors, dependencies, or runtime changes, follow the issue-first guidance in CONTRIBUTING.md.
- Keep PR branches mergeable using CONTRIBUTING.md § Keep Your Branch Current. Rebase for conflicts or a specific maintainer-requested upstream dependency, not routinely for every follow-up. Never overwrite remote PR-head updates with an unguarded force-push.
- Apply CONTRIBUTING.md § Validation before the initial PR and every follow-up push. Applicable lint/static/type checks and regression tests remain mandatory; reuse unaffected successful results and select tests for the changed behavior instead of automatically repeating the full suite. Own CI and automated-review follow-up until the PR is ready for maintainer review.
- TypeScript with strict mode and ESM imports.
- React + Ink for terminal UI.
- Bun lockfile and Bun scripts for development workflows.
- Node runtime for the built CLI.
Common libraries and patterns:
chalkfor terminal color.commanderfor CLI argument parsing.execafor child processes.- Existing service, provider, settings, permission, and UI patterns over new abstractions.
src/commands/- slash and CLI command implementations.src/components/- React/Ink UI components.src/services/- API, MCP, OAuth, wiki, voice, and other service integrations.src/tools/- tool implementations.src/utils/- shared utilities.src/integrations/- provider and model integration metadata.src/entrypoints/- CLI, MCP, SDK, and generated public types.src/tasks/- local, remote, workflow, and monitor task handling.docs/integrations/- provider integration guidance.web/- documentation website.
The authoritative local validation contract and surface-selection table live in CONTRIBUTING.md § Validation. Apply them to the full initial diff and to each follow-up since the last validated revision. A focused test does not replace applicable lint, static or type checks. Use the full suite for broad changes; reuse earlier results only while their inputs remain unaffected. CI checks the complete PR and remains authoritative for clean-runner and supported-Node-matrix coverage.
Core checks for root code/test changes, after installing locked dependencies:
bun run check:static
bun run typecheck:fast
bun run typecheck:type-tests
node bin/openclaude --versioncheck:static includes ESLint, the any-usage budget, smoke build and deadcode checks, and runs in CI. For broad changes, use bun run check instead of check:static to also run the full unit suite. Follow the contributor guide for the compile-cache-disabled launcher check and the intent scan; do not duplicate builds or suites already covered by these commands. Prose-only updates do not require unrelated application checks.
bun run typecheck:fast runs Bun's builtin type checker locally and is the CI typecheck; use the wrapper because the repository's check script shadows bun check. bun run typecheck:type-tests also runs in CI for focused TypeScript assertions. bun run typecheck (tsc) is available as an additional local check. Keep the typescript devDependency for ESLint, @astrojs/check, and the focused type tests.
Focused checks:
bun run test ./path/to/test-file.test.ts
bun run test:provider
bun run test:provider-recommendationWeb checks, when changes can affect the site:
bun run web:typecheck
bun run web:buildWebsite release notes live on GitHub Releases; do not add a manually maintained release-notes data source to the static site.
Diagnostics and PR hygiene:
bun run doctor:runtimeFor PR intent scanning, use the canonical upstream fetch and explicit-ref invocation in CONTRIBUTING.md § Validation; the scanner's default origin/main base is not portable to fork checkouts.
When modifying provider behavior:
- Start with
docs/integrations/overview.md. - Use the relevant how-to guide under
docs/integrations/how-to/. - Check existing provider implementations before adding a new pattern.
- Test the exact provider/model path you changed when possible.
- Avoid breaking third-party providers while fixing first-party behavior.
- Do not change the Node runtime or Bun development workflow without prior maintainer agreement.
- Do not add new Python code, Python provider paths, or Python dependencies without explicit maintainer approval.
- Do not introduce dependencies without clear project benefit.
- Do not skip tests for behavior changes.
- Do not silently change provider tags; maintainers control them during review.
- Do not ignore CodeRabbit or maintainer feedback; address it before requesting more review. Before applying an automated review suggestion, verify it does not pull the PR away from its stated scope or intent — decline out-of-scope suggestions with justification, or ask a maintainer when unsure. Continue follow-up until CodeRabbit approves the current revision or a maintainer explicitly accepts a documented exception. Never silently ignore findings or expand scope just to satisfy an automated reviewer.
- Do not push commits with failing, incomplete, or unrun applicable local checks unless an exception in CONTRIBUTING.md § Validation applies. Verify pre-existing failures against the current PR base and document the evidence in the PR; PR-owned failures must still be fixed before requesting maintainer review. Once CI and automated review are satisfied, wait for maintainer review without routine rebases or unrelated reruns; respond to new requests unless a maintainer explicitly takes over.
- Do not submit a PR whose description still contains template placeholder text; fill in every section of the PR template for the actual change.
- Do not surface-patch recurring review findings; repeated fix requests usually indicate a core design issue — investigate and fix the root cause instead of the reported symptom.
- Do not add a manually maintained release-notes data source to the static site; link to GitHub Releases instead.