@gulibs/safe-coder 0.0.26 → 0.0.28
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 +678 -994
- package/dist/cache/cache-manager.d.ts +71 -0
- package/dist/cache/cache-manager.d.ts.map +1 -0
- package/dist/cache/cache-manager.js +244 -0
- package/dist/cache/cache-manager.js.map +1 -0
- package/dist/executor/cli-executor.d.ts +116 -0
- package/dist/executor/cli-executor.d.ts.map +1 -0
- package/dist/executor/cli-executor.js +140 -0
- package/dist/executor/cli-executor.js.map +1 -0
- package/dist/executor/dependency-checker.d.ts +23 -0
- package/dist/executor/dependency-checker.d.ts.map +1 -0
- package/dist/executor/dependency-checker.js +62 -0
- package/dist/executor/dependency-checker.js.map +1 -0
- package/dist/index.js +3 -4
- package/dist/index.js.map +1 -1
- package/dist/processor/content-processor.d.ts +76 -0
- package/dist/processor/content-processor.d.ts.map +1 -0
- package/dist/processor/content-processor.js +182 -0
- package/dist/processor/content-processor.js.map +1 -0
- package/dist/processor/guide-generator.d.ts +68 -0
- package/dist/processor/guide-generator.d.ts.map +1 -0
- package/dist/processor/guide-generator.js +189 -0
- package/dist/processor/guide-generator.js.map +1 -0
- package/dist/server/safe-coder-mcp.d.ts +18 -0
- package/dist/server/safe-coder-mcp.d.ts.map +1 -0
- package/dist/server/safe-coder-mcp.js +171 -0
- package/dist/server/safe-coder-mcp.js.map +1 -0
- package/dist/tools/cache-tools.d.ts +42 -0
- package/dist/tools/cache-tools.d.ts.map +1 -0
- package/dist/tools/cache-tools.js +70 -0
- package/dist/tools/cache-tools.js.map +1 -0
- package/dist/tools/crawl-documentation.d.ts +78 -0
- package/dist/tools/crawl-documentation.d.ts.map +1 -0
- package/dist/tools/crawl-documentation.js +103 -0
- package/dist/tools/crawl-documentation.js.map +1 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/save-skill.d.ts +49 -0
- package/dist/tools/save-skill.d.ts.map +1 -0
- package/dist/tools/save-skill.js +207 -0
- package/dist/tools/save-skill.js.map +1 -0
- package/package.json +18 -28
- package/dist/documentation/browser-doc-browser.d.ts +0 -41
- package/dist/documentation/browser-doc-browser.d.ts.map +0 -1
- package/dist/documentation/browser-doc-browser.js +0 -357
- package/dist/documentation/browser-doc-browser.js.map +0 -1
- package/dist/documentation/browser-manager.d.ts +0 -51
- package/dist/documentation/browser-manager.d.ts.map +0 -1
- package/dist/documentation/browser-manager.js +0 -260
- package/dist/documentation/browser-manager.js.map +0 -1
- package/dist/documentation/cache.d.ts +0 -13
- package/dist/documentation/cache.d.ts.map +0 -1
- package/dist/documentation/cache.js +0 -48
- package/dist/documentation/cache.js.map +0 -1
- package/dist/documentation/checkpoint-manager.d.ts +0 -38
- package/dist/documentation/checkpoint-manager.d.ts.map +0 -1
- package/dist/documentation/checkpoint-manager.js +0 -101
- package/dist/documentation/checkpoint-manager.js.map +0 -1
- package/dist/documentation/doc-crawler.d.ts +0 -221
- package/dist/documentation/doc-crawler.d.ts.map +0 -1
- package/dist/documentation/doc-crawler.js +0 -1415
- package/dist/documentation/doc-crawler.js.map +0 -1
- package/dist/documentation/github-client.d.ts +0 -13
- package/dist/documentation/github-client.d.ts.map +0 -1
- package/dist/documentation/github-client.js +0 -90
- package/dist/documentation/github-client.js.map +0 -1
- package/dist/documentation/http-fetcher.d.ts +0 -8
- package/dist/documentation/http-fetcher.d.ts.map +0 -1
- package/dist/documentation/http-fetcher.js +0 -31
- package/dist/documentation/http-fetcher.js.map +0 -1
- package/dist/documentation/index.d.ts +0 -16
- package/dist/documentation/index.d.ts.map +0 -1
- package/dist/documentation/index.js +0 -159
- package/dist/documentation/index.js.map +0 -1
- package/dist/documentation/llms-txt/detector.d.ts +0 -31
- package/dist/documentation/llms-txt/detector.d.ts.map +0 -1
- package/dist/documentation/llms-txt/detector.js +0 -77
- package/dist/documentation/llms-txt/detector.js.map +0 -1
- package/dist/documentation/llms-txt/downloader.d.ts +0 -30
- package/dist/documentation/llms-txt/downloader.d.ts.map +0 -1
- package/dist/documentation/llms-txt/downloader.js +0 -84
- package/dist/documentation/llms-txt/downloader.js.map +0 -1
- package/dist/documentation/llms-txt/index.d.ts +0 -4
- package/dist/documentation/llms-txt/index.d.ts.map +0 -1
- package/dist/documentation/llms-txt/index.js +0 -4
- package/dist/documentation/llms-txt/index.js.map +0 -1
- package/dist/documentation/llms-txt/parser.d.ts +0 -43
- package/dist/documentation/llms-txt/parser.d.ts.map +0 -1
- package/dist/documentation/llms-txt/parser.js +0 -177
- package/dist/documentation/llms-txt/parser.js.map +0 -1
- package/dist/documentation/normalizer.d.ts +0 -6
- package/dist/documentation/normalizer.d.ts.map +0 -1
- package/dist/documentation/normalizer.js +0 -38
- package/dist/documentation/normalizer.js.map +0 -1
- package/dist/documentation/npm-client.d.ts +0 -19
- package/dist/documentation/npm-client.d.ts.map +0 -1
- package/dist/documentation/npm-client.js +0 -182
- package/dist/documentation/npm-client.js.map +0 -1
- package/dist/documentation/skill-generator.d.ts +0 -108
- package/dist/documentation/skill-generator.d.ts.map +0 -1
- package/dist/documentation/skill-generator.js +0 -642
- package/dist/documentation/skill-generator.js.map +0 -1
- package/dist/documentation/web-doc-browser.d.ts +0 -67
- package/dist/documentation/web-doc-browser.d.ts.map +0 -1
- package/dist/documentation/web-doc-browser.js +0 -555
- package/dist/documentation/web-doc-browser.js.map +0 -1
- package/dist/errors/api-validator.d.ts +0 -9
- package/dist/errors/api-validator.d.ts.map +0 -1
- package/dist/errors/api-validator.js +0 -57
- package/dist/errors/api-validator.js.map +0 -1
- package/dist/errors/contextual-analysis.d.ts +0 -14
- package/dist/errors/contextual-analysis.d.ts.map +0 -1
- package/dist/errors/contextual-analysis.js +0 -173
- package/dist/errors/contextual-analysis.js.map +0 -1
- package/dist/errors/cross-file-analyzer.d.ts +0 -16
- package/dist/errors/cross-file-analyzer.d.ts.map +0 -1
- package/dist/errors/cross-file-analyzer.js +0 -172
- package/dist/errors/cross-file-analyzer.js.map +0 -1
- package/dist/errors/eslint-integration.d.ts +0 -9
- package/dist/errors/eslint-integration.d.ts.map +0 -1
- package/dist/errors/eslint-integration.js +0 -131
- package/dist/errors/eslint-integration.js.map +0 -1
- package/dist/errors/framework-detector.d.ts +0 -10
- package/dist/errors/framework-detector.d.ts.map +0 -1
- package/dist/errors/framework-detector.js +0 -126
- package/dist/errors/framework-detector.js.map +0 -1
- package/dist/errors/index.d.ts +0 -18
- package/dist/errors/index.d.ts.map +0 -1
- package/dist/errors/index.js +0 -134
- package/dist/errors/index.js.map +0 -1
- package/dist/errors/pattern-matcher.d.ts +0 -25
- package/dist/errors/pattern-matcher.d.ts.map +0 -1
- package/dist/errors/pattern-matcher.js +0 -44
- package/dist/errors/pattern-matcher.js.map +0 -1
- package/dist/errors/patterns.d.ts +0 -11
- package/dist/errors/patterns.d.ts.map +0 -1
- package/dist/errors/patterns.js +0 -351
- package/dist/errors/patterns.js.map +0 -1
- package/dist/errors/performance-detector.d.ts +0 -11
- package/dist/errors/performance-detector.d.ts.map +0 -1
- package/dist/errors/performance-detector.js +0 -119
- package/dist/errors/performance-detector.js.map +0 -1
- package/dist/errors/runtime-detector.d.ts +0 -7
- package/dist/errors/runtime-detector.d.ts.map +0 -1
- package/dist/errors/runtime-detector.js +0 -86
- package/dist/errors/runtime-detector.js.map +0 -1
- package/dist/errors/security-detector.d.ts +0 -6
- package/dist/errors/security-detector.d.ts.map +0 -1
- package/dist/errors/security-detector.js +0 -75
- package/dist/errors/security-detector.js.map +0 -1
- package/dist/errors/typescript-integration.d.ts +0 -6
- package/dist/errors/typescript-integration.d.ts.map +0 -1
- package/dist/errors/typescript-integration.js +0 -46
- package/dist/errors/typescript-integration.js.map +0 -1
- package/dist/server/mcp-server.d.ts +0 -14
- package/dist/server/mcp-server.d.ts.map +0 -1
- package/dist/server/mcp-server.js +0 -793
- package/dist/server/mcp-server.js.map +0 -1
- package/dist/types/documentation.d.ts +0 -26
- package/dist/types/documentation.d.ts.map +0 -1
- package/dist/types/documentation.js +0 -2
- package/dist/types/documentation.js.map +0 -1
- package/dist/utils/config.d.ts +0 -21
- package/dist/utils/config.d.ts.map +0 -1
- package/dist/utils/config.js +0 -34
- package/dist/utils/config.js.map +0 -1
- package/dist/utils/http-client.d.ts +0 -17
- package/dist/utils/http-client.d.ts.map +0 -1
- package/dist/utils/http-client.js +0 -62
- package/dist/utils/http-client.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -36
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -128
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/rate-limiter.d.ts +0 -9
- package/dist/utils/rate-limiter.d.ts.map +0 -1
- package/dist/utils/rate-limiter.js +0 -26
- package/dist/utils/rate-limiter.js.map +0 -1
- package/dist/validation/auto-fix.d.ts +0 -15
- package/dist/validation/auto-fix.d.ts.map +0 -1
- package/dist/validation/auto-fix.js +0 -49
- package/dist/validation/auto-fix.js.map +0 -1
- package/dist/validation/index.d.ts +0 -21
- package/dist/validation/index.d.ts.map +0 -1
- package/dist/validation/index.js +0 -45
- package/dist/validation/index.js.map +0 -1
- package/dist/validation/resolution-db.d.ts +0 -15
- package/dist/validation/resolution-db.d.ts.map +0 -1
- package/dist/validation/resolution-db.js +0 -62
- package/dist/validation/resolution-db.js.map +0 -1
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
+
import { crawlDocumentation, CrawlDocumentationSchema, listCachedDocumentation, clearCache, ClearCacheSchema, saveSkill, SaveSkillSchema, } from '../tools/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* Safe Coder MCP Server
|
|
7
|
+
* Orchestrates safe-coder-cli for documentation crawling and SKILL generation
|
|
8
|
+
*/
|
|
9
|
+
export class SafeCoderMCPServer {
|
|
10
|
+
server;
|
|
11
|
+
constructor() {
|
|
12
|
+
this.server = new McpServer({
|
|
13
|
+
name: 'safe-coder',
|
|
14
|
+
version: '1.0.0',
|
|
15
|
+
});
|
|
16
|
+
this.setupTools();
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Register MCP tools
|
|
20
|
+
*/
|
|
21
|
+
setupTools() {
|
|
22
|
+
// ✅ Register crawl_documentation tool - 更新描述
|
|
23
|
+
this.server.registerTool('crawl_documentation', {
|
|
24
|
+
title: 'Crawl Documentation and Generate SKILL',
|
|
25
|
+
description: 'Crawl documentation website and automatically generate a complete Agent SKILL. ' +
|
|
26
|
+
'This tool saves files directly to disk and returns only a lightweight summary. ' +
|
|
27
|
+
'The CLI generates a high-quality SKILL.md (< 500 lines) based on complete content analysis, ' +
|
|
28
|
+
'along with organized reference files. Agent receives only the summary to minimize token cost. ' +
|
|
29
|
+
'\n\nRequired: url, skillName. ' +
|
|
30
|
+
'Optional: maxPages (default 50), depth (default 3), outputDir (default ~/.claude/skills), ' +
|
|
31
|
+
'workers, browser, spaStrategy, useCache, forceRefresh. ' +
|
|
32
|
+
'\n\nExample: crawl_documentation({ url: "https://react.dev", skillName: "react-docs", maxPages: 50 })',
|
|
33
|
+
inputSchema: CrawlDocumentationSchema,
|
|
34
|
+
}, async (args) => {
|
|
35
|
+
try {
|
|
36
|
+
const result = await crawlDocumentation(args);
|
|
37
|
+
return {
|
|
38
|
+
content: [
|
|
39
|
+
{
|
|
40
|
+
type: 'text',
|
|
41
|
+
text: JSON.stringify(result, null, 2),
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
48
|
+
return {
|
|
49
|
+
content: [
|
|
50
|
+
{
|
|
51
|
+
type: 'text',
|
|
52
|
+
text: JSON.stringify({
|
|
53
|
+
success: false,
|
|
54
|
+
error: errorMessage,
|
|
55
|
+
}, null, 2),
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
isError: true,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
// Register list_cached_documentation tool
|
|
63
|
+
this.server.registerTool('list_cached_documentation', {
|
|
64
|
+
title: 'List Cached Documentation',
|
|
65
|
+
description: 'List all cached documentation crawl results with metadata. No parameters required.',
|
|
66
|
+
inputSchema: {},
|
|
67
|
+
}, async () => {
|
|
68
|
+
try {
|
|
69
|
+
const result = await listCachedDocumentation();
|
|
70
|
+
return {
|
|
71
|
+
content: [
|
|
72
|
+
{
|
|
73
|
+
type: 'text',
|
|
74
|
+
text: JSON.stringify(result, null, 2),
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
81
|
+
return {
|
|
82
|
+
content: [
|
|
83
|
+
{
|
|
84
|
+
type: 'text',
|
|
85
|
+
text: JSON.stringify({
|
|
86
|
+
success: false,
|
|
87
|
+
error: errorMessage,
|
|
88
|
+
}, null, 2),
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
isError: true,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
// Register clear_cache tool
|
|
96
|
+
this.server.registerTool('clear_cache', {
|
|
97
|
+
title: 'Clear Cache',
|
|
98
|
+
description: 'Clear cached documentation results. Parameters: urlPattern (optional string) - URL pattern to match, clearAll (optional boolean) - clear all entries. If no parameters, clears only expired entries.',
|
|
99
|
+
inputSchema: ClearCacheSchema,
|
|
100
|
+
}, async (args) => {
|
|
101
|
+
try {
|
|
102
|
+
const result = await clearCache(args || {});
|
|
103
|
+
return {
|
|
104
|
+
content: [
|
|
105
|
+
{
|
|
106
|
+
type: 'text',
|
|
107
|
+
text: JSON.stringify(result, null, 2),
|
|
108
|
+
},
|
|
109
|
+
],
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
114
|
+
return {
|
|
115
|
+
content: [
|
|
116
|
+
{
|
|
117
|
+
type: 'text',
|
|
118
|
+
text: JSON.stringify({
|
|
119
|
+
success: false,
|
|
120
|
+
error: errorMessage,
|
|
121
|
+
}, null, 2),
|
|
122
|
+
},
|
|
123
|
+
],
|
|
124
|
+
isError: true,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
// Register save_skill tool
|
|
129
|
+
this.server.registerTool('save_skill', {
|
|
130
|
+
title: 'Save SKILL Files',
|
|
131
|
+
description: 'Save complete SKILL directory structure (SKILL.md + references/) to filesystem. Creates a properly formatted Cursor Agent Skill with all reference documentation organized by category. Parameters: skillName (required string) - name for skill directory, skillContent (required string) - SKILL.md content, referenceFiles (optional object) - map of category -> markdown content, baseDirectory (optional string, default ~/.claude/skills) - base directory for skills, overwrite (optional boolean, default false) - overwrite existing skill.',
|
|
132
|
+
inputSchema: SaveSkillSchema,
|
|
133
|
+
}, async (args) => {
|
|
134
|
+
try {
|
|
135
|
+
const result = await saveSkill(args);
|
|
136
|
+
return {
|
|
137
|
+
content: [
|
|
138
|
+
{
|
|
139
|
+
type: 'text',
|
|
140
|
+
text: JSON.stringify(result, null, 2),
|
|
141
|
+
},
|
|
142
|
+
],
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
147
|
+
return {
|
|
148
|
+
content: [
|
|
149
|
+
{
|
|
150
|
+
type: 'text',
|
|
151
|
+
text: JSON.stringify({
|
|
152
|
+
success: false,
|
|
153
|
+
error: errorMessage,
|
|
154
|
+
}, null, 2),
|
|
155
|
+
},
|
|
156
|
+
],
|
|
157
|
+
isError: true,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Start the MCP server
|
|
164
|
+
*/
|
|
165
|
+
async run() {
|
|
166
|
+
const transport = new StdioServerTransport();
|
|
167
|
+
await this.server.connect(transport);
|
|
168
|
+
console.error('Safe Coder MCP Server running on stdio');
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=safe-coder-mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-coder-mcp.js","sourceRoot":"","sources":["../../src/server/safe-coder-mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* List cached documentation schema
|
|
4
|
+
*/
|
|
5
|
+
export declare const ListCachedDocumentationSchema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
|
|
6
|
+
/**
|
|
7
|
+
* Clear cache schema
|
|
8
|
+
*/
|
|
9
|
+
export declare const ClearCacheSchema: z.ZodObject<{
|
|
10
|
+
urlPattern: z.ZodOptional<z.ZodString>;
|
|
11
|
+
clearAll: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
12
|
+
}, "strip", z.ZodTypeAny, {
|
|
13
|
+
clearAll: boolean;
|
|
14
|
+
urlPattern?: string | undefined;
|
|
15
|
+
}, {
|
|
16
|
+
urlPattern?: string | undefined;
|
|
17
|
+
clearAll?: boolean | undefined;
|
|
18
|
+
}>;
|
|
19
|
+
export type ClearCacheInput = z.infer<typeof ClearCacheSchema>;
|
|
20
|
+
/**
|
|
21
|
+
* List cached documentation
|
|
22
|
+
*/
|
|
23
|
+
export declare function listCachedDocumentation(): Promise<{
|
|
24
|
+
success: boolean;
|
|
25
|
+
entries: import("../cache/cache-manager.js").CacheEntry[];
|
|
26
|
+
statistics: {
|
|
27
|
+
totalEntries: number;
|
|
28
|
+
totalSize: string;
|
|
29
|
+
oldestEntry: string | undefined;
|
|
30
|
+
newestEntry: string | undefined;
|
|
31
|
+
};
|
|
32
|
+
message: string;
|
|
33
|
+
}>;
|
|
34
|
+
/**
|
|
35
|
+
* Clear cache
|
|
36
|
+
*/
|
|
37
|
+
export declare function clearCache(input: ClearCacheInput): Promise<{
|
|
38
|
+
success: boolean;
|
|
39
|
+
deletedCount: number;
|
|
40
|
+
message: string;
|
|
41
|
+
}>;
|
|
42
|
+
//# sourceMappingURL=cache-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-tools.d.ts","sourceRoot":"","sources":["../../src/tools/cache-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;GAEG;AACH,eAAO,MAAM,6BAA6B,gDAAe,CAAC;AAE1D;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;EAG3B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE/D;;GAEG;AACH,wBAAsB,uBAAuB;;;;;;;;;;GAiB5C;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe;;;;GAuBtD"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { CacheManager } from '../cache/cache-manager.js';
|
|
3
|
+
/**
|
|
4
|
+
* List cached documentation schema
|
|
5
|
+
*/
|
|
6
|
+
export const ListCachedDocumentationSchema = z.object({});
|
|
7
|
+
/**
|
|
8
|
+
* Clear cache schema
|
|
9
|
+
*/
|
|
10
|
+
export const ClearCacheSchema = z.object({
|
|
11
|
+
urlPattern: z.string().optional().describe('URL pattern to match for deletion (optional)'),
|
|
12
|
+
clearAll: z.boolean().optional().default(false).describe('Clear all cached entries'),
|
|
13
|
+
});
|
|
14
|
+
/**
|
|
15
|
+
* List cached documentation
|
|
16
|
+
*/
|
|
17
|
+
export async function listCachedDocumentation() {
|
|
18
|
+
const cache = new CacheManager();
|
|
19
|
+
const entries = await cache.list();
|
|
20
|
+
const stats = await cache.getStats();
|
|
21
|
+
return {
|
|
22
|
+
success: true,
|
|
23
|
+
entries,
|
|
24
|
+
statistics: {
|
|
25
|
+
totalEntries: stats.totalEntries,
|
|
26
|
+
totalSize: formatBytes(stats.totalSize),
|
|
27
|
+
oldestEntry: stats.oldestEntry?.toISOString(),
|
|
28
|
+
newestEntry: stats.newestEntry?.toISOString(),
|
|
29
|
+
},
|
|
30
|
+
message: `Found ${entries.length} cached documentation${entries.length !== 1 ? 's' : ''}`,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Clear cache
|
|
35
|
+
*/
|
|
36
|
+
export async function clearCache(input) {
|
|
37
|
+
const cache = new CacheManager();
|
|
38
|
+
let deletedCount;
|
|
39
|
+
let message;
|
|
40
|
+
if (input.clearAll) {
|
|
41
|
+
deletedCount = await cache.clear();
|
|
42
|
+
message = `Cleared all cache: deleted ${deletedCount} entry${deletedCount !== 1 ? 'ies' : 'y'}`;
|
|
43
|
+
}
|
|
44
|
+
else if (input.urlPattern) {
|
|
45
|
+
deletedCount = await cache.clear(input.urlPattern);
|
|
46
|
+
message = `Cleared cache matching "${input.urlPattern}": deleted ${deletedCount} entry${deletedCount !== 1 ? 'ies' : 'y'}`;
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
// Clear expired only
|
|
50
|
+
deletedCount = await cache.clearExpired();
|
|
51
|
+
message = `Cleared expired cache: deleted ${deletedCount} entry${deletedCount !== 1 ? 'ies' : 'y'}`;
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
success: true,
|
|
55
|
+
deletedCount,
|
|
56
|
+
message,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Format bytes to human-readable format
|
|
61
|
+
*/
|
|
62
|
+
function formatBytes(bytes) {
|
|
63
|
+
if (bytes === 0)
|
|
64
|
+
return '0 Bytes';
|
|
65
|
+
const k = 1024;
|
|
66
|
+
const sizes = ['Bytes', 'KB', 'MB', 'GB'];
|
|
67
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
68
|
+
return `${Math.round(bytes / Math.pow(k, i) * 100) / 100} ${sizes[i]}`;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=cache-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-tools.js","sourceRoot":"","sources":["../../src/tools/cache-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Input schema for crawl_documentation tool
|
|
4
|
+
*/
|
|
5
|
+
export declare const CrawlDocumentationSchema: z.ZodObject<{
|
|
6
|
+
url: z.ZodString;
|
|
7
|
+
skillName: z.ZodString;
|
|
8
|
+
maxPages: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
9
|
+
depth: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
10
|
+
workers: z.ZodOptional<z.ZodNumber>;
|
|
11
|
+
outputDir: z.ZodOptional<z.ZodString>;
|
|
12
|
+
useBrowser: z.ZodOptional<z.ZodBoolean>;
|
|
13
|
+
browser: z.ZodOptional<z.ZodEnum<["puppeteer", "playwright"]>>;
|
|
14
|
+
spaStrategy: z.ZodOptional<z.ZodEnum<["smart", "auto", "manual"]>>;
|
|
15
|
+
useCache: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
16
|
+
forceRefresh: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
17
|
+
}, "strip", z.ZodTypeAny, {
|
|
18
|
+
url: string;
|
|
19
|
+
skillName: string;
|
|
20
|
+
maxPages: number;
|
|
21
|
+
depth: number;
|
|
22
|
+
useCache: boolean;
|
|
23
|
+
forceRefresh: boolean;
|
|
24
|
+
workers?: number | undefined;
|
|
25
|
+
outputDir?: string | undefined;
|
|
26
|
+
useBrowser?: boolean | undefined;
|
|
27
|
+
browser?: "puppeteer" | "playwright" | undefined;
|
|
28
|
+
spaStrategy?: "smart" | "auto" | "manual" | undefined;
|
|
29
|
+
}, {
|
|
30
|
+
url: string;
|
|
31
|
+
skillName: string;
|
|
32
|
+
maxPages?: number | undefined;
|
|
33
|
+
depth?: number | undefined;
|
|
34
|
+
workers?: number | undefined;
|
|
35
|
+
outputDir?: string | undefined;
|
|
36
|
+
useBrowser?: boolean | undefined;
|
|
37
|
+
browser?: "puppeteer" | "playwright" | undefined;
|
|
38
|
+
spaStrategy?: "smart" | "auto" | "manual" | undefined;
|
|
39
|
+
useCache?: boolean | undefined;
|
|
40
|
+
forceRefresh?: boolean | undefined;
|
|
41
|
+
}>;
|
|
42
|
+
export type CrawlDocumentationInput = z.infer<typeof CrawlDocumentationSchema>;
|
|
43
|
+
/**
|
|
44
|
+
* Crawl documentation tool handler
|
|
45
|
+
*/
|
|
46
|
+
export declare function crawlDocumentation(input: CrawlDocumentationInput): Promise<{
|
|
47
|
+
success: boolean;
|
|
48
|
+
data: import("../processor/content-processor.js").ProcessedContent;
|
|
49
|
+
skillGenerationGuide: import("../processor/guide-generator.js").SkillGenerationGuide;
|
|
50
|
+
fromCache: boolean;
|
|
51
|
+
cacheAge: string;
|
|
52
|
+
message: string;
|
|
53
|
+
summary?: undefined;
|
|
54
|
+
} | {
|
|
55
|
+
success: boolean;
|
|
56
|
+
fromCache: boolean;
|
|
57
|
+
summary: {
|
|
58
|
+
url: string;
|
|
59
|
+
skillName: string;
|
|
60
|
+
totalPages: number;
|
|
61
|
+
maxDepth: number;
|
|
62
|
+
errors: number;
|
|
63
|
+
quality: number;
|
|
64
|
+
savedFiles: {
|
|
65
|
+
skillDir: string;
|
|
66
|
+
skillMdPath: string;
|
|
67
|
+
referenceFiles: Array<{
|
|
68
|
+
name: string;
|
|
69
|
+
path: string;
|
|
70
|
+
}>;
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
message: string;
|
|
74
|
+
data?: undefined;
|
|
75
|
+
skillGenerationGuide?: undefined;
|
|
76
|
+
cacheAge?: undefined;
|
|
77
|
+
}>;
|
|
78
|
+
//# sourceMappingURL=crawl-documentation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crawl-documentation.d.ts","sourceRoot":"","sources":["../../src/tools/crawl-documentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB;;GAEG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYnC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE/E;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuFtE"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { DependencyChecker } from '../executor/dependency-checker.js';
|
|
3
|
+
import { CLIExecutor } from '../executor/cli-executor.js';
|
|
4
|
+
import { ContentProcessor } from '../processor/content-processor.js';
|
|
5
|
+
import { GuideGenerator } from '../processor/guide-generator.js';
|
|
6
|
+
import { CacheManager } from '../cache/cache-manager.js';
|
|
7
|
+
/**
|
|
8
|
+
* Input schema for crawl_documentation tool
|
|
9
|
+
*/
|
|
10
|
+
export const CrawlDocumentationSchema = z.object({
|
|
11
|
+
url: z.string().url().describe('Documentation URL to crawl'),
|
|
12
|
+
skillName: z.string().describe('Skill name (e.g., "react-docs")'), // ✅ 必需
|
|
13
|
+
maxPages: z.number().optional().default(50).describe('Maximum number of pages to crawl'), // ✅ 降低默认值
|
|
14
|
+
depth: z.number().optional().default(3).describe('Maximum crawl depth'),
|
|
15
|
+
workers: z.number().optional().describe('Number of parallel workers'),
|
|
16
|
+
outputDir: z.string().optional().describe('Output directory for skill files (default: ~/.claude/skills)'), // ✅ 新增
|
|
17
|
+
useBrowser: z.boolean().optional().describe('Force browser automation'),
|
|
18
|
+
browser: z.enum(['puppeteer', 'playwright']).optional().describe('Browser type to use'),
|
|
19
|
+
spaStrategy: z.enum(['smart', 'auto', 'manual']).optional().describe('SPA crawling strategy'),
|
|
20
|
+
useCache: z.boolean().optional().default(true).describe('Use cached results if available'),
|
|
21
|
+
forceRefresh: z.boolean().optional().default(false).describe('Force refresh even if cached'),
|
|
22
|
+
});
|
|
23
|
+
/**
|
|
24
|
+
* Crawl documentation tool handler
|
|
25
|
+
*/
|
|
26
|
+
export async function crawlDocumentation(input) {
|
|
27
|
+
const checker = new DependencyChecker();
|
|
28
|
+
const executor = new CLIExecutor(checker);
|
|
29
|
+
const processor = new ContentProcessor();
|
|
30
|
+
const guideGenerator = new GuideGenerator();
|
|
31
|
+
const cache = new CacheManager();
|
|
32
|
+
// 1. Check if CLI is installed
|
|
33
|
+
const cliCheck = await checker.checkCLIInstalled();
|
|
34
|
+
if (!cliCheck.installed) {
|
|
35
|
+
throw new Error(cliCheck.message);
|
|
36
|
+
}
|
|
37
|
+
// 2. Check cache (if enabled and not forcing refresh)
|
|
38
|
+
if (input.useCache && !input.forceRefresh) {
|
|
39
|
+
const cached = await cache.get(input.url);
|
|
40
|
+
if (cached) {
|
|
41
|
+
const ageMinutes = Math.floor((Date.now() - cached.timestamp) / 1000 / 60);
|
|
42
|
+
return {
|
|
43
|
+
success: true,
|
|
44
|
+
data: cached.data,
|
|
45
|
+
skillGenerationGuide: cached.guide,
|
|
46
|
+
fromCache: true,
|
|
47
|
+
cacheAge: `${ageMinutes} minutes`,
|
|
48
|
+
message: `Using cached data from ${ageMinutes} minutes ago. Use forceRefresh: true to re-crawl.`,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// 3. ✅ Prepare crawl parameters - 包含 outputDir 和 filename
|
|
53
|
+
const crawlParams = {
|
|
54
|
+
url: input.url,
|
|
55
|
+
maxPages: input.maxPages,
|
|
56
|
+
maxDepth: input.depth,
|
|
57
|
+
workers: input.workers,
|
|
58
|
+
useBrowser: input.useBrowser,
|
|
59
|
+
browser: input.browser,
|
|
60
|
+
spaStrategy: input.spaStrategy,
|
|
61
|
+
// ✅ 新增:让 CLI 直接保存文件
|
|
62
|
+
outputDir: input.outputDir,
|
|
63
|
+
filename: input.skillName,
|
|
64
|
+
};
|
|
65
|
+
// 4. ✅ Execute crawl - CLI 会生成并保存 SKILL
|
|
66
|
+
let lastProgress = '';
|
|
67
|
+
console.error('[Crawl] Starting crawl with SKILL generation...');
|
|
68
|
+
const rawResult = await executor.executeCrawl(crawlParams, (progress) => {
|
|
69
|
+
// Log progress to stderr (visible in MCP client logs)
|
|
70
|
+
if (progress.message !== lastProgress) {
|
|
71
|
+
console.error(`[Progress] ${progress.message}`);
|
|
72
|
+
lastProgress = progress.message;
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
// 5. ✅ 只返回轻量级摘要(不返回完整数据)
|
|
76
|
+
const summary = {
|
|
77
|
+
url: input.url,
|
|
78
|
+
skillName: input.skillName,
|
|
79
|
+
totalPages: rawResult.statistics.totalPages,
|
|
80
|
+
maxDepth: rawResult.statistics.maxDepthReached,
|
|
81
|
+
errors: rawResult.statistics.errors,
|
|
82
|
+
quality: rawResult.skill?.quality || 0,
|
|
83
|
+
// ✅ 文件路径信息
|
|
84
|
+
savedFiles: rawResult.savedFiles || {
|
|
85
|
+
skillDir: `${input.outputDir || '~/.claude/skills'}/${input.skillName}`,
|
|
86
|
+
skillMdPath: `${input.outputDir || '~/.claude/skills'}/${input.skillName}/SKILL.md`,
|
|
87
|
+
referenceFiles: [],
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
// 6. ✅ 不使用旧的缓存系统(缓存完整数据太大)
|
|
91
|
+
// 用户可以直接使用磁盘上的文件
|
|
92
|
+
// 7. ✅ 返回轻量级响应
|
|
93
|
+
return {
|
|
94
|
+
success: true,
|
|
95
|
+
fromCache: false,
|
|
96
|
+
summary,
|
|
97
|
+
message: `✓ Crawled ${summary.totalPages} pages and generated SKILL.\n` +
|
|
98
|
+
`Quality: ${summary.quality}/100\n` +
|
|
99
|
+
`Location: ${summary.savedFiles.skillMdPath}\n` +
|
|
100
|
+
`References: ${summary.savedFiles.referenceFiles.length} files`,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=crawl-documentation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crawl-documentation.js","sourceRoot":"","sources":["../../src/tools/crawl-documentation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { crawlDocumentation, CrawlDocumentationSchema, type CrawlDocumentationInput, } from './crawl-documentation.js';
|
|
2
|
+
export { listCachedDocumentation, clearCache, ListCachedDocumentationSchema, ClearCacheSchema, type ClearCacheInput, } from './cache-tools.js';
|
|
3
|
+
export { saveSkill, SaveSkillSchema, type SaveSkillInput, type SaveSkillResult, extractSkillDataFromCrawlResult, } from './save-skill.js';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,KAAK,uBAAuB,GAC7B,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,uBAAuB,EACvB,UAAU,EACV,6BAA6B,EAC7B,gBAAgB,EAChB,KAAK,eAAe,GACrB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,SAAS,EACT,eAAe,EACf,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,+BAA+B,GAChC,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { crawlDocumentation, CrawlDocumentationSchema, } from './crawl-documentation.js';
|
|
2
|
+
export { listCachedDocumentation, clearCache, ListCachedDocumentationSchema, ClearCacheSchema, } from './cache-tools.js';
|
|
3
|
+
export { saveSkill, SaveSkillSchema, extractSkillDataFromCrawlResult, } from './save-skill.js';
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,wBAAwB,GAEzB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,uBAAuB,EACvB,UAAU,EACV,6BAA6B,EAC7B,gBAAgB,GAEjB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,SAAS,EACT,eAAe,EAGf,+BAA+B,GAChC,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { CrawlResult } from '../executor/cli-executor.js';
|
|
3
|
+
/**
|
|
4
|
+
* Input schema for save_skill tool
|
|
5
|
+
*/
|
|
6
|
+
export declare const SaveSkillSchema: z.ZodObject<{
|
|
7
|
+
skillName: z.ZodString;
|
|
8
|
+
skillContent: z.ZodString;
|
|
9
|
+
referenceFiles: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
10
|
+
baseDirectory: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
11
|
+
overwrite: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
12
|
+
}, "strip", z.ZodTypeAny, {
|
|
13
|
+
skillName: string;
|
|
14
|
+
skillContent: string;
|
|
15
|
+
baseDirectory: string;
|
|
16
|
+
overwrite: boolean;
|
|
17
|
+
referenceFiles?: Record<string, string> | undefined;
|
|
18
|
+
}, {
|
|
19
|
+
skillName: string;
|
|
20
|
+
skillContent: string;
|
|
21
|
+
referenceFiles?: Record<string, string> | undefined;
|
|
22
|
+
baseDirectory?: string | undefined;
|
|
23
|
+
overwrite?: boolean | undefined;
|
|
24
|
+
}>;
|
|
25
|
+
export type SaveSkillInput = z.infer<typeof SaveSkillSchema>;
|
|
26
|
+
/**
|
|
27
|
+
* Save skill result
|
|
28
|
+
*/
|
|
29
|
+
export interface SaveSkillResult {
|
|
30
|
+
success: boolean;
|
|
31
|
+
skillDirectory: string;
|
|
32
|
+
filesCreated: {
|
|
33
|
+
skillMd: string;
|
|
34
|
+
references: string[];
|
|
35
|
+
};
|
|
36
|
+
message: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Helper to extract skill data from crawl result
|
|
40
|
+
*/
|
|
41
|
+
export declare function extractSkillDataFromCrawlResult(crawlResult: CrawlResult, skillName: string): {
|
|
42
|
+
skillContent: string;
|
|
43
|
+
referenceFiles: Record<string, string>;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Save skill tool handler
|
|
47
|
+
*/
|
|
48
|
+
export declare function saveSkill(input: SaveSkillInput): Promise<SaveSkillResult>;
|
|
49
|
+
//# sourceMappingURL=save-skill.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"save-skill.d.ts","sourceRoot":"","sources":["../../src/tools/save-skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE/D;;GAEG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;EAM1B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAC7C,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,MAAM,GAChB;IACD,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC,CAmBA;AAyJD;;GAEG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAqD/E"}
|