@imenam/mcp-design 1.0.3 → 1.0.5

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 (46) hide show
  1. package/README.md +61 -8
  2. package/dist/shared/icons/icon-data.d.ts +2 -0
  3. package/dist/shared/icons/icon-data.js +5 -0
  4. package/dist/shared/icons/icon-keywords.d.ts +1 -0
  5. package/dist/shared/icons/icon-keywords.js +4 -0
  6. package/dist/shared/icons/index.d.ts +47 -0
  7. package/dist/shared/icons/index.js +107 -0
  8. package/dist/shared/icons/search.d.ts +31 -0
  9. package/dist/shared/icons/search.js +104 -0
  10. package/dist/shared/instances.d.ts +39 -0
  11. package/dist/shared/instances.js +94 -0
  12. package/dist/shared/node-defaults.d.ts +2 -0
  13. package/dist/shared/node-defaults.js +32 -4
  14. package/dist/shared/node-fields.d.ts +2 -0
  15. package/dist/shared/node-fields.js +17 -4
  16. package/dist/shared/render.d.ts +34 -1
  17. package/dist/shared/render.js +80 -7
  18. package/dist/shared/schemas/design.schema.d.ts +19 -1
  19. package/dist/shared/schemas/design.schema.js +13 -1
  20. package/dist/src/core/clone.d.ts +23 -0
  21. package/dist/src/core/clone.js +34 -0
  22. package/dist/src/core/diff.js +2 -2
  23. package/dist/src/core/export.js +69 -4
  24. package/dist/src/core/hierarchy.d.ts +7 -0
  25. package/dist/src/core/hierarchy.js +75 -5
  26. package/dist/src/core/node-factory.js +55 -5
  27. package/dist/src/core/screenshot.d.ts +12 -0
  28. package/dist/src/core/screenshot.js +17 -6
  29. package/dist/src/index.js +97 -7
  30. package/dist/src/tools/add-nodes.js +7 -1
  31. package/dist/src/tools/delete-nodes.js +10 -1
  32. package/dist/src/tools/detach-instances.d.ts +14 -0
  33. package/dist/src/tools/detach-instances.js +61 -0
  34. package/dist/src/tools/duplicate-nodes.js +20 -28
  35. package/dist/src/tools/search-icons.d.ts +12 -0
  36. package/dist/src/tools/search-icons.js +87 -0
  37. package/dist/src/tools/ungroup-nodes.js +8 -0
  38. package/dist/src/version.d.ts +1 -1
  39. package/dist/src/version.js +1 -1
  40. package/gui/dist/assets/{index-C6fXmzfu.css → index-BIeiaHA2.css} +1 -1
  41. package/gui/dist/assets/index-Dpd_cZgh.js +10 -0
  42. package/gui/dist/assets/search--VtHhIew.js +1 -0
  43. package/gui/dist/index.html +2 -2
  44. package/package.json +4 -2
  45. package/scripts/generate-icons.js +85 -0
  46. package/gui/dist/assets/index-ffF8_vFp.js +0 -10
@@ -4,8 +4,8 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>MCP Design</title>
7
- <script type="module" crossorigin src="./assets/index-ffF8_vFp.js"></script>
8
- <link rel="stylesheet" crossorigin href="./assets/index-C6fXmzfu.css">
7
+ <script type="module" crossorigin src="./assets/index-Dpd_cZgh.js"></script>
8
+ <link rel="stylesheet" crossorigin href="./assets/index-BIeiaHA2.css">
9
9
  </head>
10
10
  <body>
11
11
  <div id="root"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@imenam/mcp-design",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "main": "dist/src/index.js",
5
5
  "directories": {
6
6
  "test": "test"
@@ -13,7 +13,8 @@
13
13
  "start": "node dist/src/index.js",
14
14
  "test": "node --test \"dist/test/*.test.js\"",
15
15
  "prepublishOnly": "npm run build",
16
- "release": "npm version patch && npm publish && git push --follow-tags"
16
+ "release": "npm version patch && npm publish && git push --follow-tags",
17
+ "generate-icons": "node scripts/generate-icons.js"
17
18
  },
18
19
  "keywords": [
19
20
  "mcp",
@@ -53,6 +54,7 @@
53
54
  },
54
55
  "devDependencies": {
55
56
  "@types/node": "^26.3.0",
57
+ "lucide-static": "^1.38.0",
56
58
  "typescript": "^7.0.2"
57
59
  }
58
60
  }
@@ -0,0 +1,85 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Fige la bibliotheque d'icones dans `shared/icons/` a partir de `lucide-static`.
4
+ *
5
+ * Les fichiers produits sont commites : ni le serveur MCP publie, ni le bundle
6
+ * de la GUI ne dependent de lucide a l'execution, et la geometrie d'un design
7
+ * ne peut pas changer sous les pieds de l'utilisateur au gre d'un `npm install`.
8
+ * Relancer `npm run generate-icons` apres une mise a jour de lucide-static.
9
+ */
10
+ import fs from 'fs';
11
+ import path from 'path';
12
+ import { createRequire } from 'module';
13
+ import { fileURLToPath } from 'url';
14
+
15
+ const require = createRequire(import.meta.url);
16
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
17
+ const rootDir = path.join(__dirname, '..');
18
+ const outDir = path.join(rootDir, 'shared', 'icons');
19
+
20
+ const iconNodes = require('lucide-static/icon-nodes.json');
21
+ const tags = require('lucide-static/tags.json');
22
+ const { version } = require('lucide-static/package.json');
23
+
24
+ /** Attributs de presentation portes par le noeud du design, jamais par l'icone elle-meme. */
25
+ const DROPPED_ATTRS = new Set(['stroke', 'stroke-width', 'stroke-linecap', 'stroke-linejoin', 'class', 'key']);
26
+
27
+ const names = Object.keys(iconNodes).sort();
28
+
29
+ const geometry = {};
30
+ for (const name of names) {
31
+ geometry[name] = iconNodes[name].map(([tag, attrs]) => {
32
+ const kept = {};
33
+ for (const [attr, value] of Object.entries(attrs ?? {})) {
34
+ if (!DROPPED_ATTRS.has(attr)) kept[attr] = String(value);
35
+ }
36
+ return [tag, kept];
37
+ });
38
+ }
39
+
40
+ /** Mots-cles de recherche : le nom eclate en segments, plus les synonymes de lucide. */
41
+ const keywords = {};
42
+ for (const name of names) {
43
+ const fromName = name.split('-');
44
+ const merged = [...new Set([...fromName, ...(tags[name] ?? [])])].filter((word) => word.length > 1);
45
+ if (merged.length > 0) keywords[name] = merged;
46
+ }
47
+
48
+ /**
49
+ * Les donnees sont embarquees comme une chaine JSON parsee au premier acces
50
+ * plutot que comme un litteral d'objet : un objet de 1800 entrees coute cher a
51
+ * analyser au demarrage, et le module est charge par le serveur stdio comme par
52
+ * le navigateur.
53
+ */
54
+ function moduleSource(header, exports) {
55
+ const body = exports
56
+ .map(([name, value]) => `export const ${name} = ${JSON.stringify(JSON.stringify(value))};`)
57
+ .join('\n\n');
58
+ return `${header}\n${body}\n`;
59
+ }
60
+
61
+ const banner = (what) =>
62
+ `// Auto-generated by scripts/generate-icons.js - do not edit manually.\n` +
63
+ `// ${what}\n` +
64
+ `// Source: lucide-static ${version}, ISC licence (https://lucide.dev).\n`;
65
+
66
+ fs.mkdirSync(outDir, { recursive: true });
67
+ fs.writeFileSync(
68
+ path.join(outDir, 'icon-data.ts'),
69
+ moduleSource(banner('Geometry of every icon, in the 24x24 grid.'), [
70
+ ['LUCIDE_VERSION', version],
71
+ ['ICON_DATA_JSON', geometry],
72
+ ]),
73
+ 'utf8'
74
+ );
75
+ fs.writeFileSync(
76
+ path.join(outDir, 'icon-keywords.ts'),
77
+ moduleSource(banner('Search keywords per icon. Loaded on demand, never by the renderer.'), [
78
+ ['ICON_KEYWORDS_JSON', keywords],
79
+ ]),
80
+ 'utf8'
81
+ );
82
+
83
+ console.log(`Generated ${names.length} icons from lucide-static ${version}`);
84
+ console.log(` ${path.join(outDir, 'icon-data.ts')}`);
85
+ console.log(` ${path.join(outDir, 'icon-keywords.ts')}`);