@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.
Files changed (112) hide show
  1. package/README.md +2 -2
  2. package/dist/domains/index.d.ts +1 -0
  3. package/dist/domains/index.d.ts.map +1 -1
  4. package/dist/domains/index.js +1 -0
  5. package/dist/domains/index.js.map +1 -1
  6. package/dist/domains/issues.d.ts +44 -0
  7. package/dist/domains/issues.d.ts.map +1 -0
  8. package/dist/domains/issues.js +182 -0
  9. package/dist/domains/issues.js.map +1 -0
  10. package/dist/domains/lifecycle.d.ts.map +1 -1
  11. package/dist/domains/lifecycle.js +8 -0
  12. package/dist/domains/lifecycle.js.map +1 -1
  13. package/dist/domains/orchestrate.js +6 -6
  14. package/dist/domains/orchestrate.js.map +1 -1
  15. package/dist/domains/release.js +4 -4
  16. package/dist/domains/release.js.map +1 -1
  17. package/dist/domains/research.d.ts.map +1 -1
  18. package/dist/domains/research.js +8 -0
  19. package/dist/domains/research.js.map +1 -1
  20. package/dist/domains/session.d.ts +20 -1
  21. package/dist/domains/session.d.ts.map +1 -1
  22. package/dist/domains/session.js +133 -7
  23. package/dist/domains/session.js.map +1 -1
  24. package/dist/domains/system.d.ts +20 -1
  25. package/dist/domains/system.d.ts.map +1 -1
  26. package/dist/domains/system.js +211 -7
  27. package/dist/domains/system.js.map +1 -1
  28. package/dist/domains/tasks.d.ts +20 -1
  29. package/dist/domains/tasks.d.ts.map +1 -1
  30. package/dist/domains/tasks.js +165 -1
  31. package/dist/domains/tasks.js.map +1 -1
  32. package/dist/domains/validate.d.ts.map +1 -1
  33. package/dist/domains/validate.js +8 -0
  34. package/dist/domains/validate.js.map +1 -1
  35. package/dist/engine/caamp-adapter.d.ts +93 -0
  36. package/dist/engine/caamp-adapter.d.ts.map +1 -0
  37. package/dist/engine/caamp-adapter.js +358 -0
  38. package/dist/engine/caamp-adapter.js.map +1 -0
  39. package/dist/engine/caamp-verify.d.ts +2 -0
  40. package/dist/engine/caamp-verify.d.ts.map +1 -0
  41. package/dist/engine/caamp-verify.js +15 -0
  42. package/dist/engine/caamp-verify.js.map +1 -0
  43. package/dist/engine/capability-matrix.d.ts +67 -0
  44. package/dist/engine/capability-matrix.d.ts.map +1 -0
  45. package/dist/engine/capability-matrix.js +227 -0
  46. package/dist/engine/capability-matrix.js.map +1 -0
  47. package/dist/engine/config-engine.d.ts +29 -0
  48. package/dist/engine/config-engine.d.ts.map +1 -0
  49. package/dist/engine/config-engine.js +110 -0
  50. package/dist/engine/config-engine.js.map +1 -0
  51. package/dist/engine/id-generator.d.ts +34 -0
  52. package/dist/engine/id-generator.d.ts.map +1 -0
  53. package/dist/engine/id-generator.js +91 -0
  54. package/dist/engine/id-generator.js.map +1 -0
  55. package/dist/engine/index.d.ts +18 -0
  56. package/dist/engine/index.d.ts.map +1 -0
  57. package/dist/engine/index.js +28 -0
  58. package/dist/engine/index.js.map +1 -0
  59. package/dist/engine/init-engine.d.ts +52 -0
  60. package/dist/engine/init-engine.d.ts.map +1 -0
  61. package/dist/engine/init-engine.js +222 -0
  62. package/dist/engine/init-engine.js.map +1 -0
  63. package/dist/engine/schema-validator.d.ts +47 -0
  64. package/dist/engine/schema-validator.d.ts.map +1 -0
  65. package/dist/engine/schema-validator.js +219 -0
  66. package/dist/engine/schema-validator.js.map +1 -0
  67. package/dist/engine/session-engine.d.ts +139 -0
  68. package/dist/engine/session-engine.d.ts.map +1 -0
  69. package/dist/engine/session-engine.js +401 -0
  70. package/dist/engine/session-engine.js.map +1 -0
  71. package/dist/engine/store.d.ts +67 -0
  72. package/dist/engine/store.d.ts.map +1 -0
  73. package/dist/engine/store.js +284 -0
  74. package/dist/engine/store.js.map +1 -0
  75. package/dist/engine/task-engine.d.ts +139 -0
  76. package/dist/engine/task-engine.d.ts.map +1 -0
  77. package/dist/engine/task-engine.js +481 -0
  78. package/dist/engine/task-engine.js.map +1 -0
  79. package/dist/engine/validation-rules.d.ts +78 -0
  80. package/dist/engine/validation-rules.d.ts.map +1 -0
  81. package/dist/engine/validation-rules.js +218 -0
  82. package/dist/engine/validation-rules.js.map +1 -0
  83. package/dist/gateways/mutate.d.ts +1 -1
  84. package/dist/gateways/mutate.d.ts.map +1 -1
  85. package/dist/gateways/mutate.js +6 -1
  86. package/dist/gateways/mutate.js.map +1 -1
  87. package/dist/gateways/query.d.ts +1 -1
  88. package/dist/gateways/query.d.ts.map +1 -1
  89. package/dist/gateways/query.js +4 -1
  90. package/dist/gateways/query.js.map +1 -1
  91. package/dist/index.js +31 -8
  92. package/dist/index.js.map +1 -1
  93. package/dist/lib/executor.d.ts +12 -0
  94. package/dist/lib/executor.d.ts.map +1 -1
  95. package/dist/lib/executor.js +16 -0
  96. package/dist/lib/executor.js.map +1 -1
  97. package/dist/lib/mode-detector.d.ts +71 -0
  98. package/dist/lib/mode-detector.d.ts.map +1 -0
  99. package/dist/lib/mode-detector.js +184 -0
  100. package/dist/lib/mode-detector.js.map +1 -0
  101. package/dist/lib/router.d.ts +2 -1
  102. package/dist/lib/router.d.ts.map +1 -1
  103. package/dist/lib/router.js +7 -5
  104. package/dist/lib/router.js.map +1 -1
  105. package/dist/types/index.d.ts +1 -1
  106. package/dist/types/index.js +1 -1
  107. package/package.json +8 -3
  108. package/schemas/requests/issues/create.schema.json +37 -0
  109. package/schemas/requests/issues/diagnostics.schema.json +8 -0
  110. package/schemas/responses/issues/create.schema.json +49 -0
  111. package/schemas/responses/issues/diagnostics.schema.json +45 -0
  112. 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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"}