Contributing to Contexto
April 7, 2026 ยท View on GitHub
Thank you for considering contributing! Every contribution, big or small, makes a difference.
Quick Start
- Local setup:
pnpm installthencp .env.example .envand add one provider key - Development:
pnpm run dev - Build:
pnpm run build(matches CI)
Monorepo Structure
Contexto is a pnpm monorepo with the following packages:
| Package | Path | Description |
|---|---|---|
@ekai/contexto | packages/contexto/ | OpenClaw plugin, context engine |
@ekai/mindmap | packages/mindmap/ | AGNES hierarchical clustering + beam search |
Workflow
- Fork the repo
- Create a branch (
git checkout -b your-feature) - Make your changes
- Run
pnpm run buildto catch issues early - Push to your fork and create a PR
Commit Messages
We use Conventional Commits with package scopes. Releases are auto-detected from squash merge commit messages (PR titles), so getting the format right matters.
Format
<type>(<scope>): <description>
Scopes
Use the package name as the scope:
| Scope | Package |
|---|---|
contexto | @ekai/contexto |
mindmap | @ekai/mindmap |
Omit the scope for repo-wide changes (CI, root config, docs).
Types
Triggers a release:
| Type | Bump | Description |
|---|---|---|
feat | minor | New feature |
fix | patch | Bug fix |
perf | patch | Performance improvement |
refactor | patch | Code restructuring, no behavior change |
No release:
| Type | Description |
|---|---|
docs | Documentation only |
chore | Maintenance, dependencies |
test | Adding or updating tests |
ci | CI/CD changes |
style | Formatting, whitespace |
build | Build system changes |
Breaking changes
Append ! after the scope to signal a major version bump:
feat(contexto)!: redesign plugin config
fix(mindmap)!: change ClusterNode shape
Examples
feat(contexto): add sliding window compaction
fix(mindmap): beam search depth limiting
feat(contexto)!: remove legacy v0 config
docs: update README architecture section
chore: bump pnpm to v9
PR titles
Since we squash merge, the PR title becomes the commit message on main. Use the same format for PR titles. The CI release workflow reads these to auto-detect version bumps.
Releases
Releases are powered by semantic-release via multi-semantic-release. Maintainers trigger them manually from the GitHub Actions UI.
How to release
- Go to Actions tab on GitHub
- Select the CI workflow
- Click Run workflow
- Pick the package (
contexto,mindmap, orall) - Optionally enable dry run to preview without publishing
What happens
semantic-release will:
- Analyze commits since the last release tag for that package (by file path, not just commit scope)
- Auto-detect the bump type (
feat= minor,fix/perf/refactor= patch,!= major) - Skip if no releasable commits (
docs,chore,test,ci,style,builddon't trigger releases) - Bump the version in
package.json - Generate a
CHANGELOG.mdgrouped by type (Features, Bug Fixes, Performance, Refactoring) - Publish to npm
- Commit version bump + changelog with
[skip ci] - Create a git tag (e.g.,
@ekai/contexto@0.1.12) and GitHub Release
When to release
- Not every PR needs a release. Batch related changes and release when ready.
- Use
allwhen both packages changed together (e.g., mindmap API change that contexto depends on). - If a package has no releasable commits, it's skipped automatically.
Forcing a release
There is no manual bump override. The version is always derived from commits:
- To force a major bump: use
feat(pkg)!:or add aBREAKING CHANGE:footer - To force a release with no real changes:
git commit --allow-empty -m "fix(contexto): trigger release"
Prerequisites
NPM_TOKENmust be set in repo secrets (Settings > Secrets > Actions)- Only maintainers with write access can trigger workflow dispatch
What to Contribute
Not sure where to start? We'd love help with:
- Good first issues
- Feature requests
- Documentation improvements
- Bug reports
Getting Help
Thank you for taking the time to contribute!