saga-mcp 1.7.1 → 1.8.0

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 CHANGED
@@ -12,7 +12,7 @@ lived in the context window, or in a `TODO.md` nobody updates.
12
12
 
13
13
  saga-mcp gives the agent a real tracker instead: a SQLite file in your project
14
14
  holding projects, epics, tasks, subtasks, dependencies, comments, notes and
15
- decisions, exposed as 33 MCP tools. The agent writes to it as it works and
15
+ decisions, exposed as 35 MCP tools. The agent writes to it as it works and
16
16
  reads the dashboard when it comes back. No accounts, no external service, no
17
17
  network calls — the database is a file you own.
18
18
 
@@ -66,6 +66,8 @@ recent activity, notes.
66
66
 
67
67
  - **Full hierarchy**: Projects > Epics > Tasks > Subtasks
68
68
  - **Task dependencies**: Express sequencing with auto-block/unblock when deps are met
69
+ - **Description lock**: Stop agents rewriting a task's spec when they meant to leave a comment
70
+ - **Subtask ordering & dependencies**: Explicit order, and checklist items that wait on siblings
69
71
  - **Comments**: Threaded discussions on tasks — leave breadcrumbs across sessions, with reversible soft-delete
70
72
  - **Web UI**: `saga-web` serves a local dashboard for browsing *and* editing the same database
71
73
  - **Templates**: Reusable task sets with `{variable}` substitution
@@ -74,7 +76,7 @@ recent activity, notes.
74
76
  - **Activity log**: Every mutation is automatically tracked with old/new values
75
77
  - **Notes system**: Decisions, context, meeting notes, blockers — all searchable
76
78
  - **Batch operations**: Create multiple subtasks or update multiple tasks in one call
77
- - **33 focused tools**: With MCP safety annotations on every tool
79
+ - **35 focused tools**: With MCP safety annotations on every tool
78
80
  - **Import/export**: Full project backup and migration as JSON (with dependencies and comments)
79
81
  - **Source references**: Link tasks to specific code locations
80
82
  - **Auto time tracking**: Hours computed automatically from activity log
@@ -188,6 +190,7 @@ import/export, session diffs and the rest discoverable.
188
190
  | `task_list` | List/filter tasks with dependency info | `readOnly: true` |
189
191
  | `task_get` | Get task with subtasks, notes, comments, and dependencies | `readOnly: true` |
190
192
  | `task_update` | Update task (auto-logs, auto-blocks/unblocks) | `readOnly: false`, `idempotent: true` |
193
+ | `task_lock_description` | Lock/unlock a description so agents can't rewrite it | `readOnly: false`, `idempotent: true` |
191
194
  | `task_batch_update` | Update multiple tasks at once | `readOnly: false`, `idempotent: true` |
192
195
 
193
196
  ### Subtasks
@@ -195,7 +198,8 @@ import/export, session diffs and the rest discoverable.
195
198
  | Tool | Description | Annotations |
196
199
  |------|-------------|-------------|
197
200
  | `subtask_create` | Create subtask(s) — supports batch | `readOnly: false` |
198
- | `subtask_update` | Update subtask title/status | `readOnly: false`, `idempotent: true` |
201
+ | `subtask_update` | Update title/status/position; `depends_on` and `blocks` set ordering | `readOnly: false`, `idempotent: true` |
202
+ | `subtask_reorder` | Set the order of a task's subtasks in one call | `readOnly: false`, `idempotent: true` |
199
203
  | `subtask_delete` | Delete subtask(s) — supports batch | `destructive: true`, `idempotent: true` |
200
204
 
201
205
  ### Comments
@@ -356,6 +360,41 @@ project was a guess, rather than silently reporting on the wrong repo.
356
360
  The web UI is unaffected either way: its project switcher lists every project in the database, and
357
361
  each tab is scoped to the selected one.
358
362
 
363
+ ## Keeping agents on the rails
364
+
365
+ Two guards for the ways an agent goes wrong on a long task.
366
+
367
+ **A locked description.** Agents sometimes rewrite a task's description to record progress, when
368
+ they meant to add a comment — and the spec you agreed on is gone. Lock it and `task_update` refuses:
369
+
370
+ ```
371
+ task_lock_description({ id: 12 })
372
+ task_update({ id: 12, description: "..." })
373
+ -> Task 12's description is locked and was not changed. Record progress with
374
+ comment_add instead, or unlock it in the web UI if the description is genuinely wrong.
375
+ ```
376
+
377
+ Everything else about the task stays editable — the point is to protect the spec, not freeze the
378
+ task. The lock cannot be cleared as a side effect of an ordinary `task_update`; it takes a
379
+ deliberate `task_lock_description` call or the lock toggle in the web UI, and both are logged.
380
+
381
+ This is a guard against confusion, not an adversarial control: an agent that is told to unlock
382
+ still can. It turns a silent overwrite into a visible, reversible decision.
383
+
384
+ **Subtask order and dependencies.** New subtasks are appended in order rather than all landing at
385
+ position 0, `subtask_reorder` sets the order in one call (or drag them in the UI), and a subtask
386
+ can wait on its siblings:
387
+
388
+ ```
389
+ subtask_update({ id: 8, depends_on: [5, 6] }) # 8 waits for 5 and 6
390
+ subtask_update({ id: 4, blocks: [5, 6, 7, 8] }) # a bug that holds up the rest
391
+ ```
392
+
393
+ Reads then carry `depends_on` and `blocked`, and the UI marks blocked items. Dependencies stay
394
+ within one task — a checklist item waiting on something under a *different* task is a task-level
395
+ dependency, and `task_update depends_on` already models that. Cycles are refused with the loop
396
+ spelled out.
397
+
359
398
  ## Web UI
360
399
 
361
400
  Everything above is agent-facing. `saga-web` puts the same database in a browser — for the times
@@ -385,7 +424,7 @@ What you get:
385
424
  - **Board** — kanban across the five task statuses; drag a card to change its status
386
425
  - **Epics** — the full Epic → Task → Subtask tree, which is the fastest way to review a spec an agent just wrote
387
426
  - **Notes** and **Activity** — decisions and the complete change history
388
- - **Task drawer** — edit any field, tick subtasks, comment, remove or restore a comment
427
+ - **Task drawer** — edit any field, tick subtasks, comment, remove or restore a comment, lock the description, drag subtasks into order, and set which subtasks wait on which
389
428
  - **Project switcher** — every project in the database, so one central `.tracker.db` covers all your repos; every tab, including Activity, is scoped to the selected project
390
429
  - **Shareable, refreshable URLs** — the open project, tab and task live in the address bar, so a browser refresh puts you back where you were and back/forward move between tasks. A ⟳ button in the task drawer re-reads that task without a page reload, for picking up what an agent just wrote
391
430
 
package/dist/db.js CHANGED
@@ -47,6 +47,10 @@ export function getDb() {
47
47
  db.exec('CREATE INDEX IF NOT EXISTS idx_comments_task_live ON comments(task_id, is_deleted)');
48
48
  }
49
49
  catch { /* index already exists */ }
50
+ try {
51
+ db.exec('ALTER TABLE tasks ADD COLUMN description_locked INTEGER NOT NULL DEFAULT 0');
52
+ }
53
+ catch { /* column already exists */ }
50
54
  return db;
51
55
  }
52
56
  export function closeDb() {
package/dist/db.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,IAAI,EAAE,GAA6B,IAAI,CAAC;AAExC,MAAM,UAAU,KAAK;IACnB,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IAElB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;IACnC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,mIAAmI,CACpI,CAAC;IACJ,CAAC;IAED,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAE1B,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC/B,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACjC,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAElC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAEpB,oCAAoC;IACpC,IAAI,CAAC;QAAC,EAAE,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,2BAA2B,CAAC,CAAC;IACtG,IAAI,CAAC;QAAC,EAAE,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,2BAA2B,CAAC,CAAC;IAClG,IAAI,CAAC;QAAC,EAAE,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,0BAA0B,CAAC,CAAC;IACrH,IAAI,CAAC;QAAC,EAAE,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,2BAA2B,CAAC,CAAC;IAC/H,IAAI,CAAC;QAAC,EAAE,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,2BAA2B,CAAC,CAAC;IACzG,IAAI,CAAC;QAAC,EAAE,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,2BAA2B,CAAC,CAAC;IACzG,IAAI,CAAC;QAAC,EAAE,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,2BAA2B,CAAC,CAAC;IAC5G,IAAI,CAAC;QAAC,EAAE,CAAC,IAAI,CAAC,oFAAoF,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,0BAA0B,CAAC,CAAC;IAE3I,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,IAAI,EAAE,EAAE,CAAC;QACP,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,EAAE,GAAG,IAAI,CAAC;IACZ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,IAAI,EAAE,GAA6B,IAAI,CAAC;AAExC,MAAM,UAAU,KAAK;IACnB,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IAElB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;IACnC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,mIAAmI,CACpI,CAAC;IACJ,CAAC;IAED,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAE1B,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC/B,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACjC,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAElC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAEpB,oCAAoC;IACpC,IAAI,CAAC;QAAC,EAAE,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,2BAA2B,CAAC,CAAC;IACtG,IAAI,CAAC;QAAC,EAAE,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,2BAA2B,CAAC,CAAC;IAClG,IAAI,CAAC;QAAC,EAAE,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,0BAA0B,CAAC,CAAC;IACrH,IAAI,CAAC;QAAC,EAAE,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,2BAA2B,CAAC,CAAC;IAC/H,IAAI,CAAC;QAAC,EAAE,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,2BAA2B,CAAC,CAAC;IACzG,IAAI,CAAC;QAAC,EAAE,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,2BAA2B,CAAC,CAAC;IACzG,IAAI,CAAC;QAAC,EAAE,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,2BAA2B,CAAC,CAAC;IAC5G,IAAI,CAAC;QAAC,EAAE,CAAC,IAAI,CAAC,oFAAoF,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,0BAA0B,CAAC,CAAC;IAC3I,IAAI,CAAC;QAAC,EAAE,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,2BAA2B,CAAC,CAAC;IAEpI,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,IAAI,EAAE,EAAE,CAAC;QACP,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,EAAE,GAAG,IAAI,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -16,6 +16,8 @@ export function truncate(text, max = LIST_DESCRIPTION_CHARS) {
16
16
  }
17
17
  /** Fields never worth their bytes in a list response. */
18
18
  const ALWAYS_DROP = new Set(['metadata']);
19
+ /** Flags that only matter when set — carrying the common `0` is pure noise. */
20
+ const DROP_WHEN_ZERO = new Set(['description_locked', 'is_deleted']);
19
21
  /**
20
22
  * Strip a list row down: no nulls, no metadata blob, no empty tags array, and
21
23
  * long text fields truncated. Everything removed here is still available from
@@ -28,6 +30,8 @@ export function slimListRow(row, truncateFields = ['description'], drop = []) {
28
30
  continue;
29
31
  if (ALWAYS_DROP.has(key) || drop.includes(key))
30
32
  continue;
33
+ if (DROP_WHEN_ZERO.has(key) && (value === 0 || value === false))
34
+ continue;
31
35
  if (key === 'tags' && (value === '[]' || value === ''))
32
36
  continue;
33
37
  if (truncateFields.includes(key) && typeof value === 'string') {
@@ -1 +1 @@
1
- {"version":3,"file":"slim.js","sourceRoot":"","sources":["../../src/helpers/slim.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,mFAAmF;AACnF,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAE1C,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,GAAG,GAAG,sBAAsB;IACjE,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,IAAI,CAAC;IACpC,0EAA0E;IAC1E,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/B,MAAM,SAAS,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACvC,OAAO,CAAC,SAAS,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC;AACjF,CAAC;AAED,yDAAyD;AACzD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;AAE1C;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACzB,GAA4B,EAC5B,iBAA2B,CAAC,aAAa,CAAC,EAC1C,OAAiB,EAAE;IAEnB,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QACpD,IAAI,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,SAAS;QACzD,IAAI,GAAG,KAAK,MAAM,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YAAE,SAAS;QACjE,IAAI,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9D,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC3B,SAAS;QACX,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,QAAQ,CACtB,IAAoC,EACpC,cAAyB,EACzB,IAAe;IAEf,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC;AACnE,CAAC"}
1
+ {"version":3,"file":"slim.js","sourceRoot":"","sources":["../../src/helpers/slim.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,mFAAmF;AACnF,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAE1C,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,GAAG,GAAG,sBAAsB;IACjE,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,IAAI,CAAC;IACpC,0EAA0E;IAC1E,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/B,MAAM,SAAS,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACvC,OAAO,CAAC,SAAS,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC;AACjF,CAAC;AAED,yDAAyD;AACzD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;AAE1C,+EAA+E;AAC/E,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,oBAAoB,EAAE,YAAY,CAAC,CAAC,CAAC;AAErE;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACzB,GAA4B,EAC5B,iBAA2B,CAAC,aAAa,CAAC,EAC1C,OAAiB,EAAE;IAEnB,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QACpD,IAAI,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,SAAS;QACzD,IAAI,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,KAAK,CAAC;YAAE,SAAS;QAC1E,IAAI,GAAG,KAAK,MAAM,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YAAE,SAAS;QACjE,IAAI,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9D,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC3B,SAAS;QACX,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,QAAQ,CACtB,IAAoC,EACpC,cAAyB,EACzB,IAAe;IAEf,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC;AACnE,CAAC"}
package/dist/schema.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const SCHEMA_SQL = "\n-- Core hierarchy: projects > epics > tasks > subtasks\n\nCREATE TABLE IF NOT EXISTS projects (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT NOT NULL,\n description TEXT,\n status TEXT NOT NULL DEFAULT 'active'\n CHECK (status IN ('active', 'on_hold', 'completed', 'archived')),\n tags TEXT NOT NULL DEFAULT '[]',\n metadata TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE TABLE IF NOT EXISTS epics (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n project_id INTEGER NOT NULL REFERENCES projects(id) ON DELETE CASCADE,\n name TEXT NOT NULL,\n description TEXT,\n status TEXT NOT NULL DEFAULT 'planned'\n CHECK (status IN ('planned', 'in_progress', 'completed', 'cancelled')),\n priority TEXT NOT NULL DEFAULT 'medium'\n CHECK (priority IN ('low', 'medium', 'high', 'critical')),\n sort_order INTEGER NOT NULL DEFAULT 0,\n branch TEXT,\n tags TEXT NOT NULL DEFAULT '[]',\n metadata TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE TABLE IF NOT EXISTS tasks (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n epic_id INTEGER NOT NULL REFERENCES epics(id) ON DELETE CASCADE,\n title TEXT NOT NULL,\n description TEXT,\n status TEXT NOT NULL DEFAULT 'todo'\n CHECK (status IN ('todo', 'in_progress', 'review', 'done', 'blocked')),\n priority TEXT NOT NULL DEFAULT 'medium'\n CHECK (priority IN ('low', 'medium', 'high', 'critical')),\n sort_order INTEGER NOT NULL DEFAULT 0,\n assigned_to TEXT,\n estimated_hours REAL,\n actual_hours REAL,\n due_date TEXT,\n source_ref TEXT,\n tags TEXT NOT NULL DEFAULT '[]',\n metadata TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE TABLE IF NOT EXISTS subtasks (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n task_id INTEGER NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,\n title TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'todo'\n CHECK (status IN ('todo', 'in_progress', 'done')),\n sort_order INTEGER NOT NULL DEFAULT 0,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Task dependencies (junction table)\n\nCREATE TABLE IF NOT EXISTS task_dependencies (\n task_id INTEGER NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,\n depends_on_task_id INTEGER NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n PRIMARY KEY (task_id, depends_on_task_id)\n);\n\n-- Comments (threaded discussions on tasks)\n\nCREATE TABLE IF NOT EXISTS comments (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n task_id INTEGER NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,\n author TEXT,\n content TEXT NOT NULL,\n is_deleted INTEGER NOT NULL DEFAULT 0,\n deleted_at TEXT,\n deleted_by TEXT,\n delete_reason TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Task templates\n\nCREATE TABLE IF NOT EXISTS templates (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT NOT NULL UNIQUE,\n description TEXT,\n template_data TEXT NOT NULL DEFAULT '[]',\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Unified notes (replaces summaries + status_updates + context)\n\nCREATE TABLE IF NOT EXISTS notes (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n title TEXT NOT NULL,\n content TEXT NOT NULL,\n note_type TEXT NOT NULL DEFAULT 'general'\n CHECK (note_type IN (\n 'general', 'decision', 'context', 'meeting',\n 'technical', 'blocker', 'progress', 'release'\n )),\n related_entity_type TEXT CHECK (related_entity_type IN ('project', 'epic', 'task') OR related_entity_type IS NULL),\n related_entity_id INTEGER,\n tags TEXT NOT NULL DEFAULT '[]',\n metadata TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Automatic activity log\n\nCREATE TABLE IF NOT EXISTS activity_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n entity_type TEXT NOT NULL,\n entity_id INTEGER NOT NULL,\n action TEXT NOT NULL,\n field_name TEXT,\n old_value TEXT,\n new_value TEXT,\n summary TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Indexes\n\nCREATE INDEX IF NOT EXISTS idx_epics_project_id ON epics(project_id);\nCREATE INDEX IF NOT EXISTS idx_tasks_epic_id ON tasks(epic_id);\nCREATE INDEX IF NOT EXISTS idx_subtasks_task_id ON subtasks(task_id);\n\nCREATE INDEX IF NOT EXISTS idx_projects_status ON projects(status);\nCREATE INDEX IF NOT EXISTS idx_epics_status ON epics(status);\nCREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);\nCREATE INDEX IF NOT EXISTS idx_subtasks_status ON subtasks(status);\n\nCREATE INDEX IF NOT EXISTS idx_epics_priority ON epics(priority);\nCREATE INDEX IF NOT EXISTS idx_tasks_priority ON tasks(priority);\n\nCREATE INDEX IF NOT EXISTS idx_epics_sort ON epics(project_id, sort_order);\nCREATE INDEX IF NOT EXISTS idx_tasks_sort ON tasks(epic_id, sort_order);\nCREATE INDEX IF NOT EXISTS idx_subtasks_sort ON subtasks(task_id, sort_order);\n\nCREATE INDEX IF NOT EXISTS idx_notes_type ON notes(note_type);\nCREATE INDEX IF NOT EXISTS idx_notes_entity ON notes(related_entity_type, related_entity_id);\nCREATE INDEX IF NOT EXISTS idx_notes_created ON notes(created_at DESC);\n\nCREATE INDEX IF NOT EXISTS idx_activity_entity ON activity_log(entity_type, entity_id);\nCREATE INDEX IF NOT EXISTS idx_activity_created ON activity_log(created_at DESC);\nCREATE INDEX IF NOT EXISTS idx_activity_action ON activity_log(action);\n\nCREATE INDEX IF NOT EXISTS idx_tasks_assigned ON tasks(assigned_to);\nCREATE INDEX IF NOT EXISTS idx_tasks_due ON tasks(due_date);\n\nCREATE INDEX IF NOT EXISTS idx_task_deps_depends ON task_dependencies(depends_on_task_id);\nCREATE INDEX IF NOT EXISTS idx_comments_task ON comments(task_id);\n";
1
+ export declare const SCHEMA_SQL = "\n-- Core hierarchy: projects > epics > tasks > subtasks\n\nCREATE TABLE IF NOT EXISTS projects (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT NOT NULL,\n description TEXT,\n status TEXT NOT NULL DEFAULT 'active'\n CHECK (status IN ('active', 'on_hold', 'completed', 'archived')),\n tags TEXT NOT NULL DEFAULT '[]',\n metadata TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE TABLE IF NOT EXISTS epics (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n project_id INTEGER NOT NULL REFERENCES projects(id) ON DELETE CASCADE,\n name TEXT NOT NULL,\n description TEXT,\n status TEXT NOT NULL DEFAULT 'planned'\n CHECK (status IN ('planned', 'in_progress', 'completed', 'cancelled')),\n priority TEXT NOT NULL DEFAULT 'medium'\n CHECK (priority IN ('low', 'medium', 'high', 'critical')),\n sort_order INTEGER NOT NULL DEFAULT 0,\n branch TEXT,\n tags TEXT NOT NULL DEFAULT '[]',\n metadata TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE TABLE IF NOT EXISTS tasks (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n epic_id INTEGER NOT NULL REFERENCES epics(id) ON DELETE CASCADE,\n title TEXT NOT NULL,\n description TEXT,\n status TEXT NOT NULL DEFAULT 'todo'\n CHECK (status IN ('todo', 'in_progress', 'review', 'done', 'blocked')),\n priority TEXT NOT NULL DEFAULT 'medium'\n CHECK (priority IN ('low', 'medium', 'high', 'critical')),\n sort_order INTEGER NOT NULL DEFAULT 0,\n assigned_to TEXT,\n estimated_hours REAL,\n actual_hours REAL,\n due_date TEXT,\n source_ref TEXT,\n tags TEXT NOT NULL DEFAULT '[]',\n metadata TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE TABLE IF NOT EXISTS subtasks (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n task_id INTEGER NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,\n title TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'todo'\n CHECK (status IN ('todo', 'in_progress', 'done')),\n sort_order INTEGER NOT NULL DEFAULT 0,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Task dependencies (junction table)\n\nCREATE TABLE IF NOT EXISTS task_dependencies (\n task_id INTEGER NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,\n depends_on_task_id INTEGER NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n PRIMARY KEY (task_id, depends_on_task_id)\n);\n\n-- Subtask dependencies (junction table, same shape as task_dependencies)\n\nCREATE TABLE IF NOT EXISTS subtask_dependencies (\n subtask_id INTEGER NOT NULL REFERENCES subtasks(id) ON DELETE CASCADE,\n depends_on_subtask_id INTEGER NOT NULL REFERENCES subtasks(id) ON DELETE CASCADE,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n PRIMARY KEY (subtask_id, depends_on_subtask_id)\n);\n\n-- Comments (threaded discussions on tasks)\n\nCREATE TABLE IF NOT EXISTS comments (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n task_id INTEGER NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,\n author TEXT,\n content TEXT NOT NULL,\n is_deleted INTEGER NOT NULL DEFAULT 0,\n deleted_at TEXT,\n deleted_by TEXT,\n delete_reason TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Task templates\n\nCREATE TABLE IF NOT EXISTS templates (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT NOT NULL UNIQUE,\n description TEXT,\n template_data TEXT NOT NULL DEFAULT '[]',\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Unified notes (replaces summaries + status_updates + context)\n\nCREATE TABLE IF NOT EXISTS notes (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n title TEXT NOT NULL,\n content TEXT NOT NULL,\n note_type TEXT NOT NULL DEFAULT 'general'\n CHECK (note_type IN (\n 'general', 'decision', 'context', 'meeting',\n 'technical', 'blocker', 'progress', 'release'\n )),\n related_entity_type TEXT CHECK (related_entity_type IN ('project', 'epic', 'task') OR related_entity_type IS NULL),\n related_entity_id INTEGER,\n tags TEXT NOT NULL DEFAULT '[]',\n metadata TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Automatic activity log\n\nCREATE TABLE IF NOT EXISTS activity_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n entity_type TEXT NOT NULL,\n entity_id INTEGER NOT NULL,\n action TEXT NOT NULL,\n field_name TEXT,\n old_value TEXT,\n new_value TEXT,\n summary TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Indexes\n\nCREATE INDEX IF NOT EXISTS idx_epics_project_id ON epics(project_id);\nCREATE INDEX IF NOT EXISTS idx_tasks_epic_id ON tasks(epic_id);\nCREATE INDEX IF NOT EXISTS idx_subtasks_task_id ON subtasks(task_id);\n\nCREATE INDEX IF NOT EXISTS idx_projects_status ON projects(status);\nCREATE INDEX IF NOT EXISTS idx_epics_status ON epics(status);\nCREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);\nCREATE INDEX IF NOT EXISTS idx_subtasks_status ON subtasks(status);\n\nCREATE INDEX IF NOT EXISTS idx_epics_priority ON epics(priority);\nCREATE INDEX IF NOT EXISTS idx_tasks_priority ON tasks(priority);\n\nCREATE INDEX IF NOT EXISTS idx_epics_sort ON epics(project_id, sort_order);\nCREATE INDEX IF NOT EXISTS idx_tasks_sort ON tasks(epic_id, sort_order);\nCREATE INDEX IF NOT EXISTS idx_subtasks_sort ON subtasks(task_id, sort_order);\n\nCREATE INDEX IF NOT EXISTS idx_notes_type ON notes(note_type);\nCREATE INDEX IF NOT EXISTS idx_notes_entity ON notes(related_entity_type, related_entity_id);\nCREATE INDEX IF NOT EXISTS idx_notes_created ON notes(created_at DESC);\n\nCREATE INDEX IF NOT EXISTS idx_activity_entity ON activity_log(entity_type, entity_id);\nCREATE INDEX IF NOT EXISTS idx_activity_created ON activity_log(created_at DESC);\nCREATE INDEX IF NOT EXISTS idx_activity_action ON activity_log(action);\n\nCREATE INDEX IF NOT EXISTS idx_tasks_assigned ON tasks(assigned_to);\nCREATE INDEX IF NOT EXISTS idx_tasks_due ON tasks(due_date);\n\nCREATE INDEX IF NOT EXISTS idx_task_deps_depends ON task_dependencies(depends_on_task_id);\nCREATE INDEX IF NOT EXISTS idx_subtask_deps_depends ON subtask_dependencies(depends_on_subtask_id);\nCREATE INDEX IF NOT EXISTS idx_comments_task ON comments(task_id);\n";
package/dist/schema.js CHANGED
@@ -71,6 +71,15 @@ CREATE TABLE IF NOT EXISTS task_dependencies (
71
71
  PRIMARY KEY (task_id, depends_on_task_id)
72
72
  );
73
73
 
74
+ -- Subtask dependencies (junction table, same shape as task_dependencies)
75
+
76
+ CREATE TABLE IF NOT EXISTS subtask_dependencies (
77
+ subtask_id INTEGER NOT NULL REFERENCES subtasks(id) ON DELETE CASCADE,
78
+ depends_on_subtask_id INTEGER NOT NULL REFERENCES subtasks(id) ON DELETE CASCADE,
79
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
80
+ PRIMARY KEY (subtask_id, depends_on_subtask_id)
81
+ );
82
+
74
83
  -- Comments (threaded discussions on tasks)
75
84
 
76
85
  CREATE TABLE IF NOT EXISTS comments (
@@ -159,6 +168,7 @@ CREATE INDEX IF NOT EXISTS idx_tasks_assigned ON tasks(assigned_to);
159
168
  CREATE INDEX IF NOT EXISTS idx_tasks_due ON tasks(due_date);
160
169
 
161
170
  CREATE INDEX IF NOT EXISTS idx_task_deps_depends ON task_dependencies(depends_on_task_id);
171
+ CREATE INDEX IF NOT EXISTS idx_subtask_deps_depends ON subtask_dependencies(depends_on_subtask_id);
162
172
  CREATE INDEX IF NOT EXISTS idx_comments_task ON comments(task_id);
163
173
  `;
164
174
  //# sourceMappingURL=schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkKzB,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4KzB,CAAC"}
@@ -68,6 +68,7 @@ function handleExport(args) {
68
68
  actual_hours: task.actual_hours,
69
69
  due_date: task.due_date,
70
70
  source_ref: task.source_ref,
71
+ description_locked: task.description_locked,
71
72
  tags: task.tags,
72
73
  metadata: task.metadata,
73
74
  depends_on: deps.map((d) => d.depends_on_task_id),
@@ -1 +1 @@
1
- {"version":3,"file":"export-import.js","sourceRoot":"","sources":["../../src/tools/export-import.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"export-import.js","sourceRoot":"","sources":["../../src/tools/export-import.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@ import { slimList } from '../helpers/slim.js';
5
5
  export const definitions = [
6
6
  {
7
7
  name: 'tracker_search',
8
- description: 'Search across ALL entities (projects, epics, tasks, notes) by keyword. Returns categorized results. Pass branch="current" to restrict epic/task matches to the active git branch (projects and notes are not branch-scoped).',
8
+ description: 'Search projects, epics, tasks and notes by keyword. Returns categorized previews use task_get or note_list for full text.',
9
9
  annotations: { title: 'Global Search', readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
10
10
  inputSchema: {
11
11
  type: 'object',
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,20 @@
1
1
  import type { Tool } from '@modelcontextprotocol/sdk/types.js';
2
+ import type Database from 'better-sqlite3';
2
3
  import type { ToolHandler } from '../types.js';
3
4
  export declare const definitions: Tool[];
5
+ /**
6
+ * Subtasks have no 'blocked' status — the three they have are enough, and
7
+ * widening the CHECK constraint would mean rebuilding the table. So a blocked
8
+ * subtask is reported, not restyled: reads carry depends_on and blocked.
9
+ */
10
+ export declare function describeDependencies(db: Database.Database, subtaskId: number): {
11
+ depends_on: Array<{
12
+ id: number;
13
+ title: string;
14
+ status: string;
15
+ }>;
16
+ blocked: boolean;
17
+ };
18
+ /** Attach dependency info to a set of sibling rows, in one pass. */
19
+ export declare function withDependencies(db: Database.Database, rows: Array<Record<string, unknown>>): Array<Record<string, unknown>>;
4
20
  export declare const handlers: Record<string, ToolHandler>;
@@ -3,7 +3,7 @@ import { logActivity } from '../helpers/activity-logger.js';
3
3
  export const definitions = [
4
4
  {
5
5
  name: 'subtask_create',
6
- description: 'Create one or more subtasks (checklist items) for a task. Accepts a single title string or an array of title strings for batch creation.',
6
+ description: 'Create one or more subtasks (checklist items) for a task. Accepts one title or an array. New subtasks are appended after any that exist.',
7
7
  annotations: { title: 'Create Subtask(s)', readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
8
8
  inputSchema: {
9
9
  type: 'object',
@@ -15,13 +15,18 @@ export const definitions = [
15
15
  { type: 'array', items: { type: 'string' }, description: 'Multiple subtask titles' },
16
16
  ],
17
17
  },
18
+ depends_on: {
19
+ type: 'array',
20
+ items: { type: 'integer' },
21
+ description: 'Siblings each new subtask waits on',
22
+ },
18
23
  },
19
24
  required: ['task_id', 'titles'],
20
25
  },
21
26
  },
22
27
  {
23
28
  name: 'subtask_update',
24
- description: 'Update a subtask title, status, or sort order.',
29
+ description: 'Update a subtask title, status or position. depends_on sets which siblings it waits on; blocks makes it a prerequisite of others. Both replace the existing set; [] clears it.',
25
30
  annotations: { title: 'Update Subtask', readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
26
31
  inputSchema: {
27
32
  type: 'object',
@@ -30,10 +35,37 @@ export const definitions = [
30
35
  title: { type: 'string' },
31
36
  status: { type: 'string', enum: ['todo', 'in_progress', 'done'] },
32
37
  sort_order: { type: 'integer' },
38
+ depends_on: {
39
+ type: 'array',
40
+ items: { type: 'integer' },
41
+ description: 'Siblings this one waits on (replaces the set)',
42
+ },
43
+ blocks: {
44
+ type: 'array',
45
+ items: { type: 'integer' },
46
+ description: 'Siblings that wait on this one — inverse of depends_on',
47
+ },
33
48
  },
34
49
  required: ['id'],
35
50
  },
36
51
  },
52
+ {
53
+ name: 'subtask_reorder',
54
+ description: 'Reorder a task subtask list. Pass IDs in the order you want; any omitted keep their relative order at the end.',
55
+ annotations: { title: 'Reorder Subtasks', readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
56
+ inputSchema: {
57
+ type: 'object',
58
+ properties: {
59
+ task_id: { type: 'integer', description: 'Parent task ID' },
60
+ ordered_ids: {
61
+ type: 'array',
62
+ items: { type: 'integer' },
63
+ description: 'Subtask IDs, in order',
64
+ },
65
+ },
66
+ required: ['task_id', 'ordered_ids'],
67
+ },
68
+ },
37
69
  {
38
70
  name: 'subtask_delete',
39
71
  description: 'Delete one or more subtasks. Accepts a single ID or array of IDs.',
@@ -52,15 +84,123 @@ export const definitions = [
52
84
  },
53
85
  },
54
86
  ];
87
+ // --- Ordering (#21) ---
88
+ /** Next free position within a task, so new subtasks land at the end rather than at 0. */
89
+ function nextSortOrder(db, taskId) {
90
+ const row = db
91
+ .prepare('SELECT COALESCE(MAX(sort_order), 0) as max FROM subtasks WHERE task_id = ?')
92
+ .get(taskId);
93
+ return row.max + 1;
94
+ }
95
+ // --- Dependencies (#22) ---
96
+ /**
97
+ * Subtask dependencies are deliberately confined to siblings. A checklist item
98
+ * waiting on an item under some other task is really a task-level dependency,
99
+ * and task_dependencies already models that.
100
+ */
101
+ function assertSameTask(db, taskId, ids) {
102
+ if (ids.length === 0)
103
+ return;
104
+ const placeholders = ids.map(() => '?').join(',');
105
+ const rows = db
106
+ .prepare(`SELECT id, task_id FROM subtasks WHERE id IN (${placeholders})`)
107
+ .all(...ids);
108
+ const found = new Set(rows.map((r) => r.id));
109
+ const missing = ids.filter((id) => !found.has(id));
110
+ if (missing.length > 0)
111
+ throw new Error(`Subtask(s) not found: ${missing.join(', ')}`);
112
+ const foreign = rows.filter((r) => r.task_id !== taskId);
113
+ if (foreign.length > 0) {
114
+ throw new Error(`Subtasks can only depend on siblings under the same task. ` +
115
+ `${foreign.map((r) => `#${r.id}`).join(', ')} belong to another task — ` +
116
+ 'use task_update depends_on for cross-task ordering.');
117
+ }
118
+ }
119
+ /** Walk the dependency graph to keep it acyclic; a cycle would block every member forever. */
120
+ function assertNoCycle(db, subtaskId, dependsOn) {
121
+ const edges = db.prepare('SELECT subtask_id, depends_on_subtask_id FROM subtask_dependencies').all();
122
+ const graph = new Map();
123
+ for (const e of edges) {
124
+ if (e.subtask_id === subtaskId)
125
+ continue; // replaced below
126
+ graph.set(e.subtask_id, [...(graph.get(e.subtask_id) ?? []), e.depends_on_subtask_id]);
127
+ }
128
+ graph.set(subtaskId, dependsOn);
129
+ const seen = new Set();
130
+ const stack = new Set();
131
+ const walk = (node) => {
132
+ if (stack.has(node))
133
+ return [node];
134
+ if (seen.has(node))
135
+ return null;
136
+ seen.add(node);
137
+ stack.add(node);
138
+ for (const next of graph.get(node) ?? []) {
139
+ const cycle = walk(next);
140
+ if (cycle)
141
+ return [node, ...cycle];
142
+ }
143
+ stack.delete(node);
144
+ return null;
145
+ };
146
+ const cycle = walk(subtaskId);
147
+ if (cycle) {
148
+ throw new Error(`That would make a circular dependency: ${cycle.map((id) => `#${id}`).join(' → ')}. ` +
149
+ 'Nothing in a cycle can ever start.');
150
+ }
151
+ }
152
+ function setDependencies(db, subtaskId, taskId, dependsOn) {
153
+ const clean = [...new Set(dependsOn)].filter((id) => id !== subtaskId);
154
+ assertSameTask(db, taskId, clean);
155
+ assertNoCycle(db, subtaskId, clean);
156
+ db.prepare('DELETE FROM subtask_dependencies WHERE subtask_id = ?').run(subtaskId);
157
+ const insert = db.prepare('INSERT INTO subtask_dependencies (subtask_id, depends_on_subtask_id) VALUES (?, ?)');
158
+ for (const depId of clean)
159
+ insert.run(subtaskId, depId);
160
+ }
161
+ /**
162
+ * Subtasks have no 'blocked' status — the three they have are enough, and
163
+ * widening the CHECK constraint would mean rebuilding the table. So a blocked
164
+ * subtask is reported, not restyled: reads carry depends_on and blocked.
165
+ */
166
+ export function describeDependencies(db, subtaskId) {
167
+ const dependsOn = db
168
+ .prepare(`SELECT s.id, s.title, s.status FROM subtask_dependencies d
169
+ JOIN subtasks s ON s.id = d.depends_on_subtask_id
170
+ WHERE d.subtask_id = ?
171
+ ORDER BY s.sort_order, s.id`)
172
+ .all(subtaskId);
173
+ return { depends_on: dependsOn, blocked: dependsOn.some((d) => d.status !== 'done') };
174
+ }
175
+ /** Attach dependency info to a set of sibling rows, in one pass. */
176
+ export function withDependencies(db, rows) {
177
+ if (rows.length === 0)
178
+ return rows;
179
+ return rows.map((row) => {
180
+ const info = describeDependencies(db, row.id);
181
+ if (info.depends_on.length === 0)
182
+ return row; // costs nothing when unused
183
+ return { ...row, depends_on: info.depends_on, blocked: info.blocked };
184
+ });
185
+ }
186
+ // --- Handlers ---
55
187
  function handleSubtaskCreate(args) {
56
188
  const db = getDb();
57
189
  const taskId = args.task_id;
58
190
  const rawTitles = args.titles;
59
191
  const titles = Array.isArray(rawTitles) ? rawTitles : [rawTitles];
60
- const stmt = db.prepare('INSERT INTO subtasks (task_id, title) VALUES (?, ?) RETURNING *');
192
+ const dependsOn = args.depends_on ?? [];
193
+ const task = db.prepare('SELECT id FROM tasks WHERE id = ?').get(taskId);
194
+ if (!task)
195
+ throw new Error(`Task ${taskId} not found`);
196
+ const stmt = db.prepare('INSERT INTO subtasks (task_id, title, sort_order) VALUES (?, ?, ?) RETURNING *');
61
197
  const created = db.transaction(() => {
198
+ let position = nextSortOrder(db, taskId);
62
199
  return titles.map((title) => {
63
- const subtask = stmt.get(taskId, title);
200
+ const subtask = stmt.get(taskId, title, position++);
201
+ if (dependsOn.length > 0) {
202
+ setDependencies(db, subtask.id, taskId, dependsOn);
203
+ }
64
204
  logActivity(db, 'subtask', subtask.id, 'created', null, null, null, `Subtask '${title}' created`);
65
205
  return subtask;
66
206
  });
@@ -73,6 +213,7 @@ function handleSubtaskUpdate(args) {
73
213
  const oldRow = db.prepare('SELECT * FROM subtasks WHERE id = ?').get(id);
74
214
  if (!oldRow)
75
215
  throw new Error(`Subtask ${id} not found`);
216
+ const taskId = oldRow.task_id;
76
217
  const updates = [];
77
218
  const params = [];
78
219
  if (args.title !== undefined) {
@@ -87,17 +228,77 @@ function handleSubtaskUpdate(args) {
87
228
  updates.push('sort_order = ?');
88
229
  params.push(args.sort_order);
89
230
  }
90
- if (updates.length === 0)
231
+ const touchesDeps = args.depends_on !== undefined || args.blocks !== undefined;
232
+ if (updates.length === 0 && !touchesDeps)
91
233
  throw new Error('No fields to update');
92
- updates.push("updated_at = datetime('now')");
93
- params.push(id);
94
- const newRow = db
95
- .prepare(`UPDATE subtasks SET ${updates.join(', ')} WHERE id = ? RETURNING *`)
96
- .get(...params);
97
- if (oldRow.status !== newRow.status) {
98
- logActivity(db, 'subtask', id, 'status_changed', 'status', oldRow.status, newRow.status, `Subtask '${newRow.title}' status: ${oldRow.status} -> ${newRow.status}`);
234
+ let newRow = oldRow;
235
+ if (updates.length > 0) {
236
+ updates.push("updated_at = datetime('now')");
237
+ params.push(id);
238
+ newRow = db
239
+ .prepare(`UPDATE subtasks SET ${updates.join(', ')} WHERE id = ? RETURNING *`)
240
+ .get(...params);
241
+ if (oldRow.status !== newRow.status) {
242
+ logActivity(db, 'subtask', id, 'status_changed', 'status', oldRow.status, newRow.status, `Subtask '${newRow.title}' status: ${oldRow.status} -> ${newRow.status}`);
243
+ }
99
244
  }
100
- return newRow;
245
+ if (args.depends_on !== undefined) {
246
+ const dependsOn = args.depends_on ?? [];
247
+ setDependencies(db, id, taskId, dependsOn);
248
+ logActivity(db, 'subtask', id, 'updated', 'depends_on', null, dependsOn.length > 0 ? dependsOn.join(',') : '(none)', `Subtask '${newRow.title}' now waits on [${dependsOn.join(', ')}]`);
249
+ }
250
+ // The inverse direction: "this bug holds up those three", without editing each.
251
+ if (args.blocks !== undefined) {
252
+ const blocks = [...new Set(args.blocks ?? [])].filter((x) => x !== id);
253
+ assertSameTask(db, taskId, blocks);
254
+ const existing = db
255
+ .prepare('SELECT subtask_id FROM subtask_dependencies WHERE depends_on_subtask_id = ?')
256
+ .all(id);
257
+ db.transaction(() => {
258
+ for (const row of existing) {
259
+ if (!blocks.includes(row.subtask_id)) {
260
+ db.prepare('DELETE FROM subtask_dependencies WHERE subtask_id = ? AND depends_on_subtask_id = ?')
261
+ .run(row.subtask_id, id);
262
+ }
263
+ }
264
+ for (const target of blocks) {
265
+ const current = db
266
+ .prepare('SELECT depends_on_subtask_id FROM subtask_dependencies WHERE subtask_id = ?')
267
+ .all(target);
268
+ const next = [...new Set([...current.map((c) => c.depends_on_subtask_id), id])];
269
+ setDependencies(db, target, taskId, next);
270
+ }
271
+ })();
272
+ logActivity(db, 'subtask', id, 'updated', 'blocks', null, blocks.length > 0 ? blocks.join(',') : '(none)', `Subtask '${newRow.title}' now blocks [${blocks.join(', ')}]`);
273
+ }
274
+ const info = describeDependencies(db, id);
275
+ return info.depends_on.length > 0 ? { ...newRow, ...info } : newRow;
276
+ }
277
+ function handleSubtaskReorder(args) {
278
+ const db = getDb();
279
+ const taskId = args.task_id;
280
+ const orderedIds = args.ordered_ids ?? [];
281
+ const siblings = db
282
+ .prepare('SELECT id FROM subtasks WHERE task_id = ? ORDER BY sort_order, created_at')
283
+ .all(taskId);
284
+ if (siblings.length === 0)
285
+ throw new Error(`Task ${taskId} has no subtasks`);
286
+ const known = new Set(siblings.map((s) => s.id));
287
+ const unknown = orderedIds.filter((id) => !known.has(id));
288
+ if (unknown.length > 0) {
289
+ throw new Error(`Subtask(s) ${unknown.join(', ')} do not belong to task ${taskId}`);
290
+ }
291
+ // Anything not mentioned keeps its relative order, after the listed ones.
292
+ const seen = new Set(orderedIds);
293
+ const finalOrder = [...orderedIds, ...siblings.map((s) => s.id).filter((id) => !seen.has(id))];
294
+ const stmt = db.prepare("UPDATE subtasks SET sort_order = ?, updated_at = datetime('now') WHERE id = ?");
295
+ db.transaction(() => {
296
+ finalOrder.forEach((id, index) => stmt.run(index + 1, id));
297
+ })();
298
+ logActivity(db, 'subtask', taskId, 'updated', 'sort_order', null, finalOrder.join(','), `Subtasks of task ${taskId} reordered`);
299
+ return db
300
+ .prepare('SELECT * FROM subtasks WHERE task_id = ? ORDER BY sort_order, created_at')
301
+ .all(taskId);
101
302
  }
102
303
  function handleSubtaskDelete(args) {
103
304
  const db = getDb();
@@ -110,7 +311,7 @@ function handleSubtaskDelete(args) {
110
311
  const row = getStmt.get(id);
111
312
  if (!row)
112
313
  throw new Error(`Subtask ${id} not found`);
113
- delStmt.run(id);
314
+ delStmt.run(id); // dependency rows cascade
114
315
  logActivity(db, 'subtask', id, 'deleted', null, null, null, `Subtask '${row.title}' deleted`);
115
316
  return { id, title: row.title, deleted: true };
116
317
  });
@@ -120,6 +321,7 @@ function handleSubtaskDelete(args) {
120
321
  export const handlers = {
121
322
  subtask_create: handleSubtaskCreate,
122
323
  subtask_update: handleSubtaskUpdate,
324
+ subtask_reorder: handleSubtaskReorder,
123
325
  subtask_delete: handleSubtaskDelete,
124
326
  };
125
327
  //# sourceMappingURL=subtasks.js.map