v0.6.0 — board-sync, daemon-detach, tray diagnostics, chat UI cleanup
Highlights
Single-store / dual-API board sync
ok task add now POSTs to the local dashboard with the new tsk-* id as clientId so the task appears on the board at http://127.0.0.1:7777/ immediately. When the dashboard is offline, ok task add falls back to writing .ok/board.json directly; the boot-time reconciler promotes any pending offline entries onto the board on the next server start, idempotent by clientId. apiCreateTask accepts clientId and refuses to create duplicates when a board task already carries that id (new optional offlineMirrorId?: string field). ok task claim, ok task heartbeat, and ok task complete now PATCH the matching board task, not just the offline cache, so agent leases are visible to operators on the dashboard.
Daemon-detach fix
ok serve --mode=background (and ok start --mode=background) no longer leaves the CLI attached to the controlling terminal. The v0.5.1 fix only unref'd stdio, which kept the HTTP listener's event-loop handle alive and the terminal never returned. v0.6.0 spawns a detached child running --mode=foreground (which binds the port), waits for HTTP to respond, writes pid:port to the pidfile, prints the startup message, and exits 0. The detached child owns the HTTP listener; ok stop SIGTERMs the child PID. On Windows, windowsHide: true suppresses the detached child's console window.
Tray diagnostics
bin/tray.ts now captures the underlying error from every failure mode (node-systray import failure, constructor failure, early-exit failure) and surfaces it verbatim instead of collapsing to a generic "libappindicator missing on Linux" message. The fallback reporter in ok serve / ok start prints a platform-aware install hint: apt install libappindicator3-1 on Debian/Ubuntu, dnf install libappindicator-gtk3 on Fedora, a macOS Go-binary check on Darwin, and a reinstall hint when the bundled bin/assets/tray/ icons are missing. 16 test cases cover every failure mode end-to-end.
Chat top-bar cleanup
Chat top bar trimmed to a single 44px row: conversation title and a keyboard-accessible overflow menu (⋯). Project, Files, Plugins, Chat sessions, and Get desktop app live behind the menu (each wired to the existing openTab() routing). The legacy Project/Files/Plugins tab row is hidden via CSS rather than deleted so the overflow menu continues to work. No new npm dependencies. Keyboard flow: Tab reaches overflow trigger (aria-haspopup=true), Enter/Space opens, Tab/Shift+Tab cycles items, Escape returns focus.
Other changes
ok board delete <id>— new subcommand that callsDELETE /api/tasks/<id>. Replaces the previous need to issue rawDELETEHTTP calls when an operator needed to clean up an accidental duplicate.- SessionStart hint now reads: "OpenKan ready. Create work with
ok task add— visible on the board at the dashboard URL."
Verification
npm run typecheckclean.npm run check(sanity): 0 errors, 0 warnings.tests/tray-error-reporting.test.mts: 16/16 pass.tests/serve-background-keepalive.test.mts: 2/2 pass.tests/chat-tabs-row.test.mts: 8/8 pass.tests/ok-cli-task-reconcile.test.mts: server-up / server-down / reconciler idempotency / duplicate-POST / move coverage.- Pre-existing
tests/watcher.test.mtstiming flakes (~13 cases) and two outdated regex expectations intests/serve-cli.test.mjsare unchanged from v0.5.1 baseline; tracked separately.
Full diff: v0.5.1...v0.6.0