Thanks for contributing. This repo has strict local-only behavior and regression guardrails, so please follow this workflow.
- Prefer opening an issue before starting features, bug fixes, refactors, or behavioral changes.
- If you already have a fix ready, opening an issue and PR together is fine.
- When an issue exists, link it in the PR description using
Fixes #<issue>orRefs #<issue>. - If no issue exists, include a short rationale/scope summary in the PR description.
- GitHub Issue Forms are enabled and blank issues are disabled.
- Use
.github/ISSUE_TEMPLATE/bug_report.ymlfor bug reports. - Use
.github/ISSUE_TEMPLATE/feature_request.ymlfor feature requests. - Use template title prefixes for consistent issue titles.
- Inactive issues may be marked stale after 23 days and closed 7 days later if there are still no updates.
- Bug title format:
[bug]: <short description> - Feature title format:
[feature]: <short description> - Pull requests use
.github/pull_request_template.mdand should include tested OpenCode version details.
- Node.js must be
>=18.0.0(matchespackage.jsonengines). - Install dependencies with:
npm installnpm install runs prepare, which installs Husky hooks.
Pre-commit hooks currently run:
npx lint-staged(formats staged files via Prettier)npm run typechecknpm test
Pre-push hooks currently run:
npm ci
Run checks manually before opening a PR:
npm run typecheck
npm test
npm run buildUse npm run test:watch for local iteration.
PR and main pushes trigger .github/workflows/ci.yml (CI workflow):
- Job:
build - Matrix: Node
18.x,20.x,22.x - Steps:
npm ci,npm run typecheck,npm run build,npm test
PR CI also runs npm test in the matrix job.
Release workflow .github/workflows/publish-npm.yml runs on release/manual dispatch and includes typecheck, test, and build before publish. It is not a normal PR required check.
Recommended settings for main:
- Require a pull request before merging.
- Require branches to be up to date before merging.
- Require status checks from workflow
CIfor every Node matrix entry. - Select checks exactly as GitHub displays them in repository settings.
- Typical names look like
build (18.x),build (20.x),build (22.x)orCI / build (18.x)variants. - Block direct pushes to
mainfor non-admin users.
- Never invoke an LLM/model API to compute toast/report output. Everything must remain local and deterministic.
- Preserve slash command handled-sentinel behavior in
command.execute.before. - Do not catch
isCommandHandledError(...)and return normally. - Keep
tests/plugin.command-handled-boundary.test.tsaligned with this invariant.
Additional boundary tests to keep healthy when touching plugin/provider logic:
tests/plugin.qwen-hook.test.tstests/quota-provider-boundary.test.ts
- Prefer the smallest safe fix that addresses the root cause.
- Align behavior with current OpenCode production behavior rather than adding extra hook/output mutation layers.
- Preserve existing invariants and update/add boundary tests when behavior contracts change.
- We appreciate PRs that verify the fix against the current production released OpenCode version and note the tested version in the PR.
- Linked issue (
Fixes #...orRefs #...) when available, or included a short no-issue rationale in the PR. npm run typecheckpasses.npm testpasses.npm run buildpasses.- Verified behavior against the current production released OpenCode version, and included the tested version in the PR notes.
- Updated docs when user-facing commands/config/workflow changed (at minimum
README.md, plus this file when policy/workflow guidance changes).