clawvault 2.4.4 → 2.4.6

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 (51) hide show
  1. package/bin/clawvault.js +9 -0
  2. package/bin/command-registration.test.js +13 -1
  3. package/bin/help-contract.test.js +2 -0
  4. package/bin/register-config-commands.js +153 -0
  5. package/bin/register-config-route-commands.test.js +114 -0
  6. package/bin/register-kanban-commands.js +56 -0
  7. package/bin/register-kanban-commands.test.js +83 -0
  8. package/bin/register-resilience-commands.js +37 -2
  9. package/bin/register-resilience-commands.test.js +81 -0
  10. package/bin/register-route-commands.js +114 -0
  11. package/bin/register-task-commands.js +58 -7
  12. package/bin/register-task-commands.test.js +46 -0
  13. package/bin/test-helpers/cli-command-fixtures.js +20 -0
  14. package/dist/{chunk-XDCFXFGH.js → chunk-22WE3J4F.js} +1 -1
  15. package/dist/chunk-3PJIGGWV.js +49 -0
  16. package/dist/{chunk-FDJIZKCW.js → chunk-6B3JWM7J.js} +12 -48
  17. package/dist/{chunk-DEFBIVQ3.js → chunk-6QLRSPLZ.js} +170 -7
  18. package/dist/{chunk-MZZJLQNQ.js → chunk-F55HGNU4.js} +6 -0
  19. package/dist/{chunk-SNEMCQP7.js → chunk-FD2ZA65C.js} +1 -1
  20. package/dist/{chunk-GBIDDDSL.js → chunk-FKQJB6XC.js} +1 -1
  21. package/dist/{chunk-FEFPBHH4.js → chunk-H6WQUUNK.js} +453 -23
  22. package/dist/{chunk-BMOQI62Q.js → chunk-HNMFXFYP.js} +5 -3
  23. package/dist/{chunk-DHJPXGC7.js → chunk-JTO7NZLS.js} +1 -1
  24. package/dist/chunk-LLN5SPGL.js +399 -0
  25. package/dist/chunk-OIWVQYQF.js +284 -0
  26. package/dist/{chunk-IFTEGE4D.js → chunk-P2ZH6AN5.js} +4 -2
  27. package/dist/commands/backlog.js +1 -1
  28. package/dist/commands/blocked.js +1 -1
  29. package/dist/commands/canvas.js +1 -1
  30. package/dist/commands/checkpoint.js +1 -1
  31. package/dist/commands/context.js +4 -3
  32. package/dist/commands/doctor.js +6 -5
  33. package/dist/commands/kanban.d.ts +63 -0
  34. package/dist/commands/kanban.js +21 -0
  35. package/dist/commands/observe.js +4 -3
  36. package/dist/commands/rebuild.js +4 -3
  37. package/dist/commands/recover.d.ts +13 -1
  38. package/dist/commands/recover.js +10 -2
  39. package/dist/commands/replay.js +4 -3
  40. package/dist/commands/setup.js +3 -2
  41. package/dist/commands/sleep.js +6 -5
  42. package/dist/commands/status.js +6 -5
  43. package/dist/commands/task.d.ts +18 -6
  44. package/dist/commands/task.js +69 -12
  45. package/dist/commands/wake.js +5 -4
  46. package/dist/index.d.ts +29 -1
  47. package/dist/index.js +60 -15
  48. package/dist/lib/task-utils.d.ts +41 -10
  49. package/dist/lib/task-utils.js +5 -1
  50. package/package.json +2 -2
  51. package/dist/chunk-IWYZAXKJ.js +0 -146
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getBlockedTasks
3
- } from "../chunk-DEFBIVQ3.js";
3
+ } from "../chunk-6QLRSPLZ.js";
4
4
 
5
5
  // src/commands/blocked.ts
6
6
  function toDateStr(val) {
@@ -17,7 +17,7 @@ import {
17
17
  getRecentlyCompletedTasks,
18
18
  listBacklogItems,
19
19
  listTasks
20
- } from "../chunk-DEFBIVQ3.js";
20
+ } from "../chunk-6QLRSPLZ.js";
21
21
  import {
22
22
  parseObservationLines,
23
23
  readObservations
@@ -5,7 +5,7 @@ import {
5
5
  clearDirtyFlag,
6
6
  flush,
7
7
  setSessionState
8
- } from "../chunk-MZZJLQNQ.js";
8
+ } from "../chunk-F55HGNU4.js";
9
9
  export {
10
10
  checkDirtyDeath,
11
11
  checkpoint,
@@ -3,9 +3,10 @@ import {
3
3
  contextCommand,
4
4
  formatContextMarkdown,
5
5
  registerContextCommand
6
- } from "../chunk-XDCFXFGH.js";
7
- import "../chunk-BMOQI62Q.js";
8
- import "../chunk-FDJIZKCW.js";
6
+ } from "../chunk-22WE3J4F.js";
7
+ import "../chunk-HNMFXFYP.js";
8
+ import "../chunk-6B3JWM7J.js";
9
+ import "../chunk-3PJIGGWV.js";
9
10
  import "../chunk-L3DJ36BZ.js";
10
11
  import "../chunk-ZZA73MFY.js";
11
12
  import "../chunk-FHFUXL6G.js";
@@ -1,20 +1,21 @@
1
+ import {
2
+ formatAge
3
+ } from "../chunk-7ZRP733D.js";
1
4
  import {
2
5
  scanVaultLinks
3
6
  } from "../chunk-4VQTUVH7.js";
4
7
  import "../chunk-J7ZWCI2C.js";
5
- import {
6
- formatAge
7
- } from "../chunk-7ZRP733D.js";
8
8
  import {
9
9
  checkOpenClawCompatibility
10
10
  } from "../chunk-PAYUH64O.js";
11
11
  import {
12
12
  ClawVault,
13
13
  findVault
14
- } from "../chunk-BMOQI62Q.js";
14
+ } from "../chunk-HNMFXFYP.js";
15
15
  import {
16
16
  hasQmd
17
- } from "../chunk-FDJIZKCW.js";
17
+ } from "../chunk-6B3JWM7J.js";
18
+ import "../chunk-3PJIGGWV.js";
18
19
  import {
19
20
  loadMemoryGraphIndex
20
21
  } from "../chunk-ZZA73MFY.js";
@@ -0,0 +1,63 @@
1
+ import { Task } from '../lib/task-utils.js';
2
+
3
+ /**
4
+ * Kanban command for ClawVault.
5
+ * Syncs task frontmatter to/from Obsidian Kanban markdown boards.
6
+ */
7
+
8
+ type KanbanGroupBy = 'status' | 'priority' | 'project' | 'owner';
9
+ interface KanbanSyncOptions {
10
+ output?: string;
11
+ groupBy?: KanbanGroupBy | string;
12
+ filterProject?: string;
13
+ filterOwner?: string;
14
+ includeDone?: boolean;
15
+ now?: Date;
16
+ }
17
+ interface KanbanImportOptions {
18
+ output?: string;
19
+ }
20
+ interface KanbanLane {
21
+ name: string;
22
+ cards: string[];
23
+ }
24
+ interface KanbanSyncResult {
25
+ outputPath: string;
26
+ groupBy: KanbanGroupBy;
27
+ markdown: string;
28
+ lanes: KanbanLane[];
29
+ taskCount: number;
30
+ }
31
+ interface KanbanImportChange {
32
+ slug: string;
33
+ field: KanbanGroupBy;
34
+ from: string | null;
35
+ to: string | null;
36
+ }
37
+ interface KanbanImportResult {
38
+ outputPath: string;
39
+ groupBy: KanbanGroupBy;
40
+ changes: KanbanImportChange[];
41
+ missingSlugs: string[];
42
+ }
43
+ interface ParsedKanbanLane {
44
+ name: string;
45
+ slugs: string[];
46
+ }
47
+ interface ParsedKanbanBoard {
48
+ groupBy: KanbanGroupBy;
49
+ lanes: ParsedKanbanLane[];
50
+ }
51
+ declare function formatKanbanCard(task: Task): string;
52
+ declare function buildKanbanLanes(tasks: Task[], groupBy: KanbanGroupBy): KanbanLane[];
53
+ declare function generateKanbanMarkdown(tasks: Task[], options?: {
54
+ groupBy?: KanbanGroupBy | string;
55
+ now?: Date;
56
+ }): string;
57
+ declare function syncKanbanBoard(vaultPath: string, options?: KanbanSyncOptions): KanbanSyncResult;
58
+ declare function extractCardSlug(line: string): string | null;
59
+ declare function parseKanbanMarkdown(markdown: string): ParsedKanbanBoard;
60
+ declare function importKanbanBoard(vaultPath: string, options?: KanbanImportOptions): KanbanImportResult;
61
+ declare function kanbanCommand(vaultPath: string, action: 'sync' | 'import', options?: KanbanSyncOptions & KanbanImportOptions): Promise<void>;
62
+
63
+ export { type KanbanGroupBy, type KanbanImportChange, type KanbanImportOptions, type KanbanImportResult, type KanbanLane, type KanbanSyncOptions, type KanbanSyncResult, type ParsedKanbanBoard, type ParsedKanbanLane, buildKanbanLanes, extractCardSlug, formatKanbanCard, generateKanbanMarkdown, importKanbanBoard, kanbanCommand, parseKanbanMarkdown, syncKanbanBoard };
@@ -0,0 +1,21 @@
1
+ import {
2
+ buildKanbanLanes,
3
+ extractCardSlug,
4
+ formatKanbanCard,
5
+ generateKanbanMarkdown,
6
+ importKanbanBoard,
7
+ kanbanCommand,
8
+ parseKanbanMarkdown,
9
+ syncKanbanBoard
10
+ } from "../chunk-LLN5SPGL.js";
11
+ import "../chunk-6QLRSPLZ.js";
12
+ export {
13
+ buildKanbanLanes,
14
+ extractCardSlug,
15
+ formatKanbanCard,
16
+ generateKanbanMarkdown,
17
+ importKanbanBoard,
18
+ kanbanCommand,
19
+ parseKanbanMarkdown,
20
+ syncKanbanBoard
21
+ };
@@ -1,12 +1,13 @@
1
1
  import {
2
2
  observeCommand,
3
3
  registerObserveCommand
4
- } from "../chunk-SNEMCQP7.js";
4
+ } from "../chunk-FD2ZA65C.js";
5
5
  import "../chunk-HRLWZGMA.js";
6
6
  import "../chunk-P5EPF6MB.js";
7
- import "../chunk-FEFPBHH4.js";
7
+ import "../chunk-H6WQUUNK.js";
8
8
  import "../chunk-MXSSG3QU.js";
9
- import "../chunk-DEFBIVQ3.js";
9
+ import "../chunk-6QLRSPLZ.js";
10
+ import "../chunk-3PJIGGWV.js";
10
11
  import "../chunk-FHFUXL6G.js";
11
12
  import "../chunk-NAMFB7ZA.js";
12
13
  export {
@@ -1,10 +1,11 @@
1
1
  import {
2
2
  rebuildCommand,
3
3
  registerRebuildCommand
4
- } from "../chunk-DHJPXGC7.js";
5
- import "../chunk-FEFPBHH4.js";
4
+ } from "../chunk-JTO7NZLS.js";
5
+ import "../chunk-H6WQUUNK.js";
6
6
  import "../chunk-MXSSG3QU.js";
7
- import "../chunk-DEFBIVQ3.js";
7
+ import "../chunk-6QLRSPLZ.js";
8
+ import "../chunk-3PJIGGWV.js";
8
9
  import "../chunk-FHFUXL6G.js";
9
10
  import "../chunk-NAMFB7ZA.js";
10
11
  export {
@@ -12,10 +12,22 @@ interface RecoveryInfo {
12
12
  handoffContent: string | null;
13
13
  recoveryMessage: string;
14
14
  }
15
+ interface RecoveryCheckInfo {
16
+ died: boolean;
17
+ deathTime: string | null;
18
+ checkpoint: CheckpointData | null;
19
+ }
20
+ interface ListedCheckpoint extends CheckpointData {
21
+ filePath: string;
22
+ }
23
+ declare function checkRecoveryStatus(vaultPath: string): Promise<RecoveryCheckInfo>;
24
+ declare function listCheckpoints(vaultPath: string): ListedCheckpoint[];
15
25
  declare function recover(vaultPath: string, options?: {
16
26
  clearFlag?: boolean;
17
27
  verbose?: boolean;
18
28
  }): Promise<RecoveryInfo>;
29
+ declare function formatRecoveryCheckStatus(info: RecoveryCheckInfo): string;
30
+ declare function formatCheckpointList(checkpoints: ListedCheckpoint[]): string;
19
31
  /**
20
32
  * Format recovery info for CLI output
21
33
  */
@@ -23,4 +35,4 @@ declare function formatRecoveryInfo(info: RecoveryInfo, options?: {
23
35
  verbose?: boolean;
24
36
  }): string;
25
37
 
26
- export { type RecoveryInfo, formatRecoveryInfo, recover };
38
+ export { type ListedCheckpoint, type RecoveryCheckInfo, type RecoveryInfo, checkRecoveryStatus, formatCheckpointList, formatRecoveryCheckStatus, formatRecoveryInfo, listCheckpoints, recover };
@@ -1,10 +1,18 @@
1
1
  import {
2
+ checkRecoveryStatus,
3
+ formatCheckpointList,
4
+ formatRecoveryCheckStatus,
2
5
  formatRecoveryInfo,
6
+ listCheckpoints,
3
7
  recover
4
- } from "../chunk-IWYZAXKJ.js";
8
+ } from "../chunk-OIWVQYQF.js";
5
9
  import "../chunk-7ZRP733D.js";
6
- import "../chunk-MZZJLQNQ.js";
10
+ import "../chunk-F55HGNU4.js";
7
11
  export {
12
+ checkRecoveryStatus,
13
+ formatCheckpointList,
14
+ formatRecoveryCheckStatus,
8
15
  formatRecoveryInfo,
16
+ listCheckpoints,
9
17
  recover
10
18
  };
@@ -1,12 +1,13 @@
1
1
  import {
2
2
  registerReplayCommand,
3
3
  replayCommand
4
- } from "../chunk-GBIDDDSL.js";
4
+ } from "../chunk-FKQJB6XC.js";
5
5
  import "../chunk-AHGUJG76.js";
6
- import "../chunk-FEFPBHH4.js";
6
+ import "../chunk-H6WQUUNK.js";
7
7
  import "../chunk-QALB2V3E.js";
8
8
  import "../chunk-MXSSG3QU.js";
9
- import "../chunk-DEFBIVQ3.js";
9
+ import "../chunk-6QLRSPLZ.js";
10
+ import "../chunk-3PJIGGWV.js";
10
11
  import "../chunk-FHFUXL6G.js";
11
12
  import "../chunk-NAMFB7ZA.js";
12
13
  export {
@@ -1,7 +1,8 @@
1
1
  import {
2
2
  setupCommand
3
- } from "../chunk-IFTEGE4D.js";
4
- import "../chunk-FDJIZKCW.js";
3
+ } from "../chunk-P2ZH6AN5.js";
4
+ import "../chunk-6B3JWM7J.js";
5
+ import "../chunk-3PJIGGWV.js";
5
6
  export {
6
7
  setupCommand
7
8
  };
@@ -6,18 +6,19 @@ import {
6
6
  } from "../chunk-P5EPF6MB.js";
7
7
  import {
8
8
  Observer
9
- } from "../chunk-FEFPBHH4.js";
9
+ } from "../chunk-H6WQUUNK.js";
10
10
  import "../chunk-QALB2V3E.js";
11
- import "../chunk-DEFBIVQ3.js";
11
+ import "../chunk-6QLRSPLZ.js";
12
12
  import {
13
13
  clearDirtyFlag
14
- } from "../chunk-MZZJLQNQ.js";
14
+ } from "../chunk-F55HGNU4.js";
15
15
  import {
16
16
  ClawVault
17
- } from "../chunk-BMOQI62Q.js";
17
+ } from "../chunk-HNMFXFYP.js";
18
18
  import {
19
19
  qmdUpdate
20
- } from "../chunk-FDJIZKCW.js";
20
+ } from "../chunk-6B3JWM7J.js";
21
+ import "../chunk-3PJIGGWV.js";
21
22
  import "../chunk-ZZA73MFY.js";
22
23
  import "../chunk-FHFUXL6G.js";
23
24
  import "../chunk-NAMFB7ZA.js";
@@ -1,17 +1,18 @@
1
+ import {
2
+ formatAge
3
+ } from "../chunk-7ZRP733D.js";
1
4
  import {
2
5
  scanVaultLinks
3
6
  } from "../chunk-4VQTUVH7.js";
4
7
  import "../chunk-J7ZWCI2C.js";
5
- import {
6
- formatAge
7
- } from "../chunk-7ZRP733D.js";
8
8
  import {
9
9
  ClawVault
10
- } from "../chunk-BMOQI62Q.js";
10
+ } from "../chunk-HNMFXFYP.js";
11
11
  import {
12
12
  QmdUnavailableError,
13
13
  hasQmd
14
- } from "../chunk-FDJIZKCW.js";
14
+ } from "../chunk-6B3JWM7J.js";
15
+ import "../chunk-3PJIGGWV.js";
15
16
  import {
16
17
  loadMemoryGraphIndex
17
18
  } from "../chunk-ZZA73MFY.js";
@@ -12,23 +12,35 @@ interface TaskAddOptions {
12
12
  due?: string;
13
13
  content?: string;
14
14
  tags?: string[];
15
+ description?: string;
16
+ estimate?: string;
17
+ parent?: string;
18
+ dependsOn?: string[];
15
19
  }
16
20
  interface TaskListOptions {
17
21
  status?: TaskStatus;
18
22
  owner?: string;
19
23
  project?: string;
20
24
  priority?: TaskPriority;
25
+ due?: boolean;
26
+ tag?: string;
27
+ overdue?: boolean;
21
28
  json?: boolean;
22
29
  }
23
30
  interface TaskUpdateOptions {
24
31
  status?: TaskStatus;
25
- owner?: string;
26
- project?: string;
27
- priority?: TaskPriority;
28
- blockedBy?: string;
29
- due?: string;
32
+ owner?: string | null;
33
+ project?: string | null;
34
+ priority?: TaskPriority | null;
35
+ blockedBy?: string | null;
36
+ due?: string | null;
37
+ tags?: string[] | null;
38
+ description?: string | null;
39
+ estimate?: string | null;
40
+ parent?: string | null;
41
+ dependsOn?: string[] | null;
30
42
  confidence?: number;
31
- reason?: string;
43
+ reason?: string | null;
32
44
  }
33
45
  interface TaskTransitionsOptions {
34
46
  agent?: string;
@@ -13,7 +13,7 @@ import {
13
13
  listTasks,
14
14
  readTask,
15
15
  updateTask
16
- } from "../chunk-DEFBIVQ3.js";
16
+ } from "../chunk-6QLRSPLZ.js";
17
17
 
18
18
  // src/commands/task.ts
19
19
  import matter from "gray-matter";
@@ -25,7 +25,11 @@ function taskAdd(vaultPath, title, options = {}) {
25
25
  priority: options.priority,
26
26
  due: options.due,
27
27
  content: options.content,
28
- tags: options.tags
28
+ tags: options.tags,
29
+ description: options.description,
30
+ estimate: options.estimate,
31
+ parent: options.parent,
32
+ depends_on: options.dependsOn
29
33
  });
30
34
  }
31
35
  function taskList(vaultPath, options = {}) {
@@ -34,11 +38,14 @@ function taskList(vaultPath, options = {}) {
34
38
  if (options.owner) filters.owner = options.owner;
35
39
  if (options.project) filters.project = options.project;
36
40
  if (options.priority) filters.priority = options.priority;
37
- if (!options.status) {
38
- const allTasks = listTasks(vaultPath, filters);
39
- return allTasks.filter((t) => t.frontmatter.status !== "done");
41
+ if (options.due) filters.due = true;
42
+ if (options.tag) filters.tag = options.tag;
43
+ if (options.overdue) filters.overdue = true;
44
+ const listed = listTasks(vaultPath, filters);
45
+ if (!options.status && !options.overdue) {
46
+ return listed.filter((t) => t.frontmatter.status !== "done");
40
47
  }
41
- return listTasks(vaultPath, filters);
48
+ return listed;
42
49
  }
43
50
  function taskUpdate(vaultPath, slug, options) {
44
51
  const before = readTask(vaultPath, slug);
@@ -49,10 +56,20 @@ function taskUpdate(vaultPath, slug, options) {
49
56
  project: options.project,
50
57
  priority: options.priority,
51
58
  blocked_by: options.blockedBy,
52
- due: options.due
59
+ due: options.due,
60
+ tags: options.tags,
61
+ description: options.description,
62
+ estimate: options.estimate,
63
+ parent: options.parent,
64
+ depends_on: options.dependsOn,
65
+ confidence: options.confidence,
66
+ reason: options.reason
53
67
  });
54
68
  if (options.status && oldStatus && options.status !== oldStatus) {
55
- emitTransition(vaultPath, slug, oldStatus, options.status, options);
69
+ emitTransition(vaultPath, slug, oldStatus, options.status, {
70
+ confidence: options.confidence,
71
+ reason: options.reason ?? void 0
72
+ });
56
73
  }
57
74
  return task;
58
75
  }
@@ -105,8 +122,12 @@ function formatTaskList(tasks) {
105
122
  if (tasks.length === 0) {
106
123
  return "No tasks found.\n";
107
124
  }
108
- const headers = ["STATUS", "OWNER", "PRIORITY", "PROJECT", "TITLE"];
109
- const widths = [10, 12, 8, 16, 40];
125
+ const headers = ["STATUS", "OWNER", "PRIORITY", "PROJECT", "META", "TITLE"];
126
+ const widths = [10, 12, 8, 14, 64, 32];
127
+ const truncate = (value, width) => {
128
+ if (value.length <= width) return value;
129
+ return value.slice(0, width - 3) + "...";
130
+ };
110
131
  let output = headers.map((h, i) => h.padEnd(widths[i])).join(" ") + "\n";
111
132
  for (const task of tasks) {
112
133
  const icon = getStatusIcon(task.frontmatter.status);
@@ -115,12 +136,21 @@ function formatTaskList(tasks) {
115
136
  const owner = task.frontmatter.owner || "-";
116
137
  const priority = task.frontmatter.priority || "low";
117
138
  const project = task.frontmatter.project || "-";
118
- const title = task.title.length > widths[4] ? task.title.slice(0, widths[4] - 3) + "..." : task.title;
139
+ const metaParts = [];
140
+ if (task.frontmatter.due) metaParts.push(`due:${task.frontmatter.due.split("T")[0]}`);
141
+ if (task.frontmatter.tags?.length) metaParts.push(task.frontmatter.tags.map((tag) => `#${tag}`).join(","));
142
+ if (task.frontmatter.parent) metaParts.push(`parent:${task.frontmatter.parent}`);
143
+ if (task.frontmatter.depends_on?.length) {
144
+ metaParts.push(`deps:${task.frontmatter.depends_on.join("|")}`);
145
+ }
146
+ const meta = metaParts.length > 0 ? metaParts.join(" ") : "-";
147
+ const title = truncate(task.title, widths[5]);
119
148
  const row = [
120
149
  status.padEnd(widths[0]),
121
150
  owner.padEnd(widths[1]),
122
151
  priority.padEnd(widths[2]),
123
152
  project.padEnd(widths[3]),
153
+ truncate(meta, widths[4]).padEnd(widths[4]),
124
154
  title
125
155
  ];
126
156
  output += row.join(" ") + "\n";
@@ -144,6 +174,22 @@ function formatTaskDetails(task) {
144
174
  }
145
175
  if (task.frontmatter.priority) {
146
176
  output += `Priority: ${task.frontmatter.priority}
177
+ `;
178
+ }
179
+ if (task.frontmatter.description) {
180
+ output += `Description: ${task.frontmatter.description}
181
+ `;
182
+ }
183
+ if (task.frontmatter.estimate) {
184
+ output += `Estimate: ${task.frontmatter.estimate}
185
+ `;
186
+ }
187
+ if (task.frontmatter.parent) {
188
+ output += `Parent: ${task.frontmatter.parent}
189
+ `;
190
+ }
191
+ if (task.frontmatter.depends_on && task.frontmatter.depends_on.length > 0) {
192
+ output += `Depends on: ${task.frontmatter.depends_on.join(", ")}
147
193
  `;
148
194
  }
149
195
  if (task.frontmatter.due) {
@@ -156,6 +202,17 @@ function formatTaskDetails(task) {
156
202
  }
157
203
  if (task.frontmatter.tags && task.frontmatter.tags.length > 0) {
158
204
  output += `Tags: ${task.frontmatter.tags.join(", ")}
205
+ `;
206
+ }
207
+ if (task.frontmatter.escalation) {
208
+ output += "Escalation: true\n";
209
+ }
210
+ if (task.frontmatter.confidence !== void 0) {
211
+ output += `Confidence: ${task.frontmatter.confidence}
212
+ `;
213
+ }
214
+ if (task.frontmatter.reason) {
215
+ output += `Reason: ${task.frontmatter.reason}
159
216
  `;
160
217
  }
161
218
  output += `Created: ${task.frontmatter.created}
@@ -210,7 +267,7 @@ async function taskCommand(vaultPath, action, args) {
210
267
  }
211
268
  const task = taskDone(vaultPath, args.slug, {
212
269
  confidence: options.confidence,
213
- reason: options.reason
270
+ reason: options.reason ?? void 0
214
271
  });
215
272
  console.log(`\u2713 Completed task: ${task.slug}`);
216
273
  break;
@@ -1,14 +1,15 @@
1
1
  import {
2
2
  recover
3
- } from "../chunk-IWYZAXKJ.js";
3
+ } from "../chunk-OIWVQYQF.js";
4
4
  import "../chunk-7ZRP733D.js";
5
5
  import {
6
6
  clearDirtyFlag
7
- } from "../chunk-MZZJLQNQ.js";
7
+ } from "../chunk-F55HGNU4.js";
8
8
  import {
9
9
  ClawVault
10
- } from "../chunk-BMOQI62Q.js";
11
- import "../chunk-FDJIZKCW.js";
10
+ } from "../chunk-HNMFXFYP.js";
11
+ import "../chunk-6B3JWM7J.js";
12
+ import "../chunk-3PJIGGWV.js";
12
13
  import "../chunk-ZZA73MFY.js";
13
14
  import {
14
15
  parseObservationMarkdown
package/dist/index.d.ts CHANGED
@@ -4,6 +4,7 @@ export { f as DEFAULT_CATEGORIES, g as DEFAULT_CONFIG, h as MEMORY_TYPES, T as T
4
4
  export { setupCommand } from './commands/setup.js';
5
5
  export { CompatCheck, CompatCommandOptions, CompatReport, CompatStatus, checkOpenClawCompatibility, compatCommand, compatibilityExitCode } from './commands/compat.js';
6
6
  export { GraphSummary, graphCommand, graphSummary } from './commands/graph.js';
7
+ export { KanbanGroupBy, KanbanImportChange, KanbanImportOptions, KanbanImportResult, KanbanLane, KanbanSyncOptions, KanbanSyncResult, ParsedKanbanBoard, ParsedKanbanLane, buildKanbanLanes, extractCardSlug, formatKanbanCard, generateKanbanMarkdown, importKanbanBoard, kanbanCommand, parseKanbanMarkdown, syncKanbanBoard } from './commands/kanban.js';
7
8
  export { C as ContextEntry, a as ContextFormat, b as ContextOptions, c as ContextProfile, d as ContextProfileInput, e as ContextProfileOption, f as ContextResult, R as ResolvedContextProfile, g as buildContext, h as contextCommand, i as formatContextMarkdown, j as inferContextProfile, n as normalizeContextProfileInput, r as registerContextCommand, k as resolveContextProfile } from './context-BUGaWpyL.js';
8
9
  export { ObserveCommandOptions, observeCommand, registerObserveCommand } from './commands/observe.js';
9
10
  export { ReflectCommandOptions, reflectCommand, registerReflectCommand } from './commands/reflect.js';
@@ -15,6 +16,7 @@ export { SyncBdCommandOptions, registerSyncBdCommand, syncBdCommand } from './co
15
16
  export { SessionRecapFormat, SessionRecapOptions, SessionRecapResult, SessionTurn, buildSessionRecap, formatSessionRecapMarkdown, sessionRecapCommand } from './commands/session-recap.js';
16
17
  export { findNearestVaultPath, getVaultPath, resolveVaultPath } from './lib/config.js';
17
18
  import { TaskStatus } from './lib/task-utils.js';
19
+ export { listDependentTasks, listSubtasks } from './lib/task-utils.js';
18
20
  export { CLAWVAULT_SERVE_PATH, DEFAULT_SERVE_PORT, ServeInstance, TailscalePeer, TailscaleServeConfig, TailscaleStatus, TailscaleSyncOptions, TailscaleSyncResult, VaultFileEntry, VaultManifest, checkPeerClawVault, compareManifests, configureTailscaleServe, discoverClawVaultPeers, fetchRemoteFile, fetchRemoteManifest, findPeer, generateVaultManifest, getOnlinePeers, getTailscaleStatus, getTailscaleVersion, hasTailscale, pushFileToRemote, resolvePeerIP, serveVault, stopTailscaleServe, syncWithPeer } from './lib/tailscale.js';
19
21
  export { TailscaleDiscoverCommandOptions, TailscaleServeCommandOptions, TailscaleStatusCommandOptions, TailscaleSyncCommandOptions, registerTailscaleCommands, registerTailscaleDiscoverCommand, registerTailscaleServeCommand, registerTailscaleStatusCommand, registerTailscaleSyncCommand, tailscaleDiscoverCommand, tailscaleServeCommand, tailscaleStatusCommand, tailscaleSyncCommand } from './commands/tailscale.js';
20
22
  export { TemplateVariables, buildTemplateVariables, renderTemplate } from './lib/template-engine.js';
@@ -288,6 +290,32 @@ declare function extractWikiLinks(content: string): string[];
288
290
  */
289
291
  declare function extractTags(content: string): string[];
290
292
 
293
+ declare const OBSERVE_PROVIDERS: readonly ["anthropic", "openai", "gemini"];
294
+ declare const THEMES: readonly ["neural", "minimal", "none"];
295
+ declare const CONTEXT_PROFILES: readonly ["default", "planning", "incident", "handoff", "auto"];
296
+ type ObserveProvider = (typeof OBSERVE_PROVIDERS)[number];
297
+ type Theme = (typeof THEMES)[number];
298
+ type ContextProfile = (typeof CONTEXT_PROFILES)[number];
299
+ type ManagedConfigKey = 'name' | 'categories' | 'theme' | 'observe.model' | 'observe.provider' | 'context.maxResults' | 'context.defaultProfile' | 'graph.maxHops';
300
+ interface RouteRule {
301
+ pattern: string;
302
+ target: string;
303
+ priority: number;
304
+ }
305
+ declare const SUPPORTED_CONFIG_KEYS: ManagedConfigKey[];
306
+ declare function listConfig(vaultPath: string): Record<string, unknown>;
307
+ declare function getConfigValue(vaultPath: string, key: ManagedConfigKey): unknown;
308
+ declare function setConfigValue(vaultPath: string, key: ManagedConfigKey, value: unknown): {
309
+ value: unknown;
310
+ config: Record<string, unknown>;
311
+ };
312
+ declare function resetConfig(vaultPath: string): Record<string, unknown>;
313
+ declare function listRouteRules(vaultPath: string): RouteRule[];
314
+ declare function addRouteRule(vaultPath: string, pattern: string, target: string): RouteRule;
315
+ declare function removeRouteRule(vaultPath: string, pattern: string): boolean;
316
+ declare function matchRouteRule(text: string, routes: RouteRule[]): RouteRule | null;
317
+ declare function testRouteRule(vaultPath: string, text: string): RouteRule | null;
318
+
291
319
  declare const MEMORY_GRAPH_SCHEMA_VERSION = 1;
292
320
  type NodeCategory = 'note' | 'daily' | 'observation' | 'handoff' | 'decision' | 'lesson' | 'project' | 'person' | 'commitment' | 'tag' | 'unresolved';
293
321
  type MemoryGraphNodeType = NodeCategory;
@@ -597,4 +625,4 @@ declare function runReflection(options: ReflectOptions): Promise<ReflectResult>;
597
625
  declare const VERSION: string;
598
626
  declare function registerCommanderCommands(program: Command): Command;
599
627
 
600
- export { type ArchiveObservationsOptions, type ArchiveObservationsResult, Category, ClawVault, Compressor, type CompressorOptions, Document, HandoffDocument, MEMORY_GRAPH_SCHEMA_VERSION, type MemoryGraph, type MemoryGraphEdge, type MemoryGraphEdgeType, type MemoryGraphIndex, type MemoryGraphNode, type MemoryGraphNodeType, type MemoryGraphStats, MemoryType, Observer, type ObserverCompressor, type ObserverOptions, type ObserverReflector, QMD_INSTALL_COMMAND, QMD_INSTALL_URL, QmdUnavailableError, type ReflectOptions, type ReflectResult, Reflector, type ReflectorOptions, SearchEngine, SearchOptions, SearchResult, SessionRecap, SessionWatcher, type SessionWatcherOptions, StoreOptions, SyncOptions, SyncResult, type TransitionEvent, VERSION, VaultConfig, appendTransition, archiveObservations, buildOrUpdateMemoryGraphIndex, buildTransitionEvent, countBlockedTransitions, createVault, extractTags, extractWikiLinks, findVault, formatTransitionsTable, getMemoryGraph, hasQmd, isRegression, loadMemoryGraphIndex, parseSessionFile, qmdEmbed, qmdUpdate, queryTransitions, readAllTransitions, registerCommanderCommands, runReflection };
628
+ export { type ArchiveObservationsOptions, type ArchiveObservationsResult, Category, ClawVault, Compressor, type CompressorOptions, type ContextProfile as ConfigDefaultProfile, Document, HandoffDocument, MEMORY_GRAPH_SCHEMA_VERSION, type ManagedConfigKey, type MemoryGraph, type MemoryGraphEdge, type MemoryGraphEdgeType, type MemoryGraphIndex, type MemoryGraphNode, type MemoryGraphNodeType, type MemoryGraphStats, MemoryType, type ObserveProvider, Observer, type ObserverCompressor, type ObserverOptions, type ObserverReflector, QMD_INSTALL_COMMAND, QMD_INSTALL_URL, QmdUnavailableError, type ReflectOptions, type ReflectResult, Reflector, type ReflectorOptions, type RouteRule, SUPPORTED_CONFIG_KEYS, SearchEngine, SearchOptions, SearchResult, SessionRecap, SessionWatcher, type SessionWatcherOptions, StoreOptions, SyncOptions, SyncResult, type Theme, type TransitionEvent, VERSION, VaultConfig, addRouteRule, appendTransition, archiveObservations, buildOrUpdateMemoryGraphIndex, buildTransitionEvent, countBlockedTransitions, createVault, extractTags, extractWikiLinks, findVault, formatTransitionsTable, getConfigValue, getMemoryGraph, hasQmd, isRegression, listConfig, listRouteRules, loadMemoryGraphIndex, matchRouteRule, parseSessionFile, qmdEmbed, qmdUpdate, queryTransitions, readAllTransitions, registerCommanderCommands, removeRouteRule, resetConfig, runReflection, setConfigValue, testRouteRule };