clawvault 2.4.5 → 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.
@@ -0,0 +1,399 @@
1
+ import {
2
+ listTasks,
3
+ readTask,
4
+ updateTask
5
+ } from "./chunk-6QLRSPLZ.js";
6
+
7
+ // src/commands/kanban.ts
8
+ import * as fs from "fs";
9
+ import * as path from "path";
10
+ import matter from "gray-matter";
11
+ var STATUS_LANES = [
12
+ { status: "open", name: "Open" },
13
+ { status: "in-progress", name: "In Progress" },
14
+ { status: "blocked", name: "Blocked" },
15
+ { status: "done", name: "Done" }
16
+ ];
17
+ var PRIORITY_LANES = [
18
+ { priority: "critical", name: "\u{1F525} Critical" },
19
+ { priority: "high", name: "\u{1F534} High" },
20
+ { priority: "medium", name: "\u{1F7E1} Medium" },
21
+ { priority: "low", name: "\u{1F7E2} Low" },
22
+ { priority: null, name: "\u26AA Unset" }
23
+ ];
24
+ var PRIORITY_EMOJI = {
25
+ critical: "\u{1F525}",
26
+ high: "\u{1F534}",
27
+ medium: "\u{1F7E1}",
28
+ low: "\u{1F7E2}"
29
+ };
30
+ function normalizeGroupBy(value) {
31
+ const normalized = String(value || "status").trim().toLowerCase();
32
+ if (normalized === "status" || normalized === "priority" || normalized === "project" || normalized === "owner") {
33
+ return normalized;
34
+ }
35
+ throw new Error(`Unsupported kanban group field: ${normalized}`);
36
+ }
37
+ function resolveBoardPath(vaultPath, output) {
38
+ const resolvedVaultPath = path.resolve(vaultPath);
39
+ if (!output) {
40
+ return path.join(resolvedVaultPath, "Board.md");
41
+ }
42
+ if (path.isAbsolute(output)) {
43
+ return output;
44
+ }
45
+ return path.join(resolvedVaultPath, output);
46
+ }
47
+ function toHashTag(value) {
48
+ return value.trim().replace(/\s+/g, "-").replace(/[^A-Za-z0-9/_-]/g, "");
49
+ }
50
+ function toMention(value) {
51
+ return value.trim().replace(/\s+/g, "-").replace(/[^A-Za-z0-9._-]/g, "");
52
+ }
53
+ function dateOnly(value) {
54
+ return value.includes("T") ? value.split("T")[0] : value;
55
+ }
56
+ function dueTimestamp(task) {
57
+ if (!task.frontmatter.due) return Number.POSITIVE_INFINITY;
58
+ const timestamp = Date.parse(task.frontmatter.due);
59
+ return Number.isNaN(timestamp) ? Number.POSITIVE_INFINITY : timestamp;
60
+ }
61
+ function sortTasksForCards(tasks) {
62
+ return [...tasks].sort((left, right) => {
63
+ const dueDiff = dueTimestamp(left) - dueTimestamp(right);
64
+ if (dueDiff !== 0) return dueDiff;
65
+ return new Date(right.frontmatter.created).getTime() - new Date(left.frontmatter.created).getTime();
66
+ });
67
+ }
68
+ function statusLaneName(status) {
69
+ const lane = STATUS_LANES.find((entry) => entry.status === status);
70
+ return lane ? lane.name : "Open";
71
+ }
72
+ function priorityLaneName(priority) {
73
+ const lane = PRIORITY_LANES.find((entry) => entry.priority === (priority ?? null));
74
+ return lane ? lane.name : "\u26AA Unset";
75
+ }
76
+ function laneNameForTask(task, groupBy) {
77
+ switch (groupBy) {
78
+ case "status":
79
+ return statusLaneName(task.frontmatter.status);
80
+ case "priority":
81
+ return priorityLaneName(task.frontmatter.priority);
82
+ case "project":
83
+ return task.frontmatter.project?.trim() || "No Project";
84
+ case "owner":
85
+ return task.frontmatter.owner?.trim() || "Unassigned";
86
+ default:
87
+ return statusLaneName(task.frontmatter.status);
88
+ }
89
+ }
90
+ function defaultLaneOrder(groupBy, tasks) {
91
+ if (groupBy === "status") {
92
+ return STATUS_LANES.map((entry) => entry.name);
93
+ }
94
+ if (groupBy === "priority") {
95
+ return PRIORITY_LANES.map((entry) => entry.name);
96
+ }
97
+ const fallback = groupBy === "project" ? "No Project" : "Unassigned";
98
+ const values = /* @__PURE__ */ new Set();
99
+ for (const task of tasks) {
100
+ values.add(laneNameForTask(task, groupBy));
101
+ }
102
+ if (values.size === 0) {
103
+ return [fallback];
104
+ }
105
+ const sorted = Array.from(values).sort((left, right) => left.localeCompare(right));
106
+ if (sorted.includes(fallback)) {
107
+ return [...sorted.filter((value) => value !== fallback), fallback];
108
+ }
109
+ return sorted;
110
+ }
111
+ function formatKanbanCard(task) {
112
+ const checkbox = task.frontmatter.status === "done" ? "x" : " ";
113
+ const parts = [];
114
+ if (task.frontmatter.priority) {
115
+ parts.push(PRIORITY_EMOJI[task.frontmatter.priority]);
116
+ }
117
+ parts.push(`[[${task.slug}|${task.title}]]`);
118
+ if (task.frontmatter.project) {
119
+ const projectTag = toHashTag(task.frontmatter.project);
120
+ if (projectTag) parts.push(`#${projectTag}`);
121
+ }
122
+ if (task.frontmatter.owner) {
123
+ const mention = toMention(task.frontmatter.owner);
124
+ if (mention) parts.push(`@${mention}`);
125
+ }
126
+ if (task.frontmatter.tags && task.frontmatter.tags.length > 0) {
127
+ for (const tag of task.frontmatter.tags) {
128
+ const normalizedTag = toHashTag(tag);
129
+ if (normalizedTag) parts.push(`#${normalizedTag}`);
130
+ }
131
+ }
132
+ if (task.frontmatter.due) {
133
+ parts.push(`\u{1F4C5} ${dateOnly(task.frontmatter.due)}`);
134
+ }
135
+ if (task.frontmatter.status === "blocked" || task.frontmatter.blocked_by) {
136
+ parts.push("\u26D4");
137
+ }
138
+ return `- [${checkbox}] ${parts.join(" ")}`;
139
+ }
140
+ function buildKanbanLanes(tasks, groupBy) {
141
+ const laneOrder = defaultLaneOrder(groupBy, tasks);
142
+ const lanes = /* @__PURE__ */ new Map();
143
+ for (const laneName of laneOrder) {
144
+ lanes.set(laneName, []);
145
+ }
146
+ for (const task of sortTasksForCards(tasks)) {
147
+ const laneName = laneNameForTask(task, groupBy);
148
+ if (!lanes.has(laneName)) {
149
+ lanes.set(laneName, []);
150
+ }
151
+ lanes.get(laneName)?.push(formatKanbanCard(task));
152
+ }
153
+ return Array.from(lanes.entries()).map(([name, cards]) => ({ name, cards }));
154
+ }
155
+ function generateKanbanMarkdown(tasks, options = {}) {
156
+ const groupBy = normalizeGroupBy(options.groupBy);
157
+ const syncedAt = (options.now || /* @__PURE__ */ new Date()).toISOString();
158
+ const lanes = buildKanbanLanes(tasks, groupBy);
159
+ const sections = lanes.map((lane) => {
160
+ const cardsBlock = lane.cards.length > 0 ? lane.cards.join("\n") : "";
161
+ return `## ${lane.name}
162
+
163
+ ${cardsBlock}`.trimEnd();
164
+ }).join("\n\n");
165
+ return [
166
+ "---",
167
+ "kanban-plugin: basic",
168
+ `clawvault-group-by: ${groupBy}`,
169
+ `clawvault-last-sync: '${syncedAt}'`,
170
+ "---",
171
+ "",
172
+ sections,
173
+ "",
174
+ "%% kanban:settings",
175
+ '{"kanban-plugin":"basic","list-collapse":["Done"],"show-checkboxes":true}',
176
+ "%%",
177
+ ""
178
+ ].join("\n");
179
+ }
180
+ function syncKanbanBoard(vaultPath, options = {}) {
181
+ const groupBy = normalizeGroupBy(options.groupBy);
182
+ const outputPath = resolveBoardPath(vaultPath, options.output);
183
+ let tasks = listTasks(vaultPath);
184
+ if (options.filterProject) {
185
+ tasks = tasks.filter((task) => task.frontmatter.project === options.filterProject);
186
+ }
187
+ if (options.filterOwner) {
188
+ tasks = tasks.filter((task) => task.frontmatter.owner === options.filterOwner);
189
+ }
190
+ if (!options.includeDone) {
191
+ tasks = tasks.filter((task) => task.frontmatter.status !== "done");
192
+ }
193
+ const markdown = generateKanbanMarkdown(tasks, {
194
+ groupBy,
195
+ now: options.now
196
+ });
197
+ fs.writeFileSync(outputPath, markdown);
198
+ return {
199
+ outputPath,
200
+ groupBy,
201
+ markdown,
202
+ lanes: buildKanbanLanes(tasks, groupBy),
203
+ taskCount: tasks.length
204
+ };
205
+ }
206
+ function normalizeLaneKey(laneName) {
207
+ return laneName.toLowerCase().replace(/[^a-z0-9\s-]/g, " ").replace(/\s+/g, " ").trim();
208
+ }
209
+ function statusFromLaneName(laneName) {
210
+ const key = normalizeLaneKey(laneName);
211
+ if (key.includes("in progress") || key.includes("in-progress") || key === "active") return "in-progress";
212
+ if (key.includes("blocked")) return "blocked";
213
+ if (key.includes("done") || key.includes("complete")) return "done";
214
+ if (key.includes("open")) return "open";
215
+ return null;
216
+ }
217
+ function priorityFromLaneName(laneName) {
218
+ const key = normalizeLaneKey(laneName);
219
+ if (key.includes("critical")) return "critical";
220
+ if (key.includes("high")) return "high";
221
+ if (key.includes("medium")) return "medium";
222
+ if (key.includes("low")) return "low";
223
+ if (key.includes("unset") || key.includes("none") || key.includes("no priority")) return null;
224
+ return void 0;
225
+ }
226
+ function isProjectFallbackLane(laneName) {
227
+ const key = normalizeLaneKey(laneName);
228
+ return key === "no project" || key === "none";
229
+ }
230
+ function isOwnerFallbackLane(laneName) {
231
+ const key = normalizeLaneKey(laneName);
232
+ return key === "unassigned" || key === "none";
233
+ }
234
+ function extractCardSlug(line) {
235
+ const wikiMatch = line.match(/\[\[([^\]]+)\]\]/);
236
+ if (!wikiMatch) return null;
237
+ let target = wikiMatch[1].split("|")[0].trim();
238
+ if (!target) return null;
239
+ target = target.split("#")[0].trim();
240
+ const filePart = target.split("/").pop() || target;
241
+ const slug = filePart.replace(/\.md$/i, "").trim();
242
+ return slug || null;
243
+ }
244
+ function parseKanbanMarkdown(markdown) {
245
+ const parsed = matter(markdown);
246
+ const groupBy = normalizeGroupBy(
247
+ typeof parsed.data["clawvault-group-by"] === "string" ? parsed.data["clawvault-group-by"] : void 0
248
+ );
249
+ const lanes = [];
250
+ const laneByName = /* @__PURE__ */ new Map();
251
+ let currentLane = null;
252
+ const lines = parsed.content.split(/\r?\n/);
253
+ for (const line of lines) {
254
+ const headerMatch = line.match(/^##\s+(.+?)\s*$/);
255
+ if (headerMatch) {
256
+ const laneName = headerMatch[1].trim();
257
+ if (!laneByName.has(laneName)) {
258
+ const lane = { name: laneName, slugs: [] };
259
+ laneByName.set(laneName, lane);
260
+ lanes.push(lane);
261
+ }
262
+ currentLane = laneByName.get(laneName) || null;
263
+ continue;
264
+ }
265
+ if (!currentLane || !/^\s*-\s*\[[ xX]\]\s+/.test(line)) {
266
+ continue;
267
+ }
268
+ const slug = extractCardSlug(line);
269
+ if (slug) {
270
+ currentLane.slugs.push(slug);
271
+ }
272
+ }
273
+ return { groupBy, lanes };
274
+ }
275
+ function hasUpdates(updates) {
276
+ return Object.keys(updates).length > 0;
277
+ }
278
+ function importKanbanBoard(vaultPath, options = {}) {
279
+ const outputPath = resolveBoardPath(vaultPath, options.output);
280
+ if (!fs.existsSync(outputPath)) {
281
+ throw new Error(`Kanban board not found: ${outputPath}`);
282
+ }
283
+ const markdown = fs.readFileSync(outputPath, "utf-8");
284
+ const parsed = parseKanbanMarkdown(markdown);
285
+ const changes = [];
286
+ const missingSlugs = [];
287
+ const seenSlugs = /* @__PURE__ */ new Set();
288
+ for (const lane of parsed.lanes) {
289
+ for (const slug of lane.slugs) {
290
+ if (seenSlugs.has(slug)) continue;
291
+ seenSlugs.add(slug);
292
+ const task = readTask(vaultPath, slug);
293
+ if (!task) {
294
+ missingSlugs.push(slug);
295
+ continue;
296
+ }
297
+ const updates = {};
298
+ if (parsed.groupBy === "status") {
299
+ const desiredStatus = statusFromLaneName(lane.name);
300
+ if (desiredStatus && task.frontmatter.status !== desiredStatus) {
301
+ updates.status = desiredStatus;
302
+ changes.push({
303
+ slug,
304
+ field: "status",
305
+ from: task.frontmatter.status,
306
+ to: desiredStatus
307
+ });
308
+ }
309
+ } else if (parsed.groupBy === "priority") {
310
+ const desiredPriority = priorityFromLaneName(lane.name);
311
+ if (desiredPriority !== void 0) {
312
+ const currentPriority = task.frontmatter.priority ?? null;
313
+ if (currentPriority !== desiredPriority) {
314
+ updates.priority = desiredPriority;
315
+ changes.push({
316
+ slug,
317
+ field: "priority",
318
+ from: currentPriority,
319
+ to: desiredPriority
320
+ });
321
+ }
322
+ }
323
+ } else if (parsed.groupBy === "project") {
324
+ const desiredProject = isProjectFallbackLane(lane.name) ? null : lane.name.trim();
325
+ const currentProject = task.frontmatter.project ?? null;
326
+ if (currentProject !== desiredProject) {
327
+ updates.project = desiredProject;
328
+ changes.push({
329
+ slug,
330
+ field: "project",
331
+ from: currentProject,
332
+ to: desiredProject
333
+ });
334
+ }
335
+ } else if (parsed.groupBy === "owner") {
336
+ const desiredOwner = isOwnerFallbackLane(lane.name) ? null : lane.name.trim();
337
+ const currentOwner = task.frontmatter.owner ?? null;
338
+ if (currentOwner !== desiredOwner) {
339
+ updates.owner = desiredOwner;
340
+ changes.push({
341
+ slug,
342
+ field: "owner",
343
+ from: currentOwner,
344
+ to: desiredOwner
345
+ });
346
+ }
347
+ }
348
+ if (hasUpdates(updates)) {
349
+ updateTask(vaultPath, slug, updates);
350
+ }
351
+ }
352
+ }
353
+ return {
354
+ outputPath,
355
+ groupBy: parsed.groupBy,
356
+ changes,
357
+ missingSlugs
358
+ };
359
+ }
360
+ async function kanbanCommand(vaultPath, action, options = {}) {
361
+ if (action === "sync") {
362
+ const result = syncKanbanBoard(vaultPath, options);
363
+ console.log(`\u2713 Synced kanban board: ${result.outputPath}`);
364
+ console.log(` Grouped by: ${result.groupBy}`);
365
+ console.log(` Tasks included: ${result.taskCount}`);
366
+ return;
367
+ }
368
+ if (action === "import") {
369
+ const result = importKanbanBoard(vaultPath, options);
370
+ console.log(`\u2713 Imported kanban board: ${result.outputPath}`);
371
+ console.log(` Grouped by: ${result.groupBy}`);
372
+ if (result.changes.length === 0) {
373
+ console.log(" No task updates required.");
374
+ } else {
375
+ console.log(` Updated ${result.changes.length} task field(s):`);
376
+ for (const change of result.changes) {
377
+ const from = change.from ?? "(unset)";
378
+ const to = change.to ?? "(unset)";
379
+ console.log(` - ${change.slug}: ${change.field} ${from} -> ${to}`);
380
+ }
381
+ }
382
+ if (result.missingSlugs.length > 0) {
383
+ console.log(` Missing tasks (${result.missingSlugs.length}): ${result.missingSlugs.join(", ")}`);
384
+ }
385
+ return;
386
+ }
387
+ throw new Error(`Unknown kanban action: ${action}`);
388
+ }
389
+
390
+ export {
391
+ formatKanbanCard,
392
+ buildKanbanLanes,
393
+ generateKanbanMarkdown,
394
+ syncKanbanBoard,
395
+ extractCardSlug,
396
+ parseKanbanMarkdown,
397
+ importKanbanBoard,
398
+ kanbanCommand
399
+ };
@@ -2,7 +2,7 @@ import {
2
2
  createBacklogItem,
3
3
  listBacklogItems,
4
4
  promoteBacklogItem
5
- } from "../chunk-DEFBIVQ3.js";
5
+ } from "../chunk-6QLRSPLZ.js";
6
6
 
7
7
  // src/commands/backlog.ts
8
8
  function toDateStr(val) {
@@ -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
@@ -1,10 +1,10 @@
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";
@@ -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,12 @@
1
1
  import {
2
2
  observeCommand,
3
3
  registerObserveCommand
4
- } from "../chunk-B3SMJZIZ.js";
4
+ } from "../chunk-FD2ZA65C.js";
5
5
  import "../chunk-HRLWZGMA.js";
6
6
  import "../chunk-P5EPF6MB.js";
7
- import "../chunk-RXEIQ3KQ.js";
7
+ import "../chunk-H6WQUUNK.js";
8
8
  import "../chunk-MXSSG3QU.js";
9
- import "../chunk-DEFBIVQ3.js";
9
+ import "../chunk-6QLRSPLZ.js";
10
10
  import "../chunk-3PJIGGWV.js";
11
11
  import "../chunk-FHFUXL6G.js";
12
12
  import "../chunk-NAMFB7ZA.js";
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  rebuildCommand,
3
3
  registerRebuildCommand
4
- } from "../chunk-U2ONVV7N.js";
5
- import "../chunk-RXEIQ3KQ.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
8
  import "../chunk-3PJIGGWV.js";
9
9
  import "../chunk-FHFUXL6G.js";
10
10
  import "../chunk-NAMFB7ZA.js";
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  registerReplayCommand,
3
3
  replayCommand
4
- } from "../chunk-4JJL47IJ.js";
4
+ } from "../chunk-FKQJB6XC.js";
5
5
  import "../chunk-AHGUJG76.js";
6
- import "../chunk-RXEIQ3KQ.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
10
  import "../chunk-3PJIGGWV.js";
11
11
  import "../chunk-FHFUXL6G.js";
12
12
  import "../chunk-NAMFB7ZA.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  setupCommand
3
- } from "../chunk-YIRWDQKA.js";
3
+ } from "../chunk-P2ZH6AN5.js";
4
4
  import "../chunk-6B3JWM7J.js";
5
5
  import "../chunk-3PJIGGWV.js";
6
6
  export {
@@ -6,9 +6,9 @@ import {
6
6
  } from "../chunk-P5EPF6MB.js";
7
7
  import {
8
8
  Observer
9
- } from "../chunk-RXEIQ3KQ.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
14
  } from "../chunk-F55HGNU4.js";
@@ -1,10 +1,10 @@
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
10
  } from "../chunk-HNMFXFYP.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;