mcp-docs-service 0.2.0 → 0.2.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/CHANGELOG.md +43 -0
- package/LICENSE +1 -1
- package/README.md +29 -57
- package/dist/handlers/docs.d.ts +17 -0
- package/dist/handlers/docs.js +280 -0
- package/dist/handlers/docs.js.map +1 -0
- package/dist/handlers/file.d.ts +32 -0
- package/dist/handlers/file.js +222 -0
- package/dist/handlers/file.js.map +1 -0
- package/dist/handlers/index.d.ts +1 -0
- package/dist/handlers/index.js +3 -0
- package/dist/handlers/index.js.map +1 -0
- package/dist/index.d.ts +2 -24
- package/dist/index.js +431 -49
- package/dist/index.js.map +1 -1
- package/dist/schemas/index.d.ts +1 -0
- package/dist/schemas/index.js +3 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/tools.d.ts +141 -0
- package/dist/schemas/tools.js +46 -0
- package/dist/schemas/tools.js.map +1 -0
- package/dist/types/docs.d.ts +49 -0
- package/dist/types/docs.js +2 -0
- package/dist/types/docs.js.map +1 -0
- package/dist/types/file.d.ts +21 -0
- package/dist/types/file.js +2 -0
- package/dist/types/file.js.map +1 -0
- package/dist/types/index.d.ts +34 -43
- package/dist/types/index.js +3 -5
- package/dist/types/index.js.map +1 -1
- package/dist/types/tools.d.ts +11 -0
- package/dist/types/tools.js +2 -0
- package/dist/types/tools.js.map +1 -0
- package/dist/utils/file.d.ts +24 -0
- package/dist/utils/file.js +94 -0
- package/dist/utils/file.js.map +1 -0
- package/dist/utils/index.d.ts +1 -60
- package/dist/utils/index.js +2 -151
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/path.d.ts +16 -0
- package/dist/utils/path.js +39 -0
- package/dist/utils/path.js.map +1 -0
- package/package.json +20 -8
- package/dist/cli/bin.d.ts +0 -6
- package/dist/cli/bin.js +0 -49
- package/dist/cli/bin.js.map +0 -1
- package/dist/cli/index.d.ts +0 -16
- package/dist/cli/index.js +0 -108
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/jsonrpc.d.ts +0 -29
- package/dist/cli/jsonrpc.js +0 -121
- package/dist/cli/jsonrpc.js.map +0 -1
- package/dist/core/docAnalyzer.d.ts +0 -25
- package/dist/core/docAnalyzer.js +0 -118
- package/dist/core/docAnalyzer.js.map +0 -1
- package/dist/core/docManager.d.ts +0 -48
- package/dist/core/docManager.js +0 -257
- package/dist/core/docManager.js.map +0 -1
- package/dist/core/docProcessor.d.ts +0 -20
- package/dist/core/docProcessor.js +0 -127
- package/dist/core/docProcessor.js.map +0 -1
- package/dist/core/mcpDocsServer.d.ts +0 -61
- package/dist/core/mcpDocsServer.js +0 -395
- package/dist/core/mcpDocsServer.js.map +0 -1
package/dist/core/docManager.js
DELETED
@@ -1,257 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
/**
|
3
|
-
* Document Manager for handling file operations
|
4
|
-
*/
|
5
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
6
|
-
if (k2 === undefined) k2 = k;
|
7
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
8
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
9
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
10
|
-
}
|
11
|
-
Object.defineProperty(o, k2, desc);
|
12
|
-
}) : (function(o, m, k, k2) {
|
13
|
-
if (k2 === undefined) k2 = k;
|
14
|
-
o[k2] = m[k];
|
15
|
-
}));
|
16
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
17
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
18
|
-
}) : function(o, v) {
|
19
|
-
o["default"] = v;
|
20
|
-
});
|
21
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
22
|
-
if (mod && mod.__esModule) return mod;
|
23
|
-
var result = {};
|
24
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
25
|
-
__setModuleDefault(result, mod);
|
26
|
-
return result;
|
27
|
-
};
|
28
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
29
|
-
exports.DocManager = void 0;
|
30
|
-
const fs = __importStar(require("fs"));
|
31
|
-
const fsPromises = __importStar(require("fs/promises"));
|
32
|
-
const path = __importStar(require("path"));
|
33
|
-
const docProcessor_js_1 = require("./docProcessor.js");
|
34
|
-
class DocManager {
|
35
|
-
constructor(baseDir = "./docs", options = {}) {
|
36
|
-
this.baseDir = baseDir;
|
37
|
-
this.options = {
|
38
|
-
createIfNotExists: options.createIfNotExists ?? false,
|
39
|
-
fileExtensions: options.fileExtensions ?? [".md", ".mdx"],
|
40
|
-
};
|
41
|
-
// Initialize directory if needed
|
42
|
-
this.initializeDirectory();
|
43
|
-
}
|
44
|
-
/**
|
45
|
-
* Initialize the docs directory
|
46
|
-
*/
|
47
|
-
initializeDirectory() {
|
48
|
-
try {
|
49
|
-
// Check if directory exists
|
50
|
-
fs.accessSync(this.baseDir);
|
51
|
-
console.error(`Using existing docs directory: ${this.baseDir}`);
|
52
|
-
}
|
53
|
-
catch (error) {
|
54
|
-
// Directory doesn't exist
|
55
|
-
if (this.options.createIfNotExists) {
|
56
|
-
try {
|
57
|
-
fs.mkdirSync(this.baseDir, { recursive: true });
|
58
|
-
console.error(`Created docs directory: ${this.baseDir}`);
|
59
|
-
// Create a sample README.md file in the new directory
|
60
|
-
const readmePath = path.join(this.baseDir, "README.md");
|
61
|
-
const readmeContent = `# Documentation\n\nThis directory was created by the MCP Documentation Service.\n`;
|
62
|
-
fs.writeFileSync(readmePath, readmeContent, "utf-8");
|
63
|
-
console.error(`Created sample README.md in ${this.baseDir}`);
|
64
|
-
}
|
65
|
-
catch (createError) {
|
66
|
-
console.error(`Failed to create docs directory: ${createError}`);
|
67
|
-
}
|
68
|
-
}
|
69
|
-
else {
|
70
|
-
console.error(`Docs directory doesn't exist: ${this.baseDir}`);
|
71
|
-
console.error("Use --create-dir option to create it automatically");
|
72
|
-
}
|
73
|
-
}
|
74
|
-
}
|
75
|
-
/**
|
76
|
-
* List all markdown files in a directory recursively
|
77
|
-
*/
|
78
|
-
async listMarkdownFiles(dir = "") {
|
79
|
-
const fullDir = path.join(this.baseDir, dir);
|
80
|
-
const files = [];
|
81
|
-
try {
|
82
|
-
const entries = await fsPromises.readdir(fullDir, {
|
83
|
-
withFileTypes: true,
|
84
|
-
});
|
85
|
-
for (const entry of entries) {
|
86
|
-
const entryPath = path.join(dir, entry.name).replace(/^\//, "");
|
87
|
-
if (entry.isDirectory()) {
|
88
|
-
const subDirFiles = await this.listMarkdownFiles(entryPath);
|
89
|
-
files.push(...subDirFiles);
|
90
|
-
}
|
91
|
-
else if (entry.isFile() && entry.name.endsWith(".md")) {
|
92
|
-
files.push(entryPath);
|
93
|
-
}
|
94
|
-
}
|
95
|
-
}
|
96
|
-
catch (error) {
|
97
|
-
console.error(`Error listing files in ${fullDir}:`, error);
|
98
|
-
}
|
99
|
-
return files;
|
100
|
-
}
|
101
|
-
/**
|
102
|
-
* Get document content and metadata
|
103
|
-
*/
|
104
|
-
async getDocument(filePath) {
|
105
|
-
try {
|
106
|
-
const fullPath = path.join(this.baseDir, filePath);
|
107
|
-
const content = await fsPromises.readFile(fullPath, "utf-8");
|
108
|
-
return (0, docProcessor_js_1.parseMarkdownWithFrontMatter)(filePath, content);
|
109
|
-
}
|
110
|
-
catch (error) {
|
111
|
-
console.error(`Error reading document ${filePath}:`, error);
|
112
|
-
return null;
|
113
|
-
}
|
114
|
-
}
|
115
|
-
/**
|
116
|
-
* List directories in the docs folder
|
117
|
-
*/
|
118
|
-
async listDirectories(dir = "") {
|
119
|
-
const fullDir = path.join(this.baseDir, dir);
|
120
|
-
const directories = [];
|
121
|
-
try {
|
122
|
-
const entries = await fsPromises.readdir(fullDir, {
|
123
|
-
withFileTypes: true,
|
124
|
-
});
|
125
|
-
for (const entry of entries) {
|
126
|
-
if (entry.isDirectory()) {
|
127
|
-
const dirPath = path.join(dir, entry.name).replace(/^\//, "");
|
128
|
-
directories.push(dirPath);
|
129
|
-
}
|
130
|
-
}
|
131
|
-
}
|
132
|
-
catch (error) {
|
133
|
-
console.error(`Error listing directories in ${fullDir}:`, error);
|
134
|
-
}
|
135
|
-
return directories;
|
136
|
-
}
|
137
|
-
/**
|
138
|
-
* Create a new document
|
139
|
-
*/
|
140
|
-
async createDocument(params) {
|
141
|
-
try {
|
142
|
-
// Ensure the path is valid
|
143
|
-
if (!params.path.endsWith(".md")) {
|
144
|
-
params.path = `${params.path}.md`;
|
145
|
-
}
|
146
|
-
// Build the full file content with front matter
|
147
|
-
const fileContent = (0, docProcessor_js_1.combineMetadataAndContent)(params.metadata, params.content);
|
148
|
-
// Ensure directory exists
|
149
|
-
const fullPath = path.join(this.baseDir, params.path);
|
150
|
-
const dirPath = path.dirname(fullPath);
|
151
|
-
await fsPromises.mkdir(dirPath, { recursive: true });
|
152
|
-
// Write the file
|
153
|
-
await fsPromises.writeFile(fullPath, fileContent, "utf-8");
|
154
|
-
return true;
|
155
|
-
}
|
156
|
-
catch (error) {
|
157
|
-
console.error(`Error creating document ${params.path}:`, error);
|
158
|
-
return false;
|
159
|
-
}
|
160
|
-
}
|
161
|
-
/**
|
162
|
-
* Update an existing document
|
163
|
-
*/
|
164
|
-
async updateDocument(params) {
|
165
|
-
try {
|
166
|
-
// Get the existing document
|
167
|
-
const doc = await this.getDocument(params.path);
|
168
|
-
if (!doc) {
|
169
|
-
return false;
|
170
|
-
}
|
171
|
-
// Update metadata and content as needed
|
172
|
-
const updatedMetadata = { ...doc.metadata, ...(params.metadata || {}) };
|
173
|
-
const updatedContent = params.content !== undefined ? params.content : doc.content;
|
174
|
-
// Build the full file content with front matter
|
175
|
-
const fileContent = (0, docProcessor_js_1.combineMetadataAndContent)(updatedMetadata, updatedContent);
|
176
|
-
// Write the file
|
177
|
-
const fullPath = path.join(this.baseDir, params.path);
|
178
|
-
await fsPromises.writeFile(fullPath, fileContent, "utf-8");
|
179
|
-
return true;
|
180
|
-
}
|
181
|
-
catch (error) {
|
182
|
-
console.error(`Error updating document ${params.path}:`, error);
|
183
|
-
return false;
|
184
|
-
}
|
185
|
-
}
|
186
|
-
/**
|
187
|
-
* Delete a document
|
188
|
-
*/
|
189
|
-
async deleteDocument(filePath) {
|
190
|
-
try {
|
191
|
-
const fullPath = path.join(this.baseDir, filePath);
|
192
|
-
await fsPromises.unlink(fullPath);
|
193
|
-
return true;
|
194
|
-
}
|
195
|
-
catch (error) {
|
196
|
-
console.error(`Error deleting document ${filePath}:`, error);
|
197
|
-
return false;
|
198
|
-
}
|
199
|
-
}
|
200
|
-
/**
|
201
|
-
* Basic search for documents matching query
|
202
|
-
*/
|
203
|
-
async searchDocuments(options) {
|
204
|
-
const { query, tags, status, directory } = options;
|
205
|
-
const results = [];
|
206
|
-
// Get all markdown files in the specified directory or all if not specified
|
207
|
-
const files = await this.listMarkdownFiles(directory || "");
|
208
|
-
// Filter and search through files
|
209
|
-
for (const filePath of files) {
|
210
|
-
const doc = await this.getDocument(filePath);
|
211
|
-
if (!doc)
|
212
|
-
continue;
|
213
|
-
// Check if document matches search criteria
|
214
|
-
const searchableText = `${doc.metadata.title} ${doc.metadata.description || ""} ${doc.content}`.toLowerCase();
|
215
|
-
const matchesQuery = !query || searchableText.includes(query.toLowerCase());
|
216
|
-
const matchesTags = !tags ||
|
217
|
-
!tags.length ||
|
218
|
-
(doc.metadata.tags &&
|
219
|
-
tags.some((tag) => doc.metadata.tags?.includes(tag)));
|
220
|
-
const matchesStatus = !status || doc.metadata.status === status;
|
221
|
-
if (matchesQuery && matchesTags && matchesStatus) {
|
222
|
-
results.push({
|
223
|
-
title: doc.metadata.title,
|
224
|
-
description: doc.metadata.description,
|
225
|
-
path: doc.path,
|
226
|
-
lastUpdated: doc.metadata.lastUpdated,
|
227
|
-
tags: doc.metadata.tags,
|
228
|
-
status: doc.metadata.status,
|
229
|
-
});
|
230
|
-
}
|
231
|
-
}
|
232
|
-
return results;
|
233
|
-
}
|
234
|
-
/**
|
235
|
-
* Get all documents as summaries
|
236
|
-
*/
|
237
|
-
async getAllDocumentSummaries(directory) {
|
238
|
-
const files = await this.listMarkdownFiles(directory || "");
|
239
|
-
const summaries = [];
|
240
|
-
for (const filePath of files) {
|
241
|
-
const doc = await this.getDocument(filePath);
|
242
|
-
if (!doc)
|
243
|
-
continue;
|
244
|
-
summaries.push({
|
245
|
-
title: doc.metadata.title,
|
246
|
-
description: doc.metadata.description,
|
247
|
-
path: doc.path,
|
248
|
-
lastUpdated: doc.metadata.lastUpdated,
|
249
|
-
tags: doc.metadata.tags,
|
250
|
-
status: doc.metadata.status,
|
251
|
-
});
|
252
|
-
}
|
253
|
-
return summaries;
|
254
|
-
}
|
255
|
-
}
|
256
|
-
exports.DocManager = DocManager;
|
257
|
-
//# sourceMappingURL=docManager.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"docManager.js","sourceRoot":"","sources":["../../src/core/docManager.ts"],"names":[],"mappings":"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"}
|
@@ -1,20 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Document processor for handling markdown files with front matter
|
3
|
-
*/
|
4
|
-
import { DocContent, DocMetadata } from "../types/index.js";
|
5
|
-
/**
|
6
|
-
* Parses front matter and content from a markdown file
|
7
|
-
* Front matter format is YAML between triple dashes:
|
8
|
-
* ---
|
9
|
-
* key: value
|
10
|
-
* ---
|
11
|
-
*/
|
12
|
-
export declare function parseMarkdownWithFrontMatter(filePath: string, content: string): DocContent;
|
13
|
-
/**
|
14
|
-
* Creates front matter text from metadata
|
15
|
-
*/
|
16
|
-
export declare function createFrontMatter(metadata: DocMetadata): string;
|
17
|
-
/**
|
18
|
-
* Combines metadata and content into a full document
|
19
|
-
*/
|
20
|
-
export declare function combineMetadataAndContent(metadata: DocMetadata, content: string): string;
|
@@ -1,127 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
/**
|
3
|
-
* Document processor for handling markdown files with front matter
|
4
|
-
*/
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
-
exports.combineMetadataAndContent = exports.createFrontMatter = exports.parseMarkdownWithFrontMatter = void 0;
|
7
|
-
/**
|
8
|
-
* Parses front matter and content from a markdown file
|
9
|
-
* Front matter format is YAML between triple dashes:
|
10
|
-
* ---
|
11
|
-
* key: value
|
12
|
-
* ---
|
13
|
-
*/
|
14
|
-
function parseMarkdownWithFrontMatter(filePath, content) {
|
15
|
-
const metadata = {
|
16
|
-
title: extractTitleFromContent(content) || extractTitleFromPath(filePath),
|
17
|
-
};
|
18
|
-
// Check if the content has front matter
|
19
|
-
const frontMatterRegex = /^---\s*\n([\s\S]*?)\n---\s*\n/;
|
20
|
-
const match = content.match(frontMatterRegex);
|
21
|
-
if (match) {
|
22
|
-
const frontMatterText = match[1];
|
23
|
-
const frontMatterLines = frontMatterText.split("\n");
|
24
|
-
// Parse front matter lines
|
25
|
-
for (const line of frontMatterLines) {
|
26
|
-
const lineTrimmed = line.trim();
|
27
|
-
if (!lineTrimmed || lineTrimmed.startsWith("#"))
|
28
|
-
continue;
|
29
|
-
const colonIndex = lineTrimmed.indexOf(":");
|
30
|
-
if (colonIndex > 0) {
|
31
|
-
const key = lineTrimmed.slice(0, colonIndex).trim();
|
32
|
-
const value = lineTrimmed.slice(colonIndex + 1).trim();
|
33
|
-
// Handle special front matter keys safely
|
34
|
-
if (key === "globs" || key === "tags") {
|
35
|
-
try {
|
36
|
-
// If it's a YAML array, parse it
|
37
|
-
if (value.startsWith("[") && value.endsWith("]")) {
|
38
|
-
const arrayItems = value
|
39
|
-
.slice(1, -1)
|
40
|
-
.split(",")
|
41
|
-
.map((item) => item.trim().replace(/^['"]|['"]$/g, ""));
|
42
|
-
metadata[key] = arrayItems;
|
43
|
-
}
|
44
|
-
else {
|
45
|
-
metadata[key] = [value];
|
46
|
-
}
|
47
|
-
}
|
48
|
-
catch (e) {
|
49
|
-
console.error(`Error parsing ${key} in ${filePath}:`, e);
|
50
|
-
}
|
51
|
-
}
|
52
|
-
else if (key === "alwaysApply") {
|
53
|
-
metadata.alwaysApply = value.toLowerCase() === "true";
|
54
|
-
}
|
55
|
-
else {
|
56
|
-
metadata[key] = value;
|
57
|
-
}
|
58
|
-
}
|
59
|
-
}
|
60
|
-
// Remove front matter from content
|
61
|
-
content = content.replace(frontMatterRegex, "");
|
62
|
-
}
|
63
|
-
return {
|
64
|
-
metadata,
|
65
|
-
content,
|
66
|
-
path: filePath,
|
67
|
-
};
|
68
|
-
}
|
69
|
-
exports.parseMarkdownWithFrontMatter = parseMarkdownWithFrontMatter;
|
70
|
-
/**
|
71
|
-
* Creates front matter text from metadata
|
72
|
-
*/
|
73
|
-
function createFrontMatter(metadata) {
|
74
|
-
const lines = ["---"];
|
75
|
-
// Add each metadata field
|
76
|
-
for (const [key, value] of Object.entries(metadata)) {
|
77
|
-
if (value === undefined)
|
78
|
-
continue;
|
79
|
-
if (Array.isArray(value)) {
|
80
|
-
// Use simple format for compatibility
|
81
|
-
lines.push(`${key}:`);
|
82
|
-
for (const item of value) {
|
83
|
-
lines.push(` - ${item}`);
|
84
|
-
}
|
85
|
-
}
|
86
|
-
else if (typeof value === "boolean") {
|
87
|
-
lines.push(`${key}: ${value}`);
|
88
|
-
}
|
89
|
-
else {
|
90
|
-
lines.push(`${key}: ${value}`);
|
91
|
-
}
|
92
|
-
}
|
93
|
-
lines.push("---");
|
94
|
-
lines.push("");
|
95
|
-
return lines.join("\n");
|
96
|
-
}
|
97
|
-
exports.createFrontMatter = createFrontMatter;
|
98
|
-
/**
|
99
|
-
* Extracts title from content (first h1)
|
100
|
-
*/
|
101
|
-
function extractTitleFromContent(content) {
|
102
|
-
const h1Match = content.match(/^#\s+(.+)$/m);
|
103
|
-
if (h1Match) {
|
104
|
-
return h1Match[1].trim();
|
105
|
-
}
|
106
|
-
return null;
|
107
|
-
}
|
108
|
-
/**
|
109
|
-
* Extracts title from file path
|
110
|
-
*/
|
111
|
-
function extractTitleFromPath(filePath) {
|
112
|
-
const baseName = filePath.split("/").pop() || "";
|
113
|
-
const withoutExtension = baseName.replace(/\.md$/, "");
|
114
|
-
return withoutExtension
|
115
|
-
.split("-")
|
116
|
-
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
|
117
|
-
.join(" ");
|
118
|
-
}
|
119
|
-
/**
|
120
|
-
* Combines metadata and content into a full document
|
121
|
-
*/
|
122
|
-
function combineMetadataAndContent(metadata, content) {
|
123
|
-
const frontMatter = createFrontMatter(metadata);
|
124
|
-
return `${frontMatter}${content}`;
|
125
|
-
}
|
126
|
-
exports.combineMetadataAndContent = combineMetadataAndContent;
|
127
|
-
//# sourceMappingURL=docProcessor.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"docProcessor.js","sourceRoot":"","sources":["../../src/core/docProcessor.ts"],"names":[],"mappings":"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"}
|
@@ -1,61 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* MCP Documentation Management Server
|
3
|
-
* This server implements the Model Context Protocol for managing documentation
|
4
|
-
*/
|
5
|
-
import { MCPQueryResult } from "../types/index.js";
|
6
|
-
export declare class MCPDocsServer {
|
7
|
-
private docManager;
|
8
|
-
private docAnalyzer;
|
9
|
-
constructor(docsDir?: string, options?: {
|
10
|
-
createIfNotExists?: boolean;
|
11
|
-
fileExtensions?: string[];
|
12
|
-
});
|
13
|
-
/**
|
14
|
-
* Execute a query using the MCP protocol
|
15
|
-
*/
|
16
|
-
executeQuery(sql: string): Promise<MCPQueryResult>;
|
17
|
-
/**
|
18
|
-
* Parse a query string into command and parameters
|
19
|
-
*/
|
20
|
-
private parseQuery;
|
21
|
-
/**
|
22
|
-
* List all markdown files
|
23
|
-
*/
|
24
|
-
private listFiles;
|
25
|
-
/**
|
26
|
-
* List all directories
|
27
|
-
*/
|
28
|
-
private listDirectories;
|
29
|
-
/**
|
30
|
-
* Get a document by path
|
31
|
-
*/
|
32
|
-
private getDocument;
|
33
|
-
/**
|
34
|
-
* Search for documents
|
35
|
-
*/
|
36
|
-
private searchDocuments;
|
37
|
-
/**
|
38
|
-
* Create a new document
|
39
|
-
*/
|
40
|
-
private createDocument;
|
41
|
-
/**
|
42
|
-
* Update an existing document
|
43
|
-
*/
|
44
|
-
private updateDocument;
|
45
|
-
/**
|
46
|
-
* Delete a document
|
47
|
-
*/
|
48
|
-
private deleteDocument;
|
49
|
-
/**
|
50
|
-
* Analyze documentation
|
51
|
-
*/
|
52
|
-
private analyzeDocumentation;
|
53
|
-
/**
|
54
|
-
* Get documentation health score
|
55
|
-
*/
|
56
|
-
private getHealthScore;
|
57
|
-
/**
|
58
|
-
* Get suggestions for improving documentation
|
59
|
-
*/
|
60
|
-
private getSuggestions;
|
61
|
-
}
|