@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,284 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON File Store
|
|
3
|
+
*
|
|
4
|
+
* Handles reading and writing CLEO JSON files with:
|
|
5
|
+
* - Atomic writes (temp file -> validate -> backup -> rename)
|
|
6
|
+
* - Cross-process file locking (proper-lockfile)
|
|
7
|
+
* - Numbered backup rotation matching Tier 1 bash behavior
|
|
8
|
+
* - Lock ordering to prevent deadlocks (todo.json before archive)
|
|
9
|
+
*/
|
|
10
|
+
import { readFileSync, writeFileSync, renameSync, mkdirSync, existsSync, readdirSync, unlinkSync } from 'fs';
|
|
11
|
+
import { join, dirname, basename } from 'path';
|
|
12
|
+
import { randomBytes } from 'crypto';
|
|
13
|
+
import * as lockfile from 'proper-lockfile';
|
|
14
|
+
/**
|
|
15
|
+
* Default lock options matching bash flock behavior
|
|
16
|
+
*/
|
|
17
|
+
const LOCK_OPTIONS = {
|
|
18
|
+
retries: {
|
|
19
|
+
retries: 5,
|
|
20
|
+
factor: 2,
|
|
21
|
+
minTimeout: 100,
|
|
22
|
+
maxTimeout: 5000,
|
|
23
|
+
},
|
|
24
|
+
stale: 30000, // 30s stale lock timeout
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Maximum number of operational backups to keep (Tier 1)
|
|
28
|
+
*/
|
|
29
|
+
const MAX_BACKUPS = 10;
|
|
30
|
+
/**
|
|
31
|
+
* Lock ordering to prevent deadlocks.
|
|
32
|
+
* Always acquire locks in this order.
|
|
33
|
+
*/
|
|
34
|
+
const LOCK_ORDER = {
|
|
35
|
+
'todo.json': 1,
|
|
36
|
+
'sessions.json': 2,
|
|
37
|
+
'todo-archive.json': 3,
|
|
38
|
+
'todo-log.json': 4,
|
|
39
|
+
'config.json': 5,
|
|
40
|
+
};
|
|
41
|
+
function getLockPriority(filePath) {
|
|
42
|
+
const name = basename(filePath);
|
|
43
|
+
return LOCK_ORDER[name] ?? 99;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Read a JSON file, returning parsed content or null if not found
|
|
47
|
+
*/
|
|
48
|
+
export function readJsonFile(filePath) {
|
|
49
|
+
try {
|
|
50
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
51
|
+
return JSON.parse(content);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
if (error.code === 'ENOENT') {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Write a JSON file atomically with backup rotation.
|
|
62
|
+
*
|
|
63
|
+
* Pattern: write temp -> backup original -> rename temp to target
|
|
64
|
+
*
|
|
65
|
+
* @param filePath - Target file path
|
|
66
|
+
* @param data - Data to serialize as JSON
|
|
67
|
+
* @param indent - JSON indentation (default: 2 spaces)
|
|
68
|
+
*/
|
|
69
|
+
export function writeJsonFileAtomic(filePath, data, indent = 2) {
|
|
70
|
+
const dir = dirname(filePath);
|
|
71
|
+
const tempPath = join(dir, `.${basename(filePath)}.${randomBytes(6).toString('hex')}.tmp`);
|
|
72
|
+
// Serialize
|
|
73
|
+
const content = JSON.stringify(data, null, indent) + '\n';
|
|
74
|
+
// Write to temp file
|
|
75
|
+
writeFileSync(tempPath, content, 'utf-8');
|
|
76
|
+
try {
|
|
77
|
+
// Create backup of existing file (Tier 1 operational backup)
|
|
78
|
+
if (existsSync(filePath)) {
|
|
79
|
+
rotateBackup(filePath);
|
|
80
|
+
}
|
|
81
|
+
// Atomic rename
|
|
82
|
+
renameSync(tempPath, filePath);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
// Clean up temp file on failure
|
|
86
|
+
try {
|
|
87
|
+
unlinkSync(tempPath);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
// Ignore cleanup errors
|
|
91
|
+
}
|
|
92
|
+
throw error;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Read and write a JSON file with exclusive locking.
|
|
97
|
+
*
|
|
98
|
+
* Acquires a cross-process lock, reads current state, applies the
|
|
99
|
+
* transform function, validates, and writes back atomically.
|
|
100
|
+
*
|
|
101
|
+
* @param filePath - File to lock and modify
|
|
102
|
+
* @param transform - Function that receives current data and returns new data
|
|
103
|
+
* @returns The transformed data
|
|
104
|
+
*/
|
|
105
|
+
export async function withLock(filePath, transform) {
|
|
106
|
+
const dir = dirname(filePath);
|
|
107
|
+
if (!existsSync(dir)) {
|
|
108
|
+
mkdirSync(dir, { recursive: true });
|
|
109
|
+
}
|
|
110
|
+
// Ensure file exists for locking (proper-lockfile needs the file to exist)
|
|
111
|
+
if (!existsSync(filePath)) {
|
|
112
|
+
writeFileSync(filePath, '', 'utf-8');
|
|
113
|
+
}
|
|
114
|
+
let release;
|
|
115
|
+
try {
|
|
116
|
+
release = await lockfile.lock(filePath, LOCK_OPTIONS);
|
|
117
|
+
const current = readJsonFile(filePath);
|
|
118
|
+
const updated = transform(current);
|
|
119
|
+
writeJsonFileAtomic(filePath, updated);
|
|
120
|
+
return updated;
|
|
121
|
+
}
|
|
122
|
+
finally {
|
|
123
|
+
if (release) {
|
|
124
|
+
await release();
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Acquire a file lock and execute an operation.
|
|
130
|
+
* Unlike withLock, this doesn't read/write the file - caller manages I/O.
|
|
131
|
+
* The return type R is independent of the file content type.
|
|
132
|
+
*/
|
|
133
|
+
export async function withFileLock(filePath, operation) {
|
|
134
|
+
const dir = dirname(filePath);
|
|
135
|
+
if (!existsSync(dir)) {
|
|
136
|
+
mkdirSync(dir, { recursive: true });
|
|
137
|
+
}
|
|
138
|
+
if (!existsSync(filePath)) {
|
|
139
|
+
writeFileSync(filePath, '', 'utf-8');
|
|
140
|
+
}
|
|
141
|
+
let release;
|
|
142
|
+
try {
|
|
143
|
+
release = await lockfile.lock(filePath, LOCK_OPTIONS);
|
|
144
|
+
return await operation();
|
|
145
|
+
}
|
|
146
|
+
finally {
|
|
147
|
+
if (release) {
|
|
148
|
+
await release();
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Acquire locks on multiple files in correct order.
|
|
154
|
+
* Used for operations that need to modify multiple files atomically
|
|
155
|
+
* (e.g., moving a task from todo.json to archive).
|
|
156
|
+
*
|
|
157
|
+
* @param filePaths - Files to lock
|
|
158
|
+
* @param operation - Function to execute while locks are held
|
|
159
|
+
*/
|
|
160
|
+
export async function withMultiLock(filePaths, operation) {
|
|
161
|
+
// Sort by lock priority to prevent deadlocks
|
|
162
|
+
const sorted = [...filePaths].sort((a, b) => getLockPriority(a) - getLockPriority(b));
|
|
163
|
+
const releases = [];
|
|
164
|
+
try {
|
|
165
|
+
// Acquire locks in order
|
|
166
|
+
for (const fp of sorted) {
|
|
167
|
+
if (!existsSync(dirname(fp))) {
|
|
168
|
+
mkdirSync(dirname(fp), { recursive: true });
|
|
169
|
+
}
|
|
170
|
+
if (!existsSync(fp)) {
|
|
171
|
+
writeFileSync(fp, '', 'utf-8');
|
|
172
|
+
}
|
|
173
|
+
const release = await lockfile.lock(fp, LOCK_OPTIONS);
|
|
174
|
+
releases.push(release);
|
|
175
|
+
}
|
|
176
|
+
return await operation();
|
|
177
|
+
}
|
|
178
|
+
finally {
|
|
179
|
+
// Release in reverse order
|
|
180
|
+
for (const release of releases.reverse()) {
|
|
181
|
+
try {
|
|
182
|
+
await release();
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
// Ignore release errors
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Create a numbered backup of a file (Tier 1 operational backup).
|
|
192
|
+
*
|
|
193
|
+
* Maintains up to MAX_BACKUPS copies:
|
|
194
|
+
* .backups/todo.json.1 (newest)
|
|
195
|
+
* .backups/todo.json.2
|
|
196
|
+
* ...
|
|
197
|
+
* .backups/todo.json.10 (oldest, deleted when new backup arrives)
|
|
198
|
+
*/
|
|
199
|
+
function rotateBackup(filePath) {
|
|
200
|
+
const dir = dirname(filePath);
|
|
201
|
+
const name = basename(filePath);
|
|
202
|
+
const backupDir = join(dir, '.backups');
|
|
203
|
+
if (!existsSync(backupDir)) {
|
|
204
|
+
mkdirSync(backupDir, { recursive: true });
|
|
205
|
+
}
|
|
206
|
+
// Rotate existing backups (shift numbers up)
|
|
207
|
+
for (let i = MAX_BACKUPS; i >= 1; i--) {
|
|
208
|
+
const current = join(backupDir, `${name}.${i}`);
|
|
209
|
+
if (i === MAX_BACKUPS) {
|
|
210
|
+
// Delete oldest
|
|
211
|
+
try {
|
|
212
|
+
unlinkSync(current);
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
// May not exist
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
// Shift to next number
|
|
220
|
+
const next = join(backupDir, `${name}.${i + 1}`);
|
|
221
|
+
try {
|
|
222
|
+
if (existsSync(current)) {
|
|
223
|
+
renameSync(current, next);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
// Ignore rename errors
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
// Copy current file to .1
|
|
232
|
+
try {
|
|
233
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
234
|
+
writeFileSync(join(backupDir, `${name}.1`), content, 'utf-8');
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
// Non-fatal - backup failure shouldn't block write
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Check if a CLEO project directory exists at the given path
|
|
242
|
+
*/
|
|
243
|
+
export function isProjectInitialized(projectRoot) {
|
|
244
|
+
const cleoDir = join(projectRoot, '.cleo');
|
|
245
|
+
return existsSync(cleoDir) && existsSync(join(cleoDir, 'todo.json'));
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Resolve the project root directory.
|
|
249
|
+
* Checks CLEO_ROOT env, then falls back to cwd.
|
|
250
|
+
*/
|
|
251
|
+
export function resolveProjectRoot() {
|
|
252
|
+
return process.env.CLEO_ROOT || process.cwd();
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Get the path to a CLEO data file
|
|
256
|
+
*/
|
|
257
|
+
export function getDataPath(projectRoot, filename) {
|
|
258
|
+
return join(projectRoot, '.cleo', filename);
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* List backup files for a given data file
|
|
262
|
+
*/
|
|
263
|
+
export function listBackups(filePath) {
|
|
264
|
+
const dir = dirname(filePath);
|
|
265
|
+
const name = basename(filePath);
|
|
266
|
+
const backupDir = join(dir, '.backups');
|
|
267
|
+
if (!existsSync(backupDir)) {
|
|
268
|
+
return [];
|
|
269
|
+
}
|
|
270
|
+
try {
|
|
271
|
+
return readdirSync(backupDir)
|
|
272
|
+
.filter((f) => f.startsWith(`${name}.`) && /\.\d+$/.test(f))
|
|
273
|
+
.sort((a, b) => {
|
|
274
|
+
const numA = parseInt(a.split('.').pop(), 10);
|
|
275
|
+
const numB = parseInt(b.split('.').pop(), 10);
|
|
276
|
+
return numA - numB;
|
|
277
|
+
})
|
|
278
|
+
.map((f) => join(backupDir, f));
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
return [];
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/engine/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
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
|
+
/**
|
|
10
|
+
* Task object as stored in todo.json
|
|
11
|
+
*/
|
|
12
|
+
export interface TaskRecord {
|
|
13
|
+
id: string;
|
|
14
|
+
title: string;
|
|
15
|
+
description: string;
|
|
16
|
+
status: string;
|
|
17
|
+
priority: string;
|
|
18
|
+
type?: string;
|
|
19
|
+
phase?: string;
|
|
20
|
+
createdAt: string;
|
|
21
|
+
updatedAt: string | null;
|
|
22
|
+
completedAt?: string | null;
|
|
23
|
+
cancelledAt?: string | null;
|
|
24
|
+
parentId?: string | null;
|
|
25
|
+
position?: number | null;
|
|
26
|
+
positionVersion?: number;
|
|
27
|
+
depends?: string[];
|
|
28
|
+
relates?: Array<{
|
|
29
|
+
taskId: string;
|
|
30
|
+
type: string;
|
|
31
|
+
reason?: string;
|
|
32
|
+
}>;
|
|
33
|
+
files?: string[];
|
|
34
|
+
acceptance?: string[];
|
|
35
|
+
notes?: string[];
|
|
36
|
+
labels?: string[];
|
|
37
|
+
size?: string | null;
|
|
38
|
+
epicLifecycle?: string | null;
|
|
39
|
+
noAutoComplete?: boolean | null;
|
|
40
|
+
verification?: Record<string, unknown> | null;
|
|
41
|
+
origin?: string | null;
|
|
42
|
+
createdBy?: string | null;
|
|
43
|
+
validatedBy?: string | null;
|
|
44
|
+
testedBy?: string | null;
|
|
45
|
+
lifecycleState?: string | null;
|
|
46
|
+
validationHistory?: Array<Record<string, unknown>>;
|
|
47
|
+
blockedBy?: string[];
|
|
48
|
+
cancellationReason?: string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Minimal task representation for find results
|
|
52
|
+
*/
|
|
53
|
+
export interface MinimalTaskRecord {
|
|
54
|
+
id: string;
|
|
55
|
+
title: string;
|
|
56
|
+
status: string;
|
|
57
|
+
priority: string;
|
|
58
|
+
parentId?: string | null;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Engine result wrapper
|
|
62
|
+
*/
|
|
63
|
+
export interface EngineResult<T = unknown> {
|
|
64
|
+
success: boolean;
|
|
65
|
+
data?: T;
|
|
66
|
+
error?: {
|
|
67
|
+
code: string;
|
|
68
|
+
message: string;
|
|
69
|
+
details?: unknown;
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Get a single task by ID
|
|
74
|
+
*/
|
|
75
|
+
export declare function taskShow(projectRoot: string, taskId: string): EngineResult<TaskRecord>;
|
|
76
|
+
/**
|
|
77
|
+
* List tasks with optional filters
|
|
78
|
+
*/
|
|
79
|
+
export declare function taskList(projectRoot: string, params?: {
|
|
80
|
+
parent?: string;
|
|
81
|
+
status?: string;
|
|
82
|
+
limit?: number;
|
|
83
|
+
}): EngineResult<TaskRecord[]>;
|
|
84
|
+
/**
|
|
85
|
+
* Fuzzy search tasks by title/description/ID
|
|
86
|
+
*/
|
|
87
|
+
export declare function taskFind(projectRoot: string, query: string, limit?: number): EngineResult<MinimalTaskRecord[]>;
|
|
88
|
+
/**
|
|
89
|
+
* Check if a task exists
|
|
90
|
+
*/
|
|
91
|
+
export declare function taskExists(projectRoot: string, taskId: string): EngineResult<{
|
|
92
|
+
exists: boolean;
|
|
93
|
+
taskId: string;
|
|
94
|
+
}>;
|
|
95
|
+
/**
|
|
96
|
+
* Create a new task
|
|
97
|
+
*/
|
|
98
|
+
export declare function taskCreate(projectRoot: string, params: {
|
|
99
|
+
title: string;
|
|
100
|
+
description: string;
|
|
101
|
+
parent?: string;
|
|
102
|
+
depends?: string[];
|
|
103
|
+
priority?: string;
|
|
104
|
+
labels?: string[];
|
|
105
|
+
type?: string;
|
|
106
|
+
}): Promise<EngineResult<TaskRecord>>;
|
|
107
|
+
/**
|
|
108
|
+
* Update a task
|
|
109
|
+
*/
|
|
110
|
+
export declare function taskUpdate(projectRoot: string, taskId: string, updates: {
|
|
111
|
+
title?: string;
|
|
112
|
+
description?: string;
|
|
113
|
+
status?: string;
|
|
114
|
+
priority?: string;
|
|
115
|
+
notes?: string;
|
|
116
|
+
labels?: string[];
|
|
117
|
+
depends?: string[];
|
|
118
|
+
acceptance?: string[];
|
|
119
|
+
}): Promise<EngineResult<TaskRecord>>;
|
|
120
|
+
/**
|
|
121
|
+
* Complete a task (set status to done)
|
|
122
|
+
*/
|
|
123
|
+
export declare function taskComplete(projectRoot: string, taskId: string, notes?: string): Promise<EngineResult<TaskRecord>>;
|
|
124
|
+
/**
|
|
125
|
+
* Delete a task
|
|
126
|
+
*/
|
|
127
|
+
export declare function taskDelete(projectRoot: string, taskId: string, force?: boolean): Promise<EngineResult<{
|
|
128
|
+
deleted: boolean;
|
|
129
|
+
taskId: string;
|
|
130
|
+
}>>;
|
|
131
|
+
/**
|
|
132
|
+
* Archive completed tasks.
|
|
133
|
+
* Moves done/cancelled tasks from todo.json to todo-archive.json.
|
|
134
|
+
*/
|
|
135
|
+
export declare function taskArchive(projectRoot: string, taskId?: string, before?: string): Promise<EngineResult<{
|
|
136
|
+
archived: number;
|
|
137
|
+
taskIds: string[];
|
|
138
|
+
}>>;
|
|
139
|
+
//# sourceMappingURL=task-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-engine.d.ts","sourceRoot":"","sources":["../../src/engine/task-engine.ts"],"names":[],"mappings":"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"}
|