lokicms-plugin-api-docs 1.0.0
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 +220 -0
- package/dist/formatters/json-formatter.d.ts +25 -0
- package/dist/formatters/json-formatter.d.ts.map +1 -0
- package/dist/formatters/json-formatter.js +45 -0
- package/dist/formatters/json-formatter.js.map +1 -0
- package/dist/formatters/markdown-formatter.d.ts +21 -0
- package/dist/formatters/markdown-formatter.d.ts.map +1 -0
- package/dist/formatters/markdown-formatter.js +203 -0
- package/dist/formatters/markdown-formatter.js.map +1 -0
- package/dist/formatters/openapi-formatter.d.ts +14 -0
- package/dist/formatters/openapi-formatter.d.ts.map +1 -0
- package/dist/formatters/openapi-formatter.js +505 -0
- package/dist/formatters/openapi-formatter.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +18 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +448 -0
- package/dist/plugin.js.map +1 -0
- package/dist/services/doc-generator.d.ts +22 -0
- package/dist/services/doc-generator.d.ts.map +1 -0
- package/dist/services/doc-generator.js +370 -0
- package/dist/services/doc-generator.js.map +1 -0
- package/dist/services/schema-converter.d.ts +19 -0
- package/dist/services/schema-converter.d.ts.map +1 -0
- package/dist/services/schema-converter.js +371 -0
- package/dist/services/schema-converter.js.map +1 -0
- package/dist/services/typescript-generator.d.ts +27 -0
- package/dist/services/typescript-generator.d.ts.map +1 -0
- package/dist/services/typescript-generator.js +294 -0
- package/dist/services/typescript-generator.js.map +1 -0
- package/dist/types.d.ts +245 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Documentation Generator Service
|
|
3
|
+
* Introspects LokiCMS runtime to generate API documentation
|
|
4
|
+
*/
|
|
5
|
+
import { zodToJsonSchema, extractParameters } from './schema-converter.js';
|
|
6
|
+
/**
|
|
7
|
+
* Create a documentation generator instance
|
|
8
|
+
*/
|
|
9
|
+
export function createDocGenerator(api, config, logger) {
|
|
10
|
+
// Cache for generated documentation
|
|
11
|
+
let cachedDocs = null;
|
|
12
|
+
let cacheTimestamp = 0;
|
|
13
|
+
const CACHE_TTL_MS = 60000; // 1 minute
|
|
14
|
+
/**
|
|
15
|
+
* Generate complete API documentation
|
|
16
|
+
*/
|
|
17
|
+
async function generate(options = {}) {
|
|
18
|
+
const { includeTools = true, includeContentTypes = true, includeEndpoints = true, includeExamples = config.includeExamples ?? false, forceRefresh = false, } = options;
|
|
19
|
+
// Return cached if still valid
|
|
20
|
+
if (!forceRefresh && cachedDocs && Date.now() - cacheTimestamp < CACHE_TTL_MS) {
|
|
21
|
+
return cachedDocs;
|
|
22
|
+
}
|
|
23
|
+
logger.debug('Generating API documentation');
|
|
24
|
+
const docs = {
|
|
25
|
+
info: {
|
|
26
|
+
title: config.title || 'LokiCMS API',
|
|
27
|
+
version: config.version || '1.0.0',
|
|
28
|
+
description: config.description || 'LokiCMS API Documentation',
|
|
29
|
+
generatedAt: new Date().toISOString(),
|
|
30
|
+
},
|
|
31
|
+
tools: [],
|
|
32
|
+
contentTypes: [],
|
|
33
|
+
endpoints: [],
|
|
34
|
+
};
|
|
35
|
+
if (includeTools) {
|
|
36
|
+
docs.tools = await introspectTools(includeExamples);
|
|
37
|
+
}
|
|
38
|
+
if (includeContentTypes) {
|
|
39
|
+
docs.contentTypes = await introspectContentTypes();
|
|
40
|
+
}
|
|
41
|
+
if (includeEndpoints) {
|
|
42
|
+
docs.endpoints = generateEndpoints(docs.tools, docs.contentTypes);
|
|
43
|
+
}
|
|
44
|
+
// Update cache
|
|
45
|
+
cachedDocs = docs;
|
|
46
|
+
cacheTimestamp = Date.now();
|
|
47
|
+
logger.info(`Generated documentation: ${docs.tools.length} tools, ${docs.contentTypes.length} content types`);
|
|
48
|
+
return docs;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Introspect registered MCP tools
|
|
52
|
+
*/
|
|
53
|
+
async function introspectTools(includeExamples = false) {
|
|
54
|
+
const tools = [];
|
|
55
|
+
// Try to get tools from MCP API
|
|
56
|
+
const mcpTools = api.mcp.getTools?.() || new Map();
|
|
57
|
+
for (const [name, definition] of mcpTools) {
|
|
58
|
+
try {
|
|
59
|
+
const inputSchema = zodToJsonSchema(definition.inputSchema, includeExamples);
|
|
60
|
+
const parameters = extractParameters(definition.inputSchema, includeExamples);
|
|
61
|
+
const toolDoc = {
|
|
62
|
+
name,
|
|
63
|
+
description: definition.description,
|
|
64
|
+
parameters,
|
|
65
|
+
inputSchema,
|
|
66
|
+
};
|
|
67
|
+
if (includeExamples) {
|
|
68
|
+
toolDoc.examples = generateToolExamples(name, parameters);
|
|
69
|
+
}
|
|
70
|
+
tools.push(toolDoc);
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
logger.warn(`Failed to document tool ${name}: ${error}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Sort alphabetically
|
|
77
|
+
tools.sort((a, b) => a.name.localeCompare(b.name));
|
|
78
|
+
return tools;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Introspect content types
|
|
82
|
+
*/
|
|
83
|
+
async function introspectContentTypes() {
|
|
84
|
+
const contentTypes = [];
|
|
85
|
+
// Try to get content types from content API
|
|
86
|
+
const types = api.content?.getContentTypes?.() || [];
|
|
87
|
+
for (const type of types) {
|
|
88
|
+
contentTypes.push({
|
|
89
|
+
name: type.name,
|
|
90
|
+
slug: type.slug,
|
|
91
|
+
description: type.description,
|
|
92
|
+
fields: type.fields.map((field) => ({
|
|
93
|
+
name: field.name,
|
|
94
|
+
type: field.type,
|
|
95
|
+
required: field.required ?? false,
|
|
96
|
+
description: field.description,
|
|
97
|
+
options: field.options,
|
|
98
|
+
})),
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
// Sort alphabetically
|
|
102
|
+
contentTypes.sort((a, b) => a.name.localeCompare(b.name));
|
|
103
|
+
return contentTypes;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Generate REST-like endpoint documentation from tools
|
|
107
|
+
*/
|
|
108
|
+
function generateEndpoints(tools, contentTypes) {
|
|
109
|
+
const endpoints = [];
|
|
110
|
+
const baseUrl = config.baseUrl || '/mcp';
|
|
111
|
+
// Generate endpoints for each tool
|
|
112
|
+
for (const tool of tools) {
|
|
113
|
+
endpoints.push({
|
|
114
|
+
method: 'POST',
|
|
115
|
+
path: `${baseUrl}/${tool.name}`,
|
|
116
|
+
summary: tool.description,
|
|
117
|
+
description: `Execute the ${tool.name} MCP tool`,
|
|
118
|
+
requestBody: tool.inputSchema,
|
|
119
|
+
responses: {
|
|
120
|
+
'200': {
|
|
121
|
+
description: 'Successful response',
|
|
122
|
+
schema: { type: 'object' },
|
|
123
|
+
},
|
|
124
|
+
'400': {
|
|
125
|
+
description: 'Invalid input',
|
|
126
|
+
schema: {
|
|
127
|
+
type: 'object',
|
|
128
|
+
properties: {
|
|
129
|
+
error: { type: 'string' },
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
tags: [getToolCategory(tool.name)],
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
// Generate CRUD endpoints for content types
|
|
138
|
+
for (const contentType of contentTypes) {
|
|
139
|
+
const basePath = `${baseUrl}/content/${contentType.slug}`;
|
|
140
|
+
// List
|
|
141
|
+
endpoints.push({
|
|
142
|
+
method: 'GET',
|
|
143
|
+
path: basePath,
|
|
144
|
+
summary: `List ${contentType.name} entries`,
|
|
145
|
+
description: `Retrieve a list of ${contentType.name} entries`,
|
|
146
|
+
parameters: [
|
|
147
|
+
{ name: 'limit', type: 'number', required: false, description: 'Maximum entries to return' },
|
|
148
|
+
{ name: 'offset', type: 'number', required: false, description: 'Number of entries to skip' },
|
|
149
|
+
],
|
|
150
|
+
responses: {
|
|
151
|
+
'200': {
|
|
152
|
+
description: 'List of entries',
|
|
153
|
+
schema: {
|
|
154
|
+
type: 'array',
|
|
155
|
+
items: generateContentTypeSchema(contentType),
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
tags: ['Content'],
|
|
160
|
+
});
|
|
161
|
+
// Get by ID
|
|
162
|
+
endpoints.push({
|
|
163
|
+
method: 'GET',
|
|
164
|
+
path: `${basePath}/{id}`,
|
|
165
|
+
summary: `Get ${contentType.name} by ID`,
|
|
166
|
+
description: `Retrieve a single ${contentType.name} entry by its ID`,
|
|
167
|
+
parameters: [
|
|
168
|
+
{ name: 'id', type: 'string', required: true, description: 'Entry ID' },
|
|
169
|
+
],
|
|
170
|
+
responses: {
|
|
171
|
+
'200': {
|
|
172
|
+
description: 'Entry details',
|
|
173
|
+
schema: generateContentTypeSchema(contentType),
|
|
174
|
+
},
|
|
175
|
+
'404': {
|
|
176
|
+
description: 'Entry not found',
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
tags: ['Content'],
|
|
180
|
+
});
|
|
181
|
+
// Create
|
|
182
|
+
endpoints.push({
|
|
183
|
+
method: 'POST',
|
|
184
|
+
path: basePath,
|
|
185
|
+
summary: `Create ${contentType.name}`,
|
|
186
|
+
description: `Create a new ${contentType.name} entry`,
|
|
187
|
+
requestBody: generateContentTypeSchema(contentType),
|
|
188
|
+
responses: {
|
|
189
|
+
'201': {
|
|
190
|
+
description: 'Entry created',
|
|
191
|
+
schema: generateContentTypeSchema(contentType),
|
|
192
|
+
},
|
|
193
|
+
'400': {
|
|
194
|
+
description: 'Invalid input',
|
|
195
|
+
},
|
|
196
|
+
},
|
|
197
|
+
tags: ['Content'],
|
|
198
|
+
});
|
|
199
|
+
// Update
|
|
200
|
+
endpoints.push({
|
|
201
|
+
method: 'PUT',
|
|
202
|
+
path: `${basePath}/{id}`,
|
|
203
|
+
summary: `Update ${contentType.name}`,
|
|
204
|
+
description: `Update an existing ${contentType.name} entry`,
|
|
205
|
+
parameters: [
|
|
206
|
+
{ name: 'id', type: 'string', required: true, description: 'Entry ID' },
|
|
207
|
+
],
|
|
208
|
+
requestBody: generateContentTypeSchema(contentType),
|
|
209
|
+
responses: {
|
|
210
|
+
'200': {
|
|
211
|
+
description: 'Entry updated',
|
|
212
|
+
schema: generateContentTypeSchema(contentType),
|
|
213
|
+
},
|
|
214
|
+
'404': {
|
|
215
|
+
description: 'Entry not found',
|
|
216
|
+
},
|
|
217
|
+
},
|
|
218
|
+
tags: ['Content'],
|
|
219
|
+
});
|
|
220
|
+
// Delete
|
|
221
|
+
endpoints.push({
|
|
222
|
+
method: 'DELETE',
|
|
223
|
+
path: `${basePath}/{id}`,
|
|
224
|
+
summary: `Delete ${contentType.name}`,
|
|
225
|
+
description: `Delete a ${contentType.name} entry`,
|
|
226
|
+
parameters: [
|
|
227
|
+
{ name: 'id', type: 'string', required: true, description: 'Entry ID' },
|
|
228
|
+
],
|
|
229
|
+
responses: {
|
|
230
|
+
'204': {
|
|
231
|
+
description: 'Entry deleted',
|
|
232
|
+
},
|
|
233
|
+
'404': {
|
|
234
|
+
description: 'Entry not found',
|
|
235
|
+
},
|
|
236
|
+
},
|
|
237
|
+
tags: ['Content'],
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
return endpoints;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Generate JSON Schema from content type
|
|
244
|
+
*/
|
|
245
|
+
function generateContentTypeSchema(contentType) {
|
|
246
|
+
const properties = {
|
|
247
|
+
id: { type: 'string', description: 'Unique identifier' },
|
|
248
|
+
createdAt: { type: 'string', format: 'date-time' },
|
|
249
|
+
updatedAt: { type: 'string', format: 'date-time' },
|
|
250
|
+
};
|
|
251
|
+
const required = ['id'];
|
|
252
|
+
for (const field of contentType.fields) {
|
|
253
|
+
properties[field.name] = {
|
|
254
|
+
type: fieldTypeToJsonType(field.type),
|
|
255
|
+
description: field.description,
|
|
256
|
+
};
|
|
257
|
+
if (field.required) {
|
|
258
|
+
required.push(field.name);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return {
|
|
262
|
+
type: 'object',
|
|
263
|
+
properties,
|
|
264
|
+
required,
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Convert field type to JSON Schema type
|
|
269
|
+
*/
|
|
270
|
+
function fieldTypeToJsonType(fieldType) {
|
|
271
|
+
const typeMap = {
|
|
272
|
+
string: 'string',
|
|
273
|
+
text: 'string',
|
|
274
|
+
richtext: 'string',
|
|
275
|
+
number: 'number',
|
|
276
|
+
integer: 'integer',
|
|
277
|
+
boolean: 'boolean',
|
|
278
|
+
date: 'string',
|
|
279
|
+
datetime: 'string',
|
|
280
|
+
array: 'array',
|
|
281
|
+
object: 'object',
|
|
282
|
+
reference: 'string',
|
|
283
|
+
media: 'string',
|
|
284
|
+
json: 'object',
|
|
285
|
+
};
|
|
286
|
+
return typeMap[fieldType.toLowerCase()] || 'string';
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Get tool category from name
|
|
290
|
+
*/
|
|
291
|
+
function getToolCategory(toolName) {
|
|
292
|
+
const prefix = toolName.split('_')[0];
|
|
293
|
+
const categories = {
|
|
294
|
+
vault: 'Vault',
|
|
295
|
+
sql: 'SQL',
|
|
296
|
+
mongodb: 'MongoDB',
|
|
297
|
+
vectors: 'Vectors',
|
|
298
|
+
backup: 'Backup',
|
|
299
|
+
docs: 'Documentation',
|
|
300
|
+
content: 'Content',
|
|
301
|
+
media: 'Media',
|
|
302
|
+
auth: 'Authentication',
|
|
303
|
+
};
|
|
304
|
+
return categories[prefix] || 'General';
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Generate example inputs for a tool
|
|
308
|
+
*/
|
|
309
|
+
function generateToolExamples(toolName, parameters) {
|
|
310
|
+
const example = {};
|
|
311
|
+
for (const param of parameters) {
|
|
312
|
+
if (param.required) {
|
|
313
|
+
example[param.name] = param.example ?? param.default ?? getDefaultValue(param.type);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
return [
|
|
317
|
+
{
|
|
318
|
+
name: 'Basic usage',
|
|
319
|
+
input: example,
|
|
320
|
+
description: `Basic example for ${toolName}`,
|
|
321
|
+
},
|
|
322
|
+
];
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Get default value for a type
|
|
326
|
+
*/
|
|
327
|
+
function getDefaultValue(type) {
|
|
328
|
+
switch (type) {
|
|
329
|
+
case 'string':
|
|
330
|
+
return 'example';
|
|
331
|
+
case 'number':
|
|
332
|
+
return 0;
|
|
333
|
+
case 'boolean':
|
|
334
|
+
return true;
|
|
335
|
+
case 'array':
|
|
336
|
+
return [];
|
|
337
|
+
case 'object':
|
|
338
|
+
return {};
|
|
339
|
+
default:
|
|
340
|
+
return null;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Get tools list only
|
|
345
|
+
*/
|
|
346
|
+
async function getTools(includeExamples = false) {
|
|
347
|
+
return introspectTools(includeExamples);
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Get content types only
|
|
351
|
+
*/
|
|
352
|
+
async function getContentTypes() {
|
|
353
|
+
return introspectContentTypes();
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Clear documentation cache
|
|
357
|
+
*/
|
|
358
|
+
function clearCache() {
|
|
359
|
+
cachedDocs = null;
|
|
360
|
+
cacheTimestamp = 0;
|
|
361
|
+
logger.debug('Documentation cache cleared');
|
|
362
|
+
}
|
|
363
|
+
return {
|
|
364
|
+
generate,
|
|
365
|
+
getTools,
|
|
366
|
+
getContentTypes,
|
|
367
|
+
clearCache,
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
//# sourceMappingURL=doc-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc-generator.js","sourceRoot":"","sources":["../../src/services/doc-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema Converter Service
|
|
3
|
+
* Converts Zod schemas to JSON Schema format
|
|
4
|
+
*/
|
|
5
|
+
import type { z } from 'zod';
|
|
6
|
+
import type { JsonSchema, JsonSchemaProperty, ParameterDoc } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Convert a Zod schema to JSON Schema format
|
|
9
|
+
*/
|
|
10
|
+
export declare function zodToJsonSchema(schema: z.ZodType, includeExamples?: boolean): JsonSchema;
|
|
11
|
+
/**
|
|
12
|
+
* Extract parameter documentation from a Zod object schema
|
|
13
|
+
*/
|
|
14
|
+
export declare function extractParameters(schema: z.ZodType, includeExamples?: boolean): ParameterDoc[];
|
|
15
|
+
/**
|
|
16
|
+
* Generate example value for a JSON Schema property
|
|
17
|
+
*/
|
|
18
|
+
export declare function generateExample(schema: JsonSchemaProperty): unknown;
|
|
19
|
+
//# sourceMappingURL=schema-converter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-converter.d.ts","sourceRoot":"","sources":["../../src/services/schema-converter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAsBhF;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,eAAe,UAAQ,GAAG,UAAU,CAMtF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,eAAe,UAAQ,GAAG,YAAY,EAAE,CAgD5F;AA2TD;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAkDnE"}
|