Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
246 commits
Select commit Hold shift + click to select a range
4c79859
fix(lint): harden ESLint rules and fix 26 warnings (#101)
EivMeyer Jan 16, 2026
ef7ece9
fix(templates): add planner output conciseness instructions (#105)
EivMeyer Jan 17, 2026
711c78d
fix(ci): audit production dependencies only, add npm overrides (#106)
EivMeyer Jan 17, 2026
cfa15f6
fix(prompts): remove phases from planner, tighten CRITICAL, fix worke…
EivMeyer Jan 17, 2026
c8fae5b
fix(validators): remove adversarial-tester from standard cluster (#108)
EivMeyer Jan 17, 2026
44afc2b
feat(planner): add single-session execution scope constraint (#111)
EivMeyer Jan 17, 2026
3b76867
fix(ci): remove git plugin - branch protection blocks direct push (#113)
EivMeyer Jan 18, 2026
ac20f85
docs: update v5.4 announcement with OpenCode and multi-platform suppo…
EivMeyer Jan 18, 2026
4096548
docs: fix misleading provider claim in announcement (#118)
EivMeyer Jan 18, 2026
3227144
Sync: merge main into dev (#120)
EivMeyer Jan 18, 2026
d359dbe
feat: context metrics instrumentation (#126)
tomdps Jan 19, 2026
b6ebef8
feat(context): fix selection semantics (phase 1) (#129)
tomdps Jan 19, 2026
9fe7669
feat(context): add context packs (#132)
tomdps Jan 19, 2026
288e9a2
feat(context): add STATE_SNAPSHOT (#134)
tomdps Jan 19, 2026
b710209
docs(context): context management guide + template alignment (#138)
tomdps Jan 19, 2026
a9e58de
Fix provider override forcing level1 (#141)
tomdps Jan 20, 2026
5a5f808
Add validator docker fallback for platform mismatch (#143)
tomdps Jan 20, 2026
202c6cc
feat(codex): increase reasoning effort levels to medium/high/xhigh (#…
tomdps Jan 25, 2026
c9bd4d2
Fail fast on Windows and document deferral (#147)
tomdps Jan 25, 2026
708a383
fix: load clusters on resume (#149)
tomdps Jan 25, 2026
f6c9fb2
fix: fail fast on Claude CLI no-messages error (#148)
tomdps Jan 25, 2026
213c174
docs: add Ink TUI PRD and implementation plan (#150)
tomdps Jan 26, 2026
977ea03
fix: add diagnostics for no-messages error (#151)
tomdps Jan 26, 2026
2e579dd
feat: Optimize adversarial validation with two-stage cluster topology…
tomdps Jan 26, 2026
7d60d7b
fix: make criteriaResults optional in validator-requirements schema (…
EivMeyer Jan 26, 2026
315defd
feat: Robust error handling and provider retry infrastructure (#161)
EivMeyer Jan 26, 2026
8521768
fix: allow parsing when fatal strings appear in logs (#166)
tomdps Jan 26, 2026
fc56b76
feat: implement #164 - TUI v2 Issue 1.1: Add Ink + React dependencies…
tomdps Jan 27, 2026
27b5c6f
feat: TUI v2 Issue 1.1: Add Ink + React dependencies (no runtime beha…
tomdps Jan 27, 2026
2145822
Merge remote-tracking branch 'origin/dev' into zeroshot/infinite-mead…
tomdps Jan 27, 2026
b94f5dc
merge main into dev
tomdps Jan 27, 2026
bc5cf29
fix: avoid TOCTOU when tailing files (#170)
tomdps Jan 27, 2026
fd9bf19
feat(tui): replace blessed TUI with Ink + TypeScript (#172) (#174)
tomdps Jan 27, 2026
b9c2d60
fix: unblock git-pusher after validator approval (#177)
tomdps Jan 27, 2026
f48307d
fix: use settings.maxRetries default (3) instead of hardcoded 1 (#175)
EivMeyer Jan 27, 2026
45dc8f6
fix: ignore generated tui lint errors (#178)
tomdps Jan 27, 2026
eb6a16c
feat: TUI v2 1.3: Add zeroshot tui command + provider override (#180)
tomdps Jan 27, 2026
853ca08
feat: TUI v2 2.1: Implement view router + Esc back navigation (#182)
tomdps Jan 27, 2026
7a6d6a2
feat: TUI v2 2.2: Command box + slash-command parser (MVP) (#184)
tomdps Jan 27, 2026
1204853
feat: TUI v2 2.3: Command registry + /status & /list (#186)
tomdps Jan 27, 2026
d3f4276
feat: TUI v2 3.1: start-cluster helper (#188)
tomdps Jan 27, 2026
7635cf3
feat: TUI v2 3.2: launcher starts cluster (#190)
tomdps Jan 27, 2026
130ff64
feat: implement /issue command (#192)
tomdps Jan 27, 2026
765854b
chore: ignore generated tui output in eslint (#193)
tomdps Jan 27, 2026
5cbde92
TUI v2: live log streaming in Cluster view (#195)
tomdps Jan 27, 2026
c3e477a
TUI v2: monitor view cluster list (#197)
tomdps Jan 27, 2026
736fa5e
Add monitor metrics to TUI monitor view (#200)
tomdps Jan 28, 2026
aaaa3c8
Start zeroshot watch in Monitor view (#202)
tomdps Jan 28, 2026
cb492f1
Add topology model and view in Cluster view (#204)
tomdps Jan 28, 2026
f1052a4
Add workflow timeline to Cluster view (#206)
tomdps Jan 28, 2026
690d45d
Add agent selection and agent log view (#208)
tomdps Jan 28, 2026
0e49d9f
Add agent message queue UI (#210)
tomdps Jan 28, 2026
a1909e6
Add guidance topics and mailbox query (#212)
tomdps Jan 28, 2026
8ed994e
fix(output-extraction): reject CLI metadata in extractDirectJson (#214)
EivMeyer Jan 28, 2026
4c6b400
feat(output-extraction): extract CLI errors from all providers (#216)
EivMeyer Jan 28, 2026
976fe3f
feat: implement #213 - TUI v2 7.2 guidance live injection (#217)
tomdps Jan 28, 2026
67fb66b
feat: implement #219 guidance queue fallback (#220)
tomdps Jan 28, 2026
1b1197e
feat: implement #221 cluster guidance broadcast (#222)
tomdps Jan 28, 2026
a52a46c
feat: wire TUI guidance messaging (#224)
tomdps Jan 28, 2026
c02ba9b
feat: default to TUI when no args (#226)
tomdps Jan 28, 2026
6e1b9ab
Add provider TUI entrypoints (#228)
tomdps Jan 28, 2026
7008808
Clean up legacy dashboard references (#230)
tomdps Jan 28, 2026
95b9bc6
Add TUI reliability tests (#232)
tomdps Jan 28, 2026
08255df
feat: persist issue number in cluster state (#234)
EivMeyer Jan 29, 2026
44b4fc2
feat: repo-local settings + fix task not found (#235)
EivMeyer Jan 29, 2026
da305a3
feat: add CLI args for PR configuration + repo settings (#236)
EivMeyer Jan 29, 2026
ff6cb9d
docs(tui-v2): update plan and prd (#239)
tomdps Jan 30, 2026
59732fe
docs(tui-v2): add issue template (#243)
tomdps Jan 30, 2026
4ffb43c
docs(tui-v2): restore ratatui plan and issue template (#244)
tomdps Jan 30, 2026
090e5b8
feat: [FEATURE] TUI v2: Protocol spec + shared types (v0) (#245)
tomdps Jan 30, 2026
2beb29e
feat: tui v2 backend skeleton (#246)
tomdps Jan 31, 2026
66934d3
feat: tui v2 stdio json-rpc server (#247)
tomdps Jan 31, 2026
158c43c
docs(tui-v2): mark issue progress (#252)
tomdps Jan 31, 2026
a97e4c1
fix: use origin/${prBase} as worktree base ref when prBase is set (#254)
EivMeyer Jan 31, 2026
ba7db35
feat(tui-v2): add cluster listing and summary APIs (#256)
tomdps Jan 31, 2026
75ff252
feat: [FEATURE] TUI v2: Cluster listing + summary APIs (#255)
tomdps Jan 31, 2026
c836426
fix(cli): preserve pr-base in detached runs (#258)
tomdps Jan 31, 2026
f7bc321
feat: [FEATURE] TUI v2: Start cluster from text/issue (#259)
tomdps Jan 31, 2026
b53a9d2
fix: prevent detached PR base drift (#261)
tomdps Jan 31, 2026
9c3c552
test(tui-backend): rebuild when output is stale (#262)
tomdps Jan 31, 2026
578775c
chore: default worktree/PR base to dev (#263)
tomdps Jan 31, 2026
ae6c1fe
feat: [FEATURE] TUI v2: Log + timeline subscriptions (#264)
tomdps Jan 31, 2026
6804a53
feat: [FEATURE] TUI v2: Guidance delivery APIs (#268)
tomdps Jan 31, 2026
c76f0d2
feat: [FEATURE] TUI v2: Topology + metrics APIs (#269)
tomdps Jan 31, 2026
c87898e
feat: [FEATURE] TUI v2: Rust TUI crate skeleton + terminal safety (#270)
tomdps Jan 31, 2026
2d31ca9
feat: [FEATURE] TUI v2: Backend client (stdio) + handshake (#285)
tomdps Jan 31, 2026
675f253
feat: [FEATURE] TUI v2: Backend client (stdio) + handshake (#287)
tomdps Jan 31, 2026
093a551
feat: [FEATURE] TUI v2: Core app architecture (state/actions/effects)…
tomdps Jan 31, 2026
f44ec20
revert: undo pr 287 duplicate backend client changes (#291)
tomdps Jan 31, 2026
10981ae
fix: preserve cluster config during reload (#292)
tomdps Jan 31, 2026
cb07215
fix: signal detached daemon on stop (#293)
tomdps Jan 31, 2026
57364b4
feat: [FEATURE] TUI v2: Launcher screen (text + commands) (#294)
tomdps Jan 31, 2026
a5594cd
feat: [FEATURE] TUI v2: Monitor screen (cluster list) (#295)
tomdps Jan 31, 2026
a7b39a9
feat: [FEATURE] TUI v2: Cluster screen (logs + agents + timeline) (#296)
tomdps Jan 31, 2026
e20a792
feat: [FEATURE] TUI v2: Agent screen (logs + guidance input) (#297)
tomdps Feb 1, 2026
c628935
feat: [FEATURE] TUI v2: Slash command MVP (#298)
tomdps Feb 1, 2026
b31b916
feat: [FEATURE] TUI v2: Topology rendering (MVP) (#299)
tomdps Feb 1, 2026
019a16c
feat: [FEATURE] TUI v2: Metrics display (Monitor + Cluster) (#300)
tomdps Feb 1, 2026
5194201
feat: [FEATURE] TUI v2: CLI wiring + entry points (#301)
tomdps Feb 1, 2026
6619af0
feat: [FEATURE] TUI v2: Packaging + distribution (#302)
tomdps Feb 1, 2026
ad5deaf
feat: [FEATURE] TUI v2: Cutover + cleanup (remove Ink) (#303)
tomdps Feb 1, 2026
b9ade6d
feat: [FEATURE] TUI v2: Final design touch-up (polish) (#304)
tomdps Feb 1, 2026
734d857
feat(tui): upgrade ratatui 0.26→0.29, add Rust CI gate (#305)
tomdps Feb 1, 2026
3b9e6d2
docs(tui): update PRD and implementation plan for v2
tomdps Feb 1, 2026
031d95e
fix(config): allow CRITICAL validator_count=0 + load_config prevalida…
EivMeyer Feb 1, 2026
fcdafc0
fix(validation): republish trigger after load_config (#307)
EivMeyer Feb 1, 2026
6eae4ef
feat: [FEATURE] Disruptive TUI: UI variant flag + skeleton (canvas + …
tomdps Feb 1, 2026
7eb66b1
feat: [FEATURE] Disruptive TUI: SpineState + Spine widget (input + cu…
tomdps Feb 1, 2026
b31a21b
feat: [FEATURE] Disruptive TUI: Global keymap + spine mode switching …
tomdps Feb 1, 2026
270395b
fix: merge triggers when adding agent with duplicate ID (#315)
EivMeyer Feb 1, 2026
851badf
feat: [FEATURE] Disruptive TUI: Route core flows through the spine (i…
tomdps Feb 1, 2026
b6893db
fix: add ledger API to hook logic sandbox (#318)
EivMeyer Feb 1, 2026
2254bc2
feat: [FEATURE] Disruptive TUI: Predictive spine hints (parse result …
tomdps Feb 1, 2026
9710e2a
feat: [FEATURE] Disruptive TUI: Fleet Radar rendering (clusters as or…
tomdps Feb 1, 2026
88ad075
feat: [FEATURE] Disruptive TUI: Radar navigation + selection + Enter→…
tomdps Feb 1, 2026
d75ee74
feat: [DOC] Disruptive TUI: Resolve pre-M3 design decisions (focus/la…
tomdps Feb 1, 2026
9974f2d
feat: [FEATURE] Disruptive TUI: Cluster Canvas v1 scene (topology nod…
tomdps Feb 1, 2026
d54e92a
feat: [FEATURE] Disruptive TUI: Cluster Canvas focus/navigation + Ent…
tomdps Feb 2, 2026
e22d6ed
feat: [FEATURE] Disruptive TUI: Contextual overlays near focus (logs/…
tomdps Feb 2, 2026
586ae0f
fix: cluster canvas focus unwrap (#334)
tomdps Feb 2, 2026
74dd7e0
feat: [FEATURE] Disruptive TUI: TimeCursor + time-indexed buffers (lo…
tomdps Feb 2, 2026
db1a2b2
feat: [FEATURE] Disruptive TUI: Scrub bar widget + time controls (←/→…
tomdps Feb 2, 2026
f0e6070
feat: [FEATURE] Disruptive TUI: Scrub bar widget + time controls (←/→…
tomdps Feb 2, 2026
cda9fda
feat: [FEATURE] Disruptive TUI: Stream renderer supports Live vs Scru…
tomdps Feb 2, 2026
eb60a9d
feat: [FEATURE] Disruptive TUI: Agent Microscope (single stream + min…
tomdps Feb 2, 2026
dcb6c4d
feat: [FEATURE] Disruptive TUI: Agent Microscope (single stream + min…
tomdps Feb 2, 2026
61035f8
feat: [FEATURE] Disruptive TUI: Agent Microscope (single stream + min…
tomdps Feb 2, 2026
d9c27fc
fix: add verify_github_pr hook to detect git-pusher hallucinations (#…
EivMeyer Feb 2, 2026
91aea1b
chore(deps): target dev branch for dependabot PRs (#351)
EivMeyer Feb 2, 2026
7bcc83a
feat: [FEATURE] Disruptive TUI: Phase markers in Microscope margin (d…
tomdps Feb 2, 2026
9451cc6
feat: [FEATURE] Disruptive TUI: Add guidance verbs (/guide /nudge /in…
tomdps Feb 2, 2026
dbb6e14
feat: [FEATURE] Disruptive TUI: Inline completion + suggestions (Tab …
tomdps Feb 2, 2026
dda7356
feat: [FEATURE] Disruptive TUI: Motion + smoothing (camera + pulses) …
tomdps Feb 2, 2026
fba7db5
feat: [FEATURE] Disruptive TUI: Robust empty/error states + calm mess…
tomdps Feb 2, 2026
9f1443d
feat: [TEST] Disruptive TUI: Snapshot coverage for spine/radar/canvas…
tomdps Feb 2, 2026
9d146ab
fix(validator-tester): run targeted tests instead of full suite (#363)
EivMeyer Feb 2, 2026
06da8e4
Unify CI and TUI dev workflow (#364)
tomdps Feb 2, 2026
66e8320
fix(github-provider): always use -R flag + skippedTests support (#365)
EivMeyer Feb 3, 2026
535158e
fix: agent replace on duplicate ID + general-purpose templates (#367)
EivMeyer Feb 3, 2026
4c9e69e
fix(validators): enforce READ-ONLY mode to prevent rogue code changes…
EivMeyer Feb 3, 2026
adca807
fix(hook): add ledger/cluster APIs to transform sandbox (#375)
EivMeyer Feb 3, 2026
04cd3ea
fix(logs): parse Codex stream-json events (#376)
EivMeyer Feb 3, 2026
1bbea99
feat(planner): output actionable steps with embedded patterns (#377)
EivMeyer Feb 3, 2026
d0b5ff9
feat(validation): token-free template simulation gate (#379)
EivMeyer Feb 3, 2026
4b6fd47
chore(release): sync main into dev (#381)
EivMeyer Feb 3, 2026
59fd7ea
fix(orchestration): harden startup persistence and failure handling (…
EivMeyer Feb 3, 2026
2b66e45
fix(orchestration): buffer trigger messages while busy (#384)
EivMeyer Feb 3, 2026
d0551b4
fix(orchestration): verify_github_pr fallback via gh pr view (#385)
EivMeyer Feb 3, 2026
0d5c92d
feat: default to codex provider with gpt-5.3-codex (#386)
tomdps Feb 5, 2026
0ea0d1e
fix: keep claude default and map level3 to opus-4.6 (#388)
tomdps Feb 5, 2026
e06305c
fix(tui): prefer local debug binary for disruptive ui (#389)
tomdps Feb 5, 2026
6bef385
fix(tokens): track cached input tokens and show cache breakdown (#391)
EivMeyer Feb 8, 2026
0afc41d
feat(validators): add clean design check - reject backwards compat (#…
EivMeyer Feb 10, 2026
e9fe1c7
fix: poll for GitHub merge propagation in verify_github_pr hook (#397)
EivMeyer Feb 11, 2026
e66cca6
fix: tear down Docker Compose on worktree cleanup (#402)
EivMeyer Feb 16, 2026
9adaad6
chore: reconcile main release commit into dev for release flow (#409)
EivMeyer Feb 19, 2026
9d7b570
fix: fail fast on invalid provider model ids (#414)
EivMeyer Feb 22, 2026
4690768
feat: make PR verification provider-agnostic (#417)
EivMeyer Feb 23, 2026
9a3aa99
fix: worktree auto-cleanup + git-pusher merge reliability (#420)
EivMeyer Feb 26, 2026
b6b4ed3
fix: validate resolved conductor topology before token spend (#422)
EivMeyer Feb 26, 2026
e93d9ca
feat: add random schema-output topology preflight simulation (#423)
EivMeyer Feb 26, 2026
21ba1ed
fix: eliminate debug/full-workflow termination dead-ends (#424)
EivMeyer Feb 26, 2026
b2bfc6b
feat: scan transform.script for dynamic topics + detached startup lib…
EivMeyer Mar 1, 2026
52b48fe
fix: execute worktree.setup command from repo settings (#432)
EivMeyer Mar 4, 2026
158c013
feat: add worktree garbage collection (zeroshot gc) (#433)
EivMeyer Mar 4, 2026
22b070d
fix: increase worktree setup timeout from 30s to 5min (#434)
EivMeyer Mar 4, 2026
2a97b61
fix: prevent startup GC from deleting active cluster ledgers (#436)
EivMeyer Mar 5, 2026
ee64bbd
feat: add inspect command for live process activity (#440)
EivMeyer Mar 8, 2026
d55502f
fix(orchestrator): normalize pr completion handlers (#443)
EivMeyer Mar 11, 2026
e56c4d0
fix(orchestrator): validate trivial pr-mode topologies (#444)
EivMeyer Mar 11, 2026
d6435eb
fix(preflight): validate real pr completion topology (#445)
EivMeyer Mar 11, 2026
0d654e9
fix(orchestrator): await agent replacement shutdown (#451)
EivMeyer Mar 20, 2026
9aab28f
docs(workflow): clarify dev release promotion (#461)
EivMeyer Mar 27, 2026
d88e89d
chore: upgrade Codex default model from gpt-5.3 to gpt-5.4 (#462)
tomdps Mar 28, 2026
406aecc
fix(deps): override lodash and marked to resolve audit vulnerabilitie…
tomdps Apr 6, 2026
1ad0995
feat: forward worktree tool bins into spawned agents (#466)
tomdps Apr 6, 2026
e0a1d54
fix(subcluster): validate nested configs without circular load (#470)
EivMeyer Apr 9, 2026
78e6a73
feat!: sync public Zeroshot release (#487)
tomdps Jun 9, 2026
52ada46
chore(release): record main ancestry for dev promotion
tomdps Jun 9, 2026
41262da
fix(security): resolve release code scanning alerts (#489)
tomdps Jun 9, 2026
209c931
docs(release): remove stale TUI guidance (#490)
tomdps Jun 9, 2026
1b069fc
ci(release): use trusted publishing capable npm (#491)
tomdps Jun 14, 2026
9175923
ci: run install matrix for main merge queue (#494)
tomdps Jun 14, 2026
aea9020
chore: update GitHub org links (#497)
tomdps Jun 15, 2026
22f3aeb
fix(release): publish under the-open-engine npm scope
tomdps Jun 16, 2026
12ac3b3
fix(release): clear publish audit gate
tomdps Jun 16, 2026
8baffc5
fix(release): publish under the-open-engine npm scope (#498)
tomdps Jun 16, 2026
1a690cd
chore(release): sync main into dev
tomdps Jun 16, 2026
484bc2e
chore(release): sync main into dev (#501)
tomdps Jun 16, 2026
f9652f2
chore(release): merge main into dev (#502)
tomdps Jun 16, 2026
1de90ec
chore(release): merge main into dev
tomdps Jun 16, 2026
a67571b
Merge pull request #503 from the-open-engine/codex/sync-main-into-dev…
tomdps Jun 16, 2026
72efd0d
Merge remote-tracking branch 'origin/dev' into codex/npm-scope-the-op…
tomdps Jun 16, 2026
5cd0967
ci(release): require npm trusted publishing
tomdps Jun 16, 2026
905d387
ci(release): require npm trusted publishing (#504)
tomdps Jun 16, 2026
e5a7ba2
Merge remote-tracking branch 'origin/dev' into codex/npm-scope-the-op…
tomdps Jun 16, 2026
435cee0
Merge remote-tracking branch 'origin/main' into codex/npm-scope-the-o…
tomdps Jun 16, 2026
b9e2267
chore(release): record main ancestry for trusted publishing (#506)
tomdps Jun 16, 2026
45b1c3d
Merge remote-tracking branch 'origin/dev' into codex/npm-scope-the-op…
tomdps Jun 16, 2026
126fbf5
Merge pull request #507 from the-open-engine/codex/npm-scope-the-open…
tomdps Jun 16, 2026
ffc0c4e
ci: run install matrix for main merge queue (#508)
tomdps Jun 17, 2026
741d8d6
docs: Update company name in README.md (#510)
mkceichelbeck Jun 17, 2026
86eff2a
Update copyright year and owner in LICENSE file (#509)
mkceichelbeck Jun 17, 2026
bede936
fix(validation): model git-pusher repair hook outputs (#511)
tomdps Jun 19, 2026
67d2849
fix(update): bridge legacy covibes package migration (#513)
tomdps Jun 19, 2026
0d0ac49
fix(provider-detection): detect CLIs on Windows via `where` (fixes #5…
atharvwasthere Jun 22, 2026
58202fe
fix(logic-engine): isolate trigger sandbox globals (#521)
tomdps Jun 25, 2026
614a0c1
feat(cmdproof): add proof-backed command reuse (#522)
tomdps Jun 26, 2026
29f74d9
feat(cmdproof): serialize proof fallback by action key (#524)
tomdps Jun 26, 2026
70b4b3f
chore(release): sync main into dev (#526)
tomdps Jun 26, 2026
6d53559
docs(readme): unify Zeroshot README + brand with The Open Engine (#535)
tomdps Jul 1, 2026
fd810cc
docs(readme): add single-agent vs Zeroshot comparison grid (#536)
tomdps Jul 1, 2026
915766e
docs(readme): add polished homepage + social buttons (#537)
tomdps Jul 1, 2026
b83a2cf
docs: clarify npm test scope in contributing guide (#430)
haosenwang1018 Jul 8, 2026
5d2c30f
feat: feat(issue-providers): add Linear provider (#548)
EivMeyer Jul 8, 2026
550789c
fix: worktree/PR cleanup runs docker compose down --volumes against h…
EivMeyer Jul 8, 2026
5ec5a15
feat(export): emit print-ready HTML instead of PDF, drop puppeteer (#…
EivMeyer Jul 8, 2026
eacb774
feat: enhancement: first-run wizard should detect its bin dir isn't o…
EivMeyer Jul 8, 2026
02d67d5
feat: bug: macOS Keychain-only login not propagated to isolated agent…
EivMeyer Jul 8, 2026
7f555d2
feat: enhancement: run-mode vocabulary (worktree → pr → ship) is abse…
EivMeyer Jul 8, 2026
24ec01d
feat: enhancement: accept task body on stdin (`zeroshot run -`) to av…
EivMeyer Jul 8, 2026
0aac8a5
fix(providers): clamp model level to min/max guardrails instead of th…
EivMeyer Jul 8, 2026
10d2426
feat: bug: worktree compose teardown -p uses un-normalized basename (…
EivMeyer Jul 8, 2026
913cf7f
feat: bug: Linear provider — verify issue(id:) identifier lookup, gua…
EivMeyer Jul 8, 2026
f3f90ba
feat: Windows: spawned Node.js processes create visible console windo…
EivMeyer Jul 8, 2026
accc08e
feat: Make eslint-disable directives fail (unused disables are errors…
EivMeyer Jul 8, 2026
bacf990
feat: enhancement: pre-commit reprints full template-validation warni…
EivMeyer Jul 8, 2026
dd7e42a
feat: enhancement: show run mode (worktree/pr/ship) in `zeroshot list…
EivMeyer Jul 8, 2026
f9fdfc8
feat: bug: duplicate-run guard reported as a hard failure and leaves …
EivMeyer Jul 8, 2026
fd4b7ee
feat: bug: `zeroshot list --json` disagrees with `status` for running…
EivMeyer Jul 8, 2026
5316f55
feat: --pr flag auto-merges PR instead of stopping at creation (#568)
EivMeyer Jul 8, 2026
cabfd5f
feat: enhancement: make Linear frictionless — settings-based key (+pr…
EivMeyer Jul 8, 2026
7f5de92
feat: bug: zeroshot run <linear-url> treated as manual input — detect…
EivMeyer Jul 8, 2026
eb5a7de
fix: render printable log history (#578)
EivMeyer Jul 9, 2026
ba85a5f
feat: Harden --pr/--ship autoMerge wiring: single-source the decision…
EivMeyer Jul 9, 2026
4f6588d
fix: enforce review-mode PR safety and package hooks (#581)
EivMeyer Jul 9, 2026
893ec85
test: harden compose cleanup data-loss guard (#583)
EivMeyer Jul 9, 2026
4496c9d
chore(release): sync main into dev (#586)
tomdps Jul 9, 2026
f9be90f
chore(release): restore main ancestry into dev
tomdps Jul 9, 2026
b84d8c9
Merge pull request #587 from the-open-engine/chore/restore-main-ancestry
tomdps Jul 9, 2026
d57307c
refactor(run-mode): collapse boolean soup into one canonical RunPlan …
EivMeyer Jul 9, 2026
f4a3b07
feat: Add deterministic end-to-end tests for zeroshot (fake-provider …
EivMeyer Jul 9, 2026
2c88554
refactor(run-mode): RunPlan owns isolation too (follow-up to #588) (#…
EivMeyer Jul 9, 2026
0158356
chore(release): record v6.3.0 ancestry for dev promotion (#592)
EivMeyer Jul 9, 2026
3debc9e
chore(release): resolve main promotion ancestry
Jul 9, 2026
b2e706e
Merge pull request #597 from the-open-engine/chore/resolve-main-dev-r…
EivMeyer Jul 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 28 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,11 @@ jobs:
run: npm run test:coverage
timeout-minutes: 3

- name: Integration tests (slow, Docker)
- name: E2E tests (fake provider)
run: npm run test:e2e
timeout-minutes: 5

- name: Integration tests (slow)
run: npm run test:slow
timeout-minutes: 15

Expand All @@ -96,6 +100,29 @@ jobs:
fail_ci_if_error: false
continue-on-error: true

# Tier 2: worktree/container isolation e2e (real Docker). Non-blocking and
# opt-in via workflow_dispatch - the Docker sub-tests in `check`'s
# "Integration tests (slow)" step self-skip under CI (this is what that
# step's Docker coverage was previously silently missing).
e2e-docker:
if: github.event_name == 'workflow_dispatch'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm'

- name: Install dependencies
run: npm ci

- name: Docker isolation e2e
run: npm run test:e2e:docker
timeout-minutes: 15

# Cross-platform/version compatibility (main only)
# NOTE: macOS runners cost 10x Linux minutes - keep this scoped to main.
install-matrix:
Expand Down
125 changes: 0 additions & 125 deletions FIX_TESTS.md

This file was deleted.

5 changes: 4 additions & 1 deletion cli/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,9 @@
if (options.docker) {
options.worktree = false;
}
options.autoMerge = Boolean(options.ship);
// autoMerge is NOT stored here — it is derived from the run plan (delivery ===
// 'ship') at every consumer. Writing it here unconditionally would clobber an
// explicit autoMerge intent (e.g. a future `--auto-merge` flag) back to false.
}

async function runClusterPreflight({ input, options, providerOverride, settings, forceProvider }) {
Expand Down Expand Up @@ -2469,7 +2471,7 @@
Force provider flags: -G (GitHub), -L (GitLab), -J (Jira), -D (DevOps), -N (Linear)
`
)
.action(async (inputArg, options) => {

Check warning on line 2474 in cli/index.js

View workflow job for this annotation

GitHub Actions / check

Async arrow function has a complexity of 31. Maximum allowed is 20

Check warning on line 2474 in cli/index.js

View workflow job for this annotation

GitHub Actions / check

Refactor this function to reduce its Cognitive Complexity from 53 to the 15 allowed

Check warning on line 2474 in cli/index.js

View workflow job for this annotation

GitHub Actions / check

Async arrow function has too many lines (158). Maximum allowed is 150

Check warning on line 2474 in cli/index.js

View workflow job for this annotation

GitHub Actions / check

Async arrow function has a complexity of 31. Maximum allowed is 20

Check warning on line 2474 in cli/index.js

View workflow job for this annotation

GitHub Actions / check

Refactor this function to reduce its Cognitive Complexity from 53 to the 15 allowed

Check warning on line 2474 in cli/index.js

View workflow job for this annotation

GitHub Actions / check

Async arrow function has too many lines (158). Maximum allowed is 150

Check warning on line 2474 in cli/index.js

View workflow job for this annotation

GitHub Actions / check

Async arrow function has a complexity of 31. Maximum allowed is 20

Check warning on line 2474 in cli/index.js

View workflow job for this annotation

GitHub Actions / check

Refactor this function to reduce its Cognitive Complexity from 53 to the 15 allowed

Check warning on line 2474 in cli/index.js

View workflow job for this annotation

GitHub Actions / check

Async arrow function has too many lines (158). Maximum allowed is 150
try {
// Normalize options (--ship → --pr → --worktree flags)
normalizeRunOptions(options);
Expand Down Expand Up @@ -2610,6 +2612,7 @@

if (!process.env.ZEROSHOT_DAEMON) {
await streamClusterInForeground(cluster, orchestrator, clusterId, options);
orchestrator.close();
}

setupDaemonCleanup(orchestrator, clusterId);
Expand Down Expand Up @@ -2955,7 +2958,7 @@
.command('kill-all')
.description('Kill all running tasks and clusters')
.option('-y, --yes', 'Skip confirmation')
.action(async (options) => {

Check warning on line 2961 in cli/index.js

View workflow job for this annotation

GitHub Actions / check

Refactor this function to reduce its Cognitive Complexity from 26 to the 15 allowed

Check warning on line 2961 in cli/index.js

View workflow job for this annotation

GitHub Actions / check

Refactor this function to reduce its Cognitive Complexity from 26 to the 15 allowed

Check warning on line 2961 in cli/index.js

View workflow job for this annotation

GitHub Actions / check

Refactor this function to reduce its Cognitive Complexity from 26 to the 15 allowed
try {
// Get counts first
const orchestrator = await getOrchestrator();
Expand Down Expand Up @@ -3179,7 +3182,7 @@
.command('resume <id> [prompt]')
.description('Resume a failed task or cluster')
.option('-d, --detach', 'Resume in background (daemon mode)')
.action(async (id, prompt, options) => {

Check warning on line 3185 in cli/index.js

View workflow job for this annotation

GitHub Actions / check

Refactor this function to reduce its Cognitive Complexity from 19 to the 15 allowed

Check warning on line 3185 in cli/index.js

View workflow job for this annotation

GitHub Actions / check

Refactor this function to reduce its Cognitive Complexity from 19 to the 15 allowed

Check warning on line 3185 in cli/index.js

View workflow job for this annotation

GitHub Actions / check

Refactor this function to reduce its Cognitive Complexity from 19 to the 15 allowed
try {
// Try cluster first, then task (both use same ID format: "adjective-noun-number")
const OrchestratorModule = require('../src/orchestrator');
Expand Down Expand Up @@ -4390,7 +4393,7 @@
}
});

function outputAgent(agent, options) {

Check warning on line 4396 in cli/index.js

View workflow job for this annotation

GitHub Actions / check

Refactor this function to reduce its Cognitive Complexity from 19 to the 15 allowed

Check warning on line 4396 in cli/index.js

View workflow job for this annotation

GitHub Actions / check

Refactor this function to reduce its Cognitive Complexity from 19 to the 15 allowed

Check warning on line 4396 in cli/index.js

View workflow job for this annotation

GitHub Actions / check

Refactor this function to reduce its Cognitive Complexity from 19 to the 15 allowed
if (options.json) {
console.log(JSON.stringify(agent, null, 2));
return;
Expand Down Expand Up @@ -4558,7 +4561,7 @@
}

// Format tool result for display
function formatToolResult(content, isError, toolName, toolInput) {

Check warning on line 4564 in cli/index.js

View workflow job for this annotation

GitHub Actions / check

Refactor this function to reduce its Cognitive Complexity from 17 to the 15 allowed

Check warning on line 4564 in cli/index.js

View workflow job for this annotation

GitHub Actions / check

Refactor this function to reduce its Cognitive Complexity from 17 to the 15 allowed

Check warning on line 4564 in cli/index.js

View workflow job for this annotation

GitHub Actions / check

Refactor this function to reduce its Cognitive Complexity from 17 to the 15 allowed
if (!content) return isError ? 'error' : 'done';

// For errors, show full message
Expand Down Expand Up @@ -5238,7 +5241,7 @@

// Accumulate text and print complete lines only
// Word wrap long lines, aligning continuation with message column
function accumulateText(prefix, sender, text) {

Check warning on line 5244 in cli/index.js

View workflow job for this annotation

GitHub Actions / check

Refactor this function to reduce its Cognitive Complexity from 17 to the 15 allowed

Check warning on line 5244 in cli/index.js

View workflow job for this annotation

GitHub Actions / check

Refactor this function to reduce its Cognitive Complexity from 17 to the 15 allowed

Check warning on line 5244 in cli/index.js

View workflow job for this annotation

GitHub Actions / check

Refactor this function to reduce its Cognitive Complexity from 17 to the 15 allowed
if (!text) return;
const buf = getLineBuffer(sender);

Expand Down Expand Up @@ -5301,7 +5304,7 @@
}

// Stream thinking text immediately with word wrapping
function accumulateThinking(prefix, sender, text) {

Check warning on line 5307 in cli/index.js

View workflow job for this annotation

GitHub Actions / check

Refactor this function to reduce its Cognitive Complexity from 25 to the 15 allowed

Check warning on line 5307 in cli/index.js

View workflow job for this annotation

GitHub Actions / check

Refactor this function to reduce its Cognitive Complexity from 25 to the 15 allowed

Check warning on line 5307 in cli/index.js

View workflow job for this annotation

GitHub Actions / check

Refactor this function to reduce its Cognitive Complexity from 25 to the 15 allowed
if (!text) return;
const buf = getLineBuffer(sender);

Expand Down Expand Up @@ -5360,7 +5363,7 @@
}

// Flush pending content - just add newline if we have pending text
function flushLineBuffer(prefix, sender) {

Check warning on line 5366 in cli/index.js

View workflow job for this annotation

GitHub Actions / check

Refactor this function to reduce its Cognitive Complexity from 18 to the 15 allowed

Check warning on line 5366 in cli/index.js

View workflow job for this annotation

GitHub Actions / check

Refactor this function to reduce its Cognitive Complexity from 18 to the 15 allowed

Check warning on line 5366 in cli/index.js

View workflow job for this annotation

GitHub Actions / check

Refactor this function to reduce its Cognitive Complexity from 18 to the 15 allowed
const buf = lineBuffers.get(sender);
if (!buf) return;

Expand Down
6 changes: 4 additions & 2 deletions lib/detached-startup.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ const fs = require('fs');
const os = require('os');
const path = require('path');
const lockfile = require('proper-lockfile');
const { resolveRunPlan } = require('./run-plan');

const DEFAULT_WAIT_TIMEOUT_SECONDS = 180;
const DEFAULT_WAIT_POLL_MS = 1000;
Expand Down Expand Up @@ -116,6 +117,7 @@ async function registerDetachedSetupCluster({
runOptions = {},
cwd,
}) {
const plan = resolveRunPlan(runOptions);
await updateClustersFile(storageDir, (clusters) => {
clusters[clusterId] = {
id: clusterId,
Expand All @@ -125,13 +127,13 @@ async function registerDetachedSetupCluster({
setupLogPath: logPath || null,
setupStartedAt: Date.now(),
setupStage: 'starting',
autoPr: Boolean(runOptions.pr || runOptions.ship),
autoPr: plan.delivery !== 'none',
prOptions: runOptions.prBase
? {
prBase: runOptions.prBase,
mergeQueue: runOptions.mergeQueue || false,
closeIssue: runOptions.closeIssue || null,
autoMerge: Boolean(runOptions.ship),
autoMerge: plan.autoMerge,
cwd: cwd || null,
}
: null,
Expand Down
24 changes: 18 additions & 6 deletions lib/run-mode.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,23 @@
function resolveRunMode(options) {
if (options.ship) return options.docker ? 'ship+docker' : 'ship';
if (options.pr) return options.docker ? 'pr+docker' : 'pr';
if (options.docker) return 'docker';
if (options.worktree) return 'worktree';
const { resolveRunPlan } = require('./run-plan');

// The run-mode label is a VIEW of the canonical plan, never an independent
// cascade. Deriving it from the plan is what keeps the user-facing label and the
// actual isolation/delivery/autoMerge behavior from drifting apart. Callers that
// already hold a plan (e.g. the effective plan with env/settings folded in) use
// runModeFromPlan directly so the label reflects the SAME plan as behavior.
function runModeFromPlan({ isolation, delivery }) {
const dockerSuffix = isolation === 'docker' ? '+docker' : '';
if (delivery === 'ship') return `ship${dockerSuffix}`;
if (delivery === 'pr') return `pr${dockerSuffix}`;
if (isolation === 'docker') return 'docker';
if (isolation === 'worktree') return 'worktree';
return null;
}

function resolveRunMode(options) {
return runModeFromPlan(resolveRunPlan(options));
}

const RUN_MODE_LABELS = {
ship: 'ship (worktree + PR + auto-merge)',
'ship+docker': 'ship (docker + PR + auto-merge)',
Expand All @@ -19,4 +31,4 @@ function describeRunMode(mode) {
return RUN_MODE_LABELS[mode] || 'local (no isolation)';
}

module.exports = { resolveRunMode, describeRunMode };
module.exports = { resolveRunMode, runModeFromPlan, describeRunMode };
32 changes: 32 additions & 0 deletions lib/run-plan.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/**
* The single canonical run-mode resolver.
*
* Every consumer (orchestrator, daemon startup, CLI label) derives isolation,
* delivery, and autoMerge from THIS function and nowhere else. The raw
* worktree/docker/pr/ship/autoMerge booleans are inputs; the frozen plan is the
* one truth. Deriving autoMerge separately (the old `Boolean(ship)` scatter) is
* what let `--pr` merge and let the run-mode label drift from behavior.
*/

function resolveIsolation(options) {
if (options.docker) return 'docker';
if (options.worktree || options.pr || options.ship) return 'worktree';
return 'none';
}

function resolveDelivery(options) {
// Explicit autoMerge (e.g. a future `--auto-merge` flag) is ship-equivalent:
// "merge it" implies the ship delivery. This is the ONLY place that intent is
// interpreted, so it can never be silently overwritten downstream.
if (options.ship || options.autoMerge === true) return 'ship';
if (options.pr) return 'pr';
return 'none';
}

function resolveRunPlan(options = {}) {
const isolation = resolveIsolation(options);
const delivery = resolveDelivery(options);
return Object.freeze({ isolation, delivery, autoMerge: delivery === 'ship' });
}

module.exports = { resolveRunPlan };
30 changes: 22 additions & 8 deletions lib/start-cluster.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ const { normalizeProviderName } = require('./provider-names');
const { getProvider } = require('../src/providers');
const { detectProvider } = require('../src/issue-providers');
const TemplateResolver = require('../src/template-resolver');
const { resolveRunMode } = require('./run-mode');
const { runModeFromPlan } = require('./run-mode');
const { resolveRunPlan } = require('./run-plan');

const PACKAGE_ROOT = path.resolve(__dirname, '..');

Expand Down Expand Up @@ -198,8 +199,20 @@ function mergeRunOptions(options) {
return envRunOptions ? { ...envRunOptions, ...options } : options;
}

function resolveIsolation(mergedOptions, settings) {
return mergedOptions.docker || process.env.ZEROSHOT_DOCKER === '1' || settings.defaultDocker;
// The single producer of the run plan for a cluster start: fold env + settings
// into the flags, then resolve the canonical isolation/delivery/autoMerge plan.
// buildStartOptions reads EVERY mode field off this one plan — no field
// (isolation, worktree, autoPr, autoMerge, runMode) is derived independently.
function resolveEffectiveRunPlan(mergedOptions, settings) {
return resolveRunPlan({
...mergedOptions,
docker: anyTruthy(
mergedOptions.docker,
process.env.ZEROSHOT_DOCKER === '1',
settings.defaultDocker
),
worktree: anyTruthy(mergedOptions.worktree, process.env.ZEROSHOT_WORKTREE === '1'),
});
}

function resolveMergeQueue(mergedOptions) {
Expand Down Expand Up @@ -238,14 +251,15 @@ function buildStartOptions({
forceProvider,
}) {
const mergedOptions = mergeRunOptions(options);
const plan = resolveEffectiveRunPlan(mergedOptions, settings);
return {
clusterId,
cwd: resolveTargetCwd(),
isolation: resolveIsolation(mergedOptions, settings),
isolation: plan.isolation === 'docker',
isolationImage: firstTruthy(mergedOptions.dockerImage, process.env.ZEROSHOT_DOCKER_IMAGE),
worktree: anyTruthy(mergedOptions.worktree, process.env.ZEROSHOT_WORKTREE === '1'),
autoPr: anyTruthy(mergedOptions.pr, process.env.ZEROSHOT_PR === '1'),
autoMerge: Boolean(mergedOptions.ship),
worktree: plan.isolation === 'worktree',
autoPr: plan.delivery !== 'none',
autoMerge: plan.autoMerge,
autoPush: process.env.ZEROSHOT_PUSH === '1',
modelOverride: optionalValue(modelOverride),
providerOverride: optionalValue(providerOverride),
Expand All @@ -257,7 +271,7 @@ function buildStartOptions({
mergeQueue: resolveMergeQueue(mergedOptions),
closeIssue: resolveCloseIssue(mergedOptions),
ship: mergedOptions.ship,
runMode: resolveRunMode(mergedOptions) || null,
runMode: runModeFromPlan(plan),
requiredQualityGates: mergedOptions.requiredQualityGates,
settings,
};
Expand Down
6 changes: 4 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,10 @@
"pretest": "npm run build:agent-cli-provider",
"test": "node tests/run-tests.js",
"test:unit": "node tests/run-tests.js",
"test:slow": "mocha 'tests/integration/**/*.test.js' --timeout 180000",
"test:all": "npm run test && npm run test:slow",
"test:e2e": "mocha 'tests/e2e/**/*.test.js' --timeout 120000",
"test:e2e:docker": "bash tests/integration/e2e-isolation-and-auto.test.sh",
"test:slow": "mocha 'tests/integration/**/*.test.js' 'tests/providers/**/*.test.js' --timeout 180000",
"test:all": "npm run test && npm run test:e2e && npm run test:slow",
"test:coverage": "c8 npm run test:unit",
"test:coverage:report": "c8 --reporter=html npm run test:unit && echo 'Coverage report generated at coverage/index.html'",
"postinstall": "node scripts/fix-node-pty-permissions.js && node scripts/check-path.js",
Expand Down
2 changes: 2 additions & 0 deletions src/agent/agent-lifecycle.js
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,8 @@ function start(agent) {
* @returns {Promise<void>}
*/
async function stop(agent) {
stopLivenessCheck(agent);

if (!agent.running) {
return;
}
Expand Down
3 changes: 3 additions & 0 deletions src/ledger.js
Original file line number Diff line number Diff line change
Expand Up @@ -715,6 +715,9 @@ class Ledger extends EventEmitter {
* Close the database connection
*/
close() {
if (this._closed) {
return;
}
this._closed = true; // Set flag BEFORE closing to prevent race conditions
this.db.close();
}
Expand Down
Loading
Loading