@shuji-bonji/rfcxml-mcp 0.4.0 → 0.4.2
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 +29 -27
- package/README.md +37 -29
- package/dist/constants.d.ts +19 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +34 -0
- package/dist/constants.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-text-parser.d.ts +4 -6
- package/dist/services/rfc-text-parser.d.ts.map +1 -1
- package/dist/services/rfc-text-parser.js +8 -40
- package/dist/services/rfc-text-parser.js.map +1 -1
- package/dist/services/rfcxml-parser.d.ts +5 -19
- package/dist/services/rfcxml-parser.d.ts.map +1 -1
- package/dist/services/rfcxml-parser.js +18 -93
- package/dist/services/rfcxml-parser.js.map +1 -1
- package/dist/tools/handlers.d.ts +1 -6
- package/dist/tools/handlers.d.ts.map +1 -1
- package/dist/tools/handlers.js +9 -108
- 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/package.json +1 -1
package/README.ja.md
CHANGED
|
@@ -29,15 +29,15 @@ RFC 文書を **構造的に理解** するための MCP サーバー。
|
|
|
29
29
|
|
|
30
30
|
## 既存 MCP との違い
|
|
31
31
|
|
|
32
|
-
| 機能
|
|
33
|
-
|
|
34
|
-
| RFC テキスト取得
|
|
35
|
-
| セクション抽出
|
|
36
|
-
| MUST/SHOULD/MAY 抽出 | ❌
|
|
37
|
-
| 条件・例外の構造化
|
|
38
|
-
| RFC 間依存グラフ
|
|
39
|
-
| 定義スコープ管理
|
|
40
|
-
| 実装チェックリスト
|
|
32
|
+
| 機能 | 既存 mcp-rfc | RFCXML MCP |
|
|
33
|
+
| -------------------- | ------------------- | --------------- |
|
|
34
|
+
| RFC テキスト取得 | ✅ | ✅ |
|
|
35
|
+
| セクション抽出 | ✅ (テキストベース) | ✅ (構造ベース) |
|
|
36
|
+
| MUST/SHOULD/MAY 抽出 | ❌ | ✅ |
|
|
37
|
+
| 条件・例外の構造化 | ❌ | ✅ |
|
|
38
|
+
| RFC 間依存グラフ | ❌ | ✅ |
|
|
39
|
+
| 定義スコープ管理 | ❌ | ✅ |
|
|
40
|
+
| 実装チェックリスト | ❌ | ✅ |
|
|
41
41
|
|
|
42
42
|
## クイックスタート
|
|
43
43
|
|
|
@@ -57,6 +57,7 @@ MCP 設定ファイルに以下を追加:
|
|
|
57
57
|
```
|
|
58
58
|
|
|
59
59
|
設定ファイルの場所:
|
|
60
|
+
|
|
60
61
|
- **Claude Desktop (macOS)**: `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
61
62
|
- **Claude Desktop (Windows)**: `%APPDATA%\Claude\claude_desktop_config.json`
|
|
62
63
|
- **Claude Code**: `.claude/settings.json` または `claude settings` コマンド
|
|
@@ -117,16 +118,16 @@ RFC 8650 (2019年12月) 以降は公式 RFCXML v3 形式で提供されていま
|
|
|
117
118
|
|
|
118
119
|
> **Note**: v0.4.0 以降、すべてのメッセージは英語で出力されます(国際化対応)。
|
|
119
120
|
|
|
120
|
-
| `_source` | 説明
|
|
121
|
-
|
|
122
|
-
| `xml`
|
|
123
|
-
| `text`
|
|
121
|
+
| `_source` | 説明 |
|
|
122
|
+
| --------- | -------------------------- |
|
|
123
|
+
| `xml` | RFCXML から解析(高精度) |
|
|
124
|
+
| `text` | テキストから解析(中精度) |
|
|
124
125
|
|
|
125
126
|
### 対応状況
|
|
126
127
|
|
|
127
|
-
| RFC
|
|
128
|
-
|
|
129
|
-
| RFC 8650 以降 | XML
|
|
128
|
+
| RFC | 形式 | 備考 |
|
|
129
|
+
| ------------- | -------- | ------------------ |
|
|
130
|
+
| RFC 8650 以降 | XML | RFCXML v3 公式対応 |
|
|
130
131
|
| RFC 8650 未満 | テキスト | 自動フォールバック |
|
|
131
132
|
|
|
132
133
|
## 出力サンプル
|
|
@@ -254,13 +255,14 @@ Role: client
|
|
|
254
255
|
|
|
255
256
|
[examples/](./examples/) ディレクトリに `generate_checklist` ツールで生成したチェックリストのサンプルがあります:
|
|
256
257
|
|
|
257
|
-
| RFC
|
|
258
|
-
|
|
259
|
-
| [RFC 6455](./examples/rfc6455-websocket-checklist.md) | WebSocket
|
|
260
|
-
| [RFC 9293](./examples/rfc9293-tcp-checklist.md)
|
|
261
|
-
| [RFC 7540](./examples/rfc7540-http2-checklist.md)
|
|
258
|
+
| RFC | プロトコル | ソース |
|
|
259
|
+
| ----------------------------------------------------- | ---------- | -------------------------- |
|
|
260
|
+
| [RFC 6455](./examples/rfc6455-websocket-checklist.md) | WebSocket | テキスト(フォールバック) |
|
|
261
|
+
| [RFC 9293](./examples/rfc9293-tcp-checklist.md) | TCP | RFCXML |
|
|
262
|
+
| [RFC 7540](./examples/rfc7540-http2-checklist.md) | HTTP/2 | テキスト(フォールバック) |
|
|
262
263
|
|
|
263
264
|
**Claude への依頼例:**
|
|
265
|
+
|
|
264
266
|
```
|
|
265
267
|
RFC 9293 (TCP) の実装チェックリストを生成してください。
|
|
266
268
|
```
|
|
@@ -318,12 +320,12 @@ src/
|
|
|
318
320
|
|
|
319
321
|
LRU(Least Recently Used)キャッシュでメモリ使用量を制限:
|
|
320
322
|
|
|
321
|
-
| キャッシュ
|
|
322
|
-
|
|
323
|
-
| XML キャッシュ
|
|
324
|
-
| Text キャッシュ
|
|
325
|
-
| Metadata キャッシュ | 100
|
|
326
|
-
| Parse キャッシュ
|
|
323
|
+
| キャッシュ | 最大エントリ数 | 内容 |
|
|
324
|
+
| ------------------- | -------------- | -------------- |
|
|
325
|
+
| XML キャッシュ | 20 | 生の RFCXML |
|
|
326
|
+
| Text キャッシュ | 20 | 生のテキスト |
|
|
327
|
+
| Metadata キャッシュ | 100 | RFC メタデータ |
|
|
328
|
+
| Parse キャッシュ | 50 | パース済み構造 |
|
|
327
329
|
|
|
328
330
|
## 開発
|
|
329
331
|
|
package/README.md
CHANGED
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
[](https://nodejs.org/)
|
|
7
7
|
[](https://claude.ai/code)
|
|
8
8
|
|
|
9
|
+
[日本語版 README](README.ja.md)
|
|
10
|
+
|
|
9
11
|
A Model Context Protocol (MCP) server for **structured understanding** of RFC documents.
|
|
10
12
|
|
|
11
13
|
## Purpose
|
|
@@ -33,15 +35,15 @@ Unlike existing text-based RFC MCP servers, this server leverages the semantic s
|
|
|
33
35
|
|
|
34
36
|
## Comparison with Existing MCPs
|
|
35
37
|
|
|
36
|
-
| Feature
|
|
37
|
-
|
|
38
|
-
| RFC text retrieval
|
|
39
|
-
| Section extraction
|
|
40
|
-
| MUST/SHOULD/MAY extraction
|
|
41
|
-
| Condition/exception structuring | ❌
|
|
42
|
-
| RFC dependency graph
|
|
43
|
-
| Definition scope management
|
|
44
|
-
| Implementation checklist
|
|
38
|
+
| Feature | Existing mcp-rfc | RFCXML MCP |
|
|
39
|
+
| ------------------------------- | ---------------- | -------------------- |
|
|
40
|
+
| RFC text retrieval | ✅ | ✅ |
|
|
41
|
+
| Section extraction | ✅ (text-based) | ✅ (structure-based) |
|
|
42
|
+
| MUST/SHOULD/MAY extraction | ❌ | ✅ |
|
|
43
|
+
| Condition/exception structuring | ❌ | ✅ |
|
|
44
|
+
| RFC dependency graph | ❌ | ✅ |
|
|
45
|
+
| Definition scope management | ❌ | ✅ |
|
|
46
|
+
| Implementation checklist | ❌ | ✅ |
|
|
45
47
|
|
|
46
48
|
## Quick Start
|
|
47
49
|
|
|
@@ -61,6 +63,7 @@ Add the following to your MCP configuration file:
|
|
|
61
63
|
```
|
|
62
64
|
|
|
63
65
|
Configuration file locations:
|
|
66
|
+
|
|
64
67
|
- **Claude Desktop (macOS)**: `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
65
68
|
- **Claude Desktop (Windows)**: `%APPDATA%\Claude\claude_desktop_config.json`
|
|
66
69
|
- **Claude Code**: `.claude/settings.json` or use `claude settings` command
|
|
@@ -119,17 +122,17 @@ All responses include source information:
|
|
|
119
122
|
}
|
|
120
123
|
```
|
|
121
124
|
|
|
122
|
-
| `_source` | Description
|
|
123
|
-
|
|
124
|
-
| `xml`
|
|
125
|
-
| `text`
|
|
125
|
+
| `_source` | Description |
|
|
126
|
+
| --------- | ---------------------------------- |
|
|
127
|
+
| `xml` | Parsed from RFCXML (high accuracy) |
|
|
128
|
+
| `text` | Parsed from text (medium accuracy) |
|
|
126
129
|
|
|
127
130
|
### Compatibility
|
|
128
131
|
|
|
129
|
-
| RFC
|
|
130
|
-
|
|
131
|
-
| RFC 8650+
|
|
132
|
-
| Before RFC 8650 | Text
|
|
132
|
+
| RFC | Format | Notes |
|
|
133
|
+
| --------------- | ------ | -------------------------- |
|
|
134
|
+
| RFC 8650+ | XML | Official RFCXML v3 support |
|
|
135
|
+
| Before RFC 8650 | Text | Automatic fallback |
|
|
133
136
|
|
|
134
137
|
## Output Samples
|
|
135
138
|
|
|
@@ -254,13 +257,14 @@ Role: Client
|
|
|
254
257
|
|
|
255
258
|
See the [examples/](./examples/) directory for complete checklist samples:
|
|
256
259
|
|
|
257
|
-
| RFC
|
|
258
|
-
|
|
260
|
+
| RFC | Protocol | Source |
|
|
261
|
+
| ----------------------------------------------------- | --------- | --------------- |
|
|
259
262
|
| [RFC 6455](./examples/rfc6455-websocket-checklist.md) | WebSocket | Text (fallback) |
|
|
260
|
-
| [RFC 9293](./examples/rfc9293-tcp-checklist.md)
|
|
261
|
-
| [RFC 7540](./examples/rfc7540-http2-checklist.md)
|
|
263
|
+
| [RFC 9293](./examples/rfc9293-tcp-checklist.md) | TCP | RFCXML |
|
|
264
|
+
| [RFC 7540](./examples/rfc7540-http2-checklist.md) | HTTP/2 | Text (fallback) |
|
|
262
265
|
|
|
263
266
|
**Example prompt for Claude:**
|
|
267
|
+
|
|
264
268
|
```
|
|
265
269
|
Generate an implementation checklist for RFC 9293 (TCP).
|
|
266
270
|
```
|
|
@@ -277,7 +281,8 @@ src/
|
|
|
277
281
|
├── services/
|
|
278
282
|
│ ├── rfc-fetcher.ts # RFC fetching (parallel)
|
|
279
283
|
│ ├── rfcxml-parser.ts # RFCXML parser
|
|
280
|
-
│
|
|
284
|
+
│ ├── rfc-text-parser.ts # Text fallback parser
|
|
285
|
+
│ └── checklist-generator.ts # Checklist generation service
|
|
281
286
|
├── tools/
|
|
282
287
|
│ ├── definitions.ts # MCP tool definitions
|
|
283
288
|
│ └── handlers.ts # Tool handlers
|
|
@@ -286,7 +291,10 @@ src/
|
|
|
286
291
|
└── utils/
|
|
287
292
|
├── cache.ts # LRU cache
|
|
288
293
|
├── fetch.ts # Parallel fetch utility
|
|
289
|
-
|
|
294
|
+
├── requirement-extractor.ts # Shared requirement extraction
|
|
295
|
+
├── section.ts # Section search utilities
|
|
296
|
+
├── text.ts # Text processing utility
|
|
297
|
+
└── validation.ts # Input validation
|
|
290
298
|
```
|
|
291
299
|
|
|
292
300
|
### RFC Fetch Optimization
|
|
@@ -318,12 +326,12 @@ Sends parallel requests to multiple sources (RFC Editor, IETF Tools, Datatracker
|
|
|
318
326
|
|
|
319
327
|
LRU (Least Recently Used) cache with memory limits:
|
|
320
328
|
|
|
321
|
-
| Cache
|
|
322
|
-
|
|
323
|
-
| XML Cache
|
|
324
|
-
| Text Cache
|
|
325
|
-
| Metadata Cache | 100
|
|
326
|
-
| Parse Cache
|
|
329
|
+
| Cache | Max Entries | Content |
|
|
330
|
+
| -------------- | ----------- | ---------------- |
|
|
331
|
+
| XML Cache | 20 | Raw RFCXML |
|
|
332
|
+
| Text Cache | 20 | Raw text |
|
|
333
|
+
| Metadata Cache | 100 | RFC metadata |
|
|
334
|
+
| Parse Cache | 50 | Parsed structure |
|
|
327
335
|
|
|
328
336
|
## Development
|
|
329
337
|
|
package/dist/constants.d.ts
CHANGED
|
@@ -18,4 +18,23 @@ export declare function createRequirementRegex(): RegExp;
|
|
|
18
18
|
* Note: When using with exec() in loops, prefer createRequirementRegex() to avoid lastIndex issues
|
|
19
19
|
*/
|
|
20
20
|
export declare const REQUIREMENT_REGEX: RegExp;
|
|
21
|
+
/**
|
|
22
|
+
* Section number pattern for parsing RFC text
|
|
23
|
+
* Matches: "1.", "1.1", "1.1.1", etc. followed by title
|
|
24
|
+
* Used in text-based RFC parsing
|
|
25
|
+
*/
|
|
26
|
+
export declare const SECTION_HEADER_PATTERN: RegExp;
|
|
27
|
+
/**
|
|
28
|
+
* Create a section header pattern regex instance
|
|
29
|
+
* Safe for use in loops with exec()
|
|
30
|
+
*/
|
|
31
|
+
export declare function createSectionHeaderRegex(): RegExp;
|
|
32
|
+
/**
|
|
33
|
+
* RFC reference pattern (e.g., "RFC 1234", "RFC1234")
|
|
34
|
+
*/
|
|
35
|
+
export declare function createRFCReferenceRegex(): RegExp;
|
|
36
|
+
/**
|
|
37
|
+
* Section reference pattern (e.g., "Section 1.2", "section 3.4.5")
|
|
38
|
+
*/
|
|
39
|
+
export declare function createSectionReferenceRegex(): RegExp;
|
|
21
40
|
//# sourceMappingURL=constants.d.ts.map
|
package/dist/constants.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAMzD;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,gBAAgB,EAYlD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,QAA2B,CAAC;AAM1D;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,QAAgC,CAAC;AAEpE;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD;AAMD;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED;;GAEG;AACH,wBAAgB,2BAA2B,IAAI,MAAM,CAEpD"}
|
package/dist/constants.js
CHANGED
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
* Common Constants
|
|
3
3
|
* BCP 14 / RFC 2119 keywords and patterns
|
|
4
4
|
*/
|
|
5
|
+
// ========================================
|
|
6
|
+
// BCP 14 / RFC 2119 Keywords
|
|
7
|
+
// ========================================
|
|
5
8
|
/**
|
|
6
9
|
* BCP 14 / RFC 2119 keywords
|
|
7
10
|
* Ordered by length (longer first to match "MUST NOT" before "MUST")
|
|
@@ -31,6 +34,37 @@ export function createRequirementRegex() {
|
|
|
31
34
|
* Note: When using with exec() in loops, prefer createRequirementRegex() to avoid lastIndex issues
|
|
32
35
|
*/
|
|
33
36
|
export const REQUIREMENT_REGEX = createRequirementRegex();
|
|
37
|
+
// ========================================
|
|
38
|
+
// Section Patterns
|
|
39
|
+
// ========================================
|
|
40
|
+
/**
|
|
41
|
+
* Section number pattern for parsing RFC text
|
|
42
|
+
* Matches: "1.", "1.1", "1.1.1", etc. followed by title
|
|
43
|
+
* Used in text-based RFC parsing
|
|
44
|
+
*/
|
|
45
|
+
export const SECTION_HEADER_PATTERN = /^(\d+(?:\.\d+)*\.?)\s+(.+)$/;
|
|
46
|
+
/**
|
|
47
|
+
* Create a section header pattern regex instance
|
|
48
|
+
* Safe for use in loops with exec()
|
|
49
|
+
*/
|
|
50
|
+
export function createSectionHeaderRegex() {
|
|
51
|
+
return new RegExp(SECTION_HEADER_PATTERN.source);
|
|
52
|
+
}
|
|
53
|
+
// ========================================
|
|
54
|
+
// Cross-Reference Patterns
|
|
55
|
+
// ========================================
|
|
56
|
+
/**
|
|
57
|
+
* RFC reference pattern (e.g., "RFC 1234", "RFC1234")
|
|
58
|
+
*/
|
|
59
|
+
export function createRFCReferenceRegex() {
|
|
60
|
+
return /RFC\s*(\d+)/gi;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Section reference pattern (e.g., "Section 1.2", "section 3.4.5")
|
|
64
|
+
*/
|
|
65
|
+
export function createSectionReferenceRegex() {
|
|
66
|
+
return /[Ss]ection\s+([\d.]+)/g;
|
|
67
|
+
}
|
|
34
68
|
// RFC-related configuration is centralized in config.ts
|
|
35
69
|
// - RFC_CONFIG.xmlAvailableFrom
|
|
36
70
|
// - isRFCXMLLikelyAvailable()
|
package/dist/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAuB;IACtD,UAAU;IACV,MAAM;IACN,UAAU;IACV,WAAW;IACX,OAAO;IACP,YAAY;IACZ,QAAQ;IACR,aAAa;IACb,iBAAiB;IACjB,KAAK;IACL,UAAU;CACX,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO,IAAI,MAAM,CAAC,OAAO,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACtE,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,sBAAsB,EAAE,CAAC;AAE1D,wDAAwD;AACxD,gCAAgC;AAChC,8BAA8B"}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,2CAA2C;AAC3C,6BAA6B;AAC7B,2CAA2C;AAE3C;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAuB;IACtD,UAAU;IACV,MAAM;IACN,UAAU;IACV,WAAW;IACX,OAAO;IACP,YAAY;IACZ,QAAQ;IACR,aAAa;IACb,iBAAiB;IACjB,KAAK;IACL,UAAU;CACX,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO,IAAI,MAAM,CAAC,OAAO,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACtE,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,sBAAsB,EAAE,CAAC;AAE1D,2CAA2C;AAC3C,mBAAmB;AACnB,2CAA2C;AAE3C;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,6BAA6B,CAAC;AAEpE;;;GAGG;AACH,MAAM,UAAU,wBAAwB;IACtC,OAAO,IAAI,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;AACnD,CAAC;AAED,2CAA2C;AAC3C,2BAA2B;AAC3B,2CAA2C;AAE3C;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B;IACzC,OAAO,wBAAwB,CAAC;AAClC,CAAC;AAED,wDAAwD;AACxD,gCAAgC;AAChC,8BAA8B"}
|
|
@@ -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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"}
|
|
@@ -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"}
|
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
* RFC テキストパーサー
|
|
3
3
|
* XMLが利用できない古いRFC用のフォールバック解析
|
|
4
4
|
*/
|
|
5
|
-
import { createRequirementRegex } from '../constants.js';
|
|
6
|
-
import {
|
|
5
|
+
import { createRequirementRegex, SECTION_HEADER_PATTERN } from '../constants.js';
|
|
6
|
+
import { extractCrossReferences } from '../utils/text.js';
|
|
7
|
+
import { extractRequirementsFromSections, } from '../utils/requirement-extractor.js';
|
|
7
8
|
/**
|
|
8
9
|
* RFC テキストをパースして構造化データに変換(中精度)
|
|
9
10
|
*/
|
|
@@ -49,10 +50,9 @@ function extractTextSections(lines) {
|
|
|
49
50
|
let currentSection = null;
|
|
50
51
|
let currentContent = [];
|
|
51
52
|
// セクション番号パターン(例: "1.", "1.1", "1.1.1")
|
|
52
|
-
const sectionPattern = /^(\d+(?:\.\d+)*\.?)\s+(.+)$/;
|
|
53
53
|
for (const line of lines) {
|
|
54
54
|
const trimmed = line.trim();
|
|
55
|
-
const match = trimmed.match(
|
|
55
|
+
const match = trimmed.match(SECTION_HEADER_PATTERN);
|
|
56
56
|
if (match) {
|
|
57
57
|
// 前のセクションを保存
|
|
58
58
|
if (currentSection) {
|
|
@@ -112,7 +112,7 @@ function createTextBlocks(text) {
|
|
|
112
112
|
const trimmed = para.trim();
|
|
113
113
|
if (!trimmed)
|
|
114
114
|
continue;
|
|
115
|
-
//
|
|
115
|
+
// 要件マーカーを抽出
|
|
116
116
|
const requirements = [];
|
|
117
117
|
const regex = createRequirementRegex();
|
|
118
118
|
let match;
|
|
@@ -139,11 +139,10 @@ function extractTextDefinitions(lines) {
|
|
|
139
139
|
const definitions = [];
|
|
140
140
|
const defPattern = /^\s*([A-Za-z][A-Za-z0-9\s-]*[A-Za-z0-9])\s*[-:]\s+(.+)$/;
|
|
141
141
|
let currentSection = '';
|
|
142
|
-
const sectionPattern = /^(\d+(?:\.\d+)*\.?)\s+(.+)$/;
|
|
143
142
|
for (const line of lines) {
|
|
144
143
|
const trimmed = line.trim();
|
|
145
144
|
// セクションを追跡
|
|
146
|
-
const sectionMatch = trimmed.match(
|
|
145
|
+
const sectionMatch = trimmed.match(SECTION_HEADER_PATTERN);
|
|
147
146
|
if (sectionMatch) {
|
|
148
147
|
currentSection = sectionMatch[1].replace(/\.$/, '');
|
|
149
148
|
continue;
|
|
@@ -167,40 +166,9 @@ function extractTextDefinitions(lines) {
|
|
|
167
166
|
}
|
|
168
167
|
/**
|
|
169
168
|
* テキストから要件を抽出
|
|
169
|
+
* 共通ユーティリティのラッパー(テキストパース時はparseComponentsをオフ)
|
|
170
170
|
*/
|
|
171
171
|
export function extractTextRequirements(sections, filter) {
|
|
172
|
-
|
|
173
|
-
let idCounter = 1;
|
|
174
|
-
function processSection(section, path) {
|
|
175
|
-
const sectionId = section.number || path;
|
|
176
|
-
if (filter?.section && !sectionId.startsWith(filter.section)) {
|
|
177
|
-
// フィルタリング
|
|
178
|
-
}
|
|
179
|
-
for (const block of section.content) {
|
|
180
|
-
if (block.type === 'text' && block.requirements.length > 0) {
|
|
181
|
-
for (const marker of block.requirements) {
|
|
182
|
-
if (filter?.level && marker.level !== filter.level) {
|
|
183
|
-
continue;
|
|
184
|
-
}
|
|
185
|
-
const sentence = extractSentence(block.content, marker.position);
|
|
186
|
-
requirements.push({
|
|
187
|
-
id: `R-${sectionId}-${idCounter++}`,
|
|
188
|
-
level: marker.level,
|
|
189
|
-
text: sentence.trim(),
|
|
190
|
-
section: sectionId,
|
|
191
|
-
sectionTitle: section.title,
|
|
192
|
-
fullContext: block.content,
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
for (const subsection of section.subsections) {
|
|
198
|
-
processSection(subsection, `${sectionId}.${subsection.number || ''}`);
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
for (const section of sections) {
|
|
202
|
-
processSection(section, section.number || '');
|
|
203
|
-
}
|
|
204
|
-
return requirements;
|
|
172
|
+
return extractRequirementsFromSections(sections, filter, { parseComponents: false });
|
|
205
173
|
}
|
|
206
174
|
//# sourceMappingURL=rfc-text-parser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rfc-text-parser.js","sourceRoot":"","sources":["../../src/services/rfc-text-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"rfc-text-parser.js","sourceRoot":"","sources":["../../src/services/rfc-text-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EACL,+BAA+B,GAEhC,MAAM,mCAAmC,CAAC;AAE3C;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,SAAiB;IAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE/B,OAAO;QACL,QAAQ,EAAE,mBAAmB,CAAC,KAAK,EAAE,SAAS,CAAC;QAC/C,QAAQ,EAAE,mBAAmB,CAAC,KAAK,CAAC;QACpC,UAAU,EAAE;YACV,SAAS,EAAE,EAAE;YACb,WAAW,EAAE,EAAE;SAChB;QACD,WAAW,EAAE,sBAAsB,CAAC,KAAK,CAAC;KAC3C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,KAAe,EAAE,SAAiB;IAC7D,IAAI,KAAK,GAAG,OAAO,SAAS,EAAE,CAAC;IAE/B,uBAAuB;IACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7B,2BAA2B;QAC3B,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACvF,cAAc;YACd,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;gBACzD,KAAK,GAAG,IAAI,CAAC;gBACb,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK;QACL,MAAM,EAAE,SAAS;KAClB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,KAAe;IAC1C,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,IAAI,cAAc,GAAmB,IAAI,CAAC;IAC1C,IAAI,cAAc,GAAa,EAAE,CAAC;IAElC,uCAAuC;IAEvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAEpD,IAAI,KAAK,EAAE,CAAC;YACV,aAAa;YACb,IAAI,cAAc,EAAE,CAAC;gBACnB,cAAc,CAAC,OAAO,GAAG,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBACrE,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAChC,CAAC;YAED,cAAc;YACd,cAAc,GAAG;gBACf,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;gBACnC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;gBACf,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,EAAE;aAChB,CAAC;YACF,cAAc,GAAG,EAAE,CAAC;QACtB,CAAC;aAAM,IAAI,cAAc,EAAE,CAAC;YAC1B,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,cAAc;IACd,IAAI,cAAc,EAAE,CAAC;QACnB,cAAc,CAAC,OAAO,GAAG,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACrE,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAChC,CAAC;IAED,gBAAgB;IAChB,OAAO,gBAAgB,CAAC,QAAQ,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,YAAuB;IAC/C,MAAM,IAAI,GAAc,EAAE,CAAC;IAC3B,MAAM,KAAK,GAA0C,EAAE,CAAC;IAExD,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;QAErD,kBAAkB;QAClB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,EAAE,CAAC;YAClE,KAAK,CAAC,GAAG,EAAE,CAAC;QACd,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5D,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,IAAY;IACpC,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAEjE,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,SAAS;QAEvB,YAAY;QACZ,MAAM,YAAY,GAA8B,EAAE,CAAC;QACnD,MAAM,KAAK,GAAG,sBAAsB,EAAE,CAAC;QACvC,IAAI,KAA6B,CAAC;QAClC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC9C,YAAY,CAAC,IAAI,CAAC;gBAChB,KAAK,EAAE,KAAK,CAAC,CAAC,CAAqB;gBACnC,QAAQ,EAAE,KAAK,CAAC,KAAK;aACtB,CAAC,CAAC;QACL,CAAC;QAED,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,OAAO;YAChB,YAAY;YACZ,eAAe,EAAE,sBAAsB,CAAC,OAAO,CAAC;SACjD,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAS,sBAAsB,CAAC,KAAe;IAC7C,MAAM,WAAW,GAAiB,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,yDAAyD,CAAC;IAE7E,IAAI,cAAc,GAAG,EAAE,CAAC;IAExB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,WAAW;QACX,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC3D,IAAI,YAAY,EAAE,CAAC;YACjB,cAAc,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACpD,SAAS;QACX,CAAC;QAED,YAAY;QACZ,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC3C,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAChC,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAEtC,mBAAmB;YACnB,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,UAAU,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;gBAChD,WAAW,CAAC,IAAI,CAAC;oBACf,IAAI;oBACJ,UAAU;oBACV,OAAO,EAAE,cAAc;iBACxB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,QAAmB,EACnB,MAA0B;IAE1B,OAAO,+BAA+B,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC;AACvF,CAAC"}
|