Skip to content

feat: cli-agent executor — interactive CLI coding agents in tasks and chat#1446

Merged
gsxdsm merged 44 commits into
mainfrom
gsxdsm/cli-agent-interface
Jun 5, 2026
Merged

feat: cli-agent executor — interactive CLI coding agents in tasks and chat#1446
gsxdsm merged 44 commits into
mainfrom
gsxdsm/cli-agent-interface

Conversation

@gsxdsm

@gsxdsm gsxdsm commented Jun 5, 2026

Copy link
Copy Markdown
Collaborator

Summary

Adds a third task executor type, cli-agent, that runs Fusion agent sessions inside engine-owned PTYs running interactive CLI coding agents (Claude Code, Codex, Droid, Pi). The engine injects prompts, tracks agent state through each CLI's native telemetry (Orca-style hooks), captures native session IDs for resume, and drives the full task pipeline — while users co-drive through live terminals on the dashboard, mobile, and TUI. Chat gains a CLI-backed hybrid-transcript mode.

Gated behind experimentalFeatures.cliAgentExecutor (default OFF); the subsystem is inert until enabled.

Origin: docs/brainstorms/2026-06-04-cli-executor-requirements.md · Plan: docs/plans/2026-06-04-002-feat-cli-agent-executor-plan.md

What's included (Implementation Units U1–U17)

  • Engine core: shared node-pty loader (U16), cli_sessions schema v109 + store (U1), CliSessionManager + adapter interface with injection FIFO / concurrency pool / scoped-SIGKILL teardown (U2), telemetry hub + session state machine with termination taxonomy and stall backstop (U3).
  • Adapters: Claude Code native tier (U4, verified against claude 2.1.165), Codex hybrid / Droid / Pi (U5, binaries probed), generic heuristic tier (U6).
  • Pipeline: executor seam + task-session lifecycle with hard-cancel integration (U7), resume coordinator + self-healing integration (U8), one-shot validator/planning/CE sessions (U9).
  • Transport & surfaces: WS attach with single-use tickets + Origin allowlist + ACK flow control + output-escape neutralization (U10/U17), dashboard terminal UI + task-card states (U11), hybrid chat transcript (U12), mobile input bar (U13), TUI passthrough (U14).
  • Config: adapter settings + autonomy approval gate over resolved argv+env (U15).
  • Bootstrap: per-project runtime wiring all seams behind the flag.

Testing

  • ~700+ new tests across core/engine/dashboard/cli; all four packages typecheck clean.
  • Engine cli-agent suite: 255 tests green. Migration suite green (schema 108→110).
  • Tier-2 multi-agent code review run; 7 findings fixed (P1 schema-version gate, output-filter cross-boundary escape bypass, generic double-wrap, follow-up resolution, + migration test/fingerprint). Security/API-contract/standards reviews clean.

Known Residuals

  • Resume relaunch may not re-thread hook-script launch settings on resumed sessions (correctness, confidence ~60) — telemetry could be thin after an engine-restart resume until reattach; feature is flag-off so no production exposure.
  • WS per-connection flow-control pause/resume acts on the shared PTY — a slow client can transiently affect others' backpressure (reliability, not data loss).

Post-Deploy Monitoring & Validation

No additional operational monitoring required for merge — the feature ships flag-off (experimentalFeatures.cliAgentExecutor). When enabling in an environment: watch engine logs for cli-agent session spawn/resume errors and needsAttention transitions, confirm no orphaned PTY processes after engine restart, and verify port 4040 is never targeted by session teardown.

🤖 Generated with Claude Code

Before merge

  • Remove .coderabbit.yaml (temporary review-scope config; must not land on main).

gsxdsm and others added 30 commits June 4, 2026 22:52
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…s (U16)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Engine-owned PTY lifecycle for CLI agent sessions:
- adapter.ts: CliAgentAdapter interface (launch/env-allowlist builders,
  capability flags, readiness detection, injection formatter, resume builder,
  telemetry wiring) + CliAdapterRegistry with typed unknown/duplicate errors.
- session-manager.ts: CliSessionManager owning node-pty processes via the U16
  shared loader. Byte-bounded scrollback ring (default ~512KB), single
  serialized write queue shared by injections + user input (FIFO, deferral in
  quiet windows), latest-active-client resize, scoped-SIGKILL process registry
  on process exit (never port 4040), explicit async attach interface
  (scrollback + AsyncIterable<Uint8Array> + write/resize/detach),
  requestPause/requestResume watermark hooks, separate concurrency pool with
  typed CliConcurrencyLimitError at the ceiling.
- Security: bracketed paste only when ?2004h observed; unconditional control-char
  neutralization on the raw path; user keystrokes bypass neutralization.
- Persists lifecycle into the U1 CliSessionStore (create on spawn, update
  state/termination).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Pure engine code (no HTTP) for the CLI agent executor:

- state-machine.ts: authoritative per-session state machine implementing the
  HTD diagram (starting→ready→busy⇄waitingOnInput→done; done→busy follow-up;
  dead-classification choice → killed/userExited/authFailed/resuming; resume cap
  of 2 with backoff → needsAttention). Positive completion is distinct from idle
  (idle never produces done); inactivity stall backstop re-armed by output/
  telemetry events (no fixed turn timeout); termination classification helper for
  all five paths; per-turn latches reset between turns. Persists every transition
  via CliSessionStore (the transient `resuming` machine state maps onto the U1
  `dead` store enum) and exposes a throttled `onStateChange` subscription for the
  later SSE bridge — no dashboard imports.

- telemetry-hub.ts: in-process ingestion contract (ingest(sessionId, event)) for
  the U17 route and log-tailing adapters. Mints high-entropy per-session hook
  tokens (issueToken/validateToken/invalidate); rebuilds the registry only from
  live sessions in CliSessionStore so stale tokens for non-live sessions never
  validate; a token validates only for its own session. Bounds everything
  ingested: per-event size caps, per-turn count caps (lifecycle events exempt),
  ANSI/control stripping before pattern matching, and secret redaction that
  survives chunk boundaries via a held-back carry window (redactSecrets from
  @fusion/core).

Tests: 35 new (state-machine.test.ts, telemetry-hub.test.ts) covering AE1/AE2,
stall backstop, all termination paths, resume caps, token registry, two-turn
latch reset, oversized capping, ANSI stripping, and cross-chunk redaction.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…scripts (U17)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…E state, output hardening (U10)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…, output hardening)

# Conflicts:
#	packages/engine/src/index.ts
Suspend-and-handoff passthrough from the Ink TUI to a cli-agent PTY session:
mint an attach ticket, open the cli-session WebSocket, enter the alternate
screen + raw mode, stream WS scrollback/data frames to stdout, frame stdin
bytes into input messages, propagate resizes, and ACK consumed bytes for flow
control. Detach chord Ctrl-] restores the terminal and remounts Ink; a dropped
WS surfaces the error and restores the terminal cleanly.

Untrusted terminal output is neutralized through the same hardening filter the
dashboard WS bridge uses (re-exported from @fusion/dashboard) so OSC 52, non-
http(s) OSC 8 links, and device-status queries are stripped before reaching the
host TTY — the riskiest leg, since the host terminal honors more sequences than
xterm.js. CJK/double-width bytes pass through verbatim.

- packages/cli/src/commands/dashboard-tui/terminal-attach.ts (passthrough loop +
  injectable WS transport for tests)
- controller.openTerminalAttach() Ink integration (unmount/run/remount)
- adds `ws` runtime dep to packages/cli
- re-exports neutralizeTerminalOutput/flushTerminalOutput from @fusion/dashboard

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Codex (hybrid tier): native done via session-scoped notify config,
heuristic PTY waiting detection, codex resume <thread-id>, probed rollout
JSONL tailer. Droid (native tier): Claude-style hooks with a Notification
permission-vs-idle classifier, --resume / exec -s resume (never -r in exec
mode). Pi (native tier): session-JSONL telemetry + transcript tailing,
pi --session resume. Adds the session-jsonl transcript source.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… (U7)

Add `cli-agent` as a task-execute executor kind. A workflow node with
`config.executor === "cli-agent"` drives an engine-owned CLI coding agent
through the execute step via the new cli-agent/task-session.ts orchestration:
spawn in the worktree, issue the hook token + write hook scripts, inject the
prompt after readiness, subscribe to the state machine, and resolve on a
positive completion signal (R20 gating). Config is snapshotted at launch; the
PTY is reaped (completed) at the in-review handoff.

Executor seam: runGraphCustomNode gains a cli-agent branch delegating to
runCliAgentNode; the hard-cancel/abort path (awaitAbortInFlightTaskWork +
abortAllInFlight) claims and SIGKILLs the CLI session as a first-class surface,
marking it killed (never resume-eligible). Re-entry kills any prior live
session and launches fresh; follow-up resumes the recorded native session id
when supported. A PTY-pool ceiling surfaces as a typed task value, not a stall.

Node-config typing extended minimally (WorkflowNodeExecutorKind /
WorkflowNodeExecutorConfig in @fusion/core).

Tests: cli-agent/__tests__/task-session.test.ts (12) and
__tests__/cli-agent-executor.test.ts (9) cover AE1/AE5, hard cancel, re-entry,
follow-up, config snapshot, ceiling, and the generic-tier confirm-advance path,
using scripted adapters + a mock PTY seam. Engine typecheck clean; full
src/cli-agent suite + new tests green (144 passing).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…d CE (U9)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…on (U8)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…itor config (U15)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ation banner support (U11)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… keys (U13)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…oggle (U12)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
gsxdsm and others added 4 commits June 5, 2026 03:02
…le engine mocks (U12 completion)

Mount CliChatSurface in ChatView for cli-backed chat sessions (sessions carrying
cliExecutorAdapterId): the message-pane + composer region is delegated to the
surface (transcript/raw-terminal toggle for hybrid/native adapters, terminal-only
for the generic adapter), while regular sessions keep the standard composer. The
existing message list and composer JSX are captured once as render thunks and
passed through, so there is no parallel message/composer UI.

Add a narrow telemetry seam: TelemetryHub gains an optional onEvent tap (also
settable post-construction via setEventListener) invoked with each sanitized
event after routing — best-effort, a throwing listener never breaks ingest. This
is the seam the CliChatSessionRunner uses to build the durable transcript from
the same sanitized events the hook route already feeds the hub, without the hub
becoming a general subscriber bus.

Fix the stale @fusion/engine vi.mocks across dashboard tests: object-literal
mocks that fully replace the module now also return listCliAdapterDescriptors
(added by U15's cli-agent-settings route, evaluated at module load). Mocks that
spread importOriginal/importActual already pick it up.

Tests: new ChatView.cli-mount.test.tsx (cli session → CliChatSurface, regular
session → normal composer, generic → terminal-only); telemetry-hub onEvent tap
coverage. chat-attachment-routes, chat-cli-sessions, cli-agent-hooks-route,
ChatView.cli-toggle all green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… and recovery seams

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…c double-wrap, follow-up resolution

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Too many files!

This PR contains 169 files, which is 19 over the limit of 150.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 3a6059bd-c4b6-4a61-85e3-e33c4763ed73

📥 Commits

Reviewing files that changed from the base of the PR and between 7d69691 and 995765b.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (169)
  • .changeset/cli-agent-codex-droid-pi-adapters.md
  • .changeset/cli-agent-executor-seam.md
  • .changeset/cli-agent-generic-adapter.md
  • .changeset/cli-agent-hook-ingestion.md
  • .changeset/cli-agent-hybrid-chat.md
  • .changeset/cli-agent-mobile-terminal-input.md
  • .changeset/cli-agent-one-shot-sessions.md
  • .changeset/cli-agent-resume-coordinator.md
  • .changeset/cli-agent-review-fixes.md
  • .changeset/cli-agent-runtime-bootstrap.md
  • .changeset/cli-agent-session-transport.md
  • .changeset/cli-agent-settings-autonomy-gate.md
  • .changeset/cli-agent-terminal-ui.md
  • .changeset/cli-agent-tui-attach.md
  • .coderabbit.yaml
  • CONCEPTS.md
  • docs/brainstorms/2026-06-04-cli-executor-requirements.md
  • docs/plans/2026-06-04-002-feat-cli-agent-executor-plan.md
  • docs/solutions/database-issues/schema-version-constant-must-equal-highest-migration.md
  • packages/cli/package.json
  • packages/cli/src/commands/__tests__/dashboard.test.ts
  • packages/cli/src/commands/dashboard-tui/__tests__/terminal-attach.test.ts
  • packages/cli/src/commands/dashboard-tui/controller.ts
  • packages/cli/src/commands/dashboard-tui/terminal-attach.ts
  • packages/cli/src/commands/dashboard.ts
  • packages/core/src/__tests__/cli-session-store.test.ts
  • packages/core/src/__tests__/db-migrate.test.ts
  • packages/core/src/__tests__/db.test.ts
  • packages/core/src/__tests__/global-settings-cli-agents.test.ts
  • packages/core/src/__tests__/goals-schema.test.ts
  • packages/core/src/__tests__/insight-store.test.ts
  • packages/core/src/__tests__/merge-request-record.test.ts
  • packages/core/src/__tests__/mission-store.test.ts
  • packages/core/src/__tests__/redact-secrets.test.ts
  • packages/core/src/__tests__/run-audit.test.ts
  • packages/core/src/__tests__/store-merge-queue.test.ts
  • packages/core/src/__tests__/task-documents.test.ts
  • packages/core/src/chat-store.ts
  • packages/core/src/chat-types.ts
  • packages/core/src/cli-session-store.ts
  • packages/core/src/cli-session-types.ts
  • packages/core/src/db.ts
  • packages/core/src/global-settings.ts
  • packages/core/src/index.ts
  • packages/core/src/redact-secrets.ts
  • packages/core/src/settings-schema.ts
  • packages/core/src/store.ts
  • packages/core/src/types.ts
  • packages/core/src/workflow-ir-types.ts
  • packages/dashboard/app/api/legacy.ts
  • packages/dashboard/app/components/BackgroundTasksIndicator.tsx
  • packages/dashboard/app/components/ChatView.tsx
  • packages/dashboard/app/components/CliChatSurface.tsx
  • packages/dashboard/app/components/SessionNotificationBanner.tsx
  • packages/dashboard/app/components/SessionTerminal.css
  • packages/dashboard/app/components/SessionTerminal.tsx
  • packages/dashboard/app/components/SettingsModal.tsx
  • packages/dashboard/app/components/TaskCard.tsx
  • packages/dashboard/app/components/TaskDetailModal.tsx
  • packages/dashboard/app/components/WorkflowNodeEditor.tsx
  • packages/dashboard/app/components/__tests__/ChatView.cli-mount.test.tsx
  • packages/dashboard/app/components/__tests__/ChatView.cli-toggle.test.tsx
  • packages/dashboard/app/components/__tests__/ListView.test.tsx
  • packages/dashboard/app/components/__tests__/SessionNotificationBanner.test.tsx
  • packages/dashboard/app/components/__tests__/SessionTerminal.mobile.test.tsx
  • packages/dashboard/app/components/__tests__/SessionTerminal.test.tsx
  • packages/dashboard/app/components/__tests__/TaskCard.cli-states.test.tsx
  • packages/dashboard/app/components/__tests__/TaskDetailModal.terminal-tab.test.tsx
  • packages/dashboard/app/components/__tests__/WorkflowNodeEditor.cli-agent.test.tsx
  • packages/dashboard/app/hooks/useChat.ts
  • packages/dashboard/package.json
  • packages/dashboard/src/__tests__/agent-onboarding.test.ts
  • packages/dashboard/src/__tests__/ai-refine.test.ts
  • packages/dashboard/src/__tests__/chat-attachment-routes.test.ts
  • packages/dashboard/src/__tests__/chat-cli-sessions.test.ts
  • packages/dashboard/src/__tests__/chat-manager-cli-send.test.ts
  • packages/dashboard/src/__tests__/cli-agent-runtime-wiring.test.ts
  • packages/dashboard/src/__tests__/cli-session-output-filter.test.ts
  • packages/dashboard/src/__tests__/cli-session-ws.test.ts
  • packages/dashboard/src/__tests__/cli-sessions-routes.test.ts
  • packages/dashboard/src/__tests__/experiment-routes.finalize.test.ts
  • packages/dashboard/src/__tests__/milestone-slice-interview.test.ts
  • packages/dashboard/src/__tests__/mission-interview.test.ts
  • packages/dashboard/src/__tests__/pr-metadata-generator.test.ts
  • packages/dashboard/src/__tests__/project-pause-resume-routes.test.ts
  • packages/dashboard/src/__tests__/routes-approval-sandbox-provisioning.test.ts
  • packages/dashboard/src/__tests__/routes-approval-secrets.test.ts
  • packages/dashboard/src/__tests__/routes-approval.test.ts
  • packages/dashboard/src/__tests__/routes-worktrunk.test.ts
  • packages/dashboard/src/__tests__/session-error-recovery.test.ts
  • packages/dashboard/src/__tests__/session-persistence-roundtrip.test.ts
  • packages/dashboard/src/__tests__/session-reconnect.test.ts
  • packages/dashboard/src/__tests__/session-resume-history.test.ts
  • packages/dashboard/src/__tests__/setup-routes.test.ts
  • packages/dashboard/src/__tests__/subtask-breakdown.test.ts
  • packages/dashboard/src/auth-middleware.ts
  • packages/dashboard/src/chat.ts
  • packages/dashboard/src/cli-chat.ts
  • packages/dashboard/src/cli-session-output-filter.ts
  • packages/dashboard/src/cli-session-transport.ts
  • packages/dashboard/src/cli-session-ws.ts
  • packages/dashboard/src/index.ts
  • packages/dashboard/src/routes.ts
  • packages/dashboard/src/routes/__tests__/agent-avatar-routes.test.ts
  • packages/dashboard/src/routes/__tests__/cli-agent-hooks-route.test.ts
  • packages/dashboard/src/routes/__tests__/cli-agent-settings-route.test.ts
  • packages/dashboard/src/routes/__tests__/custom-providers.test.ts
  • packages/dashboard/src/routes/__tests__/docker-node-routes.test.ts
  • packages/dashboard/src/routes/cli-agent-hooks.ts
  • packages/dashboard/src/routes/cli-agent-settings.ts
  • packages/dashboard/src/routes/cli-sessions.ts
  • packages/dashboard/src/server.ts
  • packages/dashboard/src/sse.ts
  • packages/dashboard/src/terminal-service.ts
  • packages/engine/package.json
  • packages/engine/src/__tests__/cli-agent-executor.test.ts
  • packages/engine/src/__tests__/cli-agent-validator.test.ts
  • packages/engine/src/__tests__/interactive-ai-session.test.ts
  • packages/engine/src/__tests__/pty-native.test.ts
  • packages/engine/src/__tests__/self-healing-cli-sessions.test.ts
  • packages/engine/src/cli-agent-validator.ts
  • packages/engine/src/cli-agent/__tests__/adapter-registry.test.ts
  • packages/engine/src/cli-agent/__tests__/autonomy.test.ts
  • packages/engine/src/cli-agent/__tests__/hook-scripts.test.ts
  • packages/engine/src/cli-agent/__tests__/one-shot-session.test.ts
  • packages/engine/src/cli-agent/__tests__/resume-coordinator.test.ts
  • packages/engine/src/cli-agent/__tests__/runtime.test.ts
  • packages/engine/src/cli-agent/__tests__/session-manager.test.ts
  • packages/engine/src/cli-agent/__tests__/state-machine.test.ts
  • packages/engine/src/cli-agent/__tests__/task-session.test.ts
  • packages/engine/src/cli-agent/__tests__/telemetry-hub.test.ts
  • packages/engine/src/cli-agent/adapter.ts
  • packages/engine/src/cli-agent/adapters/__tests__/claude-code.test.ts
  • packages/engine/src/cli-agent/adapters/__tests__/codex.test.ts
  • packages/engine/src/cli-agent/adapters/__tests__/droid.test.ts
  • packages/engine/src/cli-agent/adapters/__tests__/generic.test.ts
  • packages/engine/src/cli-agent/adapters/__tests__/pi.test.ts
  • packages/engine/src/cli-agent/adapters/claude-code.ts
  • packages/engine/src/cli-agent/adapters/codex.ts
  • packages/engine/src/cli-agent/adapters/droid.ts
  • packages/engine/src/cli-agent/adapters/generic.ts
  • packages/engine/src/cli-agent/adapters/index.ts
  • packages/engine/src/cli-agent/adapters/pi.ts
  • packages/engine/src/cli-agent/autonomy.ts
  • packages/engine/src/cli-agent/hook-scripts.ts
  • packages/engine/src/cli-agent/one-shot-session.ts
  • packages/engine/src/cli-agent/resume-coordinator.ts
  • packages/engine/src/cli-agent/runtime.ts
  • packages/engine/src/cli-agent/session-manager.ts
  • packages/engine/src/cli-agent/state-machine.ts
  • packages/engine/src/cli-agent/task-session.ts
  • packages/engine/src/cli-agent/telemetry-hub.ts
  • packages/engine/src/executor.ts
  • packages/engine/src/index.ts
  • packages/engine/src/interactive-ai-session.ts
  • packages/engine/src/project-engine.ts
  • packages/engine/src/project-runtime.ts
  • packages/engine/src/pty-native.ts
  • packages/engine/src/runtimes/in-process-runtime.ts
  • packages/engine/src/self-healing.ts
  • packages/engine/src/stuck-task-detector.ts
  • packages/engine/src/types/node-pty/index.d.ts
  • packages/engine/tsconfig.json
  • packages/i18n/locales/en/app.json
  • plugins/fusion-plugin-acp-runtime/package.json
  • plugins/fusion-plugin-acp-runtime/src/process-manager.ts
  • plugins/fusion-plugin-compound-engineering/src/__tests__/orchestrator-executor-seam.test.ts
  • plugins/fusion-plugin-compound-engineering/src/session/orchestrator.ts
  • plugins/fusion-plugin-roadmap/src/store/__tests__/roadmap-store.test.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch gsxdsm/cli-agent-interface

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

gsxdsm and others added 4 commits June 5, 2026 03:56
The cli-agent executor feature added engine.getCliAgentRuntime() (called by
the CLI dashboard command at load) and bumped @fusion/core SCHEMA_VERSION
108→110. Update the stale test stubs:

- cli dashboard.test.ts: add getCliAgentRuntime() to the mock FnAgent class
  (returns undefined; runDashboard handles the no-runtime path). Fixes 52
  failures all rooted at `cwdEngine?.getCliAgentRuntime is not a function`.
- roadmap-store.test.ts: the roadmap store layers on core's Database, so its
  schema version tracks core; assert 110 instead of 108.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- TaskFieldsSection.css: restore the toggle knob fill to the themed
  var(--card) token (was hardcoded to #fff on this branch), which the
  AgentListModal theme-token guard scans all app CSS for and rejects.
- ListView.test.tsx: add fetchBoardWorkflows + api to the ../../api mock;
  TaskDetailModal (rendered via the embedded detail) now calls both at mount
  for board workflows and the cli-sessions lookup, so the object-literal mock
  must provide them ("No X export is defined on the ../../api mock").
- auto-merge-toggle-blank.mobile.test.tsx / board-mobile-initial-render.test.tsx:
  revert the runOnlyPendingTimers→runAllTimers change; with the installed rAF
  shim that re-schedules itself, runAllTimers loops forever and trips vitest's
  10000-timer infinite-loop abort.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@gsxdsm

gsxdsm commented Jun 5, 2026

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

…fore merge)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@gsxdsm

gsxdsm commented Jun 5, 2026

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@gsxdsm

gsxdsm commented Jun 5, 2026

Copy link
Copy Markdown
Collaborator Author

@coderabbitai full review

@coderabbitai

coderabbitai Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Full review finished.

gsxdsm and others added 5 commits June 5, 2026 14:23
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…rface

# Conflicts:
#	packages/dashboard/app/components/__tests__/ListView.test.tsx
…rface

# Conflicts:
#	CONCEPTS.md
#	packages/core/src/__tests__/db-migrate.test.ts
#	packages/core/src/__tests__/db.test.ts
#	packages/core/src/__tests__/goals-schema.test.ts
#	packages/core/src/__tests__/insight-store.test.ts
#	packages/core/src/__tests__/merge-request-record.test.ts
#	packages/core/src/__tests__/mission-store.test.ts
#	packages/core/src/__tests__/run-audit.test.ts
#	packages/core/src/__tests__/store-merge-queue.test.ts
#	packages/core/src/__tests__/task-documents.test.ts
#	packages/core/src/db.ts
#	packages/dashboard/src/__tests__/agent-onboarding.test.ts
#	packages/dashboard/src/__tests__/ai-refine.test.ts
#	packages/dashboard/src/__tests__/chat-attachment-routes.test.ts
#	packages/dashboard/src/__tests__/experiment-routes.finalize.test.ts
#	packages/dashboard/src/__tests__/milestone-slice-interview.test.ts
#	packages/dashboard/src/__tests__/mission-interview.test.ts
#	packages/dashboard/src/__tests__/pr-metadata-generator.test.ts
#	packages/dashboard/src/__tests__/project-pause-resume-routes.test.ts
#	packages/dashboard/src/__tests__/routes-approval-sandbox-provisioning.test.ts
#	packages/dashboard/src/__tests__/routes-approval-secrets.test.ts
#	packages/dashboard/src/__tests__/routes-approval.test.ts
#	packages/dashboard/src/__tests__/routes-worktrunk.test.ts
#	packages/dashboard/src/__tests__/session-error-recovery.test.ts
#	packages/dashboard/src/__tests__/session-persistence-roundtrip.test.ts
#	packages/dashboard/src/__tests__/session-reconnect.test.ts
#	packages/dashboard/src/__tests__/session-resume-history.test.ts
#	packages/dashboard/src/__tests__/setup-routes.test.ts
#	packages/dashboard/src/__tests__/subtask-breakdown.test.ts
#	packages/dashboard/src/routes/__tests__/agent-avatar-routes.test.ts
#	packages/dashboard/src/routes/__tests__/custom-providers.test.ts
#	packages/dashboard/src/routes/__tests__/docker-node-routes.test.ts
#	packages/i18n/locales/en/app.json
#	plugins/fusion-plugin-roadmap/src/store/__tests__/roadmap-store.test.ts
@gsxdsm
gsxdsm merged commit 0fdf60a into main Jun 5, 2026
5 checks passed
@gsxdsm
gsxdsm deleted the gsxdsm/cli-agent-interface branch June 5, 2026 22:41
gsxdsm added a commit that referenced this pull request Jun 5, 2026
…migration to 112 behind main's cli_sessions(110)/adapter(111), full-workspace literal sweep, i18n union
shaneholloman pushed a commit to shaneholloman/fusion that referenced this pull request Jun 10, 2026
The .coderabbit.yaml added to PR Runfusion#1446 was a temporary review-scoping
config (excludes tests/docs/locales to fit CodeRabbit's file cap). It was
meant to be dropped before merge but leaked onto main when Runfusion#1446 merged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant