@maxisoft/instantcms-mcp 1.2.3

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.
Files changed (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +308 -0
  3. package/dist/__tests__/artifact-tool.test.js +196 -0
  4. package/dist/__tests__/db-tool.test.js +152 -0
  5. package/dist/__tests__/define-tool.test.js +106 -0
  6. package/dist/__tests__/find-tool.test.js +185 -0
  7. package/dist/__tests__/get-component-api.test.js +144 -0
  8. package/dist/__tests__/hardening.test.js +73 -0
  9. package/dist/__tests__/hooks-tool.test.js +173 -0
  10. package/dist/__tests__/mcp-integration-extra.test.js +166 -0
  11. package/dist/__tests__/mcp-integration.test.js +53 -0
  12. package/dist/__tests__/pagination.test.js +114 -0
  13. package/dist/__tests__/performance-baseline.test.js +56 -0
  14. package/dist/__tests__/project-patch.test.js +144 -0
  15. package/dist/__tests__/project-source.test.js +44 -0
  16. package/dist/__tests__/project-workflows-extra.test.js +165 -0
  17. package/dist/__tests__/project-workflows.test.js +51 -0
  18. package/dist/__tests__/scaffold-addon-roundtrip.test.js +287 -0
  19. package/dist/__tests__/serialization.test.js +170 -0
  20. package/dist/__tests__/source-knowledge-parsers.test.js +42 -0
  21. package/dist/__tests__/template-development.test.js +78 -0
  22. package/dist/__tests__/template-productivity.test.js +87 -0
  23. package/dist/__tests__/tools.test.js +2143 -0
  24. package/dist/data/components.js +2818 -0
  25. package/dist/data/controllers-map.js +7571 -0
  26. package/dist/data/core-api.js +9356 -0
  27. package/dist/data/database-schema.js +4555 -0
  28. package/dist/data/events-map.js +1339 -0
  29. package/dist/data/fields-map.js +3692 -0
  30. package/dist/data/hooks.js +2257 -0
  31. package/dist/data/js-api.js +123 -0
  32. package/dist/data/libs-api.js +264 -0
  33. package/dist/data/routes-map.js +203 -0
  34. package/dist/data/schemas-validation.js +255 -0
  35. package/dist/data/schemas.js +1404 -0
  36. package/dist/data/traits-map.js +1004 -0
  37. package/dist/data/version-profiles.js +41 -0
  38. package/dist/data/widgets-map.js +131 -0
  39. package/dist/data/wysiwyg-map.js +486 -0
  40. package/dist/generated/components-source.js +14748 -0
  41. package/dist/generated/hooks-source.js +3399 -0
  42. package/dist/generated/knowledge-meta.js +101 -0
  43. package/dist/index.js +13 -0
  44. package/dist/registry/database-tools.js +112 -0
  45. package/dist/registry/extension-tools.js +473 -0
  46. package/dist/registry/generator-tools.js +506 -0
  47. package/dist/registry/knowledge-tools.js +441 -0
  48. package/dist/registry/language-tools.js +99 -0
  49. package/dist/registry/meta-tools.js +152 -0
  50. package/dist/registry/project-tools.js +48 -0
  51. package/dist/registry/resources.js +98 -0
  52. package/dist/registry/source-tools.js +211 -0
  53. package/dist/registry/template-development-tools.js +79 -0
  54. package/dist/server.js +32 -0
  55. package/dist/tools/addon-tool.js +1437 -0
  56. package/dist/tools/admin-partial-tool.js +498 -0
  57. package/dist/tools/api-tool.js +294 -0
  58. package/dist/tools/artifact-tool.js +95 -0
  59. package/dist/tools/cache-tool.js +360 -0
  60. package/dist/tools/component-tool.js +415 -0
  61. package/dist/tools/controllers-tool.js +125 -0
  62. package/dist/tools/cron-tool.js +197 -0
  63. package/dist/tools/crud-tool.js +659 -0
  64. package/dist/tools/db-tool.js +198 -0
  65. package/dist/tools/email-tool.js +222 -0
  66. package/dist/tools/external-api-tool.js +596 -0
  67. package/dist/tools/filter-tool.js +341 -0
  68. package/dist/tools/form-tool.js +275 -0
  69. package/dist/tools/grid-tool.js +189 -0
  70. package/dist/tools/hooks-tool.js +104 -0
  71. package/dist/tools/import-export-tool.js +548 -0
  72. package/dist/tools/lang-tool.js +251 -0
  73. package/dist/tools/layout-override-tool.js +125 -0
  74. package/dist/tools/layout-tool.js +548 -0
  75. package/dist/tools/maria-tool.js +127 -0
  76. package/dist/tools/mariadb.js +201 -0
  77. package/dist/tools/migration-tool.js +329 -0
  78. package/dist/tools/oauth-tool.js +520 -0
  79. package/dist/tools/parser/components-parser.js +76 -0
  80. package/dist/tools/parser/controllers-parser.js +313 -0
  81. package/dist/tools/parser/core-parser.js +294 -0
  82. package/dist/tools/parser/coverage-generator.js +424 -0
  83. package/dist/tools/parser/events-parser.js +127 -0
  84. package/dist/tools/parser/fields-parser.js +382 -0
  85. package/dist/tools/parser/hooks-parser.js +106 -0
  86. package/dist/tools/parser/sql-parser.js +197 -0
  87. package/dist/tools/parser/traits-parser.js +161 -0
  88. package/dist/tools/parser/widgets-parser.js +150 -0
  89. package/dist/tools/permission-tool.js +348 -0
  90. package/dist/tools/project-patch-tool.js +73 -0
  91. package/dist/tools/project-source-tool.js +188 -0
  92. package/dist/tools/project-workflow-tool.js +186 -0
  93. package/dist/tools/requirement-tool.js +212 -0
  94. package/dist/tools/scaffold-tool.js +815 -0
  95. package/dist/tools/seo-tool.js +412 -0
  96. package/dist/tools/source-tool.js +155 -0
  97. package/dist/tools/template-development-tool.js +271 -0
  98. package/dist/tools/template-overrides-tool.js +294 -0
  99. package/dist/tools/template-productivity-tool.js +319 -0
  100. package/dist/tools/template-tool.js +665 -0
  101. package/dist/tools/test-tool.js +183 -0
  102. package/dist/tools/webhook-tool.js +427 -0
  103. package/dist/tools/widget-tool.js +331 -0
  104. package/dist/tools/wysiwyg-tool.js +137 -0
  105. package/dist/types/scaffold.js +68 -0
  106. package/dist/utils/define-tool.js +37 -0
  107. package/dist/utils/find-tool.js +97 -0
  108. package/dist/utils/mcp-result.js +18 -0
  109. package/dist/utils/pagination.js +27 -0
  110. package/dist/utils/serialization.js +27 -0
  111. package/package.json +94 -0
@@ -0,0 +1,441 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerKnowledgeTools = registerKnowledgeTools;
4
+ const zod_1 = require("zod");
5
+ const hooks_tool_js_1 = require("../tools/hooks-tool.js");
6
+ const addon_tool_js_1 = require("../tools/addon-tool.js");
7
+ const scaffold_tool_js_1 = require("../tools/scaffold-tool.js");
8
+ const layout_tool_js_1 = require("../tools/layout-tool.js");
9
+ const db_tool_js_1 = require("../tools/db-tool.js");
10
+ const controllers_tool_js_1 = require("../tools/controllers-tool.js");
11
+ const hooks_js_1 = require("../data/hooks.js");
12
+ const schemas_js_1 = require("../data/schemas.js");
13
+ const mcp_result_js_1 = require("../utils/mcp-result.js");
14
+ function registerKnowledgeTools(server) {
15
+ // ── 3. Список хуков ──────────────────────────────────────────────────────
16
+ server.tool('list_hooks', 'Список всех доступных хуков InstantCMS с краткими описаниями. Поддерживает фильтрацию по категории и типу', {
17
+ category: zod_1.z
18
+ .string()
19
+ .optional()
20
+ .describe(`Фильтр по категории. Доступные: ${hooks_js_1.hookCategories.join(', ')}`),
21
+ type: zod_1.z
22
+ .enum(['filter', 'action'])
23
+ .optional()
24
+ .describe('Тип хука: filter (изменяет данные) или action (реагирует на событие)'),
25
+ limit: zod_1.z.number().int().min(1).max(200).optional(),
26
+ cursor: zod_1.z.string().optional(),
27
+ }, async ({ category, type, limit, cursor }) => {
28
+ const result = (0, hooks_tool_js_1.listHooks)(category, type, { limit, cursor });
29
+ return (0, mcp_result_js_1.successResult)(result);
30
+ });
31
+ // ── 4. Детали хука ───────────────────────────────────────────────────────
32
+ server.tool('get_hook_details', 'Подробная информация о конкретном хуке: параметры, возвращаемый тип, пример реализации, как зарегистрировать в manifest.xml', {
33
+ hook_name: zod_1.z
34
+ .string()
35
+ .describe('Имя хука. Пример: content_after_add_approve, user_registered, html_filter'),
36
+ }, async ({ hook_name }) => {
37
+ const result = (0, hooks_tool_js_1.getHookDetails)(hook_name);
38
+ return {
39
+ content: [
40
+ {
41
+ type: 'text',
42
+ text: JSON.stringify(result, null, 2),
43
+ },
44
+ ],
45
+ };
46
+ });
47
+ // ── 5. Поиск хуков ───────────────────────────────────────────────────────
48
+ server.tool('search_hooks', 'Полнотекстовый поиск хуков по имени, описанию, категории или параметрам', {
49
+ query: zod_1.z
50
+ .string()
51
+ .describe("Поисковый запрос. Пример: 'после добавления материала', 'profile', 'email'"),
52
+ }, async ({ query }) => {
53
+ const result = (0, hooks_tool_js_1.searchHooks)(query);
54
+ return {
55
+ content: [
56
+ {
57
+ type: 'text',
58
+ text: JSON.stringify(result, null, 2),
59
+ },
60
+ ],
61
+ };
62
+ });
63
+ // ── 6. API компонента ────────────────────────────────────────────────────
64
+ server.tool('get_component_api', 'API конкретного класса/компонента InstantCMS: методы, сигнатуры, описания, примеры вызовов', {
65
+ component_name: zod_1.z
66
+ .string()
67
+ .describe('Имя компонента или класса. Пример: cmsModel, cmsTemplate, cmsRequest, cmsCache, cmsEventsManager'),
68
+ }, async ({ component_name }) => {
69
+ const result = (0, addon_tool_js_1.getComponentApi)(component_name);
70
+ return {
71
+ content: [
72
+ {
73
+ type: 'text',
74
+ text: JSON.stringify(result, null, 2),
75
+ },
76
+ ],
77
+ };
78
+ });
79
+ // ── 7. Список компонентов ────────────────────────────────────────────────
80
+ server.tool('list_components', 'Список всех документированных компонентов и классов InstantCMS с кратким описанием и способом доступа', { limit: zod_1.z.number().int().min(1).max(200).optional(), cursor: zod_1.z.string().optional() }, async ({ limit, cursor }) => {
81
+ const result = (0, addon_tool_js_1.listComponents)({ limit, cursor });
82
+ return (0, mcp_result_js_1.successResult)(result);
83
+ });
84
+ // ── 8. Валидация дополнения ──────────────────────────────────────────────
85
+ server.tool('validate_addon', 'Валидация структуры дополнения InstantCMS. Проверяет наличие обязательных файлов, правильность классов, соглашения об именовании', {
86
+ files: zod_1.z
87
+ .record(zod_1.z.string().min(1).max(500), zod_1.z.string().max(2_000_000))
88
+ .refine(files => Object.keys(files).length <= 500, 'Не более 500 файлов')
89
+ .describe("Map файлов дополнения: {путь_к_файлу: содержимое}. Пример: {'frontend.php': '<?php class myaddon...'}"),
90
+ }, async ({ files }) => {
91
+ const result = (0, addon_tool_js_1.validateAddon)(files);
92
+ return {
93
+ content: [
94
+ {
95
+ type: 'text',
96
+ text: JSON.stringify(result, null, 2),
97
+ },
98
+ ],
99
+ };
100
+ });
101
+ // ── 9. Типы полей форм ───────────────────────────────────────────────────
102
+ server.tool('get_field_types', 'Информация о типах полей для форм InstantCMS (fieldString, fieldList, fieldImage и др.) с примерами использования', {
103
+ field_type: zod_1.z
104
+ .string()
105
+ .optional()
106
+ .describe('Имя конкретного типа поля для детальной информации. Если не указан — возвращает все типы'),
107
+ }, async ({ field_type }) => {
108
+ const result = (0, addon_tool_js_1.getFieldTypes)(field_type);
109
+ return {
110
+ content: [
111
+ {
112
+ type: 'text',
113
+ text: JSON.stringify(result, null, 2),
114
+ },
115
+ ],
116
+ };
117
+ });
118
+ // ── 10. Примеры кода ─────────────────────────────────────────────────────
119
+ server.tool('get_code_example', 'Получить готовый пример кода для типовой задачи в InstantCMS', {
120
+ task: zod_1.z
121
+ .string()
122
+ .describe("Описание задачи. Пример: 'список с пагинацией', 'обработка AJAX', 'кэширование', 'работа с хуками', 'загрузка файлов'"),
123
+ }, async ({ task }) => {
124
+ const result = (0, addon_tool_js_1.getCodeExample)(task);
125
+ return {
126
+ content: [
127
+ {
128
+ type: 'text',
129
+ text: JSON.stringify(result, null, 2),
130
+ },
131
+ ],
132
+ };
133
+ });
134
+ // ── 11. Генерация шаблона ────────────────────────────────────────────────
135
+ server.tool('scaffold_template', 'Генерирует скаффолд шаблона (темы) для InstantCMS: manifest.php, main.tpl.php, базовые CSS/JS', {
136
+ name: zod_1.z.string().describe('Техническое имя шаблона (латинские буквы). Пример: mytheme'),
137
+ title: zod_1.z.string().describe('Отображаемое название. Пример: My Beautiful Theme'),
138
+ author: zod_1.z.string().optional().describe('Имя автора'),
139
+ }, async (opts) => {
140
+ const result = (0, scaffold_tool_js_1.scaffoldTemplate)(opts);
141
+ return {
142
+ content: [
143
+ {
144
+ type: 'text',
145
+ text: JSON.stringify(result, null, 2),
146
+ },
147
+ ],
148
+ };
149
+ });
150
+ // ── 12. Структура шаблона ────────────────────────────────────────────────
151
+ server.tool('get_template_structure', 'Полная структура шаблона InstantCMS: обязательные и опциональные файлы, переменные доступные в .tpl.php, переопределение шаблонов контроллеров', {}, async () => {
152
+ return {
153
+ content: [
154
+ {
155
+ type: 'text',
156
+ text: JSON.stringify({
157
+ ...schemas_js_1.templateStructure,
158
+ available_tpl_variables: {
159
+ $cms_template: 'Экземпляр cmsTemplate — управление выводом',
160
+ $cms_user: 'Текущий пользователь (id, login, is_logged, group_id, ...)',
161
+ $cms_config: 'Конфигурация сайта',
162
+ 'Все ключи из render()': "Переменные, переданные из контроллера через render('tpl', ['var' => val])",
163
+ },
164
+ tpl_helpers: {
165
+ "href_to('ctrl', 'action', $params)": 'Генерация URL',
166
+ "href_to_admin('ctrl', 'action')": 'URL в админку',
167
+ 'htmlspecialchars($str)': 'Экранирование HTML',
168
+ LANG_CONST: 'Языковые константы',
169
+ 'date_format($date)': 'Форматирование даты',
170
+ },
171
+ }, null, 2),
172
+ },
173
+ ],
174
+ };
175
+ });
176
+ // ── 13. Генерация схемы виджетов (layout scheme) ─────────────────────────
177
+ server.tool('scaffold_layout_scheme', `Генерирует YAML-схему расположения виджетов для импорта в шаблон modern InstantCMS.
178
+ Схема описывает ряды (rows) и колонки (cols) Bootstrap 4 сетки с позициями для виджетов.
179
+ Результат импортируется через: Панель управления → Оформление → Шаблоны → Modern → Схема → Импорт.
180
+ Можно задать произвольную схему через параметр rows, или использовать готовый пресет через preset.`, {
181
+ template: zod_1.z
182
+ .string()
183
+ .optional()
184
+ .default('modern')
185
+ .describe('Имя шаблона. По умолчанию: modern'),
186
+ preset: zod_1.z.enum(['simple', 'with_sidebar_left', 'modern_full']).optional()
187
+ .describe(`Готовый пресет схемы. Используйте вместо rows для быстрого старта:
188
+ simple — шапка + контент/сайдбар + подвал
189
+ with_sidebar_left — три колонки: лево/контент/право + двухколоночный футер
190
+ modern_full — полная схема modern (топ-бар, лого, навбар, баннер, три колонки, префутер, футер)`),
191
+ rows: zod_1.z
192
+ .array(zod_1.z.object({
193
+ title: zod_1.z.string().describe('Отображаемое название ряда в админке'),
194
+ tag: zod_1.z
195
+ .string()
196
+ .nullish()
197
+ .describe('HTML тег Bootstrap row-элемента. null = без тега. Примеры: div, main'),
198
+ parent_col: zod_1.z
199
+ .string()
200
+ .optional()
201
+ .describe('position_name колонки-родителя (для вложенных рядов). Ряд будет вложен внутрь этой позиции'),
202
+ nested_position: zod_1.z
203
+ .string()
204
+ .optional()
205
+ .default('after')
206
+ .describe("Позиция вложения: 'after' (после виджетов, по умолчанию)"),
207
+ class: zod_1.z
208
+ .string()
209
+ .nullish()
210
+ .describe('CSS классы на Bootstrap row-элементе. Bootstrap 4: py-3, mt-auto'),
211
+ outer_tag: zod_1.z
212
+ .string()
213
+ .optional()
214
+ .describe('Внешний HTML тег-обёртка вокруг ряда. Примеры: header, footer, section, div, nav'),
215
+ outer_class: zod_1.z.string().optional().describe('CSS классы внешнего тега'),
216
+ container: zod_1.z
217
+ .string()
218
+ .optional()
219
+ .describe("Класс контейнера Bootstrap 4: 'container', 'container-fluid', '' (без контейнера). По умолчанию: 'container'"),
220
+ container_tag: zod_1.z.string().optional().describe('HTML тег контейнера. По умолчанию: div'),
221
+ container_class: zod_1.z
222
+ .string()
223
+ .optional()
224
+ .describe("CSS классы контейнера. Примеры: 'd-flex justify-content-between align-items-center flex-nowrap'"),
225
+ no_gutters: zod_1.z.boolean().optional().describe('Добавить Bootstrap no-gutters к ряду'),
226
+ cols: zod_1.z
227
+ .array(zod_1.z.object({
228
+ title: zod_1.z.string().describe('Отображаемое название колонки'),
229
+ position: zod_1.z
230
+ .string()
231
+ .optional()
232
+ .describe('Имя позиции для привязки виджетов. Авто-генерируется как pos_N если не задано. Используйте con_* для полноширинных позиций'),
233
+ tag: zod_1.z
234
+ .string()
235
+ .optional()
236
+ .describe('HTML тег колонки. По умолчанию: div. Примеры: article, aside, nav'),
237
+ class: zod_1.z
238
+ .string()
239
+ .nullish()
240
+ .describe('CSS классы на колонке. Bootstrap 4: mb-3 mb-md-4'),
241
+ type: zod_1.z
242
+ .enum(['typical', 'custom'])
243
+ .optional()
244
+ .default('typical')
245
+ .describe('Тип колонки: typical = обычная Bootstrap-колонка, custom = кастомный HTML с {position}'),
246
+ wrapper: zod_1.z
247
+ .string()
248
+ .optional()
249
+ .describe("Для type=custom: HTML-обёртка с плейсхолдером {position}. Примеры: '{position}' или '<div class=\"my-wrap\">{position}</div>'"),
250
+ col: zod_1.z
251
+ .string()
252
+ .optional()
253
+ .describe('Bootstrap 4 col-класс (xs/default). Примеры: col, col-sm-12, col-sm'),
254
+ col_md: zod_1.z
255
+ .string()
256
+ .optional()
257
+ .describe('Bootstrap 4 col-md класс. Примеры: col-md-6, col-md'),
258
+ col_lg: zod_1.z
259
+ .string()
260
+ .optional()
261
+ .describe('Bootstrap 4 col-lg класс. Примеры: col-lg-8, col-lg-4, col-lg-3, col-lg'),
262
+ col_xl: zod_1.z
263
+ .string()
264
+ .optional()
265
+ .describe('Bootstrap 4 col-xl класс. Примеры: col-xl-2'),
266
+ col_class: zod_1.z
267
+ .string()
268
+ .optional()
269
+ .describe('Переопределить все responsive классы одним значением'),
270
+ order: zod_1.z.number().optional().describe('Bootstrap order (default). 0 = без order'),
271
+ cut_before: zod_1.z
272
+ .boolean()
273
+ .optional()
274
+ .describe('Вставить Bootstrap w-100 перед колонкой (принудительный перенос строки)'),
275
+ }))
276
+ .describe('Колонки ряда'),
277
+ }))
278
+ .min(1)
279
+ .max(100)
280
+ .optional()
281
+ .describe('Массив рядов схемы. Используйте вместо preset для кастомной схемы'),
282
+ }, async ({ template, preset, rows }) => {
283
+ let input;
284
+ if (preset && !rows) {
285
+ // Use preset
286
+ const p = layout_tool_js_1.layoutPresets[preset];
287
+ input = { ...p.scheme, template: template || p.scheme.template };
288
+ }
289
+ else if (rows) {
290
+ input = { template: template || 'modern', rows };
291
+ }
292
+ else {
293
+ // Default: list presets
294
+ return {
295
+ isError: true,
296
+ content: [
297
+ {
298
+ type: 'text',
299
+ text: JSON.stringify({
300
+ error: 'Укажите preset или rows',
301
+ available_presets: (0, layout_tool_js_1.listLayoutPresets)(),
302
+ }, null, 2),
303
+ },
304
+ ],
305
+ };
306
+ }
307
+ const result = (0, layout_tool_js_1.scaffoldLayoutScheme)(input);
308
+ return {
309
+ content: [
310
+ {
311
+ type: 'text',
312
+ text: JSON.stringify(result, null, 2),
313
+ },
314
+ ],
315
+ };
316
+ });
317
+ // ── 14. Список пресетов схем виджетов ────────────────────────────────────
318
+ server.tool('list_layout_presets', 'Список готовых пресетов схем расположения виджетов для шаблона modern InstantCMS. Используйте preset в scaffold_layout_scheme для быстрой генерации.', {}, async () => {
319
+ return {
320
+ content: [
321
+ {
322
+ type: 'text',
323
+ text: JSON.stringify((0, layout_tool_js_1.listLayoutPresets)(), null, 2),
324
+ },
325
+ ],
326
+ };
327
+ });
328
+ // ── 15. Анализ структуры базы данных ──────────────────────────────────────
329
+ server.tool('introspect_database', 'Анализ структуры базы данных InstantCMS. Без параметров — список всех таблиц. С параметром table_name — детали конкретной таблицы.', {
330
+ table_name: zod_1.z
331
+ .string()
332
+ .optional()
333
+ .describe('Имя таблицы (без префикса cms_). Пример: users, content_types, widgets'),
334
+ }, async ({ table_name }) => {
335
+ const result = (0, db_tool_js_1.introspectDatabase)(table_name);
336
+ return {
337
+ content: [
338
+ {
339
+ type: 'text',
340
+ text: JSON.stringify(result, null, 2),
341
+ },
342
+ ],
343
+ };
344
+ });
345
+ // ── 16. Описание конкретной таблицы ──────────────────────────────────────
346
+ server.tool('describe_table', 'Подробное описание таблицы: поля, индексы, связи, типы данных. Генерирует примеры SQL-запросов.', {
347
+ table_name: zod_1.z
348
+ .string()
349
+ .describe('Имя таблицы (можно с префиксом cms_ или без). Пример: cms_users, content_types'),
350
+ }, async ({ table_name }) => {
351
+ const result = (0, db_tool_js_1.describeTable)(table_name);
352
+ return {
353
+ content: [
354
+ {
355
+ type: 'text',
356
+ text: JSON.stringify(result, null, 2),
357
+ },
358
+ ],
359
+ };
360
+ });
361
+ // ── 17. Типы контента ────────────────────────────────────────────────────
362
+ server.tool('list_content_types', 'Информация о типах контента: cms_content_types, cms_con_pages, cms_users. Поля, ключи, связи.', {}, async () => {
363
+ const result = (0, db_tool_js_1.listContentTypes)();
364
+ return {
365
+ content: [
366
+ {
367
+ type: 'text',
368
+ text: JSON.stringify(result, null, 2),
369
+ },
370
+ ],
371
+ };
372
+ });
373
+ // ── 18. Карта событий (events) ────────────────────────────────────────────
374
+ server.tool('list_database_events', 'Все зарегистрированные события (хуки) из таблицы cms_events. Показывает какой контроллер на какое событие подписан.', {}, async () => {
375
+ const result = (0, db_tool_js_1.listDatabaseEvents)();
376
+ return {
377
+ content: [
378
+ {
379
+ type: 'text',
380
+ text: JSON.stringify(result, null, 2),
381
+ },
382
+ ],
383
+ };
384
+ });
385
+ // ── 19. Анализ контроллера ───────────────────────────────────────────────
386
+ server.tool('analyze_controller', 'Подробная информация о контроллере: класс, наследование, экшены, трейты, файлы.', {
387
+ name: zod_1.z.string().describe('Имя контроллера. Пример: content, users, messages'),
388
+ type: zod_1.z.enum(['frontend', 'backend']).optional().describe('Тип контроллера'),
389
+ }, async ({ name, type }) => {
390
+ const result = (0, controllers_tool_js_1.analyzeController)(name, type);
391
+ return {
392
+ content: [
393
+ {
394
+ type: 'text',
395
+ text: JSON.stringify(result, null, 2),
396
+ },
397
+ ],
398
+ };
399
+ });
400
+ // ── 20. Список контроллеров ──────────────────────────────────────────────
401
+ server.tool('list_controllers', 'Список всех контроллеров: frontend и backend. Можно фильтровать по типу.', {
402
+ filter: zod_1.z.enum(['frontend', 'backend']).optional().describe('Фильтр по типу контроллера'),
403
+ }, async ({ filter }) => {
404
+ const result = (0, controllers_tool_js_1.listControllers)(filter);
405
+ return {
406
+ content: [
407
+ {
408
+ type: 'text',
409
+ text: JSON.stringify(result, null, 2),
410
+ },
411
+ ],
412
+ };
413
+ });
414
+ // ── 21. Экшены контроллера ───────────────────────────────────────────────
415
+ server.tool('get_controller_actions', 'Список всех экшенов контроллера с параметрами, видимостью и трейтами.', {
416
+ name: zod_1.z.string().describe('Имя контроллера. Пример: content, users'),
417
+ type: zod_1.z.enum(['frontend', 'backend']).optional().describe('Тип контроллера'),
418
+ }, async ({ name, type }) => {
419
+ const result = (0, controllers_tool_js_1.getControllerActionsList)(name, type);
420
+ return {
421
+ content: [
422
+ {
423
+ type: 'text',
424
+ text: JSON.stringify(result, null, 2),
425
+ },
426
+ ],
427
+ };
428
+ });
429
+ // ── 22. Системные трейты ─────────────────────────────────────────────────
430
+ server.tool('list_system_traits', 'Список всех системных трейтов icms используемых в контроллерах. Трейты предоставляют готовую функциональность.', {}, async () => {
431
+ const result = (0, controllers_tool_js_1.listSystemTraits)();
432
+ return {
433
+ content: [
434
+ {
435
+ type: 'text',
436
+ text: JSON.stringify(result, null, 2),
437
+ },
438
+ ],
439
+ };
440
+ });
441
+ }
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerLanguageTools = registerLanguageTools;
4
+ const zod_1 = require("zod");
5
+ const migration_tool_js_1 = require("../tools/migration-tool.js");
6
+ const lang_tool_js_1 = require("../tools/lang-tool.js");
7
+ function registerLanguageTools(server) {
8
+ // ═══════════════════════════════════════════════════════════════════════════
9
+ // LANGUAGE TOOLS
10
+ // ═══════════════════════════════════════════════════════════════════════════
11
+ // ── 40. Список языковых ключей ────────────────────────────────────────
12
+ server.tool('list_lang_keys', 'Возвращает типовые языковые константы для дополнения. Генерирует LANG_* ключи с значениями по умолчанию.', {
13
+ addon_name: zod_1.z.string().describe('Имя дополнения. Пример: myaddon'),
14
+ category: zod_1.z
15
+ .string()
16
+ .optional()
17
+ .describe('Фильтр по категории: system, actions, pages, buttons, status, fields, errors, permissions, dates, messages, pagination, sort'),
18
+ }, async ({ addon_name, category }) => {
19
+ const result = (0, lang_tool_js_1.listLangKeys)({ addon_name, category });
20
+ return {
21
+ content: [
22
+ {
23
+ type: 'text',
24
+ text: JSON.stringify(result, null, 2),
25
+ },
26
+ ],
27
+ };
28
+ });
29
+ // ── 41. Генерация языкового файла ───────────────────────────────────
30
+ server.tool('scaffold_lang', 'Генерирует готовый PHP файл с языковыми константами для дополнения.', {
31
+ addon_name: zod_1.z.string().describe('Имя дополнения. Пример: myaddon'),
32
+ keys: zod_1.z
33
+ .array(zod_1.z.string())
34
+ .optional()
35
+ .describe('Список ключей для генерации. Если пусто — все типовые.'),
36
+ custom_keys: zod_1.z
37
+ .array(zod_1.z.object({
38
+ key: zod_1.z.string().describe('Полный ключ, например: LANG_MYADDON_MY_KEY'),
39
+ value: zod_1.z.string().describe('Значение константы'),
40
+ category: zod_1.z.string().optional().describe('Категория'),
41
+ }))
42
+ .optional()
43
+ .describe('Дополнительные кастомные ключи'),
44
+ }, async ({ addon_name, keys, custom_keys }) => {
45
+ const result = (0, lang_tool_js_1.scaffoldLang)({ addon_name, keys, custom_keys });
46
+ return {
47
+ content: [
48
+ {
49
+ type: 'text',
50
+ text: JSON.stringify(result, null, 2),
51
+ },
52
+ ],
53
+ };
54
+ });
55
+ // ── 42. Генерация миграции с файлами ────────────────────────────────
56
+ server.tool('scaffold_migration', 'Генерирует install.php и uninstall.php файлы для дополнения. Включает создание таблиц, опционально тип контента и SEO настройки.', {
57
+ addon_name: zod_1.z.string().describe('Имя дополнения. Пример: myaddon'),
58
+ table_name: zod_1.z.string().describe('Имя таблицы без префикса. Пример: items'),
59
+ fields: zod_1.z
60
+ .array(zod_1.z.object({
61
+ name: zod_1.z.string().describe('Имя поля'),
62
+ type: zod_1.z.string().describe('Тип SQL: varchar(255), text, int(11), datetime, tinyint(1)'),
63
+ nullable: zod_1.z.boolean().optional().describe('Может быть NULL'),
64
+ default: zod_1.z.union([zod_1.z.string(), zod_1.z.number()]).optional().describe('Значение по умолчанию'),
65
+ extra: zod_1.z.string().optional().describe('Дополнительно: AUTO_INCREMENT'),
66
+ comment: zod_1.z.string().optional().describe('Комментарий к полю'),
67
+ }))
68
+ .describe('Поля таблицы'),
69
+ options: zod_1.z
70
+ .object({
71
+ comment: zod_1.z.string().optional().describe('Комментарий к таблице'),
72
+ indexes: zod_1.z
73
+ .array(zod_1.z.object({
74
+ name: zod_1.z.string().describe('Имя индекса'),
75
+ fields: zod_1.z.array(zod_1.z.string()).describe('Поля через запятую'),
76
+ type: zod_1.z.enum(['INDEX', 'UNIQUE', 'FULLTEXT']).optional().describe('Тип индекса'),
77
+ }))
78
+ .optional()
79
+ .describe('Дополнительные индексы'),
80
+ permissions: zod_1.z
81
+ .array(zod_1.z.string())
82
+ .optional()
83
+ .describe('Права доступа: view, add, edit, delete'),
84
+ content_type: zod_1.z.boolean().optional().describe('Создать тип контента'),
85
+ has_seo: zod_1.z.boolean().optional().describe('Добавить SEO настройки'),
86
+ })
87
+ .optional(),
88
+ }, async ({ addon_name, table_name, fields, options }) => {
89
+ const result = (0, migration_tool_js_1.scaffoldMigration)({ addon_name, table_name, fields, options });
90
+ return {
91
+ content: [
92
+ {
93
+ type: 'text',
94
+ text: JSON.stringify(result, null, 2),
95
+ },
96
+ ],
97
+ };
98
+ });
99
+ }