@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.
- package/README.md +527 -1
- package/dashboard/dist/assets/{index-B-w1tUlm.js → index-CVF1vn7Z.js} +23 -23
- package/dashboard/dist/assets/index-DJm6m6Yy.css +1 -0
- package/dashboard/dist/index.html +2 -2
- package/dist/cli/commands/agent-commands.d.ts.map +1 -1
- package/dist/cli/commands/config-serve-commands.d.ts.map +1 -1
- package/dist/cli/commands/mcp-hooks-commands.d.ts.map +1 -1
- package/dist/cli/commands/plan-template-commands.d.ts.map +1 -1
- package/dist/cli/commands/project-commands.d.ts.map +1 -1
- package/dist/cli/commands/query-commands.d.ts.map +1 -1
- package/dist/cli/index.js +17662 -8245
- package/dist/cli-mcp-parity.d.ts +41 -0
- package/dist/cli-mcp-parity.d.ts.map +1 -0
- package/dist/contracts.d.ts +4 -0
- package/dist/contracts.d.ts.map +1 -1
- package/dist/contracts.js +6396 -24
- package/dist/db/database.d.ts +2 -1
- package/dist/db/database.d.ts.map +1 -1
- package/dist/db/handoffs.d.ts +27 -1
- package/dist/db/handoffs.d.ts.map +1 -1
- package/dist/db/inbox.d.ts +47 -0
- package/dist/db/inbox.d.ts.map +1 -0
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/plans.d.ts.map +1 -1
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/task-commits.d.ts +51 -0
- package/dist/db/task-commits.d.ts.map +1 -1
- package/dist/db/task-crud.d.ts.map +1 -1
- package/dist/db/task-lifecycle.d.ts +16 -1
- package/dist/db/task-lifecycle.d.ts.map +1 -1
- package/dist/db/task-runs.d.ts +130 -0
- package/dist/db/task-runs.d.ts.map +1 -0
- package/dist/db/tasks.d.ts +2 -2
- package/dist/db/tasks.d.ts.map +1 -1
- package/dist/index.d.ts +49 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13353 -6350
- package/dist/json-contracts.d.ts.map +1 -1
- package/dist/lib/activity-timeline.d.ts +43 -0
- package/dist/lib/activity-timeline.d.ts.map +1 -0
- package/dist/lib/agent-run-dispatcher.d.ts +62 -0
- package/dist/lib/agent-run-dispatcher.d.ts.map +1 -0
- package/dist/lib/approval-gates.d.ts +52 -0
- package/dist/lib/approval-gates.d.ts.map +1 -0
- package/dist/lib/artifact-store.d.ts +68 -0
- package/dist/lib/artifact-store.d.ts.map +1 -0
- package/dist/lib/auto-assign.d.ts +3 -5
- package/dist/lib/auto-assign.d.ts.map +1 -1
- package/dist/lib/config.d.ts +121 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/context-packs.d.ts +140 -0
- package/dist/lib/context-packs.d.ts.map +1 -0
- package/dist/lib/doctor.d.ts +46 -0
- package/dist/lib/doctor.d.ts.map +1 -0
- package/dist/lib/event-hooks.d.ts +58 -0
- package/dist/lib/event-hooks.d.ts.map +1 -0
- package/dist/lib/local-bridge.d.ts +79 -0
- package/dist/lib/local-bridge.d.ts.map +1 -0
- package/dist/lib/local-encryption.d.ts +94 -0
- package/dist/lib/local-encryption.d.ts.map +1 -0
- package/dist/lib/local-fields.d.ts +33 -0
- package/dist/lib/local-fields.d.ts.map +1 -0
- package/dist/lib/policy-packs.d.ts +87 -0
- package/dist/lib/policy-packs.d.ts.map +1 -0
- package/dist/lib/project-bootstrap.d.ts +35 -0
- package/dist/lib/project-bootstrap.d.ts.map +1 -0
- package/dist/lib/public-release-gate.d.ts +50 -0
- package/dist/lib/public-release-gate.d.ts.map +1 -0
- package/dist/lib/redaction.d.ts +3 -0
- package/dist/lib/redaction.d.ts.map +1 -0
- package/dist/lib/runner-sandbox.d.ts +50 -0
- package/dist/lib/runner-sandbox.d.ts.map +1 -0
- package/dist/lib/saved-search-views.d.ts +60 -0
- package/dist/lib/saved-search-views.d.ts.map +1 -0
- package/dist/lib/task-contracts.d.ts +75 -0
- package/dist/lib/task-contracts.d.ts.map +1 -0
- package/dist/lib/task-dedupe.d.ts +45 -0
- package/dist/lib/task-dedupe.d.ts.map +1 -0
- package/dist/lib/todos-md.d.ts +21 -0
- package/dist/lib/todos-md.d.ts.map +1 -0
- package/dist/lib/verification-providers.d.ts +54 -0
- package/dist/lib/verification-providers.d.ts.map +1 -0
- package/dist/lib/workspace-trust.d.ts +38 -0
- package/dist/lib/workspace-trust.d.ts.map +1 -0
- package/dist/mcp/index.js +9717 -3197
- package/dist/mcp/token-utils.d.ts +2 -2
- package/dist/mcp/token-utils.d.ts.map +1 -1
- package/dist/mcp/tools/task-adv-tools.d.ts.map +1 -1
- package/dist/mcp/tools/task-auto-tools.d.ts.map +1 -1
- package/dist/mcp/tools/task-meta-tools.d.ts.map +1 -1
- package/dist/mcp/tools/task-project-tools.d.ts.map +1 -1
- package/dist/mcp/tools/task-rel-tools.d.ts.map +1 -1
- package/dist/mcp/tools/task-resources.d.ts.map +1 -1
- package/dist/mcp/tools/task-workflow-tools.d.ts.map +1 -1
- package/dist/mcp.js +88 -2
- package/dist/registry.d.ts +2 -0
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +7061 -60
- package/dist/release-provenance.json +7 -0
- package/dist/sdk/types.d.ts +26 -1
- package/dist/sdk/types.d.ts.map +1 -1
- package/dist/server/index.js +1330 -129
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/storage.js +1054 -15
- package/dist/test/no-network.d.ts +7 -0
- package/dist/test/no-network.d.ts.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +10 -4
- 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
|
-
|
|
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)
|