@taiga-ui/mcp 0.1.0-alpha.1 → 0.1.0-alpha.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,69 +1,123 @@
1
- # Taiga UI MCP Server
1
+ ## Taiga UI MCP Server
2
+
3
+ [![MCP Badge](https://lobehub.com/badge/mcp/taiga-family-taiga-ui-mcp?style=plastic)](https://lobehub.com/mcp/taiga-family-taiga-ui-mcp)
4
+ [![npm version](https://img.shields.io/npm/v/@taiga-ui/mcp.svg)](https://npmjs.com/package/@taiga-ui/mcp)
5
+
6
+ > 🚧 **Alpha Release**
7
+ > `@taiga-ui/mcp` is currently in **alpha**.
2
8
 
3
9
  > **🚀 The fastest way to integrate Taiga UI components into your AI workflow**
4
10
 
5
- A Model Context Protocol (MCP) server that provides AI assistants with comprehensive access to [Taiga UI](https://taiga-ui.dev) components. Seamlessly retrieve Taiga UI components implementations for your AI-powered development workflow.
11
+ A Model Context Protocol (MCP) server that provides AI assistants with comprehensive access to
12
+ [Taiga UI](https://taiga-ui.dev) components. Seamlessly retrieve Taiga UI components implementations for your AI-powered
13
+ development workflow.
14
+
15
+ ### Key Features
16
+
17
+ - **Docs + code snippets**. Full Taiga UI markdown plus ready Angular examples in one place.
18
+ - **Two MCP tools**. Discover with `get_list_components`, fetch examples via `get_component_example`.
19
+ - **Configurable & lightweight**. Swap source URL (stable/next) without local Angular install.
20
+
21
+ ### Requirements
6
22
 
7
- ## Integrate with Your Editor
23
+ - Node.js 18 or newer
24
+ - VS Code, Cursor, Windsurf, Claude Desktop, Goose or any other MCP client
8
25
 
9
- ### VS Code
26
+ ### Getting started
10
27
 
11
- To configure MCP in VS Code with GitHub Copilot, add the taiga-ui server to your project's `.vscode/mcp.json` configuration file:
28
+ First, install the Taiga UI MCP server with your client.
29
+
30
+ **Standard config** works in most of the tools:
12
31
 
13
32
  ```json
14
33
  {
15
- "mcpServers": {
16
- "taiga-ui": {
17
- "command": "npx",
18
- "args": [
19
- "@taiga-ui/mcp@latest",
20
- "--source-url=https://taiga-ui.dev/llms-full.txt" // or file from "/next" version, if you want
21
- ]
22
- }
34
+ "mcpServers": {
35
+ "taiga-ui": {
36
+ "command": "npx",
37
+ "args": [
38
+ "@taiga-ui/mcp@latest",
39
+ "--source-url=https://taiga-ui.dev/llms-full.txt" // or file from /next version, if you want
40
+ ]
23
41
  }
42
+ }
24
43
  }
25
44
  ```
26
45
 
27
- ## Provided Tools
46
+ ### Tools
28
47
 
29
- 1. `get_list_components { query?: string }`
48
+ <details>
49
+ <summary><b>Core automation</b></summary>
30
50
 
31
- - Lists component / section identifiers (with fuzzy substring filtering) along with basic metadata (category, package, type).
32
- - Input: optional `query` string to filter IDs (case-insensitive substring).
33
- - Output: `{ items: [...], total, query }` strictly structured JSON.
51
+ 1. `get_list_components { query?: string }`
52
+ - Lists component / section identifiers (with fuzzy substring filtering) along with basic metadata (category,
53
+ package, type).
54
+ - Input: optional `query` string to filter IDs (case-insensitive substring).
55
+ - Output: strictly structured JSON containing `items`, `total`.
34
56
 
57
+ ```ts
58
+ get_list_components();
35
59
  ```
60
+
61
+ ```json
36
62
  {
37
- "items": [
38
- { "id": "components/Alert", "name": "Alert", "category": "components", "package": "CORE", "type": "component" }
39
- ],
40
- "total": 1,
41
- "query": null
63
+ "items": [
64
+ {
65
+ "id": "components/Alert",
66
+ "name": "Alert",
67
+ "category": "components",
68
+ "package": "CORE",
69
+ "type": "component"
70
+ },
71
+ {
72
+ "id": "components/Button",
73
+ "package": "CORE",
74
+ "type": "component",
75
+ "name": "Button",
76
+ "category": "components"
77
+ },
78
+ ...
79
+ ],
42
80
  }
43
81
  ```
44
82
 
45
83
  2. `get_component_example { "names": ["...", "..."] }`
84
+ - Returns full markdown content for each resolved section (entire component documentation).
85
+ - Fuzzy name resolution: exact match, path segment, suffix, substring, and `Tui*` variants.
86
+ - Input: `{ names: string[] }` (each name length ≥ 2).
87
+ - Output: `results` array with objects: `query`, `id` (if resolved), `package`, `type`, `suggestions` (only when
88
+ unresolved), `content` (array of code blocks, if examples exist). Top-level also includes `matched` (count of
89
+ resolved names).
46
90
 
47
- - Returns the full markdown content of each resolved section (entire component documentation). Applies fuzzy name resolution (variants: exact, segment, suffix, substring with Tui\* variants).
48
- - Input: `{ names: string[] }` (each >= 2 chars).
49
- - Output: per name object with `id` (present only if resolved), `package`, `type`, `suggestions` (only when unresolved), and `content` (array of code strings when example blocks exist; omitted otherwise). Top-level also includes `matched` (count of resolved names).
50
-
91
+ ```ts
92
+ get_component_example({names: ['Alert']});
51
93
  ```
94
+
95
+ ```json
52
96
  {
53
- "results": [
54
- {
55
- "query": "Alert",
56
- "id": "components/Alert",
57
- "package": "CORE",
58
- "type": "component",
59
- "content": ["# components/Alert\n- **Package**: ... (full section markdown here)"]
60
- }
61
- ],
62
- "matched": 1
97
+ "results": [
98
+ {
99
+ "query": "Alert",
100
+ "id": "components/Alert",
101
+ "package": "CORE",
102
+ "type": "component",
103
+ "content": ["# components/Alert\n- **Package**: ... (full component API, usage examples, ...)"]
104
+ }
105
+ ],
106
+ "matched": 1
63
107
  }
64
108
  ```
65
109
 
66
- ## Authors
110
+ > Tip: Combine `get_list_components` to discover IDs and then fetch full implementation snippets with
111
+ > `get_component_example`.
112
+
113
+ </details>
114
+
115
+ ### Maintained
116
+
117
+ Taiga UI MCP is a part of [Taiga UI](https://github.com/taiga-family/taiga-ui) libraries family which is backed and used
118
+ by a large enterprise. This means you can rely on timely support and continuous development.
119
+
120
+ ### Authors
67
121
 
68
122
  <table>
69
123
  <tr>
package/dist/index.js CHANGED
@@ -5,3 +5,4 @@ start().catch((err) => {
5
5
  logError('Unhandled startup error', err);
6
6
  process.exit(1);
7
7
  });
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAC,KAAK,EAAC,MAAM,oBAAoB,CAAC;AACzC,OAAO,EAAC,QAAQ,EAAC,MAAM,mBAAmB,CAAC;AAE3C,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC3B,QAAQ,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;IAEzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC"}
@@ -1 +1,2 @@
1
1
  export {};
2
+ //# sourceMappingURL=doc-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc-types.js","sourceRoot":"","sources":["../../src/schemas/doc-types.ts"],"names":[],"mappings":""}
@@ -1,31 +1,33 @@
1
- import { state } from './server.js';
2
1
  import { parseContent } from '../utils/parse-content.js';
2
+ import { state } from './server.js';
3
3
  // 6-hour refresh window
4
4
  const REFRESH_INTERVAL_MS = 6 * 60 * 60 * 1000;
5
5
  export async function fetchSource() {
6
6
  const argProvidedUrl = process.argv
7
7
  .find((arg) => arg.startsWith('--source-url='))
8
8
  ?.split('=')[1];
9
- const sourceUrl = argProvidedUrl || process.env.SOURCE_URL;
9
+ const sourceUrl = argProvidedUrl ?? process.env.SOURCE_URL;
10
10
  if (!sourceUrl) {
11
11
  throw new Error('Source URL not provided. Set SOURCE_URL or pass --source-url=...');
12
12
  }
13
13
  const response = await fetch(sourceUrl).catch((error) => {
14
- throw new Error(`Network error fetching documentation source: ${error?.message || error}`);
14
+ throw new Error(`Network error fetching documentation source: ${error instanceof Error ? error.message : String(error)}`);
15
15
  });
16
- if (!response.ok)
16
+ if (!response.ok) {
17
17
  throw new Error(`Failed to fetch documentation (HTTP ${response.status} ${response.statusText}) from ${sourceUrl}`);
18
+ }
18
19
  const content = await response.text();
19
- if (!content.trim())
20
+ if (!content.trim()) {
20
21
  throw new Error(`Fetched documentation from ${sourceUrl} is empty.`);
22
+ }
21
23
  return { url: sourceUrl, content };
22
24
  }
23
25
  export async function ensureSourceLoaded() {
24
- const isContentStale = !state.lastLoadedAt ||
25
- Date.now() - state.lastLoadedAt > REFRESH_INTERVAL_MS;
26
- if (!(state.sections.length > 0) || isContentStale) {
26
+ const isContentStale = !state.lastLoadedAt || Date.now() - state.lastLoadedAt > REFRESH_INTERVAL_MS;
27
+ if (!state.sections.length || isContentStale) {
27
28
  const { url, content } = await fetchSource();
28
29
  parseContent(content, url);
29
30
  state.lastLoadedAt = Date.now();
30
31
  }
31
32
  }
33
+ //# sourceMappingURL=fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/server/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAC,KAAK,EAAC,MAAM,aAAa,CAAC;AAElC,wBAAwB;AACxB,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,WAAW;IAC7B,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI;SAC9B,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;QAC/C,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpB,MAAM,SAAS,GAAG,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IAE3D,IAAI,CAAC,SAAS,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACX,kEAAkE,CACrE,CAAC;IACN,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QAC7D,MAAM,IAAI,KAAK,CACX,gDAAgD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC3G,CAAC;IACN,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACX,uCAAuC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,UAAU,SAAS,EAAE,CACrG,CAAC;IACN,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEtC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,8BAA8B,SAAS,YAAY,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,EAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAC,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACpC,MAAM,cAAc,GAChB,CAAC,KAAK,CAAC,YAAY,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,YAAY,GAAG,mBAAmB,CAAC;IAEjF,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,IAAI,cAAc,EAAE,CAAC;QAC3C,MAAM,EAAC,GAAG,EAAE,OAAO,EAAC,GAAG,MAAM,WAAW,EAAE,CAAC;QAE3C,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAE3B,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACpC,CAAC;AACL,CAAC"}
@@ -1,8 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
3
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
- import { ensureSourceLoaded } from './fetch.js';
4
+ import packageJson from '../../package.json' with { type: 'json' };
5
5
  import { registerAllTools } from '../tools/index.js';
6
+ import { logError, logInfo } from '../utils/logger.js';
7
+ import { ensureSourceLoaded } from './fetch.js';
6
8
  export const state = {
7
9
  sections: [],
8
10
  sourceUrl: undefined,
@@ -10,7 +12,7 @@ export const state = {
10
12
  };
11
13
  const server = new McpServer({
12
14
  name: 'taiga-ui-mcp',
13
- version: '0.1.0-alpha.1',
15
+ version: packageJson.version,
14
16
  });
15
17
  registerAllTools(server);
16
18
  export async function start() {
@@ -18,9 +20,10 @@ export async function start() {
18
20
  await ensureSourceLoaded();
19
21
  }
20
22
  catch (error) {
21
- console.error('Initial source load failed:', error);
23
+ logError('Initial source load failed', error);
22
24
  }
23
25
  const transport = new StdioServerTransport();
24
26
  await server.connect(transport);
25
- console.error(`Angular Taiga UI MCP Server running. Fetched source components: ${state.sections.length}`);
27
+ logInfo(`Angular Taiga UI MCP Server running. Fetched source components: ${state.sections.length}`);
26
28
  }
29
+ //# sourceMappingURL=server.js.map
@@ -0,0 +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;AAQ9C,MAAM,CAAC,MAAM,KAAK,GAAe;IAC7B,QAAQ,EAAE,EAAE;IACZ,SAAS,EAAE,SAAS;IACpB,YAAY,EAAE,SAAS;CAC1B,CAAC;AAEF,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IACzB,IAAI,EAAE,cAAc;IACpB,OAAO,EAAE,WAAW,CAAC,OAAO;CAC/B,CAAC,CAAC;AAEH,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"}
@@ -18,14 +18,12 @@ export function registerGetComponentExampleTool(server) {
18
18
  matched: z.number(),
19
19
  },
20
20
  }, async ({ names }) => {
21
- if (!names || !names.length) {
21
+ if (!names.length) {
22
22
  const output = {
23
23
  error: 'Provide at least one name in names array.',
24
24
  };
25
25
  return {
26
- content: [
27
- { type: 'text', text: JSON.stringify(output, null, 2) },
28
- ],
26
+ content: [{ type: 'text', text: JSON.stringify(output, null, 2) }],
29
27
  structuredContent: output,
30
28
  };
31
29
  }
@@ -33,10 +31,9 @@ export function registerGetComponentExampleTool(server) {
33
31
  const { results, matches } = buildQueryResults(names);
34
32
  const output = { results, matched: matches };
35
33
  return {
36
- content: [
37
- { type: 'text', text: JSON.stringify(output, null, 2) },
38
- ],
34
+ content: [{ type: 'text', text: JSON.stringify(output, null, 2) }],
39
35
  structuredContent: output,
40
36
  };
41
37
  });
42
38
  }
39
+ //# sourceMappingURL=get-component-example.js.map
@@ -0,0 +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;gBACX,KAAK,EAAE,2CAA2C;aACrD,CAAC;YAEF,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,16 +14,11 @@ 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, normalizedQuery } = constructComponentsList(query);
23
20
  const output = {
24
- items,
25
- total: items.length,
26
- query: normalizedQuery,
21
+ items: constructComponentsList(query),
27
22
  };
28
23
  return {
29
24
  content: [
@@ -36,3 +31,4 @@ export function registerGetListComponentsTool(server) {
36
31
  };
37
32
  });
38
33
  }
34
+ //# sourceMappingURL=get-list-components.js.map
@@ -0,0 +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,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;YACX,KAAK,EAAE,uBAAuB,CAAC,KAAK,CAAC;SACxC,CAAC;QAEF,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"}
@@ -1,6 +1,7 @@
1
- import { registerGetListComponentsTool } from './get-list-components.js';
2
1
  import { registerGetComponentExampleTool } from './get-component-example.js';
2
+ import { registerGetListComponentsTool } from './get-list-components.js';
3
3
  export function registerAllTools(server) {
4
4
  registerGetListComponentsTool(server);
5
5
  registerGetComponentExampleTool(server);
6
6
  }
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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;AAEvE,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAC9C,6BAA6B,CAAC,MAAM,CAAC,CAAC;IACtC,+BAA+B,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC"}
@@ -9,9 +9,7 @@ export function findSection(name) {
9
9
  const camelCase = pascalCase
10
10
  ? pascalCase.charAt(0).toLowerCase() + pascalCase.slice(1)
11
11
  : '';
12
- const tuiVariant = pascalCase.startsWith('Tui')
13
- ? pascalCase
14
- : 'Tui' + pascalCase;
12
+ const tuiVariant = pascalCase.startsWith('Tui') ? pascalCase : `Tui${pascalCase}`;
15
13
  const variants = [
16
14
  name.toLowerCase(),
17
15
  pascalCase,
@@ -22,26 +20,29 @@ export function findSection(name) {
22
20
  // Exact match
23
21
  for (const variant of variants) {
24
22
  const exactMatch = state.sections.find((section) => section.id.toLowerCase() === variant.toLowerCase());
25
- if (exactMatch)
23
+ if (exactMatch) {
26
24
  return exactMatch;
25
+ }
27
26
  }
28
27
  // Last path segment match
29
28
  for (const variant of variants) {
30
- const segmentMatch = state.sections.find((section) => section.id.split('/').pop()?.toLowerCase() ===
31
- variant.toLowerCase());
32
- if (segmentMatch)
29
+ const segmentMatch = state.sections.find((section) => section.id.split('/').pop()?.toLowerCase() === variant.toLowerCase());
30
+ if (segmentMatch) {
33
31
  return segmentMatch;
32
+ }
34
33
  }
35
34
  // Ends-with match
36
35
  for (const variant of variants) {
37
- const endsWithMatch = state.sections.find((section) => section.id.toLowerCase().endsWith('/' + variant.toLowerCase()));
38
- if (endsWithMatch)
36
+ const endsWithMatch = state.sections.find((section) => section.id.toLowerCase().endsWith(`/${variant.toLowerCase()}`));
37
+ if (endsWithMatch) {
39
38
  return endsWithMatch;
39
+ }
40
40
  }
41
41
  // Substring fallback
42
42
  const substringMatch = state.sections.find((section) => section.id.toLowerCase().includes(name.toLowerCase()));
43
- if (substringMatch)
43
+ if (substringMatch) {
44
44
  return substringMatch;
45
+ }
45
46
  return undefined;
46
47
  }
47
48
  export function suggestSections(query) {
@@ -62,3 +63,4 @@ export function suggestSections(query) {
62
63
  .sort((a, b) => a.score - b.score)
63
64
  .map((result) => result.id);
64
65
  }
66
+ //# sourceMappingURL=find-section.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-section.js","sourceRoot":"","sources":["../../src/utils/find-section.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,12 @@
1
1
  import { state } from '../server/server.js';
2
- export function constructComponentsList(query) {
3
- const normalizedQuery = query ? query.toLowerCase() : null;
4
- const items = state.sections
5
- .filter((section) => !normalizedQuery ||
6
- section.id.toLowerCase().includes(normalizedQuery))
2
+ export function constructComponentsList(query = '') {
3
+ const normalizedQuery = query.toLowerCase().replace(/^tui/, '');
4
+ return state.sections
5
+ .filter((section) => !normalizedQuery || section.id.toLowerCase().includes(normalizedQuery))
7
6
  .map((section) => {
8
7
  const idParts = section.id.split('/');
9
- const name = idParts[idParts.length - 1] || section.id;
10
- const category = idParts[0] || '';
8
+ const name = idParts[idParts.length - 1] ?? section.id;
9
+ const category = idParts[0] ?? '';
11
10
  return {
12
11
  id: section.id,
13
12
  name,
@@ -16,5 +15,5 @@ export function constructComponentsList(query) {
16
15
  type: section.kind ?? null,
17
16
  };
18
17
  });
19
- return { items, normalizedQuery };
20
18
  }
19
+ //# sourceMappingURL=list-components.js.map
@@ -0,0 +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;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,7 +1,10 @@
1
+ // In STDIO-based MCP servers can use only stderr for logging
2
+ // https://modelcontextprotocol.io/docs/develop/build-server#logging-in-mcp-servers
1
3
  export function logError(message, err) {
2
- const stack = err instanceof Error ? err.stack || err.message : String(err);
4
+ const stack = err instanceof Error ? (err.stack ?? err.message) : String(err);
3
5
  console.error(`[ERROR] ${message}: ${stack}`);
4
6
  }
5
7
  export function logInfo(message) {
6
- console.error(`[INFO] ${message}`);
8
+ console.warn(`[INFO] ${message}`);
7
9
  }
10
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,mFAAmF;AAEnF,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,GAAY;IAClD,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAE9E,OAAO,CAAC,KAAK,CAAC,WAAW,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe;IACnC,OAAO,CAAC,IAAI,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;AACtC,CAAC"}
@@ -3,11 +3,13 @@ function extractMeta(text) {
3
3
  let pkg;
4
4
  let kind;
5
5
  const pkgMatch = /\*\*Package\*\*:\s*`([^`]+)`/i.exec(text);
6
- if (pkgMatch)
6
+ if (pkgMatch?.[1]) {
7
7
  pkg = pkgMatch[1];
8
+ }
8
9
  const typeMatch = /\*\*Type\*\*:\s*([^\n]+)/i.exec(text);
9
- if (typeMatch)
10
+ if (typeMatch?.[1]) {
10
11
  kind = typeMatch[1].trim();
12
+ }
11
13
  return { package: pkg, kind };
12
14
  }
13
15
  export function parseContent(rawContent, sourceUrl) {
@@ -15,12 +17,17 @@ export function parseContent(rawContent, sourceUrl) {
15
17
  const lines = rawContent.split(/\r?\n/);
16
18
  const headerIndices = [];
17
19
  for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
18
- const headerMatch = /^#\s+(.+)$/.exec(lines[lineIndex]);
19
- if (headerMatch)
20
+ const line = lines[lineIndex];
21
+ if (line === undefined) {
22
+ continue;
23
+ }
24
+ const headerMatch = /^#\s+(.+)$/.exec(line);
25
+ if (headerMatch?.[1]) {
20
26
  headerIndices.push({
21
27
  line: lineIndex,
22
28
  title: headerMatch[1].trim(),
23
29
  });
30
+ }
24
31
  }
25
32
  state.sections = headerIndices.map((header, headerIndex) => {
26
33
  const start = header.line;
@@ -36,3 +43,4 @@ export function parseContent(rawContent, sourceUrl) {
36
43
  };
37
44
  });
38
45
  }
46
+ //# sourceMappingURL=parse-content.js.map
@@ -0,0 +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;AAE1C,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,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,aAAa,GAAyC,EAAE,CAAC;IAE/D,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC;QAC5D,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;QAE9B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACrB,SAAS;QACb,CAAC;QAED,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE5C,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"}
@@ -2,8 +2,9 @@ import { findSection, suggestSections } from './find-section.js';
2
2
  export function extractContentSnippets(section) {
3
3
  const text = section.content || '';
4
4
  const trimmed = text.trim();
5
- if (!trimmed)
5
+ if (!trimmed) {
6
6
  return [];
7
+ }
7
8
  const cleaned = trimmed
8
9
  .split(/\r?\n/)
9
10
  .map((line) => line.replace(/^#{1,6}\s*/, ''))
@@ -27,13 +28,15 @@ export function buildQueryResults(names) {
27
28
  const foundResult = {
28
29
  query: queryName,
29
30
  id: section.id,
30
- package: section.package || null,
31
- type: section.kind || null,
31
+ package: section.package ?? null,
32
+ type: section.kind ?? null,
32
33
  };
33
- if (snippets.length)
34
+ if (snippets.length) {
34
35
  foundResult.content = snippets;
36
+ }
35
37
  results.push(foundResult);
36
38
  }
37
39
  const matches = results.filter((result) => !!result.id).length;
38
40
  return { results, matches };
39
41
  }
42
+ //# sourceMappingURL=query-results.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-results.js","sourceRoot":"","sources":["../../src/utils/query-results.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,WAAW,EAAE,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAE/D,MAAM,UAAU,sBAAsB,CAAC,OAAmB;IACtD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAE5B,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,OAAO;SAClB,KAAK,CAAC,OAAO,CAAC;SACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;SAC7C,IAAI,CAAC,IAAI,CAAC;SACV,IAAI,EAAE,CAAC;IAEZ,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAe;IAI7C,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;QAEvC,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,MAAM,QAAQ,GAAgB;gBAC1B,KAAK,EAAE,SAAS;gBAChB,WAAW,EAAE,eAAe,CAAC,SAAS,CAAC;aAC1C,CAAC;YAEF,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEvB,SAAS;QACb,CAAC;QAED,MAAM,QAAQ,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAEjD,MAAM,WAAW,GAAgB;YAC7B,KAAK,EAAE,SAAS;YAChB,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI;YAChC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI;SAC7B,CAAC;QAEF,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YAClB,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;QACnC,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;IAE/D,OAAO,EAAC,OAAO,EAAE,OAAO,EAAC,CAAC;AAC9B,CAAC"}
package/package.json CHANGED
@@ -1,17 +1,7 @@
1
1
  {
2
2
  "name": "@taiga-ui/mcp",
3
- "version": "0.1.0-alpha.1",
3
+ "version": "0.1.0-alpha.11",
4
4
  "description": "Model Context Protocol server providing Taiga UI documentation search and scaffolding tools.",
5
- "type": "module",
6
- "main": "./dist/index.js",
7
- "bin": {
8
- "taiga-ui-mcp": "./dist/index.js"
9
- },
10
- "files": [
11
- "dist/**/*",
12
- "README.md",
13
- "LICENSE"
14
- ],
15
5
  "keywords": [
16
6
  "mcp",
17
7
  "model-context-protocol",
@@ -23,7 +13,6 @@
23
13
  "claude",
24
14
  "copilot"
25
15
  ],
26
- "license": "Apache-2.0",
27
16
  "homepage": "https://github.com/taiga-family/taiga-ui-mcp#README",
28
17
  "bugs": {
29
18
  "url": "https://github.com/taiga-family/taiga-ui-mcp/issues"
@@ -32,28 +21,59 @@
32
21
  "type": "git",
33
22
  "url": "git+https://github.com/taiga-family/taiga-ui-mcp.git"
34
23
  },
35
- "authors": [
36
- "Vladimir Potekhin <vladimir.potekh@gmail.com>",
37
- "German Panov <zidakbew@gmail.com>"
24
+ "license": "Apache-2.0",
25
+ "type": "module",
26
+ "main": "./dist/index.js",
27
+ "bin": {
28
+ "taiga-ui-mcp": "./dist/index.js"
29
+ },
30
+ "files": [
31
+ "dist/"
38
32
  ],
39
33
  "scripts": {
40
- "start": "node dist/index.js",
34
+ "build": "npm run clean && tsc --incremental false && chmod 755 dist/index.js",
41
35
  "clean": "rm -rf dist",
42
- "build": "npm run clean && tsc && chmod +x dist/index.js",
36
+ "cspell": "cspell --relative --dot --gitignore .",
37
+ "lint": "eslint .",
38
+ "prepare": "husky",
43
39
  "prepublishOnly": "npm run build",
44
- "release": "npm run build && npm publish --access public --tag alpha"
40
+ "prettier": "prettier !package-lock.json . --ignore-path .gitignore",
41
+ "release": "npm publish --access public --tag latest",
42
+ "postrelease": "npm dist-tag add @taiga-ui/mcp@$(node -p 'require(`./package.json`).version') alpha",
43
+ "start": "node dist/index.js",
44
+ "typecheck": "tsc --noEmit --incremental false"
45
45
  },
46
- "engines": {
47
- "node": ">=18.0.0"
46
+ "commitlint": {
47
+ "extends": [
48
+ "@taiga-ui/commitlint-config"
49
+ ]
48
50
  },
51
+ "lint-staged": {
52
+ "*.{js,ts,html,md,less,json,svg,yml}": [
53
+ "npm run lint -- --fix",
54
+ "prettier --write"
55
+ ]
56
+ },
57
+ "browserslist": [
58
+ "extends @taiga-ui/browserslist-config"
59
+ ],
60
+ "prettier": "@taiga-ui/prettier-config",
49
61
  "dependencies": {
50
- "@modelcontextprotocol/sdk": "^1.20.0",
51
- "zod": "^3.25.76"
62
+ "@modelcontextprotocol/sdk": "1.23.0",
63
+ "zod": "3.25.76"
52
64
  },
53
65
  "devDependencies": {
54
- "@taiga-ui/release-it-config": "0.344.0",
55
- "@taiga-ui/auto-changelog-config": "0.344.0",
56
- "@types/node": "^24.7.2",
57
- "typescript": "^5.9.3"
58
- }
66
+ "@taiga-ui/configs": "0.365.0",
67
+ "@types/node": "24.10.1",
68
+ "husky": "9.1.7",
69
+ "lint-staged": "15.5.2",
70
+ "typescript": "5.9.3"
71
+ },
72
+ "engines": {
73
+ "node": ">=18.0.0"
74
+ },
75
+ "authors": [
76
+ "Vladimir Potekhin <vladimir.potekh@gmail.com>",
77
+ "German Panov <zidakbew@gmail.com>"
78
+ ]
59
79
  }