even-keel 0.0.2 → 0.2.0-rc.2

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.
Files changed (537) hide show
  1. package/.claude-plugin/marketplace.json +52 -0
  2. package/.env.example +66 -0
  3. package/CHANGELOG.md +315 -0
  4. package/LICENSE +21 -0
  5. package/README.md +199 -3
  6. package/dist/src/account/apps.js +100 -0
  7. package/dist/src/account/credit.js +117 -0
  8. package/dist/src/account/current.js +13 -0
  9. package/dist/src/account/daemon.js +65 -0
  10. package/dist/src/account/globals.js +25 -0
  11. package/dist/src/account/header-levels.js +22 -0
  12. package/dist/src/account/homes.js +332 -0
  13. package/dist/src/account/keychain.js +134 -0
  14. package/dist/src/account/keycheck.js +67 -0
  15. package/dist/src/account/ledger.js +92 -0
  16. package/dist/src/account/model.js +234 -0
  17. package/dist/src/account/network.js +51 -0
  18. package/dist/src/account/organizations.js +17 -0
  19. package/dist/src/account/service-defaults.js +17 -0
  20. package/dist/src/account/share.js +275 -0
  21. package/dist/src/account/transport.js +29 -0
  22. package/dist/src/account/vscode.js +84 -0
  23. package/dist/src/account/watcher.js +451 -0
  24. package/dist/src/agent/adapters.js +10 -0
  25. package/dist/src/agent/cli-state.js +1 -0
  26. package/dist/src/agent/contract.js +7 -0
  27. package/dist/src/agent/copies.js +38 -0
  28. package/dist/src/agent/copy.js +42 -0
  29. package/dist/src/agent/download.js +39 -0
  30. package/dist/src/agent/env.js +23 -0
  31. package/dist/src/agent/models.js +90 -0
  32. package/dist/src/agent/npm.js +55 -0
  33. package/dist/src/agent/oneturn.js +48 -0
  34. package/dist/src/agent/pinned.js +79 -0
  35. package/dist/src/agent/process.js +76 -0
  36. package/dist/src/agent/projectRules.js +54 -0
  37. package/dist/src/agent/providers.js +39 -0
  38. package/dist/src/agent/versions.js +89 -0
  39. package/dist/src/agent/windows.js +39 -0
  40. package/dist/src/ansi.js +6 -0
  41. package/dist/src/autostart.js +80 -0
  42. package/dist/src/chain/answers.js +26 -0
  43. package/dist/src/chain/archive.js +25 -0
  44. package/dist/src/chain/carry.js +97 -0
  45. package/dist/src/chain/cleanup.js +134 -0
  46. package/dist/src/chain/dispatcher.js +800 -0
  47. package/dist/src/chain/fix.js +55 -0
  48. package/dist/src/chain/forward.js +195 -0
  49. package/dist/src/chain/handover.js +350 -0
  50. package/dist/src/chain/launches.js +193 -0
  51. package/dist/src/chain/limitNotice.js +30 -0
  52. package/dist/src/chain/lists.js +174 -0
  53. package/dist/src/chain/log.js +23 -0
  54. package/dist/src/chain/maincheck.js +449 -0
  55. package/dist/src/chain/mainci.js +116 -0
  56. package/dist/src/chain/mainfix.js +180 -0
  57. package/dist/src/chain/mainwait.js +73 -0
  58. package/dist/src/chain/milestones.js +67 -0
  59. package/dist/src/chain/model.js +6 -0
  60. package/dist/src/chain/moves.js +100 -0
  61. package/dist/src/chain/order.js +266 -0
  62. package/dist/src/chain/overage.js +44 -0
  63. package/dist/src/chain/pauses.js +81 -0
  64. package/dist/src/chain/places.js +42 -0
  65. package/dist/src/chain/prompts.js +199 -0
  66. package/dist/src/chain/relay.js +153 -0
  67. package/dist/src/chain/restartGuard.js +17 -0
  68. package/dist/src/chain/reviews.js +316 -0
  69. package/dist/src/chain/rules.js +59 -0
  70. package/dist/src/chain/shelved.js +33 -0
  71. package/dist/src/chain/skippedown.js +20 -0
  72. package/dist/src/chain/snapshots.js +37 -0
  73. package/dist/src/chain/start.js +52 -0
  74. package/dist/src/chain/store.js +146 -0
  75. package/dist/src/chain/unchanged.js +71 -0
  76. package/dist/src/changelog/diff.js +118 -0
  77. package/dist/src/changelog/draft.js +59 -0
  78. package/dist/src/changelog/drafts.js +121 -0
  79. package/dist/src/changelog/file.js +146 -0
  80. package/dist/src/changelog/store.js +75 -0
  81. package/dist/src/ci/adapters.js +65 -0
  82. package/dist/src/ci/forgejo-profile.js +86 -0
  83. package/dist/src/ci/forgejo.js +62 -0
  84. package/dist/src/ci/github.js +53 -0
  85. package/dist/src/ci/gitlab.js +62 -0
  86. package/dist/src/ci/host.js +14 -0
  87. package/dist/src/ci/http.js +71 -0
  88. package/dist/src/ci/model.js +41 -0
  89. package/dist/src/ci/protection-audit.js +49 -0
  90. package/dist/src/ci/protection-model.js +1 -0
  91. package/dist/src/ci/protection.js +75 -0
  92. package/dist/src/ci/remote.js +105 -0
  93. package/dist/src/ci/report.js +114 -0
  94. package/dist/src/ci/shared.js +74 -0
  95. package/dist/src/ci/verdict.js +61 -0
  96. package/dist/src/ci/watcher.js +188 -0
  97. package/dist/src/ci/watches.js +116 -0
  98. package/dist/src/ci/wiring.js +26 -0
  99. package/dist/src/claude/adapter.js +174 -0
  100. package/dist/src/claude/calls.js +88 -0
  101. package/dist/src/claude/cli.js +451 -0
  102. package/dist/src/claude/context.js +33 -0
  103. package/dist/src/claude/instructions.js +12 -0
  104. package/dist/src/claude/leftovers.js +32 -0
  105. package/dist/src/claude/name.js +2 -0
  106. package/dist/src/claude/release.js +69 -0
  107. package/dist/src/claude/sdk/executor.js +214 -0
  108. package/dist/src/claude/sdk/host.js +422 -0
  109. package/dist/src/claude/sdk/pipe.js +134 -0
  110. package/dist/src/claude/sdk/registry.js +88 -0
  111. package/dist/src/claude/sdk/release.js +26 -0
  112. package/dist/src/claude/sdk/types.js +1 -0
  113. package/dist/src/claude/tree.js +103 -0
  114. package/dist/src/claude/trust.js +12 -0
  115. package/dist/src/cli-args.js +36 -0
  116. package/dist/src/cli-check/lease.js +35 -0
  117. package/dist/src/cli-check/run.js +381 -0
  118. package/dist/src/cli-check/scheduler.js +134 -0
  119. package/dist/src/cli-check/support.js +105 -0
  120. package/dist/src/cli.js +196 -0
  121. package/dist/src/codex/adapter.js +112 -0
  122. package/dist/src/codex/appserver.js +68 -0
  123. package/dist/src/codex/cli.js +360 -0
  124. package/dist/src/codex/mcp.js +8 -0
  125. package/dist/src/codex/name.js +2 -0
  126. package/dist/src/codex/plugins.js +137 -0
  127. package/dist/src/codex/process.js +81 -0
  128. package/dist/src/codex/protection.js +32 -0
  129. package/dist/src/codex/release.js +33 -0
  130. package/dist/src/codex/rollout.js +478 -0
  131. package/dist/src/codex/rolloutImages.js +49 -0
  132. package/dist/src/codex/rules.js +141 -0
  133. package/dist/src/codex/tail.js +53 -0
  134. package/dist/src/codex/turns.js +140 -0
  135. package/dist/src/codex/usage.js +88 -0
  136. package/dist/src/codex/version.js +2 -0
  137. package/dist/src/config-form.js +359 -0
  138. package/dist/src/config-store.js +184 -0
  139. package/dist/src/config.js +524 -0
  140. package/dist/src/copilot/adapter.js +121 -0
  141. package/dist/src/copilot/cli.js +298 -0
  142. package/dist/src/copilot/errors.js +50 -0
  143. package/dist/src/copilot/home.js +84 -0
  144. package/dist/src/copilot/machine.js +41 -0
  145. package/dist/src/copilot/name.js +2 -0
  146. package/dist/src/copilot/release.js +30 -0
  147. package/dist/src/copilot/tail.js +57 -0
  148. package/dist/src/copilot/transcript.js +385 -0
  149. package/dist/src/diagnostics/start-watch.js +77 -0
  150. package/dist/src/env-file.js +91 -0
  151. package/dist/src/events.js +150 -0
  152. package/dist/src/git/changelog.js +38 -0
  153. package/dist/src/git/changes.js +10 -0
  154. package/dist/src/git/merged.js +36 -0
  155. package/dist/src/git/run.js +25 -0
  156. package/dist/src/git/setup.js +100 -0
  157. package/dist/src/git/slot.js +99 -0
  158. package/dist/src/git/sync.js +72 -0
  159. package/dist/src/git/types.js +1 -0
  160. package/dist/src/git/work.js +119 -0
  161. package/dist/src/git/worktree.js +216 -0
  162. package/dist/src/github/adapter.js +30 -0
  163. package/dist/src/github/model.js +104 -0
  164. package/dist/src/github/profile.js +50 -0
  165. package/dist/src/github/source.js +438 -0
  166. package/dist/src/github/trust.js +25 -0
  167. package/dist/src/github/uploads.js +36 -0
  168. package/dist/src/gitlab/adapter.js +51 -0
  169. package/dist/src/gitlab/api.js +71 -0
  170. package/dist/src/gitlab/batch.js +114 -0
  171. package/dist/src/gitlab/hierarchy.js +59 -0
  172. package/dist/src/gitlab/model.js +56 -0
  173. package/dist/src/gitlab/profile.js +25 -0
  174. package/dist/src/gitlab/source.js +246 -0
  175. package/dist/src/gitlab/uploads.js +65 -0
  176. package/dist/src/guard.js +141 -0
  177. package/dist/src/huly/adapter.js +34 -0
  178. package/dist/src/huly/client.js +158 -0
  179. package/dist/src/huly/credentials.js +27 -0
  180. package/dist/src/huly/ids.js +16 -0
  181. package/dist/src/huly/labels.js +32 -0
  182. package/dist/src/huly/model.js +191 -0
  183. package/dist/src/huly/profile.js +73 -0
  184. package/dist/src/huly/quiet.js +17 -0
  185. package/dist/src/huly/source.js +327 -0
  186. package/dist/src/intake/github.js +73 -0
  187. package/dist/src/intake/intake.js +113 -0
  188. package/dist/src/intake/model.js +72 -0
  189. package/dist/src/jira/adapter.js +35 -0
  190. package/dist/src/jira/adf.js +253 -0
  191. package/dist/src/jira/api.js +96 -0
  192. package/dist/src/jira/mcp.js +134 -0
  193. package/dist/src/jira/model.js +111 -0
  194. package/dist/src/jira/profile.js +17 -0
  195. package/dist/src/jira/source.js +320 -0
  196. package/dist/src/jsonc.js +15 -0
  197. package/dist/src/language.js +4 -0
  198. package/dist/src/limits/chatgpt.js +144 -0
  199. package/dist/src/limits/copilot.js +117 -0
  200. package/dist/src/limits/model.js +183 -0
  201. package/dist/src/limits/overage-session.js +9 -0
  202. package/dist/src/limits/overage.js +74 -0
  203. package/dist/src/limits/recovery.js +23 -0
  204. package/dist/src/limits/reset.js +81 -0
  205. package/dist/src/limits/retry.js +45 -0
  206. package/dist/src/limits/saved.js +17 -0
  207. package/dist/src/limits/spending.js +15 -0
  208. package/dist/src/limits/usage.js +53 -0
  209. package/dist/src/limits/watcher.js +269 -0
  210. package/dist/src/linear/adapter.js +50 -0
  211. package/dist/src/linear/model.js +89 -0
  212. package/dist/src/linear/profile.js +45 -0
  213. package/dist/src/linear/source.js +423 -0
  214. package/dist/src/locations.js +53 -0
  215. package/dist/src/main.js +76 -0
  216. package/dist/src/notice/en.js +489 -0
  217. package/dist/src/notice/notice.js +93 -0
  218. package/dist/src/opencode/adapter.js +121 -0
  219. package/dist/src/opencode/cli.js +433 -0
  220. package/dist/src/opencode/db.js +103 -0
  221. package/dist/src/opencode/home.js +85 -0
  222. package/dist/src/opencode/log.js +87 -0
  223. package/dist/src/opencode/models.js +51 -0
  224. package/dist/src/opencode/name.js +2 -0
  225. package/dist/src/opencode/protection-plugin.js +27 -0
  226. package/dist/src/opencode/release.js +29 -0
  227. package/dist/src/opencode/support.js +14 -0
  228. package/dist/src/opencode/tail.js +42 -0
  229. package/dist/src/opencode/transcript.js +331 -0
  230. package/dist/src/opencode/usage.js +41 -0
  231. package/dist/src/packages/check.js +146 -0
  232. package/dist/src/packages/gateway.js +496 -0
  233. package/dist/src/packages/keys.js +78 -0
  234. package/dist/src/packages/launch.js +99 -0
  235. package/dist/src/packages/model.js +61 -0
  236. package/dist/src/packages/npm.js +115 -0
  237. package/dist/src/packages/plugins.js +162 -0
  238. package/dist/src/packages/service.js +615 -0
  239. package/dist/src/packages/settings.js +25 -0
  240. package/dist/src/packages/skills.js +132 -0
  241. package/dist/src/packages/store.js +39 -0
  242. package/dist/src/packages/version.js +26 -0
  243. package/dist/src/patch.js +1 -0
  244. package/dist/src/paths.js +83 -0
  245. package/dist/src/profiles/control.js +32 -0
  246. package/dist/src/profiles/mcp.js +29 -0
  247. package/dist/src/profiles/model.js +97 -0
  248. package/dist/src/profiles/oauth-error.js +21 -0
  249. package/dist/src/profiles/oauth-protocol.js +106 -0
  250. package/dist/src/profiles/oauth-response.js +12 -0
  251. package/dist/src/profiles/oauth.js +228 -0
  252. package/dist/src/profiles/request.js +20 -0
  253. package/dist/src/profiles/routes.js +31 -0
  254. package/dist/src/profiles/rules.js +54 -0
  255. package/dist/src/profiles/service.js +471 -0
  256. package/dist/src/profiles/store.js +125 -0
  257. package/dist/src/projects/add.js +11 -0
  258. package/dist/src/projects/check.js +174 -0
  259. package/dist/src/projects/colors.js +16 -0
  260. package/dist/src/projects/folder.js +30 -0
  261. package/dist/src/projects/remotes.js +109 -0
  262. package/dist/src/projects/removal.js +14 -0
  263. package/dist/src/projects/standards.js +31 -0
  264. package/dist/src/review/events.js +27 -0
  265. package/dist/src/review/feedback.js +64 -0
  266. package/dist/src/review/forgejo.js +110 -0
  267. package/dist/src/review/github.js +69 -0
  268. package/dist/src/review/gitlab.js +118 -0
  269. package/dist/src/review/model.js +25 -0
  270. package/dist/src/review/open.js +141 -0
  271. package/dist/src/review/refusals.js +20 -0
  272. package/dist/src/review/wiring.js +93 -0
  273. package/dist/src/secrets/catalog.js +34 -0
  274. package/dist/src/secrets/service.js +168 -0
  275. package/dist/src/server-guard.js +51 -0
  276. package/dist/src/server-request.js +360 -0
  277. package/dist/src/server.js +576 -0
  278. package/dist/src/service/accounts.js +584 -0
  279. package/dist/src/service/chain.js +642 -0
  280. package/dist/src/service/cli-check.js +58 -0
  281. package/dist/src/service/hosting.js +508 -0
  282. package/dist/src/service/lifecycle.js +59 -0
  283. package/dist/src/service/stats.js +72 -0
  284. package/dist/src/service/trackers.js +239 -0
  285. package/dist/src/service.js +699 -0
  286. package/dist/src/sessions/activity.js +32 -0
  287. package/dist/src/sessions/agents.js +217 -0
  288. package/dist/src/sessions/approvals.js +105 -0
  289. package/dist/src/sessions/ask.js +234 -0
  290. package/dist/src/sessions/cache.js +14 -0
  291. package/dist/src/sessions/chat.js +60 -0
  292. package/dist/src/sessions/commandPrompt.js +31 -0
  293. package/dist/src/sessions/commands.js +29 -0
  294. package/dist/src/sessions/entry.js +104 -0
  295. package/dist/src/sessions/history.js +88 -0
  296. package/dist/src/sessions/holds.js +63 -0
  297. package/dist/src/sessions/inbox.js +101 -0
  298. package/dist/src/sessions/keepwarm.js +110 -0
  299. package/dist/src/sessions/launch.js +32 -0
  300. package/dist/src/sessions/lines.js +90 -0
  301. package/dist/src/sessions/lingering.js +26 -0
  302. package/dist/src/sessions/mail.js +36 -0
  303. package/dist/src/sessions/mailRelay.js +88 -0
  304. package/dist/src/sessions/mailbox.js +136 -0
  305. package/dist/src/sessions/model-prompts.js +16 -0
  306. package/dist/src/sessions/monitor.js +215 -0
  307. package/dist/src/sessions/note.js +30 -0
  308. package/dist/src/sessions/occupants.js +15 -0
  309. package/dist/src/sessions/owners.js +59 -0
  310. package/dist/src/sessions/paths.js +24 -0
  311. package/dist/src/sessions/permission.js +58 -0
  312. package/dist/src/sessions/place.js +37 -0
  313. package/dist/src/sessions/prompt.js +16 -0
  314. package/dist/src/sessions/protection.js +88 -0
  315. package/dist/src/sessions/remote.js +41 -0
  316. package/dist/src/sessions/setup.js +57 -0
  317. package/dist/src/sessions/share.js +6 -0
  318. package/dist/src/sessions/shareFile.js +32 -0
  319. package/dist/src/sessions/silence.js +25 -0
  320. package/dist/src/sessions/tail.js +79 -0
  321. package/dist/src/sessions/title.js +67 -0
  322. package/dist/src/sessions/transcript.js +477 -0
  323. package/dist/src/sessions/transient.js +4 -0
  324. package/dist/src/sessions/watch.js +78 -0
  325. package/dist/src/settings/changes.js +15 -0
  326. package/dist/src/settings/defaults.js +25 -0
  327. package/dist/src/settings/file.js +197 -0
  328. package/dist/src/settings/import.js +93 -0
  329. package/dist/src/settings/registry.js +422 -0
  330. package/dist/src/settings/resolve.js +80 -0
  331. package/dist/src/settings/store.js +102 -0
  332. package/dist/src/setup.js +7 -0
  333. package/dist/src/state.js +1 -0
  334. package/dist/src/stats/base-sql.js +58 -0
  335. package/dist/src/stats/break-labels.js +53 -0
  336. package/dist/src/stats/calibration.js +43 -0
  337. package/dist/src/stats/checkpoint.js +66 -0
  338. package/dist/src/stats/connect.js +49 -0
  339. package/dist/src/stats/diff.js +88 -0
  340. package/dist/src/stats/mode.js +25 -0
  341. package/dist/src/stats/model.js +108 -0
  342. package/dist/src/stats/reader.js +563 -0
  343. package/dist/src/stats/rule-imports.js +106 -0
  344. package/dist/src/stats/rules-reader.js +257 -0
  345. package/dist/src/stats/rules.js +324 -0
  346. package/dist/src/stats/steps-reader.js +108 -0
  347. package/dist/src/stats/steps.js +159 -0
  348. package/dist/src/stats/tally-schema.js +13 -0
  349. package/dist/src/stats/tally.js +139 -0
  350. package/dist/src/stats/task-checkpoint.js +9 -0
  351. package/dist/src/storage/atomic.js +41 -0
  352. package/dist/src/storage/claim.js +139 -0
  353. package/dist/src/storage/copy.js +69 -0
  354. package/dist/src/storage/database.js +405 -0
  355. package/dist/src/storage/json-folder.js +47 -0
  356. package/dist/src/storage/memory.js +15 -0
  357. package/dist/src/storage/migrations.js +373 -0
  358. package/dist/src/storage/owner.js +114 -0
  359. package/dist/src/storage/package-settings.js +33 -0
  360. package/dist/src/storage/projects.js +23 -0
  361. package/dist/src/storage/schema.js +21 -0
  362. package/dist/src/storage/service-state.js +9 -0
  363. package/dist/src/storage/state-files.js +222 -0
  364. package/dist/src/tools/model.js +1 -0
  365. package/dist/src/tools/panel.js +197 -0
  366. package/dist/src/tools/received.js +114 -0
  367. package/dist/src/tools/sessionSettings.js +15 -0
  368. package/dist/src/tools/settings.js +109 -0
  369. package/dist/src/tracker/adapters.js +28 -0
  370. package/dist/src/tracker/card.js +32 -0
  371. package/dist/src/tracker/closer.js +76 -0
  372. package/dist/src/tracker/closes.js +45 -0
  373. package/dist/src/tracker/comments.js +24 -0
  374. package/dist/src/tracker/control.js +138 -0
  375. package/dist/src/tracker/diagnostics.js +38 -0
  376. package/dist/src/tracker/health.js +1 -0
  377. package/dist/src/tracker/labels.js +25 -0
  378. package/dist/src/tracker/link.js +125 -0
  379. package/dist/src/tracker/model.js +82 -0
  380. package/dist/src/tracker/move-check.js +14 -0
  381. package/dist/src/tracker/mover.js +67 -0
  382. package/dist/src/tracker/parents.js +32 -0
  383. package/dist/src/tracker/poller.js +60 -0
  384. package/dist/src/tracker/questions.js +127 -0
  385. package/dist/src/tracker/readers.js +95 -0
  386. package/dist/src/tracker/source.js +66 -0
  387. package/dist/src/tracker/start.js +256 -0
  388. package/dist/src/tracker/statuses.js +22 -0
  389. package/dist/src/tracker/trackers.js +148 -0
  390. package/dist/src/tracker/vocabulary.js +33 -0
  391. package/dist/src/updates/checkout.js +16 -0
  392. package/dist/src/updates/control.js +139 -0
  393. package/dist/src/updates/launch.js +40 -0
  394. package/dist/src/updates/model.js +105 -0
  395. package/dist/src/updates/prefix.js +19 -0
  396. package/dist/src/updates/release.js +100 -0
  397. package/dist/src/updates/run.js +64 -0
  398. package/dist/src/updates/runner.js +183 -0
  399. package/dist/src/updates/settle.js +18 -0
  400. package/dist/src/updates/steps.js +63 -0
  401. package/dist/src/updates/updater.js +205 -0
  402. package/dist/src/updates/watcher.js +86 -0
  403. package/dist/tally/src/classify.js +144 -0
  404. package/dist/tally/src/closed-tasks.js +25 -0
  405. package/dist/tally/src/collect-worker.js +17 -0
  406. package/dist/tally/src/collect.js +212 -0
  407. package/dist/tally/src/compact.js +33 -0
  408. package/dist/tally/src/config.js +150 -0
  409. package/dist/tally/src/copilot-turns.js +101 -0
  410. package/dist/tally/src/copilot.js +173 -0
  411. package/dist/tally/src/db.js +562 -0
  412. package/dist/tally/src/handoffs.js +126 -0
  413. package/dist/tally/src/host-worker.js +18 -0
  414. package/dist/tally/src/huly-profiles.js +38 -0
  415. package/dist/tally/src/huly.js +123 -0
  416. package/dist/tally/src/limits.js +21 -0
  417. package/dist/tally/src/load.js +89 -0
  418. package/dist/tally/src/local.js +47 -0
  419. package/dist/tally/src/main.js +39 -0
  420. package/dist/tally/src/migrations/2-false-rule-deletions.sql +41 -0
  421. package/dist/tally/src/migrations/3-gpt-family.sql +20 -0
  422. package/dist/tally/src/migrations/4-compactions.sql +49 -0
  423. package/dist/tally/src/migrations/5-milestones.sql +25 -0
  424. package/dist/tally/src/migrations/6-task-sources.sql +6 -0
  425. package/dist/tally/src/migrations/7-task-followups.sql +28 -0
  426. package/dist/tally/src/migrations/8-handoff-headings.sql +12 -0
  427. package/dist/tally/src/migrations/9-codex-stray-counts.sql +15 -0
  428. package/dist/tally/src/migrations.js +80 -0
  429. package/dist/tally/src/opencode-turns.js +79 -0
  430. package/dist/tally/src/opencode.js +115 -0
  431. package/dist/tally/src/parse.js +192 -0
  432. package/dist/tally/src/prompt.js +19 -0
  433. package/dist/tally/src/rollout-turns.js +181 -0
  434. package/dist/tally/src/rollout.js +159 -0
  435. package/dist/tally/src/rule-changes.js +39 -0
  436. package/dist/tally/src/rule-history.js +88 -0
  437. package/dist/tally/src/rule-hook-size.js +23 -0
  438. package/dist/tally/src/rule-hook.js +177 -0
  439. package/dist/tally/src/rule-imports.js +76 -0
  440. package/dist/tally/src/rule-parse.js +178 -0
  441. package/dist/tally/src/rule-repair.js +27 -0
  442. package/dist/tally/src/rule-scan.js +179 -0
  443. package/dist/tally/src/rule-steps.js +144 -0
  444. package/dist/tally/src/rules.js +230 -0
  445. package/dist/tally/src/scan.js +59 -0
  446. package/dist/tally/src/schema.sql +702 -0
  447. package/dist/tally/src/signs.js +179 -0
  448. package/dist/tally/src/step-runs.js +274 -0
  449. package/dist/tally/src/steps.js +140 -0
  450. package/dist/tally/src/stream.js +73 -0
  451. package/dist/tally/src/task.js +16 -0
  452. package/dist/tally/src/turns.js +114 -0
  453. package/dist/web/apple-touch-icon.png +0 -0
  454. package/dist/web/assets/Loader-BoP9PE7x.js +31 -0
  455. package/dist/web/assets/Loader-DJJTBsaF.css +1 -0
  456. package/dist/web/assets/TaskCard-Br2QIllc.css +1 -0
  457. package/dist/web/assets/TaskCard-DNn-Qm8d.js +2 -0
  458. package/dist/web/assets/TranscriptWindow-2afYjYo9.css +1 -0
  459. package/dist/web/assets/TranscriptWindow-CFE2kEuL.js +4 -0
  460. package/dist/web/assets/feedLine-C_AM4QQT.js +1 -0
  461. package/dist/web/assets/index-BY7ediF2.js +25 -0
  462. package/dist/web/assets/index-Di7tEbPf.css +1 -0
  463. package/dist/web/assets/media-DR8nAbPy.css +1 -0
  464. package/dist/web/assets/media-DfHUEnGn.js +1 -0
  465. package/dist/web/assets/rolldown-runtime-XKyaHtl9.js +1 -0
  466. package/dist/web/assets/useModels-1oIk0mDX.css +1 -0
  467. package/dist/web/assets/useModels-BmTGsRQz.js +15 -0
  468. package/dist/web/favicon.svg +1 -0
  469. package/dist/web/icon-192.png +0 -0
  470. package/dist/web/icon-512.png +0 -0
  471. package/dist/web/icon-maskable-512.png +0 -0
  472. package/dist/web/index.html +25 -0
  473. package/dist/web/manifest.webmanifest +16 -0
  474. package/dist/web/stats-preview.png +0 -0
  475. package/even-keel.config.example.json +59 -0
  476. package/package.json +118 -7
  477. package/plugins/checkpoint/.claude-plugin/plugin.json +9 -0
  478. package/plugins/checkpoint/README.md +85 -0
  479. package/plugins/checkpoint/hooks/checkpoint-mark.mjs +26 -0
  480. package/plugins/checkpoint/hooks/context-checkpoint.mjs +28 -0
  481. package/plugins/checkpoint/hooks/evenkeel.mjs +117 -0
  482. package/plugins/checkpoint/hooks/handoff.mjs +9 -0
  483. package/plugins/checkpoint/hooks/hooks.json +120 -0
  484. package/plugins/checkpoint/hooks/mailbox.mjs +36 -0
  485. package/plugins/checkpoint/hooks/merge-check.mjs +28 -0
  486. package/plugins/checkpoint/hooks/merges.mjs +103 -0
  487. package/plugins/checkpoint/hooks/nudges.mjs +78 -0
  488. package/plugins/checkpoint/hooks/permission.mjs +49 -0
  489. package/plugins/checkpoint/hooks/schema-hint.mjs +53 -0
  490. package/plugins/checkpoint/hooks/standard-gate.mjs +51 -0
  491. package/plugins/checkpoint/hooks/standards.mjs +258 -0
  492. package/plugins/checkpoint/opencode/checkpoint.mjs +85 -0
  493. package/plugins/github/.claude-plugin/plugin.json +9 -0
  494. package/plugins/github/.mcp.json +12 -0
  495. package/plugins/github/README.md +73 -0
  496. package/plugins/github/skills/task/SKILL.md +62 -0
  497. package/plugins/gitlab/.claude-plugin/plugin.json +7 -0
  498. package/plugins/gitlab/.mcp.json +13 -0
  499. package/plugins/gitlab/README.md +29 -0
  500. package/plugins/gitlab/skills/task/SKILL.md +55 -0
  501. package/plugins/huly/.claude-plugin/plugin.json +9 -0
  502. package/plugins/huly/.mcp.json +11 -0
  503. package/plugins/huly/README.md +60 -0
  504. package/plugins/huly/hooks/calibration-context.mjs +44 -0
  505. package/plugins/huly/hooks/calibration.mjs +80 -0
  506. package/plugins/huly/hooks/check-marks.mjs +23 -0
  507. package/plugins/huly/hooks/hooks.json +26 -0
  508. package/plugins/huly/hooks/marks.mjs +58 -0
  509. package/plugins/huly/hooks/show-calibration.mjs +19 -0
  510. package/plugins/huly/opencode/huly.mjs +31 -0
  511. package/plugins/huly/skills/setup/SKILL.md +51 -0
  512. package/plugins/huly/skills/split/SKILL.md +53 -0
  513. package/plugins/huly/skills/task/SKILL.md +81 -0
  514. package/plugins/jira/.claude-plugin/plugin.json +7 -0
  515. package/plugins/jira/.mcp.json +11 -0
  516. package/plugins/jira/README.md +39 -0
  517. package/plugins/jira/skills/task/SKILL.md +63 -0
  518. package/plugins/linear/.claude-plugin/plugin.json +9 -0
  519. package/plugins/linear/.mcp.json +11 -0
  520. package/plugins/linear/README.md +71 -0
  521. package/plugins/linear/skills/task/SKILL.md +62 -0
  522. package/plugins/tally/.claude-plugin/plugin.json +9 -0
  523. package/plugins/tally/README.md +42 -0
  524. package/plugins/tally/bin/locate.mjs +48 -0
  525. package/plugins/tally/bin/sql.mjs +21 -0
  526. package/plugins/tally/skills/session-audit/SKILL.md +333 -0
  527. package/service/EvenKeelHost.cs +133 -0
  528. package/service/EvenKeelService.cs +271 -0
  529. package/service/EvenKeelTray.cs +258 -0
  530. package/service/install.ps1 +95 -0
  531. package/service/install.sh +143 -0
  532. package/service/uninstall.ps1 +19 -0
  533. package/service/uninstall.sh +37 -0
  534. package/statusline/statusline.mjs +46 -0
  535. package/tally/bin/rule-hook.mjs +26 -0
  536. package/tally/bin/sql.mjs +166 -0
  537. package/tally/tally.config.json +59 -0
@@ -0,0 +1,52 @@
1
+ {
2
+ "$schema": "https://anthropic.com/claude-code/marketplace.schema.json",
3
+ "name": "even-keel",
4
+ "description": "Plugins for sessions run by Even Keel: the tracker's MCP server and skills for working tasks through it, and context checkpoints",
5
+ "owner": {
6
+ "name": "Even Keel"
7
+ },
8
+ "plugins": [
9
+ {
10
+ "name": "huly",
11
+ "description": "Huly for Even Keel sessions: the huly MCP server and skills to read the task, record decisions, file blockers and questions, split a task into subtasks, close the task by merging, and put a repository on Huly",
12
+ "source": "./plugins/huly",
13
+ "category": "productivity"
14
+ },
15
+ {
16
+ "name": "github",
17
+ "description": "GitHub Issues for Even Keel sessions: GitHub's MCP server and a skill to read the issue, record decisions, file blockers and questions, and close the issue by merging",
18
+ "source": "./plugins/github",
19
+ "category": "productivity"
20
+ },
21
+ {
22
+ "name": "linear",
23
+ "description": "Linear for Even Keel sessions: Linear's MCP server and a skill to read the issue, record decisions, file blockers and questions, and close the issue by merging",
24
+ "source": "./plugins/linear",
25
+ "category": "productivity"
26
+ },
27
+ {
28
+ "name": "gitlab",
29
+ "description": "GitLab Issues for Even Keel sessions: a PAT-capable MCP server and a skill to read the issue, record decisions, file blockers and questions, and close the issue by merging",
30
+ "source": "./plugins/gitlab",
31
+ "category": "productivity"
32
+ },
33
+ {
34
+ "name": "jira",
35
+ "description": "Jira Cloud for Even Keel sessions: the official Atlassian MCP server signed in with an API token and a skill to read the issue, record decisions, file blockers and questions, and close the issue by merging",
36
+ "source": "./plugins/jira",
37
+ "category": "productivity"
38
+ },
39
+ {
40
+ "name": "checkpoint",
41
+ "description": "Context checkpoints: once the context grows past a threshold, the session writes a handoff note and ends its turn with CHECKPOINT: <path>, and Even Keel continues the task in a fresh session; a chain session's merge waits for the project's check when no CI judges main",
42
+ "source": "./plugins/checkpoint",
43
+ "category": "productivity"
44
+ },
45
+ {
46
+ "name": "tally",
47
+ "description": "Session audit: a skill that reads Even Keel's stats (Tally), compares a project's sessions before and after a change — a rule edit, a model, a checkpoint threshold — reviews handoffs and compactions, and proposes what to change",
48
+ "source": "./plugins/tally",
49
+ "category": "productivity"
50
+ }
51
+ ]
52
+ }
package/.env.example ADDED
@@ -0,0 +1,66 @@
1
+ # Copy to .env (ignored by git).
2
+ # The trackers' credentials are profiles: /settings -> Access -> Add profile. Tracker variables found here
3
+ # on the first start become the default profile of their tracker, once; after that they are not read.
4
+ # HULY_URL=https://huly.example.com
5
+ # HULY_WORKSPACE=example
6
+ # HULY_EMAIL=john.doe@example.com
7
+ # HULY_PASSWORD=change-me
8
+ # GITHUB_TOKEN=github_pat_change-me
9
+ # LINEAR_TOKEN=lin_api_change-me
10
+ # GITLAB_URL=https://gitlab.com
11
+ # GITLAB_TOKEN=glpat_change-me
12
+ # JIRA_URL=https://example.atlassian.net
13
+ # JIRA_EMAIL=john.doe@example.com
14
+ # JIRA_TOKEN=change-me
15
+ # Optional, only for jira@even-keel: a separate Atlassian MCP V2 application token.
16
+ # JIRA_MCP_TOKEN=change-me
17
+
18
+ # The CIs' tokens are profiles too (docs/ci.md): GitHub Actions takes a GitHub profile's, Forgejo a Forgejo profile's.
19
+ # A FORGEJO_TOKEN found here on the first start becomes a Forgejo profile per host of the projects' Forgejo remotes, once.
20
+ # FORGEJO_TOKEN=change-me
21
+
22
+ # Where the page listens; defaults to 127.0.0.1 and 4747. Read at startup.
23
+ # EVEN_KEEL_HOST=127.0.0.1
24
+ # EVEN_KEEL_PORT=4747
25
+
26
+ # The local MCP gateway chain sessions reach their packages' servers through (docs/packages.md); always on 127.0.0.1.
27
+ # EVEN_KEEL_MCP_PORT=4748
28
+
29
+ # The page's token for requests from other machines; required when EVEN_KEEL_HOST is not loopback (README).
30
+ # EVEN_KEEL_TOKEN=change-me-0123456789abcdef
31
+
32
+ # Folder with one Claude config folder per extra account; defaults to ~/.claude-accounts.
33
+ # EVEN_KEEL_ACCOUNTS_DIR=C:\Users\john.doe\.claude-accounts
34
+ # Linux: /home/john.doe/.claude-accounts, macOS: /Users/john.doe/.claude-accounts
35
+
36
+ # Folder with one CODEX_HOME per Codex account added from the page; defaults to ~/.codex-accounts.
37
+ # EVEN_KEEL_CODEX_ACCOUNTS_DIR=C:\Users\john.doe\.codex-accounts
38
+ # Linux: /home/john.doe/.codex-accounts, macOS: /Users/john.doe/.codex-accounts
39
+
40
+ # Folder with one folder per OpenCode account added from the page; defaults to ~/.opencode-accounts.
41
+ # EVEN_KEEL_OPENCODE_ACCOUNTS_DIR=C:\Users\john.doe\.opencode-accounts
42
+ # Linux: /home/john.doe/.opencode-accounts, macOS: /Users/john.doe/.opencode-accounts
43
+
44
+ # Path to the opencode binary; defaults to the native one of the global npm package on Windows, opencode elsewhere.
45
+ # EVEN_KEEL_OPENCODE_BIN=C:\tools\opencode\opencode.exe
46
+ # Linux and macOS: /usr/local/bin/opencode
47
+
48
+ # Folder with one COPILOT_HOME per GitHub Copilot account added from the page; defaults to ~/.copilot-accounts.
49
+ # EVEN_KEEL_COPILOT_ACCOUNTS_DIR=C:\Users\john.doe\.copilot-accounts
50
+ # Linux: /home/john.doe/.copilot-accounts, macOS: /Users/john.doe/.copilot-accounts
51
+
52
+ # Path to the copilot binary; defaults to the one winget installed on Windows, copilot elsewhere.
53
+ # EVEN_KEEL_COPILOT_BIN=C:\tools\copilot\copilot.exe
54
+ # Linux and macOS: /usr/local/bin/copilot
55
+
56
+ # Tally session statistics: the service collects them itself every 5 minutes into a local PGlite database
57
+ # (state/tally). Set these only for an own Postgres server (tally/deploy): the collector writes, the page only reads.
58
+ # TALLY_DB_HOST=100.64.0.1
59
+ # TALLY_DB_PORT=5432
60
+ # TALLY_DB_NAME=tally
61
+ # TALLY_WRITER_PASSWORD=change-me-writer
62
+ # TALLY_READER_PASSWORD=change-me-reader
63
+ # Tally's span classifier: LiteLLM on the server (OpenAI-compatible); no key — the classifier is skipped.
64
+ # TALLY_LLM_URL=http://100.64.0.1:4000
65
+ # TALLY_LLM_KEY=sk-change-me
66
+ # TALLY_LLM_MODEL=google-gemini-3.1-flash-lite
package/CHANGELOG.md ADDED
@@ -0,0 +1,315 @@
1
+ # Changelog
2
+
3
+ All notable changes to Even Keel are documented in this file.
4
+
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
+
7
+ ## [Unreleased]
8
+
9
+ ### Added
10
+
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.
47
+
48
+ ### Changed
49
+
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.
75
+
76
+ ### Removed
77
+
78
+ - The shared **Default tracker** setting: every project has its own tracker, and older installs are migrated.
79
+
80
+ ### Fixed
81
+
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.
153
+
154
+ ### Security
155
+
156
+ - 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
+
163
+ ## [0.1.4] - 2026-10-27
164
+
165
+ ### Fixed
166
+
167
+ - A chain on Codex no longer stands still for a day after a usage limit. Codex gives the reset rounded down to the minute, so a new session started right at that time was refused again, and the time it named, already past, was taken for the next day. Now a reset given without a date that has just passed counts as today. After any limit the chain waits one more minute past the reset before it starts the next session. If the next session is refused again with a reset more than a minute in the past, the chain retries 10 minutes later.
168
+
169
+ ## [0.1.3] - 2026-10-26
170
+
171
+ ### Fixed
172
+
173
+ - Stopping a Codex session no longer kills an unrelated program. When a turn has ended and the operating system has given its process number to a newer process, "Stop", "New session" and the cleanup after Done leave that process running; before, they ended it together with its child processes.
174
+
175
+ ## [0.1.2] - 2026-10-25
176
+
177
+ ### Changed
178
+
179
+ - Chain sessions run on Claude Code 2.1.310 and codex-cli 0.164.0, the versions this release was checked against.
180
+ - Tips no longer pop up when the mouse passes over them: a tip opens once the pointer rests on it for 700 ms, at once if another tip was just open, on focus or on a press. The "?" next to a setting opens and closes only on a press.
181
+ - The sessions list of a task says why a new session followed a cold cache: the limit, a fixed main branch, pull request feedback or a task that came back.
182
+
183
+ ### Fixed
184
+
185
+ - Codex 0.164.0 runs the packages' hooks again. A launch whose hooks Codex does not trust now fails with a message naming the package, the CLI version and each hook, instead of a chain running silently without the merge check, reminders and chat mail.
186
+ - A Codex limit no longer wipes the spent monthly limit, so answers stay refused until it resets. The reset time is read from Codex's own refusal.
187
+ - On Codex, the checkpoint plugin's merge check now stops a merge run from code mode, and a handoff note written by a shell command is noticed when the session forgets the `CHECKPOINT:` line.
188
+ - On Codex, the Huly plugin now refuses a malformed description or comment instead of letting it reach Huly.
189
+ - A project's commands run in the environment of the task's own account. A Codex-only install without `~/.claude` no longer pauses the chain on `beforeStart`; `check` and `afterGreen` run the same way.
190
+ - A session whose turn ended on a question to you while its monitor still runs shows as waiting, not working.
191
+
192
+ ## [0.1.1] - 2026-10-22
193
+
194
+ ### Changed
195
+
196
+ - Chain sessions run on Claude Code 2.1.308, the version this release was checked against.
197
+ - The chat keeps a reply you have not sent yet, its text and files, for each session separately: it survives closing the chat window and reloading the page.
198
+
199
+ ### Fixed
200
+
201
+ - A task postponed on an open blocker, or skipped, no longer stands above the running task on the project page, and dragging tasks after that no longer fails with "is running and stays first". The running task is drawn first even when the chain has no order of your own yet.
202
+ - A chain no longer pauses with "the active account folder … is gone" when the service has just started, for example after an update, and the next task is due in its first seconds. The chains now wait until the account folders have been read once.
203
+ - A dialog no longer closes when you select text in it and release the mouse outside, or press outside and release inside: only a click that both starts and ends on the backdrop closes it.
204
+ - The project wizard names the project that already uses a key instead of pointing at a config index. For Linear it says that in this version one team is one Even Keel project, and which project has the team.
205
+
206
+ ### Security
207
+
208
+ - `markdown-it` is 14.3.3, which parses in linear time: an older one, which the Huly client pulls in, could be held up by crafted markdown. `vite`, used only to build the page and by `dev:fake`, is 8.3.5.
209
+ - An answer to a question that is a long run of digits, from a tracker comment or the page's chat, no longer holds the service up: the check for option numbers ran in exponential time on it.
210
+ - A notice whose code is an inherited member of an object, such as `constructor`, is shown as its code instead of calling that member.
211
+ - On GitHub, only comments by the repository's owner, organization members, collaborators and the token's own account reach a session: as an answer to a question, as the last comment in a changelog draft, and in PR mode as a review or a comment on a pull request. Anyone else's is skipped with a line in the service log. The project wizard warns that in a public repository without required labels anyone can put an issue into the chain.
212
+
213
+ ## [0.1.0] - 2026-10-21
214
+
215
+ ### Added
216
+
217
+ - **The chain.** Even Keel takes a project's open tasks from the tracker and runs one Claude Code session (`claude --bg`) at a time. When a task is done, the next one starts. The order is set by `blocks` links, then milestones (by the version in the name, then the target date), then priority and task number. Contradictions between blockers and milestones are reported as chain errors. Parent tasks never run themselves, and a task with an open blocker waits. A blocker still in the backlog shows in the chain as a locked row. If there is nothing to run, **Start** says why. When a project has no tasks left, the chain says so and has a button that opens the project in the tracker.
218
+ - Rules for which tasks enter the chain: active and terminal statuses, required labels, and excluded labels (`Manual` is always excluded). Backlog tasks stay out of the chain.
219
+ - Drag tasks to reorder the chain on the project page, within the limits of their blockers and milestones. With `fillMilestone` on, a task that enters the chain without a milestone gets the active milestone.
220
+ - Several chains of different projects can run at once (`parallel`). The other projects wait in a queue, which you can reorder or trim from the header.
221
+ - **Task worktrees.** Even Keel prepares `.claude/worktrees/<key>-<number>` on the branch `<key>-<number>/task` before the launch. After Done it stops the task's sessions, removes the worktree and the branch, and syncs the main branch with every remote. It uses the `git sync` alias if there is one, otherwise its own fetch, merge and push. A project can use a pool of permanent slots instead, for repositories with heavy ignored caches. Anything it could not clean up is listed on the project page. The main branch is a project setting (`branch`, `main` by default). A session that is only running a background command does not hold up Done, and stopping a session also ends its background commands. No session is launched while the main checkout is on a branch other than the project's.
222
+ - Some tasks need no change in the repository, such as research or an answer. Their session ends its turn with `NO CHANGES: <why>`. If the worktree has no commits beyond the main branch and nothing uncommitted, Even Keel moves the task to Done, posts the line as a comment, cleans up and goes on with the chain.
223
+ - **Handoffs.**
224
+ - A session that hit the usage limit is resumed after the reset while its prompt cache is still warm. Otherwise it is replaced by a new session with a handoff prompt.
225
+ - A session that ends its turn with `CHECKPOINT: <path>` is handed over to a fresh session the same way.
226
+ - The checkpoint plugin asks for a checkpoint from 200k tokens of context, or from a threshold calibrated from the project's statistics, and stops asking below 300k after three handoffs. Its thresholds stay within 72, 85 and 95 % of the session's context window (`stats.checkpointShares`, for all projects and per project). The window size comes from the agent and is applied live.
227
+ - The **New session** button replaces a session by hand. It shows for every open task. When **New session** or **Skip** is greyed out, a tip says why and when it becomes available.
228
+ - If the service restarts in the middle of a handoff, an answer or a **New session**, it finishes the step after the restart.
229
+ - **Skip** and **Return to chain** for a task. A task whose session filed a blocker for it is postponed until the blocker is done. **Stop** ends a running chain, and **Stop after this task** ends it once the current task is done.
230
+ - **Unattended mode**, a switch in **Settings → Chain** for when nobody will answer. Sessions are told to ask nothing and to park a task a question holds: committed on its branch, unmerged, the question left in the task, the task moved to Backlog. When such a task is moved back to Todo, it gets a new session with a handoff that points to the answer. A session that sits 10 minutes without the task done is skipped, so one stuck session does not stop the whole run.
231
+ - **Chat with the session.**
232
+ - The **Chat** button opens the whole transcript with a reply box. It turns amber while the session waits.
233
+ - Questions from `AskUserQuestion` show as a card with options, free text and "Other". Files can be attached with `+`, pasted with Ctrl+V or dropped on the window, and land in the task's `.temp/inbox/`.
234
+ - Questions are also posted to the tracker as numbered comments, and the replies are read back.
235
+ - A message to a session that is working is delivered by a hook of the checkpoint plugin, without stopping the session.
236
+ - The feed reads like Claude Code: tool calls are folded into groups, images the session read show as thumbnails with a viewer, and a line at the bottom shows the current turn.
237
+ - The question badges link straight to the session that asks.
238
+ - **Task cards.** A click on a task's title opens its card: the description and comments (newest first), labels with what each means to the chain, milestone, priority and related tasks. A backlog task moves to Todo from its card, and picking another milestone moves the task in the tracker at once.
239
+ - Tasks labelled `Question` (or `Вопрос`) are marked in the chain, and their count shows on the project card and in the project's header.
240
+ - **Web page**, for desktop and phone, in dark and light themes:
241
+ - The home page has project cards and a chart of launches by day. Cards can be grouped by remote and tracker (**No groups** by default) and are sorted into zones by state. Quiet projects shrink to a strip, and each project has its own colour (`color`).
242
+ - The project page shows the chain as a list with status lamps, milestone sections, the closed tasks folded into an archive, and a context gauge on the current task.
243
+ - The session panel shows the time in work, context, tokens, cache, the session's model and account, and its Remote Control link. If a session asks a question before its first reply, the panel still shows its model, taken from the launch, and the cache clock runs from the question.
244
+ - The header shows the limits, the tracker connection and the sessions waiting for an answer.
245
+ - Hints without buttons close as soon as the cursor leaves their icon.
246
+ - The page and the session prompts are in English or Russian, set separately (`language`, `promptLanguage`).
247
+ - **Accounts.**
248
+ - The `/accounts` page manages several Claude subscriptions, one config folder each: add, sign in again, switch and remove. An account that a run profile names cannot be removed, and the page lists the projects that use it.
249
+ - The shared configuration (MCP servers, folder trust, project memory) is carried over to every account folder.
250
+ - An account can also be an Anthropic API key. It shows today's spend instead of limits, and a session whose key runs out of credit waits until the key is topped up.
251
+ - Prompt cache lifetime setting: `cacheTtl`.
252
+ - Even Keel calls the CLI on an account folder one call at a time and never cuts a call off while it renews the sign-in token, so accounts stay signed in across reboots; it also clears the lock files the CLI leaves behind.
253
+ - **Limits.** The 5-hour and weekly windows of every account are read with the CLI's `/usage` command. While a window is exhausted, the next task waits for its reset. The header shows rings for every account a project uses.
254
+ - **Run profiles.** The provider, model and account are set for all projects and per project. With `modelLabels` on, a task label `Provider | model` (for example `Claude | sonnet`) picks them for that task. If the label names a provider with no account, the task runs on the project's provider and the page says so. A project can add its own prompt and run its own commands before each session starts.
255
+ - **Codex (preview).** Sessions can run on the OpenAI Codex CLI (`codex exec --json` per turn):
256
+ - The transcript, context and limits are read from Codex's own files.
257
+ - The project's MCP servers, plugin skills and hooks are passed on every turn.
258
+ - Accounts can be several subscriptions (at most one on the free plan) or an OpenAI API key. A session whose key runs out of quota waits until the key is topped up, as with Claude. The built-in `codex` and `global` accounts show only when their folder exists, the first account added from the page becomes the shared one, and without the Codex CLI the page says so.
259
+ - `execution.codex: bypass` turns the Codex sandbox off, which the Windows service needs.
260
+ - **Checked CLI versions.** Chain sessions run on the Claude Code and Codex versions this release was checked on, not on whatever the installed CLI has updated itself to. Even Keel downloads them into `state/cli/` and keeps the auto-updater off for those sessions. **Settings → Models**, "CLI version", `Installed` switches a provider back to your own CLI, and a banner shows while sessions would run on an unchecked version. The checked versions are Claude Code 2.1.306 and codex-cli 0.163.0.
261
+ - **Trackers.**
262
+ - There are adapters for Huly, GitHub Issues and Linear. Each project chooses its own tracker.
263
+ - Even Keel puts the task's title and description into the prompt (`brief`) and closes the task when its branch is merged. Without the tracker's plugin among the project's packages, `brief` turns on by itself and the prompt carries the merge rule. A button beside **Task description in the prompt** takes you to `/tools`, where you can add the tracker's package in a couple of clicks.
264
+ - Tracker connections are profiles on **Settings → Access**: saved only after a successful check, several per tracker, one default each. A Huly profile signs in with an e-mail and password by default. Field hints in the profile dialog explain each field, not just name its environment variable. The dialog also lists the token permissions each use needs, and the setup guide collects them in one table.
265
+ - Claude Code plugins `huly`, `github` and `linear` come from the `even-keel` marketplace: the tracker's MCP server and a skill for working a task. The Huly plugin also shows estimate calibration from the statistics.
266
+ - **Packages.** Plugins and MCP servers are a set per project:
267
+ - Each is installed at a pinned version and given to chain sessions by launch flags.
268
+ - **Add a package** lists Even Keel's own plugins without a marketplace. A button on `/tools` adds the marketplace for sessions you start by hand.
269
+ - MCP servers run behind a local gateway on 127.0.0.1.
270
+ - The chain does not launch while a package is missing, lacks a key or does not answer. An MCP server that is still starting shows as starting.
271
+ - The `/tools` page shows what sessions get and what does not reach them, with a fix for each problem. The "trim the tools" switch starts chain sessions without claude.ai skills and plugins.
272
+ - **CI.**
273
+ - A badge and panel show Forgejo Actions and GitHub Actions runs, with their jobs, steps and tasks.
274
+ - After a push to the main branch, the next task waits for the CI's verdict.
275
+ - A red main branch is fixed first: by a fix session without a tracker task (the interrupted session continues afterwards), or by a high-priority fix task (`ci.fixTask`). A finished fix stays in the chain's archive.
276
+ - Projects without CI can name check commands that run before a merge and again on the main branch.
277
+ - `commands.afterGreen` runs commands after the main branch goes green.
278
+ - CI tokens come from tracker profiles and Forgejo profiles. Each project picks the GitHub or Forgejo profile of its remote, for CI and pull requests.
279
+ - **Pull request mode** (`pullRequests`). A session does not merge its branch: Even Keel pushes it, opens a pull request on GitHub or Forgejo and takes the next task, and a person merges.
280
+ - Reviews, comments, failed runs and conflicts on the pull request go back to the task's session.
281
+ - A branch with nothing to merge opens no empty pull request, and the page says why.
282
+ - When a pull request is closed without a merge, the task's next run gets the pull request's link and comments.
283
+ - A pull request button sits in the task panel and the chat window, and **Refresh** polls pull requests too.
284
+ - The switch is unavailable until the project has a remote and a profile for it. An **Add profile** button sits beside the switch and in the pause banner. A remote on neither GitHub nor Forgejo is shown as an unsupported host instead of a request for a Forgejo profile.
285
+ - Without a remote and a profile to open pull requests with, the chain pauses before the launch and goes on by itself once one is added or the mode is turned off.
286
+ - **Statistics (Tally).**
287
+ - Statistics are optional: the page asks at the first start, and a switch in the settings (`tally`) turns them off or points them at the embedded database or your own Postgres.
288
+ - A built-in collector reads session transcripts, Claude Code and Codex, into an embedded Postgres (PGlite) every five minutes. An external Postgres is optional. Codex models are priced too.
289
+ - The `/stats` page shows spend by day and project, cost and time per task, a breakdown by model and entry point, stuck sessions, durations of long commands, estimates against actual time, the share of weekly limits, and before/after comparisons of changes to rule files.
290
+ - The project page has a 30-day strip.
291
+ - Optional extras: a hook that asks sessions to log why a rule changed, the agent's active time written back to Huly as a time report, and `tally/bin/sql.mjs` for read-only queries.
292
+ - **Settings on the page.**
293
+ - `/settings` and each project's settings are split into tabs, with save and revert per group and "was: …" markers. A file edited under an open form is no longer overwritten. **Prompt cache lifetime** is in the Claude Code group, and the introduction to a project's settings is in a hint.
294
+ - CI, `promptLanguage`, `checkpointTokens`, `cacheTtl` and `fillMilestone` can be set for all projects and per project.
295
+ - Settings and `.env` apply live, without a restart.
296
+ - The add-project wizard checks the repository, the branch, the tracker and Claude Code's trust in the folder. For a folder that is not trusted yet, it gives a ready command to run in a terminal and checks again when you come back to the page.
297
+ - A project is removed from its settings.
298
+ - **Storage.**
299
+ - The chain state, settings and projects are in an embedded database in `state/even-keel/`.
300
+ - An existing `even-keel.config.json` is imported once on the first start.
301
+ - `npm run storage -- backup|export|config-export|config-import`.
302
+ - The schemas are versioned and migrate on update. A database newer than the code shows a page with the reason instead of starting.
303
+ - Runs as a service: the Windows service (`service/install.ps1`), a `systemd --user` unit on Linux and a launchd agent on macOS (`service/install.sh`).
304
+ - The page shows Even Keel's version and announces a new GitHub release with a toast.
305
+ - **Changelog drafts.** A button on a milestone's head has the agent draft the milestone's changelog section from its done tasks.
306
+ - The draft starts from the milestone's section in the repository's changelog file (the project setting `changelog`, `CHANGELOG.md` by default), so hand edits are kept.
307
+ - **Add N** works in only the tasks closed since the last version, an edit can be asked for in words, and the changes against the previous version are highlighted.
308
+ - **Write** puts the section into the file and commits only that file to the main branch. A released section (one with a tag) stays frozen, and new tasks go into the next one.
309
+ - The milestone's head counts the tasks done since the section was written, and the drafts survive a restart.
310
+ - Each version shows what its turn cost, on which account and model, and the milestone's total.
311
+
312
+ ### Security
313
+
314
+ - The page listens on `127.0.0.1` by default and checks `Host` and `Origin` on every request. Listening on another address requires `EVEN_KEEL_TOKEN`; extra names go in `allowedHosts`.
315
+ - Tracker, CI and package keys never reach the sessions' environment. MCP servers get them through the local gateway, and the page never shows a saved token or password again.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Even Keel contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.