Repository navigation
v0.10.0
Breaking
- No prebuilt binary for Intel Macs: macOS is Apple Silicon only.
cargo install devplanestill
builds on Intel. devplane dispatch,batch,say,tailandlibraryare removed. Usedevplane change start "…" [--project X]…
(one prompt to several projects, every refusal reported before anything is created),devplane change prompt
anddevplane watch [RUN].- Work is now Change everywhere, with no alias:
devplane change …,/api/changes…, idsc-…, tablechanges.
A change's state (drafted,isolated,in flight,verified,offered,archived) is computed on every read. - Removed: pipelines (
[pipelines], roles, human steps, findings,.devplane/prompts/), change kinds, per-kind
budgets, reproduction gates ([gates.named.*] expect), batches, the prompt/skill library and its sidecars, and
change approve. A config still carrying an old key is refused by name, with a sentence saying what to do. - The budget is one
usdplusmax_turnsandmax_runtime. [workspace] includeis replaced by the repository's own.worktreeinclude(.gitignoresyntax, ignored files only).- The authority
daemonis renameddevplane; the event source ishost.~/.devplane/daemon.jsonishost.json. - Branches are named
change/<slug>. - Store schema version 9. The old store is moved aside, not migrated.
- Hooks write straight to the store; nothing auto-starts a host.
/devplane/hook,/decided,/holdand
/statuslineare gone. Re-rundevplane connect claude. Read commands fall back to the store when no host answers. devplane stopisdevplane quit(POST /api/quit), and says what it ends first.- A second
devplane serveis refused by asking the recorded port's/healthz, not by trusting a pid. A port given
with--portorDEVPLANE_PORTis bound or the start fails. - Nothing opens a pull request by itself:
change finishrecords the basis and removes nothing
(--remove-worktreeis gone). Usechange offer. change archivekeeps the branch unless--delete-branch;--discard-uncommittedis separate from--force.- API:
/api/dispatch*,/api/batch*,/api/library,/api/changes/{id}/approve,/api/changes/{id}/diffand
/api/runs/{id}/eventsare removed.POST /api/changes/preflightis added. - Exact command rules with no wildcard require the same flag set:
Bash(git status)no longer covers
git status --short. PowerShell alias canonicalisation is gone. devplane connectanddisconnectshow the diff and ask;--yeswrites without asking.GET /api/setupreportsdeclares_gatesinstead ofverified;GET /api/attentiondropsoversight.
Added
- The workbench UI: a title bar with the ⌘K command palette and New change, an activity bar with counts, sidebar
lists, preview tabs, a bottom panel (Activity, Sight; ⌘J) and a status bar. Light and dark themes. - A change opens as a document with Overview, Tasks, Review, Gates, Ledger and Agent tabs.
- Review: file tree plus unified or side-by-side diff, keys
j/k/n/p/s/a/f/v. "Checks weakened or
changed" (skip markers, deleted tests, gate or CI config edits) leads the review and is named in the certificate. devplane change review <id> [--by intent]reads a change in[review] rolesorder, each file with its role,
covering test, decisions and task.- Sessions, ledger, reports, forge and search are sortable, groupable grids.
- The New change dialog runs a live preflight, including install-cost notes (
[workspace] setup, lockfiles). - The certificate names a digest of the gate commands and says when the change altered a check.
- Every dispatched prompt tells the agent it may stop and say the specification cannot be satisfied.
devplane change start --spec <folder> --task <selector>: send chosen task lines (a requirement token, or
file:linewhatever the notation); a selector matching nothing refuses before anything is created.- A change naming a specification reports ticked and verified counts separately.
devplane change drift <id> --run <run> --tell|--acceptwhen the specification moved under a run.[spec] tokensdeclares requirement-id shapes;GET /api/specscarriestrace,layoutsandno_layout.- Spec Kit
[USn]and Kiro nested_Requirements:citations are read; OpenSpec's legacyproject.mdmarker is
detected; timestamped Spec Kit folders are accepted. devplane change adopt <branch>,change archive,change offer(pushes and opens a PR only with
[github] pull_request = true, otherwise prints the commands),change promptandchange stop.devplane report file|ls|show|start|reject|defer|fixed|open: file a finding about another project; it reaches that
project's person, and a GitHub draft is sent only byreport open.[reports] deliver_fromopts a live run in.devplane app(cargo featureapp): the same host in a window, with notifications, a tray badge, a global
shortcut ([app] shortcut),devplane://deep links and open-in-editor/terminal.devplane connect codex, through~/.codex/hooks.json; Codex runs the hooks only after you approve them in it.- Copilot's hooks are all
commandhooks and decide without a host. [workspace] share = ["cargo"]shares oneCARGO_TARGET_DIRbetween a project's isolated changes.- The inbox is six bands, and
devplane inboxprints how many items are snoozed. devplane doctoropens with ahostsection and dates each vendor row.- One host per home, held by
~/.devplane/host.lock. connect --statuslineand--yesare accepted after the vendor name.- The event stream sends a
resyncevent.
Changed
- Verified means the latest
checkgate passed against the working tree as it is now, digested (untracked files
included) before and after the run, so uncommitted work can be verified. Named gates never verify. - A stale pass reads gates passed, stale with both tree digests wherever a change is shown.
- Gates, pull-request settings and budgets are read from your own checkout, never from the agent's branch.
events.sourcenames which vendor's shim wrote a hook row (hook,copilot_hook,codex_hook).- A host killed mid-run is recovered by the next one; its runs read as ended by the host.
Fixed
- Verified was unreachable without a commit, and a passing named gate after a failing
checkread as verified. - Gate output byte counts and digests were wrong over 32 KB; the gate stamp was taken after the commands ran.
- Hook events became invisible after a retention pass (
events.seqis never reused); projection replay double-counted. host.jsonand the token are written atomically, the token created0600.- Upserting a project on the hook path no longer resets its trust.
- Review listed files twice and dropped lines starting
---or+++. - "Formatter-only" no longer hides Python or YAML re-indentation.
- Decisions were matched to files by substring path.
change offerrefuses a dirty or empty branch and no longer passes an invalid--repotogh pr create.- Merge checks use the configured base branch, and a merged PR counts as merged.
- A spec folder missing from the base branch is refused at start.
change drift --tellcarries the changed text.- In-place changes are gated.
- The UI's POSTs were sent without a JSON content type (HTTP 415).
- A directory reached through a symlink (macOS
/tmp) became a second project. - The host registered its own working directory as a project named
.. - Decision rows now carry their project.
- A refused call no longer reads as the session's current work.
Security
- A
devplane.tomlorpolicy.tomlthat fails to load now makes every gated call ask; before, it disabled every rule. - Holding hooks are installed with a timeout above the longest hold.
devplane answer --allowis refused inside an agent session. Limit: the host's bearer token is still readable by
the agent.- The command reader sees through functions,
coproc, brace expansion and globs in the program word, here-strings and
<into a shell,builtin, and wrapper flags. - The matcher is a quote-aware reader: flags compare as a set (
-rf=-fr=-r -f),sh -c/eval/su -care
read inside, and a line it cannot read is unresolved (a question), never silently undecided. - Exception rules apply per simple command; exact rules compare short flags as a set.
- Ask answers are compare-and-set.
- The governing project is the longest canonical registered root; a worktree's
.gitfile is honoured only when
git's back-reference verifies it. base_branchis validated as a git ref, and every user-supplied ref follows--end-of-options.- A text tool's
-e/-c(sed,grep, …) is read as a pattern, not a command line.
Install: curl -LsSf https://github.com/hupe1980/devplane/releases/download/v0.10.0/devplane-installer.sh | sh