@shuji-bonji/rfcxml-mcp 0.3.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ja.md +39 -33
- package/README.md +37 -29
- package/dist/config.d.ts +26 -26
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +28 -25
- package/dist/config.js.map +1 -1
- package/dist/constants.d.ts +30 -5
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +49 -7
- package/dist/constants.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +18 -17
- package/dist/index.js.map +1 -1
- package/dist/services/checklist-generator.d.ts +43 -0
- package/dist/services/checklist-generator.d.ts.map +1 -0
- package/dist/services/checklist-generator.js +107 -0
- package/dist/services/checklist-generator.js.map +1 -0
- package/dist/services/rfc-fetcher.d.ts +11 -11
- package/dist/services/rfc-fetcher.d.ts.map +1 -1
- package/dist/services/rfc-fetcher.js +37 -31
- package/dist/services/rfc-fetcher.js.map +1 -1
- package/dist/services/rfc-text-parser.d.ts +4 -6
- package/dist/services/rfc-text-parser.d.ts.map +1 -1
- package/dist/services/rfc-text-parser.js +9 -40
- package/dist/services/rfc-text-parser.js.map +1 -1
- package/dist/services/rfcxml-parser.d.ts +5 -18
- package/dist/services/rfcxml-parser.d.ts.map +1 -1
- package/dist/services/rfcxml-parser.js +21 -95
- package/dist/services/rfcxml-parser.js.map +1 -1
- package/dist/tools/definitions.d.ts +1 -1
- package/dist/tools/definitions.js +27 -27
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/handlers.d.ts +48 -21
- package/dist/tools/handlers.d.ts.map +1 -1
- package/dist/tools/handlers.js +72 -156
- package/dist/tools/handlers.js.map +1 -1
- package/dist/types/index.d.ts +17 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/requirement-extractor.d.ts +24 -0
- package/dist/utils/requirement-extractor.d.ts.map +1 -0
- package/dist/utils/requirement-extractor.js +100 -0
- package/dist/utils/requirement-extractor.js.map +1 -0
- package/dist/utils/section.d.ts +21 -0
- package/dist/utils/section.d.ts.map +1 -0
- package/dist/utils/section.js +53 -0
- package/dist/utils/section.js.map +1 -0
- package/dist/utils/text.d.ts.map +1 -1
- package/dist/utils/text.js +3 -2
- package/dist/utils/text.js.map +1 -1
- package/dist/utils/validation.d.ts +14 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +30 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,28 +1,29 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
3
|
* RFCXML MCP Server
|
|
4
|
-
*
|
|
4
|
+
* MCP server for structural understanding of RFC documents
|
|
5
5
|
*/
|
|
6
6
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
7
7
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
8
8
|
import { CallToolRequestSchema, ListToolsRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
9
9
|
import { tools } from './tools/definitions.js';
|
|
10
10
|
import { toolHandlers } from './tools/handlers.js';
|
|
11
|
-
|
|
11
|
+
import { PACKAGE_INFO } from './config.js';
|
|
12
|
+
// Server instance
|
|
12
13
|
const server = new Server({
|
|
13
|
-
name:
|
|
14
|
-
version:
|
|
14
|
+
name: PACKAGE_INFO.name,
|
|
15
|
+
version: PACKAGE_INFO.version,
|
|
15
16
|
}, {
|
|
16
17
|
capabilities: {
|
|
17
18
|
tools: {},
|
|
18
19
|
resources: {},
|
|
19
20
|
},
|
|
20
21
|
});
|
|
21
|
-
//
|
|
22
|
+
// List tools
|
|
22
23
|
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
23
24
|
return { tools };
|
|
24
25
|
});
|
|
25
|
-
//
|
|
26
|
+
// Execute tool
|
|
26
27
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
27
28
|
const { name, arguments: args } = request.params;
|
|
28
29
|
try {
|
|
@@ -43,20 +44,20 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
43
44
|
};
|
|
44
45
|
}
|
|
45
46
|
});
|
|
46
|
-
//
|
|
47
|
+
// List resources (RFC schema)
|
|
47
48
|
server.setRequestHandler(ListResourcesRequestSchema, async () => {
|
|
48
49
|
return {
|
|
49
50
|
resources: [
|
|
50
51
|
{
|
|
51
52
|
uri: 'rfcxml://schema',
|
|
52
53
|
name: 'RFCXML Schema Information',
|
|
53
|
-
description: 'RFCXML v3
|
|
54
|
+
description: 'RFCXML v3 structure and schema information',
|
|
54
55
|
mimeType: 'application/json',
|
|
55
56
|
},
|
|
56
57
|
],
|
|
57
58
|
};
|
|
58
59
|
});
|
|
59
|
-
//
|
|
60
|
+
// Read resource
|
|
60
61
|
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
61
62
|
const { uri } = request.params;
|
|
62
63
|
if (uri === 'rfcxml://schema') {
|
|
@@ -70,13 +71,13 @@ server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
|
70
71
|
spec: 'RFC 7991 (superseded by rfc7991bis)',
|
|
71
72
|
documentation: 'https://authors.ietf.org/rfcxml-vocabulary',
|
|
72
73
|
keyElements: {
|
|
73
|
-
bcp14: 'RFC 2119
|
|
74
|
-
xref: '
|
|
75
|
-
reference: '
|
|
76
|
-
section: '
|
|
77
|
-
t: '
|
|
78
|
-
dl: '
|
|
79
|
-
sourcecode: '
|
|
74
|
+
bcp14: 'Markup for RFC 2119 keywords (MUST, SHOULD, MAY, etc.)',
|
|
75
|
+
xref: 'Internal and external references',
|
|
76
|
+
reference: 'Bibliography references',
|
|
77
|
+
section: 'Section structure',
|
|
78
|
+
t: 'Text paragraph',
|
|
79
|
+
dl: 'Definition list',
|
|
80
|
+
sourcecode: 'Source code',
|
|
80
81
|
},
|
|
81
82
|
}, null, 2),
|
|
82
83
|
},
|
|
@@ -85,7 +86,7 @@ server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
|
85
86
|
}
|
|
86
87
|
throw new Error(`Unknown resource: ${uri}`);
|
|
87
88
|
});
|
|
88
|
-
//
|
|
89
|
+
// Start server
|
|
89
90
|
async function main() {
|
|
90
91
|
const transport = new StdioServerTransport();
|
|
91
92
|
await server.connect(transport);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* チェックリスト生成サービス
|
|
3
|
+
* RFC要件からMarkdownチェックリストを生成
|
|
4
|
+
*/
|
|
5
|
+
import type { Requirement, ImplementationChecklist } from '../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* 要件をレベル別に分類
|
|
8
|
+
*/
|
|
9
|
+
export interface ClassifiedRequirements {
|
|
10
|
+
must: Requirement[];
|
|
11
|
+
should: Requirement[];
|
|
12
|
+
may: Requirement[];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* 要件をMUST/SHOULD/MAYに分類
|
|
16
|
+
*/
|
|
17
|
+
export declare function classifyRequirements(requirements: Requirement[]): ClassifiedRequirements;
|
|
18
|
+
/**
|
|
19
|
+
* ロールでフィルタリング
|
|
20
|
+
*/
|
|
21
|
+
export declare function filterByRole(requirements: Requirement[], role?: 'client' | 'server' | 'both'): Requirement[];
|
|
22
|
+
/**
|
|
23
|
+
* チェックリストを生成
|
|
24
|
+
*/
|
|
25
|
+
export declare function generateChecklist(rfcNumber: number, title: string, requirements: Requirement[], role?: 'client' | 'server' | 'both'): ImplementationChecklist;
|
|
26
|
+
/**
|
|
27
|
+
* チェックリストをMarkdown形式で出力
|
|
28
|
+
*/
|
|
29
|
+
export declare function generateChecklistMarkdown(checklist: ImplementationChecklist): string;
|
|
30
|
+
/**
|
|
31
|
+
* チェックリスト統計
|
|
32
|
+
*/
|
|
33
|
+
export interface ChecklistStats {
|
|
34
|
+
must: number;
|
|
35
|
+
should: number;
|
|
36
|
+
may: number;
|
|
37
|
+
total: number;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* チェックリストの統計情報を取得
|
|
41
|
+
*/
|
|
42
|
+
export declare function getChecklistStats(checklist: ImplementationChecklist): ChecklistStats;
|
|
43
|
+
//# sourceMappingURL=checklist-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checklist-generator.d.ts","sourceRoot":"","sources":["../../src/services/checklist-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,uBAAuB,EAAiB,MAAM,mBAAmB,CAAC;AAE7F;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,GAAG,EAAE,WAAW,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,sBAAsB,CAUxF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,YAAY,EAAE,WAAW,EAAE,EAC3B,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAClC,WAAW,EAAE,CAYf;AAaD;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,WAAW,EAAE,EAC3B,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAClC,uBAAuB,CAazB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,uBAAuB,GAAG,MAAM,CA0CpF;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,uBAAuB,GAAG,cAAc,CAOpF"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* チェックリスト生成サービス
|
|
3
|
+
* RFC要件からMarkdownチェックリストを生成
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* 要件をMUST/SHOULD/MAYに分類
|
|
7
|
+
*/
|
|
8
|
+
export function classifyRequirements(requirements) {
|
|
9
|
+
const must = requirements.filter((r) => ['MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL NOT'].includes(r.level));
|
|
10
|
+
const should = requirements.filter((r) => ['SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED'].includes(r.level));
|
|
11
|
+
const may = requirements.filter((r) => ['MAY', 'OPTIONAL'].includes(r.level));
|
|
12
|
+
return { must, should, may };
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* ロールでフィルタリング
|
|
16
|
+
*/
|
|
17
|
+
export function filterByRole(requirements, role) {
|
|
18
|
+
if (!role || role === 'both') {
|
|
19
|
+
return requirements;
|
|
20
|
+
}
|
|
21
|
+
return requirements.filter((r) => {
|
|
22
|
+
const subject = r.subject?.toLowerCase() || '';
|
|
23
|
+
if (role === 'client') {
|
|
24
|
+
return subject.includes('client') || !subject.includes('server');
|
|
25
|
+
}
|
|
26
|
+
return subject.includes('server') || !subject.includes('client');
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* チェックリストアイテムを作成
|
|
31
|
+
*/
|
|
32
|
+
function createChecklistItems(requirements) {
|
|
33
|
+
return requirements.map((r) => ({
|
|
34
|
+
id: r.id,
|
|
35
|
+
requirement: r,
|
|
36
|
+
checked: false,
|
|
37
|
+
}));
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* チェックリストを生成
|
|
41
|
+
*/
|
|
42
|
+
export function generateChecklist(rfcNumber, title, requirements, role) {
|
|
43
|
+
const filtered = filterByRole(requirements, role);
|
|
44
|
+
const classified = classifyRequirements(filtered);
|
|
45
|
+
return {
|
|
46
|
+
rfc: rfcNumber,
|
|
47
|
+
title,
|
|
48
|
+
role,
|
|
49
|
+
must: createChecklistItems(classified.must),
|
|
50
|
+
should: createChecklistItems(classified.should),
|
|
51
|
+
may: createChecklistItems(classified.may),
|
|
52
|
+
generatedAt: new Date().toISOString(),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* チェックリストをMarkdown形式で出力
|
|
57
|
+
*/
|
|
58
|
+
export function generateChecklistMarkdown(checklist) {
|
|
59
|
+
const lines = [];
|
|
60
|
+
lines.push(`# RFC ${checklist.rfc} Implementation Checklist`);
|
|
61
|
+
lines.push('');
|
|
62
|
+
lines.push(`**${checklist.title}**`);
|
|
63
|
+
lines.push('');
|
|
64
|
+
if (checklist.role && checklist.role !== 'both') {
|
|
65
|
+
lines.push(`Role: ${checklist.role}`);
|
|
66
|
+
lines.push('');
|
|
67
|
+
}
|
|
68
|
+
lines.push(`Generated: ${checklist.generatedAt}`);
|
|
69
|
+
lines.push('');
|
|
70
|
+
if (checklist.must.length > 0) {
|
|
71
|
+
lines.push('## Mandatory Requirements (MUST / REQUIRED / SHALL)');
|
|
72
|
+
lines.push('');
|
|
73
|
+
for (const item of checklist.must) {
|
|
74
|
+
lines.push(`- [ ] ${item.requirement.text} (${item.requirement.section})`);
|
|
75
|
+
}
|
|
76
|
+
lines.push('');
|
|
77
|
+
}
|
|
78
|
+
if (checklist.should.length > 0) {
|
|
79
|
+
lines.push('## Recommended Requirements (SHOULD / RECOMMENDED)');
|
|
80
|
+
lines.push('');
|
|
81
|
+
for (const item of checklist.should) {
|
|
82
|
+
lines.push(`- [ ] ${item.requirement.text} (${item.requirement.section})`);
|
|
83
|
+
}
|
|
84
|
+
lines.push('');
|
|
85
|
+
}
|
|
86
|
+
if (checklist.may.length > 0) {
|
|
87
|
+
lines.push('## Optional Requirements (MAY / OPTIONAL)');
|
|
88
|
+
lines.push('');
|
|
89
|
+
for (const item of checklist.may) {
|
|
90
|
+
lines.push(`- [ ] ${item.requirement.text} (${item.requirement.section})`);
|
|
91
|
+
}
|
|
92
|
+
lines.push('');
|
|
93
|
+
}
|
|
94
|
+
return lines.join('\n');
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* チェックリストの統計情報を取得
|
|
98
|
+
*/
|
|
99
|
+
export function getChecklistStats(checklist) {
|
|
100
|
+
return {
|
|
101
|
+
must: checklist.must.length,
|
|
102
|
+
should: checklist.should.length,
|
|
103
|
+
may: checklist.may.length,
|
|
104
|
+
total: checklist.must.length + checklist.should.length + checklist.may.length,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=checklist-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checklist-generator.js","sourceRoot":"","sources":["../../src/services/checklist-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* RFC
|
|
3
|
-
* RFCXML
|
|
2
|
+
* RFC Fetcher Service
|
|
3
|
+
* RFCXML source fetching and cache management
|
|
4
4
|
*/
|
|
5
5
|
import type { RFCMetadata } from '../types/index.js';
|
|
6
6
|
/**
|
|
7
|
-
* RFCXML
|
|
8
|
-
*
|
|
7
|
+
* Fetch RFCXML (parallel fetch)
|
|
8
|
+
* Sends concurrent requests to multiple sources and returns the first successful response
|
|
9
9
|
*/
|
|
10
10
|
export declare function fetchRFCXML(rfcNumber: number): Promise<string>;
|
|
11
11
|
/**
|
|
12
|
-
* RFC
|
|
12
|
+
* Fetch RFC metadata (IETF Datatracker API)
|
|
13
13
|
*/
|
|
14
14
|
export declare function fetchRFCMetadata(rfcNumber: number): Promise<RFCMetadata>;
|
|
15
15
|
/**
|
|
16
|
-
* RFC
|
|
17
|
-
*
|
|
16
|
+
* Fetch RFC text (parallel fetch)
|
|
17
|
+
* Sends concurrent requests to multiple sources and returns the first successful response
|
|
18
18
|
*/
|
|
19
19
|
export declare function fetchRFCText(rfcNumber: number): Promise<string>;
|
|
20
20
|
/**
|
|
21
|
-
* RFC
|
|
22
|
-
*
|
|
21
|
+
* Check if RFC is available in XML format
|
|
22
|
+
* Note: RFC 8650 (December 2019) and later use official RFCXML v3
|
|
23
23
|
*/
|
|
24
24
|
export declare function isRFCXMLAvailable(rfcNumber: number): boolean;
|
|
25
25
|
/**
|
|
26
|
-
* RFC XML
|
|
26
|
+
* RFC XML fetch error
|
|
27
27
|
*/
|
|
28
28
|
export declare class RFCXMLNotAvailableError extends Error {
|
|
29
29
|
readonly rfcNumber: number;
|
|
@@ -32,7 +32,7 @@ export declare class RFCXMLNotAvailableError extends Error {
|
|
|
32
32
|
constructor(rfcNumber: number, originalErrors?: string[]);
|
|
33
33
|
}
|
|
34
34
|
/**
|
|
35
|
-
*
|
|
35
|
+
* Clear all caches
|
|
36
36
|
*/
|
|
37
37
|
export declare function clearCache(): void;
|
|
38
38
|
//# sourceMappingURL=rfc-fetcher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rfc-fetcher.d.ts","sourceRoot":"","sources":["../../src/services/rfc-fetcher.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAiBrD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA6BpE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"rfc-fetcher.d.ts","sourceRoot":"","sources":["../../src/services/rfc-fetcher.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAiBrD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA6BpE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAyD9E;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA8BrE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,SAAgB,SAAS,EAAE,MAAM,CAAC;IAClC,SAAgB,QAAQ,EAAE,OAAO,CAAC;IAClC,SAAgB,UAAU,EAAE,MAAM,CAAC;gBAEvB,SAAS,EAAE,MAAM,EAAE,cAAc,GAAE,MAAM,EAAO;CAoB7D;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAIjC"}
|
|
@@ -1,31 +1,31 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* RFC
|
|
3
|
-
* RFCXML
|
|
2
|
+
* RFC Fetcher Service
|
|
3
|
+
* RFCXML source fetching and cache management
|
|
4
4
|
*/
|
|
5
5
|
import { LRUCache } from '../utils/cache.js';
|
|
6
6
|
import { fetchFromMultipleSources } from '../utils/fetch.js';
|
|
7
7
|
import { CACHE_CONFIG, RFC_XML_SOURCES, RFC_TEXT_SOURCES, DATATRACKER_API, HTTP_CONFIG, RFC_CONFIG, } from '../config.js';
|
|
8
|
-
// LRU
|
|
8
|
+
// LRU caches (configuration from config.ts)
|
|
9
9
|
const xmlCache = new LRUCache(CACHE_CONFIG.xml);
|
|
10
10
|
const textCache = new LRUCache(CACHE_CONFIG.text);
|
|
11
11
|
const metadataCache = new LRUCache(CACHE_CONFIG.metadata);
|
|
12
12
|
/**
|
|
13
|
-
* RFCXML
|
|
14
|
-
*
|
|
13
|
+
* Fetch RFCXML (parallel fetch)
|
|
14
|
+
* Sends concurrent requests to multiple sources and returns the first successful response
|
|
15
15
|
*/
|
|
16
16
|
export async function fetchRFCXML(rfcNumber) {
|
|
17
|
-
//
|
|
17
|
+
// Check cache
|
|
18
18
|
const cached = xmlCache.get(rfcNumber);
|
|
19
19
|
if (cached) {
|
|
20
20
|
return cached;
|
|
21
21
|
}
|
|
22
|
-
//
|
|
22
|
+
// Build source list
|
|
23
23
|
const sources = Object.entries(RFC_XML_SOURCES).map(([name, urlFn]) => ({
|
|
24
24
|
name,
|
|
25
25
|
url: urlFn(rfcNumber),
|
|
26
26
|
}));
|
|
27
27
|
try {
|
|
28
|
-
//
|
|
28
|
+
// Parallel fetch (returns first successful response)
|
|
29
29
|
const { text: xml, source } = await fetchFromMultipleSources(sources, {
|
|
30
30
|
headers: { Accept: 'application/xml, text/xml' },
|
|
31
31
|
validate: (text) => text.includes('<?xml') || text.includes('<rfc'),
|
|
@@ -35,28 +35,31 @@ export async function fetchRFCXML(rfcNumber) {
|
|
|
35
35
|
return xml;
|
|
36
36
|
}
|
|
37
37
|
catch (error) {
|
|
38
|
-
//
|
|
38
|
+
// All sources failed
|
|
39
39
|
throw new RFCXMLNotAvailableError(rfcNumber, [
|
|
40
40
|
error instanceof Error ? error.message : String(error),
|
|
41
41
|
]);
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
/**
|
|
45
|
-
* RFC
|
|
45
|
+
* Fetch RFC metadata (IETF Datatracker API)
|
|
46
46
|
*/
|
|
47
47
|
export async function fetchRFCMetadata(rfcNumber) {
|
|
48
|
-
//
|
|
48
|
+
// Check cache
|
|
49
49
|
const cached = metadataCache.get(rfcNumber);
|
|
50
50
|
if (cached) {
|
|
51
51
|
return cached;
|
|
52
52
|
}
|
|
53
53
|
const url = DATATRACKER_API.document(rfcNumber);
|
|
54
|
+
const controller = new AbortController();
|
|
55
|
+
const timeoutId = setTimeout(() => controller.abort(), HTTP_CONFIG.timeout);
|
|
54
56
|
try {
|
|
55
57
|
const response = await fetch(url, {
|
|
56
58
|
headers: {
|
|
57
59
|
Accept: 'application/json',
|
|
58
60
|
'User-Agent': HTTP_CONFIG.userAgent,
|
|
59
61
|
},
|
|
62
|
+
signal: controller.signal,
|
|
60
63
|
});
|
|
61
64
|
if (!response.ok) {
|
|
62
65
|
throw new Error(`HTTP ${response.status}`);
|
|
@@ -65,7 +68,7 @@ export async function fetchRFCMetadata(rfcNumber) {
|
|
|
65
68
|
const metadata = {
|
|
66
69
|
number: rfcNumber,
|
|
67
70
|
title: data.title || `RFC ${rfcNumber}`,
|
|
68
|
-
authors: [], // TODO:
|
|
71
|
+
authors: [], // TODO: Fetch from separate API
|
|
69
72
|
date: data.time || '',
|
|
70
73
|
category: mapCategory(data.std_level ?? null),
|
|
71
74
|
stream: mapStream(data.stream ?? null),
|
|
@@ -75,7 +78,7 @@ export async function fetchRFCMetadata(rfcNumber) {
|
|
|
75
78
|
return metadata;
|
|
76
79
|
}
|
|
77
80
|
catch (_error) {
|
|
78
|
-
//
|
|
81
|
+
// Fallback: minimal metadata
|
|
79
82
|
return {
|
|
80
83
|
number: rfcNumber,
|
|
81
84
|
title: `RFC ${rfcNumber}`,
|
|
@@ -85,24 +88,27 @@ export async function fetchRFCMetadata(rfcNumber) {
|
|
|
85
88
|
stream: 'IETF',
|
|
86
89
|
};
|
|
87
90
|
}
|
|
91
|
+
finally {
|
|
92
|
+
clearTimeout(timeoutId);
|
|
93
|
+
}
|
|
88
94
|
}
|
|
89
95
|
/**
|
|
90
|
-
* RFC
|
|
91
|
-
*
|
|
96
|
+
* Fetch RFC text (parallel fetch)
|
|
97
|
+
* Sends concurrent requests to multiple sources and returns the first successful response
|
|
92
98
|
*/
|
|
93
99
|
export async function fetchRFCText(rfcNumber) {
|
|
94
|
-
//
|
|
100
|
+
// Check cache
|
|
95
101
|
const cached = textCache.get(rfcNumber);
|
|
96
102
|
if (cached) {
|
|
97
103
|
return cached;
|
|
98
104
|
}
|
|
99
|
-
//
|
|
105
|
+
// Build source list
|
|
100
106
|
const sources = Object.entries(RFC_TEXT_SOURCES).map(([name, urlFn]) => ({
|
|
101
107
|
name,
|
|
102
108
|
url: urlFn(rfcNumber),
|
|
103
109
|
}));
|
|
104
110
|
try {
|
|
105
|
-
//
|
|
111
|
+
// Parallel fetch (returns first successful response)
|
|
106
112
|
const { text, source } = await fetchFromMultipleSources(sources, {
|
|
107
113
|
headers: { Accept: 'text/plain' },
|
|
108
114
|
validate: (t) => t.includes('Request for Comments') || t.includes('RFC '),
|
|
@@ -112,20 +118,20 @@ export async function fetchRFCText(rfcNumber) {
|
|
|
112
118
|
return text;
|
|
113
119
|
}
|
|
114
120
|
catch (error) {
|
|
115
|
-
//
|
|
121
|
+
// All sources failed
|
|
116
122
|
throw new Error(`Failed to fetch RFC ${rfcNumber} text from all sources. ` +
|
|
117
123
|
`Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
118
124
|
}
|
|
119
125
|
}
|
|
120
126
|
/**
|
|
121
|
-
* RFC
|
|
122
|
-
*
|
|
127
|
+
* Check if RFC is available in XML format
|
|
128
|
+
* Note: RFC 8650 (December 2019) and later use official RFCXML v3
|
|
123
129
|
*/
|
|
124
130
|
export function isRFCXMLAvailable(rfcNumber) {
|
|
125
131
|
return rfcNumber >= RFC_CONFIG.xmlAvailableFrom;
|
|
126
132
|
}
|
|
127
133
|
/**
|
|
128
|
-
* RFC XML
|
|
134
|
+
* RFC XML fetch error
|
|
129
135
|
*/
|
|
130
136
|
export class RFCXMLNotAvailableError extends Error {
|
|
131
137
|
rfcNumber;
|
|
@@ -135,13 +141,13 @@ export class RFCXMLNotAvailableError extends Error {
|
|
|
135
141
|
const threshold = RFC_CONFIG.xmlAvailableFrom;
|
|
136
142
|
const isOldRFC = rfcNumber < threshold;
|
|
137
143
|
const suggestion = isOldRFC
|
|
138
|
-
? `RFC ${rfcNumber}
|
|
139
|
-
|
|
140
|
-
: `RFC ${rfcNumber}
|
|
141
|
-
super(`RFC ${rfcNumber} XML
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
(originalErrors.length > 0 ? `\
|
|
144
|
+
? `RFC ${rfcNumber} was published before RFCXML v3 format, XML may not be available. ` +
|
|
145
|
+
`Consider using text format (use ietf MCP get_ietf_doc).`
|
|
146
|
+
: `Failed to fetch RFC ${rfcNumber} XML. Check network connection.`;
|
|
147
|
+
super(`Could not fetch RFC ${rfcNumber} XML.\n` +
|
|
148
|
+
`Reason: ${isOldRFC ? `Old RFC (< ${threshold}), XML may not be available` : 'Network error'}\n` +
|
|
149
|
+
`Suggestion: ${suggestion}` +
|
|
150
|
+
(originalErrors.length > 0 ? `\nDetails: ${originalErrors.join(', ')}` : ''));
|
|
145
151
|
this.name = 'RFCXMLNotAvailableError';
|
|
146
152
|
this.rfcNumber = rfcNumber;
|
|
147
153
|
this.isOldRFC = isOldRFC;
|
|
@@ -149,14 +155,14 @@ export class RFCXMLNotAvailableError extends Error {
|
|
|
149
155
|
}
|
|
150
156
|
}
|
|
151
157
|
/**
|
|
152
|
-
*
|
|
158
|
+
* Clear all caches
|
|
153
159
|
*/
|
|
154
160
|
export function clearCache() {
|
|
155
161
|
xmlCache.clear();
|
|
156
162
|
textCache.clear();
|
|
157
163
|
metadataCache.clear();
|
|
158
164
|
}
|
|
159
|
-
//
|
|
165
|
+
// Helper functions
|
|
160
166
|
function mapCategory(stdLevel) {
|
|
161
167
|
switch (stdLevel?.toLowerCase()) {
|
|
162
168
|
case 'proposed standard':
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rfc-fetcher.js","sourceRoot":"","sources":["../../src/services/rfc-fetcher.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EACL,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,UAAU,GACX,MAAM,cAAc,CAAC;AAEtB,
|
|
1
|
+
{"version":3,"file":"rfc-fetcher.js","sourceRoot":"","sources":["../../src/services/rfc-fetcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,17 +2,15 @@
|
|
|
2
2
|
* RFC テキストパーサー
|
|
3
3
|
* XMLが利用できない古いRFC用のフォールバック解析
|
|
4
4
|
*/
|
|
5
|
-
import type { Section, Requirement,
|
|
6
|
-
import type
|
|
5
|
+
import type { Section, Requirement, ParsedRFC } from '../types/index.js';
|
|
6
|
+
import { type RequirementFilter } from '../utils/requirement-extractor.js';
|
|
7
7
|
/**
|
|
8
8
|
* RFC テキストをパースして構造化データに変換(中精度)
|
|
9
9
|
*/
|
|
10
10
|
export declare function parseRFCText(text: string, rfcNumber: number): ParsedRFC;
|
|
11
11
|
/**
|
|
12
12
|
* テキストから要件を抽出
|
|
13
|
+
* 共通ユーティリティのラッパー(テキストパース時はparseComponentsをオフ)
|
|
13
14
|
*/
|
|
14
|
-
export declare function extractTextRequirements(sections: Section[], filter?:
|
|
15
|
-
section?: string;
|
|
16
|
-
level?: RequirementLevel;
|
|
17
|
-
}): Requirement[];
|
|
15
|
+
export declare function extractTextRequirements(sections: Section[], filter?: RequirementFilter): Requirement[];
|
|
18
16
|
//# sourceMappingURL=rfc-text-parser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rfc-text-parser.d.ts","sourceRoot":"","sources":["../../src/services/rfc-text-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,OAAO,EACP,WAAW,
|
|
1
|
+
{"version":3,"file":"rfc-text-parser.d.ts","sourceRoot":"","sources":["../../src/services/rfc-text-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,OAAO,EACP,WAAW,EAIX,SAAS,EAEV,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,mCAAmC,CAAC;AAE3C;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,CAYvE;AA2KD;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,CAAC,EAAE,iBAAiB,GACzB,WAAW,EAAE,CAEf"}
|