-
-
Notifications
You must be signed in to change notification settings - Fork 0
Contributing
Keep Rune boring.
Thank you for contributing to Rune Context.
Rune aims to become a universal repository understanding layer for code LLMs.
Long-term maintainability is more important than adding features quickly.
Rune follows a simple principle:
Complexity should be pushed outward.
The core should remain:
- small
- deterministic
- dependency-free
- language-agnostic
Plugins provide language intelligence.
Agents provide code generation.
Rune provides context.
Ask:
Not:
Can we add it?
But:
Should we add it?
Prefer:
- fewer features
- simpler designs
- explicit behavior
Rune should work completely offline.
Avoid:
- accounts
- cloud services
- telemetry
- remote dependencies
Prefer:
- Markdown
- JSON
Avoid:
- binary formats
- databases
Running:
rune indextwice on the same repository should produce identical outputs.
Avoid:
- timestamps
- randomness
- machine-specific paths
Prefer:
rune updateover rebuilding everything.
Good:
rune init
rune index
rune update
rune context
rune doctorBad:
rune server
rune daemon
rune login
rune cloudRune core should only provide:
- CLI
- repository format
- graph engine
- context engine
- caching
Anything language-specific belongs in plugins.
Please avoid turning Rune into:
- an IDE
- an agent framework
- a vector database
- an MCP server
- a SaaS platform
These are intentional exclusions.
cmd/
internal/
plugins/
scripts/
tests/
.rune/
Requirements:
- Go 1.24+
Clone:
git clone https://github.com/rune-context/runeBuild:
go build -o rune ./cmd/runeRun:
./rune --versionRun:
go test ./...New features should include tests.
Prefer:
- unit tests
- deterministic tests
- isolated tests
Avoid flaky tests.
Rune values simplicity.
Before introducing a dependency, ask:
Adding dependencies should be rare.
Prefer:
Good:
func LoadGraph() errorBad:
func LoadGraphAndUpdateSessionsAndGenerateSummaries() errorGood:
LoadGraph()
UpdateFileSummary()Avoid:
Do()
Process()
Handle()Keep components independent.
Prefer:
map[string][]stringover deeply nested abstractions.
Prefer explicit errors.
Good:
if err != nil {
return err
}Avoid:
- hidden failures
- silent recovery
Optimize only after measuring.
Prefer:
- simplicity
- readability
over premature optimization.
Rune is mostly:
- file I/O
- parsing
- graph traversal
Maintainability matters more than microseconds.
Language support should be implemented separately.
Examples:
rune-python
rune-typescript
rune-go
Core should remain language-agnostic.
Small PRs are preferred.
Good:
Add graph validator
Bad:
Rewrite the entire indexing system
Large changes are difficult to review.
Examples:
add graph validator
improve file summaries
fix incremental indexing
Prefer lowercase.
Keep messages short.
AI-generated code is welcome.
However:
- humans remain responsible for review
- correctness matters more than speed
- generated code should follow project philosophy
Code quality is judged by the same standards regardless of who wrote it.
Good contributions:
- reduce complexity
- improve clarity
- increase determinism
- simplify APIs
- remove dependencies
Deleting code is often a contribution.
See:
Git succeeded because it remained small.
Rune should do the same.
Git stores history.
Rune stores understanding.
.git/ explains what changed.
.rune/ explains what the codebase means.
Rune Context — Git for repository understanding.
Git for repository understanding.
- RCP-001 — Repository Format
- RCP-002 — Plugin Protocol
- RCP-003 — Graph Format
- RCP-004 — File Summary Format
- RCP-005 — Feature Map Format
- RCP-006 — Ownership Metadata
- RCP-007 — Session Memory
- RCP-008 — Context Retrieval API
- RCP-009 — Incremental Indexing
- RCP-010 — Multi-Agent Coordination
Git stores history.
Rune stores understanding.