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 +39 -138
- package/README.md +4 -2
- package/dist/src/chain/dispatcher.js +6 -0
- package/dist/src/changelog/drafts.js +14 -4
- package/dist/src/claude/adapter.js +1 -1
- package/dist/src/server.js +1 -0
- package/dist/web/assets/Loader-DMdHADtQ.js +31 -0
- package/dist/web/assets/{TaskCard-DNn-Qm8d.js → TaskCard-CHj7z33e.js} +1 -1
- package/dist/web/assets/TranscriptWindow-CQM5ybY4.js +4 -0
- package/dist/web/assets/feedLine-Dl8ZRAah.js +1 -0
- package/dist/web/assets/index-BJWUSCS1.css +1 -0
- package/dist/web/assets/index-rS5P6s6Q.js +25 -0
- package/dist/web/assets/{media-DfHUEnGn.js → media-WbgWSX8K.js} +1 -1
- package/dist/web/assets/{useModels-BmTGsRQz.js → useModels-Cmsw5PbQ.js} +1 -1
- package/dist/web/index.html +5 -5
- package/package.json +1 -1
- package/dist/web/assets/Loader-BoP9PE7x.js +0 -31
- package/dist/web/assets/TranscriptWindow-CFE2kEuL.js +0 -4
- package/dist/web/assets/feedLine-C_AM4QQT.js +0 -1
- package/dist/web/assets/index-BY7ediF2.js +0 -25
- package/dist/web/assets/index-Di7tEbPf.css +0 -1
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
|
-
## [
|
|
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
|
|
12
|
-
- **
|
|
13
|
-
- **
|
|
14
|
-
- **
|
|
15
|
-
- **
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
- **
|
|
19
|
-
- **
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
-
|
|
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
|
-
-
|
|
51
|
-
-
|
|
52
|
-
-
|
|
53
|
-
-
|
|
54
|
-
-
|
|
55
|
-
-
|
|
56
|
-
-
|
|
57
|
-
-
|
|
58
|
-
-
|
|
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
|
|
83
|
-
-
|
|
84
|
-
-
|
|
85
|
-
-
|
|
86
|
-
-
|
|
87
|
-
- A
|
|
88
|
-
-
|
|
89
|
-
- The
|
|
90
|
-
-
|
|
91
|
-
-
|
|
92
|
-
-
|
|
93
|
-
-
|
|
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.
|
|
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 `
|
|
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
|
-
|
|
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'
|
|
56
|
-
|
|
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.
|
|
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';
|
package/dist/src/server.js
CHANGED
|
@@ -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') }),
|