@gulibs/safe-coder 0.0.27 → 0.0.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/executor/cli-executor.d.ts +10 -0
- package/dist/executor/cli-executor.d.ts.map +1 -1
- package/dist/executor/cli-executor.js +7 -0
- package/dist/executor/cli-executor.js.map +1 -1
- package/dist/server/auto-skill-installer.d.ts +16 -0
- package/dist/server/auto-skill-installer.d.ts.map +1 -0
- package/dist/server/auto-skill-installer.js +164 -0
- package/dist/server/auto-skill-installer.js.map +1 -0
- package/dist/server/safe-coder-mcp.d.ts +1 -0
- package/dist/server/safe-coder-mcp.d.ts.map +1 -1
- package/dist/server/safe-coder-mcp.js +17 -3
- package/dist/server/safe-coder-mcp.js.map +1 -1
- package/dist/tools/crawl-documentation.d.ts +25 -4
- package/dist/tools/crawl-documentation.d.ts.map +1 -1
- package/dist/tools/crawl-documentation.js +32 -25
- package/dist/tools/crawl-documentation.js.map +1 -1
- package/package.json +1 -1
|
@@ -39,6 +39,8 @@ export interface CrawlParams {
|
|
|
39
39
|
rateLimit?: number;
|
|
40
40
|
includePaths?: string[];
|
|
41
41
|
excludePaths?: string[];
|
|
42
|
+
outputDir?: string;
|
|
43
|
+
filename?: string;
|
|
42
44
|
}
|
|
43
45
|
/**
|
|
44
46
|
* Crawl result from CLI
|
|
@@ -79,6 +81,14 @@ export interface CrawlResult {
|
|
|
79
81
|
skillMd: string;
|
|
80
82
|
quality: number;
|
|
81
83
|
};
|
|
84
|
+
savedFiles?: {
|
|
85
|
+
skillDir: string;
|
|
86
|
+
skillMdPath: string;
|
|
87
|
+
referenceFiles: Array<{
|
|
88
|
+
name: string;
|
|
89
|
+
path: string;
|
|
90
|
+
}>;
|
|
91
|
+
};
|
|
82
92
|
}
|
|
83
93
|
/**
|
|
84
94
|
* Progress callback function
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-executor.d.ts","sourceRoot":"","sources":["../../src/executor/cli-executor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE;;GAEG;AACH,MAAM,WAAW,SAAS,CAAC,CAAC,GAAG,GAAG;IAChC,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,GAAG,CAAC;KACf,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,WAAW,GAAG,YAAY,CAAC;IACrC,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC1C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"cli-executor.d.ts","sourceRoot":"","sources":["../../src/executor/cli-executor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE;;GAEG;AACH,MAAM,WAAW,SAAS,CAAC,CAAC,GAAG,GAAG;IAChC,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,GAAG,CAAC;KACf,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,WAAW,GAAG,YAAY,CAAC;IACrC,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC1C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAGxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;QACZ,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,KAAK,EAAE,KAAK,CAAC;QACX,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC,CAAC;IACH,QAAQ,EAAE;QACR,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC;IACF,UAAU,EAAE;QACV,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,MAAM,CAAC;QACxB,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,CAAC,EAAE;YACd,eAAe,EAAE,MAAM,CAAC;YACxB,WAAW,EAAE,MAAM,CAAC;YACpB,eAAe,EAAE,MAAM,CAAC;SACzB,CAAC;KACH,CAAC;IACF,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IAEF,UAAU,CAAC,EAAE;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACvD,CAAC;CACH;AAED;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;AAElE;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,iBAAiB,CAAC,CAAoB;gBAElC,iBAAiB,CAAC,EAAE,iBAAiB;IAIjD;;OAEG;IACG,YAAY,CAChB,MAAM,EAAE,WAAW,EACnB,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,WAAW,CAAC;IA2IvB;;OAEG;IACG,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAK3D;;OAEG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;CAIxD"}
|
|
@@ -50,6 +50,13 @@ export class CLIExecutor {
|
|
|
50
50
|
if (params.excludePaths && params.excludePaths.length > 0) {
|
|
51
51
|
args.push('--exclude-paths', params.excludePaths.join(','));
|
|
52
52
|
}
|
|
53
|
+
// ✅ 添加输出参数
|
|
54
|
+
if (params.outputDir) {
|
|
55
|
+
args.push('--output-dir', params.outputDir);
|
|
56
|
+
}
|
|
57
|
+
if (params.filename) {
|
|
58
|
+
args.push('--filename', params.filename);
|
|
59
|
+
}
|
|
53
60
|
return new Promise((resolve, reject) => {
|
|
54
61
|
const child = spawn('safe-coder-cli', args, {
|
|
55
62
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-executor.js","sourceRoot":"","sources":["../../src/executor/cli-executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"cli-executor.js","sourceRoot":"","sources":["../../src/executor/cli-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-install crawl-docs SKILL when MCP server starts
|
|
3
|
+
*/
|
|
4
|
+
export declare class AutoSkillInstaller {
|
|
5
|
+
private readonly SKILL_NAME;
|
|
6
|
+
private readonly CLAUDE_SKILLS_DIR;
|
|
7
|
+
/**
|
|
8
|
+
* Install crawl-docs SKILL if it doesn't exist
|
|
9
|
+
*/
|
|
10
|
+
installCrawlDocsSkill(): Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* Generate SKILL.md content
|
|
13
|
+
*/
|
|
14
|
+
private generateSkillContent;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=auto-skill-installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-skill-installer.d.ts","sourceRoot":"","sources":["../../src/server/auto-skill-installer.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAwC;IAE1E;;OAEG;IACG,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B5C;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAyH7B"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { mkdir, writeFile, access, constants } from 'fs/promises';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { homedir } from 'os';
|
|
4
|
+
/**
|
|
5
|
+
* Auto-install crawl-docs SKILL when MCP server starts
|
|
6
|
+
*/
|
|
7
|
+
export class AutoSkillInstaller {
|
|
8
|
+
SKILL_NAME = 'crawl-docs';
|
|
9
|
+
CLAUDE_SKILLS_DIR = join(homedir(), '.claude', 'skills');
|
|
10
|
+
/**
|
|
11
|
+
* Install crawl-docs SKILL if it doesn't exist
|
|
12
|
+
*/
|
|
13
|
+
async installCrawlDocsSkill() {
|
|
14
|
+
try {
|
|
15
|
+
const skillDir = join(this.CLAUDE_SKILLS_DIR, this.SKILL_NAME);
|
|
16
|
+
const skillMdPath = join(skillDir, 'SKILL.md');
|
|
17
|
+
// Check if SKILL already exists
|
|
18
|
+
try {
|
|
19
|
+
await access(skillMdPath, constants.F_OK);
|
|
20
|
+
// SKILL already exists, no need to install
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// SKILL doesn't exist, proceed with installation
|
|
25
|
+
}
|
|
26
|
+
// Create skill directory
|
|
27
|
+
await mkdir(skillDir, { recursive: true });
|
|
28
|
+
// Generate SKILL.md content
|
|
29
|
+
const skillContent = this.generateSkillContent();
|
|
30
|
+
// Write SKILL.md
|
|
31
|
+
await writeFile(skillMdPath, skillContent, 'utf-8');
|
|
32
|
+
console.error(`[Safe Coder MCP] Auto-installed crawl-docs SKILL at: ${skillMdPath}`);
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
// Log error but don't fail MCP startup
|
|
36
|
+
console.error(`[Safe Coder MCP] Failed to auto-install crawl-docs SKILL:`, error);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Generate SKILL.md content
|
|
41
|
+
*/
|
|
42
|
+
generateSkillContent() {
|
|
43
|
+
return `---
|
|
44
|
+
name: crawl-docs
|
|
45
|
+
description: Crawl online documentation and automatically generate Agent SKILLs. Use when user asks to crawl documentation, scrape docs, generate SKILL from URL, or create skill from documentation website. Supports Chinese requests (爬取文档、抓取文档、生成SKILL).
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
# Crawl Documentation and Generate SKILL
|
|
49
|
+
|
|
50
|
+
Automatically crawl documentation websites and generate high-quality Agent SKILLs using the safe-coder MCP server.
|
|
51
|
+
|
|
52
|
+
## When to Use
|
|
53
|
+
|
|
54
|
+
Use this skill when the user requests:
|
|
55
|
+
- "Crawl [documentation URL] and generate SKILL"
|
|
56
|
+
- "Scrape docs from [URL]"
|
|
57
|
+
- "Create a skill from [documentation website]"
|
|
58
|
+
- "Generate SKILL from [URL]"
|
|
59
|
+
- Chinese: "爬取文档"、"抓取文档"、"从文档生成SKILL"
|
|
60
|
+
|
|
61
|
+
## Required Information
|
|
62
|
+
|
|
63
|
+
Gather from the user:
|
|
64
|
+
1. **Documentation URL** - The website to crawl
|
|
65
|
+
2. **Skill name** - Short identifier (e.g., "react", "vue-guide")
|
|
66
|
+
3. **Max pages** (optional) - How many pages to crawl (default: 50)
|
|
67
|
+
|
|
68
|
+
## Implementation Steps
|
|
69
|
+
|
|
70
|
+
### Step 1: Check MCP Availability
|
|
71
|
+
|
|
72
|
+
First, verify the \`user-safe-coder\` MCP server is available by reading its tool schema:
|
|
73
|
+
|
|
74
|
+
\`\`\`
|
|
75
|
+
Read: /Users/wormhole/.cursor/projects/Users-wormhole-Documents-Developments-Our-mcp/mcps/user-safe-coder/tools/crawl_documentation.json
|
|
76
|
+
\`\`\`
|
|
77
|
+
|
|
78
|
+
### Step 2: Call the Tool
|
|
79
|
+
|
|
80
|
+
Use \`CallMcpTool\` to crawl documentation:
|
|
81
|
+
|
|
82
|
+
\`\`\`javascript
|
|
83
|
+
CallMcpTool({
|
|
84
|
+
server: "user-safe-coder",
|
|
85
|
+
toolName: "crawl_documentation",
|
|
86
|
+
arguments: {
|
|
87
|
+
url: "<documentation-url>",
|
|
88
|
+
skillName: "<skill-name>",
|
|
89
|
+
maxPages: <number>, // Optional, default 50
|
|
90
|
+
outputDir: "~/.claude/skills" // Optional, default ~/.claude/skills
|
|
91
|
+
}
|
|
92
|
+
})
|
|
93
|
+
\`\`\`
|
|
94
|
+
|
|
95
|
+
### Step 3: Verify Output
|
|
96
|
+
|
|
97
|
+
After crawling completes:
|
|
98
|
+
1. Check the generated SKILL location (default: \`~/.claude/skills/<skill-name>/\`)
|
|
99
|
+
2. Verify the SKILL.md file and references/ directory were created
|
|
100
|
+
3. Inform the user where the skill was saved
|
|
101
|
+
|
|
102
|
+
## Parameters Reference
|
|
103
|
+
|
|
104
|
+
### Required
|
|
105
|
+
- \`url\` (string) - Documentation website URL to crawl
|
|
106
|
+
- \`skillName\` (string) - Name for the skill directory (e.g., "react", "vue-docs")
|
|
107
|
+
|
|
108
|
+
### Optional
|
|
109
|
+
- \`maxPages\` (number) - Maximum pages to crawl (default: 50)
|
|
110
|
+
- \`depth\` (number) - Maximum crawl depth (default: 3)
|
|
111
|
+
- \`outputDir\` (string) - Output directory (default: ~/.claude/skills)
|
|
112
|
+
- \`useCache\` (boolean) - Use cached results if available (default: true)
|
|
113
|
+
- \`forceRefresh\` (boolean) - Force refresh even if cached (default: false)
|
|
114
|
+
- \`useBrowser\` (boolean) - Force browser automation for SPA sites
|
|
115
|
+
- \`browser\` (string) - "puppeteer" or "playwright"
|
|
116
|
+
- \`spaStrategy\` (string) - "smart", "auto", or "manual"
|
|
117
|
+
|
|
118
|
+
## What the Tool Does
|
|
119
|
+
|
|
120
|
+
The \`crawl_documentation\` tool:
|
|
121
|
+
- Crawls the documentation website automatically
|
|
122
|
+
- Extracts content, code examples, and patterns
|
|
123
|
+
- Analyzes structure and categorizes content
|
|
124
|
+
- Generates a concise SKILL.md (< 500 lines)
|
|
125
|
+
- Creates organized reference files in \`references/\` subdirectory
|
|
126
|
+
- Saves directly to disk (default: ~/.claude/skills/)
|
|
127
|
+
- Returns only a lightweight summary to minimize token usage
|
|
128
|
+
|
|
129
|
+
## Example Usage
|
|
130
|
+
|
|
131
|
+
**User request:**
|
|
132
|
+
\`\`\`
|
|
133
|
+
请爬取 React 文档并生成 SKILL:
|
|
134
|
+
- URL: https://react.dev
|
|
135
|
+
- 最多 20 页
|
|
136
|
+
- 命名为 react
|
|
137
|
+
\`\`\`
|
|
138
|
+
|
|
139
|
+
**Your response:**
|
|
140
|
+
1. Read the tool schema
|
|
141
|
+
2. Call crawl_documentation with:
|
|
142
|
+
- url: "https://react.dev"
|
|
143
|
+
- skillName: "react"
|
|
144
|
+
- maxPages: 20
|
|
145
|
+
3. Inform user: "SKILL has been generated at ~/.claude/skills/react/ with references directory"
|
|
146
|
+
|
|
147
|
+
## Error Handling
|
|
148
|
+
|
|
149
|
+
If the tool fails:
|
|
150
|
+
1. Check if safe-coder-cli is installed
|
|
151
|
+
2. Verify the URL is accessible
|
|
152
|
+
3. Check network connectivity
|
|
153
|
+
4. Review error message and suggest solutions
|
|
154
|
+
|
|
155
|
+
## Notes
|
|
156
|
+
|
|
157
|
+
- The tool uses caching by default to avoid re-crawling
|
|
158
|
+
- Generated SKILLs follow Cursor Agent SKILL best practices
|
|
159
|
+
- Reference files are automatically organized by category
|
|
160
|
+
- The tool is optimized for documentation sites (not general web scraping)
|
|
161
|
+
`;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=auto-skill-installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-skill-installer.js","sourceRoot":"","sources":["../../src/server/auto-skill-installer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAE7B;;GAEG;AACH,MAAM,OAAO,kBAAkB;IACZ,UAAU,GAAG,YAAY,CAAC;IAC1B,iBAAiB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAE1E;;OAEG;IACH,KAAK,CAAC,qBAAqB;QACzB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/D,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAE/C,gCAAgC;YAChC,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,WAAW,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;gBAC1C,2CAA2C;gBAC3C,OAAO;YACT,CAAC;YAAC,MAAM,CAAC;gBACP,iDAAiD;YACnD,CAAC;YAED,yBAAyB;YACzB,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAE3C,4BAA4B;YAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAEjD,iBAAiB;YACjB,MAAM,SAAS,CAAC,WAAW,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;YAEpD,OAAO,CAAC,KAAK,CAAC,wDAAwD,WAAW,EAAE,CAAC,CAAC;QACvF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,uCAAuC;YACvC,OAAO,CAAC,KAAK,CAAC,2DAA2D,EAAE,KAAK,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IAED;;OAEG;IACK,oBAAoB;QAC1B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsHV,CAAC;IACA,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safe-coder-mcp.d.ts","sourceRoot":"","sources":["../../src/server/safe-coder-mcp.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"safe-coder-mcp.d.ts","sourceRoot":"","sources":["../../src/server/safe-coder-mcp.ts"],"names":[],"mappings":";AAcA;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,kBAAkB,CAAqB;;IAY/C;;OAEG;IACH,OAAO,CAAC,UAAU;IAwKlB;;OAEG;IACG,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAS3B"}
|
|
@@ -2,27 +2,39 @@
|
|
|
2
2
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
3
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
4
|
import { crawlDocumentation, CrawlDocumentationSchema, listCachedDocumentation, clearCache, ClearCacheSchema, saveSkill, SaveSkillSchema, } from '../tools/index.js';
|
|
5
|
+
import { AutoSkillInstaller } from './auto-skill-installer.js';
|
|
5
6
|
/**
|
|
6
7
|
* Safe Coder MCP Server
|
|
7
8
|
* Orchestrates safe-coder-cli for documentation crawling and SKILL generation
|
|
8
9
|
*/
|
|
9
10
|
export class SafeCoderMCPServer {
|
|
10
11
|
server;
|
|
12
|
+
autoSkillInstaller;
|
|
11
13
|
constructor() {
|
|
12
14
|
this.server = new McpServer({
|
|
13
15
|
name: 'safe-coder',
|
|
14
16
|
version: '1.0.0',
|
|
15
17
|
});
|
|
18
|
+
this.autoSkillInstaller = new AutoSkillInstaller();
|
|
16
19
|
this.setupTools();
|
|
17
20
|
}
|
|
18
21
|
/**
|
|
19
22
|
* Register MCP tools
|
|
20
23
|
*/
|
|
21
24
|
setupTools() {
|
|
22
|
-
// Register crawl_documentation tool
|
|
25
|
+
// ✅ Register crawl_documentation tool - 更新描述
|
|
23
26
|
this.server.registerTool('crawl_documentation', {
|
|
24
|
-
title: 'Crawl Documentation',
|
|
25
|
-
description: 'Crawl documentation website and generate
|
|
27
|
+
title: 'Crawl Documentation and Generate SKILL',
|
|
28
|
+
description: 'Crawl documentation website and automatically generate a complete Agent SKILL. ' +
|
|
29
|
+
'Use this tool when the user asks to: crawl documentation, scrape docs, generate SKILL from URL, ' +
|
|
30
|
+
'create skill from documentation, or similar requests (爬取文档、抓取文档、从文档生成SKILL). ' +
|
|
31
|
+
'\n\nThis tool saves files directly to disk and returns only a lightweight summary. ' +
|
|
32
|
+
'The CLI generates a high-quality SKILL.md (< 500 lines) based on complete content analysis, ' +
|
|
33
|
+
'along with organized reference files. Agent receives only the summary to minimize token cost. ' +
|
|
34
|
+
'\n\nRequired: url, skillName. ' +
|
|
35
|
+
'Optional: maxPages (default 50), depth (default 3), outputDir (default ~/.claude/skills), ' +
|
|
36
|
+
'workers, browser, spaStrategy, useCache, forceRefresh. ' +
|
|
37
|
+
'\n\nExample: crawl_documentation({ url: "https://react.dev", skillName: "react-docs", maxPages: 50 })',
|
|
26
38
|
inputSchema: CrawlDocumentationSchema,
|
|
27
39
|
}, async (args) => {
|
|
28
40
|
try {
|
|
@@ -156,6 +168,8 @@ export class SafeCoderMCPServer {
|
|
|
156
168
|
* Start the MCP server
|
|
157
169
|
*/
|
|
158
170
|
async run() {
|
|
171
|
+
// Auto-install crawl-docs SKILL if it doesn't exist
|
|
172
|
+
await this.autoSkillInstaller.installCrawlDocsSkill();
|
|
159
173
|
const transport = new StdioServerTransport();
|
|
160
174
|
await this.server.connect(transport);
|
|
161
175
|
console.error('Safe Coder MCP Server running on stdio');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safe-coder-mcp.js","sourceRoot":"","sources":["../../src/server/safe-coder-mcp.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,uBAAuB,EACvB,UAAU,EACV,gBAAgB,EAChB,SAAS,EACT,eAAe,GAChB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"safe-coder-mcp.js","sourceRoot":"","sources":["../../src/server/safe-coder-mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,9 +4,11 @@ import { z } from 'zod';
|
|
|
4
4
|
*/
|
|
5
5
|
export declare const CrawlDocumentationSchema: z.ZodObject<{
|
|
6
6
|
url: z.ZodString;
|
|
7
|
+
skillName: z.ZodString;
|
|
7
8
|
maxPages: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
8
9
|
depth: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
9
10
|
workers: z.ZodOptional<z.ZodNumber>;
|
|
11
|
+
outputDir: z.ZodOptional<z.ZodString>;
|
|
10
12
|
useBrowser: z.ZodOptional<z.ZodBoolean>;
|
|
11
13
|
browser: z.ZodOptional<z.ZodEnum<["puppeteer", "playwright"]>>;
|
|
12
14
|
spaStrategy: z.ZodOptional<z.ZodEnum<["smart", "auto", "manual"]>>;
|
|
@@ -14,19 +16,23 @@ export declare const CrawlDocumentationSchema: z.ZodObject<{
|
|
|
14
16
|
forceRefresh: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
15
17
|
}, "strip", z.ZodTypeAny, {
|
|
16
18
|
url: string;
|
|
19
|
+
skillName: string;
|
|
17
20
|
maxPages: number;
|
|
18
21
|
depth: number;
|
|
19
22
|
useCache: boolean;
|
|
20
23
|
forceRefresh: boolean;
|
|
21
24
|
workers?: number | undefined;
|
|
25
|
+
outputDir?: string | undefined;
|
|
22
26
|
useBrowser?: boolean | undefined;
|
|
23
27
|
browser?: "puppeteer" | "playwright" | undefined;
|
|
24
28
|
spaStrategy?: "smart" | "auto" | "manual" | undefined;
|
|
25
29
|
}, {
|
|
26
30
|
url: string;
|
|
31
|
+
skillName: string;
|
|
27
32
|
maxPages?: number | undefined;
|
|
28
33
|
depth?: number | undefined;
|
|
29
34
|
workers?: number | undefined;
|
|
35
|
+
outputDir?: string | undefined;
|
|
30
36
|
useBrowser?: boolean | undefined;
|
|
31
37
|
browser?: "puppeteer" | "playwright" | undefined;
|
|
32
38
|
spaStrategy?: "smart" | "auto" | "manual" | undefined;
|
|
@@ -44,14 +50,29 @@ export declare function crawlDocumentation(input: CrawlDocumentationInput): Prom
|
|
|
44
50
|
fromCache: boolean;
|
|
45
51
|
cacheAge: string;
|
|
46
52
|
message: string;
|
|
47
|
-
|
|
53
|
+
summary?: undefined;
|
|
48
54
|
} | {
|
|
49
55
|
success: boolean;
|
|
50
|
-
data: import("../processor/content-processor.js").ProcessedContent;
|
|
51
|
-
rawCrawlResult: import("../executor/cli-executor.js").CrawlResult;
|
|
52
|
-
skillGenerationGuide: import("../processor/guide-generator.js").SkillGenerationGuide;
|
|
53
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
|
+
};
|
|
54
73
|
message: string;
|
|
74
|
+
data?: undefined;
|
|
75
|
+
skillGenerationGuide?: undefined;
|
|
55
76
|
cacheAge?: undefined;
|
|
56
77
|
}>;
|
|
57
78
|
//# sourceMappingURL=crawl-documentation.d.ts.map
|
|
@@ -1 +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
|
|
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"}
|
|
@@ -9,9 +9,11 @@ import { CacheManager } from '../cache/cache-manager.js';
|
|
|
9
9
|
*/
|
|
10
10
|
export const CrawlDocumentationSchema = z.object({
|
|
11
11
|
url: z.string().url().describe('Documentation URL to crawl'),
|
|
12
|
-
|
|
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'), // ✅ 降低默认值
|
|
13
14
|
depth: z.number().optional().default(3).describe('Maximum crawl depth'),
|
|
14
15
|
workers: z.number().optional().describe('Number of parallel workers'),
|
|
16
|
+
outputDir: z.string().optional().describe('Output directory for skill files (default: ~/.claude/skills)'), // ✅ 新增
|
|
15
17
|
useBrowser: z.boolean().optional().describe('Force browser automation'),
|
|
16
18
|
browser: z.enum(['puppeteer', 'playwright']).optional().describe('Browser type to use'),
|
|
17
19
|
spaStrategy: z.enum(['smart', 'auto', 'manual']).optional().describe('SPA crawling strategy'),
|
|
@@ -47,7 +49,7 @@ export async function crawlDocumentation(input) {
|
|
|
47
49
|
};
|
|
48
50
|
}
|
|
49
51
|
}
|
|
50
|
-
// 3. Prepare crawl parameters
|
|
52
|
+
// 3. ✅ Prepare crawl parameters - 包含 outputDir 和 filename
|
|
51
53
|
const crawlParams = {
|
|
52
54
|
url: input.url,
|
|
53
55
|
maxPages: input.maxPages,
|
|
@@ -56,9 +58,13 @@ export async function crawlDocumentation(input) {
|
|
|
56
58
|
useBrowser: input.useBrowser,
|
|
57
59
|
browser: input.browser,
|
|
58
60
|
spaStrategy: input.spaStrategy,
|
|
61
|
+
// ✅ 新增:让 CLI 直接保存文件
|
|
62
|
+
outputDir: input.outputDir,
|
|
63
|
+
filename: input.skillName,
|
|
59
64
|
};
|
|
60
|
-
// 4. Execute crawl
|
|
65
|
+
// 4. ✅ Execute crawl - CLI 会生成并保存 SKILL
|
|
61
66
|
let lastProgress = '';
|
|
67
|
+
console.error('[Crawl] Starting crawl with SKILL generation...');
|
|
62
68
|
const rawResult = await executor.executeCrawl(crawlParams, (progress) => {
|
|
63
69
|
// Log progress to stderr (visible in MCP client logs)
|
|
64
70
|
if (progress.message !== lastProgress) {
|
|
@@ -66,31 +72,32 @@ export async function crawlDocumentation(input) {
|
|
|
66
72
|
lastProgress = progress.message;
|
|
67
73
|
}
|
|
68
74
|
});
|
|
69
|
-
// 5.
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
//
|
|
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. ✅ 返回轻量级响应
|
|
87
93
|
return {
|
|
88
94
|
success: true,
|
|
89
|
-
data: processed,
|
|
90
|
-
rawCrawlResult: rawResult, // Include raw result for skill file generation
|
|
91
|
-
skillGenerationGuide: guide,
|
|
92
95
|
fromCache: false,
|
|
93
|
-
|
|
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`,
|
|
94
101
|
};
|
|
95
102
|
}
|
|
96
103
|
//# sourceMappingURL=crawl-documentation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crawl-documentation.js","sourceRoot":"","sources":["../../src/tools/crawl-documentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,WAAW,EAAoB,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IAC5D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"crawl-documentation.js","sourceRoot":"","sources":["../../src/tools/crawl-documentation.ts"],"names":[],"mappings":"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"}
|