@gulibs/safe-coder 0.0.11 → 0.0.13

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 CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  一个基于 Model Context Protocol (MCP) 的服务器,提供以下功能:
4
4
  - **最新库文档** - 从 npm、GitHub 和 HTTP 源获取文档
5
+ - **文档爬取和技能生成** - 递归爬取文档网站并生成 Agent Skill
6
+ - **网页文档浏览** - 浏览和搜索网页文档内容
5
7
  - **全面错误检测** - 使用 ESLint、TypeScript、模式匹配和上下文分析
6
8
  - **代码验证** - 带自动修复功能
7
9
  - **错误解决方案建议** - 针对常见编码问题
@@ -16,6 +18,21 @@
16
18
  - 智能缓存,基于版本键和 TTL
17
19
  - 热门包的背景刷新
18
20
 
21
+ ### 文档爬取和技能生成
22
+
23
+ - 递归爬取文档网站,自动跟踪文档链接
24
+ - 智能边界检测,只在文档路径内爬取
25
+ - 生成结构化的 Agent Skill 输出(Markdown 格式)
26
+ - 支持深度限制、页面限制和速率控制
27
+ - 自动组织内容,生成目录和章节
28
+
29
+ ### 网页文档浏览
30
+
31
+ - 浏览和搜索网页文档内容
32
+ - 自动检测文档页面(节省 token)
33
+ - 支持查询过滤和导航链接提取
34
+ - 智能内容提取和组织
35
+
19
36
  ### 错误检测
20
37
 
21
38
  - 多层检测:
@@ -384,6 +401,63 @@ pwd
384
401
  }
385
402
  ```
386
403
 
404
+ #### `browse_documentation` - 浏览网页文档
405
+
406
+ 浏览和搜索网页文档页面。
407
+
408
+ **参数:**
409
+ - `url`(必需):文档 URL
410
+ - `query`(可选):搜索查询词,用于过滤内容
411
+ - `navigateTo`(可选):导航到文档内的其他页面
412
+
413
+ **使用示例:**
414
+
415
+ ```
416
+ 浏览 https://react.dev/docs/getting-started 的文档
417
+ ```
418
+
419
+ ```
420
+ 在 https://expressjs.com/en/guide 中查找关于路由的内容
421
+ ```
422
+
423
+ #### `crawl_documentation` - 爬取文档并生成技能
424
+
425
+ 递归爬取文档网站,提取内容并生成结构化的 Agent Skill。
426
+
427
+ **参数:**
428
+ - `url`(必需):文档根 URL
429
+ - `maxDepth`(可选):最大爬取深度(默认:3)
430
+ - `maxPages`(可选):最大页面数(默认:50)
431
+ - `includePaths`(可选):额外包含的路径模式
432
+ - `excludePaths`(可选):排除的路径模式
433
+ - `rateLimit`(可选):请求间隔(毫秒,默认:500)
434
+ - `outputDir`(可选):保存技能文件的目录(如果不提供,只返回内容)
435
+ - `filename`(可选):自定义文件名(不含扩展名)
436
+
437
+ **使用示例:**
438
+
439
+ ```
440
+ 爬取 https://react.dev/docs 的文档并生成技能
441
+ ```
442
+
443
+ ```
444
+ 从 https://nextjs.org/docs 生成 agent skill,深度限制为 2,最多 10 页,保存到 ./output
445
+ ```
446
+
447
+ **输出:**
448
+ - `skillContent`: Markdown 格式的技能内容
449
+ - `metadata`: 技能元数据(标题、描述、源 URL 等)
450
+ - `crawlStats`: 爬取统计(总页数、最大深度、错误列表)
451
+ - `files`(可选):保存的文件路径
452
+ - `skillFile`: 技能 Markdown 文件路径(如果提供了 outputDir)
453
+ - `manifestFile`: 元数据 JSON 文件路径(如果提供了 outputDir)
454
+
455
+ **文件保存:**
456
+ - 如果提供了 `outputDir`,会保存两个文件:
457
+ - `{filename}.md`: 技能内容文件
458
+ - `{filename}.metadata.json`: 元数据文件
459
+ - 文件名自动从 URL 生成,或使用自定义 `filename` 参数
460
+
387
461
  #### `detect_errors` - 检测错误
388
462
 
389
463
  检测代码中的错误和警告。
@@ -450,7 +524,11 @@ function test() {
450
524
  ```
451
525
  safe-coder/
452
526
  ├── src/
453
- │ ├── documentation/ # 文档获取和缓存
527
+ │ ├── documentation/ # 文档获取、缓存、爬取和技能生成
528
+ │ │ ├── index.ts # 文档服务
529
+ │ │ ├── web-doc-browser.ts # 网页文档浏览
530
+ │ │ ├── doc-crawler.ts # 文档爬取
531
+ │ │ └── skill-generator.ts # 技能生成
454
532
  │ ├── errors/ # 错误检测(ESLint、TypeScript、模式、上下文)
455
533
  │ ├── validation/ # 代码验证和自动修复
456
534
  │ ├── server/ # MCP 服务器实现
@@ -539,6 +617,34 @@ npm run lint
539
617
  - 添加新的错误模式
540
618
  - 重新构建项目
541
619
 
620
+ ### Q: 文档爬取工具如何使用?
621
+
622
+ **A:**
623
+ - 使用 `crawl_documentation` 工具,提供文档根 URL
624
+ - 工具会自动检测文档页面,跟踪链接,生成技能
625
+ - 支持配置深度和页面限制
626
+ - 详见 `DOC_CRAWLER_USAGE.md`
627
+
628
+ **示例:**
629
+ ```
630
+ 爬取 https://react.dev/docs 的文档并生成技能
631
+ ```
632
+
633
+ ### Q: 爬取大型文档站点时需要注意什么?
634
+
635
+ **A:**
636
+ - 使用 `maxPages` 参数限制页面数量(默认 50)
637
+ - 使用 `maxDepth` 参数限制爬取深度(默认 3)
638
+ - 调整 `rateLimit` 避免对服务器造成压力(默认 500ms)
639
+ - 大型站点建议分多次爬取不同部分
640
+
641
+ ### Q: 网页文档浏览和文档爬取有什么区别?
642
+
643
+ **A:**
644
+ - **`browse_documentation`**: 浏览单个文档页面,支持查询和导航
645
+ - **`crawl_documentation`**: 递归爬取多个页面,生成完整的技能文件
646
+ - 浏览适合查看特定内容,爬取适合生成完整文档技能
647
+
542
648
  ## 发布到 npm(开发者)
543
649
 
544
650
  如果你想将这个包发布到 npm:
@@ -0,0 +1,66 @@
1
+ import { HttpClient } from '../utils/http-client.js';
2
+ export interface CrawlOptions {
3
+ maxDepth?: number;
4
+ maxPages?: number;
5
+ includePaths?: string[];
6
+ excludePaths?: string[];
7
+ rateLimit?: number;
8
+ }
9
+ export interface CrawledPage {
10
+ url: string;
11
+ title: string;
12
+ content: string;
13
+ depth: number;
14
+ sections: Array<{
15
+ title: string;
16
+ content: string;
17
+ anchor?: string;
18
+ }>;
19
+ navigationLinks: Array<{
20
+ text: string;
21
+ url: string;
22
+ isInternal: boolean;
23
+ }>;
24
+ }
25
+ export interface CrawlResult {
26
+ pages: CrawledPage[];
27
+ totalPages: number;
28
+ maxDepthReached: number;
29
+ errors: Array<{
30
+ url: string;
31
+ error: string;
32
+ }>;
33
+ }
34
+ export declare class DocumentationCrawler {
35
+ private browser;
36
+ private visitedUrls;
37
+ private urlQueue;
38
+ private crawledPages;
39
+ private errors;
40
+ private options;
41
+ private baseUrl;
42
+ private readonly DOCUMENTATION_PATTERNS;
43
+ private readonly EXCLUDED_PATTERNS;
44
+ constructor(httpClient?: HttpClient);
45
+ /**
46
+ * Crawl documentation starting from a root URL
47
+ */
48
+ crawl(rootUrl: string, options?: CrawlOptions): Promise<CrawlResult>;
49
+ /**
50
+ * Discover documentation links from a crawled page
51
+ */
52
+ private discoverDocumentationLinks;
53
+ /**
54
+ * Check if a path is a documentation path
55
+ */
56
+ private isDocumentationPath;
57
+ /**
58
+ * Check if a path should be excluded
59
+ */
60
+ private shouldExclude;
61
+ /**
62
+ * Delay helper for rate limiting
63
+ */
64
+ private delay;
65
+ }
66
+ //# sourceMappingURL=doc-crawler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc-crawler.d.ts","sourceRoot":"","sources":["../../src/documentation/doc-crawler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAGrD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,eAAe,EAAE,KAAK,CAAC;QACrB,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,KAAK,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;CACJ;AAOD,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,MAAM,CAAwC;IACtD,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,OAAO,CAAM;IACrB,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CASrC;IACF,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAShC;gBAEU,UAAU,CAAC,EAAE,UAAU;IAgBnC;;OAEG;IACG,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,WAAW,CAAC;IAkG9E;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAmElC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAK3B;;OAEG;IACH,OAAO,CAAC,aAAa;IAIrB;;OAEG;IACH,OAAO,CAAC,KAAK;CAGd"}
@@ -0,0 +1,206 @@
1
+ import { WebDocumentationBrowser } from './web-doc-browser.js';
2
+ export class DocumentationCrawler {
3
+ browser;
4
+ visitedUrls;
5
+ urlQueue;
6
+ crawledPages;
7
+ errors;
8
+ options;
9
+ baseUrl;
10
+ DOCUMENTATION_PATTERNS = [
11
+ /\/docs?\//i,
12
+ /\/documentation/i,
13
+ /\/guide/i,
14
+ /\/tutorial/i,
15
+ /\/api/i,
16
+ /\/reference/i,
17
+ /\/manual/i,
18
+ /\/help/i,
19
+ ];
20
+ EXCLUDED_PATTERNS = [
21
+ /\/login/i,
22
+ /\/signup/i,
23
+ /\/register/i,
24
+ /\/checkout/i,
25
+ /\/cart/i,
26
+ /\/payment/i,
27
+ /\/home$/i,
28
+ /^\/$/,
29
+ ];
30
+ constructor(httpClient) {
31
+ this.browser = new WebDocumentationBrowser(httpClient);
32
+ this.visitedUrls = new Set();
33
+ this.urlQueue = [];
34
+ this.crawledPages = [];
35
+ this.errors = [];
36
+ this.options = {
37
+ maxDepth: 3,
38
+ maxPages: 50,
39
+ includePaths: [],
40
+ excludePaths: [],
41
+ rateLimit: 500, // 500ms default delay
42
+ };
43
+ this.baseUrl = new URL('https://example.com');
44
+ }
45
+ /**
46
+ * Crawl documentation starting from a root URL
47
+ */
48
+ async crawl(rootUrl, options = {}) {
49
+ // Reset state
50
+ this.visitedUrls.clear();
51
+ this.urlQueue = [];
52
+ this.crawledPages = [];
53
+ this.errors = [];
54
+ // Merge options
55
+ this.options = {
56
+ ...this.options,
57
+ ...options,
58
+ };
59
+ // Parse and validate root URL
60
+ try {
61
+ this.baseUrl = new URL(rootUrl);
62
+ }
63
+ catch (error) {
64
+ throw new Error(`Invalid root URL: ${rootUrl}`);
65
+ }
66
+ // Check if root URL is documentation
67
+ const isDoc = await this.browser.isDocumentationPage(rootUrl);
68
+ if (!isDoc) {
69
+ throw new Error(`The provided URL does not appear to be a documentation page: ${rootUrl}`);
70
+ }
71
+ // Start crawling from root
72
+ this.urlQueue.push({ url: rootUrl, depth: 0 });
73
+ let maxDepthReached = 0;
74
+ // Process queue
75
+ while (this.urlQueue.length > 0 && this.crawledPages.length < this.options.maxPages) {
76
+ const queued = this.urlQueue.shift();
77
+ if (!queued)
78
+ break;
79
+ const { url, depth } = queued;
80
+ // Skip if already visited
81
+ if (this.visitedUrls.has(url)) {
82
+ continue;
83
+ }
84
+ // Check depth limit
85
+ if (depth > this.options.maxDepth) {
86
+ continue;
87
+ }
88
+ // Mark as visited
89
+ this.visitedUrls.add(url);
90
+ maxDepthReached = Math.max(maxDepthReached, depth);
91
+ try {
92
+ // Crawl the page
93
+ const page = await this.browser.browsePage(url);
94
+ // Convert to CrawledPage format
95
+ const crawledPage = {
96
+ url: page.url,
97
+ title: page.title,
98
+ content: page.content,
99
+ depth,
100
+ sections: page.sections,
101
+ navigationLinks: page.navigationLinks,
102
+ };
103
+ this.crawledPages.push(crawledPage);
104
+ // Discover and queue new URLs
105
+ if (depth < this.options.maxDepth) {
106
+ const newUrls = this.discoverDocumentationLinks(page, depth + 1);
107
+ for (const newUrl of newUrls) {
108
+ if (!this.visitedUrls.has(newUrl.url)) {
109
+ this.urlQueue.push(newUrl);
110
+ }
111
+ }
112
+ }
113
+ // Rate limiting
114
+ if (this.options.rateLimit > 0 && this.urlQueue.length > 0) {
115
+ await this.delay(this.options.rateLimit);
116
+ }
117
+ }
118
+ catch (error) {
119
+ this.errors.push({
120
+ url,
121
+ error: error instanceof Error ? error.message : String(error),
122
+ });
123
+ // Continue crawling other pages
124
+ }
125
+ }
126
+ return {
127
+ pages: this.crawledPages,
128
+ totalPages: this.crawledPages.length,
129
+ maxDepthReached,
130
+ errors: this.errors,
131
+ };
132
+ }
133
+ /**
134
+ * Discover documentation links from a crawled page
135
+ */
136
+ discoverDocumentationLinks(page, nextDepth) {
137
+ const discovered = [];
138
+ for (const link of page.navigationLinks) {
139
+ // Only follow internal links
140
+ if (!link.isInternal) {
141
+ continue;
142
+ }
143
+ try {
144
+ const linkUrl = new URL(link.url);
145
+ // Must be same origin
146
+ if (linkUrl.origin !== this.baseUrl.origin) {
147
+ continue;
148
+ }
149
+ // Check if it's a documentation path
150
+ if (!this.isDocumentationPath(linkUrl.pathname)) {
151
+ continue;
152
+ }
153
+ // Check exclude patterns
154
+ if (this.shouldExclude(linkUrl.pathname)) {
155
+ continue;
156
+ }
157
+ // Check include patterns (if specified)
158
+ if (this.options.includePaths.length > 0) {
159
+ const matchesInclude = this.options.includePaths.some(pattern => linkUrl.pathname.includes(pattern));
160
+ if (!matchesInclude) {
161
+ continue;
162
+ }
163
+ }
164
+ // Check exclude patterns (if specified)
165
+ if (this.options.excludePaths.length > 0) {
166
+ const matchesExclude = this.options.excludePaths.some(pattern => linkUrl.pathname.includes(pattern));
167
+ if (matchesExclude) {
168
+ continue;
169
+ }
170
+ }
171
+ // Normalize URL (remove fragments)
172
+ const normalizedUrl = linkUrl.href.split('#')[0];
173
+ // Add to discovered links
174
+ discovered.push({
175
+ url: normalizedUrl,
176
+ depth: nextDepth,
177
+ });
178
+ }
179
+ catch (error) {
180
+ // Invalid URL, skip
181
+ continue;
182
+ }
183
+ }
184
+ return discovered;
185
+ }
186
+ /**
187
+ * Check if a path is a documentation path
188
+ */
189
+ isDocumentationPath(pathname) {
190
+ // Check against documentation patterns
191
+ return this.DOCUMENTATION_PATTERNS.some(pattern => pattern.test(pathname));
192
+ }
193
+ /**
194
+ * Check if a path should be excluded
195
+ */
196
+ shouldExclude(pathname) {
197
+ return this.EXCLUDED_PATTERNS.some(pattern => pattern.test(pathname));
198
+ }
199
+ /**
200
+ * Delay helper for rate limiting
201
+ */
202
+ delay(ms) {
203
+ return new Promise(resolve => setTimeout(resolve, ms));
204
+ }
205
+ }
206
+ //# sourceMappingURL=doc-crawler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc-crawler.js","sourceRoot":"","sources":["../../src/documentation/doc-crawler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import type { CrawlResult } from './doc-crawler.js';
2
+ export interface SkillMetadata {
3
+ title: string;
4
+ description: string;
5
+ sourceUrl: string;
6
+ pagesCrawled: number;
7
+ maxDepthReached: number;
8
+ generatedAt: string;
9
+ sourceUrls: string[];
10
+ }
11
+ export interface GeneratedSkill {
12
+ content: string;
13
+ metadata: SkillMetadata;
14
+ }
15
+ export declare class SkillGenerator {
16
+ /**
17
+ * Generate agent skill from crawled documentation
18
+ */
19
+ generateSkill(crawlResult: CrawlResult, rootUrl: string): GeneratedSkill;
20
+ /**
21
+ * Extract title from URL or first page
22
+ */
23
+ private extractTitle;
24
+ /**
25
+ * Generate description
26
+ */
27
+ private generateDescription;
28
+ /**
29
+ * Generate main content with table of contents and sections
30
+ */
31
+ private generateContent;
32
+ /**
33
+ * Generate skill manifest/metadata as JSON
34
+ */
35
+ generateManifest(metadata: SkillMetadata): string;
36
+ /**
37
+ * Save skill to file system
38
+ */
39
+ saveSkill(skill: GeneratedSkill, outputDir: string, filename?: string): Promise<{
40
+ skillFile: string;
41
+ manifestFile: string;
42
+ }>;
43
+ /**
44
+ * Generate filename from metadata
45
+ */
46
+ private generateFilename;
47
+ /**
48
+ * Slugify text for anchor links
49
+ */
50
+ private slugify;
51
+ /**
52
+ * Capitalize first letter
53
+ */
54
+ private capitalize;
55
+ }
56
+ //# sourceMappingURL=skill-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-generator.d.ts","sourceRoot":"","sources":["../../src/documentation/skill-generator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAe,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEjE,MAAM,WAAW,aAAa;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,aAAa,CAAC;CAC3B;AAED,qBAAa,cAAc;IACvB;;OAEG;IACH,aAAa,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc;IAiCxE;;OAEG;IACH,OAAO,CAAC,YAAY;IAiBpB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAI3B;;OAEG;IACH,OAAO,CAAC,eAAe;IAgDvB;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM;IAIjD;;OAEG;IACG,SAAS,CACX,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAsBvD;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAoBxB;;OAEG;IACH,OAAO,CAAC,OAAO;IASf;;OAEG;IACH,OAAO,CAAC,UAAU;CAGrB"}
@@ -0,0 +1,165 @@
1
+ import { writeFile, mkdir } from 'fs/promises';
2
+ import { join } from 'path';
3
+ export class SkillGenerator {
4
+ /**
5
+ * Generate agent skill from crawled documentation
6
+ */
7
+ generateSkill(crawlResult, rootUrl) {
8
+ const { pages, totalPages, maxDepthReached, errors } = crawlResult;
9
+ if (pages.length === 0) {
10
+ throw new Error('No pages were successfully crawled');
11
+ }
12
+ // Generate title from root URL or first page
13
+ const title = this.extractTitle(rootUrl, pages[0]);
14
+ // Generate description
15
+ const description = this.generateDescription(rootUrl, totalPages, maxDepthReached);
16
+ // Generate main content
17
+ const content = this.generateContent(pages, title);
18
+ // Generate metadata
19
+ const metadata = {
20
+ title,
21
+ description,
22
+ sourceUrl: rootUrl,
23
+ pagesCrawled: totalPages,
24
+ maxDepthReached,
25
+ generatedAt: new Date().toISOString(),
26
+ sourceUrls: pages.map(p => p.url),
27
+ };
28
+ return {
29
+ content,
30
+ metadata,
31
+ };
32
+ }
33
+ /**
34
+ * Extract title from URL or first page
35
+ */
36
+ extractTitle(rootUrl, firstPage) {
37
+ try {
38
+ const url = new URL(rootUrl);
39
+ const hostname = url.hostname.replace('www.', '');
40
+ const pathParts = url.pathname.split('/').filter(p => p);
41
+ if (pathParts.length > 0) {
42
+ const lastPart = pathParts[pathParts.length - 1];
43
+ return `${hostname} - ${this.capitalize(lastPart)} Documentation`;
44
+ }
45
+ return `${hostname} Documentation`;
46
+ }
47
+ catch {
48
+ return firstPage.title || 'Documentation';
49
+ }
50
+ }
51
+ /**
52
+ * Generate description
53
+ */
54
+ generateDescription(rootUrl, totalPages, maxDepth) {
55
+ return `Comprehensive documentation skill generated from ${rootUrl}. Crawled ${totalPages} pages up to depth ${maxDepth}.`;
56
+ }
57
+ /**
58
+ * Generate main content with table of contents and sections
59
+ */
60
+ generateContent(pages, title) {
61
+ const lines = [];
62
+ // Title
63
+ lines.push(`# ${title}\n`);
64
+ // Table of Contents
65
+ lines.push('## Table of Contents\n');
66
+ pages.forEach((page, index) => {
67
+ const sectionId = this.slugify(page.title || `Page ${index + 1}`);
68
+ lines.push(`- [${page.title || `Page ${index + 1}`}](#${sectionId})`);
69
+ });
70
+ lines.push('');
71
+ // Content sections
72
+ pages.forEach((page, index) => {
73
+ const sectionId = this.slugify(page.title || `Page ${index + 1}`);
74
+ // Section header
75
+ lines.push(`## ${page.title || `Page ${index + 1}`} {#${sectionId}}\n`);
76
+ // Source URL
77
+ lines.push(`**Source:** [${page.url}](${page.url})\n`);
78
+ // If page has sections, use them; otherwise use full content
79
+ if (page.sections.length > 0) {
80
+ page.sections.forEach(section => {
81
+ if (section.title && section.content) {
82
+ lines.push(`### ${section.title}\n`);
83
+ lines.push(section.content);
84
+ lines.push('');
85
+ }
86
+ });
87
+ }
88
+ else if (page.content) {
89
+ // Use full content if no sections
90
+ lines.push(page.content);
91
+ lines.push('');
92
+ }
93
+ // Separator between pages
94
+ if (index < pages.length - 1) {
95
+ lines.push('---\n');
96
+ }
97
+ });
98
+ return lines.join('\n');
99
+ }
100
+ /**
101
+ * Generate skill manifest/metadata as JSON
102
+ */
103
+ generateManifest(metadata) {
104
+ return JSON.stringify(metadata, null, 2);
105
+ }
106
+ /**
107
+ * Save skill to file system
108
+ */
109
+ async saveSkill(skill, outputDir, filename) {
110
+ // Generate filename from metadata if not provided
111
+ const skillFilename = filename || this.generateFilename(skill.metadata);
112
+ // Ensure output directory exists
113
+ await mkdir(outputDir, { recursive: true });
114
+ // Save skill content
115
+ const skillFile = join(outputDir, `${skillFilename}.md`);
116
+ await writeFile(skillFile, skill.content, 'utf-8');
117
+ // Save manifest
118
+ const manifestFile = join(outputDir, `${skillFilename}.metadata.json`);
119
+ const manifest = this.generateManifest(skill.metadata);
120
+ await writeFile(manifestFile, manifest, 'utf-8');
121
+ return {
122
+ skillFile,
123
+ manifestFile,
124
+ };
125
+ }
126
+ /**
127
+ * Generate filename from metadata
128
+ */
129
+ generateFilename(metadata) {
130
+ try {
131
+ const url = new URL(metadata.sourceUrl);
132
+ const hostname = url.hostname.replace('www.', '').replace(/\./g, '-');
133
+ const pathParts = url.pathname.split('/').filter(p => p);
134
+ const pathPart = pathParts.length > 0 ? pathParts[pathParts.length - 1] : 'docs';
135
+ // Sanitize filename
136
+ const sanitized = `${hostname}-${pathPart}`
137
+ .toLowerCase()
138
+ .replace(/[^a-z0-9-]/g, '-')
139
+ .replace(/-+/g, '-')
140
+ .replace(/^-|-$/g, '');
141
+ return sanitized || 'documentation-skill';
142
+ }
143
+ catch {
144
+ return 'documentation-skill';
145
+ }
146
+ }
147
+ /**
148
+ * Slugify text for anchor links
149
+ */
150
+ slugify(text) {
151
+ return text
152
+ .toLowerCase()
153
+ .replace(/[^\w\s-]/g, '')
154
+ .replace(/\s+/g, '-')
155
+ .replace(/-+/g, '-')
156
+ .trim();
157
+ }
158
+ /**
159
+ * Capitalize first letter
160
+ */
161
+ capitalize(text) {
162
+ return text.charAt(0).toUpperCase() + text.slice(1);
163
+ }
164
+ }
165
+ //# sourceMappingURL=skill-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-generator.js","sourceRoot":"","sources":["../../src/documentation/skill-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAW,MAAM,MAAM,CAAC;AAkBrC,MAAM,OAAO,cAAc;IACvB;;OAEG;IACH,aAAa,CAAC,WAAwB,EAAE,OAAe;QACnD,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC;QAEnE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAC1D,CAAC;QAED,6CAA6C;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAEnD,uBAAuB;QACvB,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;QAEnF,wBAAwB;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAEnD,oBAAoB;QACpB,MAAM,QAAQ,GAAkB;YAC5B,KAAK;YACL,WAAW;YACX,SAAS,EAAE,OAAO;YAClB,YAAY,EAAE,UAAU;YACxB,eAAe;YACf,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACrC,UAAU,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;SACpC,CAAC;QAEF,OAAO;YACH,OAAO;YACP,QAAQ;SACX,CAAC;IACN,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,OAAe,EAAE,SAAsB;QACxD,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;YAC7B,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAClD,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAEzD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACjD,OAAO,GAAG,QAAQ,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YACtE,CAAC;YAED,OAAO,GAAG,QAAQ,gBAAgB,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,SAAS,CAAC,KAAK,IAAI,eAAe,CAAC;QAC9C,CAAC;IACL,CAAC;IAED;;OAEG;IACK,mBAAmB,CAAC,OAAe,EAAE,UAAkB,EAAE,QAAgB;QAC7E,OAAO,oDAAoD,OAAO,aAAa,UAAU,sBAAsB,QAAQ,GAAG,CAAC;IAC/H,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,KAAoB,EAAE,KAAa;QACvD,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,QAAQ;QACR,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;QAE3B,oBAAoB;QACpB,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACrC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,QAAQ,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;YAClE,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,IAAI,QAAQ,KAAK,GAAG,CAAC,EAAE,MAAM,SAAS,GAAG,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,mBAAmB;QACnB,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,QAAQ,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;YAElE,iBAAiB;YACjB,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,IAAI,QAAQ,KAAK,GAAG,CAAC,EAAE,MAAM,SAAS,KAAK,CAAC,CAAC;YAExE,aAAa;YACb,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;YAEvD,6DAA6D;YAC7D,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;oBAC5B,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;wBACnC,KAAK,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;wBACrC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;wBAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACnB,CAAC;gBACL,CAAC,CAAC,CAAC;YACP,CAAC;iBAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACtB,kCAAkC;gBAClC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACzB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnB,CAAC;YAED,0BAA0B;YAC1B,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACxB,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,QAAuB;QACpC,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CACX,KAAqB,EACrB,SAAiB,EACjB,QAAiB;QAEjB,kDAAkD;QAClD,MAAM,aAAa,GAAG,QAAQ,IAAI,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAExE,iCAAiC;QACjC,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE5C,qBAAqB;QACrB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,aAAa,KAAK,CAAC,CAAC;QACzD,MAAM,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAEnD,gBAAgB;QAChB,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,aAAa,gBAAgB,CAAC,CAAC;QACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,SAAS,CAAC,YAAY,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAEjD,OAAO;YACH,SAAS;YACT,YAAY;SACf,CAAC;IACN,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,QAAuB;QAC5C,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YACxC,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACtE,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACzD,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAEjF,oBAAoB;YACpB,MAAM,SAAS,GAAG,GAAG,QAAQ,IAAI,QAAQ,EAAE;iBACtC,WAAW,EAAE;iBACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;iBAC3B,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;iBACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAE3B,OAAO,SAAS,IAAI,qBAAqB,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,qBAAqB,CAAC;QACjC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,OAAO,CAAC,IAAY;QACxB,OAAO,IAAI;aACN,WAAW,EAAE;aACb,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;aACxB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;aACpB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;aACnB,IAAI,EAAE,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,IAAY;QAC3B,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC;CACJ"}
@@ -0,0 +1,41 @@
1
+ import { HttpClient } from '../utils/http-client.js';
2
+ export interface WebDocumentationPage {
3
+ url: string;
4
+ title: string;
5
+ content: string;
6
+ isDocumentation: boolean;
7
+ navigationLinks: Array<{
8
+ text: string;
9
+ url: string;
10
+ isInternal: boolean;
11
+ }>;
12
+ sections: Array<{
13
+ title: string;
14
+ content: string;
15
+ anchor?: string;
16
+ }>;
17
+ searchableContent: string;
18
+ }
19
+ export declare class WebDocumentationBrowser {
20
+ private httpClient;
21
+ private readonly DOCUMENTATION_INDICATORS;
22
+ private readonly NON_DOCUMENTATION_INDICATORS;
23
+ constructor(httpClient?: HttpClient);
24
+ /**
25
+ * Check if a URL is likely a documentation page
26
+ */
27
+ isDocumentationPage(url: string): Promise<boolean>;
28
+ /**
29
+ * Browse a documentation page and extract content
30
+ */
31
+ browsePage(url: string, query?: string): Promise<WebDocumentationPage>;
32
+ /**
33
+ * Navigate to a specific page in the documentation
34
+ */
35
+ navigateTo(url: string, baseUrl?: string): Promise<WebDocumentationPage>;
36
+ /**
37
+ * Parse HTML and extract documentation content
38
+ */
39
+ private parseHTML;
40
+ }
41
+ //# sourceMappingURL=web-doc-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-doc-browser.d.ts","sourceRoot":"","sources":["../../src/documentation/web-doc-browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAGrD,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,EAAE,KAAK,CAAC;QACrB,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC,CAAC;IACH,QAAQ,EAAE,KAAK,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,qBAAa,uBAAuB;IAClC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAcvC;IAEF,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAI3C;gBAEU,UAAU,CAAC,EAAE,UAAU;IAInC;;OAEG;IACG,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA2CxD;;OAEG;IACG,UAAU,CACd,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,oBAAoB,CAAC;IAuEhC;;OAEG;IACG,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAU9E;;OAEG;IACH,OAAO,CAAC,SAAS;CA8HlB"}
@@ -0,0 +1,251 @@
1
+ import { HttpClient } from '../utils/http-client.js';
2
+ export class WebDocumentationBrowser {
3
+ httpClient;
4
+ DOCUMENTATION_INDICATORS = [
5
+ // URL patterns
6
+ /\/docs?\//i,
7
+ /\/documentation/i,
8
+ /\/guide/i,
9
+ /\/tutorial/i,
10
+ /\/api/i,
11
+ /\/reference/i,
12
+ /\/manual/i,
13
+ /\/help/i,
14
+ // HTML content indicators
15
+ /documentation|docs|guide|tutorial|api reference|getting started/i,
16
+ // Meta tags
17
+ /og:type.*article|documentation/i,
18
+ ];
19
+ NON_DOCUMENTATION_INDICATORS = [
20
+ /\.(jpg|jpeg|png|gif|svg|pdf|zip|exe|dmg)$/i,
21
+ /login|signup|register|checkout|cart|payment/i,
22
+ /404|not found|error/i,
23
+ ];
24
+ constructor(httpClient) {
25
+ this.httpClient = httpClient || new HttpClient();
26
+ }
27
+ /**
28
+ * Check if a URL is likely a documentation page
29
+ */
30
+ async isDocumentationPage(url) {
31
+ try {
32
+ // Quick URL check first
33
+ if (this.NON_DOCUMENTATION_INDICATORS.some(pattern => pattern.test(url))) {
34
+ return false;
35
+ }
36
+ // Check URL patterns
37
+ const hasDocPattern = this.DOCUMENTATION_INDICATORS.some(pattern => pattern.test(url));
38
+ if (hasDocPattern) {
39
+ return true;
40
+ }
41
+ // Fetch a small sample to check content
42
+ const response = await this.httpClient.get(url, {
43
+ timeout: 5000,
44
+ headers: {
45
+ 'User-Agent': 'Safe-Coder-MCP/1.0.0',
46
+ 'Accept': 'text/html',
47
+ },
48
+ maxContentLength: 50000, // Limit to 50KB for quick check
49
+ });
50
+ const html = typeof response.data === 'string' ? response.data : String(response.data);
51
+ // Check for documentation indicators in HTML
52
+ const hasDocContent = this.DOCUMENTATION_INDICATORS.some(pattern => pattern.test(html));
53
+ const hasNonDocContent = this.NON_DOCUMENTATION_INDICATORS.some(pattern => pattern.test(html));
54
+ // Check for common documentation HTML structures
55
+ const hasDocStructure = /<nav[^>]*>.*?(?:table of contents|toc|sidebar|menu)/is.test(html) ||
56
+ /<aside[^>]*>.*?(?:navigation|toc|sidebar)/is.test(html) ||
57
+ /class="[^"]*(?:doc|documentation|guide|tutorial|api)[^"]*"/i.test(html);
58
+ return (hasDocContent || hasDocStructure) && !hasNonDocContent;
59
+ }
60
+ catch (error) {
61
+ // If we can't fetch, assume it might be documentation
62
+ // Let the full fetch handle the error
63
+ return true;
64
+ }
65
+ }
66
+ /**
67
+ * Browse a documentation page and extract content
68
+ */
69
+ async browsePage(url, query) {
70
+ try {
71
+ const fullUrl = url.startsWith('http') ? url : `https://${url}`;
72
+ const baseUrl = new URL(fullUrl).origin;
73
+ const response = await this.httpClient.get(fullUrl, {
74
+ timeout: 15000,
75
+ headers: {
76
+ 'User-Agent': 'Safe-Coder-MCP/1.0.0',
77
+ 'Accept': 'text/html',
78
+ },
79
+ });
80
+ const html = typeof response.data === 'string' ? response.data : String(response.data);
81
+ // Check if it's documentation
82
+ const isDoc = await this.isDocumentationPage(fullUrl);
83
+ if (!isDoc) {
84
+ throw new Error('The provided URL does not appear to be a documentation page. Please provide a documentation URL (e.g., /docs/, /documentation/, /guide/, /api/, etc.)');
85
+ }
86
+ // Parse HTML
87
+ const parsed = this.parseHTML(html, baseUrl, fullUrl);
88
+ // Filter content by query if provided
89
+ let filteredContent = parsed.content;
90
+ let filteredSections = parsed.sections;
91
+ if (query) {
92
+ const queryLower = query.toLowerCase();
93
+ filteredSections = parsed.sections.filter(section => section.title.toLowerCase().includes(queryLower) ||
94
+ section.content.toLowerCase().includes(queryLower));
95
+ if (filteredSections.length > 0) {
96
+ filteredContent = filteredSections.map(s => `## ${s.title}\n\n${s.content}`).join('\n\n');
97
+ }
98
+ else {
99
+ // If no sections match, search in full content
100
+ if (parsed.searchableContent.toLowerCase().includes(queryLower)) {
101
+ // Extract relevant paragraphs
102
+ const paragraphs = parsed.content.split('\n\n');
103
+ const relevant = paragraphs.filter(p => p.toLowerCase().includes(queryLower));
104
+ filteredContent = relevant.join('\n\n');
105
+ }
106
+ else {
107
+ filteredContent = `No content found matching "${query}". Showing full page content:\n\n${parsed.content}`;
108
+ }
109
+ }
110
+ }
111
+ return {
112
+ url: fullUrl,
113
+ title: parsed.title,
114
+ content: filteredContent,
115
+ isDocumentation: true,
116
+ navigationLinks: parsed.navigationLinks,
117
+ sections: filteredSections.length > 0 ? filteredSections : parsed.sections,
118
+ searchableContent: parsed.searchableContent,
119
+ };
120
+ }
121
+ catch (error) {
122
+ if (error instanceof Error && error.message.includes('does not appear to be a documentation')) {
123
+ throw error;
124
+ }
125
+ throw new Error(`Failed to browse documentation page: ${error instanceof Error ? error.message : 'Unknown error'}`);
126
+ }
127
+ }
128
+ /**
129
+ * Navigate to a specific page in the documentation
130
+ */
131
+ async navigateTo(url, baseUrl) {
132
+ const fullUrl = url.startsWith('http')
133
+ ? url
134
+ : baseUrl
135
+ ? new URL(url, baseUrl).href
136
+ : `https://${url}`;
137
+ return this.browsePage(fullUrl);
138
+ }
139
+ /**
140
+ * Parse HTML and extract documentation content
141
+ */
142
+ parseHTML(html, baseUrl, currentUrl) {
143
+ // Extract title
144
+ const titleMatch = html.match(/<title[^>]*>([^<]+)<\/title>/i);
145
+ const title = titleMatch ? titleMatch[1].trim() : 'Documentation';
146
+ // Remove scripts and styles
147
+ let cleanHtml = html
148
+ .replace(/<script[^>]*>[\s\S]*?<\/script>/gi, '')
149
+ .replace(/<style[^>]*>[\s\S]*?<\/style>/gi, '')
150
+ .replace(/<!--[\s\S]*?-->/g, '');
151
+ // Extract navigation links
152
+ const navigationLinks = [];
153
+ // Find nav, aside, or sidebar elements
154
+ const navMatches = cleanHtml.match(/<(?:nav|aside)[^>]*>([\s\S]*?)<\/(?:nav|aside)>/gi);
155
+ if (navMatches) {
156
+ navMatches.forEach(navHtml => {
157
+ const linkMatches = navHtml.matchAll(/<a[^>]+href=["']([^"']+)["'][^>]*>([^<]+)<\/a>/gi);
158
+ for (const match of linkMatches) {
159
+ const href = match[1];
160
+ const text = match[2].replace(/<[^>]+>/g, '').trim();
161
+ if (text && href) {
162
+ try {
163
+ const fullUrl = href.startsWith('http')
164
+ ? href
165
+ : new URL(href, baseUrl).href;
166
+ const isInternal = new URL(fullUrl).origin === new URL(currentUrl).origin;
167
+ navigationLinks.push({ text, url: fullUrl, isInternal });
168
+ }
169
+ catch {
170
+ // Invalid URL, skip
171
+ }
172
+ }
173
+ }
174
+ });
175
+ }
176
+ // Extract main content
177
+ // Try to find main content area
178
+ let mainContent = '';
179
+ const mainMatches = cleanHtml.match(/<main[^>]*>([\s\S]*?)<\/main>/i) ||
180
+ cleanHtml.match(/<article[^>]*>([\s\S]*?)<\/article>/i) ||
181
+ cleanHtml.match(/<div[^>]*class="[^"]*(?:content|main|documentation|doc)[^"]*"[^>]*>([\s\S]*?)<\/div>/i);
182
+ if (mainMatches) {
183
+ mainContent = mainMatches[1];
184
+ }
185
+ else {
186
+ // Fallback: use body content
187
+ const bodyMatch = cleanHtml.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
188
+ mainContent = bodyMatch ? bodyMatch[1] : cleanHtml;
189
+ }
190
+ // Convert HTML to markdown-like text
191
+ let textContent = mainContent
192
+ // Headers
193
+ .replace(/<h([1-6])[^>]*>([^<]+)<\/h[1-6]>/gi, (_, level, text) => {
194
+ const prefix = '#'.repeat(parseInt(level));
195
+ return `\n${prefix} ${text.trim()}\n`;
196
+ })
197
+ // Links
198
+ .replace(/<a[^>]+href=["']([^"']+)["'][^>]*>([^<]+)<\/a>/gi, '[$2]($1)')
199
+ // Code blocks
200
+ .replace(/<pre[^>]*><code[^>]*>([\s\S]*?)<\/code><\/pre>/gi, '```\n$1\n```')
201
+ .replace(/<code[^>]*>([^<]+)<\/code>/gi, '`$1`')
202
+ // Lists
203
+ .replace(/<li[^>]*>([^<]+)<\/li>/gi, '- $1')
204
+ // Paragraphs
205
+ .replace(/<p[^>]*>([^<]+)<\/p>/gi, '$1\n')
206
+ // Remove remaining HTML tags
207
+ .replace(/<[^>]+>/g, ' ')
208
+ // Clean up whitespace
209
+ .replace(/\n{3,}/g, '\n\n')
210
+ .replace(/[ \t]+/g, ' ')
211
+ .trim();
212
+ // Extract sections (based on headers)
213
+ const sections = [];
214
+ const sectionMatches = textContent.matchAll(/(?:^|\n)(#{1,6})\s+(.+?)(?=\n#{1,6}|\n*$)/gs);
215
+ let lastIndex = 0;
216
+ for (const match of sectionMatches) {
217
+ const headerLevel = match[1].length;
218
+ const headerText = match[2].trim();
219
+ const startIndex = match.index || 0;
220
+ // Get content until next header of same or higher level
221
+ const nextHeaderPattern = new RegExp(`\n#{1,${headerLevel}}\\s+`, 'g');
222
+ nextHeaderPattern.lastIndex = startIndex + match[0].length;
223
+ const nextMatch = nextHeaderPattern.exec(textContent);
224
+ const endIndex = nextMatch ? nextMatch.index : textContent.length;
225
+ const sectionContent = textContent.substring(startIndex + match[0].length, endIndex).trim();
226
+ if (sectionContent) {
227
+ sections.push({
228
+ title: headerText,
229
+ content: sectionContent,
230
+ anchor: `#${headerText.toLowerCase().replace(/\s+/g, '-')}`,
231
+ });
232
+ }
233
+ lastIndex = endIndex;
234
+ }
235
+ // If no sections found, create one from all content
236
+ if (sections.length === 0 && textContent) {
237
+ sections.push({
238
+ title: title,
239
+ content: textContent,
240
+ });
241
+ }
242
+ return {
243
+ title,
244
+ content: textContent || 'No content extracted',
245
+ navigationLinks: navigationLinks.slice(0, 50), // Limit to 50 links
246
+ sections,
247
+ searchableContent: textContent.toLowerCase(),
248
+ };
249
+ }
250
+ }
251
+ //# sourceMappingURL=web-doc-browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-doc-browser.js","sourceRoot":"","sources":["../../src/documentation/web-doc-browser.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,9 @@
1
1
  export declare class SafeCoderMCPServer {
2
2
  private server;
3
3
  private documentationService;
4
+ private webDocBrowser;
5
+ private docCrawler;
6
+ private skillGenerator;
4
7
  private errorDetection;
5
8
  private validation;
6
9
  constructor();
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/server/mcp-server.ts"],"names":[],"mappings":"AAUA,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,oBAAoB,CAAuB;IACnD,OAAO,CAAC,cAAc,CAAwB;IAC9C,OAAO,CAAC,UAAU,CAAwB;;IA6B1C,OAAO,CAAC,UAAU;IA2QlB,OAAO,CAAC,cAAc;IAqDhB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAO3B"}
1
+ {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/server/mcp-server.ts"],"names":[],"mappings":"AAcA,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,oBAAoB,CAAuB;IACnD,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,cAAc,CAAwB;IAC9C,OAAO,CAAC,UAAU,CAAwB;;IAoC1C,OAAO,CAAC,UAAU;IA0clB,OAAO,CAAC,cAAc;IAqDhB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAO3B"}
@@ -2,13 +2,20 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
2
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
3
  import { z } from 'zod';
4
4
  import { DocumentationService } from '../documentation/index.js';
5
+ import { WebDocumentationBrowser } from '../documentation/web-doc-browser.js';
6
+ import { DocumentationCrawler } from '../documentation/doc-crawler.js';
7
+ import { SkillGenerator } from '../documentation/skill-generator.js';
5
8
  import { ErrorDetectionService } from '../errors/index.js';
6
9
  import { CodeValidationService } from '../validation/index.js';
7
10
  import { loadConfig } from '../utils/config.js';
8
11
  import { logger } from '../utils/logger.js';
12
+ import { HttpClient } from '../utils/http-client.js';
9
13
  export class SafeCoderMCPServer {
10
14
  server;
11
15
  documentationService;
16
+ webDocBrowser;
17
+ docCrawler;
18
+ skillGenerator;
12
19
  errorDetection;
13
20
  validation;
14
21
  constructor() {
@@ -19,6 +26,9 @@ export class SafeCoderMCPServer {
19
26
  // Initialize services with configuration
20
27
  const config = loadConfig();
21
28
  this.documentationService = new DocumentationService(config.cacheTTLMinutes, config.githubToken, config.proxy);
29
+ this.webDocBrowser = new WebDocumentationBrowser(config.proxy ? new HttpClient(config.proxy) : undefined);
30
+ this.docCrawler = new DocumentationCrawler(config.proxy ? new HttpClient(config.proxy) : undefined);
31
+ this.skillGenerator = new SkillGenerator();
22
32
  this.errorDetection = new ErrorDetectionService(config.errorDetection?.enableRuntime ?? true, config.errorDetection?.enablePerformance ?? true, config.errorDetection?.enableSecurity ?? true, config.errorDetection?.enableFramework ?? true, config.errorDetection?.enableApiValidation ?? true, config.errorDetection?.enableCrossFile ?? false);
23
33
  this.validation = new CodeValidationService();
24
34
  this.setupTools();
@@ -189,7 +199,7 @@ export class SafeCoderMCPServer {
189
199
  status: 'running',
190
200
  uptime: process.uptime(),
191
201
  version: '1.0.0',
192
- tools: ['get_documentation', 'detect_errors', 'validate_code', 'resolve_error', 'get_status'],
202
+ tools: ['get_documentation', 'browse_documentation', 'crawl_documentation', 'detect_errors', 'validate_code', 'resolve_error', 'get_status'],
193
203
  cacheSize: cache.size(),
194
204
  pid: process.pid,
195
205
  };
@@ -255,6 +265,181 @@ export class SafeCoderMCPServer {
255
265
  throw error;
256
266
  }
257
267
  });
268
+ // Register browse_documentation tool
269
+ this.server.registerTool('browse_documentation', {
270
+ title: 'Browse Web Documentation',
271
+ description: 'Browse and search web documentation pages. Use this when the user provides a documentation URL and wants to view specific content, navigate to different pages, or search within documentation. The tool automatically checks if the URL is a documentation page and only processes documentation sites to save tokens. Supports query-based content filtering and navigation links extraction. Trigger phrases (English): "browse docs", "view documentation page", "navigate to", "show me the docs at", "documentation URL". Trigger phrases (Chinese): "浏览文档", "查看文档页面", "导航到", "显示文档", "文档地址".',
272
+ inputSchema: {
273
+ url: z.string().describe('The documentation URL to browse'),
274
+ query: z.string().optional().describe('Optional search query to filter content (e.g., "authentication", "API reference")'),
275
+ navigateTo: z.string().optional().describe('Optional relative or absolute URL to navigate to within the documentation'),
276
+ },
277
+ outputSchema: {
278
+ url: z.string(),
279
+ title: z.string(),
280
+ content: z.string(),
281
+ isDocumentation: z.boolean(),
282
+ navigationLinks: z.array(z.object({
283
+ text: z.string(),
284
+ url: z.string(),
285
+ isInternal: z.boolean(),
286
+ })),
287
+ sections: z.array(z.object({
288
+ title: z.string(),
289
+ content: z.string(),
290
+ anchor: z.string().optional(),
291
+ })),
292
+ },
293
+ }, async (args) => {
294
+ const requestId = logger.generateRequestId();
295
+ const startTime = Date.now();
296
+ const { url, query, navigateTo } = args;
297
+ logger.toolInvoked('browse_documentation', requestId, { url, query, navigateTo });
298
+ try {
299
+ let page;
300
+ if (navigateTo) {
301
+ page = await this.webDocBrowser.navigateTo(navigateTo, url);
302
+ }
303
+ else {
304
+ page = await this.webDocBrowser.browsePage(url, query);
305
+ }
306
+ const duration = Date.now() - startTime;
307
+ logger.toolCompleted('browse_documentation', requestId, duration, true);
308
+ return {
309
+ content: [
310
+ {
311
+ type: 'text',
312
+ text: JSON.stringify({
313
+ url: page.url,
314
+ title: page.title,
315
+ content: page.content,
316
+ navigationLinks: page.navigationLinks.slice(0, 20), // Limit for display
317
+ sections: page.sections,
318
+ }, null, 2),
319
+ },
320
+ ],
321
+ structuredContent: {
322
+ url: page.url,
323
+ title: page.title,
324
+ content: page.content,
325
+ isDocumentation: page.isDocumentation,
326
+ navigationLinks: page.navigationLinks,
327
+ sections: page.sections,
328
+ },
329
+ };
330
+ }
331
+ catch (error) {
332
+ const duration = Date.now() - startTime;
333
+ logger.toolError('browse_documentation', requestId, error instanceof Error ? error : new Error(String(error)), { url, query });
334
+ throw error;
335
+ }
336
+ });
337
+ // Register crawl_documentation tool
338
+ this.server.registerTool('crawl_documentation', {
339
+ title: 'Crawl Documentation and Generate Agent Skill',
340
+ description: 'Recursively crawl documentation websites starting from a root URL, follow documentation links, extract content from multiple pages, and generate structured agent skill output. Use this when the user wants to automatically aggregate documentation from a website, create comprehensive documentation skills, or crawl multiple documentation pages. The tool automatically detects documentation boundaries, follows links within the same domain and documentation paths, and generates Markdown-formatted skill output. Trigger phrases (English): "crawl documentation", "generate skill from docs", "scrape documentation site", "create agent skill from", "crawl docs from". Trigger phrases (Chinese): "爬取文档", "生成技能", "抓取文档网站", "从文档生成技能", "递归抓取文档".',
341
+ inputSchema: {
342
+ url: z.string().describe('Root documentation URL to start crawling from'),
343
+ maxDepth: z.number().optional().describe('Maximum crawl depth (default: 3)'),
344
+ maxPages: z.number().optional().describe('Maximum number of pages to crawl (default: 50)'),
345
+ includePaths: z.array(z.string()).optional().describe('Additional path patterns to include in crawl'),
346
+ excludePaths: z.array(z.string()).optional().describe('Path patterns to exclude from crawl'),
347
+ rateLimit: z.number().optional().describe('Delay in milliseconds between requests (default: 500)'),
348
+ outputDir: z.string().optional().describe('Directory to save skill files (default: no file saved, only returns content)'),
349
+ filename: z.string().optional().describe('Custom filename for skill file (without extension)'),
350
+ },
351
+ outputSchema: {
352
+ skillContent: z.string(),
353
+ metadata: z.object({
354
+ title: z.string(),
355
+ description: z.string(),
356
+ sourceUrl: z.string(),
357
+ pagesCrawled: z.number(),
358
+ maxDepthReached: z.number(),
359
+ generatedAt: z.string(),
360
+ sourceUrls: z.array(z.string()),
361
+ }),
362
+ crawlStats: z.object({
363
+ totalPages: z.number(),
364
+ maxDepthReached: z.number(),
365
+ errors: z.array(z.object({
366
+ url: z.string(),
367
+ error: z.string(),
368
+ })),
369
+ }),
370
+ files: z.object({
371
+ skillFile: z.string().optional(),
372
+ manifestFile: z.string().optional(),
373
+ }).optional(),
374
+ },
375
+ }, async (args) => {
376
+ const requestId = logger.generateRequestId();
377
+ const startTime = Date.now();
378
+ const { url, maxDepth, maxPages, includePaths, excludePaths, rateLimit, outputDir, filename } = args;
379
+ logger.toolInvoked('crawl_documentation', requestId, { url, maxDepth, maxPages, outputDir });
380
+ try {
381
+ // Crawl documentation
382
+ const crawlResult = await this.docCrawler.crawl(url, {
383
+ maxDepth,
384
+ maxPages,
385
+ includePaths,
386
+ excludePaths,
387
+ rateLimit,
388
+ });
389
+ // Generate skill
390
+ const skill = this.skillGenerator.generateSkill(crawlResult, url);
391
+ // Save to file if outputDir is provided
392
+ let files;
393
+ if (outputDir) {
394
+ try {
395
+ const savedFiles = await this.skillGenerator.saveSkill(skill, outputDir, filename);
396
+ files = {
397
+ skillFile: savedFiles.skillFile,
398
+ manifestFile: savedFiles.manifestFile,
399
+ };
400
+ logger.info(`Skill saved to: ${savedFiles.skillFile}`);
401
+ }
402
+ catch (saveError) {
403
+ logger.warn(`Failed to save skill files: ${saveError instanceof Error ? saveError.message : String(saveError)}`);
404
+ // Continue even if file save fails
405
+ }
406
+ }
407
+ const duration = Date.now() - startTime;
408
+ logger.toolCompleted('crawl_documentation', requestId, duration, true);
409
+ return {
410
+ content: [
411
+ {
412
+ type: 'text',
413
+ text: JSON.stringify({
414
+ skillContent: skill.content,
415
+ metadata: skill.metadata,
416
+ crawlStats: {
417
+ totalPages: crawlResult.totalPages,
418
+ maxDepthReached: crawlResult.maxDepthReached,
419
+ errors: crawlResult.errors,
420
+ },
421
+ files,
422
+ }, null, 2),
423
+ },
424
+ ],
425
+ structuredContent: {
426
+ skillContent: skill.content,
427
+ metadata: skill.metadata,
428
+ crawlStats: {
429
+ totalPages: crawlResult.totalPages,
430
+ maxDepthReached: crawlResult.maxDepthReached,
431
+ errors: crawlResult.errors,
432
+ },
433
+ files,
434
+ },
435
+ };
436
+ }
437
+ catch (error) {
438
+ const duration = Date.now() - startTime;
439
+ logger.toolError('crawl_documentation', requestId, error instanceof Error ? error : new Error(String(error)), { url });
440
+ throw error;
441
+ }
442
+ });
258
443
  }
259
444
  setupResources() {
260
445
  // Register documentation resource
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../src/server/mcp-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../src/server/mcp-server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gulibs/safe-coder",
3
- "version": "0.0.11",
3
+ "version": "0.0.13",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "registry": "https://registry.npmjs.org"