@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,506 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerGeneratorTools = registerGeneratorTools;
4
+ const zod_1 = require("zod");
5
+ const addon_tool_js_1 = require("../tools/addon-tool.js");
6
+ const scaffold_tool_js_1 = require("../tools/scaffold-tool.js");
7
+ const crud_tool_js_1 = require("../tools/crud-tool.js");
8
+ const form_tool_js_1 = require("../tools/form-tool.js");
9
+ const grid_tool_js_1 = require("../tools/grid-tool.js");
10
+ const api_tool_js_1 = require("../tools/api-tool.js");
11
+ const test_tool_js_1 = require("../tools/test-tool.js");
12
+ const email_tool_js_1 = require("../tools/email-tool.js");
13
+ const layout_override_tool_js_1 = require("../tools/layout-override-tool.js");
14
+ const admin_partial_tool_js_1 = require("../tools/admin-partial-tool.js");
15
+ const template_overrides_tool_js_1 = require("../tools/template-overrides-tool.js");
16
+ const cron_tool_js_1 = require("../tools/cron-tool.js");
17
+ const hooks_js_1 = require("../data/hooks.js");
18
+ function registerGeneratorTools(server) {
19
+ // ── 1. Структура дополнения ──────────────────────────────────────────────
20
+ server.tool('get_addon_structure', 'Возвращает полную структуру файлов и папок для дополнения InstantCMS с описанием каждого файла и шаблонами кода', {
21
+ addon_type: zod_1.z
22
+ .enum(['basic', 'with_admin', 'with_hooks', 'with_routes', 'with_widget'])
23
+ .default('basic')
24
+ .describe('Тип дополнения: basic (только фронтенд), with_admin (с CRUD панелью), with_hooks (с хуками), with_routes (кастомные URL), with_widget (с виджетом)'),
25
+ }, async ({ addon_type }) => {
26
+ const result = (0, addon_tool_js_1.getAddonStructure)(addon_type);
27
+ return {
28
+ content: [
29
+ {
30
+ type: 'text',
31
+ text: JSON.stringify(result, null, 2),
32
+ },
33
+ ],
34
+ };
35
+ });
36
+ // ── 2. Генерация скаффолда дополнения ────────────────────────────────────
37
+ server.tool('scaffold_addon', 'Генерирует готовый код всех файлов дополнения InstantCMS на основе параметров. Возвращает map {имя_файла: содержимое}', {
38
+ name: zod_1.z
39
+ .string()
40
+ .regex(/^[a-z][a-z0-9_]{1,63}$/)
41
+ .describe('Техническое имя: 2–64 строчных латинских символа, цифры и подчёркивания'),
42
+ title: zod_1.z.string().trim().min(1).max(200).describe('Отображаемое название дополнения'),
43
+ type: zod_1.z
44
+ .enum(['basic', 'with_admin', 'with_hooks', 'with_routes', 'with_widget'])
45
+ .default('basic')
46
+ .describe('Тип дополнения'),
47
+ author: zod_1.z.string().trim().min(1).max(200).optional().describe('Имя автора'),
48
+ author_url: zod_1.z.string().url().optional().describe('URL сайта автора'),
49
+ version: zod_1.z
50
+ .string()
51
+ .regex(/^\d+\.\d+\.\d+$/)
52
+ .optional()
53
+ .default('1.0.0')
54
+ .describe('Версия X.Y.Z'),
55
+ description: zod_1.z.string().trim().max(1000).optional().describe('Описание дополнения'),
56
+ hooks: zod_1.z
57
+ .array(zod_1.z.string().refine(value => hooks_js_1.hooks.some(h => h.name === value), 'Неизвестный хук'))
58
+ .max(100)
59
+ .optional()
60
+ .describe("Список хуков для интеграции. Пример: ['content_after_add_approve', 'user_registered']"),
61
+ }, async (opts) => {
62
+ const result = (0, scaffold_tool_js_1.scaffoldAddon)(opts);
63
+ return {
64
+ content: [
65
+ {
66
+ type: 'text',
67
+ text: JSON.stringify(result, null, 2),
68
+ },
69
+ ],
70
+ };
71
+ });
72
+ // ── 2.1. Генерация CRUD для контент-типа ─────────────────────────────────
73
+ server.tool('scaffold_crud', 'Генерирует полный CRUD для контент-типа InstantCMS: модель, контроллеры фронтенда и бэкенда, гриды, формы', {
74
+ addon_name: zod_1.z.string().describe('Техническое имя дополнения. Пример: my_crud'),
75
+ fields: zod_1.z
76
+ .array(zod_1.z.object({
77
+ name: zod_1.z.string().describe('Имя поля БД. Пример: title'),
78
+ type: zod_1.z.string().describe('Тип поля: varchar, text, html, int, date, etc.'),
79
+ title: zod_1.z.string().optional().describe('Заголовок поля для формы'),
80
+ comment: zod_1.z.string().optional().describe('Комментарий поля'),
81
+ is_system: zod_1.z.boolean().optional().describe('Системное поле'),
82
+ default: zod_1.z
83
+ .union([zod_1.z.string(), zod_1.z.number(), zod_1.z.boolean()])
84
+ .optional()
85
+ .describe('Значение по умолчанию'),
86
+ key: zod_1.z.string().optional().describe('Ключ: MUL, PRI, etc.'),
87
+ }))
88
+ .describe('Список полей таблицы'),
89
+ options: zod_1.z
90
+ .object({
91
+ use_category: zod_1.z.boolean().optional().describe('Использовать категории'),
92
+ use_tags: zod_1.z.boolean().optional().describe('Использовать теги'),
93
+ use_comments: zod_1.z.boolean().optional().describe('Использовать комментарии'),
94
+ use_rating: zod_1.z.boolean().optional().describe('Использовать рейтинг'),
95
+ use_moderation: zod_1.z.boolean().optional().describe('Использовать модерацию'),
96
+ use_seo: zod_1.z.boolean().optional().describe('Использовать SEO'),
97
+ use_content: zod_1.z.boolean().optional().describe('Использовать контент-тип'),
98
+ list_template: zod_1.z.enum(['grid', 'list', 'table']).optional().describe('Шаблон списка'),
99
+ })
100
+ .optional()
101
+ .describe('Дополнительные опции'),
102
+ }, async (opts) => {
103
+ const result = (0, crud_tool_js_1.scaffoldCrud)(opts);
104
+ return {
105
+ content: [
106
+ {
107
+ type: 'text',
108
+ text: JSON.stringify(result, null, 2),
109
+ },
110
+ ],
111
+ };
112
+ });
113
+ // ── 2.2. Генерация формы ──────────────────────────────────────────────────
114
+ server.tool('scaffold_form', 'Генерирует PHP класс формы для бэкенда InstantCMS с указанными полями и правилами валидации', {
115
+ addon_name: zod_1.z.string().describe('Техническое имя дополнения. Пример: my_addon'),
116
+ form_name: zod_1.z
117
+ .string()
118
+ .describe('Имя формы (без префикса form_). Пример: item, options, profile'),
119
+ fields: zod_1.z
120
+ .array(zod_1.z.object({
121
+ name: zod_1.z.string().describe('Имя поля. Пример: title, content, price'),
122
+ type: zod_1.z
123
+ .string()
124
+ .describe('Тип поля: varchar, text, html, int, date, datetime, checkbox, select, file, image, user, etc.'),
125
+ title: zod_1.z.string().optional().describe('Заголовок поля в форме'),
126
+ rules: zod_1.z
127
+ .array(zod_1.z.union([zod_1.z.string(), zod_1.z.array(zod_1.z.unknown())]))
128
+ .optional()
129
+ .describe("Правила валидации: [['required'], ['max_length', 255]]"),
130
+ options: zod_1.z
131
+ .record(zod_1.z.string(), zod_1.z.unknown())
132
+ .optional()
133
+ .describe('Дополнительные опции поля'),
134
+ is_system: zod_1.z.boolean().optional().describe("Добавить в секцию 'system' вместо 'basic'"),
135
+ }))
136
+ .describe('Список полей формы'),
137
+ options: zod_1.z
138
+ .object({
139
+ use_tabs: zod_1.z.boolean().optional().describe('Использовать табы для группировки полей'),
140
+ use_separate_save: zod_1.z
141
+ .boolean()
142
+ .optional()
143
+ .describe('Генерировать отдельный класс для сохранения'),
144
+ generate_rules: zod_1.z
145
+ .boolean()
146
+ .optional()
147
+ .describe('Автоматически генерировать правила валидации'),
148
+ })
149
+ .optional()
150
+ .describe('Опции формы'),
151
+ }, async (opts) => {
152
+ const result = (0, form_tool_js_1.scaffoldForm)(opts);
153
+ return {
154
+ content: [
155
+ {
156
+ type: 'text',
157
+ text: JSON.stringify(result, null, 2),
158
+ },
159
+ ],
160
+ };
161
+ });
162
+ // ── 2.3. Генерация грида ──────────────────────────────────────────────────
163
+ server.tool('scaffold_grid', 'Генерирует PHP функцию грида для бэкенда InstantCMS с колонками, фильтрами и экшенами', {
164
+ addon_name: zod_1.z.string().describe('Техническое имя дополнения. Пример: my_addon'),
165
+ grid_name: zod_1.z
166
+ .string()
167
+ .describe('Имя грида (без префикса grid_). Пример: items, products, orders'),
168
+ columns: zod_1.z
169
+ .array(zod_1.z.object({
170
+ name: zod_1.z.string().describe('Имя колонки. Пример: title, date_pub, is_pub'),
171
+ title: zod_1.z.string().describe('Заголовок колонки'),
172
+ width: zod_1.z.number().optional().describe('Ширина колонки в пикселях'),
173
+ filter: zod_1.z.string().optional().describe('Тип фильтра: like, eq, gt, lt, date, etc.'),
174
+ href: zod_1.z
175
+ .string()
176
+ .optional()
177
+ .describe("URL для клика по ссылке. Пример: href_to($controller->root_url, 'items', ['edit', '{id}'])"),
178
+ show: zod_1.z.boolean().optional().describe('Показывать колонку по умолчанию'),
179
+ flag: zod_1.z.boolean().optional().describe('Отображать как флаг (вкл/выкл)'),
180
+ flag_toggle: zod_1.z.string().optional().describe('URL для переключения флага'),
181
+ handler: zod_1.z
182
+ .string()
183
+ .optional()
184
+ .describe('PHP функция-обработчик значения: function ($value) { return ...; }'),
185
+ order_by: zod_1.z.boolean().optional().describe('Разрешить сортировку по этой колонке'),
186
+ }))
187
+ .describe('Колонки грида'),
188
+ options: zod_1.z
189
+ .object({
190
+ is_sortable: zod_1.z.boolean().optional().describe('Включить сортировку'),
191
+ is_filter: zod_1.z.boolean().optional().describe('Включить фильтры'),
192
+ is_pagination: zod_1.z.boolean().optional().describe('Включить пагинацию'),
193
+ is_draggable: zod_1.z.boolean().optional().describe('Включить drag-n-drop сортировку'),
194
+ is_selectable: zod_1.z.boolean().optional().describe('Включить чекбоксы для массовых операций'),
195
+ is_collapsible: zod_1.z
196
+ .boolean()
197
+ .optional()
198
+ .describe('Позволить пользователям сворачивать колонки'),
199
+ order_by: zod_1.z.string().optional().describe('Поле сортировки по умолчанию'),
200
+ order_to: zod_1.z
201
+ .enum(['asc', 'desc'])
202
+ .optional()
203
+ .describe('Направление сортировки по умолчанию'),
204
+ show_id: zod_1.z.boolean().optional().describe('Показывать колонку ID'),
205
+ filter_button_title: zod_1.z.string().optional().describe('Текст кнопки фильтра'),
206
+ })
207
+ .optional()
208
+ .describe('Опции грида'),
209
+ actions: zod_1.z
210
+ .array(zod_1.z.object({
211
+ title: zod_1.z.string().describe('Заголовок кнопки. Пример: EDIT, DELETE'),
212
+ href: zod_1.z
213
+ .string()
214
+ .describe("URL экшена. Пример: href_to($controller->root_url, 'items', ['edit', '{id}'])"),
215
+ icon: zod_1.z.string().optional().describe('Иконка: pen, times-circle, eye, etc.'),
216
+ class: zod_1.z.string().optional().describe('Дополнительные CSS классы. Пример: text-danger'),
217
+ confirm: zod_1.z.string().optional().describe('Текст подтверждения действия'),
218
+ }))
219
+ .optional()
220
+ .describe('Кнопки действий'),
221
+ }, async (opts) => {
222
+ const result = (0, grid_tool_js_1.scaffoldGrid)(opts);
223
+ return {
224
+ content: [
225
+ {
226
+ type: 'text',
227
+ text: JSON.stringify(result, null, 2),
228
+ },
229
+ ],
230
+ };
231
+ });
232
+ // ── 2.4. Генерация REST API ──────────────────────────────────────────────
233
+ server.tool('scaffold_api', 'Генерирует REST API контроллер для InstantCMS с эндпоинтами, аутентификацией и опционально OpenAPI спецификацией', {
234
+ addon_name: zod_1.z.string().describe('Техническое имя API. Пример: my_api'),
235
+ version: zod_1.z.string().optional().default('v1').describe('Версия API. Пример: v1, v2'),
236
+ endpoints: zod_1.z
237
+ .array(zod_1.z.object({
238
+ name: zod_1.z.string().describe('Имя эндпоинта. Пример: list, get, create, update, delete'),
239
+ method: zod_1.z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE']).describe('HTTP метод'),
240
+ path: zod_1.z.string().describe('Путь эндпоинта. Пример: /list, /{id}, /search'),
241
+ description: zod_1.z.string().optional().describe('Описание эндпоинта'),
242
+ auth_required: zod_1.z.boolean().optional().describe('Требуется ли аутентификация'),
243
+ params: zod_1.z
244
+ .array(zod_1.z.object({
245
+ name: zod_1.z.string().describe('Имя параметра'),
246
+ type: zod_1.z.enum(['path', 'query', 'body']).describe('Тип параметра'),
247
+ required: zod_1.z.boolean().optional().describe('Обязательный параметр'),
248
+ description: zod_1.z.string().optional().describe('Описание параметра'),
249
+ }))
250
+ .optional()
251
+ .describe('Параметры эндпоинта'),
252
+ }))
253
+ .describe('Список эндпоинтов API'),
254
+ options: zod_1.z
255
+ .object({
256
+ use_swagger: zod_1.z.boolean().optional().describe('Генерировать OpenAPI спецификацию'),
257
+ use_rate_limit: zod_1.z.boolean().optional().describe('Включить rate limiting'),
258
+ base_path: zod_1.z
259
+ .string()
260
+ .optional()
261
+ .describe('Базовая часть пути. По умолчанию: /api/{version}/{addon_name}'),
262
+ })
263
+ .optional()
264
+ .describe('Опции API'),
265
+ }, async (opts) => {
266
+ const result = (0, api_tool_js_1.scaffoldApi)(opts);
267
+ return {
268
+ content: [
269
+ {
270
+ type: 'text',
271
+ text: JSON.stringify(result, null, 2),
272
+ },
273
+ ],
274
+ };
275
+ });
276
+ // ── 2.5. Генерация тестов ─────────────────────────────────────────────────
277
+ server.tool('scaffold_test', 'Генерирует PHPUnit или Codeception тесты для дополнения InstantCMS', {
278
+ addon_name: zod_1.z.string().describe('Техническое имя дополнения. Пример: my_addon'),
279
+ class_name: zod_1.z.string().describe('Имя тестируемого класса. Пример: modelMyaddon'),
280
+ class_type: zod_1.z.enum(['model', 'controller', 'component', 'widget']).describe('Тип класса'),
281
+ methods: zod_1.z.array(zod_1.z.string()).describe('Список методов для тестирования'),
282
+ options: zod_1.z
283
+ .object({
284
+ test_framework: zod_1.z
285
+ .enum(['phpunit', 'codeception'])
286
+ .optional()
287
+ .default('phpunit')
288
+ .describe('Фреймворк для тестов'),
289
+ mock_db: zod_1.z.boolean().optional().default(true).describe('Создавать мок для базы данных'),
290
+ mock_cache: zod_1.z.boolean().optional().default(true).describe('Создавать мок для кэша'),
291
+ })
292
+ .optional()
293
+ .describe('Опции генерации тестов'),
294
+ }, async (opts) => {
295
+ const result = (0, test_tool_js_1.scaffoldTest)(opts);
296
+ return {
297
+ content: [
298
+ {
299
+ type: 'text',
300
+ text: JSON.stringify(result, null, 2),
301
+ },
302
+ ],
303
+ };
304
+ });
305
+ // ── 2.6. Генерация email шаблонов ───────────────────────────────────────
306
+ server.tool('scaffold_email', 'Генерирует HTML email шаблоны для уведомлений InstantCMS с переменными и стилями', {
307
+ addon_name: zod_1.z.string().describe('Техническое имя дополнения. Пример: my_addon'),
308
+ templates: zod_1.z
309
+ .array(zod_1.z.object({
310
+ name: zod_1.z.string().describe('Имя шаблона. Пример: welcome, notification, reminder'),
311
+ subject: zod_1.z.string().describe('Тема письма'),
312
+ body: zod_1.z
313
+ .string()
314
+ .describe('Тело письма с поддержкой переменных {user_name}, {site_name}, etc.'),
315
+ variables: zod_1.z
316
+ .array(zod_1.z.object({
317
+ name: zod_1.z.string().describe('Имя переменной'),
318
+ description: zod_1.z.string().optional().describe('Описание переменной'),
319
+ example: zod_1.z.string().optional().describe('Пример значения'),
320
+ }))
321
+ .optional()
322
+ .describe('Список переменных в шаблоне'),
323
+ }))
324
+ .describe('Список email шаблонов'),
325
+ options: zod_1.z
326
+ .object({
327
+ use_html: zod_1.z.boolean().optional().default(true).describe('Использовать HTML разметку'),
328
+ base_template: zod_1.z
329
+ .enum(['default', 'minimal', 'notifications'])
330
+ .optional()
331
+ .default('default')
332
+ .describe('Базовый шаблон стилей'),
333
+ })
334
+ .optional()
335
+ .describe('Опции email'),
336
+ }, async (opts) => {
337
+ const result = (0, email_tool_js_1.scaffoldEmail)(opts);
338
+ return {
339
+ content: [
340
+ {
341
+ type: 'text',
342
+ text: JSON.stringify(result, null, 2),
343
+ },
344
+ ],
345
+ };
346
+ });
347
+ // ── 2.7. Генерация переопределений шаблонов ──────────────────────────────
348
+ server.tool('scaffold_layout_override', 'Генерирует шаблоны для переопределения стандартных шаблонов контроллеров InstantCMS в пользовательских темах', {
349
+ addon_name: zod_1.z.string().describe('Техническое имя дополнения. Пример: my_overrides'),
350
+ overrides: zod_1.z
351
+ .array(zod_1.z.object({
352
+ controller: zod_1.z.string().describe('Имя контроллера. Пример: content, users, photos'),
353
+ template: zod_1.z.string().describe('Имя темы для переопределения. Пример: modern, default'),
354
+ action: zod_1.z
355
+ .string()
356
+ .optional()
357
+ .describe('Имя экшена. Если не указано - переопределяется index'),
358
+ }))
359
+ .describe('Список переопределений'),
360
+ options: zod_1.z
361
+ .object({
362
+ use_wrapper: zod_1.z.boolean().optional().describe('Добавить обёртку с сайдбаром'),
363
+ add_breadcrumbs: zod_1.z.boolean().optional().describe('Добавить хлебные крошки'),
364
+ })
365
+ .optional()
366
+ .describe('Опции генерации'),
367
+ }, async (opts) => {
368
+ const result = (0, layout_override_tool_js_1.scaffoldLayoutOverride)(opts);
369
+ return {
370
+ content: [
371
+ {
372
+ type: 'text',
373
+ text: JSON.stringify(result, null, 2),
374
+ },
375
+ ],
376
+ };
377
+ });
378
+ // ── 2.8. Генерация частей админки ─────────────────────────────────────────
379
+ server.tool('scaffold_admin_partial', 'Генерирует переиспользуемые части интерфейса админки: header, sidebar, toolbar, breadcrumbs, panels, modals', {
380
+ addon_name: zod_1.z.string().describe('Техническое имя набора. Пример: my_partials'),
381
+ partials: zod_1.z
382
+ .array(zod_1.z.object({
383
+ name: zod_1.z.string().describe('Имя части. Пример: menu, header, footer'),
384
+ type: zod_1.z
385
+ .enum([
386
+ 'header',
387
+ 'sidebar',
388
+ 'footer',
389
+ 'toolbar',
390
+ 'breadcrumb',
391
+ 'panel',
392
+ 'modal',
393
+ 'notification',
394
+ ])
395
+ .describe('Тип части'),
396
+ items: zod_1.z.array(zod_1.z.string()).optional().describe('Элементы меню или списка'),
397
+ }))
398
+ .describe('Список частей для генерации'),
399
+ options: zod_1.z
400
+ .object({
401
+ use_bootstrap: zod_1.z
402
+ .boolean()
403
+ .optional()
404
+ .default(true)
405
+ .describe('Использовать Bootstrap классы'),
406
+ use_icms_icons: zod_1.z.boolean().optional().default(true).describe('Использовать иконки ICMS'),
407
+ })
408
+ .optional()
409
+ .describe('Опции генерации'),
410
+ }, async (opts) => {
411
+ const result = (0, admin_partial_tool_js_1.scaffoldAdminPartial)(opts);
412
+ return {
413
+ content: [
414
+ {
415
+ type: 'text',
416
+ text: JSON.stringify(result, null, 2),
417
+ },
418
+ ],
419
+ };
420
+ });
421
+ // ── 2.9. Список переопределений шаблонов ──────────────────────────────────
422
+ server.tool('list_template_overrides', 'Возвращает список всех доступных переопределений шаблонов контроллеров InstantCMS', {
423
+ controller: zod_1.z
424
+ .string()
425
+ .optional()
426
+ .describe('Фильтр по имени контроллера. Пример: content, users, photos'),
427
+ }, async ({ controller }) => {
428
+ const result = (0, template_overrides_tool_js_1.listTemplateOverrides)(controller);
429
+ return {
430
+ content: [
431
+ {
432
+ type: 'text',
433
+ text: JSON.stringify(result, null, 2),
434
+ },
435
+ ],
436
+ };
437
+ });
438
+ // ── 2.10. Информация о переопределении ──────────────────────────────────
439
+ server.tool('get_template_override_info', 'Возвращает подробную информацию о конкретном переопределении шаблона', {
440
+ controller: zod_1.z.string().describe('Имя контроллера. Пример: content, users'),
441
+ action: zod_1.z
442
+ .string()
443
+ .optional()
444
+ .describe('Имя экшена. Пример: view, index. Если не указано - возвращает информацию о index'),
445
+ }, async ({ controller, action }) => {
446
+ const result = (0, template_overrides_tool_js_1.getTemplateOverrideInfo)(controller, action);
447
+ return {
448
+ content: [
449
+ {
450
+ type: 'text',
451
+ text: JSON.stringify(result, null, 2),
452
+ },
453
+ ],
454
+ };
455
+ });
456
+ // ── 2.11. Генерация cron задач ───────────────────────────────────────────
457
+ server.tool('scaffold_cron', 'Генерирует PHP cron контроллер для периодических задач с настройкой расписания, блокировками и логированием', {
458
+ addon_name: zod_1.z.string().describe('Техническое имя дополнения. Пример: my_cron'),
459
+ tasks: zod_1.z
460
+ .array(zod_1.z.object({
461
+ name: zod_1.z.string().describe('Имя задачи. Пример: cleanup, send_emails, sync_data'),
462
+ schedule: zod_1.z
463
+ .object({
464
+ minute: zod_1.z
465
+ .string()
466
+ .optional()
467
+ .describe('Минуты (0-59, * или */n). Пример: 0, */15, 30'),
468
+ hour: zod_1.z.string().optional().describe('Часы (0-23, * или */n). Пример: 0, */2, 12'),
469
+ day: zod_1.z
470
+ .string()
471
+ .optional()
472
+ .describe('День месяца (1-31, * или */n). Пример: 1, */7'),
473
+ month: zod_1.z.string().optional().describe('Месяц (1-12, * или */n). Пример: 1, */3'),
474
+ day_of_week: zod_1.z
475
+ .string()
476
+ .optional()
477
+ .describe('День недели (0-6, *). Пример: 0 (воскр), 1-5'),
478
+ })
479
+ .describe('Расписание в формате cron'),
480
+ description: zod_1.z.string().optional().describe('Описание задачи'),
481
+ action: zod_1.z.string().describe('Имя PHP функции для выполнения. Пример: taskCleanup'),
482
+ }))
483
+ .describe('Список cron задач'),
484
+ options: zod_1.z
485
+ .object({
486
+ use_lock_file: zod_1.z
487
+ .boolean()
488
+ .optional()
489
+ .default(true)
490
+ .describe('Блокировка от повторного запуска'),
491
+ log_execution: zod_1.z.boolean().optional().default(true).describe('Логирование выполнения'),
492
+ })
493
+ .optional()
494
+ .describe('Опции cron'),
495
+ }, async (opts) => {
496
+ const result = (0, cron_tool_js_1.scaffoldCron)(opts);
497
+ return {
498
+ content: [
499
+ {
500
+ type: 'text',
501
+ text: JSON.stringify(result, null, 2),
502
+ },
503
+ ],
504
+ };
505
+ });
506
+ }