Repository navigation
Context Circuit CLI 2.5.0
Context Circuit CLI 2.5.0
A minor release. The workspace schema stays at 3, and nothing is renumbered.
Upgrade notes
A workspace on schema 2 is refused changes by a 2.5.0 CLI unless it runs the pinned CLI. Upgrade the template first, then let the pinned CLI make the split; one person on a team makes the split, commits and pushes it, and everyone else pulls before changing anything. (#179)
Every member installs CLI 2.5.0 before pulling a workspace whose archive/ was renamed to _archive/, because a 2.4.x CLI does not read _archive/. One person runs the first changing command, commits and pushes the moved records, and everyone else pulls before changing anything. (#209)
Scripts that relied on record list listing every record pass --all. (#209)
Added
scripts/release-version.sh <cli|template> prints the version a product builds and publishes as, and every release script now asks it. A public checkout prints CLI_VERSION or VERSION unchanged; a downstream builder sets a label in CC_VERSION_SUFFIX and a counter in release/variant.env and gets <base>-<label>.<counter>. (#172)
A stable version installs as context-circuit-cli, as before. A variant version, X.Y.Z-<label>.<N>, installs as <label>-context-circuit-cli, so it never shares a command with the public one; both keep their versions in the same store. Both installers take CONTEXT_CIRCUIT_BIN_DIR as their default command directory, and the launcher reads it too, so set it when installing with --bin-dir. (#176)
A workspace runs its CLI through its launcher, .context-circuit/cli, or .context-circuit/cli.ps1 in Windows PowerShell or cmd, which the 2.5.0 template carries. The launcher runs exactly the version .context-circuit/CLI_VERSION pins from the installers' version store, and refuses, naming the install step, when that version is not installed. When a missing subagent definition needs agent setup, agent dispatch names that command through the launcher in a workspace that carries one, and otherwise under the running CLI's own command name. (#177)
A CLI that is not the pinned version now hands off to it. When the pin is installed in the same version store as the running binary, the CLI prints one note on stderr and runs the pinned binary with the same arguments, setting CC_CLI_SWITCHED_FROM to the version that handed off, so the pinned CLI never hands off again. CC_CLI_VERSION=local keeps the running CLI for one command; any other value is refused and nothing is run. A source build, or a binary outside the version store, never hands off. (#179)
agent setup, and init through it, now turns Claude Code's commit and pull request attribution off for the workspace: it adds "attribution": {"commit": "", "pr": ""} to the gitignored .claude/settings.local.json only when the key is absent, keeps every other key, the file's formatting and any value a person set, and refuses a file that is not one JSON object. Cursor accepts this setting only in a person's own or a team admin's configuration, and Codex has none, so neither gets a file. (#208)
record archive is new. Without --id it moves the active member's finished records, a completed plan or an approved intent whose plans are all completed, under the _archive/ beside them; with repeatable --id it moves exactly the named records, whoever wrote them, and marks any unfinished one. IDs stay reserved, lookup by ID keeps working, inline relative links into and out of the moved records are rewritten, and any other broken link is reported. It returns commit_recommended like approval and completion. record complete returns archive_offer while the active member has finished records not archived. (#209)
Records may sit in one level of group folder under intent/ or plans/, such as plans/alex/<plan folder>/, with _archive/ above or below that group, and every command that reads records finds them there. A group is ordinary file organization and says nothing about who owns a record. Folder names starting with _ are kept for the CLI, and _archive/ is the only one it gives meaning to. check reports a reserved folder name, a folder named like a record holds records, a record file outside the folders records are read from, and a legacy archive folder awaits its rename to _archive/. (#209)
Fixed
check and record dependencies walk each plan's dependencies once, so plans that share ancestors no longer make them exponentially slow. agent dispatch --role worker with neither --plan nor --task is refused rather than launching a worker with nothing to implement, and so is --repo without --plan. init stops before writing anything when README.md is something it cannot read, such as a symlink or a directory. member language, member tone, member roles, and member band change only their own field, so the rest of the entry keeps its comments in members.yaml; clearing a tone or the roles still rewrites the entry. repo remote, workspace remote, and knowledge remote check the URL and the default branch before writing either, so a refused change writes nothing. worktree prepare skips and reports an environment entry that cannot be reused by design, such as node_modules holding an npm link, instead of failing, under --copy-mode auto or copy; required still fails on it, off reuses nothing, and any other copy failure still stops preparation. knowledge sync reports unreachable, not diverged, when origin no longer has the default branch. record create --kind intent refuses --intent, --repo, and --depends-on instead of dropping them. (#169)
record order is read-only: it writes nothing and takes no lock. repo fetch changes only Git refs in a bound checkout, so it no longer makes the ID split on a workspace still at schema 2. (#171)
Changed
check, record order, record create, and record dependencies read the records once per command rather than once per lookup, so they do less work in a workspace with many records. Their output is unchanged. (#170)
When no hand-off happens, because the pin is not installed beside the running CLI or the hand-off was skipped, a change is refused, with nothing changed, if it would move the workspace to schema 3, init included, or if the running CLI and the pin are on different release lines. There is no override: CC_CLI_VERSION=local never lifts a refusal. The refusal and the warning name the workspace's launcher when it has one, and either where the pinned CLI is installed or the installer call that installs it, from the registry cli_registry records; a token is named, never printed. Read-only commands, previews such as record delete without --confirm, and other changes on the same release line only warn, as before. (#179)
The archive folder is now _archive/. The first changing command renames an existing top-level intent/archive/ and plans/archive/ to _archive/, keeps every record in it archived and every ID reserved, and reports the move as a notice: on stderr. The schema stays at 3, so a top-level archive/ is a reserved legacy name: it reads as archived and cannot be a group, while an archive/ inside a group is an ordinary folder. (#209)
The commit_recommended note now tells the agent to ask the person whether to commit and push the listed files, or commit only, and carries what to do when that push is refused: pull with rebase, resolve only an ID file conflict by keeping both sides' entries, stop with the rebase in progress for any other conflict, even one where both sides could be kept, and never force-push. It still says nothing was staged, committed or pushed; the CLI never stages, commits, or pushes. (#209)
record list now lists the active member's own records. --member ID lists another member's, and --all every record, including records with no author. With no member selected it lists everything and says so on stderr. status opens with my_work: the active member's intents awaiting approval, approved intents without plans, plans not completed, and unarchived_finished, the count of their finished records not archived. (#209)
Every path the CLI computes for an intent or a plan now goes through one placement unit, internal/workspace/placement.go, with no change in where records go. A downstream build that wants another layout, such as new records under a folder per member, changes that one file rather than path handling across the package. (#209)
Contributors
Built at commit d321e06160c8db46f5b923bf8bf15bbe3e06ccca.
Apache-2.0; the archive carries the license. The workspace template is 0BSD.