@texturehq/edges 0.1.6 → 0.1.7

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.
package/dist/styles.css CHANGED
@@ -217,9 +217,15 @@
217
217
  }
218
218
  }
219
219
  @layer utilities {
220
+ .pointer-events-auto {
221
+ pointer-events: auto;
222
+ }
220
223
  .pointer-events-none {
221
224
  pointer-events: none;
222
225
  }
226
+ .collapse {
227
+ visibility: collapse;
228
+ }
223
229
  .invisible {
224
230
  visibility: hidden;
225
231
  }
@@ -270,6 +276,9 @@
270
276
  .top-1\/2 {
271
277
  top: calc(1/2 * 100%);
272
278
  }
279
+ .top-2 {
280
+ top: calc(0.25rem * 2);
281
+ }
273
282
  .-right-2 {
274
283
  right: calc(0.25rem * -2);
275
284
  }
@@ -372,6 +381,9 @@
372
381
  .mb-2 {
373
382
  margin-bottom: calc(0.25rem * 2);
374
383
  }
384
+ .mb-3 {
385
+ margin-bottom: calc(0.25rem * 3);
386
+ }
375
387
  .mb-4 {
376
388
  margin-bottom: calc(0.25rem * 4);
377
389
  }
@@ -483,6 +495,9 @@
483
495
  .h-px {
484
496
  height: 1px;
485
497
  }
498
+ .max-h-48 {
499
+ max-height: calc(0.25rem * 48);
500
+ }
486
501
  .max-h-\[300px\] {
487
502
  max-height: 300px;
488
503
  }
@@ -556,15 +571,15 @@
556
571
  .w-full {
557
572
  width: 100%;
558
573
  }
574
+ .max-w-4xl {
575
+ max-width: 56rem;
576
+ }
559
577
  .max-w-\[200px\] {
560
578
  max-width: 200px;
561
579
  }
562
580
  .max-w-\[250px\] {
563
581
  max-width: 250px;
564
582
  }
565
- .max-w-\[400px\] {
566
- max-width: 400px;
567
- }
568
583
  .max-w-full {
569
584
  max-width: 100%;
570
585
  }
@@ -580,6 +595,9 @@
580
595
  .max-w-xl {
581
596
  max-width: 36rem;
582
597
  }
598
+ .max-w-xs {
599
+ max-width: 20rem;
600
+ }
583
601
  .min-w-0 {
584
602
  min-width: calc(0.25rem * 0);
585
603
  }
@@ -592,15 +610,9 @@
592
610
  .min-w-\[150px\] {
593
611
  min-width: 150px;
594
612
  }
595
- .min-w-\[200px\] {
596
- min-width: 200px;
597
- }
598
613
  .min-w-\[208px\] {
599
614
  min-width: 208px;
600
615
  }
601
- .min-w-\[var\(--trigger-width\)\] {
602
- min-width: var(--trigger-width);
603
- }
604
616
  .flex-1 {
605
617
  flex: 1;
606
618
  }
@@ -649,6 +661,9 @@
649
661
  .cursor-pointer {
650
662
  cursor: pointer;
651
663
  }
664
+ .cursor-text {
665
+ cursor: text;
666
+ }
652
667
  .resize {
653
668
  resize: both;
654
669
  }
@@ -713,6 +728,9 @@
713
728
  .justify-start {
714
729
  justify-content: flex-start;
715
730
  }
731
+ .\!gap-1 {
732
+ gap: calc(0.25rem * 1) !important;
733
+ }
716
734
  .gap-0 {
717
735
  gap: calc(0.25rem * 0);
718
736
  }
@@ -722,6 +740,9 @@
722
740
  .gap-1 {
723
741
  gap: calc(0.25rem * 1);
724
742
  }
743
+ .gap-1\.5 {
744
+ gap: calc(0.25rem * 1.5);
745
+ }
725
746
  .gap-2 {
726
747
  gap: calc(0.25rem * 2);
727
748
  }
@@ -764,6 +785,13 @@
764
785
  .gap-\[var\(--control-gap-xl\)\] {
765
786
  gap: var(--control-gap-xl);
766
787
  }
788
+ .space-y-1 {
789
+ :where(& > :not(:last-child)) {
790
+ --tw-space-y-reverse: 0;
791
+ margin-block-start: calc(calc(0.25rem * 1) * var(--tw-space-y-reverse));
792
+ margin-block-end: calc(calc(0.25rem * 1) * calc(1 - var(--tw-space-y-reverse)));
793
+ }
794
+ }
767
795
  .space-y-1\.5 {
768
796
  :where(& > :not(:last-child)) {
769
797
  --tw-space-y-reverse: 0;
@@ -851,6 +879,9 @@
851
879
  .overscroll-contain {
852
880
  overscroll-behavior: contain;
853
881
  }
882
+ .\!rounded-md {
883
+ border-radius: 0.375rem !important;
884
+ }
854
885
  .rounded {
855
886
  border-radius: 0.25rem;
856
887
  }
@@ -952,6 +983,12 @@
952
983
  .border-action-primary {
953
984
  border-color: #444ae1;
954
985
  }
986
+ .border-action-primary\/20 {
987
+ border-color: color-mix(in oklab, #444ae1 20%, transparent);
988
+ }
989
+ .border-blue-200 {
990
+ border-color: oklch(0.882 0.059 254.128);
991
+ }
955
992
  .border-border-default {
956
993
  border-color: #e5e7eb;
957
994
  }
@@ -1033,6 +1070,9 @@
1033
1070
  .bg-action-primary {
1034
1071
  background-color: #444ae1;
1035
1072
  }
1073
+ .bg-action-primary\/10 {
1074
+ background-color: color-mix(in oklab, #444ae1 10%, transparent);
1075
+ }
1036
1076
  .bg-background-hover {
1037
1077
  background-color: #f3f4f6;
1038
1078
  }
@@ -1060,6 +1100,9 @@
1060
1100
  .bg-blue-50 {
1061
1101
  background-color: oklch(0.97 0.014 254.604);
1062
1102
  }
1103
+ .bg-blue-100 {
1104
+ background-color: oklch(0.932 0.032 255.585);
1105
+ }
1063
1106
  .bg-blue-500 {
1064
1107
  background-color: oklch(0.623 0.214 259.815);
1065
1108
  }
@@ -1221,6 +1264,9 @@
1221
1264
  .p-\[1rem\] {
1222
1265
  padding: 1rem;
1223
1266
  }
1267
+ .\!px-1\.5 {
1268
+ padding-inline: calc(0.25rem * 1.5) !important;
1269
+ }
1224
1270
  .\!px-2 {
1225
1271
  padding-inline: calc(0.25rem * 2) !important;
1226
1272
  }
@@ -1230,6 +1276,9 @@
1230
1276
  .px-1 {
1231
1277
  padding-inline: calc(0.25rem * 1);
1232
1278
  }
1279
+ .px-1\.5 {
1280
+ padding-inline: calc(0.25rem * 1.5);
1281
+ }
1233
1282
  .px-2 {
1234
1283
  padding-inline: calc(0.25rem * 2);
1235
1284
  }
@@ -1257,6 +1306,9 @@
1257
1306
  .px-px {
1258
1307
  padding-inline: 1px;
1259
1308
  }
1309
+ .\!py-0\.5 {
1310
+ padding-block: calc(0.25rem * 0.5) !important;
1311
+ }
1260
1312
  .py-0\.5 {
1261
1313
  padding-block: calc(0.25rem * 0.5);
1262
1314
  }
@@ -1269,6 +1321,9 @@
1269
1321
  .py-2 {
1270
1322
  padding-block: calc(0.25rem * 2);
1271
1323
  }
1324
+ .py-2\.5 {
1325
+ padding-block: calc(0.25rem * 2.5);
1326
+ }
1272
1327
  .py-3 {
1273
1328
  padding-block: calc(0.25rem * 3);
1274
1329
  }
@@ -1341,12 +1396,19 @@
1341
1396
  .text-start {
1342
1397
  text-align: start;
1343
1398
  }
1399
+ .align-baseline {
1400
+ vertical-align: baseline;
1401
+ }
1344
1402
  .align-middle {
1345
1403
  vertical-align: middle;
1346
1404
  }
1347
1405
  .font-mono {
1348
1406
  font-family: "Fira Code", monospace;
1349
1407
  }
1408
+ .\!text-xs {
1409
+ font-size: 0.75rem !important;
1410
+ line-height: var(--tw-leading, calc(1 / 0.75)) !important;
1411
+ }
1350
1412
  .text-2xl {
1351
1413
  font-size: 1.5rem;
1352
1414
  line-height: var(--tw-leading, calc(2 / 1.5));
@@ -1397,6 +1459,10 @@
1397
1459
  .text-\[length\:var\(--control-text-xl\)\] {
1398
1460
  font-size: var(--control-text-xl);
1399
1461
  }
1462
+ .\!leading-none {
1463
+ --tw-leading: 1 !important;
1464
+ line-height: 1 !important;
1465
+ }
1400
1466
  .leading-\[2\.25\] {
1401
1467
  --tw-leading: 2.25;
1402
1468
  line-height: 2.25;
@@ -1471,6 +1537,9 @@
1471
1537
  .text-blue-600 {
1472
1538
  color: oklch(0.546 0.245 262.881);
1473
1539
  }
1540
+ .text-blue-800 {
1541
+ color: oklch(0.424 0.199 265.638);
1542
+ }
1474
1543
  .text-brand-dark {
1475
1544
  color: #363ccb;
1476
1545
  }
@@ -1480,6 +1549,9 @@
1480
1549
  .text-brand-primary {
1481
1550
  color: #444ae1;
1482
1551
  }
1552
+ .text-current {
1553
+ color: currentcolor;
1554
+ }
1483
1555
  .text-feedback-error-text {
1484
1556
  color: #b91c1c;
1485
1557
  }
@@ -1581,9 +1653,6 @@
1581
1653
  --tw-numeric-spacing: tabular-nums;
1582
1654
  font-variant-numeric: var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);
1583
1655
  }
1584
- .caret-transparent {
1585
- caret-color: transparent;
1586
- }
1587
1656
  .opacity-0 {
1588
1657
  opacity: 0%;
1589
1658
  }
@@ -1593,6 +1662,9 @@
1593
1662
  .opacity-60 {
1594
1663
  opacity: 60%;
1595
1664
  }
1665
+ .opacity-70 {
1666
+ opacity: 70%;
1667
+ }
1596
1668
  .opacity-100 {
1597
1669
  opacity: 100%;
1598
1670
  }
@@ -1611,6 +1683,10 @@
1611
1683
  --tw-shadow: inset 0 2px 4px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));
1612
1684
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
1613
1685
  }
1686
+ .shadow-lg {
1687
+ --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
1688
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
1689
+ }
1614
1690
  .shadow-md {
1615
1691
  --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
1616
1692
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
@@ -2005,6 +2081,13 @@
2005
2081
  }
2006
2082
  }
2007
2083
  }
2084
+ .hover\:bg-action-primary\/15 {
2085
+ &:hover {
2086
+ @media (hover: hover) {
2087
+ background-color: color-mix(in oklab, #444ae1 15%, transparent);
2088
+ }
2089
+ }
2090
+ }
2008
2091
  .hover\:bg-background-hover {
2009
2092
  &:hover {
2010
2093
  @media (hover: hover) {
@@ -2012,6 +2095,23 @@
2012
2095
  }
2013
2096
  }
2014
2097
  }
2098
+ .hover\:bg-black\/10 {
2099
+ &:hover {
2100
+ @media (hover: hover) {
2101
+ background-color: color-mix(in srgb, #333333 10%, transparent);
2102
+ @supports (color: color-mix(in lab, red, red)) {
2103
+ background-color: color-mix(in oklab, var(--color-neutral-black) 10%, transparent);
2104
+ }
2105
+ }
2106
+ }
2107
+ }
2108
+ .hover\:bg-blue-200 {
2109
+ &:hover {
2110
+ @media (hover: hover) {
2111
+ background-color: oklch(0.882 0.059 254.128);
2112
+ }
2113
+ }
2114
+ }
2015
2115
  .hover\:bg-blue-600 {
2016
2116
  &:hover {
2017
2117
  @media (hover: hover) {
@@ -2117,6 +2217,13 @@
2117
2217
  }
2118
2218
  }
2119
2219
  }
2220
+ .hover\:opacity-100 {
2221
+ &:hover {
2222
+ @media (hover: hover) {
2223
+ opacity: 100%;
2224
+ }
2225
+ }
2226
+ }
2120
2227
  .hover\:brightness-90 {
2121
2228
  &:hover {
2122
2229
  @media (hover: hover) {
@@ -2218,6 +2325,22 @@
2218
2325
  opacity: 100%;
2219
2326
  }
2220
2327
  }
2328
+ .data-\[focused\]\:\!outline-\[1\.5px\] {
2329
+ &[data-focused] {
2330
+ outline-style: var(--tw-outline-style) !important;
2331
+ outline-width: 1.5px !important;
2332
+ }
2333
+ }
2334
+ .data-\[focused\]\:\!outline-\[var\(--control-focus-ring-color\)\] {
2335
+ &[data-focused] {
2336
+ outline-color: var(--control-focus-ring-color) !important;
2337
+ }
2338
+ }
2339
+ .data-\[focused\]\:\!\[--tw-outline-style\:solid\] {
2340
+ &[data-focused] {
2341
+ --tw-outline-style: solid !important;
2342
+ }
2343
+ }
2221
2344
  .data-\[placeholder\]\:text-text-placeholder {
2222
2345
  &[data-placeholder] {
2223
2346
  color: #9ca3af;
@@ -2365,11 +2488,6 @@
2365
2488
  color: #333333;
2366
2489
  }
2367
2490
  }
2368
- .dark\:text-white {
2369
- @media (prefers-color-scheme: dark) {
2370
- color: var(--color-neutral-white);
2371
- }
2372
- }
2373
2491
  .dark\:text-zinc-100 {
2374
2492
  @media (prefers-color-scheme: dark) {
2375
2493
  color: oklch(0.967 0.001 286.375);
@@ -2385,11 +2503,6 @@
2385
2503
  color: oklch(0.871 0.006 286.286);
2386
2504
  }
2387
2505
  }
2388
- .dark\:text-zinc-400 {
2389
- @media (prefers-color-scheme: dark) {
2390
- color: oklch(0.705 0.015 286.067);
2391
- }
2392
- }
2393
2506
  .dark\:text-zinc-600 {
2394
2507
  @media (prefers-color-scheme: dark) {
2395
2508
  color: oklch(0.442 0.017 285.786);
@@ -2643,6 +2756,14 @@
2643
2756
  }
2644
2757
  }
2645
2758
  }
2759
+ .\[\&_\[data-chip-id\]\:\:selection\]\:bg-action-primary\/20 {
2760
+ & [data-chip-id]::-moz-selection {
2761
+ background-color: color-mix(in oklab, #444ae1 20%, transparent);
2762
+ }
2763
+ & [data-chip-id]::selection {
2764
+ background-color: color-mix(in oklab, #444ae1 20%, transparent);
2765
+ }
2766
+ }
2646
2767
  .\[\&_td\]\:px-0 {
2647
2768
  & td {
2648
2769
  padding-inline: calc(0.25rem * 0);
@@ -2783,6 +2904,31 @@
2783
2904
  }
2784
2905
  }
2785
2906
  }
2907
+ .\[\&\:empty\]\:before\:pointer-events-none {
2908
+ &:empty {
2909
+ &::before {
2910
+ content: var(--tw-content);
2911
+ pointer-events: none;
2912
+ }
2913
+ }
2914
+ }
2915
+ .\[\&\:empty\]\:before\:text-text-placeholder {
2916
+ &:empty {
2917
+ &::before {
2918
+ content: var(--tw-content);
2919
+ color: #9ca3af;
2920
+ }
2921
+ }
2922
+ }
2923
+ .\[\&\:empty\]\:before\:content-\[attr\(data-placeholder\)\] {
2924
+ &:empty {
2925
+ &::before {
2926
+ content: var(--tw-content);
2927
+ --tw-content: attr(data-placeholder);
2928
+ content: var(--tw-content);
2929
+ }
2930
+ }
2931
+ }
2786
2932
  .\[\&\>\*\]\:rounded-none {
2787
2933
  &>* {
2788
2934
  border-radius: 0;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@texturehq/edges",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "author": "Nicholas Brown <nick@texturehq.com>",
5
5
  "description": "A shared component library for Texture",
6
6
  "type": "module",
@@ -100,13 +100,6 @@ const setupCursorRules = () => {
100
100
 
101
101
  const targetPath = path.join(rulesDir, file);
102
102
 
103
- // Backup existing rule before overwriting
104
- if (fs.existsSync(targetPath)) {
105
- const backupsDir = path.join(rulesDir, "_backups");
106
- fs.mkdirSync(backupsDir, { recursive: true });
107
- const ts = new Date().toISOString().replace(/[:.]/g, "-");
108
- fs.copyFileSync(targetPath, path.join(backupsDir, `${file}.${ts}.bak`));
109
- }
110
103
  // Always overwrite to ensure version-specific rules
111
104
  fs.writeFileSync(targetPath, templateContent, "utf8");
112
105
  copiedCount++;
@@ -143,13 +136,7 @@ const setupCursorRules = () => {
143
136
  }
144
137
  }
145
138
  const outPath = path.join(rulesDir, 'edges-components.mdc');
146
- // Backup existing components manifest before overwriting
147
- if (fs.existsSync(outPath)) {
148
- const backupsDir = path.join(rulesDir, "_backups");
149
- fs.mkdirSync(backupsDir, { recursive: true });
150
- const ts = new Date().toISOString().replace(/[:.]/g, "-");
151
- fs.copyFileSync(outPath, path.join(backupsDir, `edges-components.mdc.${ts}.bak`));
152
- }
139
+
153
140
  fs.writeFileSync(outPath, lines.join('\n'), "utf8");
154
141
  console.log(`✅ Wrote .cursor/rules/edges-components.mdc from manifest (${manifest.components?.length || 0} components)`);
155
142
  } catch (err) {
@@ -36,13 +36,6 @@ const setupCursorRules = () => {
36
36
  const templatePath = path.join(cursorTemplatesDir, file);
37
37
  const targetPath = path.join(rulesDir, file);
38
38
 
39
- // Backup existing rule before overwriting
40
- if (fs.existsSync(targetPath)) {
41
- const backupsDir = path.join(rulesDir, "_backups");
42
- fs.mkdirSync(backupsDir, { recursive: true });
43
- const ts = new Date().toISOString().replace(/[:.]/g, "-");
44
- fs.copyFileSync(targetPath, path.join(backupsDir, `${file}.${ts}.bak`));
45
- }
46
39
  // Always copy to ensure latest version
47
40
  fs.copyFileSync(templatePath, targetPath);
48
41
  copiedCount++;
@@ -57,30 +50,29 @@ const setupCursorRules = () => {
57
50
 
58
51
  // Setup Claude rules
59
52
  if (fs.existsSync(claudeTemplatesDir)) {
60
- const claudeTemplateFiles = fs.readdirSync(claudeTemplatesDir).filter(file => file.endsWith('.md') || file === '.claude');
53
+ const claudeTemplateFiles = fs.readdirSync(claudeTemplatesDir).filter(file => file.endsWith('.md'));
61
54
 
62
55
  if (claudeTemplateFiles.length > 0) {
63
56
  let claudeCopiedCount = 0;
64
57
 
58
+ // Create .claude directory for namespaced files
59
+ const claudeDir = path.join(cwd, '.claude');
60
+ fs.mkdirSync(claudeDir, { recursive: true });
61
+
65
62
  claudeTemplateFiles.forEach(file => {
66
63
  const templatePath = path.join(claudeTemplatesDir, file);
67
- const targetPath = path.join(cwd, file);
68
-
69
- // Backup existing file before overwriting
70
- if (fs.existsSync(targetPath)) {
71
- const backupPath = `${targetPath}.${new Date().toISOString().replace(/[:.]/g, "-")}.bak`;
72
- fs.copyFileSync(targetPath, backupPath);
73
- console.log(`📋 Backed up existing ${file} to ${backupPath}`);
74
- }
64
+ // Namespace the file as edges-specific
65
+ const namespacedFileName = 'edges.md';
66
+ const targetPath = path.join(claudeDir, namespacedFileName);
75
67
 
76
68
  // Always copy to ensure latest version
77
69
  fs.copyFileSync(templatePath, targetPath);
78
70
  claudeCopiedCount++;
79
- console.log(`✅ Updated ${file} for Claude`);
71
+ console.log(`✅ Updated .claude/${namespacedFileName} for Claude`);
80
72
  });
81
73
 
82
74
  if (claudeCopiedCount > 0) {
83
- console.log(`🤖 Added ${claudeCopiedCount} Claude rule(s) for @texturehq/edges design system`);
75
+ console.log(`🤖 Added ${claudeCopiedCount} namespaced Claude rule(s) for @texturehq/edges design system`);
84
76
  }
85
77
  }
86
78
  }
@@ -137,13 +129,7 @@ const setupCursorRules = () => {
137
129
  cursorLines.push('');
138
130
  }
139
131
  const cursorOutPath = path.join(rulesDir, 'edges-components.mdc');
140
- // Backup existing components manifest before overwriting
141
- if (fs.existsSync(cursorOutPath)) {
142
- const backupsDir = path.join(rulesDir, "_backups");
143
- fs.mkdirSync(backupsDir, { recursive: true });
144
- const ts = new Date().toISOString().replace(/[:.]/g, "-");
145
- fs.copyFileSync(cursorOutPath, path.join(backupsDir, `edges-components.mdc.${ts}.bak`));
146
- }
132
+
147
133
  fs.writeFileSync(cursorOutPath, cursorLines.join('\n'), "utf8");
148
134
  console.log(`✅ Wrote .cursor/rules/edges-components.mdc from manifest (${manifest.components?.length || 0} components)`);
149
135
 
@@ -183,25 +169,19 @@ const setupCursorRules = () => {
183
169
  claudeLines.push('');
184
170
  }
185
171
 
186
- // Update Claude templates with components list
187
- const claudeTemplates = ['claude.md', '.claude'];
188
-
189
- claudeTemplates.forEach(templateName => {
190
- const claudeTemplatePath = path.join(claudeTemplatesDir, templateName);
191
- if (fs.existsSync(claudeTemplatePath)) {
192
- let claudeContent = fs.readFileSync(claudeTemplatePath, 'utf8');
193
- claudeContent = claudeContent.split("{{COMPONENTS_LIST}}").join(claudeLines.join("\n"));
194
- const claudeOutPath = path.join(cwd, templateName);
195
- // Backup existing file before overwriting
196
- if (fs.existsSync(claudeOutPath)) {
197
- const backupPath = `${claudeOutPath}.${new Date().toISOString().replace(/[:.]/g, "-")}.bak`;
198
- fs.copyFileSync(claudeOutPath, backupPath);
199
- console.log(`📋 Backed up existing ${templateName} to ${backupPath}`);
200
- }
201
- fs.writeFileSync(claudeOutPath, claudeContent, "utf8");
202
- console.log(`✅ Wrote ${templateName} with components list (${manifest.components?.length || 0} components)`);
203
- }
204
- });
172
+ // Update Claude template with components list
173
+ const claudeTemplatePath = path.join(claudeTemplatesDir, 'claude.md');
174
+ if (fs.existsSync(claudeTemplatePath)) {
175
+ const claudeDir = path.join(cwd, '.claude');
176
+ fs.mkdirSync(claudeDir, { recursive: true });
177
+
178
+ let claudeContent = fs.readFileSync(claudeTemplatePath, 'utf8');
179
+ claudeContent = claudeContent.split("{{COMPONENTS_LIST}}").join(claudeLines.join("\n"));
180
+
181
+ const claudeOutPath = path.join(claudeDir, 'edges.md');
182
+ fs.writeFileSync(claudeOutPath, claudeContent, "utf8");
183
+ console.log(`✅ Wrote .claude/edges.md with components list (${manifest.components?.length || 0} components)`);
184
+ }
205
185
  } catch (err) {
206
186
  console.log('⚠️ Failed to read components.manifest.json:', err.message);
207
187
  }