@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.
Files changed (81) hide show
  1. package/dist/domains/lifecycle.d.ts.map +1 -1
  2. package/dist/domains/lifecycle.js +8 -0
  3. package/dist/domains/lifecycle.js.map +1 -1
  4. package/dist/domains/orchestrate.js +6 -6
  5. package/dist/domains/orchestrate.js.map +1 -1
  6. package/dist/domains/release.js +4 -4
  7. package/dist/domains/release.js.map +1 -1
  8. package/dist/domains/research.d.ts.map +1 -1
  9. package/dist/domains/research.js +8 -0
  10. package/dist/domains/research.js.map +1 -1
  11. package/dist/domains/session.d.ts +20 -1
  12. package/dist/domains/session.d.ts.map +1 -1
  13. package/dist/domains/session.js +133 -7
  14. package/dist/domains/session.js.map +1 -1
  15. package/dist/domains/system.d.ts +20 -1
  16. package/dist/domains/system.d.ts.map +1 -1
  17. package/dist/domains/system.js +122 -5
  18. package/dist/domains/system.js.map +1 -1
  19. package/dist/domains/tasks.d.ts +20 -1
  20. package/dist/domains/tasks.d.ts.map +1 -1
  21. package/dist/domains/tasks.js +165 -1
  22. package/dist/domains/tasks.js.map +1 -1
  23. package/dist/domains/validate.d.ts.map +1 -1
  24. package/dist/domains/validate.js +8 -0
  25. package/dist/domains/validate.js.map +1 -1
  26. package/dist/engine/capability-matrix.d.ts +67 -0
  27. package/dist/engine/capability-matrix.d.ts.map +1 -0
  28. package/dist/engine/capability-matrix.js +227 -0
  29. package/dist/engine/capability-matrix.js.map +1 -0
  30. package/dist/engine/config-engine.d.ts +29 -0
  31. package/dist/engine/config-engine.d.ts.map +1 -0
  32. package/dist/engine/config-engine.js +110 -0
  33. package/dist/engine/config-engine.js.map +1 -0
  34. package/dist/engine/id-generator.d.ts +34 -0
  35. package/dist/engine/id-generator.d.ts.map +1 -0
  36. package/dist/engine/id-generator.js +91 -0
  37. package/dist/engine/id-generator.js.map +1 -0
  38. package/dist/engine/index.d.ts +17 -0
  39. package/dist/engine/index.d.ts.map +1 -0
  40. package/dist/engine/index.js +26 -0
  41. package/dist/engine/index.js.map +1 -0
  42. package/dist/engine/init-engine.d.ts +52 -0
  43. package/dist/engine/init-engine.d.ts.map +1 -0
  44. package/dist/engine/init-engine.js +222 -0
  45. package/dist/engine/init-engine.js.map +1 -0
  46. package/dist/engine/schema-validator.d.ts +47 -0
  47. package/dist/engine/schema-validator.d.ts.map +1 -0
  48. package/dist/engine/schema-validator.js +219 -0
  49. package/dist/engine/schema-validator.js.map +1 -0
  50. package/dist/engine/session-engine.d.ts +139 -0
  51. package/dist/engine/session-engine.d.ts.map +1 -0
  52. package/dist/engine/session-engine.js +401 -0
  53. package/dist/engine/session-engine.js.map +1 -0
  54. package/dist/engine/store.d.ts +67 -0
  55. package/dist/engine/store.d.ts.map +1 -0
  56. package/dist/engine/store.js +284 -0
  57. package/dist/engine/store.js.map +1 -0
  58. package/dist/engine/task-engine.d.ts +139 -0
  59. package/dist/engine/task-engine.d.ts.map +1 -0
  60. package/dist/engine/task-engine.js +481 -0
  61. package/dist/engine/task-engine.js.map +1 -0
  62. package/dist/engine/validation-rules.d.ts +78 -0
  63. package/dist/engine/validation-rules.d.ts.map +1 -0
  64. package/dist/engine/validation-rules.js +218 -0
  65. package/dist/engine/validation-rules.js.map +1 -0
  66. package/dist/index.js +31 -8
  67. package/dist/index.js.map +1 -1
  68. package/dist/lib/executor.d.ts +12 -0
  69. package/dist/lib/executor.d.ts.map +1 -1
  70. package/dist/lib/executor.js +16 -0
  71. package/dist/lib/executor.js.map +1 -1
  72. package/dist/lib/mode-detector.d.ts +71 -0
  73. package/dist/lib/mode-detector.d.ts.map +1 -0
  74. package/dist/lib/mode-detector.js +184 -0
  75. package/dist/lib/mode-detector.js.map +1 -0
  76. package/dist/lib/router.d.ts +2 -1
  77. package/dist/lib/router.d.ts.map +1 -1
  78. package/dist/lib/router.js +5 -5
  79. package/dist/lib/router.js.map +1 -1
  80. package/package.json +6 -2
  81. 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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"}