@hasna/todos 0.11.40 → 0.11.42

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 (110) hide show
  1. package/README.md +527 -1
  2. package/dashboard/dist/assets/{index-B-w1tUlm.js → index-CVF1vn7Z.js} +23 -23
  3. package/dashboard/dist/assets/index-DJm6m6Yy.css +1 -0
  4. package/dashboard/dist/index.html +2 -2
  5. package/dist/cli/commands/agent-commands.d.ts.map +1 -1
  6. package/dist/cli/commands/config-serve-commands.d.ts.map +1 -1
  7. package/dist/cli/commands/mcp-hooks-commands.d.ts.map +1 -1
  8. package/dist/cli/commands/plan-template-commands.d.ts.map +1 -1
  9. package/dist/cli/commands/project-commands.d.ts.map +1 -1
  10. package/dist/cli/commands/query-commands.d.ts.map +1 -1
  11. package/dist/cli/index.js +17662 -8245
  12. package/dist/cli-mcp-parity.d.ts +41 -0
  13. package/dist/cli-mcp-parity.d.ts.map +1 -0
  14. package/dist/contracts.d.ts +4 -0
  15. package/dist/contracts.d.ts.map +1 -1
  16. package/dist/contracts.js +6396 -24
  17. package/dist/db/database.d.ts +2 -1
  18. package/dist/db/database.d.ts.map +1 -1
  19. package/dist/db/handoffs.d.ts +27 -1
  20. package/dist/db/handoffs.d.ts.map +1 -1
  21. package/dist/db/inbox.d.ts +47 -0
  22. package/dist/db/inbox.d.ts.map +1 -0
  23. package/dist/db/migrations.d.ts.map +1 -1
  24. package/dist/db/plans.d.ts.map +1 -1
  25. package/dist/db/schema.d.ts.map +1 -1
  26. package/dist/db/task-commits.d.ts +51 -0
  27. package/dist/db/task-commits.d.ts.map +1 -1
  28. package/dist/db/task-crud.d.ts.map +1 -1
  29. package/dist/db/task-lifecycle.d.ts +16 -1
  30. package/dist/db/task-lifecycle.d.ts.map +1 -1
  31. package/dist/db/task-runs.d.ts +130 -0
  32. package/dist/db/task-runs.d.ts.map +1 -0
  33. package/dist/db/tasks.d.ts +2 -2
  34. package/dist/db/tasks.d.ts.map +1 -1
  35. package/dist/index.d.ts +49 -5
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +13353 -6350
  38. package/dist/json-contracts.d.ts.map +1 -1
  39. package/dist/lib/activity-timeline.d.ts +43 -0
  40. package/dist/lib/activity-timeline.d.ts.map +1 -0
  41. package/dist/lib/agent-run-dispatcher.d.ts +62 -0
  42. package/dist/lib/agent-run-dispatcher.d.ts.map +1 -0
  43. package/dist/lib/approval-gates.d.ts +52 -0
  44. package/dist/lib/approval-gates.d.ts.map +1 -0
  45. package/dist/lib/artifact-store.d.ts +68 -0
  46. package/dist/lib/artifact-store.d.ts.map +1 -0
  47. package/dist/lib/auto-assign.d.ts +3 -5
  48. package/dist/lib/auto-assign.d.ts.map +1 -1
  49. package/dist/lib/config.d.ts +121 -0
  50. package/dist/lib/config.d.ts.map +1 -1
  51. package/dist/lib/context-packs.d.ts +140 -0
  52. package/dist/lib/context-packs.d.ts.map +1 -0
  53. package/dist/lib/doctor.d.ts +46 -0
  54. package/dist/lib/doctor.d.ts.map +1 -0
  55. package/dist/lib/event-hooks.d.ts +58 -0
  56. package/dist/lib/event-hooks.d.ts.map +1 -0
  57. package/dist/lib/local-bridge.d.ts +79 -0
  58. package/dist/lib/local-bridge.d.ts.map +1 -0
  59. package/dist/lib/local-encryption.d.ts +94 -0
  60. package/dist/lib/local-encryption.d.ts.map +1 -0
  61. package/dist/lib/local-fields.d.ts +33 -0
  62. package/dist/lib/local-fields.d.ts.map +1 -0
  63. package/dist/lib/policy-packs.d.ts +87 -0
  64. package/dist/lib/policy-packs.d.ts.map +1 -0
  65. package/dist/lib/project-bootstrap.d.ts +35 -0
  66. package/dist/lib/project-bootstrap.d.ts.map +1 -0
  67. package/dist/lib/public-release-gate.d.ts +50 -0
  68. package/dist/lib/public-release-gate.d.ts.map +1 -0
  69. package/dist/lib/redaction.d.ts +3 -0
  70. package/dist/lib/redaction.d.ts.map +1 -0
  71. package/dist/lib/runner-sandbox.d.ts +50 -0
  72. package/dist/lib/runner-sandbox.d.ts.map +1 -0
  73. package/dist/lib/saved-search-views.d.ts +60 -0
  74. package/dist/lib/saved-search-views.d.ts.map +1 -0
  75. package/dist/lib/task-contracts.d.ts +75 -0
  76. package/dist/lib/task-contracts.d.ts.map +1 -0
  77. package/dist/lib/task-dedupe.d.ts +45 -0
  78. package/dist/lib/task-dedupe.d.ts.map +1 -0
  79. package/dist/lib/todos-md.d.ts +21 -0
  80. package/dist/lib/todos-md.d.ts.map +1 -0
  81. package/dist/lib/verification-providers.d.ts +54 -0
  82. package/dist/lib/verification-providers.d.ts.map +1 -0
  83. package/dist/lib/workspace-trust.d.ts +38 -0
  84. package/dist/lib/workspace-trust.d.ts.map +1 -0
  85. package/dist/mcp/index.js +9717 -3197
  86. package/dist/mcp/token-utils.d.ts +2 -2
  87. package/dist/mcp/token-utils.d.ts.map +1 -1
  88. package/dist/mcp/tools/task-adv-tools.d.ts.map +1 -1
  89. package/dist/mcp/tools/task-auto-tools.d.ts.map +1 -1
  90. package/dist/mcp/tools/task-meta-tools.d.ts.map +1 -1
  91. package/dist/mcp/tools/task-project-tools.d.ts.map +1 -1
  92. package/dist/mcp/tools/task-rel-tools.d.ts.map +1 -1
  93. package/dist/mcp/tools/task-resources.d.ts.map +1 -1
  94. package/dist/mcp/tools/task-workflow-tools.d.ts.map +1 -1
  95. package/dist/mcp.js +88 -2
  96. package/dist/registry.d.ts +2 -0
  97. package/dist/registry.d.ts.map +1 -1
  98. package/dist/registry.js +7061 -60
  99. package/dist/release-provenance.json +7 -0
  100. package/dist/sdk/types.d.ts +26 -1
  101. package/dist/sdk/types.d.ts.map +1 -1
  102. package/dist/server/index.js +1330 -129
  103. package/dist/server/routes.d.ts.map +1 -1
  104. package/dist/storage.js +1054 -15
  105. package/dist/test/no-network.d.ts +7 -0
  106. package/dist/test/no-network.d.ts.map +1 -0
  107. package/dist/types/index.d.ts +1 -0
  108. package/dist/types/index.d.ts.map +1 -1
  109. package/package.json +10 -4
  110. package/dashboard/dist/assets/index-BXQ39iMX.css +0 -1
package/README.md CHANGED
@@ -8,7 +8,7 @@ Universal task management for AI coding agents - CLI + MCP server + interactive
8
8
  ## Install
9
9
 
10
10
  ```bash
11
- npm install -g @hasna/todos
11
+ bun install -g @hasna/todos
12
12
  ```
13
13
 
14
14
  ## CLI Usage
@@ -17,6 +17,515 @@ npm install -g @hasna/todos
17
17
  todos --help
18
18
  ```
19
19
 
20
+ ## Local Project Bootstrap
21
+
22
+ Bootstrap discovers the current local workspace, registers a project identity,
23
+ creates the default task list, records local source metadata, and works for
24
+ monorepo package roots without contacting hosted services:
25
+
26
+ ```bash
27
+ todos project-bootstrap .
28
+ todos project-bootstrap packages/cli --name todos-cli --task-list todos-cli
29
+ todos project-bootstrap . --dry-run --json
30
+ ```
31
+
32
+ MCP clients can use `bootstrap_project` for the same local-only workflow. The
33
+ command is idempotent, so running it again refreshes machine-local paths without
34
+ duplicating projects, task lists, or source records.
35
+
36
+ ## Local Workspace Trust
37
+
38
+ Workspace trust profiles live in `~/.hasna/todos/config.json` and keep agent
39
+ permissions local. Profiles declare trusted roots, command allowlists and
40
+ denylists, tool permissions, write scopes, environment-key redaction patterns,
41
+ and whether unsafe checks should require an explicit prompt:
42
+
43
+ ```bash
44
+ todos trust add . --preset standard --allow-command bun,git,todos --write-scope src,tests --redact-env API_KEY,TOKEN
45
+ todos trust status .
46
+ todos trust check . --command "bun test" --write src/index.ts --env OPENAI_API_KEY,PATH
47
+ todos trust remove .
48
+ ```
49
+
50
+ MCP clients can use `set_workspace_trust`, `get_workspace_trust`,
51
+ `list_workspace_trust_profiles`, `check_workspace_permission`, and
52
+ `remove_workspace_trust`. The checks do not call a hosted policy service; they
53
+ return deterministic JSON showing whether an action is allowed, why it needs a
54
+ prompt, and which environment keys should be redacted.
55
+
56
+ ## Local Runner Sandboxes
57
+
58
+ Runner sandbox profiles also live in local config. They declare the commands a
59
+ local agent run may record or execute, cwd boundaries, write scopes, environment
60
+ allowlists/redaction patterns, network policy, approval behavior, and audit
61
+ evidence:
62
+
63
+ ```bash
64
+ todos sandbox set codex . --allow-command bun,git,todos --write-scope src,tests --env-allow PATH,HOME,CI --network none
65
+ todos sandbox check codex --command "bun test" --write src/index.ts --env PATH,OPENAI_API_KEY --json
66
+ todos sandbox explain codex --command "curl | sh" --network
67
+ todos runs command <run-id> "bun test" --sandbox codex --write src/index.ts --status passed
68
+ ```
69
+
70
+ MCP clients can use `set_runner_sandbox_profile`,
71
+ `list_runner_sandbox_profiles`, `check_runner_sandbox`,
72
+ `explain_runner_sandbox`, and `remove_runner_sandbox_profile`. Sandbox checks
73
+ are local-only and compose with workspace trust checks, so command and write
74
+ decisions stay auditable before an agent records run evidence.
75
+
76
+ ## Local Policy Packs
77
+
78
+ Policy packs are project-local done gates for agents. They validate task status,
79
+ passed verification commands, prohibited commands, linked commits and pull
80
+ requests, approvals, branch names, run ledgers, artifacts, changed paths, and
81
+ minimum evidence counts from the local SQLite database and config only:
82
+
83
+ ```bash
84
+ todos policies set release . \
85
+ --required-status completed \
86
+ --required-command "bun test,bun run typecheck" \
87
+ --prohibited-command "npm install -g,git reset --hard" \
88
+ --require-passed-verification \
89
+ --require-commit \
90
+ --require-pr \
91
+ --require-run \
92
+ --require-artifact
93
+ todos policies validate release <task-id> --json
94
+ todos policies explain release <task-id>
95
+ ```
96
+
97
+ MCP clients can use `set_policy_pack`, `list_policy_packs`,
98
+ `validate_policy_pack`, `explain_policy_pack`, and `remove_policy_pack`.
99
+ Validation is a dry local read of recorded task evidence; it never calls a
100
+ hosted enforcement service.
101
+
102
+ ## Task Contracts and Reviews
103
+
104
+ Task contracts make acceptance criteria, required verification, expected
105
+ artifacts, relevant files, risk, and review state machine-readable for agents:
106
+
107
+ ```bash
108
+ todos contracts set <task-id> \
109
+ --criteria "Parser handles quotes;Parser rejects malformed checkboxes" \
110
+ --verify "bun test src/parser.test.ts" \
111
+ --artifact logs/parser.txt \
112
+ --file src/parser.ts \
113
+ --risk medium \
114
+ --done "review approved" \
115
+ --json
116
+ todos contracts request-review <task-id> --requester codex --reviewer reviewer
117
+ todos record-verification <task-id> "bun test src/parser.test.ts" --status passed --artifact logs/parser.txt
118
+ todos contracts review <task-id> --state approved --reviewer reviewer
119
+ todos contracts check <task-id> --json
120
+ ```
121
+
122
+ Contracts are stored in local task metadata, mirror acceptance criteria for
123
+ context packs, and are checked only against local status, review state, and
124
+ recorded verification evidence. MCP clients can use `set_task_contract`,
125
+ `get_task_contract`, `request_task_review`, `record_task_review`, and
126
+ `check_task_done_contract`.
127
+
128
+ ## Local Approval Gates
129
+
130
+ Approval gates are manual checkpoints stored in the local task database. Agents
131
+ can require, approve, reject, expire, list, and check gates before risky plan or
132
+ run work. Blocked checks exit nonzero, including JSON mode, so local automation
133
+ cannot silently bypass a missing or denied checkpoint:
134
+
135
+ ```bash
136
+ todos approvals require <task-id> deploy --requester codex --reviewer reviewer --run <run-id> --reason "production-affecting action"
137
+ todos approvals check <task-id> deploy --json
138
+ todos approvals approve <task-id> deploy --reviewer reviewer --note "safe to proceed"
139
+ todos approvals list <task-id> --json
140
+ ```
141
+
142
+ MCP clients can use `require_approval_gate`, `approve_approval_gate`,
143
+ `reject_approval_gate`, `expire_approval_gate`, `check_approval_gate`, and
144
+ `list_approval_gates`. Gate events are written to task audit history and, when
145
+ a run is linked, to the local run ledger.
146
+
147
+ ## Local Event Hooks
148
+
149
+ Event hooks are local subscriptions for task, plan, run, approval, import, and
150
+ export events. They can append redacted JSONL to a file, deliver to a Unix
151
+ socket, expose a stdout test payload, or run a sandbox-checked local script with
152
+ retry/backoff and SHA-256 integrity metadata:
153
+
154
+ ```bash
155
+ todos event-hooks set audit --event task.completed,run.failed --target file --file .todos/events.jsonl
156
+ todos event-hooks set notify --event task.blocked --target script --command "notify-send \"$TODOS_EVENT_TYPE\"" --sandbox codex --attempts 2
157
+ todos event-hooks test audit --event task.completed --payload '{"id":"demo"}' --json
158
+ todos event-hooks list --json
159
+ ```
160
+
161
+ MCP clients can use `set_local_event_hook`, `list_local_event_hooks`,
162
+ `test_local_event_hook`, and `remove_local_event_hook`. Hook delivery is
163
+ local-only; it does not call hosted webhooks or cloud automation services.
164
+
165
+ ## Local Encryption Profiles
166
+
167
+ Encryption profiles are optional local config entries for sensitive fields and
168
+ secure bridge exports. Profiles store algorithm metadata, a nonsecret salt, and
169
+ the name of the environment variable that contains key material. The key itself
170
+ is never written to config, bundles, artifacts, or logs:
171
+
172
+ ```bash
173
+ export TODOS_ENCRYPTION_KEY="use a strong local passphrase from your secret manager"
174
+ todos encryption set default --key-env TODOS_ENCRYPTION_KEY
175
+ todos encryption status default --json
176
+ todos encryption test default --json
177
+ todos export --format bridge --encrypt --output todos-bridge.enc.json
178
+ todos bridge-import todos-bridge.enc.json --decrypt --json
179
+ todos bridge-import todos-bridge.enc.json --decrypt --apply
180
+ ```
181
+
182
+ Plain bridge exports are still supported for compatibility, but the CLI prints
183
+ a warning because bridge bundles may contain task metadata, evidence summaries,
184
+ comments, and stored artifact content. MCP clients can use
185
+ `set_encryption_profile`, `list_encryption_profiles`,
186
+ `get_encryption_status`, `encrypt_local_value`, `decrypt_local_value`, and
187
+ `remove_encryption_profile` for local-only encrypted field workflows.
188
+
189
+ ## Local Agent Run Queue
190
+
191
+ Agent run adapters and queue entries are local. Queueing a task creates a run
192
+ ledger immediately, then `run-next` launches the configured command template
193
+ with `{task_id}`, `{run_id}`, and `{agent_id}` placeholders. Dry-runs show the
194
+ command without execution, and cancellation/retry are recorded in the same local
195
+ run ledger:
196
+
197
+ ```bash
198
+ todos agent-runs adapter-set codex --command "codex exec --task {task_id}" --sandbox codex
199
+ todos agent-runs queue <task-id> --adapter codex --agent codex --claim --json
200
+ todos agent-runs run-next --dry-run --json
201
+ todos agent-runs run-next --json
202
+ todos agent-runs retry <run-id>
203
+ ```
204
+
205
+ MCP clients can use `set_agent_run_adapter`, `queue_agent_run`,
206
+ `list_agent_run_queue`, `run_next_agent_dispatch`,
207
+ `cancel_agent_run_dispatch`, and `retry_agent_run_dispatch`. These commands
208
+ launch only local processes and do not call hosted runners.
209
+
210
+ ## Local Dependency Workflows
211
+
212
+ Dependencies are stored in the local SQLite database and never require hosted
213
+ services. Use them to keep agents from starting blocked work:
214
+
215
+ ```bash
216
+ todos deps <task-id> --needs <blocking-task-id>
217
+ todos deps <task-id> --graph
218
+ todos blocked
219
+ todos ready
220
+ ```
221
+
222
+ The same workflow is available to MCP clients through
223
+ `add_task_dependency`, `remove_task_dependency`, `get_task_dependencies`, and
224
+ `get_blocked_tasks`. Dependency writes reject cycles, `ready` omits locked or
225
+ blocked pending tasks, and startup schema repair recreates the local dependency
226
+ table for older databases.
227
+
228
+ ## Local Agent Locking
229
+
230
+ Task claims and locks are local SQLite leases. Agents can claim the next ready
231
+ task, renew their lock by re-locking it during long work, inspect stale work,
232
+ and safely steal or redistribute stale tasks without hosted coordination:
233
+
234
+ ```bash
235
+ todos claim codex
236
+ todos --agent codex lock <task-id>
237
+ todos stale --minutes 30
238
+ todos claim codex --steal-stale --stale-minutes 30
239
+ todos redistribute codex --max-age 60
240
+ ```
241
+
242
+ MCP clients get the same local coordination through `claim_next_task`,
243
+ `lock_task`, `unlock_task`, `check_task_lock`, and `get_stale_tasks`.
244
+ `claim_next_task` can opt into stale recovery with `steal_stale` and
245
+ `stale_minutes`.
246
+
247
+ ## Local Plan Templates
248
+
249
+ Reusable plan templates also live in the local SQLite database. They can create
250
+ one task or a full ordered plan with dependencies, variables, priorities, tags,
251
+ and descriptions:
252
+
253
+ ```bash
254
+ todos template-init
255
+ todos template-preview <template-id> --var name=api
256
+ todos templates --use <template-id> --var name=api
257
+ todos template-export <template-id> > plan-template.json
258
+ todos template-import plan-template.json
259
+ ```
260
+
261
+ `todos templates --use` creates every task in a multi-task template and wires
262
+ its local dependency graph, so agents can immediately run `todos ready`,
263
+ `todos blocked`, or `todos deps <task-id> --graph` against the generated plan.
264
+ The same local-only workflow is available to MCP clients through
265
+ `create_template`, `list_templates`, `create_task_from_template`,
266
+ `preview_template`, `export_template`, and `import_template`.
267
+
268
+ ## Local Git Traceability
269
+
270
+ Tasks can be linked to local git evidence without contacting hosted services:
271
+
272
+ ```bash
273
+ todos link-commit <task-id> <sha> --message "fix parser" --files src/parser.ts
274
+ todos link-ref <task-id> task/parser-fix --type branch
275
+ todos link-ref <task-id> 42 --type pr --url https://github.com/hasna/todos/pull/42
276
+ todos record-verification <task-id> "bun test" --status passed --summary "1522 pass"
277
+ todos trace <task-id>
278
+ todos find-commit <sha-prefix>
279
+ todos find-ref <branch-or-pr>
280
+ todos blame src/parser.ts
281
+ ```
282
+
283
+ MCP clients get the same local data through `link_task_to_commit`,
284
+ `find_task_by_commit`, `link_task_git_ref`, `find_tasks_by_git_ref`,
285
+ `add_task_verification`, and `get_task_traceability`, so agents can explain
286
+ which task changed a commit, branch, PR, file, or verification command.
287
+
288
+ ## Local Verification Providers
289
+
290
+ Optional provider adapters let agents standardize local verification without a
291
+ hosted dependency. Providers can classify CI logs, verify browser/screenshot
292
+ artifacts, or run explicitly configured command, script, and testbox-style
293
+ commands with retry and redacted evidence capture:
294
+
295
+ ```bash
296
+ todos verify-providers set local --kind command --command "bun test" --attempts 2 --json
297
+ todos verify-providers set ci --kind ci_log --json
298
+ todos verify-providers capabilities local --json
299
+ todos verify-providers run local --task <task-id> --agent codex --json
300
+ todos verify-providers run ci --task <task-id> --log-file /tmp/ci.log --json
301
+ ```
302
+
303
+ Blacksmith/testbox-style providers are inert until a local command is explicitly
304
+ configured, so the package never calls a cloud runner by default. MCP clients
305
+ use `set_verification_provider`, `list_verification_providers`,
306
+ `get_verification_provider_capabilities`, `run_verification_provider`, and
307
+ `remove_verification_provider` for the same local-only workflow.
308
+
309
+ ## Local Agent Handoffs
310
+
311
+ Handoffs let one local agent leave continuation context for another without a
312
+ hosted inbox. A handoff records the session, referenced tasks, relevant files,
313
+ run ids, completed work, current blockers, and next steps. Readers can filter
314
+ for unread handoffs and acknowledge them per agent:
315
+
316
+ ```bash
317
+ todos handoff --create --agent codex --session codex-42 --summary "Parser work ready for review" --tasks <task-id> --files src/parser.ts --runs <run-id> --next "Review failing fixture" --json
318
+ todos handoff --unread-for claude --json
319
+ todos handoff --read <handoff-id> --json
320
+ todos handoff --ack <handoff-id> --agent claude --json
321
+ todos handoff --recover --agent codex --session codex-42 --json
322
+ ```
323
+
324
+ MCP clients can use `create_handoff`, `list_handoffs`, `read_handoff`,
325
+ `acknowledge_handoff`, `recover_stale_session_handoff`, and
326
+ `get_latest_handoff`. Recovery handoffs inspect local in-progress tasks, file
327
+ links, and run evidence for the agent/session and create a deterministic
328
+ continuation packet; no hosted queue or cloud service is involved.
329
+
330
+ ## Local Run Ledger
331
+
332
+ Agent runs can record local evidence without uploading artifacts or calling a
333
+ hosted API:
334
+
335
+ ```bash
336
+ RUN_ID=$(todos runs start <task-id> --agent codex --title "Parser fix" --claim --json | jq -r .id)
337
+ todos runs event "$RUN_ID" progress "writing regression tests"
338
+ todos runs command "$RUN_ID" "bun test src/parser.test.ts" --status passed --summary "14 pass"
339
+ todos runs file "$RUN_ID" src/parser.ts --status modified
340
+ todos runs artifact "$RUN_ID" logs/parser-test.txt --type log --description "focused test output" --require-file
341
+ todos runs artifact-verify "$RUN_ID"
342
+ todos runs finish "$RUN_ID" --status completed --summary "parser fixed and verified"
343
+ todos runs show "$RUN_ID"
344
+ ```
345
+
346
+ Run command evidence is also mirrored into task verification evidence, file
347
+ events are linked to task file tracking, and comments can be recorded into the
348
+ task timeline. Sensitive-looking tokens, keys, passwords, and bearer values are
349
+ redacted before evidence is stored. Artifact files are copied into a local
350
+ content-addressed store beside the SQLite database, with SHA-256 integrity
351
+ metadata, redaction status, retention metadata, and metadata-only fallback when
352
+ the original path is unavailable. Use `--no-store` to record only artifact
353
+ metadata.
354
+
355
+ ## Local Activity Timeline
356
+
357
+ The timeline command gives agents one ordered, redacted view of local comments,
358
+ task history, run events, command evidence, and artifacts:
359
+
360
+ ```bash
361
+ todos timeline --task <task-id> --json
362
+ todos timeline --project <project-id> --limit 50
363
+ todos timeline --run <run-id> --order asc
364
+ ```
365
+
366
+ MCP clients can call `get_activity_timeline` with `entity_type`, `entity_id`,
367
+ `limit`, `offset`, `since`, and `until`. Timeline entries are derived from the
368
+ local SQLite store and local bridge exports already include the underlying
369
+ comments, runs, run evidence, files, commits, and verification records needed to
370
+ rebuild the same timeline after import.
371
+
372
+ ## Local Task Fields
373
+
374
+ Tasks can carry local labels, severity, owner, area, and custom metadata while
375
+ keeping canonical priority on the task itself:
376
+
377
+ ```bash
378
+ todos fields set <task-id> --labels bug,cli --priority high --severity s1 --owner codex --area parser --field component=parser --json
379
+ todos fields show <task-id> --json
380
+ todos fields query --labels bug,cli --severity s1 --field component=parser --json
381
+ ```
382
+
383
+ Custom values are redacted before storage, labels are mirrored into task tags
384
+ for existing filters, and the metadata is included in local bridge exports.
385
+ MCP clients use `get_task_fields`, `set_task_fields`, and
386
+ `query_tasks_by_fields` for the same local-only workflow.
387
+
388
+ ## Local Saved Search Views
389
+
390
+ Saved views are local SQLite records for repeatable task, project, plan, run,
391
+ comment, and cross-entity searches. They can filter by query text, project,
392
+ task list, plan, task, status, priority, assignee, agent, tags, local fields,
393
+ dependency direction, and time windows:
394
+
395
+ ```bash
396
+ todos views save active-cli --query parser --status pending,in_progress --tag cli --field-area parser --json
397
+ todos views list --json
398
+ todos views run active-cli --json
399
+ todos search parser --scope all --limit 50 --json
400
+ ```
401
+
402
+ View output is stable JSON with `{ view, scope, filters, count, results }`.
403
+ Local bridge exports include saved views, so explicit backups and machine moves
404
+ preserve the filters without any hosted service. MCP clients use
405
+ `save_search_view`, `list_search_views`, `run_search_view`, and
406
+ `delete_search_view`.
407
+
408
+ ## Local Duplicate Detection
409
+
410
+ Agents can scan local tasks for likely duplicates from imported issue URLs,
411
+ stack traces, exact titles, and similar task text, then merge duplicate evidence
412
+ without deleting either task record:
413
+
414
+ ```bash
415
+ todos dedupe scan --threshold 0.8 --json
416
+ todos dedupe merge <primary-task-id> <duplicate-task-id> --reason "same imported issue" --json
417
+ ```
418
+
419
+ Merges archive the duplicate as `cancelled`, add a `duplicates` relationship,
420
+ and preserve comments, dependencies, dependents, run ledgers, files, inbox
421
+ items, verification evidence, history, git refs, commits, and checklist rows on
422
+ the primary task. MCP clients use `find_duplicate_tasks` and
423
+ `merge_duplicate_task` for the same local-only workflow.
424
+
425
+ ## Local Agent Context Packs
426
+
427
+ Context packs create deterministic run-start bundles for Codex, Claude Code,
428
+ Takumi, or any local agent. A pack selects task, project, plan, dependencies,
429
+ acceptance criteria, recent comments, relevant files, verification history,
430
+ traceability, and run-ledger evidence from the local SQLite database only:
431
+
432
+ ```bash
433
+ todos context-pack <task-id> --profile codex --format markdown
434
+ todos context-pack <task-id> --profile claude --format json
435
+ todos context-pack <task-id> --profile takumi --run <run-id> --comments 12 --files 40
436
+ ```
437
+
438
+ MCP clients can call `build_agent_context_pack` with the same limits and choose
439
+ JSON or Markdown output. Long text and evidence are redacted and size-limited,
440
+ and stale or omitted local data is surfaced as warnings in the pack.
441
+
442
+ ## Local Inbox Intake
443
+
444
+ Paste failures, CI logs, GitHub issue URLs, files, or local git context into a
445
+ deduped inbox and create a linked task:
446
+
447
+ ```bash
448
+ todos inbox add "bun test failed: parser regression" --source-type ci_log
449
+ todos inbox add --file /tmp/ci.log --source-name "local CI"
450
+ todos inbox add https://github.com/hasna/todos/issues/42 --source-url https://github.com/hasna/todos/issues/42
451
+ todos inbox git --diff
452
+ todos inbox list
453
+ ```
454
+
455
+ Inbox bodies and metadata are redacted before storage. Repeated input resolves
456
+ to the existing inbox item instead of creating duplicate tasks.
457
+
458
+ ## Local Bridge Import/Export
459
+
460
+ Export a versioned local bridge bundle for migration, backup, or explicit
461
+ hand-off to another local store:
462
+
463
+ ```bash
464
+ todos export --format bridge --output todos-bridge.json
465
+ todos export --format bridge --encrypt --output todos-bridge.enc.json
466
+ todos bridge-import todos-bridge.json --json
467
+ todos bridge-import todos-bridge.json --apply
468
+ todos bridge-import todos-bridge.json --apply --resolve-conflicts
469
+ ```
470
+
471
+ Bridge bundles include local projects, task lists, plans, tasks, dependencies,
472
+ comments, run ledgers, command evidence, file evidence, artifacts, stored
473
+ artifact contents, commits, refs, and verification records. Imports default to
474
+ dry-run mode and report conflicts before writing. The package does not upload
475
+ bundles or call hosted services; any hosted sync must consume the exported JSON
476
+ explicitly.
477
+
478
+ For multi-machine local work, `--resolve-conflicts` performs a safe task merge
479
+ instead of overwriting local edits. It fills blank local fields from the
480
+ incoming bundle, unions tags, merges non-conflicting metadata keys, and records
481
+ unresolved divergent fields in `metadata.sync_conflicts` for manual review.
482
+ Local non-empty title, status, priority, and metadata values win when both sides
483
+ changed.
484
+
485
+ ## todos.md Markdown Import/Export
486
+
487
+ `todos.md` files are readable Markdown checklists with an embedded local bridge
488
+ bundle for lossless round trips. Export keeps the visible tasks, projects, and
489
+ plans easy to inspect while preserving local ids, comments, run ledgers,
490
+ dependencies, files, commits, and verification evidence in a hidden metadata
491
+ block:
492
+
493
+ ```bash
494
+ todos export --format todos.md --output todos.md
495
+ todos todos-md-import todos.md --json
496
+ todos todos-md-import todos.md --apply
497
+ todos todos-md-import todos.md --apply --resolve-conflicts
498
+ ```
499
+
500
+ Existing plain checklists also import locally. Use `# Project: Name`, `## Plan:
501
+ Name`, checkbox items, optional `priority: high`, `comment: ...`, `depends_on:
502
+ Other task title`, `run: completed smoke`, `#tags`, and `@agent` markers to
503
+ migrate older files without a hosted service.
504
+
505
+ ## Local Doctor and Repair
506
+
507
+ `todos doctor` audits the local SQLite database without calling hosted services.
508
+ By default it is a dry-run and reports schema/migration drift, orphaned rows,
509
+ duplicate indexes, invalid JSON metadata, missing project roots, and unsafe
510
+ database file permissions:
511
+
512
+ ```bash
513
+ todos doctor
514
+ todos doctor --json
515
+ ```
516
+
517
+ Safe repairs require explicit apply mode. Before any mutation, the command
518
+ creates a local backup next to the database when the database is file-backed:
519
+
520
+ ```bash
521
+ todos doctor --apply
522
+ ```
523
+
524
+ Repairs are limited to local integrity fixes such as running the migration
525
+ safety net, clearing missing parent references, pruning orphaned dependency/run
526
+ rows, resetting invalid metadata JSON to `{}`, dropping duplicate non-primary
527
+ indexes, and tightening database file permissions.
528
+
20
529
  ## MCP Server
21
530
 
22
531
  ```bash
@@ -62,6 +571,23 @@ curl "http://localhost:19427/api/tasks/<id>/history?limit=20"
62
571
 
63
572
  Data is stored in `~/.hasna/todos/`.
64
573
 
574
+ ## Local-Only Security Boundary
575
+
576
+ `@hasna/todos` is an open source, local-first package. The CLI, MCP server, SDK,
577
+ and local dashboard read and write local state by default and do not require a
578
+ hosted API, cloud account, billing provider, or remote model provider.
579
+
580
+ Release checks enforce that boundary before publishing:
581
+
582
+ - package metadata must stay public and point at `hasna/todos`
583
+ - install snippets must use `bun install -g @hasna/todos`
584
+ - package dependencies and generated tarballs are scanned for private or hosted
585
+ service coupling
586
+ - public text surfaces and packed files are scanned for secret-like values
587
+ - local runtime tests use a no-network fixture for local-only workflows
588
+ - `bun run verify:release` builds, packs, validates provenance, and runs a clean
589
+ Bun global install smoke test from the candidate tarball
590
+
65
591
  ## License
66
592
 
67
593
  Apache-2.0 -- see [LICENSE](LICENSE)