coretik-block-generator-mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/CLAUDE_INSTRUCTIONS.md +30 -0
  2. package/README.md +193 -0
  3. package/dist/constants.d.ts +55 -0
  4. package/dist/constants.d.ts.map +1 -0
  5. package/dist/constants.js +27 -0
  6. package/dist/constants.js.map +1 -0
  7. package/dist/conventions.d.ts +19 -0
  8. package/dist/conventions.d.ts.map +1 -0
  9. package/dist/conventions.js +158 -0
  10. package/dist/conventions.js.map +1 -0
  11. package/dist/index.d.ts +9 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +518 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/schemas/learned-conventions.d.ts +53 -0
  16. package/dist/schemas/learned-conventions.d.ts.map +1 -0
  17. package/dist/schemas/learned-conventions.js +47 -0
  18. package/dist/schemas/learned-conventions.js.map +1 -0
  19. package/dist/services/convention-store.d.ts +9 -0
  20. package/dist/services/convention-store.d.ts.map +1 -0
  21. package/dist/services/convention-store.js +84 -0
  22. package/dist/services/convention-store.js.map +1 -0
  23. package/dist/services/feedback.d.ts +29 -0
  24. package/dist/services/feedback.d.ts.map +1 -0
  25. package/dist/services/feedback.js +199 -0
  26. package/dist/services/feedback.js.map +1 -0
  27. package/dist/services/naming.d.ts +51 -0
  28. package/dist/services/naming.d.ts.map +1 -0
  29. package/dist/services/naming.js +87 -0
  30. package/dist/services/naming.js.map +1 -0
  31. package/dist/services/pattern-extractor.d.ts +14 -0
  32. package/dist/services/pattern-extractor.d.ts.map +1 -0
  33. package/dist/services/pattern-extractor.js +310 -0
  34. package/dist/services/pattern-extractor.js.map +1 -0
  35. package/dist/services/registration.d.ts +31 -0
  36. package/dist/services/registration.d.ts.map +1 -0
  37. package/dist/services/registration.js +275 -0
  38. package/dist/services/registration.js.map +1 -0
  39. package/dist/templates/generators.d.ts +59 -0
  40. package/dist/templates/generators.d.ts.map +1 -0
  41. package/dist/templates/generators.js +79 -0
  42. package/dist/templates/generators.js.map +1 -0
  43. package/dist/templates/html-template.d.ts +12 -0
  44. package/dist/templates/html-template.d.ts.map +1 -0
  45. package/dist/templates/html-template.js +189 -0
  46. package/dist/templates/html-template.js.map +1 -0
  47. package/dist/templates/php-class.d.ts +19 -0
  48. package/dist/templates/php-class.d.ts.map +1 -0
  49. package/dist/templates/php-class.js +271 -0
  50. package/dist/templates/php-class.js.map +1 -0
  51. package/dist/templates/scss.d.ts +7 -0
  52. package/dist/templates/scss.d.ts.map +1 -0
  53. package/dist/templates/scss.js +102 -0
  54. package/dist/templates/scss.js.map +1 -0
  55. package/dist/utils.d.ts +18 -0
  56. package/dist/utils.d.ts.map +1 -0
  57. package/dist/utils.js +56 -0
  58. package/dist/utils.js.map +1 -0
  59. package/package.json +48 -0
package/dist/index.js ADDED
@@ -0,0 +1,518 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Coretik Block Generator MCP Server
4
+ *
5
+ * An MCP server that provides tools for generating Coretik Page Builder blocks.
6
+ * Exposes conventions as resources and block generation as tools.
7
+ */
8
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
9
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
10
+ import { z } from 'zod';
11
+ import { join, relative } from 'path';
12
+ import { getFullConventions, getConventionSection, CONVENTIONS } from './conventions.js';
13
+ import { generateBlockPhp, generateTemplate, generateScss, generatePlaceholderSvg, } from './templates/generators.js';
14
+ import { findFiles, readFileSafe, pathExists, writeFileSafe, toPascalCase, toKebabCase } from './utils.js';
15
+ import { loadConventions, saveConventions, mergeConventions } from './services/convention-store.js';
16
+ import { extractPatterns } from './services/pattern-extractor.js';
17
+ import { analyzeFeedback, recordGeneration } from './services/feedback.js';
18
+ import { registerBlock, detectRegistrationFiles } from './services/registration.js';
19
+ // ─── Server Configuration ────────────────────────────────────────────────────
20
+ const PROJECT_ROOT = process.env.CORETIK_PROJECT_ROOT || process.cwd();
21
+ const ROOT_NAMESPACE = process.env.CORETIK_ROOT_NAMESPACE || 'App\\Services\\PageBuilder\\Blocks';
22
+ // Configurable paths (defaults match Coretik Page Builder conventions)
23
+ const PATHS = {
24
+ blocksPhp: process.env.CORETIK_BLOCKS_PHP_DIR || 'src/Services/PageBuilder/Blocks',
25
+ templates: process.env.CORETIK_TEMPLATES_DIR || 'templates/blocks',
26
+ scss: process.env.CORETIK_SCSS_DIR || 'assets/styles/components/blocks',
27
+ thumbnails: process.env.CORETIK_THUMBNAILS_DIR || 'assets/images/admin/acf',
28
+ acfAdmin: process.env.CORETIK_ACF_ADMIN_DIR || 'templates/acf',
29
+ };
30
+ // Registration file paths (auto-detected if not set)
31
+ const LIBRARY_FILE = process.env.CORETIK_LIBRARY_FILE || undefined;
32
+ const SCSS_MAIN_FILE = process.env.CORETIK_SCSS_MAIN_FILE || undefined;
33
+ // ─── MCP Server Setup ────────────────────────────────────────────────────────
34
+ const server = new McpServer({
35
+ name: 'coretik-block-generator',
36
+ version: '1.0.0',
37
+ });
38
+ // ─── Resources ───────────────────────────────────────────────────────────────
39
+ server.resource('conventions', 'coretik://conventions/all', async () => ({
40
+ contents: [{
41
+ uri: 'coretik://conventions/all',
42
+ mimeType: 'text/plain',
43
+ text: getFullConventions(),
44
+ }],
45
+ }));
46
+ for (const [key, value] of Object.entries(CONVENTIONS)) {
47
+ server.resource(`conventions-${key}`, `coretik://conventions/${key}`, async () => ({
48
+ contents: [{
49
+ uri: `coretik://conventions/${key}`,
50
+ mimeType: 'text/plain',
51
+ text: value,
52
+ }],
53
+ }));
54
+ }
55
+ // ─── Tool: get_conventions ───────────────────────────────────────────────────
56
+ server.tool('get_conventions', 'Get Coretik Page Builder conventions and coding patterns. Call this FIRST before generating any block to understand the expected code structure.', {
57
+ section: z.enum([
58
+ 'all', 'overview', 'fileStructure', 'phpClassPattern', 'compositePattern',
59
+ 'templatePattern', 'scssPattern', 'acfFieldTypes', 'namingConventions',
60
+ 'registrationPattern'
61
+ ]).optional().describe('Specific section to retrieve. Defaults to "all".'),
62
+ }, async ({ section }) => {
63
+ let text = section && section !== 'all'
64
+ ? getConventionSection(section)
65
+ : getFullConventions();
66
+ // Append learned project-specific patterns if available
67
+ const learned = await loadConventions(PROJECT_ROOT);
68
+ if (learned) {
69
+ text += '\n\n---\n\n# Project-Specific Patterns (learned)\n\n';
70
+ text += `Analyzed ${learned.blockCount} block(s) on ${learned.learnedAt}\n\n`;
71
+ if (learned.php.imports.length) {
72
+ text += `## Common PHP imports:\n${learned.php.imports.map(i => `- ${i}`).join('\n')}\n\n`;
73
+ }
74
+ if (learned.php.traits.length) {
75
+ text += `## Common traits:\n${learned.php.traits.map(t => `- ${t}`).join('\n')}\n\n`;
76
+ }
77
+ if (learned.scss.spacingVariables.length) {
78
+ text += `## CSS spacing variables:\n${learned.scss.spacingVariables.map(v => `- ${v}`).join('\n')}\n\n`;
79
+ }
80
+ if (learned.fields.commonFieldPatterns.length) {
81
+ text += `## Common field patterns:\n${learned.fields.commonFieldPatterns.slice(0, 10).map(f => `- ${f.name} (${f.type}) — used ${f.frequency}x`).join('\n')}\n\n`;
82
+ }
83
+ text += `Property visibility: ${learned.php.propertyVisibility}\n`;
84
+ text += `Wrapper tag: <${learned.template.wrapperTag}>\n`;
85
+ text += `Layout: ${learned.scss.containerLayout}\n`;
86
+ text += `BEM: ${learned.scss.methodology}\n`;
87
+ }
88
+ return {
89
+ content: [{ type: 'text', text }],
90
+ };
91
+ });
92
+ // ─── Tool: scan_blocks ───────────────────────────────────────────────────────
93
+ server.tool('scan_blocks', 'Scan the current project for existing Coretik Page Builder blocks. Returns a list of all blocks with their type, name, and file paths. Useful to understand existing patterns before generating new blocks.', {
94
+ type: z.enum(['all', 'component', 'block', 'composite']).optional()
95
+ .describe('Filter by block type. Defaults to "all".'),
96
+ }, async ({ type }) => {
97
+ const blocksDir = join(PROJECT_ROOT, PATHS.blocksPhp);
98
+ const phpFiles = await findFiles(blocksDir, /\.php$/);
99
+ const blocks = [];
100
+ for (const file of phpFiles) {
101
+ const content = await readFileSafe(file);
102
+ if (!content)
103
+ continue;
104
+ // Extract block metadata from PHP class
105
+ const nameMatch = content.match(/const\s+NAME\s*=\s*['"]([^'"]+)['"]/);
106
+ const labelMatch = content.match(/const\s+LABEL\s*=\s*['"]([^'"]+)['"]/);
107
+ const classMatch = content.match(/class\s+(\w+)\s+extends\s+(\w+)/);
108
+ if (!nameMatch || !classMatch)
109
+ continue;
110
+ const blockName = nameMatch[1];
111
+ const className = classMatch[1];
112
+ const parentClass = classMatch[2];
113
+ let blockType = 'block';
114
+ if (parentClass.includes('Component') || file.includes('/Component/'))
115
+ blockType = 'component';
116
+ else if (parentClass.includes('Composite') || file.includes('/Composite/'))
117
+ blockType = 'composite';
118
+ if (type && type !== 'all' && blockType !== type)
119
+ continue;
120
+ // Determine the template name from block name
121
+ const templateName = blockName.replace(/^(block|component)\./, '');
122
+ const templateDir = blockType === 'component' ? 'component' : 'block';
123
+ const templatePath = join(PROJECT_ROOT, PATHS.templates, templateDir, `${templateName}.php`);
124
+ const scssPath = join(PROJECT_ROOT, PATHS.scss, `_${templateName}.scss`);
125
+ blocks.push({
126
+ name: blockName,
127
+ type: blockType,
128
+ className,
129
+ path: relative(PROJECT_ROOT, file),
130
+ hasTemplate: await pathExists(templatePath),
131
+ hasScss: await pathExists(scssPath),
132
+ });
133
+ }
134
+ const summary = `Found ${blocks.length} block(s) in ${relative(PROJECT_ROOT, blocksDir)}:\n\n` +
135
+ blocks.map(b => `• [${b.type}] ${b.name} (${b.className})\n` +
136
+ ` PHP: ${b.path}\n` +
137
+ ` Template: ${b.hasTemplate ? '✓' : '✗'} SCSS: ${b.hasScss ? '✓' : '✗'}`).join('\n\n');
138
+ return {
139
+ content: [{ type: 'text', text: summary }],
140
+ };
141
+ });
142
+ // ─── Tool: read_block ────────────────────────────────────────────────────────
143
+ server.tool('read_block', 'Read all files (PHP class, template, SCSS) of an existing block. Use this to understand the coding style of the current project before generating new blocks.', {
144
+ name: z.string().describe('Block name in dot notation (e.g., "block.text-image") or kebab-case (e.g., "text-image").'),
145
+ }, async ({ name }) => {
146
+ // Normalize name
147
+ const cleanName = name.replace(/^(block|component|composite)\./, '');
148
+ const blocksDir = join(PROJECT_ROOT, PATHS.blocksPhp);
149
+ // Find PHP file by searching for the NAME constant
150
+ const phpFiles = await findFiles(blocksDir, /\.php$/);
151
+ let phpContent = null;
152
+ let phpPath = '';
153
+ for (const file of phpFiles) {
154
+ const content = await readFileSafe(file);
155
+ if (content && (content.includes(`'${name}'`) ||
156
+ content.includes(`'block.${cleanName}'`) ||
157
+ content.includes(`'component.${cleanName}'`))) {
158
+ phpContent = content;
159
+ phpPath = relative(PROJECT_ROOT, file);
160
+ break;
161
+ }
162
+ }
163
+ // Find template
164
+ const templatePaths = [
165
+ join(PROJECT_ROOT, PATHS.templates, 'block', `${cleanName}.php`),
166
+ join(PROJECT_ROOT, PATHS.templates, 'component', `${cleanName}.php`),
167
+ ];
168
+ let templateContent = null;
169
+ let templatePath = '';
170
+ for (const tp of templatePaths) {
171
+ const content = await readFileSafe(tp);
172
+ if (content) {
173
+ templateContent = content;
174
+ templatePath = relative(PROJECT_ROOT, tp);
175
+ break;
176
+ }
177
+ }
178
+ // Find SCSS
179
+ const scssFile = join(PROJECT_ROOT, PATHS.scss, `_${cleanName}.scss`);
180
+ const scssContent = await readFileSafe(scssFile);
181
+ const scssPath = await pathExists(scssFile) ? relative(PROJECT_ROOT, scssFile) : '';
182
+ let result = `# Block: ${name}\n\n`;
183
+ if (phpContent) {
184
+ result += `## PHP Class (${phpPath})\n\`\`\`php\n${phpContent}\n\`\`\`\n\n`;
185
+ }
186
+ else {
187
+ result += `## PHP Class: Not found\n\n`;
188
+ }
189
+ if (templateContent) {
190
+ result += `## Template (${templatePath})\n\`\`\`php\n${templateContent}\n\`\`\`\n\n`;
191
+ }
192
+ else {
193
+ result += `## Template: Not found\n\n`;
194
+ }
195
+ if (scssContent) {
196
+ result += `## SCSS (${scssPath})\n\`\`\`scss\n${scssContent}\n\`\`\`\n\n`;
197
+ }
198
+ else {
199
+ result += `## SCSS: Not found\n\n`;
200
+ }
201
+ return {
202
+ content: [{ type: 'text', text: result }],
203
+ };
204
+ });
205
+ // ─── Tool: generate_block ────────────────────────────────────────────────────
206
+ const FieldSchema = z.object({
207
+ name: z.string().describe('Field name in snake_case (e.g., "title", "hero_image")'),
208
+ type: z.enum([
209
+ 'text', 'textarea', 'wysiwyg', 'image', 'file', 'gallery', 'number', 'url',
210
+ 'email', 'link', 'oembed', 'true_false', 'radio', 'select', 'checkbox',
211
+ 'repeater', 'group', 'post_object', 'relationship', 'page_link', 'color_picker',
212
+ ]).describe('ACF field type'),
213
+ label: z.string().describe('Human-readable label for the admin'),
214
+ required: z.boolean().optional().describe('Whether the field is required'),
215
+ instructions: z.string().optional().describe('Help text shown in admin'),
216
+ defaultValue: z.string().optional(),
217
+ returnFormat: z.string().optional().describe('Return format: "id", "url", "array" (for image/link fields)'),
218
+ choices: z.array(z.object({
219
+ value: z.string(),
220
+ label: z.string(),
221
+ })).optional().describe('Choices for radio/select/checkbox fields'),
222
+ width: z.string().optional().describe('Field width in admin (e.g., "50" for 50%)'),
223
+ subFields: z.array(z.lazy(() => FieldSchema)).optional().describe('Sub-fields for group/repeater types'),
224
+ rows: z.number().optional().describe('Number of rows for textarea'),
225
+ mediaUpload: z.boolean().optional().describe('Allow media upload in WYSIWYG'),
226
+ conditional: z.object({
227
+ field: z.string(),
228
+ operator: z.string(),
229
+ value: z.string(),
230
+ }).optional(),
231
+ });
232
+ server.tool('generate_block', `Generate all files for a new Coretik Page Builder block: PHP class, HTML template, SCSS stylesheet, and SVG thumbnail placeholder.
233
+ Call get_conventions FIRST to understand the expected structure.
234
+ You MUST provide a complete block definition with all fields properly defined.`, {
235
+ name: z.string().describe('Block name in kebab-case (e.g., "text-image", "hero-banner")'),
236
+ label: z.string().describe('Human-readable label (e.g., "Texte et image", "Hero banner")'),
237
+ type: z.enum(['component', 'block', 'composite']).describe('Block type'),
238
+ fields: z.array(FieldSchema).describe('Array of ACF field definitions. Required for block and component types.'),
239
+ components: z.array(z.object({
240
+ key: z.string().describe('Component key used in template (e.g., "title", "content")'),
241
+ className: z.string().describe('Component PHP class name (e.g., "TitleComponent")'),
242
+ required: z.boolean().optional(),
243
+ })).optional().describe('Sub-components for composite type blocks'),
244
+ renderingType: z.enum(['Html', 'Array', 'Object']).optional()
245
+ .describe('Rendering type for composite blocks. Defaults to "Html".'),
246
+ gutenberg: z.boolean().optional()
247
+ .describe('Whether to add Gutenberg/block editor support. Defaults to true.'),
248
+ dryRun: z.boolean().optional()
249
+ .describe('If true, returns generated code without writing files. Defaults to false.'),
250
+ }, async ({ name, label, type, fields, components, renderingType, gutenberg, dryRun }) => {
251
+ const kebabName = toKebabCase(name);
252
+ const pascalName = toPascalCase(kebabName);
253
+ const def = {
254
+ name: kebabName,
255
+ label,
256
+ type,
257
+ fields: fields || [],
258
+ components,
259
+ renderingType,
260
+ gutenberg: gutenberg !== false,
261
+ };
262
+ // Load learned conventions to guide generation
263
+ const learned = await loadConventions(PROJECT_ROOT);
264
+ // Generate all file contents
265
+ const phpCode = generateBlockPhp(def, ROOT_NAMESPACE, learned);
266
+ const templateCode = generateTemplate(def, learned);
267
+ const scssCode = generateScss(def, learned);
268
+ const svgCode = generatePlaceholderSvg(def);
269
+ // Determine file paths
270
+ const suffix = type === 'component' ? 'Component' : type === 'composite' ? 'Composite' : 'Block';
271
+ const subDir = type === 'component' ? 'Component' : type === 'composite' ? 'Composite' : 'Block';
272
+ const templateSubDir = type === 'component' ? 'component' : 'block';
273
+ const files = {
274
+ php: join(PROJECT_ROOT, PATHS.blocksPhp, subDir, `${pascalName}${suffix}.php`),
275
+ template: join(PROJECT_ROOT, PATHS.templates, templateSubDir, `${kebabName}.php`),
276
+ scss: join(PROJECT_ROOT, PATHS.scss, `_${kebabName}.scss`),
277
+ thumbnail: join(PROJECT_ROOT, PATHS.thumbnails, `${kebabName}.svg`),
278
+ };
279
+ if (dryRun) {
280
+ let preview = `# Generated files for "${label}" (${type})\n\n`;
281
+ preview += `## 1. PHP Class → ${relative(PROJECT_ROOT, files.php)}\n\`\`\`php\n${phpCode}\`\`\`\n\n`;
282
+ preview += `## 2. Template → ${relative(PROJECT_ROOT, files.template)}\n\`\`\`php\n${templateCode}\`\`\`\n\n`;
283
+ preview += `## 3. SCSS → ${relative(PROJECT_ROOT, files.scss)}\n\`\`\`scss\n${scssCode}\`\`\`\n\n`;
284
+ preview += `## 4. Thumbnail → ${relative(PROJECT_ROOT, files.thumbnail)}\n\`\`\`svg\n${svgCode}\`\`\`\n\n`;
285
+ preview += `---\nSet dryRun: false to write these files to disk.`;
286
+ return { content: [{ type: 'text', text: preview }] };
287
+ }
288
+ // Check for existing files
289
+ const existingFiles = [];
290
+ for (const [key, path] of Object.entries(files)) {
291
+ if (await pathExists(path)) {
292
+ existingFiles.push(`${key}: ${relative(PROJECT_ROOT, path)}`);
293
+ }
294
+ }
295
+ if (existingFiles.length > 0) {
296
+ return {
297
+ content: [{
298
+ type: 'text',
299
+ text: `⚠️ The following files already exist:\n${existingFiles.join('\n')}\n\nUse dryRun: true to preview without overwriting, or delete existing files first.`,
300
+ }],
301
+ };
302
+ }
303
+ // Write files
304
+ const written = [];
305
+ try {
306
+ await writeFileSafe(files.php, phpCode);
307
+ written.push(`✓ PHP: ${relative(PROJECT_ROOT, files.php)}`);
308
+ await writeFileSafe(files.template, templateCode);
309
+ written.push(`✓ Template: ${relative(PROJECT_ROOT, files.template)}`);
310
+ await writeFileSafe(files.scss, scssCode);
311
+ written.push(`✓ SCSS: ${relative(PROJECT_ROOT, files.scss)}`);
312
+ await writeFileSafe(files.thumbnail, svgCode);
313
+ written.push(`✓ Thumbnail: ${relative(PROJECT_ROOT, files.thumbnail)}`);
314
+ }
315
+ catch (error) {
316
+ return {
317
+ content: [{
318
+ type: 'text',
319
+ text: `Error writing files:\n${error}\n\nFiles written before error:\n${written.join('\n')}`,
320
+ }],
321
+ };
322
+ }
323
+ // Record generation manifest for future feedback
324
+ try {
325
+ const conventions = await loadConventions(PROJECT_ROOT) || (await import('./schemas/learned-conventions.js')).createEmptyConventions();
326
+ recordGeneration(conventions, `${type}.${kebabName}`, { php: phpCode, template: templateCode, scss: scssCode });
327
+ await saveConventions(PROJECT_ROOT, conventions);
328
+ }
329
+ catch {
330
+ // Non-critical: don't fail block generation if manifest recording fails
331
+ }
332
+ // Auto-register block in PHP library and SCSS main file
333
+ const registration = await registerBlock({ projectRoot: PROJECT_ROOT, rootNamespace: ROOT_NAMESPACE, libraryFile: LIBRARY_FILE, scssMainFile: SCSS_MAIN_FILE }, pascalName, kebabName, subDir, suffix);
334
+ let summary = `✅ Block "${label}" generated successfully!\n\n`;
335
+ summary += `Files created:\n${written.join('\n')}\n\n`;
336
+ summary += `Registration:\n`;
337
+ if (registration.php.success) {
338
+ summary += `✓ PHP: ${registration.php.message}\n`;
339
+ }
340
+ else {
341
+ summary += `✗ PHP: ${registration.php.message}\n`;
342
+ }
343
+ if (registration.scss.success) {
344
+ summary += `✓ SCSS: ${registration.scss.message}\n`;
345
+ }
346
+ else {
347
+ summary += `✗ SCSS: ${registration.scss.message}\n`;
348
+ }
349
+ if (!registration.php.success || !registration.scss.success) {
350
+ summary += `\n📋 Manual steps needed:\n`;
351
+ if (!registration.php.success) {
352
+ summary += `- Register the block in your page builder library:\n`;
353
+ summary += ` use ${ROOT_NAMESPACE}\\${subDir}\\${pascalName}${suffix};\n`;
354
+ summary += ` $library->add(${pascalName}${suffix}::class);\n\n`;
355
+ }
356
+ if (!registration.scss.success) {
357
+ summary += `- Import the SCSS partial in your main stylesheet:\n`;
358
+ summary += ` @import 'components/blocks/${kebabName}';\n\n`;
359
+ }
360
+ }
361
+ summary += `\nIf using Gutenberg, generate block.json:\n`;
362
+ summary += ` wp page-builder build-block-types\n`;
363
+ return { content: [{ type: 'text', text: summary }] };
364
+ });
365
+ // ─── Tool: get_project_config ────────────────────────────────────────────────
366
+ server.tool('get_project_config', 'Get the current MCP server configuration: project root, file paths, and namespace settings.', {}, async () => {
367
+ const config = {
368
+ projectRoot: PROJECT_ROOT,
369
+ rootNamespace: ROOT_NAMESPACE,
370
+ paths: PATHS,
371
+ };
372
+ // Check which paths exist
373
+ const pathStatus = {};
374
+ for (const [key, path] of Object.entries(PATHS)) {
375
+ pathStatus[key] = await pathExists(join(PROJECT_ROOT, path));
376
+ }
377
+ let text = `# Coretik Block Generator Configuration\n\n`;
378
+ text += `Project root: ${PROJECT_ROOT}\n`;
379
+ text += `Root namespace: ${ROOT_NAMESPACE}\n\n`;
380
+ text += `## Configured paths:\n`;
381
+ for (const [key, path] of Object.entries(PATHS)) {
382
+ const exists = pathStatus[key];
383
+ text += `${exists ? '✓' : '✗'} ${key}: ${path}\n`;
384
+ }
385
+ // Detect registration files
386
+ const regFiles = await detectRegistrationFiles(PROJECT_ROOT, LIBRARY_FILE, SCSS_MAIN_FILE);
387
+ text += `\n## Registration files (auto-detected):\n`;
388
+ text += `${regFiles.libraryFile ? '✓' : '✗'} PHP library: ${regFiles.libraryFile || 'not found'}\n`;
389
+ text += `${regFiles.scssMainFile ? '✓' : '✗'} SCSS main: ${regFiles.scssMainFile || 'not found'}\n`;
390
+ text += `\n## Environment variables:\n`;
391
+ text += `CORETIK_PROJECT_ROOT → Project root directory\n`;
392
+ text += `CORETIK_ROOT_NAMESPACE → PHP namespace for blocks\n`;
393
+ text += `CORETIK_BLOCKS_PHP_DIR → PHP classes directory\n`;
394
+ text += `CORETIK_TEMPLATES_DIR → Template files directory\n`;
395
+ text += `CORETIK_SCSS_DIR → SCSS files directory\n`;
396
+ text += `CORETIK_THUMBNAILS_DIR → ACF thumbnails directory\n`;
397
+ text += `CORETIK_ACF_ADMIN_DIR → ACF admin files directory\n`;
398
+ text += `CORETIK_LIBRARY_FILE → PHP file with $library->add() calls\n`;
399
+ text += `CORETIK_SCSS_MAIN_FILE → Main SCSS file importing block partials\n`;
400
+ return { content: [{ type: 'text', text }] };
401
+ });
402
+ // ─── Tool: register_block ───────────────────────────────────────────────
403
+ server.tool('register_block', 'Register an existing block in the PHP library and SCSS main file. Use this for blocks that were created manually or that are missing from the registration files.', {
404
+ name: z.string().describe('Block name in kebab-case (e.g., "text-image") or dot notation (e.g., "block.text-image").'),
405
+ type: z.enum(['component', 'block', 'composite']).describe('Block type'),
406
+ }, async ({ name, type }) => {
407
+ const cleanName = name.replace(/^(block|component|composite)\./, '');
408
+ const kebabName = toKebabCase(cleanName);
409
+ const pascalName = toPascalCase(kebabName);
410
+ const suffix = type === 'component' ? 'Component' : type === 'composite' ? 'Composite' : 'Block';
411
+ const subDir = type === 'component' ? 'Component' : type === 'composite' ? 'Composite' : 'Block';
412
+ const result = await registerBlock({ projectRoot: PROJECT_ROOT, rootNamespace: ROOT_NAMESPACE, libraryFile: LIBRARY_FILE, scssMainFile: SCSS_MAIN_FILE }, pascalName, kebabName, subDir, suffix);
413
+ let text = `# Registration: ${pascalName}${suffix}\n\n`;
414
+ text += `PHP: ${result.php.success ? '✓' : '✗'} ${result.php.message}\n`;
415
+ text += `SCSS: ${result.scss.success ? '✓' : '✗'} ${result.scss.message}\n`;
416
+ return { content: [{ type: 'text', text }] };
417
+ });
418
+ // ─── Tool: learn_conventions ─────────────────────────────────────────────
419
+ server.tool('learn_conventions', 'Scan all existing blocks in the project and learn coding patterns (PHP imports, traits, template structure, SCSS conventions, field patterns). Stores results in .coretik-conventions.json so future generations match the project style.', {
420
+ force: z.boolean().optional()
421
+ .describe('Re-scan even if conventions already exist. Defaults to false.'),
422
+ }, async ({ force }) => {
423
+ const existing = await loadConventions(PROJECT_ROOT);
424
+ if (existing && !force) {
425
+ return {
426
+ content: [{
427
+ type: 'text',
428
+ text: `Conventions already learned (${existing.blockCount} blocks, last scan: ${existing.learnedAt}).\n\nUse force: true to re-scan.\n\n` +
429
+ formatConventionsSummary(existing),
430
+ }],
431
+ };
432
+ }
433
+ const incoming = await extractPatterns(PROJECT_ROOT, PATHS);
434
+ const conventions = existing
435
+ ? mergeConventions(existing, incoming)
436
+ : incoming;
437
+ await saveConventions(PROJECT_ROOT, conventions);
438
+ return {
439
+ content: [{
440
+ type: 'text',
441
+ text: `✅ Learned conventions from ${conventions.blockCount} block(s).\nStored in .coretik-conventions.json\n\n` +
442
+ formatConventionsSummary(conventions),
443
+ }],
444
+ };
445
+ });
446
+ // ─── Tool: feedback_block ───────────────────────────────────────────────
447
+ server.tool('feedback_block', 'Compare a generated block against its current state to detect manual edits. Learns from the edits to improve future generations. Call this after manually refining a generated block.', {
448
+ name: z.string().describe('Block name in dot notation (e.g., "block.text-image") or kebab-case (e.g., "text-image").'),
449
+ }, async ({ name }) => {
450
+ const conventions = await loadConventions(PROJECT_ROOT);
451
+ if (!conventions) {
452
+ return {
453
+ content: [{
454
+ type: 'text',
455
+ text: 'No conventions file found. Run learn_conventions first, then generate a block, then use feedback_block to detect edits.',
456
+ }],
457
+ };
458
+ }
459
+ const result = await analyzeFeedback(name, PROJECT_ROOT, PATHS, conventions);
460
+ // If patterns were learned, update conventions
461
+ if (result.learnedPatterns.length > 0) {
462
+ // Re-scan to incorporate feedback properly
463
+ const freshScan = await extractPatterns(PROJECT_ROOT, PATHS);
464
+ const merged = mergeConventions(conventions, freshScan);
465
+ await saveConventions(PROJECT_ROOT, merged);
466
+ }
467
+ return {
468
+ content: [{ type: 'text', text: result.summary }],
469
+ };
470
+ });
471
+ // ─── Helpers ─────────────────────────────────────────────────────────────
472
+ function formatConventionsSummary(c) {
473
+ const lines = [];
474
+ lines.push(`## PHP`);
475
+ lines.push(`- Property visibility: ${c.php.propertyVisibility}`);
476
+ lines.push(`- useSettingsOn pattern: ${c.php.useSettingsPattern ? 'yes' : 'no'}`);
477
+ if (c.php.imports.length)
478
+ lines.push(`- Common imports (${c.php.imports.length}): ${c.php.imports.slice(0, 5).join(', ')}${c.php.imports.length > 5 ? '…' : ''}`);
479
+ if (c.php.traits.length)
480
+ lines.push(`- Traits: ${c.php.traits.join(', ')}`);
481
+ if (c.php.interfaces.length)
482
+ lines.push(`- Interfaces: ${c.php.interfaces.join(', ')}`);
483
+ if (c.php.extraMethods.length)
484
+ lines.push(`- Extra methods: ${c.php.extraMethods.join(', ')}`);
485
+ lines.push(`\n## Templates`);
486
+ lines.push(`- Wrapper tag: <${c.template.wrapperTag}>`);
487
+ lines.push(`- Empty check: ${c.template.emptyCheckStyle}`);
488
+ lines.push(`- Image function: ${c.template.imageRenderFunction}`);
489
+ lines.push(`\n## SCSS`);
490
+ lines.push(`- Methodology: ${c.scss.methodology}`);
491
+ lines.push(`- Layout: ${c.scss.containerLayout}`);
492
+ if (c.scss.spacingVariables.length)
493
+ lines.push(`- Spacing vars: ${c.scss.spacingVariables.join(', ')}`);
494
+ if (c.scss.breakpoints.length)
495
+ lines.push(`- Breakpoints: ${c.scss.breakpoints.join(', ')}`);
496
+ if (c.fields.commonFieldPatterns.length) {
497
+ lines.push(`\n## Common fields`);
498
+ for (const f of c.fields.commonFieldPatterns.slice(0, 10)) {
499
+ lines.push(`- ${f.name} (${f.type}) — ${f.frequency}x`);
500
+ }
501
+ }
502
+ const genCount = Object.keys(c.generations).length;
503
+ if (genCount > 0) {
504
+ lines.push(`\n## Generations tracked: ${genCount}`);
505
+ }
506
+ return lines.join('\n');
507
+ }
508
+ // ─── Start Server ────────────────────────────────────────────────────────────
509
+ async function main() {
510
+ const transport = new StdioServerTransport();
511
+ await server.connect(transport);
512
+ console.error('Coretik Block Generator MCP Server running on stdio');
513
+ }
514
+ main().catch((error) => {
515
+ console.error('Fatal error:', error);
516
+ process.exit(1);
517
+ });
518
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Schema for learned conventions stored in .coretik-conventions.json
3
+ */
4
+ export interface LearnedConventions {
5
+ version: number;
6
+ learnedAt: string;
7
+ blockCount: number;
8
+ php: {
9
+ imports: string[];
10
+ traits: string[];
11
+ interfaces: string[];
12
+ baseClasses: Record<string, string>;
13
+ propertyVisibility: 'protected' | 'private' | 'public';
14
+ useSettingsPattern: boolean;
15
+ extraMethods: string[];
16
+ };
17
+ template: {
18
+ wrapperTag: string;
19
+ wrapperAttributes: string[];
20
+ escapingFunctions: Record<string, string[]>;
21
+ emptyCheckStyle: string;
22
+ imageRenderFunction: string;
23
+ htmlSnippets: string[];
24
+ };
25
+ scss: {
26
+ methodology: string;
27
+ containerLayout: string;
28
+ spacingVariables: string[];
29
+ colorVariables: string[];
30
+ breakpoints: string[];
31
+ };
32
+ naming: {
33
+ blockNamePrefix: Record<string, string>;
34
+ classNameSuffix: Record<string, string>;
35
+ bemSuffix: Record<string, string>;
36
+ templateSubDir: Record<string, string>;
37
+ };
38
+ fields: {
39
+ commonFieldPatterns: Array<{
40
+ name: string;
41
+ type: string;
42
+ frequency: number;
43
+ }>;
44
+ imageReturnFormat: string;
45
+ linkReturnFormat: string;
46
+ };
47
+ generations: Record<string, {
48
+ generatedAt: string;
49
+ files: Record<string, string>;
50
+ }>;
51
+ }
52
+ export declare function createEmptyConventions(): LearnedConventions;
53
+ //# sourceMappingURL=learned-conventions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learned-conventions.d.ts","sourceRoot":"","sources":["../../src/schemas/learned-conventions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IAEnB,GAAG,EAAE;QACH,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACpC,kBAAkB,EAAE,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;QACvD,kBAAkB,EAAE,OAAO,CAAC;QAC5B,YAAY,EAAE,MAAM,EAAE,CAAC;KACxB,CAAC;IAEF,QAAQ,EAAE;QACR,UAAU,EAAE,MAAM,CAAC;QACnB,iBAAiB,EAAE,MAAM,EAAE,CAAC;QAC5B,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5C,eAAe,EAAE,MAAM,CAAC;QACxB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,YAAY,EAAE,MAAM,EAAE,CAAC;KACxB,CAAC;IAEF,IAAI,EAAE;QACJ,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,EAAE,MAAM,CAAC;QACxB,gBAAgB,EAAE,MAAM,EAAE,CAAC;QAC3B,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,WAAW,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC;IAEF,MAAM,EAAE;QACN,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACxC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACxC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAClC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACxC,CAAC;IAEF,MAAM,EAAE;QACN,mBAAmB,EAAE,KAAK,CAAC;YACzB,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;YACb,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC,CAAC;QACH,iBAAiB,EAAE,MAAM,CAAC;QAC1B,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;IAEF,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE;QAC1B,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC/B,CAAC,CAAC;CACJ;AAED,wBAAgB,sBAAsB,IAAI,kBAAkB,CA0C3D"}