even-keel 0.2.0-rc.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -4,74 +4,39 @@ All notable changes to Even Keel are documented in this file.
4
4
 
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
- ## [Unreleased]
7
+ ## [0.2.0] - 2026-11-03
8
+
9
+ 0.2 brings two more agents (OpenCode and GitHub Copilot) and two more trackers (GitLab and Jira), an install with `npx even-keel` that updates from the page, a first-start setup wizard, and Protection and Standards to limit what sessions may do.
8
10
 
9
11
  ### Added
10
12
 
11
- - **OpenCode (preview)** as a chain agent. It signs in with ChatGPT, an API key or its free models. Each turn is one `opencode run`, and the transcript and context fill are read from OpenCode's own database. Through an OpenCode plugin of its own, the checkpoint plugin hands a full context over to a fresh session, delivers chat messages mid-turn and checks before a merge. The Huly plugin's hooks reach it too. A turn that writes nothing for 30 minutes is taken for hung. Pictures the model reads show in the chat. A model the account does not offer, including ChatGPT models outside the plan, is refused before the launch. OpenCode on GitHub Copilot is shown but cannot run sessions.
12
- - **GitHub Copilot CLI (preview)** as a chain agent, on the machine's sign-in or a token per account. Each turn is one `copilot -p`. The card shows the monthly allowance, read with the sign-in's own token. A model Copilot refuses shows its reason and a button to the session settings.
13
- - **Claude sessions through the Agent SDK.** "Execution" in Settings → Providers and models offers `Auto`, `CLI --bg` or `Agent SDK`; `Auto` runs API keys through the SDK and subscriptions on `--bg`. An SDK session outlives a restart of the service with its question still open. Chat messages and answers go straight into the running session. Limits refresh from each response. Choosing `Agent SDK` sets the CLI version to Checked.
14
- - **GitLab:** GitLab Issues as a tracker, GitLab CI, and merge requests in PR mode, on GitLab.com and self-managed servers, with the `gitlab` plugin. Uploaded pictures and files show on the task card and reach the session.
15
- - **Jira Cloud** as a tracker, with the `jira` plugin. Fix versions are its milestones and `Blocks` links set the order. Statuses go by category, also on localized sites. Pictures and attachments show on the task card. If a transition to Done is refused, the page says so.
16
- - Tracker profiles can connect a tracker's MCP server through OAuth with one button. Even Keel keeps and refreshes the access, and sessions never see it. The Jira profile can use a separate Atlassian MCP token instead.
17
- - **Task feeds.** A project's chain can take tasks from more than one tracker or account, for example a private Huly project plus the GitHub issues others file.
18
- - **GitHub issues taken into your tracker.** Labelled issues become tasks with a link back. When the task is done, the issue gets a one-line summary and is closed at the release. In PR mode, a pull request for a GitHub issue ends with `Closes owner/repo#N`; on GitLab, a merge request ends with `Closes #N`.
19
- - **Release branches.** Several Even Keel projects can share one tracker project and split its tasks by milestone; the "Add a project" wizard sets this up. A release project is carried forward into the main project's branch whenever the main chain stands. A carry conflict goes to an agent with **Resolve with the agent**, or automatically with **Resolve a conflict with the agent by itself**.
20
- - **Install with `npx even-keel`:** it installs Even Keel globally and sets it up as a service. On Windows it starts at your sign-in with a tray icon and needs no administrator. A newer version of the package is the update.
21
- - **Updating from the page:** release notes since your version and **Update**. If the new version does not come up, the old one comes back. **Revert** returns to the previous version.
22
- - A first-start setup wizard covering language, agent and account, tracker, statistics, update checks and the first project.
23
- - **Protection** (Settings → Sessions). Deny rules for destructive actions go to Claude Code, Codex, Copilot and OpenCode, for all projects or per project. A switch per tracker blocks deleting its records. The page shows the agents' own deny files and Codex rules. It also warns about missing or bypassable protection of the main branch on GitHub and Forgejo.
24
- - **Standards.** A project ties a document to the files it guards. A session gets the document when it first touches those files. Optionally, the merge waits for screenshots and answers to the document's check.
25
- - An Even Keel-wide **Prompt** for every project and agent, and **Model prompts** matched by `provider | model` patterns with `*`. Each row shows the models that match it.
26
- - The model field suggests the models the account offers, and a model is checked before the launch.
27
- - **Add a package → My skills** turns your own skills into one package, so every agent gets them. A project's `CLAUDE.md`/`AGENTS.md` and skills reach every agent. A project's Sessions settings show what a session will get.
28
- - **Keep the cache of a waiting session warm:** Even Keel pings a copy of a waiting Claude session before its prompt cache expires. The warm-cache window is now per agent: 30 minutes for Codex and Copilot.
29
- - **Handoffs by context size** can be turned off, leaving long sessions to the agent's own compaction. An auto-compact window for chain sessions can be set for all projects and per project. A task label picks a handoff or compaction for that task.
30
- - A **Prompt cache lifetime** for Codex sessions.
31
- - The `/handoff` command in the session chat, with a command menu on `/`.
32
- - A Claude session's permission dialog comes to the page as a question with "Allow" and "Deny". In unattended mode the call is refused at once.
33
- - A temporary model error ("at capacity", "overloaded") is retried after 15 minutes, doubling the wait up to four hours, and the cache is kept warm meanwhile.
34
- - A mark for work that is not committed or not merged: a chip on the task's row, a dot on the **Backlog** tab and a callout on its card. A closed task whose folder was left behind stays in the chain instead of going to the archive.
35
- - Labels can be added to or removed from a task in the tracker from Even Keel; a missing label is created.
36
- - **Replace key** for an API account and a Copilot token. The account keeps its name, roles and history.
37
- - **Extra usage** on account rows: credits and paid usage for Claude, Codex, Copilot and OpenCode Zen, plus an **on credits** chip. A chain session is stopped when paid subscription usage is detected, and the chain waits for the limit to reset.
38
- - Accounts without a known limit show the tokens they used and their last refusal. After a refusal, OpenCode's free models are tried again with growing waits.
39
- - An API key's spending cap holds the task until the date in the error, and the key is checked every five minutes; this also covers OpenCode on an Anthropic key.
40
- - Checked CLI versions for OpenCode and Copilot. **Check new CLI versions on this machine** tries each new CLI release with a short live session and reports the result in a banner.
41
- - The `/status` page: an overview of the service, limits, settings, statistics and every tracker account in use.
42
- - A **?** tab on the project page with a legend of every mark and sign, grouped by where it appears.
43
- - Codex shows the pictures it opens with `view_image` in the chat.
44
- - Commands on the page appear as code blocks with a copy button. OpenCode and Codex sign-ins show the one-time code separately with **Copy**.
45
- - The `tally:session-audit` skill reads the statistics and proposes changes to your rules.
46
- - Statistics count Codex turns and active time, and price DeepSeek V4.1 Flash. They also show the status of GitHub and Linear tasks, and follow-up tasks made on top of closed ones.
13
+ - **OpenCode and GitHub Copilot CLI (preview)** as chain agents, beside Claude Code and Codex. OpenCode signs in with ChatGPT, an API key or its free models; Copilot with the machine's sign-in or a token per account, and its card shows the monthly allowance. Handoffs, chat messages mid-turn, the merge check and the tracker plugins' hooks reach both.
14
+ - **Claude sessions through the Agent SDK:** "Execution" in Settings → Providers and models picks `Auto`, `CLI --bg` or `Agent SDK`. An SDK session survives a service restart with its question still open.
15
+ - **GitLab and Jira Cloud.** GitLab Issues, GitLab CI and merge requests in PR mode, on GitLab.com and self-managed servers; Jira with fix versions as milestones and `Blocks` links as the order. Both come with a plugin. A tracker's MCP server can be connected through OAuth with one button, and sessions never see the access.
16
+ - **Task feeds:** a project's chain can take tasks from several trackers or accounts. Labelled GitHub issues can be taken into your tracker as tasks; the issue gets a one-line summary when the task is done and reaches the session as information, not instructions.
17
+ - **Release branches:** several projects share one tracker project split by milestone, and a release project's fixes are carried into the main branch, with an agent to resolve a conflict.
18
+ - **Install with `npx even-keel`** as a service (on Windows at your sign-in with a tray icon, no administrator), and **Update** on the page with the release notes and **Revert**. If the new version does not come up, the old one comes back.
19
+ - A **first-start setup wizard**: language, agent and account, tracker, statistics, update checks and the first project.
20
+ - **Protection** (Settings → Sessions): deny rules for destructive actions for every agent, a switch per tracker that blocks deleting its records, and a warning about an unprotected main branch on GitHub and Forgejo.
21
+ - **Standards:** a document tied to the files it guards reaches a session when it first touches them; the merge can wait for screenshots and answers to its check.
22
+ - An Even Keel-wide **Prompt** and **Model prompts** matched by `provider | model` patterns. **My skills** turns your own skills into a package for every agent, and a project's `CLAUDE.md`/`AGENTS.md` and skills reach every agent.
23
+ - Sessions: a waiting Claude session's cache is kept warm; handoffs by context size can be turned off in favour of the agent's own compaction; `/handoff` in the chat; a Claude permission dialog comes to the page as a question; an overloaded model is retried with growing waits.
24
+ - Limits and accounts: extra usage and paid credits on account rows, and a chain session is stopped when paid usage is detected; an API key's spending cap holds the task until its date; **Replace key** for API accounts and Copilot tokens.
25
+ - Checked CLI versions for every agent, and **Check new CLI versions on this machine** tries each new release with a short live session.
26
+ - The `/status` page, a **?** legend tab on the project page, a mark for uncommitted or unmerged work, and task labels editable from Even Keel.
27
+ - Statistics count Codex turns and active time and follow-up tasks made on top of closed ones; the `tally:session-audit` skill proposes changes to your rules from them.
47
28
 
48
29
  ### Changed
49
30
 
50
- - The page follows one design system: settings in sections and rows with one way of inheriting values, toggles and hints in tips. The account, CI, status and stats pages are reworked, and folds animate.
51
- - Accounts appear only after you add them with **Add account**. The add dialog opens over the current page and keeps what you entered. Accounts are grouped by provider, one row each, with readable names.
52
- - The way Claude sessions run is the shared "Execution" setting instead of a button on each account card; earlier per-account choices are carried over.
53
- - The header's account chip shows the account of the current task and, on hover, up to three levels: task, project and Even Keel.
54
- - Chain rules are set per status and per label on all three levels; which milestones a project takes moved to its Tracker tab.
55
- - A project's Tracker settings use the same fields and hints as the add-project wizard. The wizard shows its steps as cards with their state and ends with a summary.
56
- - A task's row shows the current action and context as one block, with the title on the whole first line and a counter of context resets that includes compactions.
57
- - Errors above the chain stay open; warnings fold into one row. Limit banners name the account and what to change, and group together.
58
- - Messages on the page use the page's own words and say what to do, with a button where the page has one.
59
- - **Check and save** is one button wherever saving needed a check first.
60
- - Codex limits are read from ChatGPT every five minutes, not only from Codex's session files. A ChatGPT plan change no longer shows as an expired token: Codex's sign-in is renewed without a model turn.
61
- - The later handoff thresholds now count from the compaction point instead of from shares of the window, and the first threshold is capped the same way.
62
- - In the chat, Enter sends and Shift+Enter starts a new line.
63
- - A red main gives one notification per commit, naming the failed CI. Only the CIs that count, and only runs of the project's branch, hold the chain.
64
- - Projects of one remote on one machine share a red main and one CI watch, so one break gets one fix.
65
- - A branch sync after Done is retried after a network error before it turns into a warning.
66
- - **New session** on a silent turn says when it becomes available, and after five quiet minutes the turn can be interrupted with confirmation. "No new output since …" no longer shows from the first second.
67
- - Run labels show the model without the router prefix; the full name is in the tip.
68
- - CLI copies are downloaded only when needed and with your consent, with progress in banners. The CLI version banner is one foldable row.
69
- - `/usage` is no longer polled for a folder without a sign-in.
70
- - The statistics group OpenAI models by tier (Sol, Luna, Astra, Terra). The `/stats` page has a new section order, with "What changed" folded and a model choice for each side of a comparison.
71
- - Projects are identified by their id, so two projects of one key are told apart by name everywhere.
72
- - The service log records when a session hits a usage limit and when the chain continues. Tracker timeouts are logged with the call, its duration and the number of requests. The same tracker error is no longer logged every 5 seconds.
73
- - Loading shows an animated loader instead of a line of text: the page while it connects, the chat and transcript windows, a project's tasks and "What sessions get". The chat's reply box stays at the bottom while the transcript loads.
74
- - A smaller install: the npm package no longer pulls in Huly's web interface or the page's React libraries, which the service never loads. Its dependencies went from 117 MB in about 18,000 files to about 34 MB in about 1,100. Huly's client is no longer part of the package: it is installed into the data folder once you add a Huly profile, and `/status` shows the install with **Retry** if it fails.
31
+ - Chain sessions run on Claude Code 2.1.317, codex-cli 0.166.0, OpenCode 1.19.5 and Copilot CLI 1.0.105, the versions this release was checked against.
32
+ - The page follows one design system: settings in sections and rows with one way of inheriting values, reworked account, CI, status and stats pages, and loaders instead of text.
33
+ - Accounts appear only after **Add account**, grouped by provider. CLI copies are downloaded only when needed and with your consent, with progress in a banner.
34
+ - Chain rules are set per status and per label for Even Keel, a project and a task label; a project's milestones moved to its Tracker tab.
35
+ - A red main gives one notification per commit, only the CIs that count hold the chain, and projects of one remote share one red main.
36
+ - **New session** on a silent turn becomes available after five quiet minutes, with confirmation.
37
+ - Codex limits are read from ChatGPT every five minutes, and a plan change no longer shows as an expired token.
38
+ - The later handoff thresholds count from the compaction point.
39
+ - The npm package's dependencies went from 117 MB to about 34 MB; Huly's client is installed into the data folder once you add a Huly profile.
75
40
 
76
41
  ### Removed
77
42
 
@@ -79,86 +44,22 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
79
44
 
80
45
  ### Fixed
81
46
 
82
- - Claude Ultra accounts without a five-hour limit, and Team seats without an all-models week: their limits were not read from `/usage` (0.1.x).
83
- - A Claude chain session that calls a tracker's MCP tool before loading its schema, so that an estimate or a date goes as a string and is refused, is now told to load the schema and repeat the call, instead of leaving the field out.
84
- - Two processes no longer open the state database or the local statistics database at the same time.
85
- - A Huly project that no longer exists no longer breaks reading the other projects of the same profile.
86
- - A chain no longer hangs on a postponed task after its blocker closes.
87
- - A red main right after a start no longer puts the working session aside before the first poll.
88
- - OpenCode and Copilot sessions continue after a main fix without needing an e-mail address.
89
- - The chain no longer pauses with EPERM when writing a Codex session file on Windows, and no longer loses a turn that had already started.
90
- - A Codex turn on Windows no longer always looks silent.
91
- - A process that reused a session's pid is no longer taken for a live Codex, Copilot, OpenCode or Claude session.
92
- - A Codex limit is no longer lost when an interrupted command finishes after the end of the turn. A command cut off by the end of a turn shows where it started and is not marked "failed".
93
- - Codex limits no longer disappear by themselves.
94
- - Codex 0.164 recognizes an OpenAI key again. A Codex or OpenCode key without money shows as "no credit", not as a limit or an unknown reset. OpenCode on an Anthropic key now holds its spending cap.
95
- - A refused second free Codex account no longer reads as "account added".
96
- - Chat messages are no longer lost:
97
- - when sent right after a resume (the message also no longer stops the working session);
98
- - when sent on a Stop (the end-of-turn mark survives, and Codex shows the bubble);
99
- - when the turn ends while the chain waits to stop after it;
100
- - when the mailbox hook times out.
101
- - The chat can answer a Codex, OpenCode or Copilot session stopped by an API error.
102
- - Copilot sessions receive the hooks' additional context again, including the mail, context reminders and standards.
103
- - The chat shows a non-empty `AskUserQuestion` card and files sent with `SendUserFile`.
104
- - PR mode on GitLab no longer reports a false conflict right after a push.
105
- - A session's own note on its merge request is no longer taken as feedback.
106
- - GitLab under a path prefix uses the right profile for CI and merge requests.
107
- - GitLab.com reads no longer time out and flood the log.
108
- - The `gitlab` package can read issues on GitLab CE.
109
- - Jira:
110
- - Markdown converted from Jira text keeps `<…>` and no longer gains stray formatting;
111
- - creating a task on a localized site no longer makes an epic;
112
- - the `jira:task` skill works with Rovo MCP v2.
113
- - The OAuth MCP connection takes the authorization server from the resource's metadata. Its callback works on direct network access, and a failure reason reaches the log.
114
- - **Start** after a profile change retries a pull request that could not be opened. The refusal text for an unready PR mode no longer promises that the chain will go on by itself.
115
- - Release carries:
116
- - "Merges into" offers only projects of the same repository;
117
- - a failed merge without a conflict shows git's message;
118
- - a carry session no longer raises "main is red";
119
- - "push failed" clears once main is pushed;
120
- - messages no longer start with `forward:`;
121
- - no conflict notification is sent while an agent is already resolving it.
122
- - Cleanup after Done handles long paths in `git worktree remove` and no longer blames a process.
123
- - The add-project wizard:
124
- - sees folder trust given in an account folder;
125
- - checks the folder;
126
- - shows a tracker error under the right field;
127
- - can add a second project on the same tracker project;
128
- - no longer widens on long profile names.
129
- - A chain paused on an untrusted folder offers the same hint and button as the wizard.
130
- - MCP keys left blank in a project's profile come from the default profile. Package settings nobody changed follow a new default after an update. A plugin-only update no longer reinstalls the package's server.
131
- - Changing the default profile no longer moves a running project to another profile.
132
- - "Give the active milestone to tasks without one" shows the milestone at once, both in the preview and after reading the tracker.
133
- - A chain order error shows once, not twice.
134
- - The empty chain's "Open in …" button also covers task feeds.
135
- - Dragging an external blocker's card no longer jumps.
136
- - Tasks coming from the backlog no longer freeze the page.
137
- - The uncommitted-work chip no longer shows on a task whose session is working.
138
- - The queue button shows the project's name instead of its GUID. A long project name no longer covers the queue.
139
- - Narrow settings no longer break labels mid-word, and the project settings card no longer slides off screen under banners.
140
- - The account row menu opens where you clicked.
141
- - The sign-in dialog no longer highlights its steps by itself. Choosing Copilot in the add-account dialog no longer loses the dialog. The download banner is no longer too wide and no longer flickers when the download ends.
142
- - The unchecked-CLI banner no longer shows when "CLI version" is Checked.
143
- - The "Problems" block on `/tools` shows settings of disabled packages and accounts without projects.
144
- - Project colours on `/stats` are no longer grey. The stats strip on the project page shows its loading and keeps one height.
145
- - Statistics:
146
- - see the global `~/.claude` and `~/.codex` folders again without reloading their history;
147
- - no longer record false deletions of rules;
148
- - count an edit of a skill or memory through its store path as a rule change;
149
- - leave code-block lines out of handoff titles.
150
- - A changelog draft with no entries no longer shows as "the agent did not write the draft".
151
- - The service log no longer has an empty `claude daemon status` error after each start, or GitHub Actions 404s.
152
- - Hints that were outdated, wrong or shared between different fields are fixed, and Protection's fields each have their own hint.
47
+ - Claude Ultra accounts without a five-hour limit and Team seats without an all-models week get their limits read.
48
+ - The chain no longer hangs on a postponed task after its blocker closes, and no longer puts the working session aside on a red main right after a start. A deleted Huly project no longer breaks the others of its profile.
49
+ - A process that reused a Claude session's pid is no longer taken for that session, nor stopped with it.
50
+ - Codex on Windows no longer pauses the chain with EPERM when writing a session file. Codex limits are no longer lost or wiped by themselves. Codex 0.164 recognizes an OpenAI key again, and a key without money shows as "no credit".
51
+ - Chat messages are no longer lost after a resume, on a Stop or on a mailbox hook timeout. The chat can answer a Codex session stopped by an API error, and shows `AskUserQuestion` cards and files sent with `SendUserFile`.
52
+ - A Claude session that calls a tracker's MCP tool before loading its schema is told to load it and repeat the call, instead of leaving the field out.
53
+ - **Start** after a profile change retries a pull request that could not be opened.
54
+ - The add-project wizard sees folder trust given in an account folder, expands `~` and refuses a missing or relative folder, and shows a tracker error under the right field.
55
+ - Changing the default profile no longer moves a running project to another profile. A plugin-only update no longer reinstalls the package's server.
56
+ - Two processes no longer open the state or statistics database at once. Cleanup after Done handles long paths in `git worktree remove`.
57
+ - Statistics no longer count some Codex responses twice.
58
+ - Smaller page fixes: the backlog no longer freezes the page, dragging a blocker's card no longer jumps, a chain order error shows once, and long names no longer break the layout.
153
59
 
154
60
  ### Security
155
61
 
156
62
  - Tracker keys set in the `env` of an account's `settings.json` no longer reach chain sessions.
157
- - Protection rules no longer leak through:
158
- - Copilot rules use Copilot's own syntax;
159
- - Codex rules cover more spellings of the main branch refspec and of `rm` targets;
160
- - OpenCode's build agent permissions no longer override the denies.
161
- - A GitHub issue taken into the tracker reaches the session as information, not instructions; only collaborators' comments go in as they are, and the issue gets only a one-line summary in public.
162
63
 
163
64
  ## [0.1.4] - 2026-10-27
164
65
 
package/README.md CHANGED
@@ -43,6 +43,8 @@ Even Keel wins in time, not in width: the agent keeps working while you are away
43
43
  - **CI.** The next task waits for the CI's verdict on `main`, and a red `main` is fixed first. No CI — your own check commands.
44
44
  - **Pull requests (experimental).** Instead of merging, Even Keel can push a task's branch and open a pull request on GitHub or Forgejo, or a merge request on GitLab; review feedback, failed checks and conflicts go back to the task's session.
45
45
  - **Plugins and MCP servers** per project, with their keys kept behind a local gateway.
46
+ - **Protection.** Groups of deny rules for destructive actions, on by default, and a switch per tracker that refuses its MCP server's deletes for every agent.
47
+ - **Standards.** A document of the repository reaches a session the first time it touches the files it guards (`**/*.tsx`), and can hold the merge until screenshots and the document's check are done.
46
48
  - **Accounts, one per project and provider.** OpenCode signs in with ChatGPT, GitHub Copilot, an API key or runs its free models; the Copilot CLI with your sign-in or a token each. Claude sessions on an API key run through the Agent SDK and outlive a restart of the service with their questions open; a subscription can switch to it too.
47
49
  - **A session audit skill** reads the statistics and proposes what to change in your rules.
48
50
  - **The page:** the chain, each session's stage, current action and context fill, task cards, changelog drafts; in English or Russian.
@@ -63,7 +65,7 @@ Every feature in full: [docs/guide/features.md](docs/guide/features.md).
63
65
 
64
66
  ## Before you run it
65
67
 
66
- - **Even Keel depends on undocumented behaviour of the agents' CLIs**: their background sessions, transcripts, session files and the text of their commands. None of it is a public API. Chain sessions run on your CLI, and the page warns while its version is not the one Even Keel was last checked against; "CLI version → Checked" has Even Keel download that version and run sessions on it instead. Last checked against **Claude Code 2.1.316**, **codex-cli 0.166.0**, **OpenCode 1.19.5** and **Copilot CLI 1.0.105**. A CLI update may still break a part of Even Keel until it is adapted — please open an issue when it does. What exactly it relies on and the limits of the pin: [setup](docs/guide/setup.md#the-clis-it-depends-on).
68
+ - **Even Keel depends on undocumented behaviour of the agents' CLIs**: their background sessions, transcripts, session files and the text of their commands. None of it is a public API. Chain sessions run on your CLI, and the page warns while its version is not the one Even Keel was last checked against; "CLI version → Checked" has Even Keel download that version and run sessions on it instead. Last checked against **Claude Code 2.1.317**, **codex-cli 0.166.0**, **OpenCode 1.19.5** and **Copilot CLI 1.0.105**. A CLI update may still break a part of Even Keel until it is adapted — please open an issue when it does. What exactly it relies on and the limits of the pin: [setup](docs/guide/setup.md#the-clis-it-depends-on).
67
69
  - **Your subscription, the providers' terms.** Sessions run on the accounts you sign in with and wait out their limits: a project runs on one account per provider, and a spent limit is never got round by switching to another account ([docs/sessions/models.md](docs/sessions/models.md#run-profiles-btn-173-srcsessionslaunchts)). Claude sessions are governed by Anthropic's [Consumer Terms](https://www.anthropic.com/legal/consumer-terms) and [Usage Policy](https://www.anthropic.com/legal/aup) (the [Commercial Terms](https://www.anthropic.com/legal/commercial-terms) for Team, Enterprise and API keys). Anthropic asks products built on the Agent SDK to [use API key authentication](https://code.claude.com/docs/en/legal-and-compliance), so a subscription runs on the CLI's own background sessions unless you switch its card to the SDK yourself. Codex sessions are governed by OpenAI's [Terms of Use](https://openai.com/policies/terms-of-use/) and [Usage Policies](https://openai.com/policies/usage-policies/) when you sign in with ChatGPT (the [Services Agreement](https://openai.com/policies/services-agreement/) for Business, Enterprise, Edu and API keys), with the [Service Terms](https://openai.com/policies/service-terms/) on top. OpenAI's terms do not allow getting round its usage limits, so Even Keel refuses a second Codex account on the free plan. OpenCode sessions are governed by the terms of the provider you sign it in with; a Claude subscription is allowed only in Claude Code, so OpenCode reaches Claude only on an API key. Copilot sessions are governed by GitHub's [Terms of Service](https://docs.github.com/en/site-policy/github-terms/github-terms-of-service) and the [GitHub Copilot terms](https://github.com/customer-terms/github-copilot-product-specific-terms), which allow one free account per person. Even Keel does not share, pool or resell access: use accounts that are yours.
68
70
  - **Sessions run without asking you on each tool call**: Claude sessions with `--permission-mode auto`, Codex sessions with `--approve-for-me`, or with no sandbox at all when `execution.codex` is `bypass`. Set up the permissions and hooks you want in your Claude Code and Codex settings before you start a chain.
69
71
  - **Your sign-in stays with the CLIs.** Even Keel reads only the expiry dates from Claude's `.credentials.json`, and only the e-mail and the plan from Codex's `auth.json`; tokens are never copied or sent anywhere. It also removes the lock files the CLI leaves behind in the account folders. An API key you add is sent only to its own provider, to check it.
@@ -91,7 +93,7 @@ Open `http://localhost:4747`. The first start walks a short setup — the langua
91
93
 
92
94
  Want to look first? `npm run dev:fake` in a clone shows the page on fake data, with no tracker and no sessions.
93
95
 
94
- To let sessions read the task themselves, file blockers and leave comments, add the tracker's plugin on `/tools` → **Add a package** (`huly@even-keel`, `github@even-keel` or `linear@even-keel`). Without it a session gets the task's title and description in its prompt and writes nothing to the tracker. Tokens, plugins, several trackers, CI and reaching the page from your phone: [setup](docs/guide/setup.md).
96
+ To let sessions read the task themselves, file blockers and leave comments, add the tracker's plugin on `/tools` → **Add a package** (`huly@even-keel`, `github@even-keel`, `linear@even-keel`, `gitlab@even-keel` or `jira@even-keel`). Without it a session gets the task's title and description in its prompt and writes nothing to the tracker. Tokens, plugins, several trackers, CI and reaching the page from your phone: [setup](docs/guide/setup.md).
95
97
 
96
98
  To test the next version before its release: with npm, `npx even-keel@next` installs its latest release candidate when there is one. Or switch a clone to the `dev` branch and build it again (back to the release: the same with `git switch main`):
97
99
 
@@ -213,6 +213,12 @@ export class Dispatcher {
213
213
  const chain = this.chainOf(project);
214
214
  if (chain === undefined || (chain.stopAfter === true) === on)
215
215
  return;
216
+ if (on && chain.closing === undefined && !(chain.current !== null && this.deps.midTurn(chain.current.task))) {
217
+ // Nothing to wait out: stop now instead of flashing "stops after the turn" until the next step.
218
+ this.deps.log(`chain: ${chain.project} stopped after its session's turn, as asked`);
219
+ this.stop(project);
220
+ return;
221
+ }
216
222
  if (on)
217
223
  chain.stopAfter = true;
218
224
  else
@@ -42,18 +42,28 @@ export class ChangelogDrafts {
42
42
  const latest = await latestVersion(db, project, milestone);
43
43
  const [file, tags] = await Promise.all([this.deps.file(project), this.deps.tags(project)]);
44
44
  const plan = changelogPlan(file.text, milestone, tags);
45
- const view = async (version) => ({
45
+ const view = async (version, start = null) => ({
46
46
  project,
47
47
  milestone,
48
48
  file: file.path,
49
49
  released: plan.tag,
50
50
  version,
51
+ start,
51
52
  spent: await spentOn(db, project, milestone),
52
53
  });
53
- if (op.op === 'open' && latest !== null)
54
+ // Opening never pays a turn: without a version it shows what the first draft would start from.
55
+ if ((op.op === 'open' || op.op === 'draft') && latest !== null)
54
56
  return view(latest);
55
- if (op.op === 'open' || op.op === 'again')
56
- return view(await this.fresh(project, milestone, plan, file.path, tags, op.op === 'open' ? 'draft' : 'again'));
57
+ if (op.op === 'open') {
58
+ const material = materialOf(milestone, await this.deps.tasks(project, milestone));
59
+ return view(null, {
60
+ done: material.done.length,
61
+ open: material.open,
62
+ section: plan.section?.text ?? null,
63
+ });
64
+ }
65
+ if (op.op === 'draft' || op.op === 'again')
66
+ return view(await this.fresh(project, milestone, plan, file.path, tags, op.op === 'draft' ? 'draft' : 'again'));
57
67
  if (latest === null)
58
68
  throw fail('changelog.noDraft', { milestone });
59
69
  // A written version whose section has since been released is frozen: only new tasks go on, into the next patch's section.
@@ -20,7 +20,7 @@ import { SdkSessions } from './sdk/host.js';
20
20
  import { SDK_KIND } from './sdk/registry.js';
21
21
  import { fetchSdk, sdkModuleIn, sdkVersionOf } from './sdk/release.js';
22
22
  /** The version the README's "Before you run it" names; raised after the live run of each release (`docs/releases.md`). */
23
- const CHECKED = '2.1.316';
23
+ const CHECKED = '2.1.317';
24
24
  /** Even Keel's folder of SDK sessions in `state/` and of the SDK's copies in `state/cli/`. */
25
25
  const CLAUDE_SDK = 'claude-sdk';
26
26
  const SDK_TRANSPORT = 'sdk';
@@ -99,6 +99,7 @@ const COMMANDS = {
99
99
  const QUERIES = {
100
100
  ...PROFILE_QUERIES,
101
101
  'changelog/open': ({ changelog }, body) => changelog(projectOf(body), textOf(body.milestone, 'milestone'), { op: 'open' }),
102
+ 'changelog/draft': ({ changelog }, body) => changelog(projectOf(body), textOf(body.milestone, 'milestone'), { op: 'draft' }),
102
103
  'changelog/again': ({ changelog }, body) => changelog(projectOf(body), textOf(body.milestone, 'milestone'), { op: 'again' }),
103
104
  'changelog/add': ({ changelog }, body) => changelog(projectOf(body), textOf(body.milestone, 'milestone'), { op: 'add' }),
104
105
  'changelog/edit': ({ changelog }, body) => changelog(projectOf(body), textOf(body.milestone, 'milestone'), { op: 'edit', instruction: textOf(body.instruction, 'instruction') }),