@cleocode/mcp-server 0.90.3 → 0.94.1
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 +2 -2
- package/dist/domains/index.d.ts +1 -0
- package/dist/domains/index.d.ts.map +1 -1
- package/dist/domains/index.js +1 -0
- package/dist/domains/index.js.map +1 -1
- package/dist/domains/issues.d.ts +44 -0
- package/dist/domains/issues.d.ts.map +1 -0
- package/dist/domains/issues.js +182 -0
- package/dist/domains/issues.js.map +1 -0
- package/dist/domains/lifecycle.d.ts.map +1 -1
- package/dist/domains/lifecycle.js +8 -0
- package/dist/domains/lifecycle.js.map +1 -1
- package/dist/domains/orchestrate.js +6 -6
- package/dist/domains/orchestrate.js.map +1 -1
- package/dist/domains/release.js +4 -4
- package/dist/domains/release.js.map +1 -1
- package/dist/domains/research.d.ts.map +1 -1
- package/dist/domains/research.js +8 -0
- package/dist/domains/research.js.map +1 -1
- package/dist/domains/session.d.ts +20 -1
- package/dist/domains/session.d.ts.map +1 -1
- package/dist/domains/session.js +133 -7
- package/dist/domains/session.js.map +1 -1
- package/dist/domains/system.d.ts +20 -1
- package/dist/domains/system.d.ts.map +1 -1
- package/dist/domains/system.js +211 -7
- package/dist/domains/system.js.map +1 -1
- package/dist/domains/tasks.d.ts +20 -1
- package/dist/domains/tasks.d.ts.map +1 -1
- package/dist/domains/tasks.js +165 -1
- package/dist/domains/tasks.js.map +1 -1
- package/dist/domains/validate.d.ts.map +1 -1
- package/dist/domains/validate.js +8 -0
- package/dist/domains/validate.js.map +1 -1
- package/dist/engine/caamp-adapter.d.ts +93 -0
- package/dist/engine/caamp-adapter.d.ts.map +1 -0
- package/dist/engine/caamp-adapter.js +358 -0
- package/dist/engine/caamp-adapter.js.map +1 -0
- package/dist/engine/caamp-verify.d.ts +2 -0
- package/dist/engine/caamp-verify.d.ts.map +1 -0
- package/dist/engine/caamp-verify.js +15 -0
- package/dist/engine/caamp-verify.js.map +1 -0
- package/dist/engine/capability-matrix.d.ts +67 -0
- package/dist/engine/capability-matrix.d.ts.map +1 -0
- package/dist/engine/capability-matrix.js +227 -0
- package/dist/engine/capability-matrix.js.map +1 -0
- package/dist/engine/config-engine.d.ts +29 -0
- package/dist/engine/config-engine.d.ts.map +1 -0
- package/dist/engine/config-engine.js +110 -0
- package/dist/engine/config-engine.js.map +1 -0
- package/dist/engine/id-generator.d.ts +34 -0
- package/dist/engine/id-generator.d.ts.map +1 -0
- package/dist/engine/id-generator.js +91 -0
- package/dist/engine/id-generator.js.map +1 -0
- package/dist/engine/index.d.ts +18 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +28 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/init-engine.d.ts +52 -0
- package/dist/engine/init-engine.d.ts.map +1 -0
- package/dist/engine/init-engine.js +222 -0
- package/dist/engine/init-engine.js.map +1 -0
- package/dist/engine/schema-validator.d.ts +47 -0
- package/dist/engine/schema-validator.d.ts.map +1 -0
- package/dist/engine/schema-validator.js +219 -0
- package/dist/engine/schema-validator.js.map +1 -0
- package/dist/engine/session-engine.d.ts +139 -0
- package/dist/engine/session-engine.d.ts.map +1 -0
- package/dist/engine/session-engine.js +401 -0
- package/dist/engine/session-engine.js.map +1 -0
- package/dist/engine/store.d.ts +67 -0
- package/dist/engine/store.d.ts.map +1 -0
- package/dist/engine/store.js +284 -0
- package/dist/engine/store.js.map +1 -0
- package/dist/engine/task-engine.d.ts +139 -0
- package/dist/engine/task-engine.d.ts.map +1 -0
- package/dist/engine/task-engine.js +481 -0
- package/dist/engine/task-engine.js.map +1 -0
- package/dist/engine/validation-rules.d.ts +78 -0
- package/dist/engine/validation-rules.d.ts.map +1 -0
- package/dist/engine/validation-rules.js +218 -0
- package/dist/engine/validation-rules.js.map +1 -0
- package/dist/gateways/mutate.d.ts +1 -1
- package/dist/gateways/mutate.d.ts.map +1 -1
- package/dist/gateways/mutate.js +6 -1
- package/dist/gateways/mutate.js.map +1 -1
- package/dist/gateways/query.d.ts +1 -1
- package/dist/gateways/query.d.ts.map +1 -1
- package/dist/gateways/query.js +4 -1
- package/dist/gateways/query.js.map +1 -1
- package/dist/index.js +31 -8
- package/dist/index.js.map +1 -1
- package/dist/lib/executor.d.ts +12 -0
- package/dist/lib/executor.d.ts.map +1 -1
- package/dist/lib/executor.js +16 -0
- package/dist/lib/executor.js.map +1 -1
- package/dist/lib/mode-detector.d.ts +71 -0
- package/dist/lib/mode-detector.d.ts.map +1 -0
- package/dist/lib/mode-detector.js +184 -0
- package/dist/lib/mode-detector.js.map +1 -0
- package/dist/lib/router.d.ts +2 -1
- package/dist/lib/router.d.ts.map +1 -1
- package/dist/lib/router.js +7 -5
- package/dist/lib/router.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.js +1 -1
- package/package.json +8 -3
- package/schemas/requests/issues/create.schema.json +37 -0
- package/schemas/requests/issues/diagnostics.schema.json +8 -0
- package/schemas/responses/issues/create.schema.json +49 -0
- package/schemas/responses/issues/diagnostics.schema.json +45 -0
- package/server.json +2 -2
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task Engine
|
|
3
|
+
*
|
|
4
|
+
* Native TypeScript implementation of core task CRUD operations.
|
|
5
|
+
* Reads/writes .cleo/todo.json directly without CLI subprocess.
|
|
6
|
+
*
|
|
7
|
+
* Supports: show, get, list, find, exists, create/add, update, complete, delete, archive
|
|
8
|
+
*/
|
|
9
|
+
import { readJsonFile, writeJsonFileAtomic, withFileLock, withMultiLock, getDataPath } from './store.js';
|
|
10
|
+
import { validateNewTask, validateTitleDescription, validateStatusTransition, hasErrors, } from './validation-rules.js';
|
|
11
|
+
import { generateNextIdFromSet, collectAllIds } from './id-generator.js';
|
|
12
|
+
/**
|
|
13
|
+
* Load the todo.json file
|
|
14
|
+
*/
|
|
15
|
+
function loadTodoFile(projectRoot) {
|
|
16
|
+
const todoPath = getDataPath(projectRoot, 'todo.json');
|
|
17
|
+
return readJsonFile(todoPath);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Compute SHA-256 truncated checksum for _meta
|
|
21
|
+
*/
|
|
22
|
+
function computeChecksum(tasks) {
|
|
23
|
+
const { createHash } = require('crypto');
|
|
24
|
+
const content = JSON.stringify(tasks);
|
|
25
|
+
return createHash('sha256').update(content).digest('hex').substring(0, 16);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Save todo.json with updated metadata
|
|
29
|
+
*/
|
|
30
|
+
function saveTodoFile(projectRoot, data) {
|
|
31
|
+
const todoPath = getDataPath(projectRoot, 'todo.json');
|
|
32
|
+
// Update metadata
|
|
33
|
+
data.lastUpdated = new Date().toISOString();
|
|
34
|
+
if (data._meta) {
|
|
35
|
+
data._meta.checksum = computeChecksum(data.tasks);
|
|
36
|
+
data._meta.generation = (data._meta.generation || 0) + 1;
|
|
37
|
+
}
|
|
38
|
+
writeJsonFileAtomic(todoPath, data);
|
|
39
|
+
}
|
|
40
|
+
// ===== Query Operations =====
|
|
41
|
+
/**
|
|
42
|
+
* Get a single task by ID
|
|
43
|
+
*/
|
|
44
|
+
export function taskShow(projectRoot, taskId) {
|
|
45
|
+
const todo = loadTodoFile(projectRoot);
|
|
46
|
+
if (!todo) {
|
|
47
|
+
return { success: false, error: { code: 'E_NOT_INITIALIZED', message: 'No todo.json found' } };
|
|
48
|
+
}
|
|
49
|
+
const task = todo.tasks.find((t) => t.id === taskId);
|
|
50
|
+
if (!task) {
|
|
51
|
+
return {
|
|
52
|
+
success: false,
|
|
53
|
+
error: {
|
|
54
|
+
code: 'E_NOT_FOUND',
|
|
55
|
+
message: `Task '${taskId}' not found`,
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
return { success: true, data: task };
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* List tasks with optional filters
|
|
63
|
+
*/
|
|
64
|
+
export function taskList(projectRoot, params) {
|
|
65
|
+
const todo = loadTodoFile(projectRoot);
|
|
66
|
+
if (!todo) {
|
|
67
|
+
return { success: false, error: { code: 'E_NOT_INITIALIZED', message: 'No todo.json found' } };
|
|
68
|
+
}
|
|
69
|
+
let tasks = todo.tasks;
|
|
70
|
+
if (params?.parent) {
|
|
71
|
+
tasks = tasks.filter((t) => t.parentId === params.parent);
|
|
72
|
+
}
|
|
73
|
+
if (params?.status) {
|
|
74
|
+
tasks = tasks.filter((t) => t.status === params.status);
|
|
75
|
+
}
|
|
76
|
+
if (params?.limit && params.limit > 0) {
|
|
77
|
+
tasks = tasks.slice(0, params.limit);
|
|
78
|
+
}
|
|
79
|
+
return { success: true, data: tasks };
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Fuzzy search tasks by title/description/ID
|
|
83
|
+
*/
|
|
84
|
+
export function taskFind(projectRoot, query, limit) {
|
|
85
|
+
const todo = loadTodoFile(projectRoot);
|
|
86
|
+
if (!todo) {
|
|
87
|
+
return { success: false, error: { code: 'E_NOT_INITIALIZED', message: 'No todo.json found' } };
|
|
88
|
+
}
|
|
89
|
+
const queryLower = query.toLowerCase();
|
|
90
|
+
// Score-based fuzzy matching
|
|
91
|
+
const scored = todo.tasks
|
|
92
|
+
.map((task) => {
|
|
93
|
+
let score = 0;
|
|
94
|
+
const idLower = task.id.toLowerCase();
|
|
95
|
+
const titleLower = task.title.toLowerCase();
|
|
96
|
+
const descLower = (task.description || '').toLowerCase();
|
|
97
|
+
// Exact ID match
|
|
98
|
+
if (idLower === queryLower)
|
|
99
|
+
score += 100;
|
|
100
|
+
// ID contains query
|
|
101
|
+
else if (idLower.includes(queryLower))
|
|
102
|
+
score += 50;
|
|
103
|
+
// Exact title match
|
|
104
|
+
if (titleLower === queryLower)
|
|
105
|
+
score += 80;
|
|
106
|
+
// Title starts with query
|
|
107
|
+
else if (titleLower.startsWith(queryLower))
|
|
108
|
+
score += 40;
|
|
109
|
+
// Title contains query
|
|
110
|
+
else if (titleLower.includes(queryLower))
|
|
111
|
+
score += 20;
|
|
112
|
+
// Description contains query
|
|
113
|
+
if (descLower.includes(queryLower))
|
|
114
|
+
score += 10;
|
|
115
|
+
// Label match
|
|
116
|
+
if (task.labels?.some((l) => l.toLowerCase().includes(queryLower))) {
|
|
117
|
+
score += 15;
|
|
118
|
+
}
|
|
119
|
+
return { task, score };
|
|
120
|
+
})
|
|
121
|
+
.filter((item) => item.score > 0)
|
|
122
|
+
.sort((a, b) => b.score - a.score);
|
|
123
|
+
let results = scored.map((item) => ({
|
|
124
|
+
id: item.task.id,
|
|
125
|
+
title: item.task.title,
|
|
126
|
+
status: item.task.status,
|
|
127
|
+
priority: item.task.priority,
|
|
128
|
+
parentId: item.task.parentId,
|
|
129
|
+
}));
|
|
130
|
+
if (limit && limit > 0) {
|
|
131
|
+
results = results.slice(0, limit);
|
|
132
|
+
}
|
|
133
|
+
return { success: true, data: results };
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Check if a task exists
|
|
137
|
+
*/
|
|
138
|
+
export function taskExists(projectRoot, taskId) {
|
|
139
|
+
const todo = loadTodoFile(projectRoot);
|
|
140
|
+
if (!todo) {
|
|
141
|
+
return { success: true, data: { exists: false, taskId } };
|
|
142
|
+
}
|
|
143
|
+
const exists = todo.tasks.some((t) => t.id === taskId);
|
|
144
|
+
return { success: true, data: { exists, taskId } };
|
|
145
|
+
}
|
|
146
|
+
// ===== Mutate Operations =====
|
|
147
|
+
/**
|
|
148
|
+
* Create a new task
|
|
149
|
+
*/
|
|
150
|
+
export async function taskCreate(projectRoot, params) {
|
|
151
|
+
const todoPath = getDataPath(projectRoot, 'todo.json');
|
|
152
|
+
return await withFileLock(todoPath, () => {
|
|
153
|
+
const current = loadTodoFile(projectRoot);
|
|
154
|
+
if (!current || !current.tasks) {
|
|
155
|
+
return {
|
|
156
|
+
success: false,
|
|
157
|
+
error: { code: 'E_NOT_INITIALIZED', message: 'No valid todo.json found' },
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
// Collect all IDs for uniqueness check
|
|
161
|
+
const allIds = new Set(current.tasks.map((t) => t.id));
|
|
162
|
+
// Also check archive
|
|
163
|
+
const archiveIds = collectAllIds(projectRoot);
|
|
164
|
+
for (const id of archiveIds)
|
|
165
|
+
allIds.add(id);
|
|
166
|
+
// Generate new ID
|
|
167
|
+
const newId = generateNextIdFromSet(allIds);
|
|
168
|
+
// Get existing descriptions for duplicate check
|
|
169
|
+
const existingDescriptions = current.tasks
|
|
170
|
+
.map((t) => t.description)
|
|
171
|
+
.filter(Boolean);
|
|
172
|
+
// Validate
|
|
173
|
+
const violations = validateNewTask({
|
|
174
|
+
id: newId,
|
|
175
|
+
title: params.title,
|
|
176
|
+
description: params.description,
|
|
177
|
+
parentId: params.parent || null,
|
|
178
|
+
type: params.type,
|
|
179
|
+
}, allIds, existingDescriptions, current.tasks.map((t) => ({
|
|
180
|
+
id: t.id,
|
|
181
|
+
parentId: t.parentId,
|
|
182
|
+
type: t.type,
|
|
183
|
+
})));
|
|
184
|
+
if (hasErrors(violations)) {
|
|
185
|
+
const errorMessages = violations
|
|
186
|
+
.filter((v) => v.severity === 'error')
|
|
187
|
+
.map((v) => v.message);
|
|
188
|
+
return {
|
|
189
|
+
success: false,
|
|
190
|
+
error: {
|
|
191
|
+
code: 'E_VALIDATION_FAILED',
|
|
192
|
+
message: errorMessages.join('; '),
|
|
193
|
+
details: violations,
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
const now = new Date().toISOString();
|
|
198
|
+
// Determine type from parent
|
|
199
|
+
let taskType = params.type || 'task';
|
|
200
|
+
if (params.parent) {
|
|
201
|
+
const parent = current.tasks.find((t) => t.id === params.parent);
|
|
202
|
+
if (parent) {
|
|
203
|
+
if (parent.type === 'epic')
|
|
204
|
+
taskType = 'task';
|
|
205
|
+
else if (parent.type === 'task')
|
|
206
|
+
taskType = 'subtask';
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
const newTask = {
|
|
210
|
+
id: newId,
|
|
211
|
+
title: params.title,
|
|
212
|
+
description: params.description,
|
|
213
|
+
status: 'pending',
|
|
214
|
+
priority: params.priority || 'medium',
|
|
215
|
+
type: taskType,
|
|
216
|
+
createdAt: now,
|
|
217
|
+
updatedAt: null,
|
|
218
|
+
parentId: params.parent || null,
|
|
219
|
+
depends: params.depends || [],
|
|
220
|
+
labels: params.labels || [],
|
|
221
|
+
acceptance: [],
|
|
222
|
+
notes: [],
|
|
223
|
+
files: [],
|
|
224
|
+
};
|
|
225
|
+
current.tasks.push(newTask);
|
|
226
|
+
// Update metadata
|
|
227
|
+
current.lastUpdated = now;
|
|
228
|
+
if (current._meta) {
|
|
229
|
+
current._meta.checksum = computeChecksum(current.tasks);
|
|
230
|
+
current._meta.generation = (current._meta.generation || 0) + 1;
|
|
231
|
+
}
|
|
232
|
+
// Write back (the lock handler will write this)
|
|
233
|
+
// But withLock expects us to return the full file data for writing
|
|
234
|
+
// We need to restructure: return the file for writing and wrap differently
|
|
235
|
+
// Actually, withLock writes the return value as the file content.
|
|
236
|
+
// We need to handle this differently - write the file ourselves and return the result.
|
|
237
|
+
writeJsonFileAtomic(todoPath, current);
|
|
238
|
+
return { success: true, data: newTask };
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Update a task
|
|
243
|
+
*/
|
|
244
|
+
export async function taskUpdate(projectRoot, taskId, updates) {
|
|
245
|
+
const todoPath = getDataPath(projectRoot, 'todo.json');
|
|
246
|
+
return await withFileLock(todoPath, () => {
|
|
247
|
+
const current = loadTodoFile(projectRoot);
|
|
248
|
+
if (!current || !current.tasks) {
|
|
249
|
+
return {
|
|
250
|
+
success: false,
|
|
251
|
+
error: { code: 'E_NOT_INITIALIZED', message: 'No valid todo.json found' },
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
const taskIndex = current.tasks.findIndex((t) => t.id === taskId);
|
|
255
|
+
if (taskIndex === -1) {
|
|
256
|
+
return {
|
|
257
|
+
success: false,
|
|
258
|
+
error: { code: 'E_NOT_FOUND', message: `Task '${taskId}' not found` },
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
const task = current.tasks[taskIndex];
|
|
262
|
+
const violations = [];
|
|
263
|
+
// Validate title/description if being updated
|
|
264
|
+
if (updates.title !== undefined || updates.description !== undefined) {
|
|
265
|
+
const newTitle = updates.title ?? task.title;
|
|
266
|
+
const newDesc = updates.description ?? task.description;
|
|
267
|
+
violations.push(...validateTitleDescription(newTitle, newDesc));
|
|
268
|
+
}
|
|
269
|
+
// Validate status transition
|
|
270
|
+
if (updates.status && updates.status !== task.status) {
|
|
271
|
+
violations.push(...validateStatusTransition(task.status, updates.status));
|
|
272
|
+
}
|
|
273
|
+
if (hasErrors(violations)) {
|
|
274
|
+
const errorMessages = violations
|
|
275
|
+
.filter((v) => v.severity === 'error')
|
|
276
|
+
.map((v) => v.message);
|
|
277
|
+
return {
|
|
278
|
+
success: false,
|
|
279
|
+
error: {
|
|
280
|
+
code: 'E_VALIDATION_FAILED',
|
|
281
|
+
message: errorMessages.join('; '),
|
|
282
|
+
details: violations,
|
|
283
|
+
},
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
const now = new Date().toISOString();
|
|
287
|
+
// Apply updates
|
|
288
|
+
if (updates.title !== undefined)
|
|
289
|
+
task.title = updates.title;
|
|
290
|
+
if (updates.description !== undefined)
|
|
291
|
+
task.description = updates.description;
|
|
292
|
+
if (updates.priority !== undefined)
|
|
293
|
+
task.priority = updates.priority;
|
|
294
|
+
if (updates.labels !== undefined)
|
|
295
|
+
task.labels = updates.labels;
|
|
296
|
+
if (updates.depends !== undefined)
|
|
297
|
+
task.depends = updates.depends;
|
|
298
|
+
if (updates.acceptance !== undefined)
|
|
299
|
+
task.acceptance = updates.acceptance;
|
|
300
|
+
if (updates.status !== undefined) {
|
|
301
|
+
task.status = updates.status;
|
|
302
|
+
if (updates.status === 'done') {
|
|
303
|
+
task.completedAt = now;
|
|
304
|
+
}
|
|
305
|
+
if (updates.status === 'cancelled') {
|
|
306
|
+
task.cancelledAt = now;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
// Append note if provided
|
|
310
|
+
if (updates.notes) {
|
|
311
|
+
if (!task.notes)
|
|
312
|
+
task.notes = [];
|
|
313
|
+
task.notes.push(`[${now}] ${updates.notes}`);
|
|
314
|
+
}
|
|
315
|
+
task.updatedAt = now;
|
|
316
|
+
current.tasks[taskIndex] = task;
|
|
317
|
+
// Save
|
|
318
|
+
saveTodoFile(projectRoot, current);
|
|
319
|
+
return { success: true, data: task };
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Complete a task (set status to done)
|
|
324
|
+
*/
|
|
325
|
+
export async function taskComplete(projectRoot, taskId, notes) {
|
|
326
|
+
return taskUpdate(projectRoot, taskId, {
|
|
327
|
+
status: 'done',
|
|
328
|
+
notes: notes || undefined,
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Delete a task
|
|
333
|
+
*/
|
|
334
|
+
export async function taskDelete(projectRoot, taskId, force) {
|
|
335
|
+
const todoPath = getDataPath(projectRoot, 'todo.json');
|
|
336
|
+
return await withFileLock(todoPath, () => {
|
|
337
|
+
const current = loadTodoFile(projectRoot);
|
|
338
|
+
if (!current || !current.tasks) {
|
|
339
|
+
return {
|
|
340
|
+
success: false,
|
|
341
|
+
error: { code: 'E_NOT_INITIALIZED', message: 'No valid todo.json found' },
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
const taskIndex = current.tasks.findIndex((t) => t.id === taskId);
|
|
345
|
+
if (taskIndex === -1) {
|
|
346
|
+
return {
|
|
347
|
+
success: false,
|
|
348
|
+
error: { code: 'E_NOT_FOUND', message: `Task '${taskId}' not found` },
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
const task = current.tasks[taskIndex];
|
|
352
|
+
// Check for children
|
|
353
|
+
if (!force) {
|
|
354
|
+
const children = current.tasks.filter((t) => t.parentId === taskId);
|
|
355
|
+
if (children.length > 0) {
|
|
356
|
+
return {
|
|
357
|
+
success: false,
|
|
358
|
+
error: {
|
|
359
|
+
code: 'E_HAS_CHILDREN',
|
|
360
|
+
message: `Task '${taskId}' has ${children.length} children. Use force=true to delete anyway.`,
|
|
361
|
+
},
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
// Remove task (and optionally children if force)
|
|
366
|
+
if (force) {
|
|
367
|
+
const toRemove = new Set([taskId]);
|
|
368
|
+
// Collect all descendants
|
|
369
|
+
const collectDescendants = (parentId) => {
|
|
370
|
+
for (const t of current.tasks) {
|
|
371
|
+
if (t.parentId === parentId && !toRemove.has(t.id)) {
|
|
372
|
+
toRemove.add(t.id);
|
|
373
|
+
collectDescendants(t.id);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
};
|
|
377
|
+
collectDescendants(taskId);
|
|
378
|
+
current.tasks = current.tasks.filter((t) => !toRemove.has(t.id));
|
|
379
|
+
}
|
|
380
|
+
else {
|
|
381
|
+
current.tasks.splice(taskIndex, 1);
|
|
382
|
+
}
|
|
383
|
+
saveTodoFile(projectRoot, current);
|
|
384
|
+
return { success: true, data: { deleted: true, taskId } };
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Archive completed tasks.
|
|
389
|
+
* Moves done/cancelled tasks from todo.json to todo-archive.json.
|
|
390
|
+
*/
|
|
391
|
+
export async function taskArchive(projectRoot, taskId, before) {
|
|
392
|
+
const todoPath = getDataPath(projectRoot, 'todo.json');
|
|
393
|
+
const archivePath = getDataPath(projectRoot, 'todo-archive.json');
|
|
394
|
+
return await withMultiLock([todoPath, archivePath], () => {
|
|
395
|
+
const todo = readJsonFile(todoPath);
|
|
396
|
+
if (!todo || !todo.tasks) {
|
|
397
|
+
return {
|
|
398
|
+
success: false,
|
|
399
|
+
error: { code: 'E_NOT_INITIALIZED', message: 'No valid todo.json found' },
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
// Determine which tasks to archive
|
|
403
|
+
let tasksToArchive;
|
|
404
|
+
if (taskId) {
|
|
405
|
+
const task = todo.tasks.find((t) => t.id === taskId);
|
|
406
|
+
if (!task) {
|
|
407
|
+
return {
|
|
408
|
+
success: false,
|
|
409
|
+
error: { code: 'E_NOT_FOUND', message: `Task '${taskId}' not found` },
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
if (task.status !== 'done' && task.status !== 'cancelled') {
|
|
413
|
+
return {
|
|
414
|
+
success: false,
|
|
415
|
+
error: {
|
|
416
|
+
code: 'E_INVALID_STATUS',
|
|
417
|
+
message: `Task '${taskId}' has status '${task.status}', must be done or cancelled to archive`,
|
|
418
|
+
},
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
tasksToArchive = [task];
|
|
422
|
+
}
|
|
423
|
+
else {
|
|
424
|
+
// Archive all completed tasks
|
|
425
|
+
tasksToArchive = todo.tasks.filter((t) => {
|
|
426
|
+
if (t.status !== 'done' && t.status !== 'cancelled')
|
|
427
|
+
return false;
|
|
428
|
+
if (before) {
|
|
429
|
+
const completedDate = t.completedAt || t.cancelledAt;
|
|
430
|
+
if (completedDate && completedDate > before)
|
|
431
|
+
return false;
|
|
432
|
+
}
|
|
433
|
+
return true;
|
|
434
|
+
});
|
|
435
|
+
}
|
|
436
|
+
if (tasksToArchive.length === 0) {
|
|
437
|
+
return { success: true, data: { archived: 0, taskIds: [] } };
|
|
438
|
+
}
|
|
439
|
+
// Load or create archive
|
|
440
|
+
let archive = readJsonFile(archivePath);
|
|
441
|
+
if (!archive) {
|
|
442
|
+
archive = {
|
|
443
|
+
_meta: {
|
|
444
|
+
schemaVersion: '2.4.0',
|
|
445
|
+
totalArchived: 0,
|
|
446
|
+
lastArchived: null,
|
|
447
|
+
},
|
|
448
|
+
archivedTasks: [],
|
|
449
|
+
};
|
|
450
|
+
}
|
|
451
|
+
const now = new Date().toISOString();
|
|
452
|
+
const archivedIds = [];
|
|
453
|
+
// Move tasks to archive
|
|
454
|
+
for (const task of tasksToArchive) {
|
|
455
|
+
const archivedTask = {
|
|
456
|
+
...task,
|
|
457
|
+
_archive: {
|
|
458
|
+
archivedAt: now,
|
|
459
|
+
reason: taskId ? 'manual' : 'auto',
|
|
460
|
+
},
|
|
461
|
+
};
|
|
462
|
+
archive.archivedTasks.push(archivedTask);
|
|
463
|
+
archivedIds.push(task.id);
|
|
464
|
+
}
|
|
465
|
+
// Remove from todo
|
|
466
|
+
todo.tasks = todo.tasks.filter((t) => !archivedIds.includes(t.id));
|
|
467
|
+
// Update archive metadata
|
|
468
|
+
if (archive._meta) {
|
|
469
|
+
archive._meta.totalArchived = archive.archivedTasks.length;
|
|
470
|
+
archive._meta.lastArchived = now;
|
|
471
|
+
}
|
|
472
|
+
// Save both files
|
|
473
|
+
writeJsonFileAtomic(todoPath, todo);
|
|
474
|
+
writeJsonFileAtomic(archivePath, archive);
|
|
475
|
+
return {
|
|
476
|
+
success: true,
|
|
477
|
+
data: { archived: archivedIds.length, taskIds: archivedIds },
|
|
478
|
+
};
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
//# sourceMappingURL=task-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-engine.js","sourceRoot":"","sources":["../../src/engine/task-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anti-Hallucination Validation Rules
|
|
3
|
+
*
|
|
4
|
+
* Implements CLEO's anti-hallucination requirements:
|
|
5
|
+
* - Title and description both required and different
|
|
6
|
+
* - No future timestamps
|
|
7
|
+
* - No duplicate task descriptions
|
|
8
|
+
* - Unique IDs across todo.json AND todo-archive.json
|
|
9
|
+
* - Valid status transitions
|
|
10
|
+
* - Hierarchy constraints (max depth 3, max 7 siblings)
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Validation error from anti-hallucination checks
|
|
14
|
+
*/
|
|
15
|
+
export interface RuleViolation {
|
|
16
|
+
rule: string;
|
|
17
|
+
field: string;
|
|
18
|
+
message: string;
|
|
19
|
+
severity: 'error' | 'warning';
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Task-like object for validation (doesn't need full Task type)
|
|
23
|
+
*/
|
|
24
|
+
interface TaskLike {
|
|
25
|
+
id?: string;
|
|
26
|
+
title?: string;
|
|
27
|
+
description?: string;
|
|
28
|
+
status?: string;
|
|
29
|
+
createdAt?: string;
|
|
30
|
+
updatedAt?: string;
|
|
31
|
+
completedAt?: string;
|
|
32
|
+
cancelledAt?: string;
|
|
33
|
+
parentId?: string | null;
|
|
34
|
+
type?: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Validate that title and description are both present and different.
|
|
38
|
+
* This is a critical anti-hallucination check.
|
|
39
|
+
*/
|
|
40
|
+
export declare function validateTitleDescription(title?: string, description?: string): RuleViolation[];
|
|
41
|
+
/**
|
|
42
|
+
* Validate that timestamps are not in the future
|
|
43
|
+
*/
|
|
44
|
+
export declare function validateTimestamps(task: TaskLike): RuleViolation[];
|
|
45
|
+
/**
|
|
46
|
+
* Validate ID uniqueness across all tasks (todo + archive)
|
|
47
|
+
*/
|
|
48
|
+
export declare function validateIdUniqueness(taskId: string, existingIds: Set<string>): RuleViolation[];
|
|
49
|
+
/**
|
|
50
|
+
* Validate no duplicate task descriptions
|
|
51
|
+
*/
|
|
52
|
+
export declare function validateNoDuplicateDescription(description: string, existingDescriptions: string[], excludeTaskId?: string): RuleViolation[];
|
|
53
|
+
/**
|
|
54
|
+
* Validate hierarchy constraints
|
|
55
|
+
*/
|
|
56
|
+
export declare function validateHierarchy(parentId: string | null | undefined, tasks: Array<{
|
|
57
|
+
id: string;
|
|
58
|
+
parentId?: string | null;
|
|
59
|
+
type?: string;
|
|
60
|
+
}>, taskType?: string): RuleViolation[];
|
|
61
|
+
/**
|
|
62
|
+
* Validate status transition
|
|
63
|
+
*/
|
|
64
|
+
export declare function validateStatusTransition(currentStatus: string, newStatus: string): RuleViolation[];
|
|
65
|
+
/**
|
|
66
|
+
* Run all validation rules on a task being created
|
|
67
|
+
*/
|
|
68
|
+
export declare function validateNewTask(task: TaskLike, existingIds: Set<string>, existingDescriptions: string[], existingTasks: Array<{
|
|
69
|
+
id: string;
|
|
70
|
+
parentId?: string | null;
|
|
71
|
+
type?: string;
|
|
72
|
+
}>): RuleViolation[];
|
|
73
|
+
/**
|
|
74
|
+
* Check if violations contain any errors (not just warnings)
|
|
75
|
+
*/
|
|
76
|
+
export declare function hasErrors(violations: RuleViolation[]): boolean;
|
|
77
|
+
export {};
|
|
78
|
+
//# sourceMappingURL=validation-rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation-rules.d.ts","sourceRoot":"","sources":["../../src/engine/validation-rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AAED;;GAEG;AACH,UAAU,QAAQ;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,CAAC,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,GACnB,aAAa,EAAE,CAmCjB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,GAAG,aAAa,EAAE,CAmClE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,GACvB,aAAa,EAAE,CAUjB;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,WAAW,EAAE,MAAM,EACnB,oBAAoB,EAAE,MAAM,EAAE,EAC9B,aAAa,CAAC,EAAE,MAAM,GACrB,aAAa,EAAE,CAejB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACnC,KAAK,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EACrE,QAAQ,CAAC,EAAE,MAAM,GAChB,aAAa,EAAE,CAmDjB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,GAChB,aAAa,EAAE,CA6BjB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,QAAQ,EACd,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,EACxB,oBAAoB,EAAE,MAAM,EAAE,EAC9B,aAAa,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAC5E,aAAa,EAAE,CAuBjB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,OAAO,CAE9D"}
|