@taiga-ui/mcp 0.1.0-alpha.8 → 0.1.0
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 +90 -32
- package/dist/server/server.js +23 -0
- package/dist/server/server.js.map +1 -1
- package/dist/tools/get-component-example.js +1 -3
- package/dist/tools/get-component-example.js.map +1 -1
- package/dist/tools/get-list-components.js +2 -9
- package/dist/tools/get-list-components.js.map +1 -1
- package/dist/tools/get-overview.js +102 -0
- package/dist/tools/get-overview.js.map +1 -0
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/utils/extract-header.js +407 -0
- package/dist/utils/extract-header.js.map +1 -0
- package/dist/utils/find-section.js +66 -35
- package/dist/utils/find-section.js.map +1 -1
- package/dist/utils/list-components.js +1 -2
- package/dist/utils/list-components.js.map +1 -1
- package/dist/utils/parse-content.js +9 -2
- package/dist/utils/parse-content.js.map +1 -1
- package/package.json +22 -22
package/README.md
CHANGED
|
@@ -3,9 +3,6 @@
|
|
|
3
3
|
[](https://lobehub.com/mcp/taiga-family-taiga-ui-mcp)
|
|
4
4
|
[](https://npmjs.com/package/@taiga-ui/mcp)
|
|
5
5
|
|
|
6
|
-
> 🚧 **Alpha Release**
|
|
7
|
-
> `@taiga-ui/mcp` is currently in **alpha**.
|
|
8
|
-
|
|
9
6
|
> **🚀 The fastest way to integrate Taiga UI components into your AI workflow**
|
|
10
7
|
|
|
11
8
|
A Model Context Protocol (MCP) server that provides AI assistants with comprehensive access to
|
|
@@ -15,7 +12,8 @@ development workflow.
|
|
|
15
12
|
### Key Features
|
|
16
13
|
|
|
17
14
|
- **Docs + code snippets**. Full Taiga UI markdown plus ready Angular examples in one place.
|
|
18
|
-
- **
|
|
15
|
+
- **Three MCP tools**. Get structured overview with `get_overview`, discover with `get_list_components`, fetch examples
|
|
16
|
+
via `get_component_example`.
|
|
19
17
|
- **Configurable & lightweight**. Swap source URL (stable/next) without local Angular install.
|
|
20
18
|
|
|
21
19
|
### Requirements
|
|
@@ -29,17 +27,17 @@ First, install the Taiga UI MCP server with your client.
|
|
|
29
27
|
|
|
30
28
|
**Standard config** works in most of the tools:
|
|
31
29
|
|
|
32
|
-
```
|
|
30
|
+
```json
|
|
33
31
|
{
|
|
34
|
-
mcpServers: {
|
|
35
|
-
|
|
36
|
-
command:
|
|
37
|
-
args: [
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
]
|
|
41
|
-
}
|
|
42
|
-
}
|
|
32
|
+
"mcpServers": {
|
|
33
|
+
"taiga-ui": {
|
|
34
|
+
"command": "npx",
|
|
35
|
+
"args": [
|
|
36
|
+
"@taiga-ui/mcp@latest",
|
|
37
|
+
"--source-url=https://taiga-ui.dev/llms-full.txt" // or file from /next version, if you want
|
|
38
|
+
]
|
|
39
|
+
}
|
|
40
|
+
}
|
|
43
41
|
}
|
|
44
42
|
```
|
|
45
43
|
|
|
@@ -48,21 +46,77 @@ First, install the Taiga UI MCP server with your client.
|
|
|
48
46
|
<details>
|
|
49
47
|
<summary><b>Core automation</b></summary>
|
|
50
48
|
|
|
51
|
-
1. `
|
|
49
|
+
1. `get_overview`
|
|
50
|
+
- Returns structured documentation header: import map (all packages and their exports), code generation checklist,
|
|
51
|
+
CDK types reference, common mistakes, and getting started guides.
|
|
52
|
+
- **Always call this first** before using other tools — it provides critical context for correct code generation
|
|
53
|
+
(right packages, right types, common pitfalls).
|
|
54
|
+
- Output: JSON with `sections` array (Import Map, Code Generation Checklist, CDK Types Reference, Common Mistakes,
|
|
55
|
+
Getting Started) and `totalComponents` count.
|
|
56
|
+
|
|
57
|
+
```ts
|
|
58
|
+
get_overview();
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
```json
|
|
62
|
+
{
|
|
63
|
+
"title": "Taiga UI - Complete Documentation",
|
|
64
|
+
"sections": [
|
|
65
|
+
{
|
|
66
|
+
"title": "Import Map - Package Exports Reference",
|
|
67
|
+
"criticalNotices": ["Always import from the correct package. This is the #1 cause of compilation errors."],
|
|
68
|
+
"subsections": [...]
|
|
69
|
+
},
|
|
70
|
+
{ "title": "Code Generation Checklist", "subsections": [...] },
|
|
71
|
+
{ "title": "CDK Types Reference", "subsections": [...] },
|
|
72
|
+
{ "title": "Common Mistakes", "subsections": [...] },
|
|
73
|
+
{
|
|
74
|
+
"title": "Getting Started",
|
|
75
|
+
"description": "Installation and setup guides",
|
|
76
|
+
"subsections": [
|
|
77
|
+
{ "title": "addons", "content": ["npm i @taiga-ui/addon-charts ..."] },
|
|
78
|
+
{ "title": "app-standalone", "content": ["import {TuiRoot} from '@taiga-ui/core'; ..."] },
|
|
79
|
+
...
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
],
|
|
83
|
+
"totalComponents": 185
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
2. `get_list_components { query?: string }`
|
|
52
88
|
- Lists component / section identifiers (with fuzzy substring filtering) along with basic metadata (category,
|
|
53
89
|
package, type).
|
|
54
90
|
- Input: optional `query` string to filter IDs (case-insensitive substring).
|
|
55
|
-
- Output: strictly structured JSON containing `items`, `total
|
|
91
|
+
- Output: strictly structured JSON containing `items`, `total`.
|
|
92
|
+
|
|
93
|
+
```ts
|
|
94
|
+
get_list_components();
|
|
95
|
+
```
|
|
56
96
|
|
|
57
|
-
```
|
|
97
|
+
```json
|
|
58
98
|
{
|
|
59
|
-
items: [
|
|
60
|
-
|
|
61
|
-
|
|
99
|
+
"items": [
|
|
100
|
+
{
|
|
101
|
+
"id": "components/Alert",
|
|
102
|
+
"name": "Alert",
|
|
103
|
+
"category": "components",
|
|
104
|
+
"package": "CORE",
|
|
105
|
+
"type": "component"
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"id": "components/Button",
|
|
109
|
+
"package": "CORE",
|
|
110
|
+
"type": "component",
|
|
111
|
+
"name": "Button",
|
|
112
|
+
"category": "components"
|
|
113
|
+
},
|
|
114
|
+
...
|
|
115
|
+
],
|
|
62
116
|
}
|
|
63
117
|
```
|
|
64
118
|
|
|
65
|
-
|
|
119
|
+
3. `get_component_example { "names": ["...", "..."] }`
|
|
66
120
|
- Returns full markdown content for each resolved section (entire component documentation).
|
|
67
121
|
- Fuzzy name resolution: exact match, path segment, suffix, substring, and `Tui*` variants.
|
|
68
122
|
- Input: `{ names: string[] }` (each name length ≥ 2).
|
|
@@ -70,23 +124,27 @@ First, install the Taiga UI MCP server with your client.
|
|
|
70
124
|
unresolved), `content` (array of code blocks, if examples exist). Top-level also includes `matched` (count of
|
|
71
125
|
resolved names).
|
|
72
126
|
|
|
73
|
-
```
|
|
127
|
+
```ts
|
|
128
|
+
get_component_example({names: ['Alert']});
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
```json
|
|
74
132
|
{
|
|
75
|
-
results: [
|
|
133
|
+
"results": [
|
|
76
134
|
{
|
|
77
|
-
query:
|
|
78
|
-
id:
|
|
79
|
-
package:
|
|
80
|
-
type:
|
|
81
|
-
content: [
|
|
82
|
-
}
|
|
135
|
+
"query": "Alert",
|
|
136
|
+
"id": "components/Alert",
|
|
137
|
+
"package": "CORE",
|
|
138
|
+
"type": "component",
|
|
139
|
+
"content": ["# components/Alert\n- **Package**: ... (full component API, usage examples, ...)"]
|
|
140
|
+
}
|
|
83
141
|
],
|
|
84
|
-
matched: 1
|
|
142
|
+
"matched": 1
|
|
85
143
|
}
|
|
86
144
|
```
|
|
87
145
|
|
|
88
|
-
> Tip:
|
|
89
|
-
> `get_component_example
|
|
146
|
+
> Tip: Start with `get_overview` to get import map and common mistakes, then use `get_list_components` to discover IDs
|
|
147
|
+
> and `get_component_example` to fetch full implementation snippets.
|
|
90
148
|
|
|
91
149
|
</details>
|
|
92
150
|
|
package/dist/server/server.js
CHANGED
|
@@ -7,12 +7,35 @@ import { logError, logInfo } from '../utils/logger.js';
|
|
|
7
7
|
import { ensureSourceLoaded } from './fetch.js';
|
|
8
8
|
export const state = {
|
|
9
9
|
sections: [],
|
|
10
|
+
overview: undefined,
|
|
10
11
|
sourceUrl: undefined,
|
|
11
12
|
lastLoadedAt: undefined,
|
|
12
13
|
};
|
|
13
14
|
const server = new McpServer({
|
|
14
15
|
name: 'taiga-ui-mcp',
|
|
15
16
|
version: packageJson.version,
|
|
17
|
+
}, {
|
|
18
|
+
capabilities: { tools: {} },
|
|
19
|
+
instructions: `
|
|
20
|
+
<General Purpose>
|
|
21
|
+
This server provides programmatic access to Taiga UI component documentation for AI assistants.
|
|
22
|
+
Use these tools to discover, understand, and retrieve usage examples for Taiga UI components.
|
|
23
|
+
</General Purpose>
|
|
24
|
+
|
|
25
|
+
<Core Workflows & Tool Guide>
|
|
26
|
+
* **1. Get Documentation Overview (Start Here):** Always begin by calling \`get_overview\` to retrieve the structured documentation header with installation instructions, critical notices, and general guidance.
|
|
27
|
+
|
|
28
|
+
* **2. Discover Components:** Call \`get_list_components\` to see all available Taiga UI components. Use the optional \`query\` parameter for fuzzy filtering to find specific components.
|
|
29
|
+
|
|
30
|
+
* **3. Get Component Examples:** Once you identify needed component(s), call \`get_component_example\` with component name(s) to retrieve full documentation and code examples.
|
|
31
|
+
</Core Workflows & Tool Guide>
|
|
32
|
+
|
|
33
|
+
<Key Concepts>
|
|
34
|
+
* **Component Categories:** Components are organized by category (UI elements, forms, layouts, etc.)
|
|
35
|
+
* **Packages:** Components belong to different packages (CORE, KIT, etc.)
|
|
36
|
+
* **Fuzzy Matching:** Component queries support fuzzy matching for flexible searching.
|
|
37
|
+
</Key Concepts>
|
|
38
|
+
`,
|
|
16
39
|
});
|
|
17
40
|
registerAllTools(server);
|
|
18
41
|
export async function start() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":";AACA,OAAO,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAClE,OAAO,EAAC,oBAAoB,EAAC,MAAM,2CAA2C,CAAC;AAE/E,OAAO,WAAW,MAAM,oBAAoB,CAAC,OAAM,IAAI,EAAE,MAAM,EAAC,CAAC;AAEjE,OAAO,EAAC,gBAAgB,EAAC,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAC,QAAQ,EAAE,OAAO,EAAC,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAC,kBAAkB,EAAC,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":";AACA,OAAO,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAClE,OAAO,EAAC,oBAAoB,EAAC,MAAM,2CAA2C,CAAC;AAE/E,OAAO,WAAW,MAAM,oBAAoB,CAAC,OAAM,IAAI,EAAE,MAAM,EAAC,CAAC;AAEjE,OAAO,EAAC,gBAAgB,EAAC,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAC,QAAQ,EAAE,OAAO,EAAC,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAC,kBAAkB,EAAC,MAAM,YAAY,CAAC;AAS9C,MAAM,CAAC,MAAM,KAAK,GAAe;IAC7B,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,SAAS;IACnB,SAAS,EAAE,SAAS;IACpB,YAAY,EAAE,SAAS;CAC1B,CAAC;AAEF,MAAM,MAAM,GAAG,IAAI,SAAS,CACxB;IACI,IAAI,EAAE,cAAc;IACpB,OAAO,EAAE,WAAW,CAAC,OAAO;CAC/B,EACD;IACI,YAAY,EAAE,EAAC,KAAK,EAAE,EAAE,EAAC;IACzB,YAAY,EAAE;;;;;;;;;;;;;;;;;;;CAmBrB;CACI,CACJ,CAAC;AAEF,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAEzB,MAAM,CAAC,KAAK,UAAU,KAAK;IACvB,IAAI,CAAC;QACD,MAAM,kBAAkB,EAAE,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,QAAQ,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,OAAO,CACH,mEAAmE,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAC7F,CAAC;AACN,CAAC"}
|
|
@@ -19,9 +19,7 @@ export function registerGetComponentExampleTool(server) {
|
|
|
19
19
|
},
|
|
20
20
|
}, async ({ names }) => {
|
|
21
21
|
if (!names.length) {
|
|
22
|
-
const output = {
|
|
23
|
-
error: 'Provide at least one name in names array.',
|
|
24
|
-
};
|
|
22
|
+
const output = { error: 'Provide at least one name in names array.' };
|
|
25
23
|
return {
|
|
26
24
|
content: [{ type: 'text', text: JSON.stringify(output, null, 2) }],
|
|
27
25
|
structuredContent: output,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-component-example.js","sourceRoot":"","sources":["../../src/tools/get-component-example.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAC,kBAAkB,EAAC,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAE5D,MAAM,UAAU,+BAA+B,CAAC,MAAiB;IAC7D,MAAM,CAAC,YAAY,CACf,uBAAuB,EACvB;QACI,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EACP,2JAA2J;QAC/J,WAAW,EAAE,EAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAC;QACvD,YAAY,EAAE;YACV,OAAO,EAAE,CAAC,CAAC,KAAK,CACZ,CAAC,CAAC,MAAM,CAAC;gBACL,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;gBACjB,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBACzB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;gBACzC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;gBACtC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;gBAC3C,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;aAC1C,CAAC,CACL;YACD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;SACtB;KACJ,EACD,KAAK,EAAE,EAAC,KAAK,EAAoB,EAAE,EAAE;QACjC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,MAAM,GAAG
|
|
1
|
+
{"version":3,"file":"get-component-example.js","sourceRoot":"","sources":["../../src/tools/get-component-example.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAC,kBAAkB,EAAC,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAE5D,MAAM,UAAU,+BAA+B,CAAC,MAAiB;IAC7D,MAAM,CAAC,YAAY,CACf,uBAAuB,EACvB;QACI,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EACP,2JAA2J;QAC/J,WAAW,EAAE,EAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAC;QACvD,YAAY,EAAE;YACV,OAAO,EAAE,CAAC,CAAC,KAAK,CACZ,CAAC,CAAC,MAAM,CAAC;gBACL,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;gBACjB,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBACzB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;gBACzC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;gBACtC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;gBAC3C,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;aAC1C,CAAC,CACL;YACD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;SACtB;KACJ,EACD,KAAK,EAAE,EAAC,KAAK,EAAoB,EAAE,EAAE;QACjC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,MAAM,GAAG,EAAC,KAAK,EAAE,2CAA2C,EAAC,CAAC;YAEpE,OAAO;gBACH,OAAO,EAAE,CAAC,EAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAC,CAAC;gBAChE,iBAAiB,EAAE,MAAM;aAC5B,CAAC;QACN,CAAC;QAED,MAAM,kBAAkB,EAAE,CAAC;QAE3B,MAAM,EAAC,OAAO,EAAE,OAAO,EAAC,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,EAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAC,CAAC;QAE3C,OAAO;YACH,OAAO,EAAE,CAAC,EAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAC,CAAC;YAChE,iBAAiB,EAAE,MAAM;SAC5B,CAAC;IACN,CAAC,CACJ,CAAC;AACN,CAAC"}
|
|
@@ -5,7 +5,7 @@ export function registerGetListComponentsTool(server) {
|
|
|
5
5
|
server.registerTool('get_list_components', {
|
|
6
6
|
title: 'List Components',
|
|
7
7
|
description: 'List all Taiga UI documentation section IDs (structured JSON only).',
|
|
8
|
-
inputSchema: { query: z.string().optional() },
|
|
8
|
+
inputSchema: { query: z.string().optional().default('') },
|
|
9
9
|
outputSchema: {
|
|
10
10
|
items: z.array(z.object({
|
|
11
11
|
id: z.string(),
|
|
@@ -14,17 +14,10 @@ export function registerGetListComponentsTool(server) {
|
|
|
14
14
|
package: z.string().nullable(),
|
|
15
15
|
type: z.string().nullable(),
|
|
16
16
|
})),
|
|
17
|
-
total: z.number(),
|
|
18
|
-
query: z.string().nullable(),
|
|
19
17
|
},
|
|
20
18
|
}, async ({ query }) => {
|
|
21
19
|
await ensureSourceLoaded();
|
|
22
|
-
const { items
|
|
23
|
-
const output = {
|
|
24
|
-
items,
|
|
25
|
-
total: items.length,
|
|
26
|
-
query: normalizedQuery,
|
|
27
|
-
};
|
|
20
|
+
const output = { items: constructComponentsList(query) };
|
|
28
21
|
return {
|
|
29
22
|
content: [
|
|
30
23
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-list-components.js","sourceRoot":"","sources":["../../src/tools/get-list-components.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAC,kBAAkB,EAAC,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAC,uBAAuB,EAAC,MAAM,6BAA6B,CAAC;AAEpE,MAAM,UAAU,6BAA6B,CAAC,MAAiB;IAC3D,MAAM,CAAC,YAAY,CACf,qBAAqB,EACrB;QACI,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACP,qEAAqE;QACzE,WAAW,EAAE,EAAC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAC;
|
|
1
|
+
{"version":3,"file":"get-list-components.js","sourceRoot":"","sources":["../../src/tools/get-list-components.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAC,kBAAkB,EAAC,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAC,uBAAuB,EAAC,MAAM,6BAA6B,CAAC;AAEpE,MAAM,UAAU,6BAA6B,CAAC,MAAiB;IAC3D,MAAM,CAAC,YAAY,CACf,qBAAqB,EACrB;QACI,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACP,qEAAqE;QACzE,WAAW,EAAE,EAAC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,EAAC;QACvD,YAAY,EAAE;YACV,KAAK,EAAE,CAAC,CAAC,KAAK,CACV,CAAC,CAAC,MAAM,CAAC;gBACL,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;gBACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;gBAChB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;gBACpB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBAC9B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aAC9B,CAAC,CACL;SACJ;KACJ,EACD,KAAK,EAAE,EAAC,KAAK,EAAmB,EAAE,EAAE;QAChC,MAAM,kBAAkB,EAAE,CAAC;QAE3B,MAAM,MAAM,GAAG,EAAC,KAAK,EAAE,uBAAuB,CAAC,KAAK,CAAC,EAAC,CAAC;QAEvD,OAAO;YACH,OAAO,EAAE;gBACL;oBACI,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBACxC;aACJ;YACD,iBAAiB,EAAE,MAAM;SAC5B,CAAC;IACN,CAAC,CACJ,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ensureSourceLoaded } from '../server/fetch.js';
|
|
3
|
+
import { state } from '../server/server.js';
|
|
4
|
+
import { parseHeaderSections, } from '../utils/extract-header.js';
|
|
5
|
+
export function registerGetOverviewTool(server) {
|
|
6
|
+
server.registerTool('get_overview', {
|
|
7
|
+
title: 'Get Documentation Overview',
|
|
8
|
+
description: 'Call this tool FIRST to retrieve the fully structured documentation header as JSON. Returns hierarchical sections with parsed content (no raw markdown). Includes installation instructions, critical notices, and subsections with their content and code blocks. This provides essential context before exploring specific components.',
|
|
9
|
+
inputSchema: z.object({}).optional(),
|
|
10
|
+
outputSchema: {
|
|
11
|
+
title: z.string(),
|
|
12
|
+
sections: z.array(z.object({
|
|
13
|
+
title: z.string(),
|
|
14
|
+
description: z.string().optional(),
|
|
15
|
+
criticalNotices: z.array(z.string()),
|
|
16
|
+
subsections: z.array(z.object({
|
|
17
|
+
title: z.string(),
|
|
18
|
+
content: z.array(z.string()),
|
|
19
|
+
sections: z
|
|
20
|
+
.array(z.object({
|
|
21
|
+
section: z.string(),
|
|
22
|
+
code: z.string().optional(),
|
|
23
|
+
}))
|
|
24
|
+
.optional(),
|
|
25
|
+
items: z
|
|
26
|
+
.array(z.object({
|
|
27
|
+
title: z.string(),
|
|
28
|
+
content: z.array(z.string()),
|
|
29
|
+
code: z.string().optional(),
|
|
30
|
+
sections: z
|
|
31
|
+
.array(z.object({
|
|
32
|
+
section: z.string(),
|
|
33
|
+
code: z.string().optional(),
|
|
34
|
+
}))
|
|
35
|
+
.optional(),
|
|
36
|
+
}))
|
|
37
|
+
.optional(),
|
|
38
|
+
})),
|
|
39
|
+
})),
|
|
40
|
+
totalComponents: z.number(),
|
|
41
|
+
sourceUrl: z.string().optional(),
|
|
42
|
+
},
|
|
43
|
+
}, async () => {
|
|
44
|
+
await ensureSourceLoaded();
|
|
45
|
+
const headerInfo = state.overview
|
|
46
|
+
? parseHeaderSections(state.overview)
|
|
47
|
+
: {
|
|
48
|
+
title: 'Taiga UI Documentation',
|
|
49
|
+
sections: [],
|
|
50
|
+
};
|
|
51
|
+
const output = {
|
|
52
|
+
title: headerInfo.title,
|
|
53
|
+
sections: headerInfo.sections.map((section) => {
|
|
54
|
+
const sectionData = { title: section.title };
|
|
55
|
+
if (section.description) {
|
|
56
|
+
sectionData.description = section.description;
|
|
57
|
+
}
|
|
58
|
+
sectionData.criticalNotices = section.criticalNotices;
|
|
59
|
+
sectionData.subsections = section.subsections.map((sub) => {
|
|
60
|
+
const subData = {
|
|
61
|
+
title: sub.title,
|
|
62
|
+
content: sub.content,
|
|
63
|
+
};
|
|
64
|
+
// Only include sections if not empty
|
|
65
|
+
if (sub.sections && sub.sections.length > 0) {
|
|
66
|
+
subData.sections = sub.sections;
|
|
67
|
+
}
|
|
68
|
+
// Only include items if not empty
|
|
69
|
+
if (sub.items && sub.items.length > 0) {
|
|
70
|
+
subData.items = sub.items.map((item) => {
|
|
71
|
+
const itemData = {
|
|
72
|
+
title: item.title,
|
|
73
|
+
content: item.content,
|
|
74
|
+
};
|
|
75
|
+
if (item.code) {
|
|
76
|
+
itemData.code = item.code;
|
|
77
|
+
}
|
|
78
|
+
if (item.sections && item.sections.length > 0) {
|
|
79
|
+
itemData.sections = item.sections;
|
|
80
|
+
}
|
|
81
|
+
return itemData;
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
return subData;
|
|
85
|
+
});
|
|
86
|
+
return sectionData;
|
|
87
|
+
}),
|
|
88
|
+
totalComponents: state.sections.length,
|
|
89
|
+
sourceUrl: state.sourceUrl,
|
|
90
|
+
};
|
|
91
|
+
return {
|
|
92
|
+
content: [
|
|
93
|
+
{
|
|
94
|
+
type: 'text',
|
|
95
|
+
text: JSON.stringify(output, null, 2),
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
structuredContent: output,
|
|
99
|
+
};
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=get-overview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-overview.js","sourceRoot":"","sources":["../../src/tools/get-overview.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/index.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { registerGetComponentExampleTool } from './get-component-example.js';
|
|
2
2
|
import { registerGetListComponentsTool } from './get-list-components.js';
|
|
3
|
+
import { registerGetOverviewTool } from './get-overview.js';
|
|
3
4
|
export function registerAllTools(server) {
|
|
5
|
+
registerGetOverviewTool(server);
|
|
4
6
|
registerGetListComponentsTool(server);
|
|
5
7
|
registerGetComponentExampleTool(server);
|
|
6
8
|
}
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,+BAA+B,EAAC,MAAM,4BAA4B,CAAC;AAC3E,OAAO,EAAC,6BAA6B,EAAC,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,+BAA+B,EAAC,MAAM,4BAA4B,CAAC;AAC3E,OAAO,EAAC,6BAA6B,EAAC,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAC,uBAAuB,EAAC,MAAM,mBAAmB,CAAC;AAE1D,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAC9C,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,6BAA6B,CAAC,MAAM,CAAC,CAAC;IACtC,+BAA+B,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extracts the documentation header from raw content.
|
|
3
|
+
* Header is everything before the first "# components/" heading.
|
|
4
|
+
*/
|
|
5
|
+
export function extractHeaderContent(rawContent) {
|
|
6
|
+
const lines = rawContent.split(/\r?\n/);
|
|
7
|
+
const headerLines = [];
|
|
8
|
+
for (const line of lines) {
|
|
9
|
+
if (/^#\s+components\//.test(line)) {
|
|
10
|
+
break;
|
|
11
|
+
}
|
|
12
|
+
headerLines.push(line);
|
|
13
|
+
}
|
|
14
|
+
return headerLines.join('\n').trim();
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Finds the line number where components section starts.
|
|
18
|
+
*/
|
|
19
|
+
export function findComponentsSectionStart(rawContent) {
|
|
20
|
+
const lines = rawContent.split(/\r?\n/);
|
|
21
|
+
for (let i = 0; i < lines.length; i++) {
|
|
22
|
+
const line = lines[i];
|
|
23
|
+
if (line && /^#\s+components\//.test(line)) {
|
|
24
|
+
return i;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return lines.length;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Parses code blocks from content lines.
|
|
31
|
+
*/
|
|
32
|
+
function extractCodeBlocks(content) {
|
|
33
|
+
const codeBlocks = [];
|
|
34
|
+
const lines = content.split('\n');
|
|
35
|
+
let inCodeBlock = false;
|
|
36
|
+
let currentLang = '';
|
|
37
|
+
let currentCode = [];
|
|
38
|
+
for (const line of lines) {
|
|
39
|
+
if (line.startsWith('```')) {
|
|
40
|
+
if (inCodeBlock) {
|
|
41
|
+
// End of code block
|
|
42
|
+
codeBlocks.push({
|
|
43
|
+
language: currentLang,
|
|
44
|
+
code: currentCode.join('\n').trim(),
|
|
45
|
+
});
|
|
46
|
+
currentCode = [];
|
|
47
|
+
inCodeBlock = false;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
// Start of code block
|
|
51
|
+
currentLang = line.slice(3).trim() || 'plaintext';
|
|
52
|
+
inCodeBlock = true;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else if (inCodeBlock) {
|
|
56
|
+
currentCode.push(line);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return codeBlocks;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Extracts plain text content (removes markdown formatting, code blocks, etc).
|
|
63
|
+
*/
|
|
64
|
+
function extractPlainContent(content) {
|
|
65
|
+
const lines = content.split('\n');
|
|
66
|
+
const plainLines = [];
|
|
67
|
+
let inCodeBlock = false;
|
|
68
|
+
for (const line of lines) {
|
|
69
|
+
// Skip code blocks
|
|
70
|
+
if (line.startsWith('```')) {
|
|
71
|
+
inCodeBlock = !inCodeBlock;
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (inCodeBlock) {
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
// Skip empty lines
|
|
78
|
+
if (!line.trim()) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
// Skip markdown headings (they're already captured)
|
|
82
|
+
if (/^#{1,6}\s+/.test(line)) {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
// Skip horizontal rules
|
|
86
|
+
if (/^-{3,}\s*$/.test(line)) {
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
// Skip blockquotes with **Critical** or **Auto-generated** (already extracted)
|
|
90
|
+
if (line.includes('**Critical**:') || line.includes('**Auto-generated**:')) {
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
// Clean up other blockquotes
|
|
94
|
+
let cleaned = line.replace(/^>\s*/, '').trim();
|
|
95
|
+
// Remove bold/italic markers
|
|
96
|
+
cleaned = cleaned.replaceAll(/\*\*([^*]+)\*\*/g, '$1');
|
|
97
|
+
cleaned = cleaned.replaceAll(/\*([^*]+)\*/g, '$1');
|
|
98
|
+
// Remove inline code markers
|
|
99
|
+
cleaned = cleaned.replaceAll(/`([^`]+)`/g, '$1');
|
|
100
|
+
if (cleaned) {
|
|
101
|
+
plainLines.push(cleaned);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return plainLines;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Parses a section into structured data.
|
|
108
|
+
*/
|
|
109
|
+
function parseSection(content) {
|
|
110
|
+
const lines = content.split('\n');
|
|
111
|
+
const subsections = [];
|
|
112
|
+
const description = [];
|
|
113
|
+
const criticalNotices = [];
|
|
114
|
+
let title = '';
|
|
115
|
+
// Find all headings (both markdown # and **bold:** patterns)
|
|
116
|
+
const headings = [];
|
|
117
|
+
for (let i = 0; i < lines.length; i++) {
|
|
118
|
+
const line = lines[i];
|
|
119
|
+
if (!line) {
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
// Extract title from first heading
|
|
123
|
+
const h1Match = /^#\s+([^#]\S.*)$/.exec(line);
|
|
124
|
+
if (h1Match?.[1] && !title) {
|
|
125
|
+
title = h1Match[1].trim();
|
|
126
|
+
headings.push({ line: i, level: 1, title: h1Match[1].trim() });
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
// Extract subsections (##, ###, etc)
|
|
130
|
+
const hMatch = /^(#{2,6})\s+(\S.*)$/.exec(line);
|
|
131
|
+
if (hMatch?.[1] && hMatch[2]) {
|
|
132
|
+
const level = hMatch[1].length;
|
|
133
|
+
headings.push({ line: i, level, title: hMatch[2].trim() });
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
// Extract **Bold:** headings (treat as level 2)
|
|
137
|
+
const boldMatch = /^\*\*(.+):\*\*$/.exec(line);
|
|
138
|
+
if (boldMatch?.[1]) {
|
|
139
|
+
headings.push({ line: i, level: 2, title: `${boldMatch[1].trim()}:` });
|
|
140
|
+
}
|
|
141
|
+
// Extract critical notices
|
|
142
|
+
if (line.startsWith('> **Critical**:')) {
|
|
143
|
+
const notice = line.replace(/^>\s*\*\*Critical\*\*:\s*/, '').trim();
|
|
144
|
+
if (notice) {
|
|
145
|
+
criticalNotices.push(notice);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Extract description (content before first subsection)
|
|
150
|
+
if (headings.length > 0 && headings[0]) {
|
|
151
|
+
const firstSubsectionLine = headings.find((h) => h.level > 1)?.line;
|
|
152
|
+
const descEnd = firstSubsectionLine ?? lines.length;
|
|
153
|
+
const descContent = lines.slice(headings[0].line + 1, descEnd).join('\n');
|
|
154
|
+
description.push(...extractPlainContent(descContent));
|
|
155
|
+
}
|
|
156
|
+
// Parse subsections - group bold headings under level-3, level-3 under level-2
|
|
157
|
+
let currentSubsection = null;
|
|
158
|
+
let currentItem = null;
|
|
159
|
+
let currentGroup = null;
|
|
160
|
+
const pushCurrentItem = () => {
|
|
161
|
+
if (!currentItem || !currentSubsection) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
if (currentItem.content.length > 0 ||
|
|
165
|
+
currentItem.code ||
|
|
166
|
+
(currentItem.sections && currentItem.sections.length > 0)) {
|
|
167
|
+
currentSubsection.items = currentSubsection.items || [];
|
|
168
|
+
currentSubsection.items.push(currentItem);
|
|
169
|
+
}
|
|
170
|
+
currentItem = null;
|
|
171
|
+
};
|
|
172
|
+
const pushCurrentGroup = () => {
|
|
173
|
+
if (!currentGroup || !currentSubsection) {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
if (currentGroup.content.length > 0 ||
|
|
177
|
+
(currentGroup.sections && currentGroup.sections.length > 0)) {
|
|
178
|
+
currentSubsection.items = currentSubsection.items || [];
|
|
179
|
+
currentSubsection.items.push(currentGroup);
|
|
180
|
+
}
|
|
181
|
+
currentGroup = null;
|
|
182
|
+
};
|
|
183
|
+
const addSectionToItem = (item, sectionItem, plainContent) => {
|
|
184
|
+
item.sections = item.sections || [];
|
|
185
|
+
item.sections.push(sectionItem);
|
|
186
|
+
if (plainContent.length > 0) {
|
|
187
|
+
item.content.push(...plainContent);
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
for (let i = 1; i < headings.length; i++) {
|
|
191
|
+
const current = headings[i];
|
|
192
|
+
if (!current) {
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
const start = current.line;
|
|
196
|
+
const end = headings[i + 1]?.line ?? lines.length;
|
|
197
|
+
const subsectionContent = lines.slice(start + 1, end).join('\n');
|
|
198
|
+
// Level 2 heading (##) - create new subsection
|
|
199
|
+
if (current.level === 2 && !current.title.endsWith(':')) {
|
|
200
|
+
// Save previous subsection and item (only if they have content)
|
|
201
|
+
pushCurrentItem();
|
|
202
|
+
pushCurrentGroup();
|
|
203
|
+
if (currentSubsection) {
|
|
204
|
+
// Only push if has content
|
|
205
|
+
if (currentSubsection.content.length > 0 ||
|
|
206
|
+
(currentSubsection.sections &&
|
|
207
|
+
currentSubsection.sections.length > 0) ||
|
|
208
|
+
(currentSubsection.items && currentSubsection.items.length > 0)) {
|
|
209
|
+
subsections.push(currentSubsection);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
const [block] = extractCodeBlocks(subsectionContent);
|
|
213
|
+
const subsectionSections = block
|
|
214
|
+
? [
|
|
215
|
+
{
|
|
216
|
+
section: current.title,
|
|
217
|
+
code: block.code,
|
|
218
|
+
},
|
|
219
|
+
]
|
|
220
|
+
: [];
|
|
221
|
+
currentSubsection = {
|
|
222
|
+
title: current.title,
|
|
223
|
+
content: extractPlainContent(subsectionContent),
|
|
224
|
+
sections: subsectionSections,
|
|
225
|
+
items: [],
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
// Level 3 heading (###) - create new nested item
|
|
229
|
+
else if (current.level === 3 && !current.title.endsWith(':')) {
|
|
230
|
+
const plainContent = extractPlainContent(subsectionContent);
|
|
231
|
+
const codeBlocks = extractCodeBlocks(subsectionContent);
|
|
232
|
+
const code = codeBlocks.length > 0 ? codeBlocks[0]?.code : undefined;
|
|
233
|
+
if (currentGroup && currentSubsection) {
|
|
234
|
+
const sectionItem = {
|
|
235
|
+
section: current.title,
|
|
236
|
+
code,
|
|
237
|
+
};
|
|
238
|
+
currentGroup.sections = currentGroup.sections || [];
|
|
239
|
+
currentGroup.sections.push(sectionItem);
|
|
240
|
+
if (plainContent.length > 0) {
|
|
241
|
+
currentGroup.content.push(...plainContent);
|
|
242
|
+
}
|
|
243
|
+
continue;
|
|
244
|
+
}
|
|
245
|
+
// Save previous item (only if it has content or sections)
|
|
246
|
+
pushCurrentItem();
|
|
247
|
+
currentItem = {
|
|
248
|
+
title: current.title,
|
|
249
|
+
content: plainContent,
|
|
250
|
+
...(code ? { code } : {}),
|
|
251
|
+
sections: [],
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
// Bold heading (ends with :) - add to current context
|
|
255
|
+
else if (current.title.endsWith(':')) {
|
|
256
|
+
const codeBlocks = extractCodeBlocks(subsectionContent);
|
|
257
|
+
const code = codeBlocks.length > 0 ? codeBlocks[0]?.code : undefined;
|
|
258
|
+
const plainContent = extractPlainContent(subsectionContent);
|
|
259
|
+
const nextHeading = headings[i + 1];
|
|
260
|
+
if (currentSubsection && !currentItem && nextHeading?.level === 3) {
|
|
261
|
+
pushCurrentGroup();
|
|
262
|
+
currentGroup = {
|
|
263
|
+
title: current.title.replace(/:\s*$/, ''),
|
|
264
|
+
content: plainContent,
|
|
265
|
+
...(code ? { code } : {}),
|
|
266
|
+
sections: [],
|
|
267
|
+
};
|
|
268
|
+
currentItem = null;
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
const sectionItem = {
|
|
272
|
+
section: current.title,
|
|
273
|
+
code,
|
|
274
|
+
};
|
|
275
|
+
if (currentItem) {
|
|
276
|
+
addSectionToItem(currentItem, sectionItem, plainContent);
|
|
277
|
+
continue;
|
|
278
|
+
}
|
|
279
|
+
if (currentSubsection) {
|
|
280
|
+
currentSubsection.sections = currentSubsection.sections || [];
|
|
281
|
+
currentSubsection.sections.push(sectionItem);
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
// Standalone bold heading
|
|
285
|
+
subsections.push({
|
|
286
|
+
title: current.title,
|
|
287
|
+
content: plainContent,
|
|
288
|
+
sections: code ? [sectionItem] : undefined,
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
// Other headings - handle as needed
|
|
293
|
+
else {
|
|
294
|
+
pushCurrentItem();
|
|
295
|
+
pushCurrentGroup();
|
|
296
|
+
if (currentSubsection) {
|
|
297
|
+
subsections.push(currentSubsection);
|
|
298
|
+
currentSubsection = null;
|
|
299
|
+
}
|
|
300
|
+
const plainContent = extractPlainContent(subsectionContent);
|
|
301
|
+
const codeBlocks = extractCodeBlocks(subsectionContent);
|
|
302
|
+
subsections.push({
|
|
303
|
+
title: current.title,
|
|
304
|
+
content: plainContent,
|
|
305
|
+
sections: codeBlocks.length > 0
|
|
306
|
+
? [{ section: current.title, code: codeBlocks[0]?.code }]
|
|
307
|
+
: undefined,
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
// Push last item/group and subsection (only if they have content)
|
|
312
|
+
pushCurrentItem();
|
|
313
|
+
pushCurrentGroup();
|
|
314
|
+
if (currentSubsection) {
|
|
315
|
+
// Only push subsection if it has content, sections, or items
|
|
316
|
+
if (currentSubsection.content.length > 0 ||
|
|
317
|
+
(currentSubsection.sections && currentSubsection.sections.length > 0) ||
|
|
318
|
+
(currentSubsection.items && currentSubsection.items.length > 0)) {
|
|
319
|
+
subsections.push(currentSubsection);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
// Special handling for .md files: if no subsections were created but there's code content
|
|
323
|
+
// (typical for installation guide files), create a subsection with the code
|
|
324
|
+
if (subsections.length === 0 && headings.length === 1 && headings[0]) {
|
|
325
|
+
// Get content after the title heading
|
|
326
|
+
const contentAfterTitle = lines.slice(headings[0].line + 1).join('\n');
|
|
327
|
+
const codeBlocks = extractCodeBlocks(contentAfterTitle);
|
|
328
|
+
if (codeBlocks.length > 0 && codeBlocks[0]) {
|
|
329
|
+
// Create a subsection with code directly in content
|
|
330
|
+
subsections.push({
|
|
331
|
+
title: '', // Empty title for direct code under h1
|
|
332
|
+
content: [codeBlocks[0].code], // Put code as single string in content
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
const descriptionText = description.join('\n');
|
|
337
|
+
return {
|
|
338
|
+
title,
|
|
339
|
+
description: descriptionText || '',
|
|
340
|
+
criticalNotices,
|
|
341
|
+
subsections,
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Parses the header content into fully structured JSON.
|
|
346
|
+
*/
|
|
347
|
+
export function parseHeaderSections(headerContent) {
|
|
348
|
+
const lines = headerContent.split(/\r?\n/);
|
|
349
|
+
const sections = [];
|
|
350
|
+
const title = 'Taiga UI - Complete Documentation';
|
|
351
|
+
// Find main sections (level-1 headings)
|
|
352
|
+
const sectionIndices = [];
|
|
353
|
+
for (let i = 0; i < lines.length; i++) {
|
|
354
|
+
const line = lines[i];
|
|
355
|
+
if (!line) {
|
|
356
|
+
continue;
|
|
357
|
+
}
|
|
358
|
+
// Level-1 heading
|
|
359
|
+
const h1Match = /^#\s+([^#]\S.*)$/.exec(line);
|
|
360
|
+
if (h1Match?.[1]) {
|
|
361
|
+
sectionIndices.push({
|
|
362
|
+
line: i,
|
|
363
|
+
title: h1Match[1].trim(),
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
// Parse each section
|
|
368
|
+
for (let i = 0; i < sectionIndices.length; i++) {
|
|
369
|
+
const currentSection = sectionIndices[i];
|
|
370
|
+
if (!currentSection) {
|
|
371
|
+
continue;
|
|
372
|
+
}
|
|
373
|
+
const start = currentSection.line;
|
|
374
|
+
const end = sectionIndices[i + 1]?.line ?? lines.length;
|
|
375
|
+
const sectionContent = lines.slice(start, end).join('\n');
|
|
376
|
+
const parsedSection = parseSection(sectionContent);
|
|
377
|
+
sections.push(parsedSection);
|
|
378
|
+
}
|
|
379
|
+
const compactSections = sections.map((section) => {
|
|
380
|
+
const hasMarkdownSubsections = section.subsections.some((subsection) => subsection.title.endsWith('.md'));
|
|
381
|
+
if (!hasMarkdownSubsections) {
|
|
382
|
+
return section;
|
|
383
|
+
}
|
|
384
|
+
return {
|
|
385
|
+
...section,
|
|
386
|
+
subsections: section.subsections.map((subsection) => {
|
|
387
|
+
const redundantSingleCodeSection = subsection.content.length === 0 &&
|
|
388
|
+
!subsection.items?.length &&
|
|
389
|
+
subsection.sections?.length === 1 &&
|
|
390
|
+
subsection.sections[0]?.section === subsection.title &&
|
|
391
|
+
Boolean(subsection.sections[0].code);
|
|
392
|
+
if (!redundantSingleCodeSection) {
|
|
393
|
+
return subsection;
|
|
394
|
+
}
|
|
395
|
+
return {
|
|
396
|
+
title: subsection.title,
|
|
397
|
+
content: [subsection.sections?.[0]?.code ?? ''],
|
|
398
|
+
};
|
|
399
|
+
}),
|
|
400
|
+
};
|
|
401
|
+
});
|
|
402
|
+
return {
|
|
403
|
+
title,
|
|
404
|
+
sections: compactSections,
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
//# sourceMappingURL=extract-header.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-header.js","sourceRoot":"","sources":["../../src/utils/extract-header.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,66 +1,97 @@
|
|
|
1
1
|
import { state } from '../server/server.js';
|
|
2
|
+
const GENERIC_SUFFIXES = new Set([
|
|
3
|
+
'component',
|
|
4
|
+
'context',
|
|
5
|
+
'directive',
|
|
6
|
+
'guard',
|
|
7
|
+
'interceptor',
|
|
8
|
+
'module',
|
|
9
|
+
'options',
|
|
10
|
+
'pipe',
|
|
11
|
+
'service',
|
|
12
|
+
]);
|
|
13
|
+
function normalizeToKebab(name) {
|
|
14
|
+
const stripped = name.replace(/^[Tt]ui[-_]?/, '');
|
|
15
|
+
return stripped.replaceAll(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
|
|
16
|
+
}
|
|
2
17
|
export function findSection(name) {
|
|
3
|
-
const
|
|
18
|
+
const stripped = name.replace(/^[Tt]ui[-_]?/, '');
|
|
19
|
+
const kebab = normalizeToKebab(name);
|
|
20
|
+
// Last word of kebab: "icon-button" → "button" (useful for compound names like TuiIconButton)
|
|
21
|
+
// Exclude generic Angular suffixes that match too broadly
|
|
22
|
+
const kebabParts = kebab.split('-').filter(Boolean);
|
|
23
|
+
const lastWordCandidate = kebabParts.length > 1 ? (kebabParts[kebabParts.length - 1] ?? '') : '';
|
|
24
|
+
const lastWord = GENERIC_SUFFIXES.has(lastWordCandidate) ? '' : lastWordCandidate;
|
|
25
|
+
const pascalCase = (stripped || name)
|
|
4
26
|
.toLowerCase()
|
|
5
27
|
.split(/[-_\s]+/)
|
|
6
28
|
.filter(Boolean)
|
|
7
29
|
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
8
30
|
.join('');
|
|
9
|
-
const camelCase = pascalCase
|
|
10
|
-
? pascalCase.charAt(0).toLowerCase() + pascalCase.slice(1)
|
|
11
|
-
: '';
|
|
12
31
|
const tuiVariant = pascalCase.startsWith('Tui') ? pascalCase : `Tui${pascalCase}`;
|
|
32
|
+
// All variants pre-lowercased to avoid repeated .toLowerCase() in loops
|
|
13
33
|
const variants = [
|
|
14
34
|
name.toLowerCase(),
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
35
|
+
stripped.toLowerCase(),
|
|
36
|
+
kebab,
|
|
37
|
+
lastWord,
|
|
38
|
+
pascalCase.toLowerCase(),
|
|
18
39
|
tuiVariant.toLowerCase(),
|
|
19
40
|
].filter(Boolean);
|
|
41
|
+
// Pre-compute per-section data once per call
|
|
42
|
+
const sections = state.sections.map((section) => ({
|
|
43
|
+
section,
|
|
44
|
+
id: section.id.toLowerCase(),
|
|
45
|
+
segment: section.id.split('/').pop()?.toLowerCase() ?? '',
|
|
46
|
+
}));
|
|
20
47
|
// Exact match
|
|
21
48
|
for (const variant of variants) {
|
|
22
|
-
const
|
|
23
|
-
if (
|
|
24
|
-
return
|
|
49
|
+
const match = sections.find((s) => s.id === variant);
|
|
50
|
+
if (match) {
|
|
51
|
+
return match.section;
|
|
25
52
|
}
|
|
26
53
|
}
|
|
27
54
|
// Last path segment match
|
|
28
55
|
for (const variant of variants) {
|
|
29
|
-
const
|
|
30
|
-
if (
|
|
31
|
-
return
|
|
56
|
+
const match = sections.find((s) => s.segment === variant);
|
|
57
|
+
if (match) {
|
|
58
|
+
return match.section;
|
|
32
59
|
}
|
|
33
60
|
}
|
|
34
61
|
// Ends-with match
|
|
35
62
|
for (const variant of variants) {
|
|
36
|
-
const
|
|
37
|
-
if (
|
|
38
|
-
return
|
|
63
|
+
const match = sections.find((s) => s.id.endsWith(`/${variant}`));
|
|
64
|
+
if (match) {
|
|
65
|
+
return match.section;
|
|
39
66
|
}
|
|
40
67
|
}
|
|
41
|
-
// Substring fallback
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
68
|
+
// Substring fallback — check all variants including stripped/kebab
|
|
69
|
+
for (const variant of variants) {
|
|
70
|
+
const match = sections.find((s) => s.id.includes(variant));
|
|
71
|
+
if (match) {
|
|
72
|
+
return match.section;
|
|
73
|
+
}
|
|
45
74
|
}
|
|
46
75
|
return undefined;
|
|
47
76
|
}
|
|
48
77
|
export function suggestSections(query) {
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
.
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
78
|
+
const kebab = normalizeToKebab(query);
|
|
79
|
+
const parts = kebab
|
|
80
|
+
.split('-')
|
|
81
|
+
.filter((p) => !GENERIC_SUFFIXES.has(p) && p.length > 1);
|
|
82
|
+
// Try full kebab first, then without generic suffixes
|
|
83
|
+
const normalizedQuery = (parts.join('-') || kebab || query).toLowerCase();
|
|
84
|
+
const results = [];
|
|
85
|
+
for (const section of state.sections) {
|
|
86
|
+
const idLower = section.id.toLowerCase();
|
|
87
|
+
const matchIndex = idLower.indexOf(normalizedQuery);
|
|
88
|
+
if (matchIndex !== -1) {
|
|
89
|
+
results.push({
|
|
57
90
|
id: section.id,
|
|
58
|
-
score: matchIndex * 10 +
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
.sort((a, b) => a.score - b.score)
|
|
64
|
-
.map((result) => result.id);
|
|
91
|
+
score: matchIndex * 10 + Math.abs(idLower.length - normalizedQuery.length),
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return results.sort((a, b) => a.score - b.score).map((r) => r.id);
|
|
65
96
|
}
|
|
66
97
|
//# sourceMappingURL=find-section.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find-section.js","sourceRoot":"","sources":["../../src/utils/find-section.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,KAAK,EAAC,MAAM,qBAAqB,CAAC;AAE1C,MAAM,
|
|
1
|
+
{"version":3,"file":"find-section.js","sourceRoot":"","sources":["../../src/utils/find-section.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { state } from '../server/server.js';
|
|
2
2
|
export function constructComponentsList(query = '') {
|
|
3
3
|
const normalizedQuery = query.toLowerCase().replace(/^tui/, '');
|
|
4
|
-
|
|
4
|
+
return state.sections
|
|
5
5
|
.filter((section) => !normalizedQuery || section.id.toLowerCase().includes(normalizedQuery))
|
|
6
6
|
.map((section) => {
|
|
7
7
|
const idParts = section.id.split('/');
|
|
@@ -15,6 +15,5 @@ export function constructComponentsList(query = '') {
|
|
|
15
15
|
type: section.kind ?? null,
|
|
16
16
|
};
|
|
17
17
|
});
|
|
18
|
-
return { items, normalizedQuery };
|
|
19
18
|
}
|
|
20
19
|
//# sourceMappingURL=list-components.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-components.js","sourceRoot":"","sources":["../../src/utils/list-components.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAC,MAAM,qBAAqB,CAAC;AAU1C,MAAM,UAAU,uBAAuB,CAAC,KAAK,GAAG,EAAE;
|
|
1
|
+
{"version":3,"file":"list-components.js","sourceRoot":"","sources":["../../src/utils/list-components.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAC,MAAM,qBAAqB,CAAC;AAU1C,MAAM,UAAU,uBAAuB,CAAC,KAAK,GAAG,EAAE;IAC9C,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAEhE,OAAO,KAAK,CAAC,QAAQ;SAChB,MAAM,CACH,CAAC,OAAO,EAAE,EAAE,CACR,CAAC,eAAe,IAAI,OAAO,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,CAC7E;SACA,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACb,MAAM,OAAO,GAAG,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC;QACvD,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAElC,OAAO;YACH,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI;YACJ,QAAQ;YACR,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI;YAChC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI;SAC7B,CAAC;IACN,CAAC,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { state } from '../server/server.js';
|
|
2
|
+
import { extractHeaderContent, findComponentsSectionStart } from './extract-header.js';
|
|
2
3
|
function extractMeta(text) {
|
|
3
4
|
let pkg;
|
|
4
5
|
let kind;
|
|
@@ -14,14 +15,20 @@ function extractMeta(text) {
|
|
|
14
15
|
}
|
|
15
16
|
export function parseContent(rawContent, sourceUrl) {
|
|
16
17
|
state.sourceUrl = sourceUrl;
|
|
18
|
+
// Extract and store header separately
|
|
19
|
+
const headerContent = extractHeaderContent(rawContent);
|
|
20
|
+
state.overview = headerContent;
|
|
17
21
|
const lines = rawContent.split(/\r?\n/);
|
|
22
|
+
const componentsStartLine = findComponentsSectionStart(rawContent);
|
|
18
23
|
const headerIndices = [];
|
|
19
|
-
|
|
24
|
+
// Find all level-1 headings that are components (starting after the horizontal rule)
|
|
25
|
+
for (let lineIndex = componentsStartLine; lineIndex < lines.length; lineIndex++) {
|
|
20
26
|
const line = lines[lineIndex];
|
|
21
27
|
if (line === undefined) {
|
|
22
28
|
continue;
|
|
23
29
|
}
|
|
24
|
-
|
|
30
|
+
// Match level-1 headings for components (# ...)
|
|
31
|
+
const headerMatch = /^#\s+(\S.*)$/.exec(line);
|
|
25
32
|
if (headerMatch?.[1]) {
|
|
26
33
|
headerIndices.push({
|
|
27
34
|
line: lineIndex,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-content.js","sourceRoot":"","sources":["../../src/utils/parse-content.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,KAAK,EAAC,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"parse-content.js","sourceRoot":"","sources":["../../src/utils/parse-content.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,KAAK,EAAC,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAC,oBAAoB,EAAE,0BAA0B,EAAC,MAAM,qBAAqB,CAAC;AAErF,SAAS,WAAW,CAAC,IAAY;IAC7B,IAAI,GAAuB,CAAC;IAC5B,IAAI,IAAwB,CAAC;IAE7B,MAAM,QAAQ,GAAG,+BAA+B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE5D,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChB,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IAED,MAAM,SAAS,GAAG,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEzD,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjB,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED,OAAO,EAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,UAAkB,EAAE,SAAiB;IAC9D,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;IAE5B,sCAAsC;IACtC,MAAM,aAAa,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;IAEvD,KAAK,CAAC,QAAQ,GAAG,aAAa,CAAC;IAE/B,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,mBAAmB,GAAG,0BAA0B,CAAC,UAAU,CAAC,CAAC;IAEnE,MAAM,aAAa,GAAyC,EAAE,CAAC;IAE/D,qFAAqF;IACrF,KAAK,IAAI,SAAS,GAAG,mBAAmB,EAAE,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC;QAC9E,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;QAE9B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACrB,SAAS;QACb,CAAC;QAED,gDAAgD;QAChD,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE9C,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnB,aAAa,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;aAC/B,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,EAAc,EAAE;QACnE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;QAC1B,MAAM,GAAG,GAAG,aAAa,CAAC,WAAW,GAAG,CAAC,CAAC,EAAE,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC;QACjE,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QAElC,OAAO;YACH,EAAE,EAAE,MAAM,CAAC,KAAK;YAChB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,OAAO;YACP,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;SAClB,CAAC;IACN,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@taiga-ui/mcp",
|
|
3
|
-
"version": "0.1.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"description": "Model Context Protocol server providing Taiga UI documentation search and scaffolding tools.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mcp",
|
|
@@ -22,30 +22,35 @@
|
|
|
22
22
|
"url": "git+https://github.com/taiga-family/taiga-ui-mcp.git"
|
|
23
23
|
},
|
|
24
24
|
"license": "Apache-2.0",
|
|
25
|
+
"contributors": [
|
|
26
|
+
{
|
|
27
|
+
"name": "Vladimir Potekhin",
|
|
28
|
+
"email": "vladimir.potekh@gmail.com"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"name": "German Panov",
|
|
32
|
+
"email": "zidakbew@gmail.com"
|
|
33
|
+
}
|
|
34
|
+
],
|
|
25
35
|
"type": "module",
|
|
26
36
|
"main": "./dist/index.js",
|
|
27
37
|
"bin": {
|
|
28
38
|
"taiga-ui-mcp": "./dist/index.js"
|
|
29
39
|
},
|
|
30
40
|
"files": [
|
|
31
|
-
"dist
|
|
32
|
-
"README.md",
|
|
33
|
-
"LICENSE"
|
|
41
|
+
"dist/"
|
|
34
42
|
],
|
|
35
43
|
"scripts": {
|
|
36
|
-
"prepare": "husky",
|
|
37
|
-
"*** Workflow ***": "",
|
|
38
|
-
"start": "node dist/index.js",
|
|
39
|
-
"clean": "rm -rf dist",
|
|
40
44
|
"build": "npm run clean && tsc --incremental false && chmod 755 dist/index.js",
|
|
41
|
-
"
|
|
42
|
-
"lint": "eslint .",
|
|
45
|
+
"clean": "rm -rf dist",
|
|
43
46
|
"cspell": "cspell --relative --dot --gitignore .",
|
|
44
|
-
"
|
|
45
|
-
"
|
|
47
|
+
"lint": "eslint .",
|
|
48
|
+
"prepare": "husky",
|
|
46
49
|
"prepublishOnly": "npm run build",
|
|
50
|
+
"prettier": "prettier !package-lock.json . --ignore-path .gitignore",
|
|
47
51
|
"release": "npm publish --access public --tag latest",
|
|
48
|
-
"
|
|
52
|
+
"start": "node dist/index.js",
|
|
53
|
+
"typecheck": "tsc --noEmit --incremental false"
|
|
49
54
|
},
|
|
50
55
|
"commitlint": {
|
|
51
56
|
"extends": [
|
|
@@ -63,21 +68,16 @@
|
|
|
63
68
|
],
|
|
64
69
|
"prettier": "@taiga-ui/prettier-config",
|
|
65
70
|
"dependencies": {
|
|
66
|
-
"@modelcontextprotocol/sdk": "1.
|
|
71
|
+
"@modelcontextprotocol/sdk": "1.29.0",
|
|
67
72
|
"zod": "3.25.76"
|
|
68
73
|
},
|
|
69
74
|
"devDependencies": {
|
|
70
|
-
"@taiga-ui/configs": "0.
|
|
71
|
-
"@types/node": "24.
|
|
75
|
+
"@taiga-ui/configs": "0.446.0",
|
|
76
|
+
"@types/node": "24.10.11",
|
|
72
77
|
"husky": "9.1.7",
|
|
73
|
-
"lint-staged": "15.5.2",
|
|
74
78
|
"typescript": "5.9.3"
|
|
75
79
|
},
|
|
76
80
|
"engines": {
|
|
77
81
|
"node": ">=18.0.0"
|
|
78
|
-
}
|
|
79
|
-
"authors": [
|
|
80
|
-
"Vladimir Potekhin <vladimir.potekh@gmail.com>",
|
|
81
|
-
"German Panov <zidakbew@gmail.com>"
|
|
82
|
-
]
|
|
82
|
+
}
|
|
83
83
|
}
|