Contributing
Thank you for your interest. The project is young, so open an issue before a large change, and we will agree on the approach first.
Set up
You need Go (any version from 1.21; it downloads the toolchain go.mod pins), git and OpenSSH. Then one command installs the rest:
scripts/setup.shIt puts pinned versions of just, golangci-lint, GoReleaser, gitleaks and Zig 0.16 into .tools/ (git-ignored), checks each download’s SHA-256 against scripts/tools.lock, then builds and tests once. The justfile puts .tools/bin first on its PATH. Or open the repo in its devcontainer, which runs the same script.
just build # host helpers, the shadow terminal, then the client, into ./bin
just test # unit tests with the race detector
just lint # go vet, golangci-lint, the name check and the private-detail check
just e2e # end-to-end tests against a real host (E2E_HOST=<a host you added>)Rules for the code
- The product name lives in one place. Use
internal/brand. Never spell the name in code, paths, environment variables or unit names.just check-namefails if you do. The name may change (docs/contributing/renaming.md). - Byte-exact while attached. Nothing may change the bytes between an agent’s PTY and the user’s terminal, except the two keys the input filter owns. A change here needs a test.
- Agents are data. Add agent knowledge to
internal/agents, not as branches in other code. - No new listening ports, relays or telemetry.
- Clean-room. Do not copy code, prompts or assets from closed-source tools. You may borrow from compatible open-source projects (MIT, Apache-2.0) with attribution in
NOTICE. - Errors say what to try next. Every user-facing error has a message and a hint.
- Docs in plain English. Short sentences, British spelling.
Commits
- One logical change per commit, with a message that says why.
- No sign-off or attribution lines: no
Signed-off-by:,Co-Authored-By:or session links (0010). By contributing you agree that your work is under the Apache-2.0 licence, as its section 5 says. - Run
just test lintbefore you push.
Releases
docs/contributing/releasing.md has the versioning policy and the steps.
Decisions
Design choices live in docs/contributing/decisions/. To change an accepted decision, write a new record that replaces it.