@hasna/todos 0.11.44 → 0.11.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/README.md +695 -11
  2. package/dist/cli/commands/agent-reliability-commands.d.ts +3 -0
  3. package/dist/cli/commands/agent-reliability-commands.d.ts.map +1 -0
  4. package/dist/cli/commands/audit-ledger-commands.d.ts +3 -0
  5. package/dist/cli/commands/audit-ledger-commands.d.ts.map +1 -0
  6. package/dist/cli/commands/capacity-commands.d.ts +3 -0
  7. package/dist/cli/commands/capacity-commands.d.ts.map +1 -0
  8. package/dist/cli/commands/config-serve-commands.d.ts.map +1 -1
  9. package/dist/cli/commands/help-commands.d.ts +3 -0
  10. package/dist/cli/commands/help-commands.d.ts.map +1 -0
  11. package/dist/cli/commands/knowledge-commands.d.ts +3 -0
  12. package/dist/cli/commands/knowledge-commands.d.ts.map +1 -0
  13. package/dist/cli/commands/local-backup-commands.d.ts +3 -0
  14. package/dist/cli/commands/local-backup-commands.d.ts.map +1 -0
  15. package/dist/cli/commands/local-snapshot-commands.d.ts +3 -0
  16. package/dist/cli/commands/local-snapshot-commands.d.ts.map +1 -0
  17. package/dist/cli/commands/machines.d.ts.map +1 -1
  18. package/dist/cli/commands/mcp-hooks-commands.d.ts.map +1 -1
  19. package/dist/cli/commands/onboarding-commands.d.ts +3 -0
  20. package/dist/cli/commands/onboarding-commands.d.ts.map +1 -0
  21. package/dist/cli/commands/project-commands.d.ts.map +1 -1
  22. package/dist/cli/commands/query-commands.d.ts.map +1 -1
  23. package/dist/cli/commands/release-compatibility-commands.d.ts +3 -0
  24. package/dist/cli/commands/release-compatibility-commands.d.ts.map +1 -0
  25. package/dist/cli/commands/retrospective-commands.d.ts +3 -0
  26. package/dist/cli/commands/retrospective-commands.d.ts.map +1 -0
  27. package/dist/cli/commands/review-queue-commands.d.ts +3 -0
  28. package/dist/cli/commands/review-queue-commands.d.ts.map +1 -0
  29. package/dist/cli/commands/risk-commands.d.ts +3 -0
  30. package/dist/cli/commands/risk-commands.d.ts.map +1 -0
  31. package/dist/cli/commands/roadmap-commands.d.ts +3 -0
  32. package/dist/cli/commands/roadmap-commands.d.ts.map +1 -0
  33. package/dist/cli/commands/scale-hardening-commands.d.ts +3 -0
  34. package/dist/cli/commands/scale-hardening-commands.d.ts.map +1 -0
  35. package/dist/cli/commands/sdk-fixture-commands.d.ts +3 -0
  36. package/dist/cli/commands/sdk-fixture-commands.d.ts.map +1 -0
  37. package/dist/cli/commands/task-commands.d.ts.map +1 -1
  38. package/dist/cli/commands/usage-ledger-commands.d.ts +3 -0
  39. package/dist/cli/commands/usage-ledger-commands.d.ts.map +1 -0
  40. package/dist/cli/components/Dashboard.d.ts.map +1 -1
  41. package/dist/cli/index.js +39446 -19769
  42. package/dist/cli-mcp-parity.d.ts +1 -1
  43. package/dist/cli-mcp-parity.d.ts.map +1 -1
  44. package/dist/contracts.d.ts +25 -0
  45. package/dist/contracts.d.ts.map +1 -1
  46. package/dist/contracts.js +14818 -3885
  47. package/dist/db/agent-metrics.d.ts +101 -0
  48. package/dist/db/agent-metrics.d.ts.map +1 -1
  49. package/dist/db/agent-names.d.ts +2 -1
  50. package/dist/db/agent-names.d.ts.map +1 -1
  51. package/dist/db/boards.d.ts +56 -0
  52. package/dist/db/boards.d.ts.map +1 -0
  53. package/dist/db/calendar.d.ts +52 -0
  54. package/dist/db/calendar.d.ts.map +1 -0
  55. package/dist/db/comments.d.ts.map +1 -1
  56. package/dist/db/handoffs.d.ts +25 -0
  57. package/dist/db/handoffs.d.ts.map +1 -1
  58. package/dist/db/machines.d.ts +19 -6
  59. package/dist/db/machines.d.ts.map +1 -1
  60. package/dist/db/migrations.d.ts.map +1 -1
  61. package/dist/db/project-knowledge.d.ts +88 -0
  62. package/dist/db/project-knowledge.d.ts.map +1 -0
  63. package/dist/db/project-risks.d.ts +139 -0
  64. package/dist/db/project-risks.d.ts.map +1 -0
  65. package/dist/db/retrospectives.d.ts +98 -0
  66. package/dist/db/retrospectives.d.ts.map +1 -0
  67. package/dist/db/schema.d.ts.map +1 -1
  68. package/dist/db/task-crud.d.ts.map +1 -1
  69. package/dist/db/task-relations.d.ts +69 -9
  70. package/dist/db/task-relations.d.ts.map +1 -1
  71. package/dist/db/task-runs.d.ts +3 -0
  72. package/dist/db/task-runs.d.ts.map +1 -1
  73. package/dist/db/tasks.d.ts +6 -2
  74. package/dist/db/tasks.d.ts.map +1 -1
  75. package/dist/index.d.ts +74 -11
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +24662 -11829
  78. package/dist/json-contracts.d.ts.map +1 -1
  79. package/dist/lib/agent-replay-simulator.d.ts +66 -0
  80. package/dist/lib/agent-replay-simulator.d.ts.map +1 -0
  81. package/dist/lib/audit-ledger.d.ts +59 -0
  82. package/dist/lib/audit-ledger.d.ts.map +1 -0
  83. package/dist/lib/branch-work-plans.d.ts +46 -0
  84. package/dist/lib/branch-work-plans.d.ts.map +1 -0
  85. package/dist/lib/capacity-forecasts.d.ts +70 -0
  86. package/dist/lib/capacity-forecasts.d.ts.map +1 -0
  87. package/dist/lib/cli-help.d.ts +38 -0
  88. package/dist/lib/cli-help.d.ts.map +1 -0
  89. package/dist/lib/config.d.ts +217 -0
  90. package/dist/lib/config.d.ts.map +1 -1
  91. package/dist/lib/context-packs.d.ts +26 -3
  92. package/dist/lib/context-packs.d.ts.map +1 -1
  93. package/dist/lib/event-hooks.d.ts +1 -1
  94. package/dist/lib/event-hooks.d.ts.map +1 -1
  95. package/dist/lib/external-issue-importers.d.ts +60 -0
  96. package/dist/lib/external-issue-importers.d.ts.map +1 -0
  97. package/dist/lib/extract.d.ts +57 -0
  98. package/dist/lib/extract.d.ts.map +1 -1
  99. package/dist/lib/local-backups.d.ts +129 -0
  100. package/dist/lib/local-backups.d.ts.map +1 -0
  101. package/dist/lib/local-bridge.d.ts +3 -1
  102. package/dist/lib/local-bridge.d.ts.map +1 -1
  103. package/dist/lib/local-extensions.d.ts +92 -0
  104. package/dist/lib/local-extensions.d.ts.map +1 -0
  105. package/dist/lib/local-notifications.d.ts +55 -0
  106. package/dist/lib/local-notifications.d.ts.map +1 -0
  107. package/dist/lib/local-reports.d.ts +149 -0
  108. package/dist/lib/local-reports.d.ts.map +1 -0
  109. package/dist/lib/local-snapshots.d.ts +66 -0
  110. package/dist/lib/local-snapshots.d.ts.map +1 -0
  111. package/dist/lib/mention-resolver.d.ts +43 -0
  112. package/dist/lib/mention-resolver.d.ts.map +1 -0
  113. package/dist/lib/natural-language-intake.d.ts +56 -0
  114. package/dist/lib/natural-language-intake.d.ts.map +1 -0
  115. package/dist/lib/onboarding-fixtures.d.ts +31 -0
  116. package/dist/lib/onboarding-fixtures.d.ts.map +1 -0
  117. package/dist/lib/public-release-gate.d.ts +7 -0
  118. package/dist/lib/public-release-gate.d.ts.map +1 -1
  119. package/dist/lib/redaction.d.ts +9 -0
  120. package/dist/lib/redaction.d.ts.map +1 -1
  121. package/dist/lib/release-compatibility.d.ts +59 -0
  122. package/dist/lib/release-compatibility.d.ts.map +1 -0
  123. package/dist/lib/release-notes.d.ts +81 -0
  124. package/dist/lib/release-notes.d.ts.map +1 -0
  125. package/dist/lib/retention-cleanup.d.ts +63 -0
  126. package/dist/lib/retention-cleanup.d.ts.map +1 -0
  127. package/dist/lib/review-queues.d.ts +98 -0
  128. package/dist/lib/review-queues.d.ts.map +1 -0
  129. package/dist/lib/roadmaps.d.ts +133 -0
  130. package/dist/lib/roadmaps.d.ts.map +1 -0
  131. package/dist/lib/scale-hardening.d.ts +74 -0
  132. package/dist/lib/scale-hardening.d.ts.map +1 -0
  133. package/dist/lib/sdk-integration-fixtures.d.ts +65 -0
  134. package/dist/lib/sdk-integration-fixtures.d.ts.map +1 -0
  135. package/dist/lib/terminal-notifications.d.ts +53 -0
  136. package/dist/lib/terminal-notifications.d.ts.map +1 -0
  137. package/dist/lib/todos-md.d.ts.map +1 -1
  138. package/dist/lib/tui-dashboard.d.ts +49 -0
  139. package/dist/lib/tui-dashboard.d.ts.map +1 -0
  140. package/dist/lib/usage-ledger.d.ts +82 -0
  141. package/dist/lib/usage-ledger.d.ts.map +1 -0
  142. package/dist/lib/workflow-prompts.d.ts +38 -0
  143. package/dist/lib/workflow-prompts.d.ts.map +1 -0
  144. package/dist/lib/workflow-states.d.ts +70 -0
  145. package/dist/lib/workflow-states.d.ts.map +1 -0
  146. package/dist/mcp/index.d.ts.map +1 -1
  147. package/dist/mcp/index.js +25922 -13067
  148. package/dist/mcp/token-utils.d.ts.map +1 -1
  149. package/dist/mcp/tools/code-tools.d.ts.map +1 -1
  150. package/dist/mcp/tools/machines.d.ts.map +1 -1
  151. package/dist/mcp/tools/task-adv-tools.d.ts.map +1 -1
  152. package/dist/mcp/tools/task-auto-tools.d.ts.map +1 -1
  153. package/dist/mcp/tools/task-crud.d.ts.map +1 -1
  154. package/dist/mcp/tools/task-meta-tools.d.ts.map +1 -1
  155. package/dist/mcp/tools/task-project-tools.d.ts.map +1 -1
  156. package/dist/mcp/tools/task-rel-tools.d.ts.map +1 -1
  157. package/dist/mcp/tools/task-resources.d.ts.map +1 -1
  158. package/dist/mcp/tools/workflow-prompts.d.ts +3 -0
  159. package/dist/mcp/tools/workflow-prompts.d.ts.map +1 -0
  160. package/dist/mcp.js +107 -2
  161. package/dist/registry.js +15919 -6050
  162. package/dist/server/index.js +645 -143
  163. package/dist/storage.js +2516 -159
  164. package/dist/types/index.d.ts +214 -0
  165. package/dist/types/index.d.ts.map +1 -1
  166. package/package.json +1 -1
  167. package/dist/release-provenance.json +0 -7
package/README.md CHANGED
@@ -17,6 +17,38 @@ bun install -g @hasna/todos
17
17
  todos --help
18
18
  ```
19
19
 
20
+ Generate shell completions directly from the registered CLI command tree:
21
+
22
+ ```bash
23
+ todos completions bash > ~/.local/share/bash-completion/completions/todos
24
+ todos completions zsh > ~/.zsh/completions/_todos
25
+ todos completions fish > ~/.config/fish/completions/todos.fish
26
+ ```
27
+
28
+ Print the local CLI manual when you need install/update commands, examples,
29
+ JSON output contracts, error behavior, and the command catalog:
30
+
31
+ ```bash
32
+ todos manual
33
+ todos manual --json
34
+ ```
35
+
36
+ ## Terminal Dashboard
37
+
38
+ `todos dashboard` launches a local Ink TUI with keyboard tabs for overview,
39
+ projects, tasks, plans, runs, dependencies, inbox, and search. It reads only the
40
+ local SQLite database and can also print deterministic snapshots for scripts or
41
+ tests:
42
+
43
+ ```bash
44
+ todos dashboard
45
+ todos dashboard --snapshot --view tasks --search "release" --json
46
+ ```
47
+
48
+ Keyboard hints are shown in the interface: `h`/left and `l`/right move between
49
+ tabs, `1`-`8` jumps to a tab, `/` opens local search, `r` refreshes, and `q`
50
+ quits.
51
+
20
52
  ## Local Project Bootstrap
21
53
 
22
54
  Bootstrap discovers the current local workspace, registers a project identity,
@@ -33,6 +65,25 @@ MCP clients can use `bootstrap_project` for the same local-only workflow. The
33
65
  command is idempotent, so running it again refreshes machine-local paths without
34
66
  duplicating projects, task lists, or source records.
35
67
 
68
+ ## Local Machine Topology
69
+
70
+ Machine registry state stays in local SQLite. Machines can record identity,
71
+ last-seen heartbeats, workspace paths, git roots, and user-provided Tailscale
72
+ or LAN addresses without probing the network:
73
+
74
+ ```bash
75
+ todos machines register spark01 --ssh hasna@spark01 --tailscale-name spark01.tailnet --tailscale-ip 100.64.0.10 --lan-address 192.168.8.10 --workspace ~/workspace
76
+ todos machines heartbeat spark01 --workspace ~/workspace
77
+ todos machines topology --json
78
+ todos projects-path set <project-id> ~/workspace/my-project
79
+ ```
80
+
81
+ `todos machines topology` reports stale machines, missing local path overrides,
82
+ missing local paths, and projects whose machine-local paths differ across
83
+ registered machines. MCP clients can use `machines_register`,
84
+ `machines_heartbeat`, `machines_topology`, and `machines_list` for the same
85
+ offline diagnostics.
86
+
36
87
  ## Local Workspace Trust
37
88
 
38
89
  Workspace trust profiles live in `~/.hasna/todos/config.json` and keep agent
@@ -53,6 +104,28 @@ MCP clients can use `set_workspace_trust`, `get_workspace_trust`,
53
104
  return deterministic JSON showing whether an action is allowed, why it needs a
54
105
  prompt, and which environment keys should be redacted.
55
106
 
107
+ Secret safety uses the same local config. Add project-specific regexes and
108
+ metadata keys with `todos redaction add --pattern <regex> --key <name>`, then
109
+ scan text or files with `todos redaction scan` without printing matched values.
110
+ Comments, local run evidence, and bridge exports are redacted before storage or
111
+ sharing. MCP clients can use `get_secret_safety`, `set_secret_safety`, and
112
+ `scan_secret_text`.
113
+
114
+ Retention cleanup is also local and dry-run-first. Use it to prune old comments,
115
+ run ledgers, verification evidence, and expired stored artifact files by age,
116
+ project, task status, and run status. Reports return counts, IDs, and
117
+ content-addressed artifact paths only; they do not include raw comments,
118
+ commands, output summaries, artifact source paths, or secret-like values.
119
+ Destructive cleanup requires the exact confirmation string shown by the preview:
120
+
121
+ ```bash
122
+ todos retention cleanup --older-than-days 30 --project <project-id> --task-status completed --json
123
+ todos retention cleanup --older-than-days 30 --project <project-id> --task-status completed --apply --confirm delete-local-retention-data --json
124
+ ```
125
+
126
+ MCP clients can use `preview_retention_cleanup` and
127
+ `apply_retention_cleanup` for the same offline workflow.
128
+
56
129
  ## Local Runner Sandboxes
57
130
 
58
131
  Runner sandbox profiles also live in local config. They declare the commands a
@@ -73,6 +146,76 @@ MCP clients can use `set_runner_sandbox_profile`,
73
146
  are local-only and compose with workspace trust checks, so command and write
74
147
  decisions stay auditable before an agent records run evidence.
75
148
 
149
+ ## Local Project Knowledge
150
+
151
+ Project knowledge records keep agent decisions, architecture notes, tradeoffs,
152
+ and task-linked context snapshots in local SQLite. They are searchable,
153
+ exportable, redacted on output, and available to MCP clients without hosted
154
+ services:
155
+
156
+ ```bash
157
+ todos knowledge add decision "Use local SQLite" --decision "Keep OSS knowledge local" --rationale "Agents need offline project memory" --task <task-id> --tag architecture --json
158
+ todos knowledge snapshot --summary "Parser fix is ready for verification" --task <task-id> --agent codex --file src/parser.ts --json
159
+ todos knowledge search "offline project memory" --json
160
+ todos knowledge export --format markdown
161
+ ```
162
+
163
+ MCP clients can use `create_knowledge_record`, `create_knowledge_snapshot`,
164
+ `list_knowledge_records`, `search_knowledge_records`, and
165
+ `export_knowledge_records`. The MCP server also publishes `todos://knowledge`
166
+ and `todos://knowledge/decisions` resources for agent context refreshes.
167
+
168
+ ## Local Extension Registry
169
+
170
+ Extensions are installed from local manifests, directories with
171
+ `todos.extension.json`, or offline JSON bundles. The registry validates the
172
+ manifest shape, checks `@hasna/todos` compatibility ranges, records requested
173
+ permissions, supports custom commands, MCP tool declarations, templates, hooks,
174
+ and renderers, runs CLI/MCP compatibility checks, dry-runs declared commands and
175
+ renderer commands through the local runner sandbox, verifies optional source
176
+ checksums or detached signatures, and stores trust state in local config only:
177
+
178
+ ```bash
179
+ todos extensions discover . --json
180
+ todos extensions inspect ./todos.extension.json --json
181
+ todos extensions compat ./todos.extension.json --json
182
+ todos extensions install ./todos.extension.json --checksum sha256:... --trust --json
183
+ todos extensions verify ./bundle.todos-extension.json --signature <signature> --public-key "$PUBLIC_KEY"
184
+ todos extensions list
185
+ todos extensions remove my-extension
186
+ ```
187
+
188
+ Unsigned extensions are allowed but installed as local records with warnings.
189
+ Without `--trust`, installs remain in `needs_review` so agents can discover
190
+ custom commands, MCP tools, hooks, and permissions without treating them as
191
+ approved. MCP clients can use `inspect_local_extension`,
192
+ `test_local_extension_compatibility`, `install_local_extension`,
193
+ `list_local_extensions`, and `remove_local_extension` for the same offline
194
+ workflow.
195
+
196
+ ## Local Workflow Prompts
197
+
198
+ The package includes bundled MCP prompts for common agent workflows:
199
+ `goal_planning`, `task_claiming`, `review`, `verification`, `handoff`,
200
+ `release_prep`, `import_triage`, and `incident_response`. They are static,
201
+ local-only prompt resources that can be listed or rendered without a model call:
202
+
203
+ ```bash
204
+ todos workflows list
205
+ todos workflows show goal_planning --objective "Ship release" --task 1234abcd --json
206
+ todos workflows export --format markdown
207
+ ```
208
+
209
+ MCP clients can discover the same catalog at `todos://workflow-prompts` and call
210
+ the matching prompt by ID. Prompt output is deterministic and is intended for
211
+ Codex, Claude Code, Takumi, and other agent-native clients that need reusable
212
+ local guidance for planning, claiming, review, verification, handoff, release,
213
+ triage, and incident workflows.
214
+
215
+ Agent setup recipes for MCP registration, `/goal` planning, task
216
+ claim/update/complete loops, evidence comments, and no-cloud verification live
217
+ in [docs/agent-adapters.md](docs/agent-adapters.md).
218
+
76
219
  ## Local Policy Packs
77
220
 
78
221
  Policy packs are project-local done gates for agents. They validate task status,
@@ -99,6 +242,32 @@ MCP clients can use `set_policy_pack`, `list_policy_packs`,
99
242
  Validation is a dry local read of recorded task evidence; it never calls a
100
243
  hosted enforcement service.
101
244
 
245
+ ## Local Source TODO Index
246
+
247
+ Source extraction scans local code for `TODO`, `FIXME`, `HACK`, `BUG`, `XXX`,
248
+ and `NOTE` comments, respects `.gitignore` plus explicit excludes, records
249
+ source files, line anchors, nearby symbols, and stable dedupe fingerprints, and
250
+ can run as a finite local watcher:
251
+
252
+ ```bash
253
+ todos extract . --dry-run --index --json
254
+ todos extract . --exclude fixtures/** --tags tech-debt
255
+ todos extract-watch . --dry-run --max-runs 1 --json
256
+ ```
257
+
258
+ Created tasks are tagged with `extracted` and linked back to the source file.
259
+ MCP clients can call `extract_todos` and `watch_source_todos` for the same
260
+ offline workflow; no hosted code search, cloud sync, or telemetry is used.
261
+
262
+ ## Local Editor Integrations
263
+
264
+ Editor recipes live in `docs/editor-integrations.md` and
265
+ `examples/editor-integrations/`. They include VS Code task definitions,
266
+ JetBrains external tool recipes, Neovim Lua helpers, a shell statusline snippet,
267
+ and a Bun task picker. Every example uses only `todos` CLI JSON output or MCP
268
+ tool names, so editors can claim tasks, inspect local queues, build context
269
+ packs, and link source files without importing private modules or hosted code.
270
+
102
271
  ## Task Contracts and Reviews
103
272
 
104
273
  Task contracts make acceptance criteria, required verification, expected
@@ -144,6 +313,50 @@ MCP clients can use `require_approval_gate`, `approve_approval_gate`,
144
313
  `list_approval_gates`. Gate events are written to task audit history and, when
145
314
  a run is linked, to the local run ledger.
146
315
 
316
+ ## Local Review Queues
317
+
318
+ Review queues turn local task review into an explicit agent workflow: request a
319
+ review, route it to a queue, claim it, return it with changes, reopen it, or
320
+ approve it. Routing rules live in local config and can match tags, priorities,
321
+ and projects without hosted users, orgs, or cloud services:
322
+
323
+ ```bash
324
+ todos reviews rules set security --queue security-review --reviewers reviewer --tags security --priorities high
325
+ todos reviews request <task-id> --requester codex --reason "security-sensitive change"
326
+ todos reviews claim <task-id> --reviewer reviewer
327
+ todos reviews return <task-id> --reviewer reviewer --changes "Add tests;Record verification"
328
+ todos reviews approve <task-id> --reviewer reviewer
329
+ todos reviews list --queue security-review --json
330
+ ```
331
+
332
+ MCP clients can use `list_review_queue`, `request_review_queue`,
333
+ `claim_review_item`, `return_review_item`, `approve_review_item`,
334
+ `reopen_review_item`, `set_review_routing_rule`, `list_review_routing_rules`,
335
+ and `remove_review_routing_rule`. Queue transitions are written to audit
336
+ history and emitted to local event hooks as `review.requested`,
337
+ `review.claimed`, `review.returned`, `review.approved`, and `review.reopened`.
338
+
339
+ ## Local Roadmaps
340
+
341
+ Roadmaps group local tasks, plans, runs, milestones, and release labels into a
342
+ portable planning view. They live in local config, summarize dependency
343
+ readiness from the task graph, and export deterministic JSON or Markdown
344
+ bundles:
345
+
346
+ ```bash
347
+ todos roadmaps create "Public package launch" --release v1 --json
348
+ todos roadmaps milestones add <roadmap-id> "Docs and examples" --tasks <task-id> --due 2026-06-01 --release v1 --json
349
+ todos roadmaps releases set <roadmap-id> v1 --milestones <milestone-id> --release-version 1.0.0 --json
350
+ todos roadmaps show <roadmap-id> --format markdown
351
+ todos roadmaps export <roadmap-id> --out roadmap.json
352
+ todos roadmaps import roadmap.json --apply --json
353
+ ```
354
+
355
+ MCP clients can use `create_roadmap`, `list_roadmaps`,
356
+ `get_roadmap_summary`, `update_roadmap`, `delete_roadmap`,
357
+ `create_milestone`, `update_milestone`, `delete_milestone`,
358
+ `set_release_group`, `export_roadmap`, and `import_roadmap`.
359
+
147
360
  ## Local Event Hooks
148
361
 
149
362
  Event hooks are local subscriptions for task, plan, run, approval, import, and
@@ -162,6 +375,28 @@ MCP clients can use `set_local_event_hook`, `list_local_event_hooks`,
162
375
  `test_local_event_hook`, and `remove_local_event_hook`. Hook delivery is
163
376
  local-only; it does not call hosted webhooks or cloud automation services.
164
377
 
378
+ ## Local Terminal Notifications
379
+
380
+ Terminal notification rules are local watch rules for agents that want concise
381
+ event signals in a shell, tmux pane, or editor terminal. Rules match task, run,
382
+ plan, approval, import, and export events by severity, agent, project, priority,
383
+ status, and payload text, then render deterministic line or JSON notifications:
384
+
385
+ ```bash
386
+ todos terminal-notifications set blocked --event task.blocked,task.failed --min-severity warning --agent codex --priority high --contains deploy --bell
387
+ todos terminal-notifications set due --event task.due,task.sla_breached --min-severity warning --quiet-hours 22:00-07:00
388
+ todos notifications check --emit-hooks --terminal --quiet-hours 22:00-07:00 --json
389
+ todos terminal-notifications test blocked --event task.failed --payload '{"id":"demo","title":"Deploy failed","agent_id":"codex","priority":"high"}' --json
390
+ todos terminal-notifications list --json
391
+ ```
392
+
393
+ MCP clients can use `set_terminal_notification_rule`,
394
+ `list_terminal_notification_rules`, `test_terminal_notification_rule`,
395
+ `evaluate_terminal_watch_rules`, `check_local_notifications`, and
396
+ `remove_terminal_notification_rule`. Notifications are evaluated from local
397
+ event payloads, can respect quiet hours, and do not require a desktop
398
+ notification daemon, hosted queue, or cloud webhook service.
399
+
165
400
  ## Local Encryption Profiles
166
401
 
167
402
  Encryption profiles are optional local config entries for sensitive fields and
@@ -207,6 +442,24 @@ MCP clients can use `set_agent_run_adapter`, `queue_agent_run`,
207
442
  `cancel_agent_run_dispatch`, and `retry_agent_run_dispatch`. These commands
208
443
  launch only local processes and do not call hosted runners.
209
444
 
445
+ ## Local Agent Replay Simulation
446
+
447
+ Replay simulation turns a recorded context pack or run fixture into a
448
+ deterministic dry-run snapshot without opening the project database or mutating
449
+ tasks. Use it to debug agent plans, verification commands, task transitions,
450
+ failures, touched files, artifacts, and approval decisions offline:
451
+
452
+ ```bash
453
+ todos context-pack <task-id> --format json > replay.json
454
+ todos runs simulate replay.json --agent codex --scenario parser-failure --json
455
+ todos runs simulate replay.json --format markdown
456
+ ```
457
+
458
+ MCP clients can use `simulate_agent_replay` with a fixture object and optional
459
+ `agent_id` or `scenario`. The simulator redacts fixture values before hashing
460
+ or rendering, reports `mutates_database: false`, and emits stable command,
461
+ approval, failure, file, artifact, and warning summaries for local debugging.
462
+
210
463
  ## Local Dependency Workflows
211
464
 
212
465
  Dependencies are stored in the local SQLite database and never require hosted
@@ -225,6 +478,72 @@ The same workflow is available to MCP clients through
225
478
  blocked pending tasks, and startup schema repair recreates the local dependency
226
479
  table for older databases.
227
480
 
481
+ ## Local Risk Register And Health
482
+
483
+ Risks are stored in local SQLite and can be linked to projects, plans, or tasks
484
+ with an owner, mitigation, due date, severity, probability, tags, and metadata:
485
+
486
+ ```bash
487
+ todos risks add "Release blocker" --plan 1234abcd --severity high --owner codex --mitigation "Ship fallback" --json
488
+ todos risks list --plan 1234abcd --json
489
+ todos risks score --plan 1234abcd --json
490
+ todos risks export --project my-project --json
491
+ ```
492
+
493
+ Health reports score a plan or project from local evidence only: blocked tasks,
494
+ overdue open work, failed verification records, failed run ledgers, dependency
495
+ depth, and open risks. MCP clients get the same surface through `create_risk`,
496
+ `list_risks`, `update_risk`, `close_risk`, `score_plan_health`,
497
+ `score_project_health`, and `export_risk_register`.
498
+
499
+ ## Local Retrospectives
500
+
501
+ Retrospectives summarize a project or plan using local evidence: completed
502
+ plans, missed estimates, repeated blockers, failed verification records,
503
+ lessons learned, and suggested follow-up tasks.
504
+
505
+ ```bash
506
+ todos retrospectives create --plan 1234abcd --json
507
+ todos retrospectives list --project my-project --json
508
+ todos retrospectives export --plan 1234abcd --format markdown
509
+ ```
510
+
511
+ Use `--create-followups` to create the suggested follow-up tasks locally. MCP
512
+ clients get the same reports through `create_retrospective`,
513
+ `list_retrospectives`, and `export_retrospectives`.
514
+
515
+ ## Local Agent Reliability Scorecards
516
+
517
+ Reliability scorecards summarize each agent from local evidence only: completed
518
+ and failed tasks, passed and failed verification records, failed run ledgers,
519
+ stale task/resource locks, retry history, and handoff quality.
520
+
521
+ ```bash
522
+ todos reliability show codex --json
523
+ todos reliability list --project my-project --json
524
+ todos reliability export --format markdown
525
+ ```
526
+
527
+ MCP clients get the same summaries through `get_agent_reliability_scorecard`,
528
+ `export_agent_reliability_scorecards`, and the `todos://agents/reliability`
529
+ resource.
530
+
531
+ ## Local Agent Reports
532
+
533
+ Agent reports compose the local planning surfaces into one report for standups,
534
+ handoffs, and agent run planning: ready tasks, blocked tasks, overdue work,
535
+ plan progress, run outcomes, verification evidence, and per-agent summaries.
536
+
537
+ ```bash
538
+ todos reports local --agent codex --format markdown
539
+ todos reports local --project <project-id> --json
540
+ ```
541
+
542
+ MCP clients can list sections with `list_local_report_types` and build the
543
+ same local-only `local_report` contract with `build_local_report`. The report
544
+ uses the local SQLite store only and does not call hosted analytics or external
545
+ services.
546
+
228
547
  ## Local Agent Locking
229
548
 
230
549
  Task claims and locks are local SQLite leases. Agents can claim the next ready
@@ -293,6 +612,56 @@ MCP clients get the same local data through `link_task_to_commit`,
293
612
  `add_task_verification`, and `get_task_traceability`, so agents can explain
294
613
  which task changed a commit, branch, PR, file, or verification command.
295
614
 
615
+ ## Local Mention Resolution
616
+
617
+ Agents can resolve task references before adding them to descriptions, plans, or
618
+ handoffs. The resolver validates local files and line anchors, scans local source
619
+ declarations for symbols, checks local git commits, branches, and fetched pull
620
+ request refs, and resolves plans, runs, tasks, and agents from the local SQLite
621
+ state:
622
+
623
+ ```bash
624
+ todos references resolve file:src/index.ts:12 symbol:createTask branch:main --json
625
+ todos refs resolve plan:release run:abc123 agent:marcus --workspace .
626
+ ```
627
+
628
+ The JSON output includes canonical reference keys and validated backlinks such
629
+ as `file:src/index.ts:12`, `symbol:createTask@src/index.ts:40`, `commit:<sha>`,
630
+ `plan:<id>`, and `run:<id>`. MCP clients can call `resolve_mentions` for the
631
+ same local-only report; pull request refs are validated only when present in
632
+ local git refs, and the resolver never calls hosted code search.
633
+
634
+ ## Local Branch-Safe Work Plans
635
+
636
+ Before an agent starts a branch, it can ask for a local branch work plan that
637
+ checks the task or plan scope, planned files, active file conflicts, local git
638
+ status, and suggested branch/traceability commands:
639
+
640
+ ```bash
641
+ todos branch-plan 1234abcd --branch task/parser-fix --path src/parser.ts --json
642
+ todos branch-plan --plan <plan-id> --branch task/release-plan --no-git-status --json
643
+ ```
644
+
645
+ MCP clients can call `create_branch_work_plan` with `task_id` or `plan_id`.
646
+ The result is local-only: it does not create a branch, fetch from a remote, or
647
+ contact hosted code review services. Agents can inspect `safe_to_start`,
648
+ `conflicts`, `reasons`, and `commands` before running any git operation.
649
+
650
+ ## Local Release Notes
651
+
652
+ Generate changelogs from completed local tasks and their linked plans, commits,
653
+ verification records, breaking-change notes, and migration notes:
654
+
655
+ ```bash
656
+ todos release-notes --project . --format markdown
657
+ todos release-notes --tag release --since 2026-01-01T00:00:00.000Z --json
658
+ ```
659
+
660
+ Tasks can add release metadata through `metadata.breaking_change`,
661
+ `metadata.breaking_changes`, `metadata.migration_note`, or
662
+ `metadata.migration_notes`. MCP clients use `generate_release_notes` for the
663
+ same deterministic JSON or Markdown output without hosted release tooling.
664
+
296
665
  ## Local Verification Providers
297
666
 
298
667
  Optional provider adapters let agents standardize local verification without a
@@ -327,13 +696,19 @@ todos handoff --unread-for claude --json
327
696
  todos handoff --read <handoff-id> --json
328
697
  todos handoff --ack <handoff-id> --agent claude --json
329
698
  todos handoff --recover --agent codex --session codex-42 --json
699
+ todos handoff --export <handoff-id> --output handoff.json --json
700
+ todos handoff --import handoff.json --json
701
+ todos handoff --import handoff.json --apply --json
330
702
  ```
331
703
 
332
704
  MCP clients can use `create_handoff`, `list_handoffs`, `read_handoff`,
333
- `acknowledge_handoff`, `recover_stale_session_handoff`, and
334
- `get_latest_handoff`. Recovery handoffs inspect local in-progress tasks, file
335
- links, and run evidence for the agent/session and create a deterministic
336
- continuation packet; no hosted queue or cloud service is involved.
705
+ `export_handoff`, `import_handoff`, `acknowledge_handoff`,
706
+ `recover_stale_session_handoff`, and `get_latest_handoff`. Recovery handoffs
707
+ inspect local in-progress tasks, file links, and run evidence for the
708
+ agent/session and create a deterministic continuation packet; no hosted queue
709
+ or cloud service is involved. Handoff imports default to a dry-run preview;
710
+ `--apply` writes the local handoff and preserves per-agent acknowledgement
711
+ state.
337
712
 
338
713
  ## Local Run Ledger
339
714
 
@@ -360,6 +735,112 @@ metadata, redaction status, retention metadata, and metadata-only fallback when
360
735
  the original path is unavailable. Use `--no-store` to record only artifact
361
736
  metadata.
362
737
 
738
+ ## Local Time Tracking
739
+
740
+ Manual time logs and focus sessions stay in the local SQLite database and roll
741
+ up into `task.actual_minutes` for planning and retrospectives:
742
+
743
+ ```bash
744
+ todos time log <task-id> 25 --agent codex --notes "reviewed parser"
745
+ SESSION=$(todos time start <task-id> --agent codex --idle-after 30 --json | jq -r .id)
746
+ todos time pause "$SESSION"
747
+ todos time resume "$SESSION"
748
+ todos time stop "$SESSION" --notes "implemented and tested"
749
+ todos time report --include-open --json
750
+ ```
751
+
752
+ Focus sessions can be linked to tasks, plans, or run ledgers. Stopping a
753
+ completed task-linked session writes a time log with the session id and run id,
754
+ then recalculates actual minutes from all local logs. `todos time idle` and the
755
+ `get_idle_focus_prompts` MCP tool report active sessions that exceeded their
756
+ local idle threshold; no desktop notification service or hosted telemetry is
757
+ required.
758
+
759
+ ## Local Capacity Forecasts
760
+
761
+ Capacity profiles give agents a local way to forecast whether a project or plan
762
+ is realistic from task estimates, actual minutes, due dates, and available
763
+ minutes per day:
764
+
765
+ ```bash
766
+ todos capacity set codex --minutes-per-day 240 --days 1,2,3,4,5 --json
767
+ todos capacity forecast --plan <plan-id> --agent codex --start-date 2026-06-01 --json
768
+ todos capacity forecast --project <project-id> --format markdown
769
+ todos capacity list --json
770
+ ```
771
+
772
+ Forecasts report remaining estimated minutes, logged actual minutes, forecast
773
+ work days, projected completion date, missing estimates, overdue open tasks,
774
+ and risk flags. MCP clients use `set_capacity_profile`,
775
+ `list_capacity_profiles`, `remove_capacity_profile`, and
776
+ `get_planning_forecast`.
777
+
778
+ ## Local Audit Ledger
779
+
780
+ Audit ledger checkpoints hash local evidence into a deterministic chain so an
781
+ agent can seal task, run, verification, approval, and handoff records and verify
782
+ later that the local evidence still matches:
783
+
784
+ ```bash
785
+ todos audit-ledger show --task <task-id> --entries --json
786
+ todos audit-ledger seal release-checkpoint --task <task-id> --json
787
+ todos audit-ledger verify release-checkpoint --json
788
+ todos audit-ledger list --json
789
+ ```
790
+
791
+ The ledger stores only local checkpoint metadata in config. It does not call a
792
+ hosted service and it does not claim to prevent local deletion; it detects
793
+ changes against a previously sealed root hash. MCP clients use
794
+ `get_audit_ledger`, `seal_audit_ledger`, `list_audit_ledger_checkpoints`, and
795
+ `verify_audit_ledger`.
796
+
797
+ ## Release Compatibility
798
+
799
+ Release compatibility checks give agents a local dry-run report before publish
800
+ or update work. They verify the package stays `@hasna/todos`, public, pointed at
801
+ `hasna/todos`, export-stable, migration-compatible from recent local schema
802
+ levels, and ready for Bun global install smoke tests:
803
+
804
+ ```bash
805
+ todos release-compat check --json
806
+ todos release-compat check --format markdown
807
+ ```
808
+
809
+ The report also includes changelog surfaces and rollback commands. MCP clients
810
+ use `check_release_compatibility` for the same `release_compatibility_report`
811
+ JSON contract.
812
+
813
+ ## Local Usage Ledger
814
+
815
+ Usage reports summarize local tasks, projects, runs, commands, durations,
816
+ agent-provided token and cost metadata, and run artifact storage. Quota flags
817
+ are simulated locally so agents can check free/pro limits or project budgets
818
+ without sending data anywhere:
819
+
820
+ ```bash
821
+ todos usage report --agent codex --max-tasks 1000 --max-projects 10 --json
822
+ todos usage report --project <project-id> --format markdown
823
+ ```
824
+
825
+ The report is aggregate-only: raw command strings and artifact paths are not
826
+ included. MCP clients use `get_usage_ledger` for the same
827
+ `local_usage_ledger` JSON contract.
828
+
829
+ ## Local Scale Hardening
830
+
831
+ Scale reports benchmark common local queries, count archive-ready terminal
832
+ tasks, check expected SQLite indexes, run integrity diagnostics, and preview
833
+ database compaction without network access:
834
+
835
+ ```bash
836
+ todos scale report --older-than-days 30 --json
837
+ todos scale report --format markdown
838
+ todos scale compact --json
839
+ ```
840
+
841
+ `todos scale compact --apply` runs `PRAGMA optimize` and `VACUUM` against the
842
+ local SQLite database. The default is a dry run.
843
+
363
844
  ## Local Activity Timeline
364
845
 
365
846
  The timeline command gives agents one ordered, redacted view of local comments,
@@ -377,6 +858,31 @@ local SQLite store and local bridge exports already include the underlying
377
858
  comments, runs, run evidence, files, commits, and verification records needed to
378
859
  rebuild the same timeline after import.
379
860
 
861
+ ## Local Scheduling and SLA Escalation
862
+
863
+ Tasks can carry local due dates, recurrence rules, and SLA thresholds without a
864
+ hosted scheduler. Recurring tasks spawn their next local task from the previous
865
+ scheduled due date, preserving cadence even when completion happens late:
866
+
867
+ ```bash
868
+ todos add "Weekly review" --due 2026-06-01 --recurrence "every week" --sla-minutes 120 --json
869
+ todos update <task-id> --due 2026-06-08 --recurrence "every monday" --sla 90 --json
870
+ todos overdue --json
871
+ todos sla --json
872
+ todos notifications check --due-within-minutes 60 --stale-minutes 30 --terminal --json
873
+ ```
874
+
875
+ `todos overdue` returns unfinished tasks past `due_at`. `todos sla` returns
876
+ unfinished tasks that are past `due_at` or whose `sla_minutes` threshold has
877
+ elapsed from `started_at` when present, otherwise `created_at`. MCP clients use
878
+ `create_task` and `update_task` with `deadline`, `recurrence_rule`, and
879
+ `sla_minutes`, and can call `get_sla_breaches` for the same local escalation
880
+ view. `todos notifications check` turns due, due-soon, SLA, stale task,
881
+ completed run, and local reminder records into redacted local alerts; it can
882
+ emit configured file/socket/script/stdout event hooks, evaluate terminal watch
883
+ rules, and suppress delivery during quiet hours without contacting an external
884
+ notification service.
885
+
380
886
  ## Local Task Fields
381
887
 
382
888
  Tasks can carry local labels, severity, owner, area, and custom metadata while
@@ -393,6 +899,44 @@ for existing filters, and the metadata is included in local bridge exports.
393
899
  MCP clients use `get_task_fields`, `set_task_fields`, and
394
900
  `query_tasks_by_fields` for the same local-only workflow.
395
901
 
902
+ ## Local Workflow States
903
+
904
+ Projects can define local workflow states such as review, blocked, verifying,
905
+ failed, or released while keeping storage compatible with the canonical task
906
+ statuses:
907
+
908
+ ```bash
909
+ todos workflow states --json
910
+ todos workflow set <task-id> review --json
911
+ todos workflow tasks review --json
912
+ todos workflow migrate --apply --json
913
+ ```
914
+
915
+ Workflow states live in local config under `workflow_states.states`. Each state
916
+ maps to a canonical `canonical_status`, can declare aliases, and can restrict
917
+ allowed transitions. The selected local state is stored in task metadata and is
918
+ included in local bridge exports. MCP clients use `list_workflow_states`,
919
+ `set_task_workflow_state`, `query_tasks_by_workflow_state`, and
920
+ `migrate_workflow_states`.
921
+
922
+ ## Local Calendar And ICS
923
+
924
+ Calendar events are derived from local tasks, SLA thresholds, run ledgers, and
925
+ authored local reminders, milestones, or work blocks. Exported ICS files are
926
+ deterministic and can be redacted before sharing:
927
+
928
+ ```bash
929
+ todos calendar list --from 2026-06-01T00:00:00.000Z --json
930
+ todos calendar add "Release milestone" --kind milestone --start 2026-06-01T09:00:00.000Z --json
931
+ todos calendar export --redact --out todos.ics
932
+ todos calendar import team.ics --json
933
+ ```
934
+
935
+ Recurring task rules are mapped into ICS `RRULE` values when possible, and task
936
+ SLA thresholds appear as local calendar events without any Google Calendar,
937
+ hosted API, or cloud sync dependency. MCP clients use `create_calendar_item`,
938
+ `list_calendar_events`, `export_calendar_ics`, and `import_calendar_ics`.
939
+
396
940
  ## Local Saved Search Views
397
941
 
398
942
  Saved views are local SQLite records for repeatable task, project, plan, run,
@@ -413,6 +957,26 @@ preserve the filters without any hosted service. MCP clients use
413
957
  `save_search_view`, `list_search_views`, `run_search_view`, and
414
958
  `delete_search_view`.
415
959
 
960
+ ## Local Kanban Boards
961
+
962
+ Boards are local SQLite records for task and plan workflow views. Lanes map to
963
+ workflow statuses, can carry WIP limits, and render blocked/ready badges for
964
+ agent planning:
965
+
966
+ ```bash
967
+ todos board create local-flow --lane "Ready=pending" "Doing=in_progress:3" --json
968
+ todos board show local-flow
969
+ todos board tui local-flow --json
970
+ todos board move local-flow <task-id> --lane Doing --json
971
+ todos board export local-flow --json
972
+ ```
973
+
974
+ Task boards render tasks; plan boards use `--scope plans` and render plans by
975
+ plan status. Board snapshots include terminal key bindings for keyboard/TUI
976
+ clients, but the state is still just local data and can be exported or imported
977
+ without a hosted web UI. MCP clients use `create_board`, `list_boards`,
978
+ `get_board_snapshot`, and `move_board_card`.
979
+
416
980
  ## Local Duplicate Detection
417
981
 
418
982
  Agents can scan local tasks for likely duplicates from imported issue URLs,
@@ -441,11 +1005,43 @@ traceability, and run-ledger evidence from the local SQLite database only:
441
1005
  todos context-pack <task-id> --profile codex --format markdown
442
1006
  todos context-pack <task-id> --profile claude --format json
443
1007
  todos context-pack <task-id> --profile takumi --run <run-id> --comments 12 --files 40
1008
+ todos context-pack <task-id> --profile codex --token-budget 1800 --exclude runs --compact
444
1009
  ```
445
1010
 
446
1011
  MCP clients can call `build_agent_context_pack` with the same limits and choose
447
- JSON or Markdown output. Long text and evidence are redacted and size-limited,
448
- and stale or omitted local data is surfaced as warnings in the pack.
1012
+ JSON, Markdown, compact JSON, or compact Markdown output. Long text and evidence
1013
+ are redacted and size-limited, and stale or omitted local data is surfaced as
1014
+ warnings in the pack.
1015
+
1016
+ Budget-aware context packing is local and deterministic. Use `--token-budget`
1017
+ for an approximate character-based token budget, `--include` or `--exclude` to
1018
+ shape sections, and `--summary-chars` to cap the redacted summaries generated
1019
+ for omitted evidence. When the pack is too large, lower-priority evidence such
1020
+ as runs, traceability, comments, files, dependencies, and plan context is
1021
+ summarized in a stable `context_budget` block so agents still know what was left
1022
+ out.
1023
+
1024
+ ## Local External Issue Imports
1025
+
1026
+ Import issue records from pasted JSON, files, stdin, or explicit URLs without
1027
+ depending on any hosted Hasna service. Imports default to a dry-run preview;
1028
+ `--apply` creates local tasks, stores redacted source metadata, creates linked
1029
+ inbox evidence, and skips existing tasks that already have the same source URL,
1030
+ GitHub owner/repo/number, or external issue key:
1031
+
1032
+ ```bash
1033
+ todos issues import --file issues.json --provider github --json
1034
+ todos issues import --file issues.json --provider github --apply --json
1035
+ todos issues import --provider linear --apply < linear-export.json
1036
+ todos issues import "Title: Fix parser\nURL: https://tracker.example/BUG-42" --apply --json
1037
+ ```
1038
+
1039
+ GitHub, Linear, Jira, and plain URL records are normalized into local task
1040
+ metadata and tags. Network access is off unless `--allow-network` is passed; for
1041
+ GitHub that explicitly shells out through the authenticated `gh` CLI, while
1042
+ offline files and pasted exports work without tokens. MCP clients use
1043
+ `import_external_issues` with the same dry-run, apply, inbox, and dedupe
1044
+ controls.
449
1045
 
450
1046
  ## Local Inbox Intake
451
1047
 
@@ -456,12 +1052,76 @@ deduped inbox and create a linked task:
456
1052
  todos inbox add "bun test failed: parser regression" --source-type ci_log
457
1053
  todos inbox add --file /tmp/ci.log --source-name "local CI"
458
1054
  todos inbox add https://github.com/hasna/todos/issues/42 --source-url https://github.com/hasna/todos/issues/42
1055
+ todos inbox parse "Add task fix parser priority high @codex #cli due tomorrow" --json
1056
+ todos inbox parse --file plan-notes.txt --apply --json
459
1057
  todos inbox git --diff
460
1058
  todos inbox list
461
1059
  ```
462
1060
 
463
1061
  Inbox bodies and metadata are redacted before storage. Repeated input resolves
464
- to the existing inbox item instead of creating duplicate tasks.
1062
+ to the existing inbox item instead of creating duplicate tasks. Natural-language
1063
+ intake parsing is deterministic and local-only; it defaults to a dry-run preview
1064
+ and creates projects, plans, tasks, dependencies, and acceptance criteria only
1065
+ with `--apply`.
1066
+
1067
+ ## Bundled Onboarding Fixtures
1068
+
1069
+ The package ships deterministic local demo fixtures for first-run onboarding and
1070
+ agent integration tests. The default `agent-project-demo` fixture shows the
1071
+ simple flow used by the public demo: create a project, add todos, generate a
1072
+ plan, run an agent, record command/artifact/verification evidence, review the
1073
+ remaining task, and prove export/import with the local bridge bundle.
1074
+
1075
+ ```bash
1076
+ todos onboarding --json
1077
+ todos onboarding --show agent-project-demo > agent-project-demo.bridge.json
1078
+ todos onboarding --import agent-project-demo --json
1079
+ todos onboarding --import agent-project-demo --apply
1080
+ ```
1081
+
1082
+ Fixtures are bundled with `@hasna/todos`, redacted, offline, and local-only.
1083
+ Imports default to dry-run mode and use the same bridge importer as normal
1084
+ exports, so CLI, MCP, and SDK consumers can test against the exact project,
1085
+ tasks, plan, run ledger, evidence, saved view, and board records.
1086
+
1087
+ MCP clients can read `todos://onboarding/fixtures` or
1088
+ `todos://onboarding/demo`, then use `list_onboarding_fixtures`,
1089
+ `get_onboarding_fixture`, and `import_onboarding_fixture`.
1090
+
1091
+ ## Local Agent Snapshots
1092
+
1093
+ Agents can refresh context through stable local snapshots for projects, tasks,
1094
+ plans, runs, dependencies, activity events, and evidence. Snapshots are
1095
+ redacted, deterministic, and include cursors plus fingerprints so MCP clients
1096
+ can poll for changes without a hosted event stream.
1097
+
1098
+ ```bash
1099
+ todos snapshots --json
1100
+ todos snapshots --show tasks --json
1101
+ todos snapshots --show evidence --markdown
1102
+ todos snapshots --poll --types tasks,evidence --since 2026-05-22T00:00:00.000Z --json
1103
+ ```
1104
+
1105
+ MCP clients can read `todos://snapshots/catalog` and
1106
+ `todos://snapshots/tasks` through `todos://snapshots/evidence`, or use
1107
+ `list_local_snapshots`, `get_local_snapshot`, and `poll_local_snapshots` for
1108
+ JSON or Markdown payloads.
1109
+
1110
+ ## SDK Integration Fixtures
1111
+
1112
+ Downstream SDK, CLI JSON, MCP, and agent-adapter tests can generate a complete
1113
+ local fixture pack from the bundled demo project:
1114
+
1115
+ ```bash
1116
+ todos sdk-fixtures --json
1117
+ todos sdk-fixtures --show > sdk-fixture-pack.json
1118
+ todos sdk-fixtures --write .todos/sdk-integrations --json
1119
+ ```
1120
+
1121
+ The pack includes a local bridge fixture, stable JSON contract snapshots,
1122
+ project/task/plan/run/evidence snapshots, and a context pack. Copy-pasteable
1123
+ examples live in `examples/sdk-integrations/`, and the full guide is in
1124
+ `docs/sdk-integrations.md`.
465
1125
 
466
1126
  ## Local Bridge Import/Export
467
1127
 
@@ -478,10 +1138,10 @@ todos bridge-import todos-bridge.json --apply --resolve-conflicts
478
1138
 
479
1139
  Bridge bundles include local projects, task lists, plans, tasks, dependencies,
480
1140
  comments, run ledgers, command evidence, file evidence, artifacts, stored
481
- artifact contents, commits, refs, and verification records. Imports default to
482
- dry-run mode and report conflicts before writing. The package does not upload
483
- bundles or call hosted services; any hosted sync must consume the exported JSON
484
- explicitly.
1141
+ artifact contents, commits, refs, verification records, saved views, local board
1142
+ definitions, and local calendar items. Imports default to dry-run mode and
1143
+ report conflicts before writing. The package does not upload bundles or call
1144
+ hosted services; any hosted sync must consume the exported JSON explicitly.
485
1145
 
486
1146
  For multi-machine local work, `--resolve-conflicts` performs a safe task merge
487
1147
  instead of overwriting local edits. It fills blank local fields from the
@@ -490,6 +1150,27 @@ unresolved divergent fields in `metadata.sync_conflicts` for manual review.
490
1150
  Local non-empty title, status, priority, and metadata values win when both sides
491
1151
  changed.
492
1152
 
1153
+ ## Local Backups and Integrity
1154
+
1155
+ Create a checksum-protected local backup wrapper around the bridge bundle when
1156
+ you need a restorable snapshot with manifest counts and SQLite integrity
1157
+ metadata:
1158
+
1159
+ ```bash
1160
+ todos backup create --output todos-backup.json
1161
+ todos backup verify todos-backup.json --json
1162
+ todos backup restore todos-backup.json --json
1163
+ todos backup restore todos-backup.json --apply --resolve-conflicts
1164
+ todos backup integrity --json
1165
+ ```
1166
+
1167
+ Backups include the same local projects, task lists, plans, tasks, comments,
1168
+ runs, commands, files, commits, refs, verification records, saved views, boards,
1169
+ calendar items, and stored artifact contents as bridge exports. The backup
1170
+ manifest adds SHA-256 checksums for the full payload, embedded bridge bundle,
1171
+ and each bridge section. Restore defaults to dry-run mode and refuses corrupted
1172
+ or schema-incompatible bundles before importing.
1173
+
493
1174
  ## todos.md Markdown Import/Export
494
1175
 
495
1176
  `todos.md` files are readable Markdown checklists with an embedded local bridge
@@ -595,6 +1276,9 @@ Release checks enforce that boundary before publishing:
595
1276
  - local runtime tests use a no-network fixture for local-only workflows
596
1277
  - `bun run verify:release` builds, packs, validates provenance, and runs a clean
597
1278
  Bun global install smoke test from the candidate tarball
1279
+ - the install smoke plan itself is covered by tests: it installs only with Bun,
1280
+ verifies `todos`, `todos-mcp`, and `todos-serve`, and rejects private or
1281
+ hosted endpoint references
598
1282
 
599
1283
  ## License
600
1284