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.
- package/README.md +523 -0
- package/dist/cli/commands/approve.d.ts +27 -0
- package/dist/cli/commands/approve.d.ts.map +1 -0
- package/dist/cli/commands/approve.js +119 -0
- package/dist/cli/commands/approve.js.map +1 -0
- package/dist/cli/commands/batch.d.ts +15 -0
- package/dist/cli/commands/batch.d.ts.map +1 -0
- package/dist/cli/commands/batch.js +521 -0
- package/dist/cli/commands/batch.js.map +1 -0
- package/dist/cli/commands/create.d.ts +9 -0
- package/dist/cli/commands/create.d.ts.map +1 -0
- package/dist/cli/commands/create.js +321 -0
- package/dist/cli/commands/create.js.map +1 -0
- package/dist/cli/commands/delete.d.ts +9 -0
- package/dist/cli/commands/delete.d.ts.map +1 -0
- package/dist/cli/commands/delete.js +143 -0
- package/dist/cli/commands/delete.js.map +1 -0
- package/dist/cli/commands/export.d.ts +9 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +66 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/find.d.ts +16 -0
- package/dist/cli/commands/find.d.ts.map +1 -0
- package/dist/cli/commands/find.js +252 -0
- package/dist/cli/commands/find.js.map +1 -0
- package/dist/cli/commands/get.d.ts +9 -0
- package/dist/cli/commands/get.d.ts.map +1 -0
- package/dist/cli/commands/get.js +74 -0
- package/dist/cli/commands/get.js.map +1 -0
- package/dist/cli/commands/graph.d.ts +9 -0
- package/dist/cli/commands/graph.d.ts.map +1 -0
- package/dist/cli/commands/graph.js +200 -0
- package/dist/cli/commands/graph.js.map +1 -0
- package/dist/cli/commands/import.d.ts +9 -0
- package/dist/cli/commands/import.d.ts.map +1 -0
- package/dist/cli/commands/import.js +807 -0
- package/dist/cli/commands/import.js.map +1 -0
- package/dist/cli/commands/init.d.ts +9 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +57 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/list.d.ts +9 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +175 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/merge.d.ts +9 -0
- package/dist/cli/commands/merge.d.ts.map +1 -0
- package/dist/cli/commands/merge.js +113 -0
- package/dist/cli/commands/merge.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +9 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +94 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/update.d.ts +9 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +423 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/commands/wire.d.ts +15 -0
- package/dist/cli/commands/wire.d.ts.map +1 -0
- package/dist/cli/commands/wire.js +164 -0
- package/dist/cli/commands/wire.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +100 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/output/json.d.ts +16 -0
- package/dist/cli/output/json.d.ts.map +1 -0
- package/dist/cli/output/json.js +29 -0
- package/dist/cli/output/json.js.map +1 -0
- package/dist/cli/output/markdown.d.ts +15 -0
- package/dist/cli/output/markdown.d.ts.map +1 -0
- package/dist/cli/output/markdown.js +206 -0
- package/dist/cli/output/markdown.js.map +1 -0
- package/dist/cli/output/table.d.ts +23 -0
- package/dist/cli/output/table.d.ts.map +1 -0
- package/dist/cli/output/table.js +150 -0
- package/dist/cli/output/table.js.map +1 -0
- package/dist/cli/utils/helpers.d.ts +126 -0
- package/dist/cli/utils/helpers.d.ts.map +1 -0
- package/dist/cli/utils/helpers.js +325 -0
- package/dist/cli/utils/helpers.js.map +1 -0
- package/dist/core/graph/algorithms.d.ts +11 -0
- package/dist/core/graph/algorithms.d.ts.map +1 -0
- package/dist/core/graph/algorithms.js +14 -0
- package/dist/core/graph/algorithms.js.map +1 -0
- package/dist/core/graph/cycle.d.ts +155 -0
- package/dist/core/graph/cycle.d.ts.map +1 -0
- package/dist/core/graph/cycle.js +297 -0
- package/dist/core/graph/cycle.js.map +1 -0
- package/dist/core/graph/index.d.ts +223 -0
- package/dist/core/graph/index.d.ts.map +1 -0
- package/dist/core/graph/index.js +475 -0
- package/dist/core/graph/index.js.map +1 -0
- package/dist/core/graph/operations.d.ts +240 -0
- package/dist/core/graph/operations.d.ts.map +1 -0
- package/dist/core/graph/operations.js +503 -0
- package/dist/core/graph/operations.js.map +1 -0
- package/dist/core/graph/sort.d.ts +76 -0
- package/dist/core/graph/sort.d.ts.map +1 -0
- package/dist/core/graph/sort.js +254 -0
- package/dist/core/graph/sort.js.map +1 -0
- package/dist/core/graph/traversal.d.ts +122 -0
- package/dist/core/graph/traversal.d.ts.map +1 -0
- package/dist/core/graph/traversal.js +336 -0
- package/dist/core/graph/traversal.js.map +1 -0
- package/dist/core/models/task-node.d.ts +328 -0
- package/dist/core/models/task-node.d.ts.map +1 -0
- package/dist/core/models/task-node.js +1090 -0
- package/dist/core/models/task-node.js.map +1 -0
- package/dist/core/registry/index.d.ts +102 -0
- package/dist/core/registry/index.d.ts.map +1 -0
- package/dist/core/registry/index.js +249 -0
- package/dist/core/registry/index.js.map +1 -0
- package/dist/core/registry/root-guard.d.ts +19 -0
- package/dist/core/registry/root-guard.d.ts.map +1 -0
- package/dist/core/registry/root-guard.js +28 -0
- package/dist/core/registry/root-guard.js.map +1 -0
- package/dist/core/storage/atomic-write.d.ts +181 -0
- package/dist/core/storage/atomic-write.d.ts.map +1 -0
- package/dist/core/storage/atomic-write.js +379 -0
- package/dist/core/storage/atomic-write.js.map +1 -0
- package/dist/core/storage/file-store.d.ts +148 -0
- package/dist/core/storage/file-store.d.ts.map +1 -0
- package/dist/core/storage/file-store.js +423 -0
- package/dist/core/storage/file-store.js.map +1 -0
- package/dist/core/storage/indexer.d.ts +138 -0
- package/dist/core/storage/indexer.d.ts.map +1 -0
- package/dist/core/storage/indexer.js +350 -0
- package/dist/core/storage/indexer.js.map +1 -0
- package/dist/core/utils/status-helpers.d.ts +59 -0
- package/dist/core/utils/status-helpers.d.ts.map +1 -0
- package/dist/core/utils/status-helpers.js +149 -0
- package/dist/core/utils/status-helpers.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +504 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +182 -0
- package/dist/types/index.js.map +1 -0
- package/dist/web/routes/graph.d.ts +17 -0
- package/dist/web/routes/graph.d.ts.map +1 -0
- package/dist/web/routes/graph.js +277 -0
- package/dist/web/routes/graph.js.map +1 -0
- package/dist/web/routes/projects.d.ts +14 -0
- package/dist/web/routes/projects.d.ts.map +1 -0
- package/dist/web/routes/projects.js +102 -0
- package/dist/web/routes/projects.js.map +1 -0
- package/dist/web/routes/tasks.d.ts +17 -0
- package/dist/web/routes/tasks.d.ts.map +1 -0
- package/dist/web/routes/tasks.js +538 -0
- package/dist/web/routes/tasks.js.map +1 -0
- package/dist/web/server.d.ts +121 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +389 -0
- package/dist/web/server.js.map +1 -0
- package/dist/web-ui/assets/index-BB0qvF1y.css +1 -0
- package/dist/web-ui/assets/index-Vmm72oKY.js +34 -0
- package/dist/web-ui/index.html +14 -0
- package/dist/web-ui/vite.svg +1 -0
- 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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"}
|