Skip to content

Releases: ridingbytes/kaisho

v2.5.2

10 Jun 06:13
90a04b1

Choose a tag to compare

Adds the kanban-scheduling feature (snooze a task until a future date, see a deadline cue when it's close) and lands a cluster of correctness fixes from the post-feature code review — most of them touching the cloud-sync path where v2.5.1 left small gaps.

Kanban scheduling

  • Snooze + deadline data model across all four backends (org, markdown, sql, json) and the cloud wire format. SQL ships an idempotent ALTER TABLE so existing databases pick up the new columns on next open. [#159]
  • Snooze UI: scheduled tasks drop off the board until the day arrives, then return with a small alarm-clock badge top-left; clicking acknowledges and clears the snooze. A toolbar pill lists snoozed tasks with one-click Wake. Deadlines within three days (or overdue) get a separate bell badge, per-device-acknowledgeable so the underlying date stays on the task. [#161]
  • CLI + MCP parity: kai task add / kai task update accept --scheduled / --deadline. task list shows both inline. The API rejects deadline < scheduled and the edit form gates the Save button. [#163]
  • Per-column collapse replaces the global "Show done" toggle. Each column has its own chevron; collapsed columns shrink to a narrow strip with a rotated label, the choice persists per profile. [#157]
  • Done flag goes load-bearing. The badge in Settings → Task States now toggles whether the state counts as completed. The kanban's tick icon moves a task to the first state flagged done; if none is flagged, the tick disappears entirely so deleting the DONE column can't silently orphan tasks. [#166]

Cloud-sync correctness

  • Cloud-WS data-change events now wake the kanban path correctly. Periodic poller broadcasts the right kanban resource key (was sending tasks, which the frontend silently no-op'd). Closes #150. [#162]
  • scheduled / deadline no longer get clobbered by a cloud-pull update whose wire payload omits them (legacy peer, PWA, iOS on an older build). [#164]
  • PAUSED-on-pull clear is now scoped to events that actually touched the entry's timing. Editing notes on the iPhone for a paused entry no longer wipes the local pause flag on desktop. [#164]
  • JSON backend normalises legacy task dicts so scheduled / deadline always come back as None (matching SQL and markdown). [#164]
  • Broadcast plumbing tightened: BROADCAST_RESOURCES constant, per-iteration try/except, tz-aware next_run_time, drop the redundant WS pending-set. Snooze filter + deadline badge use local-time today so users in negative-UTC timezones no longer see snoozes expire / deadlines fire a day off. [#165]

Smaller things

  • Task body textarea on the edit form is vertically resizable now. [#160]
  • What's New dialog skips the staged ## Unreleased section in CHANGELOG.md and splits top-level bullets into separate items so each renders with one dot instead of two. [#158]

v2.5.1

09 Jun 09:50
8840df0

Choose a tag to compare

Fixes a cluster of cloud-sync edge cases that left the desktop showing stale paused / running / merge state whenever another device (PWA, iOS) made a change. Plus two dev-loop fixes that landed alongside.

Cloud sync

  • Clear the desktop-local PAUSED flag on every cloud-origin pull. PAUSED is a desktop-only UI affordance that never crosses the wire, so a paused entry that another device has since resumed or stopped used to stay marked paused locally — the running-timer card kept offering "Resume" for an entry the cloud thought was finished. [#156]

  • Run the cloud sync once at startup instead of waiting a full five minutes for the first interval tick. A fresh app launch now reconciles with the cloud immediately, so a timer running on another device shows up in the desktop's running-timer card right after boot. [#155]

  • Pull from the cloud when a timer:started arrives over the cloud WebSocket. The map previously only triggered a sync on timer:stopped, so a timer started or resumed on another device only fired the immediate clocks broadcast — the desktop frontend invalidated its query and re-read the same pre-start local state, leaving the running-timer card empty until the 5-minute poller caught up. [#154]

  • Record a cloud tombstone when merging two clock entries so the deletion of the merged-away entry propagates to other devices. Before, the merge router only dropped the source from CalDAV — the surviving entry's update was pushed but the deletion never was, so the PWA and iOS kept showing both originals plus the merged result. [#151]

  • Refresh the desktop UI when the cloud broadcasts entries:changed, entries:deleted, inbox:changed, tasks:changed, or notes:changed. The sidecar already pulled the new rows into local SQL but never told the React frontend to invalidate its queries. Closes #148. [#149]

Robustness

  • Fix a FileNotFoundError crash in write_org_file when two writers raced on the same org file (e.g. a kanban list request that backfilled TASK_ID / SYNC_ID while the background cloud sync was also writing). Each writer now gets a unique tempfile.mkstemp scratch. Same fix applied to kb_index.save_index. [#153]

Dev loop

  • Strip duplicate newlines and re-split bursts when piping kai-server output in bin/dev --desktop so Python tracebacks render with one [kai]-prefixed line per frame instead of a single squashed blob with a blank line between every entry. [#152]

v2.5.0

08 Jun 21:51
d95bf27

Choose a tag to compare

Expose the MCP HTTP allow-tier in Settings so write and destructive tools can be enabled without editing the stdio CLI flags [#147]

Before 2.5.0 the HTTP MCP transport mounted by kai serve was hard-wired to allow="read". Stdio users could pick a tier with kai mcp-server --allow ..., but HTTP clients (the default Claude Desktop / Claude Code / Cursor setup the integration panel hands out) saw only the read-only tool surface and had no way to widen it without editing source.

A new Permissions selector in Settings → Integrations → Local MCP server persists the chosen tier as a flag file at ~/.kaisho/mcp-allow (mirroring the existing mcp-disabled pattern, so the desktop app, a shell user, and a deploy script can all set it without parsing YAML):

  • read — query tools only (default after install).
  • write — adds add_task, start_clock, book_time, add_note, and the rest of the create / update tools.
  • destructive — also adds delete_* and rename_profile.

The default stays at read so an upgrade never silently widens what a remote client can drive with the bearer token.

Restart-aware UI. FastMCP registers the tool list once at startup, so changing the tier requires restarting kai serve (or the desktop app). The panel detects when the on-disk preference has diverged from the live tier and surfaces an inline "restart required" hint until the running server catches up.

Kaisho v2.4.1

04 Jun 13:14
4c13f7c

Choose a tag to compare

See CHANGELOG.md for details.

Kaisho v2.4.0

04 Jun 09:28
82c2ca1

Choose a tag to compare

See CHANGELOG.md for details.

Kaisho v2.3.2

03 Jun 21:30
a241578

Choose a tag to compare

See CHANGELOG.md for details.

Kaisho v2.3.1

03 Jun 16:59
c411237

Choose a tag to compare

See CHANGELOG.md for details.

Kaisho v2.3.0

03 Jun 15:26
d6b2ff7

Choose a tag to compare

See CHANGELOG.md for details.

Kaisho v2.2.5

03 Jun 10:37
0e403e7

Choose a tag to compare

See CHANGELOG.md for details.

Kaisho v2.2.4

02 Jun 10:01
09c7285

Choose a tag to compare

See CHANGELOG.md for details.