octie-cli 1.0.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.
Files changed (162) hide show
  1. package/README.md +523 -0
  2. package/dist/cli/commands/approve.d.ts +27 -0
  3. package/dist/cli/commands/approve.d.ts.map +1 -0
  4. package/dist/cli/commands/approve.js +119 -0
  5. package/dist/cli/commands/approve.js.map +1 -0
  6. package/dist/cli/commands/batch.d.ts +15 -0
  7. package/dist/cli/commands/batch.d.ts.map +1 -0
  8. package/dist/cli/commands/batch.js +521 -0
  9. package/dist/cli/commands/batch.js.map +1 -0
  10. package/dist/cli/commands/create.d.ts +9 -0
  11. package/dist/cli/commands/create.d.ts.map +1 -0
  12. package/dist/cli/commands/create.js +321 -0
  13. package/dist/cli/commands/create.js.map +1 -0
  14. package/dist/cli/commands/delete.d.ts +9 -0
  15. package/dist/cli/commands/delete.d.ts.map +1 -0
  16. package/dist/cli/commands/delete.js +143 -0
  17. package/dist/cli/commands/delete.js.map +1 -0
  18. package/dist/cli/commands/export.d.ts +9 -0
  19. package/dist/cli/commands/export.d.ts.map +1 -0
  20. package/dist/cli/commands/export.js +66 -0
  21. package/dist/cli/commands/export.js.map +1 -0
  22. package/dist/cli/commands/find.d.ts +16 -0
  23. package/dist/cli/commands/find.d.ts.map +1 -0
  24. package/dist/cli/commands/find.js +252 -0
  25. package/dist/cli/commands/find.js.map +1 -0
  26. package/dist/cli/commands/get.d.ts +9 -0
  27. package/dist/cli/commands/get.d.ts.map +1 -0
  28. package/dist/cli/commands/get.js +74 -0
  29. package/dist/cli/commands/get.js.map +1 -0
  30. package/dist/cli/commands/graph.d.ts +9 -0
  31. package/dist/cli/commands/graph.d.ts.map +1 -0
  32. package/dist/cli/commands/graph.js +200 -0
  33. package/dist/cli/commands/graph.js.map +1 -0
  34. package/dist/cli/commands/import.d.ts +9 -0
  35. package/dist/cli/commands/import.d.ts.map +1 -0
  36. package/dist/cli/commands/import.js +807 -0
  37. package/dist/cli/commands/import.js.map +1 -0
  38. package/dist/cli/commands/init.d.ts +9 -0
  39. package/dist/cli/commands/init.d.ts.map +1 -0
  40. package/dist/cli/commands/init.js +57 -0
  41. package/dist/cli/commands/init.js.map +1 -0
  42. package/dist/cli/commands/list.d.ts +9 -0
  43. package/dist/cli/commands/list.d.ts.map +1 -0
  44. package/dist/cli/commands/list.js +175 -0
  45. package/dist/cli/commands/list.js.map +1 -0
  46. package/dist/cli/commands/merge.d.ts +9 -0
  47. package/dist/cli/commands/merge.d.ts.map +1 -0
  48. package/dist/cli/commands/merge.js +113 -0
  49. package/dist/cli/commands/merge.js.map +1 -0
  50. package/dist/cli/commands/serve.d.ts +9 -0
  51. package/dist/cli/commands/serve.d.ts.map +1 -0
  52. package/dist/cli/commands/serve.js +94 -0
  53. package/dist/cli/commands/serve.js.map +1 -0
  54. package/dist/cli/commands/update.d.ts +9 -0
  55. package/dist/cli/commands/update.d.ts.map +1 -0
  56. package/dist/cli/commands/update.js +423 -0
  57. package/dist/cli/commands/update.js.map +1 -0
  58. package/dist/cli/commands/wire.d.ts +15 -0
  59. package/dist/cli/commands/wire.d.ts.map +1 -0
  60. package/dist/cli/commands/wire.js +164 -0
  61. package/dist/cli/commands/wire.js.map +1 -0
  62. package/dist/cli/index.d.ts +7 -0
  63. package/dist/cli/index.d.ts.map +1 -0
  64. package/dist/cli/index.js +100 -0
  65. package/dist/cli/index.js.map +1 -0
  66. package/dist/cli/output/json.d.ts +16 -0
  67. package/dist/cli/output/json.d.ts.map +1 -0
  68. package/dist/cli/output/json.js +29 -0
  69. package/dist/cli/output/json.js.map +1 -0
  70. package/dist/cli/output/markdown.d.ts +15 -0
  71. package/dist/cli/output/markdown.d.ts.map +1 -0
  72. package/dist/cli/output/markdown.js +206 -0
  73. package/dist/cli/output/markdown.js.map +1 -0
  74. package/dist/cli/output/table.d.ts +23 -0
  75. package/dist/cli/output/table.d.ts.map +1 -0
  76. package/dist/cli/output/table.js +150 -0
  77. package/dist/cli/output/table.js.map +1 -0
  78. package/dist/cli/utils/helpers.d.ts +126 -0
  79. package/dist/cli/utils/helpers.d.ts.map +1 -0
  80. package/dist/cli/utils/helpers.js +325 -0
  81. package/dist/cli/utils/helpers.js.map +1 -0
  82. package/dist/core/graph/algorithms.d.ts +11 -0
  83. package/dist/core/graph/algorithms.d.ts.map +1 -0
  84. package/dist/core/graph/algorithms.js +14 -0
  85. package/dist/core/graph/algorithms.js.map +1 -0
  86. package/dist/core/graph/cycle.d.ts +155 -0
  87. package/dist/core/graph/cycle.d.ts.map +1 -0
  88. package/dist/core/graph/cycle.js +297 -0
  89. package/dist/core/graph/cycle.js.map +1 -0
  90. package/dist/core/graph/index.d.ts +223 -0
  91. package/dist/core/graph/index.d.ts.map +1 -0
  92. package/dist/core/graph/index.js +475 -0
  93. package/dist/core/graph/index.js.map +1 -0
  94. package/dist/core/graph/operations.d.ts +240 -0
  95. package/dist/core/graph/operations.d.ts.map +1 -0
  96. package/dist/core/graph/operations.js +503 -0
  97. package/dist/core/graph/operations.js.map +1 -0
  98. package/dist/core/graph/sort.d.ts +76 -0
  99. package/dist/core/graph/sort.d.ts.map +1 -0
  100. package/dist/core/graph/sort.js +254 -0
  101. package/dist/core/graph/sort.js.map +1 -0
  102. package/dist/core/graph/traversal.d.ts +122 -0
  103. package/dist/core/graph/traversal.d.ts.map +1 -0
  104. package/dist/core/graph/traversal.js +336 -0
  105. package/dist/core/graph/traversal.js.map +1 -0
  106. package/dist/core/models/task-node.d.ts +328 -0
  107. package/dist/core/models/task-node.d.ts.map +1 -0
  108. package/dist/core/models/task-node.js +1090 -0
  109. package/dist/core/models/task-node.js.map +1 -0
  110. package/dist/core/registry/index.d.ts +102 -0
  111. package/dist/core/registry/index.d.ts.map +1 -0
  112. package/dist/core/registry/index.js +249 -0
  113. package/dist/core/registry/index.js.map +1 -0
  114. package/dist/core/registry/root-guard.d.ts +19 -0
  115. package/dist/core/registry/root-guard.d.ts.map +1 -0
  116. package/dist/core/registry/root-guard.js +28 -0
  117. package/dist/core/registry/root-guard.js.map +1 -0
  118. package/dist/core/storage/atomic-write.d.ts +181 -0
  119. package/dist/core/storage/atomic-write.d.ts.map +1 -0
  120. package/dist/core/storage/atomic-write.js +379 -0
  121. package/dist/core/storage/atomic-write.js.map +1 -0
  122. package/dist/core/storage/file-store.d.ts +148 -0
  123. package/dist/core/storage/file-store.d.ts.map +1 -0
  124. package/dist/core/storage/file-store.js +423 -0
  125. package/dist/core/storage/file-store.js.map +1 -0
  126. package/dist/core/storage/indexer.d.ts +138 -0
  127. package/dist/core/storage/indexer.d.ts.map +1 -0
  128. package/dist/core/storage/indexer.js +350 -0
  129. package/dist/core/storage/indexer.js.map +1 -0
  130. package/dist/core/utils/status-helpers.d.ts +59 -0
  131. package/dist/core/utils/status-helpers.d.ts.map +1 -0
  132. package/dist/core/utils/status-helpers.js +149 -0
  133. package/dist/core/utils/status-helpers.js.map +1 -0
  134. package/dist/index.d.ts +10 -0
  135. package/dist/index.d.ts.map +1 -0
  136. package/dist/index.js +10 -0
  137. package/dist/index.js.map +1 -0
  138. package/dist/types/index.d.ts +504 -0
  139. package/dist/types/index.d.ts.map +1 -0
  140. package/dist/types/index.js +182 -0
  141. package/dist/types/index.js.map +1 -0
  142. package/dist/web/routes/graph.d.ts +17 -0
  143. package/dist/web/routes/graph.d.ts.map +1 -0
  144. package/dist/web/routes/graph.js +277 -0
  145. package/dist/web/routes/graph.js.map +1 -0
  146. package/dist/web/routes/projects.d.ts +14 -0
  147. package/dist/web/routes/projects.d.ts.map +1 -0
  148. package/dist/web/routes/projects.js +102 -0
  149. package/dist/web/routes/projects.js.map +1 -0
  150. package/dist/web/routes/tasks.d.ts +17 -0
  151. package/dist/web/routes/tasks.d.ts.map +1 -0
  152. package/dist/web/routes/tasks.js +538 -0
  153. package/dist/web/routes/tasks.js.map +1 -0
  154. package/dist/web/server.d.ts +121 -0
  155. package/dist/web/server.d.ts.map +1 -0
  156. package/dist/web/server.js +389 -0
  157. package/dist/web/server.js.map +1 -0
  158. package/dist/web-ui/assets/index-BB0qvF1y.css +1 -0
  159. package/dist/web-ui/assets/index-Vmm72oKY.js +34 -0
  160. package/dist/web-ui/index.html +14 -0
  161. package/dist/web-ui/vite.svg +1 -0
  162. package/package.json +94 -0
@@ -0,0 +1,538 @@
1
+ /**
2
+ * Task Routes - RESTful CRUD endpoints for task management
3
+ *
4
+ * Provides complete CRUD operations for tasks via REST API.
5
+ * All endpoints use Zod validation and proper HTTP status codes.
6
+ *
7
+ * @module web/routes/tasks
8
+ */
9
+ import { z } from 'zod';
10
+ import { TaskNotFoundError, CircularDependencyError, ValidationError, AtomicTaskViolationError, AmbiguousIdError, ERROR_SUGGESTIONS } from '../../types/index.js';
11
+ import { TaskNode } from '../../core/models/task-node.js';
12
+ import { TaskStorage } from '../../core/storage/file-store.js';
13
+ import { v4 as uuidv4 } from 'uuid';
14
+ /**
15
+ * Zod schema for task creation validation
16
+ */
17
+ const TaskCreateSchema = z.object({
18
+ title: z.string()
19
+ .min(1, 'Title is required')
20
+ .max(200, 'Title must be 200 characters or less')
21
+ .refine(val => val.trim().length > 0, 'Title cannot be empty or whitespace'),
22
+ description: z.string()
23
+ .min(50, 'Description must be at least 50 characters')
24
+ .max(10000, 'Description must be 10000 characters or less')
25
+ .refine(val => val.trim().length > 0, 'Description cannot be empty or whitespace'),
26
+ successCriteria: z.array(z.object({
27
+ id: z.string().uuid().optional(),
28
+ text: z.string().min(1, 'Criterion text cannot be empty'),
29
+ completed: z.boolean().default(false),
30
+ })).min(1, 'At least one success criterion is required')
31
+ .max(10, 'Cannot have more than 10 success criteria'),
32
+ deliverables: z.array(z.object({
33
+ id: z.string().uuid().optional(),
34
+ text: z.string().min(1, 'Deliverable text cannot be empty'),
35
+ completed: z.boolean().default(false),
36
+ file_path: z.string().optional(),
37
+ })).min(1, 'At least one deliverable is required')
38
+ .max(5, 'Cannot have more than 5 deliverables'),
39
+ priority: z.enum(['top', 'second', 'later']).optional().default('second'),
40
+ // Status is now derived from task state, but we allow it for backward compatibility
41
+ status: z.enum(['ready', 'in_progress', 'in_review', 'completed', 'blocked']).optional(),
42
+ blockers: z.array(z.string().uuid()).default([]),
43
+ dependencies: z.string().default(''), // Explanatory text (twin to blockers)
44
+ relatedFiles: z.array(z.string()).default([]),
45
+ notes: z.string().default(''),
46
+ c7Verified: z.array(z.object({
47
+ library_id: z.string(),
48
+ verified_at: z.string(),
49
+ notes: z.string().optional(),
50
+ })).default([]),
51
+ });
52
+ /**
53
+ * Zod schema for task update validation (partial updates)
54
+ */
55
+ const TaskUpdateSchema = z.object({
56
+ title: z.string()
57
+ .min(1, 'Title is required')
58
+ .max(200, 'Title must be 200 characters or less')
59
+ .optional(),
60
+ description: z.string()
61
+ .min(50, 'Description must be at least 50 characters')
62
+ .max(10000, 'Description must be 10000 characters or less')
63
+ .optional(),
64
+ status: z.enum(['ready', 'in_progress', 'in_review', 'completed', 'blocked']).optional(),
65
+ priority: z.enum(['top', 'second', 'later']).optional(),
66
+ addSuccessCriterion: z.string().optional(),
67
+ completeCriterion: z.string().uuid().optional(),
68
+ addDeliverable: z.string().optional(),
69
+ completeDeliverable: z.string().uuid().optional(),
70
+ block: z.string().uuid().optional(),
71
+ unblock: z.string().uuid().optional(),
72
+ dependencyExplanation: z.string().optional(), // Set/update dependencies text
73
+ notes: z.string().optional(),
74
+ });
75
+ /**
76
+ * Zod schema for task merge validation
77
+ */
78
+ const TaskMergeSchema = z.object({
79
+ targetId: z.string().uuid('Target ID must be a valid UUID'),
80
+ });
81
+ /**
82
+ * Zod schema for query parameter validation
83
+ */
84
+ const TaskQuerySchema = z.object({
85
+ status: z.enum(['ready', 'in_progress', 'in_review', 'completed', 'blocked']).optional(),
86
+ priority: z.enum(['top', 'second', 'later']).optional(),
87
+ search: z.string().optional(),
88
+ limit: z.string().transform(val => val ? parseInt(val, 10) : undefined).pipe(z.number().int().positive().max(1000).optional()).optional(),
89
+ offset: z.string().transform(val => val ? parseInt(val, 10) : undefined).pipe(z.number().int().nonnegative().optional()).optional(),
90
+ });
91
+ /**
92
+ * Async error handler wrapper
93
+ * Catches async errors and passes them to Express error handling
94
+ */
95
+ function asyncHandler(fn) {
96
+ return (req, res, next) => {
97
+ Promise.resolve(fn(req, res)).catch(next);
98
+ };
99
+ }
100
+ /**
101
+ * Send successful API response
102
+ */
103
+ function sendSuccess(res, data, status = 200) {
104
+ res.status(status).json({
105
+ success: true,
106
+ data,
107
+ timestamp: new Date().toISOString(),
108
+ });
109
+ }
110
+ /**
111
+ * Send error API response
112
+ */
113
+ function sendError(res, code, message, status = 400, details, suggestion) {
114
+ res.status(status).json({
115
+ success: false,
116
+ error: {
117
+ code,
118
+ message,
119
+ suggestion: suggestion ?? ERROR_SUGGESTIONS[code],
120
+ details,
121
+ },
122
+ timestamp: new Date().toISOString(),
123
+ });
124
+ }
125
+ /**
126
+ * Register task routes
127
+ * @param router - Express Router instance
128
+ * @param getGraph - Function to get the current graph instance
129
+ */
130
+ export function registerTaskRoutes(router, getGraph) {
131
+ // Cache for loaded project graphs
132
+ const graphCache = new Map();
133
+ /**
134
+ * Get graph for a specific project path, using cache when possible
135
+ */
136
+ async function getProjectGraph(projectPath) {
137
+ if (!projectPath) {
138
+ return getGraph();
139
+ }
140
+ // Check cache first
141
+ const cached = graphCache.get(projectPath);
142
+ if (cached) {
143
+ return cached;
144
+ }
145
+ // Load the project
146
+ try {
147
+ const storage = new TaskStorage({ projectDir: projectPath });
148
+ const graph = await storage.load();
149
+ graphCache.set(projectPath, graph);
150
+ return graph;
151
+ }
152
+ catch {
153
+ return null;
154
+ }
155
+ }
156
+ /**
157
+ * Extract project path from query params
158
+ */
159
+ function getProjectPath(req) {
160
+ const project = req.query.project;
161
+ return typeof project === 'string' ? project : undefined;
162
+ }
163
+ /**
164
+ * GET /api/tasks
165
+ * List all tasks with optional filtering
166
+ */
167
+ router.get('/api/tasks', asyncHandler(async (req, res) => {
168
+ const projectPath = getProjectPath(req);
169
+ const graph = await getProjectGraph(projectPath);
170
+ if (!graph) {
171
+ return sendError(res, 'GRAPH_NOT_LOADED', projectPath ? `Project not found: ${projectPath}` : 'Graph not loaded', 500);
172
+ }
173
+ // Validate query parameters
174
+ const queryResult = TaskQuerySchema.safeParse(req.query);
175
+ if (!queryResult.success) {
176
+ return sendError(res, 'INVALID_QUERY', 'Invalid query parameters', 400, queryResult.error.issues);
177
+ }
178
+ const { status, priority, search, limit, offset } = queryResult.data;
179
+ // Get all tasks
180
+ let tasks = Array.from(graph.getAllTasks());
181
+ // Apply filters
182
+ if (status) {
183
+ tasks = tasks.filter(task => task.status === status);
184
+ }
185
+ if (priority) {
186
+ tasks = tasks.filter(task => task.priority === priority);
187
+ }
188
+ if (search) {
189
+ const searchLower = search.toLowerCase();
190
+ tasks = tasks.filter(task => task.title.toLowerCase().includes(searchLower) ||
191
+ task.description.toLowerCase().includes(searchLower) ||
192
+ task.notes.toLowerCase().includes(searchLower));
193
+ }
194
+ // Apply pagination
195
+ const total = tasks.length;
196
+ if (offset) {
197
+ tasks = tasks.slice(offset);
198
+ }
199
+ if (limit) {
200
+ tasks = tasks.slice(0, limit);
201
+ }
202
+ return sendSuccess(res, {
203
+ tasks,
204
+ total,
205
+ returned: tasks.length,
206
+ limit,
207
+ offset,
208
+ });
209
+ }));
210
+ /**
211
+ * GET /api/tasks/:id
212
+ * Get a specific task by ID
213
+ */
214
+ router.get('/api/tasks/:id', asyncHandler(async (req, res) => {
215
+ const projectPath = getProjectPath(req);
216
+ const graph = await getProjectGraph(projectPath);
217
+ if (!graph) {
218
+ return sendError(res, 'GRAPH_NOT_LOADED', projectPath ? `Project not found: ${projectPath}` : 'Graph not loaded', 500);
219
+ }
220
+ const { id } = req.params;
221
+ if (!id) {
222
+ return sendError(res, 'INVALID_ID', 'Task ID is required', 400);
223
+ }
224
+ try {
225
+ const task = graph.getNodeByIdOrPrefix(id);
226
+ if (!task) {
227
+ return sendError(res, 'TASK_NOT_FOUND', `Task with ID '${id}' not found`, 404);
228
+ }
229
+ return sendSuccess(res, task);
230
+ }
231
+ catch (err) {
232
+ if (err instanceof AmbiguousIdError) {
233
+ return sendError(res, 'AMBIGUOUS_ID', err.message, 400);
234
+ }
235
+ if (err instanceof TaskNotFoundError) {
236
+ return sendError(res, 'TASK_NOT_FOUND', err.message, 404);
237
+ }
238
+ throw err;
239
+ }
240
+ }));
241
+ /**
242
+ * POST /api/tasks
243
+ * Create a new task
244
+ */
245
+ router.post('/api/tasks', asyncHandler(async (req, res) => {
246
+ const projectPath = getProjectPath(req);
247
+ const graph = await getProjectGraph(projectPath);
248
+ if (!graph) {
249
+ return sendError(res, 'GRAPH_NOT_LOADED', projectPath ? `Project not found: ${projectPath}` : 'Graph not loaded', 500);
250
+ }
251
+ // Validate request body
252
+ const bodyResult = TaskCreateSchema.safeParse(req.body);
253
+ if (!bodyResult.success) {
254
+ return sendError(res, 'VALIDATION_ERROR', 'Invalid request body', 400, bodyResult.error.issues);
255
+ }
256
+ const data = bodyResult.data;
257
+ try {
258
+ // Generate UUID for new task with collision detection
259
+ const taskId = graph.generateUniqueId();
260
+ // Create success criteria with IDs
261
+ const successCriteria = data.successCriteria.map(sc => ({
262
+ id: sc.id || uuidv4(),
263
+ text: sc.text,
264
+ completed: sc.completed,
265
+ }));
266
+ // Create deliverables with IDs
267
+ const deliverables = data.deliverables.map(d => ({
268
+ id: d.id || uuidv4(),
269
+ text: d.text,
270
+ completed: d.completed,
271
+ file_path: d.file_path,
272
+ }));
273
+ // Twin validation: blockers and dependencies must be provided together
274
+ if (data.blockers.length > 0 && !data.dependencies) {
275
+ return sendError(res, 'TWIN_VALIDATION_ERROR', 'When blockers are provided, dependencies explanation text is also required', 400);
276
+ }
277
+ if (data.dependencies && data.blockers.length === 0) {
278
+ return sendError(res, 'TWIN_VALIDATION_ERROR', 'When dependencies explanation is provided, blockers are also required', 400);
279
+ }
280
+ // Validate blockers exist
281
+ for (const blockerId of data.blockers) {
282
+ if (!graph.hasNode(blockerId)) {
283
+ return sendError(res, 'BLOCKER_NOT_FOUND', `Blocker task '${blockerId}' not found`, 400);
284
+ }
285
+ }
286
+ // Create TaskNode instance (includes atomic validation)
287
+ const taskNode = new TaskNode({
288
+ id: taskId,
289
+ title: data.title,
290
+ description: data.description,
291
+ success_criteria: successCriteria,
292
+ deliverables: deliverables,
293
+ priority: data.priority,
294
+ status: data.status,
295
+ blockers: data.blockers,
296
+ dependencies: data.dependencies,
297
+ related_files: data.relatedFiles,
298
+ notes: data.notes,
299
+ c7_verified: data.c7Verified,
300
+ });
301
+ // Add to graph
302
+ graph.addNode(taskNode);
303
+ // Add edges for blockers
304
+ for (const blockerId of data.blockers) {
305
+ graph.addEdge(blockerId, taskId);
306
+ }
307
+ // Return created task
308
+ return sendSuccess(res, graph.getNodeOrThrow(taskId), 201);
309
+ }
310
+ catch (err) {
311
+ if (err instanceof AtomicTaskViolationError) {
312
+ return sendError(res, 'ATOMIC_TASK_VIOLATION', err.message, 400);
313
+ }
314
+ if (err instanceof ValidationError) {
315
+ return sendError(res, 'VALIDATION_ERROR', err.message, 400);
316
+ }
317
+ if (err instanceof CircularDependencyError) {
318
+ return sendError(res, 'CIRCULAR_DEPENDENCY', err.message, 400);
319
+ }
320
+ throw err;
321
+ }
322
+ }));
323
+ /**
324
+ * PUT /api/tasks/:id
325
+ * Update an existing task
326
+ */
327
+ router.put('/api/tasks/:id', asyncHandler(async (req, res) => {
328
+ const projectPath = getProjectPath(req);
329
+ const graph = await getProjectGraph(projectPath);
330
+ if (!graph) {
331
+ return sendError(res, 'GRAPH_NOT_LOADED', projectPath ? `Project not found: ${projectPath}` : 'Graph not loaded', 500);
332
+ }
333
+ const { id } = req.params;
334
+ if (!id) {
335
+ return sendError(res, 'INVALID_ID', 'Task ID is required', 400);
336
+ }
337
+ // Validate request body
338
+ const bodyResult = TaskUpdateSchema.safeParse(req.body);
339
+ if (!bodyResult.success) {
340
+ return sendError(res, 'VALIDATION_ERROR', 'Invalid request body', 400, bodyResult.error.issues);
341
+ }
342
+ const data = bodyResult.data;
343
+ try {
344
+ // Support short UUID prefix lookup
345
+ const task = graph.getNodeByIdOrPrefix(id);
346
+ if (!task) {
347
+ return sendError(res, 'TASK_NOT_FOUND', `Task with ID '${id}' not found`, 404);
348
+ }
349
+ // Use the full ID for all operations
350
+ const fullId = task.id;
351
+ // Apply updates
352
+ if (data.title !== undefined) {
353
+ task.setTitle(data.title);
354
+ }
355
+ if (data.description !== undefined) {
356
+ task.setDescription(data.description);
357
+ }
358
+ if (data.status !== undefined) {
359
+ task.setStatus(data.status);
360
+ }
361
+ if (data.priority !== undefined) {
362
+ task.setPriority(data.priority);
363
+ }
364
+ if (data.addSuccessCriterion !== undefined) {
365
+ task.addSuccessCriterion({
366
+ id: uuidv4(),
367
+ text: data.addSuccessCriterion,
368
+ completed: false,
369
+ });
370
+ }
371
+ if (data.completeCriterion !== undefined) {
372
+ task.completeCriterion(data.completeCriterion);
373
+ }
374
+ if (data.addDeliverable !== undefined) {
375
+ task.addDeliverable({
376
+ id: uuidv4(),
377
+ text: data.addDeliverable,
378
+ completed: false,
379
+ });
380
+ }
381
+ if (data.completeDeliverable !== undefined) {
382
+ task.completeDeliverable(data.completeDeliverable);
383
+ }
384
+ if (data.block !== undefined) {
385
+ if (!graph.hasNode(data.block)) {
386
+ return sendError(res, 'BLOCKER_NOT_FOUND', `Blocker task '${data.block}' not found`, 400);
387
+ }
388
+ // Twin validation: block requires dependencyExplanation
389
+ if (!data.dependencyExplanation) {
390
+ return sendError(res, 'TWIN_VALIDATION_ERROR', 'When adding a blocker, dependencyExplanation is required', 400);
391
+ }
392
+ task.addBlocker(data.block);
393
+ graph.addEdge(data.block, fullId);
394
+ // Update dependencies explanation
395
+ const existingDeps = task.dependencies || '';
396
+ task.setDependencies(existingDeps ? `${existingDeps}\n${data.dependencyExplanation}` : data.dependencyExplanation);
397
+ }
398
+ if (data.unblock !== undefined) {
399
+ task.removeBlocker(data.unblock);
400
+ graph.removeEdge(data.unblock, fullId);
401
+ // Auto-clear dependencies if last blocker removed
402
+ if (task.blockers.length === 0) {
403
+ task.clearDependencies();
404
+ }
405
+ }
406
+ // Update dependencies explanation (standalone)
407
+ if (data.dependencyExplanation !== undefined && data.block === undefined) {
408
+ if (task.blockers.length === 0) {
409
+ return sendError(res, 'TWIN_VALIDATION_ERROR', 'Cannot set dependencies explanation without blockers', 400);
410
+ }
411
+ task.setDependencies(data.dependencyExplanation);
412
+ }
413
+ if (data.notes !== undefined) {
414
+ task.appendNotes(data.notes);
415
+ }
416
+ // Update node in graph
417
+ graph.updateNode(task);
418
+ // Return updated task
419
+ return sendSuccess(res, task);
420
+ }
421
+ catch (err) {
422
+ if (err instanceof AmbiguousIdError) {
423
+ return sendError(res, 'AMBIGUOUS_ID', err.message, 400);
424
+ }
425
+ if (err instanceof TaskNotFoundError) {
426
+ return sendError(res, 'TASK_NOT_FOUND', err.message, 404);
427
+ }
428
+ if (err instanceof ValidationError) {
429
+ return sendError(res, 'VALIDATION_ERROR', err.message, 400);
430
+ }
431
+ if (err instanceof CircularDependencyError) {
432
+ return sendError(res, 'CIRCULAR_DEPENDENCY', err.message, 400);
433
+ }
434
+ throw err;
435
+ }
436
+ }));
437
+ /**
438
+ * DELETE /api/tasks/:id
439
+ * Delete a task
440
+ */
441
+ router.delete('/api/tasks/:id', asyncHandler(async (req, res) => {
442
+ const projectPath = getProjectPath(req);
443
+ const graph = await getProjectGraph(projectPath);
444
+ if (!graph) {
445
+ return sendError(res, 'GRAPH_NOT_LOADED', projectPath ? `Project not found: ${projectPath}` : 'Graph not loaded', 500);
446
+ }
447
+ const { id } = req.params;
448
+ if (!id) {
449
+ return sendError(res, 'INVALID_ID', 'Task ID is required', 400);
450
+ }
451
+ const reconnect = req.query.reconnect === 'true';
452
+ try {
453
+ // Support short UUID prefix lookup
454
+ const task = graph.getNodeByIdOrPrefix(id);
455
+ if (!task) {
456
+ return sendError(res, 'TASK_NOT_FOUND', `Task with ID '${id}' not found`, 404);
457
+ }
458
+ // Use the full ID for all operations
459
+ const fullId = task.id;
460
+ // Get affected tasks
461
+ const incoming = graph.getIncomingEdges(fullId);
462
+ const outgoing = graph.getOutgoingEdges(fullId);
463
+ // Remove the task
464
+ graph.removeNode(fullId);
465
+ // Reconnect edges if requested
466
+ if (reconnect) {
467
+ for (const fromId of incoming) {
468
+ for (const toId of outgoing) {
469
+ try {
470
+ graph.addEdge(fromId, toId);
471
+ }
472
+ catch {
473
+ // Ignore if edge already exists
474
+ }
475
+ }
476
+ }
477
+ }
478
+ // Return success with deleted task info
479
+ return sendSuccess(res, {
480
+ deletedTask: task,
481
+ reconnected: reconnect,
482
+ incomingBeforeDelete: incoming,
483
+ outgoingBeforeDelete: outgoing,
484
+ });
485
+ }
486
+ catch (err) {
487
+ if (err instanceof AmbiguousIdError) {
488
+ return sendError(res, 'AMBIGUOUS_ID', err.message, 400);
489
+ }
490
+ if (err instanceof TaskNotFoundError) {
491
+ return sendError(res, 'TASK_NOT_FOUND', err.message, 404);
492
+ }
493
+ throw err;
494
+ }
495
+ }));
496
+ /**
497
+ * POST /api/tasks/:id/merge
498
+ * Merge this task into another task
499
+ */
500
+ router.post('/api/tasks/:id/merge', asyncHandler(async (req, res) => {
501
+ const projectPath = getProjectPath(req);
502
+ const graph = await getProjectGraph(projectPath);
503
+ if (!graph) {
504
+ return sendError(res, 'GRAPH_NOT_LOADED', projectPath ? `Project not found: ${projectPath}` : 'Graph not loaded', 500);
505
+ }
506
+ const { id } = req.params;
507
+ if (!id) {
508
+ return sendError(res, 'INVALID_ID', 'Task ID is required', 400);
509
+ }
510
+ // Validate request body
511
+ const bodyResult = TaskMergeSchema.safeParse(req.body);
512
+ if (!bodyResult.success) {
513
+ return sendError(res, 'VALIDATION_ERROR', 'Invalid request body', 400, bodyResult.error.issues);
514
+ }
515
+ const { targetId } = bodyResult.data;
516
+ try {
517
+ // Import mergeTasks from operations module
518
+ const { mergeTasks } = await import('../../core/graph/operations.js');
519
+ // Perform merge
520
+ const mergedTask = mergeTasks(graph, id, targetId);
521
+ // Return merged task
522
+ return sendSuccess(res, mergedTask);
523
+ }
524
+ catch (err) {
525
+ if (err instanceof TaskNotFoundError) {
526
+ return sendError(res, 'TASK_NOT_FOUND', err.message, 404);
527
+ }
528
+ if (err instanceof CircularDependencyError) {
529
+ return sendError(res, 'CIRCULAR_DEPENDENCY', err.message, 400);
530
+ }
531
+ if (err instanceof Error) {
532
+ return sendError(res, 'MERGE_ERROR', err.message, 400);
533
+ }
534
+ throw err;
535
+ }
536
+ }));
537
+ }
538
+ //# sourceMappingURL=tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../../src/web/routes/tasks.ts"],"names":[],"mappings":"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"}