@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,665 @@
1
+ "use strict";
2
+ /**
3
+ * @fileoverview Template scaffolding tool for InstantCMS
4
+ * Generates complete templates with layouts, styles, and dark mode support
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.templateToolSchema = void 0;
8
+ exports.scaffoldTemplate = scaffoldTemplate;
9
+ const zod_1 = require("zod");
10
+ const scaffold_1 = require("../types/scaffold");
11
+ /**
12
+ * Generates template manifest
13
+ */
14
+ function generateManifest(name, Name, options) {
15
+ return `<?php
16
+ // InstantCMS 2. manifest.json
17
+
18
+ return [
19
+ 'type' => 'template',
20
+ 'name' => '${name}',
21
+ 'title' => '${Name}',
22
+ 'description' => '${Name} template for InstantCMS 2',
23
+ 'author' => '',
24
+ 'version' => '1.0.0',
25
+ 'created_at' => '${new Date().toISOString().split('T')[0]}',
26
+ 'min_version' => '2.15.0',
27
+ 'supports' => [
28
+ 'responsive' => ${options.with_responsive},
29
+ 'dark_mode' => ${options.with_dark_mode},
30
+ 'rtl' => ${options.withRTL},
31
+ ],
32
+ 'options' => [
33
+ 'color_primary' => '#007bff',
34
+ 'color_secondary' => '#6c757d',
35
+ 'color_success' => '#28a745',
36
+ 'color_danger' => '#dc3545',
37
+ 'color_warning' => '#ffc107',
38
+ 'font_family' => 'system-ui, -apple-system, sans-serif',
39
+ ],
40
+ 'layouts' => [
41
+ 'default',
42
+ 'boxed',
43
+ 'fullwidth',
44
+ ],
45
+ 'regions' => [
46
+ 'top',
47
+ 'nav',
48
+ 'header',
49
+ 'content',
50
+ 'sidebar',
51
+ 'bottom',
52
+ 'footer',
53
+ ],
54
+ ];`;
55
+ }
56
+ /**
57
+ * Generates main template file
58
+ */
59
+ function generateMainTemplate(name, _Name, blocks, options) {
60
+ const headerClass = blocks.find(b => b.name === 'header')?.class || 'bg-white';
61
+ const navbarClass = blocks.find(b => b.name === 'navbar')?.class || 'navbar navbar-expand-lg navbar-light bg-white';
62
+ const contentClass = blocks.find(b => b.name === 'content')?.class || 'py-4';
63
+ const footerClass = blocks.find(b => b.name === 'footer')?.class || 'bg-light py-4';
64
+ return `<?php
65
+ // InstantCMS 2. ${name}/main.tpl.php
66
+
67
+ \\$template = cmsTemplate::getInstance();
68
+ \\$widgets = cmsWidgets::getInstance();
69
+ \\$config = cmsConfig::getInstance();
70
+
71
+ \\$body_class = [];
72
+ \\$body_class[] = 'template-${name}';
73
+ <?php if (\\$template->hasOption('dark_mode')): ?>
74
+ \\$body_class[] = \\$template->getOption('dark_mode') ? 'dark-mode' : '';
75
+ <?php endif; ?>
76
+ ?>
77
+
78
+ <!DOCTYPE html>
79
+ <html lang="<?php echo \\$config->language; ?>"<?php echo ${options.withRTL} ? ' dir="rtl"' : ''; ?>>
80
+ <head>
81
+ <meta charset="UTF-8">
82
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
83
+ <meta http-equiv="X-UA-Compatible" content="ie=edge">
84
+
85
+ <title><?php echo \\$page_title; ?></title>
86
+ <meta name="description" content="<?php echo \\$page_description ?? ''; ?>">
87
+
88
+ <?php echo \\$template->getHead(); ?>
89
+
90
+ <link rel="stylesheet" href="<?php echo \\$template->getAssetUrl('main.css'); ?>">
91
+
92
+ <?php if (${options.with_dark_mode}): ?>
93
+ <link rel="stylesheet" href="<?php echo \\$template->getAssetUrl('dark.css'); ?>" media="(prefers-color-scheme: dark)">
94
+ <?php endif; ?>
95
+ </head>
96
+ <body class="<?php echo implode(' ', \\$body_class); ?>">
97
+
98
+ <div id="wrapper" class="<?php echo \\$template->getLayoutClass(); ?>">
99
+
100
+ <?php echo \\$widgets->renderPosition('top'); ?>
101
+
102
+ <header id="header" class="${headerClass}">
103
+ <div class="container">
104
+ <?php echo \\$widgets->renderPosition('header'); ?>
105
+ </div>
106
+ </header>
107
+
108
+ <nav id="navbar" class="${navbarClass}">
109
+ <div class="container">
110
+ <?php echo \\$widgets->renderPosition('nav'); ?>
111
+ </div>
112
+ </nav>
113
+
114
+ <main id="main-content" class="${contentClass}">
115
+ <div class="container">
116
+ <div class="row">
117
+ <div class="col-lg-8">
118
+ <?php echo \\$template->getBreadcrumbs(); ?>
119
+ <?php echo \\$page_content; ?>
120
+ </div>
121
+ <aside class="col-lg-4">
122
+ <?php echo \\$widgets->renderPosition('sidebar'); ?>
123
+ </aside>
124
+ </div>
125
+ </div>
126
+ </main>
127
+
128
+ <footer id="footer" class="${footerClass}">
129
+ <div class="container">
130
+ <?php echo \\$widgets->renderPosition('footer'); ?>
131
+ <div class="text-center text-muted">
132
+ &copy; <?php echo date('Y'); ?> <?php echo \\$config->sitename; ?>
133
+ </div>
134
+ </div>
135
+ </footer>
136
+
137
+ </div>
138
+
139
+ <script src="<?php echo \\$template->getAssetUrl('assets/js/app.js'); ?>"></script>
140
+
141
+ <?php echo \\$template->getBodyEnd(); ?>
142
+ </body>
143
+ </html>
144
+ `;
145
+ }
146
+ /**
147
+ * Generates main CSS file
148
+ */
149
+ function generateMainCSS(name, options) {
150
+ return `/* InstantCMS 2. ${name} - Main Styles */
151
+
152
+ :root {
153
+ --color-primary: #007bff;
154
+ --color-secondary: #6c757d;
155
+ --color-success: #28a745;
156
+ --color-danger: #dc3545;
157
+ --color-warning: #ffc107;
158
+ --color-info: #17a2b8;
159
+ --font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
160
+ --font-size-base: 1rem;
161
+ --line-height-base: 1.5;
162
+ --border-radius: 0.25rem;
163
+ --border-color: #dee2e6;
164
+ --shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
165
+ --shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
166
+ --shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);
167
+ --transition-base: all 0.2s ease-in-out;
168
+ }
169
+
170
+ *, *::before, *::after {
171
+ box-sizing: border-box;
172
+ }
173
+
174
+ html {
175
+ font-size: 16px;
176
+ -webkit-text-size-adjust: 100%;
177
+ }
178
+
179
+ body {
180
+ margin: 0;
181
+ font-family: var(--font-family);
182
+ font-size: var(--font-size-base);
183
+ line-height: var(--line-height-base);
184
+ color: #212529;
185
+ background-color: #fff;
186
+ }
187
+
188
+ h1, h2, h3, h4, h5, h6 {
189
+ margin: 0 0 0.5rem 0;
190
+ font-weight: 500;
191
+ line-height: 1.2;
192
+ }
193
+
194
+ p {
195
+ margin: 0 0 1rem 0;
196
+ }
197
+
198
+ a {
199
+ color: var(--color-primary);
200
+ text-decoration: none;
201
+ }
202
+
203
+ a:hover {
204
+ text-decoration: underline;
205
+ }
206
+
207
+ #wrapper {
208
+ min-height: 100vh;
209
+ display: flex;
210
+ flex-direction: column;
211
+ }
212
+
213
+ #main-content {
214
+ flex: 1;
215
+ padding: 2rem 0;
216
+ }
217
+
218
+ .container {
219
+ width: 100%;
220
+ max-width: 1200px;
221
+ margin: 0 auto;
222
+ padding: 0 15px;
223
+ }
224
+
225
+ #header {
226
+ padding: 1rem 0;
227
+ border-bottom: 1px solid var(--border-color);
228
+ }
229
+
230
+ #navbar {
231
+ padding: 0.5rem 0;
232
+ border-bottom: 1px solid var(--border-color);
233
+ }
234
+
235
+ #footer {
236
+ margin-top: auto;
237
+ padding: 2rem 0;
238
+ border-top: 1px solid var(--border-color);
239
+ }
240
+
241
+ .row {
242
+ display: flex;
243
+ flex-wrap: wrap;
244
+ margin: 0 -15px;
245
+ }
246
+
247
+ .col {
248
+ flex: 1;
249
+ padding: 0 15px;
250
+ }
251
+
252
+ .col-lg-8 {
253
+ flex: 0 0 66.666667%;
254
+ max-width: 66.666667%;
255
+ }
256
+
257
+ .col-lg-4 {
258
+ flex: 0 0 33.333333%;
259
+ max-width: 33.333333%;
260
+ }
261
+
262
+ <?php if (${options.with_responsive}): ?>
263
+ @media (max-width: 991px) {
264
+ .col-lg-8,
265
+ .col-lg-4 {
266
+ flex: 0 0 100%;
267
+ max-width: 100%;
268
+ }
269
+ }
270
+ <?php endif; ?>
271
+
272
+ .text-center { text-align: center; }
273
+ .text-muted { color: #6c757d; }
274
+ .bg-light { background-color: #f8f9fa; }
275
+ .bg-white { background-color: #fff; }
276
+ .py-4 { padding-top: 1.5rem; padding-bottom: 1.5rem; }
277
+ .mb-3 { margin-bottom: 1rem; }
278
+ `;
279
+ }
280
+ /**
281
+ * Generates variables JSON
282
+ */
283
+ function generateVariables(name, Name) {
284
+ return JSON.stringify({
285
+ name: name,
286
+ title: Name,
287
+ version: '1.0.0',
288
+ colors: {
289
+ primary: '#007bff',
290
+ secondary: '#6c757d',
291
+ success: '#28a745',
292
+ danger: '#dc3545',
293
+ warning: '#ffc107',
294
+ info: '#17a2b8',
295
+ },
296
+ fonts: {
297
+ base: 'system-ui, -apple-system, sans-serif',
298
+ heading: 'inherit',
299
+ },
300
+ spacing: {
301
+ xs: '0.25rem',
302
+ sm: '0.5rem',
303
+ md: '1rem',
304
+ lg: '1.5rem',
305
+ xl: '3rem',
306
+ },
307
+ breakpoints: {
308
+ sm: '576px',
309
+ md: '768px',
310
+ lg: '992px',
311
+ xl: '1200px',
312
+ },
313
+ }, null, 2);
314
+ }
315
+ /**
316
+ * Generates layout YAML
317
+ */
318
+ function generateLayoutYAML(name, blocks) {
319
+ const rows = blocks
320
+ .map((b, i) => {
321
+ return ` - id: row_${i + 1}
322
+ title: "${b.name}"
323
+ class: "${b.class || ''}"
324
+ cols:
325
+ - position: ${b.position}
326
+ width: col-12`;
327
+ })
328
+ .join('\n');
329
+ return `# InstantCMS 2 Layout Scheme
330
+ name: ${name}
331
+ title: ${name} Layout
332
+ ${rows}
333
+ `;
334
+ }
335
+ /**
336
+ * Generates header template
337
+ */
338
+ function generateHeaderTemplate(name, _Name) {
339
+ return `<?php
340
+ // InstantCMS 2. ${name}/header.tpl.php
341
+
342
+ \\$template = cmsTemplate::getInstance();
343
+ \\$config = cmsConfig::getInstance();
344
+ ?>
345
+ <header class="site-header">
346
+ <div class="header-content">
347
+ <a href="<?php echo \\$config->root_url; ?>" class="logo">
348
+ <?php echo \\$config->sitename; ?>
349
+ </a>
350
+
351
+ <nav class="header-nav">
352
+ <?php echo \\$template->renderMenu('header'); ?>
353
+ </nav>
354
+ </div>
355
+ </header>
356
+ `;
357
+ }
358
+ /**
359
+ * Generates footer template
360
+ */
361
+ function generateFooterTemplate(name, _Name) {
362
+ return `<?php
363
+ // InstantCMS 2. ${name}/footer.tpl.php
364
+
365
+ \\$config = cmsConfig::getInstance();
366
+ ?>
367
+ <footer class="site-footer">
368
+ <div class="footer-content">
369
+ <div class="footer-copyright">
370
+ &copy; <?php echo date('Y'); ?> <?php echo \\$config->sitename; ?>
371
+ </div>
372
+
373
+ <nav class="footer-nav">
374
+ <?php echo cmsTemplate::getInstance()->renderMenu('footer'); ?>
375
+ </nav>
376
+ </div>
377
+ </footer>
378
+ `;
379
+ }
380
+ /**
381
+ * Generates sidebar template
382
+ */
383
+ function generateSidebarTemplate(name, _Name) {
384
+ return `<?php
385
+ // InstantCMS 2. ${name}/sidebar.tpl.php
386
+
387
+ \\$widgets = cmsWidgets::getInstance();
388
+ ?>
389
+ <aside class="sidebar">
390
+ <?php echo \\$widgets->renderPosition('sidebar'); ?>
391
+ </aside>
392
+ `;
393
+ }
394
+ /**
395
+ * Generates JavaScript file
396
+ */
397
+ function generateJS(name) {
398
+ return `// InstantCMS 2. ${name} - Main JavaScript
399
+
400
+ (function() {
401
+ 'use strict';
402
+
403
+ document.addEventListener('DOMContentLoaded', function() {
404
+ console.log('${name} template loaded');
405
+
406
+ initNavigation();
407
+ initDarkMode();
408
+ });
409
+
410
+ function initNavigation() {
411
+ const nav = document.querySelector('.navbar');
412
+ if (nav) {
413
+ window.addEventListener('scroll', function() {
414
+ if (window.scrollY > 50) {
415
+ nav.classList.add('scrolled');
416
+ } else {
417
+ nav.classList.remove('scrolled');
418
+ }
419
+ });
420
+ }
421
+ }
422
+
423
+ function initDarkMode() {
424
+ const toggle = document.querySelector('[data-theme-toggle]');
425
+ if (toggle) {
426
+ toggle.addEventListener('click', function() {
427
+ document.body.classList.toggle('dark-mode');
428
+ const isDark = document.body.classList.contains('dark-mode');
429
+ localStorage.setItem('darkMode', isDark);
430
+ });
431
+
432
+ if (localStorage.getItem('darkMode') === 'true') {
433
+ document.body.classList.add('dark-mode');
434
+ }
435
+ }
436
+ }
437
+
438
+ })();
439
+ `;
440
+ }
441
+ /**
442
+ * Generates components CSS
443
+ */
444
+ function generateComponentsCSS(name, _options) {
445
+ return `/* InstantCMS 2. ${name} - Component Styles */
446
+
447
+ .btn {
448
+ display: inline-block;
449
+ padding: 0.375rem 0.75rem;
450
+ font-size: 1rem;
451
+ font-weight: 400;
452
+ line-height: 1.5;
453
+ text-align: center;
454
+ white-space: nowrap;
455
+ vertical-align: middle;
456
+ border: 1px solid transparent;
457
+ border-radius: var(--border-radius);
458
+ cursor: pointer;
459
+ transition: var(--transition-base);
460
+ }
461
+
462
+ .btn-primary {
463
+ color: #fff;
464
+ background-color: var(--color-primary);
465
+ border-color: var(--color-primary);
466
+ }
467
+
468
+ .btn-primary:hover {
469
+ background-color: #0056b3;
470
+ border-color: #0056b3;
471
+ }
472
+
473
+ .card {
474
+ position: relative;
475
+ flex-direction: column;
476
+ min-width: 0;
477
+ word-wrap: break-word;
478
+ background-color: #fff;
479
+ border: 1px solid var(--border-color);
480
+ border-radius: var(--border-radius);
481
+ }
482
+
483
+ .card-body {
484
+ flex: 1 1 auto;
485
+ padding: 1.25rem;
486
+ }
487
+
488
+ .form-group {
489
+ margin-bottom: 1rem;
490
+ }
491
+
492
+ .form-control {
493
+ display: block;
494
+ width: 100%;
495
+ padding: 0.375rem 0.75rem;
496
+ font-size: 1rem;
497
+ line-height: 1.5;
498
+ color: #495057;
499
+ background-color: #fff;
500
+ border: 1px solid #ced4da;
501
+ border-radius: var(--border-radius);
502
+ transition: border-color 0.15s ease-in-out;
503
+ }
504
+
505
+ .form-control:focus {
506
+ border-color: var(--color-primary);
507
+ outline: 0;
508
+ }
509
+
510
+ .alert {
511
+ position: relative;
512
+ padding: 0.75rem 1.25rem;
513
+ margin-bottom: 1rem;
514
+ border: 1px solid transparent;
515
+ border-radius: var(--border-radius);
516
+ }
517
+
518
+ .alert-success {
519
+ color: #155724;
520
+ background-color: #d4edda;
521
+ border-color: #c3e6cb;
522
+ }
523
+ `;
524
+ }
525
+ /**
526
+ * Generates dark mode CSS
527
+ */
528
+ function generateDarkModeCSS(name) {
529
+ return `/* InstantCMS 2. ${name} - Dark Mode Styles */
530
+
531
+ @media (prefers-color-scheme: dark) {
532
+ :root {
533
+ --color-primary: #4d9fff;
534
+ --color-secondary: #868e96;
535
+ --color-success: #51cf66;
536
+ --color-danger: #ff6b6b;
537
+ --color-warning: #fcc419;
538
+ --color-info: #22b8cf;
539
+ }
540
+
541
+ body {
542
+ color: #dee2e6;
543
+ background-color: #1a1a1a;
544
+ }
545
+
546
+ #header,
547
+ #navbar {
548
+ background-color: #2d2d2d !important;
549
+ border-color: #404040 !important;
550
+ }
551
+
552
+ #footer {
553
+ background-color: #2d2d2d !important;
554
+ border-color: #404040 !important;
555
+ }
556
+
557
+ .bg-light,
558
+ .bg-white {
559
+ background-color: #2d2d2d !important;
560
+ }
561
+
562
+ .text-muted {
563
+ color: #868e96 !important;
564
+ }
565
+
566
+ .card {
567
+ background-color: #2d2d2d;
568
+ border-color: #404040;
569
+ }
570
+
571
+ .form-control {
572
+ color: #dee2e6;
573
+ background-color: #323232;
574
+ border-color: #495057;
575
+ }
576
+ }
577
+ `;
578
+ }
579
+ /**
580
+ * Generates a complete template for InstantCMS
581
+ *
582
+ * @param opts - Configuration options for the template
583
+ * @returns Object containing generated files and metadata
584
+ *
585
+ * @example
586
+ * ```typescript
587
+ * const result = scaffoldTemplate({
588
+ * template_name: 'mytheme',
589
+ * options: { with_layout: true, with_responsive: true, with_dark_mode: true }
590
+ * });
591
+ * ```
592
+ */
593
+ function scaffoldTemplate(opts) {
594
+ const { lowercase, UpperCamelCase } = (0, scaffold_1.normalizeAddonName)(opts.template_name);
595
+ const files = {};
596
+ const options = {
597
+ with_layout: opts.options?.with_layout ?? true,
598
+ with_responsive: opts.options?.with_responsive ?? true,
599
+ with_dark_mode: opts.options?.with_dark_mode ?? false,
600
+ withRTL: opts.options?.withRTL ?? false,
601
+ };
602
+ const layout_blocks = opts.layout_blocks || [
603
+ { name: 'header', position: 'top', class: 'bg-white' },
604
+ { name: 'navbar', position: 'nav', class: 'navbar-expand-lg' },
605
+ { name: 'content', position: 'content', class: 'main-content' },
606
+ { name: 'sidebar', position: 'right', class: 'sidebar' },
607
+ { name: 'footer', position: 'bottom', class: 'bg-light' },
608
+ ];
609
+ files[`${lowercase}/manifest.json`] = generateManifest(lowercase, UpperCamelCase, options);
610
+ files[`${lowercase}/main.tpl.php`] = generateMainTemplate(lowercase, UpperCamelCase, layout_blocks, options);
611
+ files[`${lowercase}/main.css`] = generateMainCSS(lowercase, options);
612
+ files[`${lowercase}/variables.json`] = generateVariables(lowercase, UpperCamelCase);
613
+ if (options.with_layout) {
614
+ files[`${lowercase}/layout.yaml`] = generateLayoutYAML(lowercase, layout_blocks);
615
+ }
616
+ files[`${lowercase}/header.tpl.php`] = generateHeaderTemplate(lowercase, UpperCamelCase);
617
+ files[`${lowercase}/footer.tpl.php`] = generateFooterTemplate(lowercase, UpperCamelCase);
618
+ files[`${lowercase}/sidebar.tpl.php`] = generateSidebarTemplate(lowercase, UpperCamelCase);
619
+ files[`${lowercase}/assets/js/app.js`] = generateJS(lowercase);
620
+ files[`${lowercase}/assets/css/components.css`] = generateComponentsCSS(lowercase, options);
621
+ if (options.with_dark_mode) {
622
+ files[`${lowercase}/dark.css`] = generateDarkModeCSS(lowercase);
623
+ }
624
+ return {
625
+ addon_name: lowercase,
626
+ files,
627
+ template_name: lowercase,
628
+ options,
629
+ blocks_count: layout_blocks.length,
630
+ };
631
+ }
632
+ exports.templateToolSchema = {
633
+ name: 'scaffold_template',
634
+ description: 'Генерация темы шаблона InstantCMS с layout, стилями и поддержкой dark mode',
635
+ inputSchema: {
636
+ type: 'object',
637
+ properties: {
638
+ template_name: { type: 'string', description: 'Имя шаблона' },
639
+ options: zod_1.z
640
+ .object({
641
+ with_layout: zod_1.z.boolean().optional().describe('С layout.yaml'),
642
+ with_responsive: zod_1.z.boolean().optional().describe('Адаптивный дизайн'),
643
+ with_dark_mode: zod_1.z.boolean().optional().describe('Тёмная тема'),
644
+ withRTL: zod_1.z.boolean().optional().describe('RTL поддержка'),
645
+ })
646
+ .optional()
647
+ .describe('Опции'),
648
+ layout_blocks: zod_1.z
649
+ .array(zod_1.z.object({
650
+ name: zod_1.z.string().describe('Название блока'),
651
+ position: zod_1.z.string().describe('Позиция виджетов'),
652
+ class: zod_1.z.string().optional().describe('CSS класс'),
653
+ }))
654
+ .optional()
655
+ .describe('Блоки layout'),
656
+ },
657
+ required: ['template_name'],
658
+ },
659
+ inputExamples: [
660
+ {
661
+ template_name: 'mytheme',
662
+ options: { with_layout: true, with_responsive: true, with_dark_mode: true },
663
+ },
664
+ ],
665
+ };