Brooklyn Nicholson
3150e444b2
feat(kanban): export and import a whole board as a portable archive
...
`hermes kanban boards export|import` moves a board between machines:
tasks, comments, links, history, and attachments in one .tar.gz.
Two things make this more than a tar of the board directory. The
database is live — kanban runs in WAL mode, so a filesystem copy loses
whatever still sits in the -wal sidecar and tears if the dispatcher
commits mid-copy; export goes through SQLite's online-backup API
instead. And rows carry machine-local state: claims, worker PIDs,
absolute workspace and attachment paths, session ids, and the gateway
chat ids subscribed to task events. Shipping those verbatim is how an
imported board arrives holding a claim owned by a process on someone
else's laptop, or starts pushing task events into a stranger's Telegram
thread. Everything machine-local is stripped on export and re-stripped
on import, since an archive is untrusted input.
Imports always land as a NEW board, auto-suffixing the slug on
collision, so an import can never merge into or overwrite a board that
is already there. Tasks whose workspace was a directory or git worktree
on the source machine are parked in triage rather than left for the
dispatcher to claim and burn into the failure breaker.
2026-08-28 22:38:01 -05:00
..
2026-08-27 11:50:05 -05:00
2026-08-22 23:25:29 -07:00
2026-08-23 20:00:53 -07:00
2026-08-24 03:22:57 -07:00
2026-08-22 23:25:43 -07:00
2026-08-21 13:01:35 -07:00
2026-08-26 06:28:43 -07:00
2026-08-22 19:30:10 -07:00
2026-08-26 19:25:33 -07:00
2026-08-28 02:59:17 -07:00
2026-08-21 15:23:51 -07:00
2026-08-24 15:42:58 +05:30
2026-08-26 11:41:04 -07:00
2026-08-26 11:41:04 -07:00
2026-08-28 13:33:56 -04:00
2026-08-23 02:14:35 -07:00
2026-08-27 22:05:40 -05:00
2026-08-20 04:08:57 -07:00
2026-08-22 02:25:12 -04:00
2026-08-27 11:49:58 +05:30
2026-08-27 14:02:06 +05:30
2026-08-27 13:27:24 +05:30
2026-08-23 21:12:20 -07:00
2026-08-23 21:12:20 -07:00
2026-08-24 15:45:52 +05:30
2026-08-20 20:21:12 -07:00
2026-08-27 10:35:22 -07:00
2026-08-23 16:09:14 -07:00
2026-08-23 15:49:44 -07:00
2026-08-21 22:33:45 +05:30
2026-08-26 07:57:04 -07:00
2026-08-26 04:03:21 -07:00
2026-08-23 19:55:17 -07:00
2026-08-28 05:27:15 -07:00
2026-08-24 03:14:30 -07:00
2026-08-22 21:36:44 -07:00
2026-08-25 21:59:36 -07:00
2026-08-22 13:39:04 -04:00
2026-08-22 13:38:56 -04:00
2026-08-23 05:12:59 -07:00
2026-08-26 16:14:32 -07:00
2026-08-21 14:13:28 +10:00
2026-08-21 03:51:03 -07:00
2026-08-23 18:42:59 -07:00
2026-08-27 20:39:11 +05:30
2026-08-26 16:45:31 -07:00
2026-08-26 16:45:22 -07:00
2026-08-21 02:48:14 +08:00
2026-08-25 23:23:11 -07:00
2026-08-25 21:59:52 -07:00
2026-08-21 14:38:41 -07:00
2026-08-27 11:31:21 -05:00
2026-08-27 17:45:43 -05:00
2026-08-27 19:07:15 +05:30
2026-08-28 22:38:01 -05:00
2026-08-23 03:55:14 -07:00
2026-08-21 13:41:39 -07:00
2026-08-26 06:26:07 -07:00
2026-08-28 09:05:19 +05:30
2026-08-26 04:14:16 -07:00
2026-08-26 09:54:31 -07:00
2026-08-25 04:21:37 -07:00
2026-08-26 17:42:58 -07:00
2026-08-26 15:48:39 -07:00
2026-08-26 15:48:39 -07:00
2026-08-21 14:38:19 -07:00
2026-08-27 11:31:21 -05:00
2026-08-27 04:14:31 -07:00
2026-08-22 21:36:55 -07:00
2026-08-21 04:44:15 -07:00
2026-08-23 00:52:50 -07:00
2026-08-23 03:56:28 -07:00
2026-08-23 04:45:29 -07:00
2026-08-27 22:05:40 -05:00
2026-08-20 04:30:33 -07:00
2026-08-20 04:47:38 -07:00
2026-08-27 19:08:28 -05:00
2026-08-21 00:24:32 -07:00
2026-08-27 11:31:21 -05:00
2026-08-21 00:24:32 -07:00
2026-08-23 01:47:26 -07:00
2026-08-25 02:45:10 -07:00
2026-08-20 04:50:39 -07:00
2026-08-26 16:45:31 -07:00
2026-08-28 02:04:54 -07:00
2026-08-23 18:25:35 -07:00
2026-08-21 14:38:41 -07:00
2026-08-28 05:15:06 -07:00
2026-08-27 17:11:56 +05:30
2026-08-26 07:57:04 -07:00
2026-08-20 12:37:16 -05:00
2026-08-27 02:17:56 -07:00
2026-08-27 13:27:24 +05:30
2026-08-24 20:25:10 -07:00
2026-08-24 15:45:52 +05:30
2026-08-24 15:45:52 +05:30
2026-08-22 19:30:10 -07:00
2026-08-23 05:12:59 -07:00
2026-08-26 07:03:04 -07:00
2026-08-24 03:20:37 -07:00
2026-08-20 03:05:46 -07:00
2026-08-21 04:44:15 -07:00
2026-08-24 15:45:52 +05:30
2026-08-25 02:45:10 -07:00
2026-08-24 03:20:37 -07:00
2026-08-25 12:09:08 -07:00
2026-08-22 23:10:32 -04:00
2026-08-20 04:54:14 -07:00
2026-08-26 04:17:39 -07:00
2026-08-26 16:45:31 -07:00
2026-08-26 16:45:31 -07:00
2026-08-26 17:42:50 -07:00
2026-08-26 17:42:50 -07:00
2026-08-26 11:41:04 -07:00
2026-08-26 18:23:33 -07:00
2026-08-26 18:23:33 -07:00
2026-08-26 21:38:20 -07:00
2026-08-23 04:25:18 -07:00
2026-08-20 04:14:42 -07:00
2026-08-24 03:21:28 -07:00
2026-08-23 04:45:29 -07:00
2026-08-23 04:45:29 -07:00
2026-08-25 14:10:10 -07:00
2026-08-25 14:10:10 -07:00
2026-08-21 15:23:49 -07:00
2026-08-23 00:50:41 -07:00
2026-08-26 16:45:26 -07:00
2026-08-26 16:45:26 -07:00
2026-08-22 19:30:10 -07:00
2026-08-20 03:43:00 -07:00
2026-08-20 12:41:33 -05:00
2026-08-26 08:39:04 -07:00
2026-08-20 05:02:36 -07:00
2026-08-23 02:16:33 -07:00
2026-08-26 06:28:43 -07:00
2026-08-28 13:33:56 -04:00
2026-08-27 22:06:17 +05:30
2026-08-27 21:07:34 +05:30
2026-08-21 22:08:16 -07:00
2026-08-21 22:08:16 -07:00
2026-08-21 19:11:55 -07:00
2026-08-25 14:48:51 -07:00
2026-08-26 21:38:20 -07:00
2026-08-23 19:55:17 -07:00
2026-08-23 15:21:48 -07:00
2026-08-24 03:21:49 -07:00
2026-08-27 11:31:21 -05:00
2026-08-26 16:45:31 -07:00
2026-08-22 13:38:56 -04:00
2026-08-26 16:45:31 -07:00