2026-06-09 19:05:50 +02:00
|
|
|
# Versioning & Stability Policy
|
|
|
|
|
|
|
|
|
|
Codeman follows [Semantic Versioning](https://semver.org/) (`MAJOR.MINOR.PATCH`),
|
|
|
|
|
managed via `@changesets/cli` (see the COM workflow in `CLAUDE.md`).
|
|
|
|
|
|
|
|
|
|
This document defines **what the version number actually promises** — i.e. which
|
|
|
|
|
surfaces are covered by SemVer and which are explicitly not. It exists because
|
|
|
|
|
"1.0" is a commitment to stability, and an undocumented public surface invites
|
|
|
|
|
incompatible client assumptions we would then be pressured to keep.
|
|
|
|
|
|
2026-06-10 01:30:43 +02:00
|
|
|
> **Status:** finalized for the 1.0 cut. The HTTP/SSE API **is** part of the stable
|
|
|
|
|
> surface — served under `/api/v1` with a uniform response envelope and
|
|
|
|
|
> conventional HTTP status codes. See [`api-reference.md`](api-reference.md).
|
2026-06-09 19:05:50 +02:00
|
|
|
|
|
|
|
|
## What SemVer covers (the public, stable surface)
|
|
|
|
|
|
|
|
|
|
A **MAJOR** bump is required to break any of these after 1.0:
|
|
|
|
|
|
|
|
|
|
1. **The CLI.** Command names, documented flags, and their behavior for
|
|
|
|
|
`codeman <command>` (published to npm as `aicodeman`; invoked as `codeman`).
|
|
|
|
|
This is the package's actual public entry point (`bin`).
|
2026-06-10 01:30:43 +02:00
|
|
|
- The package is published to npm as `aicodeman` and installs **both** the
|
|
|
|
|
`aicodeman` and `codeman` commands (`bin` aliases); `codeman` is the
|
|
|
|
|
canonical command used throughout the docs. Renaming either after 1.0 is a
|
|
|
|
|
breaking change.
|
2026-06-09 19:05:50 +02:00
|
|
|
2. **The published `xterm-zerolag-input` library**, but on **its own version
|
|
|
|
|
line** — it is versioned and released independently of the Codeman app. Its
|
|
|
|
|
1.0 status is a separate decision; the Codeman app reaching 1.0 does *not*
|
|
|
|
|
imply `xterm-zerolag-input` is 1.0.
|
|
|
|
|
3. **Documented environment variables** that configure deployment:
|
|
|
|
|
`CODEMAN_PASSWORD`, `CODEMAN_USERNAME`, `CODEMAN_HOST`, `CODEMAN_PORT`,
|
|
|
|
|
`CODEMAN_INSTANCE`, `CODEMAN_ALLOWED_HOSTS`, `CODEMAN_DATA_DIR`,
|
2026-10-27 09:36:15 +01:00
|
|
|
`CODEMAN_TMUX_SOCKET`, `CODEMAN_ALLOW_UNAUTHENTICATED_NETWORK`,
|
|
|
|
|
`CODEMAN_ALLOW_UNAUTHENTICATED_TUNNEL`, and the `--host` / `--port` /
|
|
|
|
|
`--https` / `--allow-unauthenticated-network` /
|
|
|
|
|
`--allow-unauthenticated-tunnel` CLI flags. Removing or changing the meaning
|
|
|
|
|
of one of these is breaking. The two acknowledgements are listed from 1.46.0,
|
|
|
|
|
the release that split them: the network one covers the non-loopback bind
|
|
|
|
|
only, and an unauthenticated tunnel needs the tunnel one.
|
2026-06-10 01:30:43 +02:00
|
|
|
4. **The HTTP API and SSE event channel**, served under **`/api/v1`** with the
|
|
|
|
|
uniform `{success:true,data}` / `{success:false,error,errorCode}` envelope and
|
|
|
|
|
conventional HTTP status codes. Endpoint paths, the response envelope, error
|
|
|
|
|
`errorCode` values, and SSE event names are stable — see
|
|
|
|
|
[`api-reference.md`](api-reference.md). *Additive* changes (new endpoints, new
|
|
|
|
|
optional fields, new error codes, new SSE events) are non-breaking; breaking
|
|
|
|
|
changes ship under a new prefix (`/api/v2`). The unversioned `/api/...` alias
|
|
|
|
|
is kept working for the bundled UI.
|
2026-10-01 11:19:41 +02:00
|
|
|
5. **The dashboard's `#session=<id>` link.** Opening the dashboard URL with a
|
|
|
|
|
`#session=<id>` fragment selects that session if this client can see it. The
|
|
|
|
|
fragment name and that meaning are stable; see
|
|
|
|
|
[Opening a session from your own page](extending-codeman.md#opening-a-session-from-your-own-page).
|
2026-06-09 19:05:50 +02:00
|
|
|
|
|
|
|
|
## What SemVer does NOT cover (internal surfaces — may change in any release)
|
|
|
|
|
|
|
|
|
|
These may change in a **MINOR** (or even PATCH) release without a MAJOR bump:
|
|
|
|
|
|
2026-06-10 01:30:43 +02:00
|
|
|
1. **The `~/.codeman/` state file formats** (`state.json`, `settings.json`,
|
2026-06-09 19:05:50 +02:00
|
|
|
`mux-sessions.json`, etc.). We make a **best-effort** to migrate existing data
|
|
|
|
|
forward (and have done so across renames), but the on-disk schema is not a
|
|
|
|
|
stable contract — do not write tooling that depends on its exact shape.
|
2026-06-10 01:30:43 +02:00
|
|
|
2. **Internal TypeScript modules.** The npm package is CLI-only; `import`ing it
|
2026-06-09 19:05:50 +02:00
|
|
|
programmatically is not supported (there is no stable library entry point).
|
2026-06-10 01:30:43 +02:00
|
|
|
3. **Experimental / opt-in features**, regardless of the app's version:
|
2026-06-09 19:05:50 +02:00
|
|
|
Gesture Control (beta), Agent Teams
|
2026-10-09 05:57:49 +02:00
|
|
|
(`CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1`), the native-wrapper window bridge
|
|
|
|
|
(`window.CodemanHost.openWindow` / `closeWindow` / `focusWindow`), and
|
|
|
|
|
anything labeled experimental in the UI or docs. These may change or be
|
|
|
|
|
removed at any time.
|
2026-06-09 19:05:50 +02:00
|
|
|
|
2026-10-23 17:06:45 -04:00
|
|
|
### Experimental agent coordination
|
|
|
|
|
|
2026-10-24 22:54:17 -04:00
|
|
|
`codeman agent inspect`, `codeman agent stage` and `codeman agent submit`, and
|
|
|
|
|
the matching `GET /api/v1/sessions/:id/inspect`, `POST /api/v1/sessions/:id/stage`
|
|
|
|
|
and `POST /api/v1/sessions/:id/submit` routes (with their `/api` aliases, since
|
|
|
|
|
every `/api` route is also served under `/api/v1`), are labeled experimental, so
|
|
|
|
|
item 3 above applies to them: their commands, flags, endpoint paths, payloads and
|
|
|
|
|
behavior may change or be removed in a MINOR or PATCH release. They are also
|
|
|
|
|
opt-in: the routes answer `403 FORBIDDEN` with a message naming the synced
|
|
|
|
|
`agentCoordinationEnabled` setting (default OFF) until it is turned on, so
|
|
|
|
|
automation cannot come to depend on them without choosing to. Pin a compatible
|
|
|
|
|
Codeman version when automating them. Existing authentication, ownership and
|
|
|
|
|
shared response-envelope rules still apply. The session behavior underneath them
|
|
|
|
|
(input revision tracking in the session's write paths, the SubmitVerifier
|
|
|
|
|
re-press going through the shared write boundary) runs for every session and is
|
|
|
|
|
covered like any other stable behavior. Other agent commands and API routes keep
|
|
|
|
|
their existing guarantees. Promotion to stable requires an explicit documented
|
|
|
|
|
decision.
|
2026-10-23 17:06:45 -04:00
|
|
|
|
2026-11-06 22:16:38 +01:00
|
|
|
### Experimental local model routes
|
2026-11-06 17:38:12 +01:00
|
|
|
|
2026-11-06 22:16:38 +01:00
|
|
|
`GET /api/v1/local-model`, `POST /api/v1/local-model/install`, `/cancel`, `/resume`
|
|
|
|
|
and `/runtime`, and `DELETE /api/v1/local-model` (and their `/api` aliases) are
|
|
|
|
|
labeled experimental, so item 3 above applies to them: their paths, their payloads
|
|
|
|
|
(the hardware facts, the verdicts and reasons, the candidate fields, the `install`
|
|
|
|
|
object with its states, steps, error codes and actions, the 409 conflict shape and
|
|
|
|
|
every English sentence) and their behavior may change or be removed in a MINOR or
|
|
|
|
|
PATCH release. They look at the Mac the server runs on, say which local model fits,
|
|
|
|
|
and install, start, stop and remove one ([local-models.md](local-models.md)).
|
|
|
|
|
|
|
|
|
|
They are not behind a setting. Reading changes nothing; an install starts only on an
|
|
|
|
|
explicit request that carries the size the person confirmed. All of them are admin
|
|
|
|
|
only in multi-user mode. What an install leaves behind is ordinary, stable state: one
|
|
|
|
|
saved model endpoint with the id `local-ollama` and the `customModelEndpointsEnabled`
|
|
|
|
|
setting switched on, both of which the stable custom model endpoint routes read like
|
|
|
|
|
any other endpoint. On-disk state (`local-model.json`, the `local-model/` folder) is
|
|
|
|
|
internal, as for every other file in the data directory. Promotion to stable requires
|
|
|
|
|
an explicit documented decision.
|
2026-11-06 17:38:12 +01:00
|
|
|
|
2026-06-09 19:05:50 +02:00
|
|
|
## Deprecation policy
|
|
|
|
|
|
|
|
|
|
When we need to change a covered surface:
|
|
|
|
|
|
|
|
|
|
- Prefer **additive** changes (new flag/env var/command) over breaking ones.
|
|
|
|
|
- A covered surface slated for removal is **deprecated first** — it keeps working
|
|
|
|
|
for at least one MINOR release with a runtime warning and a `CHANGELOG.md` note
|
|
|
|
|
pointing to the replacement — then removed in the next MAJOR.
|
|
|
|
|
- Back-compat migration shims (e.g. the historical Claudeman→Codeman data/socket
|
|
|
|
|
migration) are kept until a MAJOR boundary, then may be dropped.
|
|
|
|
|
|
|
|
|
|
## Pre-1.0 (`0.x`) caveat
|
|
|
|
|
|
|
|
|
|
Until 1.0 ships, **any release may contain breaking changes** per SemVer's `0.x`
|
|
|
|
|
allowance. The commitments above take effect at `1.0.0`.
|
|
|
|
|
|
|
|
|
|
## See also
|
|
|
|
|
|
|
|
|
|
- `CLAUDE.md` — the COM release workflow (changesets, version bump, deploy)
|
2026-07-27 14:00:26 +02:00
|
|
|
- `.github/SECURITY.md` — security reporting and the supported-version policy
|
2026-06-09 19:05:50 +02:00
|
|
|
- `docs/security-architecture.md` — the full trust model
|