@cleocode/mcp-server 0.90.3 → 0.92.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/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 +122 -5
- 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/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 +17 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +26 -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/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 +5 -5
- package/dist/lib/router.js.map +1 -1
- package/package.json +6 -2
- package/server.json +2 -2
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Init Engine
|
|
3
|
+
*
|
|
4
|
+
* Project initialization: creates the .cleo/ directory structure
|
|
5
|
+
* with empty data files and default configuration.
|
|
6
|
+
*
|
|
7
|
+
* CRITICAL: Init is explicit, not automatic. The MCP server MUST NOT
|
|
8
|
+
* silently create .cleo/ directories on first write.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Engine result wrapper
|
|
12
|
+
*/
|
|
13
|
+
export interface EngineResult<T = unknown> {
|
|
14
|
+
success: boolean;
|
|
15
|
+
data?: T;
|
|
16
|
+
error?: {
|
|
17
|
+
code: string;
|
|
18
|
+
message: string;
|
|
19
|
+
details?: unknown;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Initialize a CLEO project directory.
|
|
24
|
+
*
|
|
25
|
+
* Creates the .cleo/ directory structure with empty data files.
|
|
26
|
+
* Returns error if already initialized (unless force=true).
|
|
27
|
+
*/
|
|
28
|
+
export declare function initProject(projectRoot: string, options?: {
|
|
29
|
+
projectName?: string;
|
|
30
|
+
force?: boolean;
|
|
31
|
+
}): EngineResult<{
|
|
32
|
+
initialized: boolean;
|
|
33
|
+
projectRoot: string;
|
|
34
|
+
filesCreated: string[];
|
|
35
|
+
}>;
|
|
36
|
+
/**
|
|
37
|
+
* Check if auto-init is enabled via environment variable
|
|
38
|
+
*/
|
|
39
|
+
export declare function isAutoInitEnabled(): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Check initialization status and auto-init if configured
|
|
42
|
+
*/
|
|
43
|
+
export declare function ensureInitialized(projectRoot: string): EngineResult<{
|
|
44
|
+
initialized: boolean;
|
|
45
|
+
}>;
|
|
46
|
+
/**
|
|
47
|
+
* Get current version (native implementation)
|
|
48
|
+
*/
|
|
49
|
+
export declare function getVersion(projectRoot: string): EngineResult<{
|
|
50
|
+
version: string;
|
|
51
|
+
}>;
|
|
52
|
+
//# sourceMappingURL=init-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-engine.d.ts","sourceRoot":"","sources":["../../src/engine/init-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;CACH;AAaD;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE;IACR,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GACA,YAAY,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC,CAgID;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,GAClB,YAAY,CAAC;IAAE,WAAW,EAAE,OAAO,CAAA;CAAE,CAAC,CA0BxC;AAUD;;GAEG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CA8BjF"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Init Engine
|
|
3
|
+
*
|
|
4
|
+
* Project initialization: creates the .cleo/ directory structure
|
|
5
|
+
* with empty data files and default configuration.
|
|
6
|
+
*
|
|
7
|
+
* CRITICAL: Init is explicit, not automatic. The MCP server MUST NOT
|
|
8
|
+
* silently create .cleo/ directories on first write.
|
|
9
|
+
*/
|
|
10
|
+
import { existsSync, mkdirSync, writeFileSync } from 'fs';
|
|
11
|
+
import { join } from 'path';
|
|
12
|
+
import { readJsonFile } from './store.js';
|
|
13
|
+
/**
|
|
14
|
+
* Default schema versions for new files
|
|
15
|
+
*/
|
|
16
|
+
const DEFAULT_VERSIONS = {
|
|
17
|
+
todo: '2.10.0',
|
|
18
|
+
config: '2.10.0',
|
|
19
|
+
archive: '2.4.0',
|
|
20
|
+
log: '2.4.0',
|
|
21
|
+
sessions: '1.0.0',
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Initialize a CLEO project directory.
|
|
25
|
+
*
|
|
26
|
+
* Creates the .cleo/ directory structure with empty data files.
|
|
27
|
+
* Returns error if already initialized (unless force=true).
|
|
28
|
+
*/
|
|
29
|
+
export function initProject(projectRoot, options) {
|
|
30
|
+
const cleoDir = join(projectRoot, '.cleo');
|
|
31
|
+
const isAlreadyInit = existsSync(cleoDir) && existsSync(join(cleoDir, 'todo.json'));
|
|
32
|
+
if (isAlreadyInit && !options?.force) {
|
|
33
|
+
return {
|
|
34
|
+
success: false,
|
|
35
|
+
error: {
|
|
36
|
+
code: 'E_ALREADY_INITIALIZED',
|
|
37
|
+
message: 'CLEO project already initialized. Use force=true to reinitialize.',
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
const filesCreated = [];
|
|
42
|
+
const now = new Date().toISOString();
|
|
43
|
+
const projectName = options?.projectName || deriveProjectName(projectRoot);
|
|
44
|
+
// Create directory structure
|
|
45
|
+
const dirs = [
|
|
46
|
+
cleoDir,
|
|
47
|
+
join(cleoDir, '.backups'),
|
|
48
|
+
join(cleoDir, 'backups'),
|
|
49
|
+
join(cleoDir, 'metrics'),
|
|
50
|
+
];
|
|
51
|
+
for (const dir of dirs) {
|
|
52
|
+
if (!existsSync(dir)) {
|
|
53
|
+
mkdirSync(dir, { recursive: true });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Create todo.json
|
|
57
|
+
const todoPath = join(cleoDir, 'todo.json');
|
|
58
|
+
if (!existsSync(todoPath) || options?.force) {
|
|
59
|
+
const todoData = {
|
|
60
|
+
project: {
|
|
61
|
+
name: projectName,
|
|
62
|
+
currentPhase: null,
|
|
63
|
+
phases: {},
|
|
64
|
+
phaseHistory: [],
|
|
65
|
+
releases: [],
|
|
66
|
+
},
|
|
67
|
+
lastUpdated: now,
|
|
68
|
+
focus: {
|
|
69
|
+
currentTask: null,
|
|
70
|
+
currentPhase: null,
|
|
71
|
+
blockedUntil: null,
|
|
72
|
+
sessionNote: null,
|
|
73
|
+
sessionNotes: [],
|
|
74
|
+
nextAction: null,
|
|
75
|
+
primarySession: null,
|
|
76
|
+
},
|
|
77
|
+
_meta: {
|
|
78
|
+
schemaVersion: DEFAULT_VERSIONS.todo,
|
|
79
|
+
specVersion: '3.1.0',
|
|
80
|
+
checksum: '0000000000000000',
|
|
81
|
+
configVersion: DEFAULT_VERSIONS.config,
|
|
82
|
+
lastSessionId: null,
|
|
83
|
+
activeSession: null,
|
|
84
|
+
multiSessionEnabled: false,
|
|
85
|
+
activeSessionCount: 0,
|
|
86
|
+
sessionsFile: 'sessions.json',
|
|
87
|
+
generation: 0,
|
|
88
|
+
},
|
|
89
|
+
tasks: [],
|
|
90
|
+
labels: {},
|
|
91
|
+
};
|
|
92
|
+
writeFileSync(todoPath, JSON.stringify(todoData, null, 2) + '\n', 'utf-8');
|
|
93
|
+
filesCreated.push('todo.json');
|
|
94
|
+
}
|
|
95
|
+
// Create config.json
|
|
96
|
+
const configPath = join(cleoDir, 'config.json');
|
|
97
|
+
if (!existsSync(configPath) || options?.force) {
|
|
98
|
+
const configData = {
|
|
99
|
+
version: DEFAULT_VERSIONS.config,
|
|
100
|
+
_meta: {
|
|
101
|
+
schemaVersion: DEFAULT_VERSIONS.config,
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
writeFileSync(configPath, JSON.stringify(configData, null, 2) + '\n', 'utf-8');
|
|
105
|
+
filesCreated.push('config.json');
|
|
106
|
+
}
|
|
107
|
+
// Create todo-archive.json
|
|
108
|
+
const archivePath = join(cleoDir, 'todo-archive.json');
|
|
109
|
+
if (!existsSync(archivePath) || options?.force) {
|
|
110
|
+
const archiveData = {
|
|
111
|
+
project: projectName,
|
|
112
|
+
_meta: {
|
|
113
|
+
schemaVersion: DEFAULT_VERSIONS.archive,
|
|
114
|
+
totalArchived: 0,
|
|
115
|
+
lastArchived: null,
|
|
116
|
+
},
|
|
117
|
+
archivedTasks: [],
|
|
118
|
+
};
|
|
119
|
+
writeFileSync(archivePath, JSON.stringify(archiveData, null, 2) + '\n', 'utf-8');
|
|
120
|
+
filesCreated.push('todo-archive.json');
|
|
121
|
+
}
|
|
122
|
+
// Create todo-log.json
|
|
123
|
+
const logPath = join(cleoDir, 'todo-log.json');
|
|
124
|
+
if (!existsSync(logPath) || options?.force) {
|
|
125
|
+
const logData = {
|
|
126
|
+
project: projectName,
|
|
127
|
+
_meta: {
|
|
128
|
+
schemaVersion: DEFAULT_VERSIONS.log,
|
|
129
|
+
totalEntries: 0,
|
|
130
|
+
firstEntry: null,
|
|
131
|
+
lastEntry: null,
|
|
132
|
+
formatVersion: '1',
|
|
133
|
+
entriesPruned: 0,
|
|
134
|
+
},
|
|
135
|
+
entries: [],
|
|
136
|
+
};
|
|
137
|
+
writeFileSync(logPath, JSON.stringify(logData, null, 2) + '\n', 'utf-8');
|
|
138
|
+
filesCreated.push('todo-log.json');
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
success: true,
|
|
142
|
+
data: {
|
|
143
|
+
initialized: true,
|
|
144
|
+
projectRoot,
|
|
145
|
+
filesCreated,
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Check if auto-init is enabled via environment variable
|
|
151
|
+
*/
|
|
152
|
+
export function isAutoInitEnabled() {
|
|
153
|
+
return process.env.CLEO_AUTO_INIT === 'true';
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Check initialization status and auto-init if configured
|
|
157
|
+
*/
|
|
158
|
+
export function ensureInitialized(projectRoot) {
|
|
159
|
+
const cleoDir = join(projectRoot, '.cleo');
|
|
160
|
+
const isInit = existsSync(cleoDir) && existsSync(join(cleoDir, 'todo.json'));
|
|
161
|
+
if (isInit) {
|
|
162
|
+
return { success: true, data: { initialized: true } };
|
|
163
|
+
}
|
|
164
|
+
if (isAutoInitEnabled()) {
|
|
165
|
+
const result = initProject(projectRoot);
|
|
166
|
+
if (result.success) {
|
|
167
|
+
return { success: true, data: { initialized: true } };
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
success: false,
|
|
171
|
+
error: result.error,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
return {
|
|
175
|
+
success: false,
|
|
176
|
+
error: {
|
|
177
|
+
code: 'E_NOT_INITIALIZED',
|
|
178
|
+
message: 'CLEO project not initialized. Run system.init or set CLEO_AUTO_INIT=true',
|
|
179
|
+
},
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Derive project name from directory path
|
|
184
|
+
*/
|
|
185
|
+
function deriveProjectName(projectRoot) {
|
|
186
|
+
const parts = projectRoot.replace(/\\/g, '/').split('/');
|
|
187
|
+
return parts[parts.length - 1] || 'cleo-project';
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Get current version (native implementation)
|
|
191
|
+
*/
|
|
192
|
+
export function getVersion(projectRoot) {
|
|
193
|
+
// Try reading VERSION file from project root
|
|
194
|
+
const versionPaths = [
|
|
195
|
+
join(projectRoot, 'VERSION'),
|
|
196
|
+
join(projectRoot, '..', 'VERSION'), // mcp-server subdirectory
|
|
197
|
+
];
|
|
198
|
+
for (const versionPath of versionPaths) {
|
|
199
|
+
try {
|
|
200
|
+
const { readFileSync } = require('fs');
|
|
201
|
+
const version = readFileSync(versionPath, 'utf-8').trim();
|
|
202
|
+
if (version) {
|
|
203
|
+
return { success: true, data: { version } };
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
// Try next path
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// Fallback: try package.json
|
|
211
|
+
try {
|
|
212
|
+
const pkg = readJsonFile(join(projectRoot, 'package.json'));
|
|
213
|
+
if (pkg?.version) {
|
|
214
|
+
return { success: true, data: { version: pkg.version } };
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
// No package.json
|
|
219
|
+
}
|
|
220
|
+
return { success: true, data: { version: '0.0.0' } };
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=init-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-engine.js","sourceRoot":"","sources":["../../src/engine/init-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAe1C;;GAEG;AACH,MAAM,gBAAgB,GAAG;IACvB,IAAI,EAAE,QAAQ;IACd,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,OAAO;IAChB,GAAG,EAAE,OAAO;IACZ,QAAQ,EAAE,OAAO;CAClB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CACzB,WAAmB,EACnB,OAGC;IAMD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC3C,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;IAEpF,IAAI,aAAa,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QACrC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE;gBACL,IAAI,EAAE,uBAAuB;gBAC7B,OAAO,EAAE,mEAAmE;aAC7E;SACF,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAE3E,6BAA6B;IAC7B,MAAM,IAAI,GAAG;QACX,OAAO;QACP,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC;QACzB,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC;QACxB,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC;KACzB,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC5C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG;YACf,OAAO,EAAE;gBACP,IAAI,EAAE,WAAW;gBACjB,YAAY,EAAE,IAAI;gBAClB,MAAM,EAAE,EAAE;gBACV,YAAY,EAAE,EAAE;gBAChB,QAAQ,EAAE,EAAE;aACb;YACD,WAAW,EAAE,GAAG;YAChB,KAAK,EAAE;gBACL,WAAW,EAAE,IAAI;gBACjB,YAAY,EAAE,IAAI;gBAClB,YAAY,EAAE,IAAI;gBAClB,WAAW,EAAE,IAAI;gBACjB,YAAY,EAAE,EAAE;gBAChB,UAAU,EAAE,IAAI;gBAChB,cAAc,EAAE,IAAI;aACrB;YACD,KAAK,EAAE;gBACL,aAAa,EAAE,gBAAgB,CAAC,IAAI;gBACpC,WAAW,EAAE,OAAO;gBACpB,QAAQ,EAAE,kBAAkB;gBAC5B,aAAa,EAAE,gBAAgB,CAAC,MAAM;gBACtC,aAAa,EAAE,IAAI;gBACnB,aAAa,EAAE,IAAI;gBACnB,mBAAmB,EAAE,KAAK;gBAC1B,kBAAkB,EAAE,CAAC;gBACrB,YAAY,EAAE,eAAe;gBAC7B,UAAU,EAAE,CAAC;aACd;YACD,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,EAAE;SACX,CAAC;QACF,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3E,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACjC,CAAC;IAED,qBAAqB;IACrB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAChD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;QAC9C,MAAM,UAAU,GAAG;YACjB,OAAO,EAAE,gBAAgB,CAAC,MAAM;YAChC,KAAK,EAAE;gBACL,aAAa,EAAE,gBAAgB,CAAC,MAAM;aACvC;SACF,CAAC;QACF,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;QAC/E,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACnC,CAAC;IAED,2BAA2B;IAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;IACvD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;QAC/C,MAAM,WAAW,GAAG;YAClB,OAAO,EAAE,WAAW;YACpB,KAAK,EAAE;gBACL,aAAa,EAAE,gBAAgB,CAAC,OAAO;gBACvC,aAAa,EAAE,CAAC;gBAChB,YAAY,EAAE,IAAI;aACnB;YACD,aAAa,EAAE,EAAE;SAClB,CAAC;QACF,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;QACjF,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACzC,CAAC;IAED,uBAAuB;IACvB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IAC/C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG;YACd,OAAO,EAAE,WAAW;YACpB,KAAK,EAAE;gBACL,aAAa,EAAE,gBAAgB,CAAC,GAAG;gBACnC,YAAY,EAAE,CAAC;gBACf,UAAU,EAAE,IAAI;gBAChB,SAAS,EAAE,IAAI;gBACf,aAAa,EAAE,GAAG;gBAClB,aAAa,EAAE,CAAC;aACjB;YACD,OAAO,EAAE,EAAE;SACZ,CAAC;QACF,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;QACzE,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACrC,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI;QACb,IAAI,EAAE;YACJ,WAAW,EAAE,IAAI;YACjB,WAAW;YACX,YAAY;SACb;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,MAAM,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,WAAmB;IAEnB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;IAE7E,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC;IACxD,CAAC;IAED,IAAI,iBAAiB,EAAE,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;QACxC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC;QACxD,CAAC;QACD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,KAAK;QACd,KAAK,EAAE;YACL,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,0EAA0E;SACpF;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,WAAmB;IAC5C,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzD,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,cAAc,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,WAAmB;IAC5C,6CAA6C;IAC7C,MAAM,YAAY,GAAG;QACnB,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC;QAC5B,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,0BAA0B;KAC/D,CAAC;IAEF,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YAC1D,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC;YAC9C,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB;QAClB,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAsB,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC;QACjF,IAAI,GAAG,EAAE,OAAO,EAAE,CAAC;YACjB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;QAC3D,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,kBAAkB;IACpB,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema Validator
|
|
3
|
+
*
|
|
4
|
+
* Validates CLEO JSON data against JSON Schema using Ajv.
|
|
5
|
+
* Reuses existing schemas from the schemas/ directory.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Validation result
|
|
9
|
+
*/
|
|
10
|
+
export interface ValidationResult {
|
|
11
|
+
valid: boolean;
|
|
12
|
+
errors: ValidationError[];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Individual validation error
|
|
16
|
+
*/
|
|
17
|
+
export interface ValidationError {
|
|
18
|
+
path: string;
|
|
19
|
+
message: string;
|
|
20
|
+
keyword: string;
|
|
21
|
+
params: Record<string, unknown>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Schema types that can be validated
|
|
25
|
+
*/
|
|
26
|
+
export type SchemaType = 'todo' | 'config' | 'archive' | 'log' | 'sessions';
|
|
27
|
+
/**
|
|
28
|
+
* Validate data against a CLEO schema
|
|
29
|
+
*
|
|
30
|
+
* @param schemaType - Which schema to validate against
|
|
31
|
+
* @param data - The data to validate
|
|
32
|
+
* @returns Validation result with errors if invalid
|
|
33
|
+
*/
|
|
34
|
+
export declare function validateSchema(schemaType: SchemaType, data: unknown): ValidationResult;
|
|
35
|
+
/**
|
|
36
|
+
* Validate a single task object against the task definition in todo.schema.json.
|
|
37
|
+
* This extracts the task definition from the full schema for targeted validation.
|
|
38
|
+
*
|
|
39
|
+
* @param task - Task object to validate
|
|
40
|
+
* @returns Validation result
|
|
41
|
+
*/
|
|
42
|
+
export declare function validateTask(task: unknown): ValidationResult;
|
|
43
|
+
/**
|
|
44
|
+
* Clear the schema cache (useful for testing)
|
|
45
|
+
*/
|
|
46
|
+
export declare function clearSchemaCache(): void;
|
|
47
|
+
//# sourceMappingURL=schema-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-validator.d.ts","sourceRoot":"","sources":["../../src/engine/schema-validator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,UAAU,CAAC;AAmF5E;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,OAAO,GACZ,gBAAgB,CA+BlB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB,CAgG5D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAGvC"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema Validator
|
|
3
|
+
*
|
|
4
|
+
* Validates CLEO JSON data against JSON Schema using Ajv.
|
|
5
|
+
* Reuses existing schemas from the schemas/ directory.
|
|
6
|
+
*/
|
|
7
|
+
import AjvModule from 'ajv';
|
|
8
|
+
import addFormatsModule from 'ajv-formats';
|
|
9
|
+
import { readFileSync, existsSync } from 'fs';
|
|
10
|
+
import { join } from 'path';
|
|
11
|
+
// Handle ESM/CJS interop for Ajv and ajv-formats
|
|
12
|
+
const Ajv = AjvModule.default || AjvModule;
|
|
13
|
+
const addFormats = addFormatsModule.default || addFormatsModule;
|
|
14
|
+
/**
|
|
15
|
+
* Schema cache to avoid re-reading/re-compiling
|
|
16
|
+
*/
|
|
17
|
+
const schemaCache = new Map();
|
|
18
|
+
/**
|
|
19
|
+
* Create an Ajv instance configured for CLEO schemas
|
|
20
|
+
*/
|
|
21
|
+
function createAjv() {
|
|
22
|
+
const ajv = new Ajv({
|
|
23
|
+
allErrors: true,
|
|
24
|
+
strict: false,
|
|
25
|
+
validateFormats: true,
|
|
26
|
+
});
|
|
27
|
+
addFormats(ajv);
|
|
28
|
+
return ajv;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Shared Ajv instance
|
|
32
|
+
*/
|
|
33
|
+
let ajvInstance = null;
|
|
34
|
+
function getAjv() {
|
|
35
|
+
if (!ajvInstance) {
|
|
36
|
+
ajvInstance = createAjv();
|
|
37
|
+
}
|
|
38
|
+
return ajvInstance;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Resolve path to a schema file.
|
|
42
|
+
* Looks in multiple locations: project schemas/, mcp-server local schemas/
|
|
43
|
+
*/
|
|
44
|
+
function resolveSchemaPath(schemaType) {
|
|
45
|
+
const filename = `${schemaType}.schema.json`;
|
|
46
|
+
// Check project root schemas/
|
|
47
|
+
const projectRoot = process.env.CLEO_ROOT || process.cwd();
|
|
48
|
+
const paths = [
|
|
49
|
+
join(projectRoot, 'schemas', filename),
|
|
50
|
+
join(projectRoot, '..', 'schemas', filename), // mcp-server is a subdirectory
|
|
51
|
+
join(__dirname, '..', '..', '..', 'schemas', filename), // relative from dist/
|
|
52
|
+
join(__dirname, '..', '..', 'schemas', filename),
|
|
53
|
+
];
|
|
54
|
+
for (const p of paths) {
|
|
55
|
+
if (existsSync(p)) {
|
|
56
|
+
return p;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Load and compile a schema, with caching
|
|
63
|
+
*/
|
|
64
|
+
function getValidator(schemaType) {
|
|
65
|
+
const cached = schemaCache.get(schemaType);
|
|
66
|
+
if (cached) {
|
|
67
|
+
return cached;
|
|
68
|
+
}
|
|
69
|
+
const schemaPath = resolveSchemaPath(schemaType);
|
|
70
|
+
if (!schemaPath) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
const schemaContent = readFileSync(schemaPath, 'utf-8');
|
|
75
|
+
const schema = JSON.parse(schemaContent);
|
|
76
|
+
const ajv = getAjv();
|
|
77
|
+
const validate = ajv.compile(schema);
|
|
78
|
+
schemaCache.set(schemaType, validate);
|
|
79
|
+
return validate;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Validate data against a CLEO schema
|
|
87
|
+
*
|
|
88
|
+
* @param schemaType - Which schema to validate against
|
|
89
|
+
* @param data - The data to validate
|
|
90
|
+
* @returns Validation result with errors if invalid
|
|
91
|
+
*/
|
|
92
|
+
export function validateSchema(schemaType, data) {
|
|
93
|
+
const validate = getValidator(schemaType);
|
|
94
|
+
if (!validate) {
|
|
95
|
+
return {
|
|
96
|
+
valid: false,
|
|
97
|
+
errors: [{
|
|
98
|
+
path: '',
|
|
99
|
+
message: `Schema '${schemaType}' not found. Ensure schemas/ directory is accessible.`,
|
|
100
|
+
keyword: 'schema-not-found',
|
|
101
|
+
params: { schemaType },
|
|
102
|
+
}],
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
const valid = validate(data);
|
|
106
|
+
if (valid) {
|
|
107
|
+
return { valid: true, errors: [] };
|
|
108
|
+
}
|
|
109
|
+
const errors = (validate.errors || []).map((err) => ({
|
|
110
|
+
path: err.instancePath || '/',
|
|
111
|
+
message: err.message || 'Validation failed',
|
|
112
|
+
keyword: err.keyword,
|
|
113
|
+
params: err.params,
|
|
114
|
+
}));
|
|
115
|
+
return { valid: false, errors };
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Validate a single task object against the task definition in todo.schema.json.
|
|
119
|
+
* This extracts the task definition from the full schema for targeted validation.
|
|
120
|
+
*
|
|
121
|
+
* @param task - Task object to validate
|
|
122
|
+
* @returns Validation result
|
|
123
|
+
*/
|
|
124
|
+
export function validateTask(task) {
|
|
125
|
+
if (!task || typeof task !== 'object') {
|
|
126
|
+
return {
|
|
127
|
+
valid: false,
|
|
128
|
+
errors: [{
|
|
129
|
+
path: '',
|
|
130
|
+
message: 'Task must be a non-null object',
|
|
131
|
+
keyword: 'type',
|
|
132
|
+
params: { type: 'object' },
|
|
133
|
+
}],
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
const taskObj = task;
|
|
137
|
+
// Validate required fields exist
|
|
138
|
+
const requiredFields = ['id', 'title', 'status', 'priority', 'createdAt'];
|
|
139
|
+
const errors = [];
|
|
140
|
+
for (const field of requiredFields) {
|
|
141
|
+
if (taskObj[field] === undefined || taskObj[field] === null) {
|
|
142
|
+
errors.push({
|
|
143
|
+
path: `/${field}`,
|
|
144
|
+
message: `Required field '${field}' is missing`,
|
|
145
|
+
keyword: 'required',
|
|
146
|
+
params: { missingProperty: field },
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Validate ID format
|
|
151
|
+
if (typeof taskObj.id === 'string' && !/^T\d{3,}$/.test(taskObj.id)) {
|
|
152
|
+
errors.push({
|
|
153
|
+
path: '/id',
|
|
154
|
+
message: 'Task ID must match pattern T followed by 3+ digits (e.g., T001)',
|
|
155
|
+
keyword: 'pattern',
|
|
156
|
+
params: { pattern: '^T\\d{3,}$' },
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
// Validate status enum
|
|
160
|
+
const validStatuses = ['pending', 'active', 'blocked', 'done', 'cancelled'];
|
|
161
|
+
if (taskObj.status && !validStatuses.includes(taskObj.status)) {
|
|
162
|
+
errors.push({
|
|
163
|
+
path: '/status',
|
|
164
|
+
message: `Status must be one of: ${validStatuses.join(', ')}`,
|
|
165
|
+
keyword: 'enum',
|
|
166
|
+
params: { allowedValues: validStatuses },
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
// Validate priority enum
|
|
170
|
+
const validPriorities = ['critical', 'high', 'medium', 'low'];
|
|
171
|
+
if (taskObj.priority && !validPriorities.includes(taskObj.priority)) {
|
|
172
|
+
errors.push({
|
|
173
|
+
path: '/priority',
|
|
174
|
+
message: `Priority must be one of: ${validPriorities.join(', ')}`,
|
|
175
|
+
keyword: 'enum',
|
|
176
|
+
params: { allowedValues: validPriorities },
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
// Validate title length
|
|
180
|
+
if (typeof taskObj.title === 'string') {
|
|
181
|
+
if (taskObj.title.length === 0) {
|
|
182
|
+
errors.push({
|
|
183
|
+
path: '/title',
|
|
184
|
+
message: 'Title cannot be empty',
|
|
185
|
+
keyword: 'minLength',
|
|
186
|
+
params: { limit: 1 },
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
if (taskObj.title.length > 120) {
|
|
190
|
+
errors.push({
|
|
191
|
+
path: '/title',
|
|
192
|
+
message: 'Title cannot exceed 120 characters',
|
|
193
|
+
keyword: 'maxLength',
|
|
194
|
+
params: { limit: 120 },
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Validate description length
|
|
199
|
+
if (typeof taskObj.description === 'string' && taskObj.description.length > 2000) {
|
|
200
|
+
errors.push({
|
|
201
|
+
path: '/description',
|
|
202
|
+
message: 'Description cannot exceed 2000 characters',
|
|
203
|
+
keyword: 'maxLength',
|
|
204
|
+
params: { limit: 2000 },
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
valid: errors.length === 0,
|
|
209
|
+
errors,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Clear the schema cache (useful for testing)
|
|
214
|
+
*/
|
|
215
|
+
export function clearSchemaCache() {
|
|
216
|
+
schemaCache.clear();
|
|
217
|
+
ajvInstance = null;
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=schema-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-validator.js","sourceRoot":"","sources":["../../src/engine/schema-validator.ts"],"names":[],"mappings":"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"}
|