ilse-design 0.3.0-beta.1

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 (190) hide show
  1. package/README.md +187 -0
  2. package/dist/agent/executor.d.ts +20 -0
  3. package/dist/agent/executor.d.ts.map +1 -0
  4. package/dist/agent/executor.js +130 -0
  5. package/dist/agent/executor.js.map +1 -0
  6. package/dist/ai/provider.d.ts +45 -0
  7. package/dist/ai/provider.d.ts.map +1 -0
  8. package/dist/ai/provider.js +374 -0
  9. package/dist/ai/provider.js.map +1 -0
  10. package/dist/analysis/classify-element.d.ts +23 -0
  11. package/dist/analysis/classify-element.d.ts.map +1 -0
  12. package/dist/analysis/classify-element.js +79 -0
  13. package/dist/analysis/classify-element.js.map +1 -0
  14. package/dist/analysis/compare-family.d.ts +22 -0
  15. package/dist/analysis/compare-family.d.ts.map +1 -0
  16. package/dist/analysis/compare-family.js +82 -0
  17. package/dist/analysis/compare-family.js.map +1 -0
  18. package/dist/analysis/profile-component.d.ts +32 -0
  19. package/dist/analysis/profile-component.d.ts.map +1 -0
  20. package/dist/analysis/profile-component.js +119 -0
  21. package/dist/analysis/profile-component.js.map +1 -0
  22. package/dist/bridge/augment.d.ts +20 -0
  23. package/dist/bridge/augment.d.ts.map +1 -0
  24. package/dist/bridge/augment.js +110 -0
  25. package/dist/bridge/augment.js.map +1 -0
  26. package/dist/bridge/store.d.ts +17 -0
  27. package/dist/bridge/store.d.ts.map +1 -0
  28. package/dist/bridge/store.js +70 -0
  29. package/dist/bridge/store.js.map +1 -0
  30. package/dist/bridge/ws-server.d.ts +12 -0
  31. package/dist/bridge/ws-server.d.ts.map +1 -0
  32. package/dist/bridge/ws-server.js +136 -0
  33. package/dist/bridge/ws-server.js.map +1 -0
  34. package/dist/cli/check.d.ts +8 -0
  35. package/dist/cli/check.d.ts.map +1 -0
  36. package/dist/cli/check.js +303 -0
  37. package/dist/cli/check.js.map +1 -0
  38. package/dist/cli/default.d.ts +2 -0
  39. package/dist/cli/default.d.ts.map +1 -0
  40. package/dist/cli/default.js +166 -0
  41. package/dist/cli/default.js.map +1 -0
  42. package/dist/cli/extract.d.ts +5 -0
  43. package/dist/cli/extract.d.ts.map +1 -0
  44. package/dist/cli/extract.js +62 -0
  45. package/dist/cli/extract.js.map +1 -0
  46. package/dist/cli/index.d.ts +3 -0
  47. package/dist/cli/index.d.ts.map +1 -0
  48. package/dist/cli/index.js +111 -0
  49. package/dist/cli/index.js.map +1 -0
  50. package/dist/cli/init.d.ts +5 -0
  51. package/dist/cli/init.d.ts.map +1 -0
  52. package/dist/cli/init.js +190 -0
  53. package/dist/cli/init.js.map +1 -0
  54. package/dist/cli/insight.d.ts +5 -0
  55. package/dist/cli/insight.d.ts.map +1 -0
  56. package/dist/cli/insight.js +141 -0
  57. package/dist/cli/insight.js.map +1 -0
  58. package/dist/cli/listen.d.ts +10 -0
  59. package/dist/cli/listen.d.ts.map +1 -0
  60. package/dist/cli/listen.js +94 -0
  61. package/dist/cli/listen.js.map +1 -0
  62. package/dist/cli/login.d.ts +15 -0
  63. package/dist/cli/login.d.ts.map +1 -0
  64. package/dist/cli/login.js +302 -0
  65. package/dist/cli/login.js.map +1 -0
  66. package/dist/config/limits.d.ts +13 -0
  67. package/dist/config/limits.d.ts.map +1 -0
  68. package/dist/config/limits.js +26 -0
  69. package/dist/config/limits.js.map +1 -0
  70. package/dist/config/mcp-register.d.ts +5 -0
  71. package/dist/config/mcp-register.d.ts.map +1 -0
  72. package/dist/config/mcp-register.js +50 -0
  73. package/dist/config/mcp-register.js.map +1 -0
  74. package/dist/config/preferences.d.ts +22 -0
  75. package/dist/config/preferences.d.ts.map +1 -0
  76. package/dist/config/preferences.js +159 -0
  77. package/dist/config/preferences.js.map +1 -0
  78. package/dist/config/user-config.d.ts +10 -0
  79. package/dist/config/user-config.d.ts.map +1 -0
  80. package/dist/config/user-config.js +32 -0
  81. package/dist/config/user-config.js.map +1 -0
  82. package/dist/constants.d.ts +11 -0
  83. package/dist/constants.d.ts.map +1 -0
  84. package/dist/constants.js +49 -0
  85. package/dist/constants.js.map +1 -0
  86. package/dist/extraction/find-inconsistencies.d.ts +17 -0
  87. package/dist/extraction/find-inconsistencies.d.ts.map +1 -0
  88. package/dist/extraction/find-inconsistencies.js +93 -0
  89. package/dist/extraction/find-inconsistencies.js.map +1 -0
  90. package/dist/extraction/find-patterns.d.ts +20 -0
  91. package/dist/extraction/find-patterns.d.ts.map +1 -0
  92. package/dist/extraction/find-patterns.js +179 -0
  93. package/dist/extraction/find-patterns.js.map +1 -0
  94. package/dist/extraction/index-tokens.d.ts +16 -0
  95. package/dist/extraction/index-tokens.d.ts.map +1 -0
  96. package/dist/extraction/index-tokens.js +103 -0
  97. package/dist/extraction/index-tokens.js.map +1 -0
  98. package/dist/fixer/autofix.d.ts +11 -0
  99. package/dist/fixer/autofix.d.ts.map +1 -0
  100. package/dist/fixer/autofix.js +202 -0
  101. package/dist/fixer/autofix.js.map +1 -0
  102. package/dist/mcp/server.d.ts +3 -0
  103. package/dist/mcp/server.d.ts.map +1 -0
  104. package/dist/mcp/server.js +271 -0
  105. package/dist/mcp/server.js.map +1 -0
  106. package/dist/parsers/repo.d.ts +22 -0
  107. package/dist/parsers/repo.d.ts.map +1 -0
  108. package/dist/parsers/repo.js +165 -0
  109. package/dist/parsers/repo.js.map +1 -0
  110. package/dist/parsers/snapshot.d.ts +15 -0
  111. package/dist/parsers/snapshot.d.ts.map +1 -0
  112. package/dist/parsers/snapshot.js +136 -0
  113. package/dist/parsers/snapshot.js.map +1 -0
  114. package/dist/parsers/tokens.d.ts +10 -0
  115. package/dist/parsers/tokens.d.ts.map +1 -0
  116. package/dist/parsers/tokens.js +119 -0
  117. package/dist/parsers/tokens.js.map +1 -0
  118. package/dist/react/annotator.d.ts +64 -0
  119. package/dist/react/annotator.d.ts.map +1 -0
  120. package/dist/react/annotator.js +279 -0
  121. package/dist/react/annotator.js.map +1 -0
  122. package/dist/react/area-selector.d.ts +14 -0
  123. package/dist/react/area-selector.d.ts.map +1 -0
  124. package/dist/react/area-selector.js +76 -0
  125. package/dist/react/area-selector.js.map +1 -0
  126. package/dist/react/freeze.d.ts +5 -0
  127. package/dist/react/freeze.d.ts.map +1 -0
  128. package/dist/react/freeze.js +109 -0
  129. package/dist/react/freeze.js.map +1 -0
  130. package/dist/react/image-input.d.ts +14 -0
  131. package/dist/react/image-input.d.ts.map +1 -0
  132. package/dist/react/image-input.js +100 -0
  133. package/dist/react/image-input.js.map +1 -0
  134. package/dist/react/index.d.ts +6 -0
  135. package/dist/react/index.d.ts.map +1 -0
  136. package/dist/react/index.js +13 -0
  137. package/dist/react/index.js.map +1 -0
  138. package/dist/react/toolbar.d.ts +2 -0
  139. package/dist/react/toolbar.d.ts.map +1 -0
  140. package/dist/react/toolbar.js +755 -0
  141. package/dist/react/toolbar.js.map +1 -0
  142. package/dist/react/ws-client.d.ts +8 -0
  143. package/dist/react/ws-client.d.ts.map +1 -0
  144. package/dist/react/ws-client.js +71 -0
  145. package/dist/react/ws-client.js.map +1 -0
  146. package/dist/reporters/coverage.d.ts +6 -0
  147. package/dist/reporters/coverage.d.ts.map +1 -0
  148. package/dist/reporters/coverage.js +74 -0
  149. package/dist/reporters/coverage.js.map +1 -0
  150. package/dist/reporters/ds-report.d.ts +8 -0
  151. package/dist/reporters/ds-report.d.ts.map +1 -0
  152. package/dist/reporters/ds-report.js +66 -0
  153. package/dist/reporters/ds-report.js.map +1 -0
  154. package/dist/reporters/terminal.d.ts +43 -0
  155. package/dist/reporters/terminal.d.ts.map +1 -0
  156. package/dist/reporters/terminal.js +361 -0
  157. package/dist/reporters/terminal.js.map +1 -0
  158. package/dist/setup/framework-detect.d.ts +8 -0
  159. package/dist/setup/framework-detect.d.ts.map +1 -0
  160. package/dist/setup/framework-detect.js +109 -0
  161. package/dist/setup/framework-detect.js.map +1 -0
  162. package/dist/setup/inject-component.d.ts +12 -0
  163. package/dist/setup/inject-component.d.ts.map +1 -0
  164. package/dist/setup/inject-component.js +98 -0
  165. package/dist/setup/inject-component.js.map +1 -0
  166. package/dist/types.d.ts +170 -0
  167. package/dist/types.d.ts.map +1 -0
  168. package/dist/types.js +5 -0
  169. package/dist/types.js.map +1 -0
  170. package/dist/utils/ast.d.ts +18 -0
  171. package/dist/utils/ast.d.ts.map +1 -0
  172. package/dist/utils/ast.js +57 -0
  173. package/dist/utils/ast.js.map +1 -0
  174. package/dist/utils/files.d.ts +6 -0
  175. package/dist/utils/files.d.ts.map +1 -0
  176. package/dist/utils/files.js +25 -0
  177. package/dist/utils/files.js.map +1 -0
  178. package/dist/utils/suggest.d.ts +37 -0
  179. package/dist/utils/suggest.d.ts.map +1 -0
  180. package/dist/utils/suggest.js +158 -0
  181. package/dist/utils/suggest.js.map +1 -0
  182. package/dist/validators/coverage.d.ts +24 -0
  183. package/dist/validators/coverage.d.ts.map +1 -0
  184. package/dist/validators/coverage.js +156 -0
  185. package/dist/validators/coverage.js.map +1 -0
  186. package/dist/validators/static.d.ts +14 -0
  187. package/dist/validators/static.d.ts.map +1 -0
  188. package/dist/validators/static.js +398 -0
  189. package/dist/validators/static.js.map +1 -0
  190. package/package.json +64 -0
@@ -0,0 +1,361 @@
1
+ import chalk from 'chalk';
2
+ const P = ' ';
3
+ const PP = ' ';
4
+ const PPP = ' ';
5
+ async function type(text, speed = 20) {
6
+ for (const char of text) {
7
+ process.stdout.write(char);
8
+ await new Promise((r) => setTimeout(r, speed));
9
+ }
10
+ process.stdout.write('\n');
11
+ }
12
+ async function typeFast(text, speed = 12) {
13
+ for (const char of text) {
14
+ process.stdout.write(char);
15
+ await new Promise((r) => setTimeout(r, speed));
16
+ }
17
+ process.stdout.write('\n');
18
+ }
19
+ async function pause(ms = 200) {
20
+ await new Promise((r) => setTimeout(r, ms));
21
+ }
22
+ let _stack = { hasTailwind: false, hasShadcn: false, uiComponents: [] };
23
+ export function setProjectStack(stack) {
24
+ _stack = stack;
25
+ }
26
+ function buildSuggestion(v) {
27
+ if (v.type === 'accessibility') {
28
+ if (v.context.includes('<img>'))
29
+ return 'adicione alt com descrição da imagem';
30
+ if (v.context.includes('<button>')) {
31
+ return _stack.hasShadcn && _stack.uiComponents.includes('button')
32
+ ? 'use <Button> do shadcn/ui ou adicione aria-label'
33
+ : 'adicione aria-label descrevendo a ação';
34
+ }
35
+ if (v.context.includes('onClick')) {
36
+ return _stack.hasShadcn && _stack.uiComponents.includes('button')
37
+ ? 'troque por <Button> do shadcn/ui'
38
+ : 'troque por <button> ou adicione role="button" tabIndex={0}';
39
+ }
40
+ return v.suggestion || 'corrija acessibilidade';
41
+ }
42
+ if (v.severity === 'critical') {
43
+ const fix = v.suggestion !== 'nenhum token próximo' ? v.suggestion : null;
44
+ if (fix)
45
+ return `use ${fix}`;
46
+ return 'valor hardcoded — crie um token no DS';
47
+ }
48
+ const fix = v.suggestion !== 'nenhum token próximo' ? v.suggestion : null;
49
+ if (fix)
50
+ return `use ${fix}`;
51
+ const isColor = /^(bg|text|border|ring)-\[#/.test(v.context);
52
+ if (isColor) {
53
+ // Extract the hex and suggest a Tailwind color
54
+ const hexMatch = v.context.match(/#([0-9a-fA-F]{6})/);
55
+ if (hexMatch)
56
+ return `crie um token para ${hexMatch[0]} ou use uma cor do tema`;
57
+ return 'crie um token de cor';
58
+ }
59
+ // Try to suggest closest Tailwind class (only if project uses Tailwind)
60
+ if (_stack.hasTailwind) {
61
+ const sizeMatch = v.context.match(/^(\w[\w-]*)-\[(\d+)px\]$/);
62
+ if (sizeMatch) {
63
+ const prefix = sizeMatch[1];
64
+ const px = parseInt(sizeMatch[2]);
65
+ const twClass = findClosestTailwindClass(prefix, px);
66
+ if (twClass)
67
+ return `use ${twClass} (${closestTailwindPx(px)}px)`;
68
+ return `valor arbitrário — considere um breakpoint ou variável CSS`;
69
+ }
70
+ }
71
+ return 'valor arbitrário — considere extrair para uma variável';
72
+ }
73
+ // Tailwind size scale for w, h, max-w, min-w, etc
74
+ const TW_SIZES = {
75
+ 0: '0', 1: 'px', 2: '0.5', 4: '1', 6: '1.5', 8: '2', 10: '2.5',
76
+ 12: '3', 14: '3.5', 16: '4', 20: '5', 24: '6', 28: '7', 32: '8',
77
+ 36: '9', 40: '10', 44: '11', 48: '12', 56: '14', 64: '16', 80: '20',
78
+ 96: '24', 112: '28', 128: '32', 144: '36', 160: '40', 176: '44',
79
+ 192: '48', 208: '52', 224: '56', 240: '60', 256: '64', 288: '72',
80
+ 320: '80', 384: '96',
81
+ };
82
+ // max-w has its own scale
83
+ const TW_MAX_W = {
84
+ 'max-w-xs': 320, 'max-w-sm': 384, 'max-w-md': 448, 'max-w-lg': 512,
85
+ 'max-w-xl': 576, 'max-w-2xl': 672, 'max-w-3xl': 768, 'max-w-4xl': 896,
86
+ 'max-w-5xl': 1024, 'max-w-6xl': 1152, 'max-w-7xl': 1280,
87
+ };
88
+ function closestTailwindPx(px) {
89
+ const sizes = Object.keys(TW_SIZES).map(Number).sort((a, b) => a - b);
90
+ let closest = sizes[0];
91
+ for (const s of sizes) {
92
+ if (Math.abs(s - px) < Math.abs(closest - px))
93
+ closest = s;
94
+ }
95
+ return closest;
96
+ }
97
+ function findClosestTailwindClass(prefix, px) {
98
+ // max-w has named sizes
99
+ if (prefix === 'max-w') {
100
+ let closest = null;
101
+ for (const [name, value] of Object.entries(TW_MAX_W)) {
102
+ const diff = Math.abs(value - px);
103
+ if (!closest || diff < closest.diff)
104
+ closest = { name, diff };
105
+ }
106
+ if (closest && closest.diff <= 64)
107
+ return closest.name;
108
+ }
109
+ // Regular sizes
110
+ const closestPx = closestTailwindPx(px);
111
+ if (Math.abs(closestPx - px) <= 8) {
112
+ const suffix = TW_SIZES[closestPx];
113
+ if (suffix)
114
+ return `${prefix}-${suffix}`;
115
+ }
116
+ return null;
117
+ }
118
+ function groupIssues(violations) {
119
+ const map = new Map();
120
+ for (const v of violations) {
121
+ const suggestion = buildSuggestion(v);
122
+ const key = `${v.context}||${suggestion}`;
123
+ const existing = map.get(key);
124
+ if (existing) {
125
+ existing.lines.push(v.line);
126
+ }
127
+ else {
128
+ map.set(key, { lines: [v.line], context: v.context, suggestion, aiSuggestion: v.aiSuggestion });
129
+ }
130
+ }
131
+ return Array.from(map.values());
132
+ }
133
+ async function printIssue(issue) {
134
+ const lineStr = issue.lines.join(', ');
135
+ const suggestion = issue.aiSuggestion || issue.suggestion;
136
+ // Context line (instant)
137
+ process.stdout.write(`${PP}${lineStr} ${issue.context} `);
138
+ // Suggestion with typewriter
139
+ await typeFast(chalk.green(`→ ${suggestion}`));
140
+ console.log();
141
+ await pause();
142
+ }
143
+ function progressBar(value, max, width = 20) {
144
+ const ratio = max > 0 ? Math.min(value / max, 1) : 0;
145
+ const filled = Math.round(ratio * width);
146
+ const empty = width - filled;
147
+ return chalk.green('█'.repeat(filled)) + chalk.dim('░'.repeat(empty));
148
+ }
149
+ function severityWeight(report) {
150
+ let w = 0;
151
+ for (const v of report.violations) {
152
+ if (v.severity === 'critical')
153
+ w += 100;
154
+ else if (v.severity === 'serious')
155
+ w += 10;
156
+ else
157
+ w += 1;
158
+ }
159
+ return w;
160
+ }
161
+ function calculateScore(reports) {
162
+ let criticalCount = 0;
163
+ let seriousCount = 0;
164
+ let moderateCount = 0;
165
+ for (const r of reports) {
166
+ for (const v of r.violations) {
167
+ if (v.severity === 'critical')
168
+ criticalCount++;
169
+ else if (v.severity === 'serious')
170
+ seriousCount++;
171
+ else
172
+ moderateCount++;
173
+ }
174
+ }
175
+ const penalty = Math.min(criticalCount * 5, 40) +
176
+ Math.min(seriousCount * 2, 25) +
177
+ Math.min(moderateCount * 0.3, 20);
178
+ return Math.max(0, Math.round(100 - penalty));
179
+ }
180
+ /**
181
+ * Print TLDR score at the top.
182
+ */
183
+ export function reportScoreHeader(reports) {
184
+ const score = calculateScore(reports);
185
+ const scoreColor = score >= 80 ? chalk.green : score >= 50 ? chalk.yellow : chalk.red;
186
+ const totalIssues = reports.reduce((s, r) => s + r.violations.length, 0);
187
+ const filesWithIssues = reports.filter((r) => r.violations.length > 0).length;
188
+ console.log();
189
+ console.log(`${P}${scoreColor(chalk.bold(`${score}/100`))} ${chalk.dim('·')} ${totalIssues} issues ${chalk.dim('·')} ${filesWithIssues} arquivos`);
190
+ console.log();
191
+ }
192
+ /**
193
+ * Report a single file's static results.
194
+ */
195
+ export async function reportFileStatic(report, remaining) {
196
+ const tokenViolations = report.violations.filter((v) => v.severity === 'critical');
197
+ const a11yViolations = report.violations.filter((v) => v.type === 'accessibility');
198
+ const consistencyViolations = report.violations.filter((v) => (v.severity === 'moderate' || v.severity === 'serious') && v.type !== 'accessibility');
199
+ if (tokenViolations.length === 0 && a11yViolations.length === 0 && consistencyViolations.length === 0) {
200
+ return 0;
201
+ }
202
+ let printed = 0;
203
+ console.log();
204
+ console.log();
205
+ await type(`${P}ilse ${chalk.dim('·')} ${report.file}`);
206
+ console.log();
207
+ if (tokenViolations.length > 0 && printed < remaining) {
208
+ console.log(`${P}tokens`);
209
+ console.log();
210
+ for (const issue of groupIssues(tokenViolations)) {
211
+ if (printed >= remaining)
212
+ break;
213
+ await printIssue(issue);
214
+ printed++;
215
+ }
216
+ }
217
+ if (a11yViolations.length > 0 && printed < remaining) {
218
+ console.log();
219
+ console.log(`${P}práticas`);
220
+ console.log();
221
+ for (const issue of groupIssues(a11yViolations)) {
222
+ if (printed >= remaining)
223
+ break;
224
+ await printIssue(issue);
225
+ printed++;
226
+ }
227
+ }
228
+ if (consistencyViolations.length > 0 && printed < remaining) {
229
+ console.log();
230
+ console.log(`${P}consistência`);
231
+ console.log();
232
+ for (const issue of groupIssues(consistencyViolations)) {
233
+ if (printed >= remaining)
234
+ break;
235
+ await printIssue(issue);
236
+ printed++;
237
+ }
238
+ }
239
+ return printed;
240
+ }
241
+ /**
242
+ * Report AI patterns + coverage as unified data visualization.
243
+ */
244
+ export function reportInsightsSummary(patterns, coverageData) {
245
+ if (patterns.length === 0 && !coverageData)
246
+ return;
247
+ console.log();
248
+ console.log(`${P}${chalk.bold('insights')}`);
249
+ console.log();
250
+ // Coverage first (if DS tokens exist)
251
+ if (coverageData) {
252
+ const total = coverageData.usages + coverageData.violations;
253
+ const pct = total > 0 ? Math.round((coverageData.usages / total) * 100) : 100;
254
+ const bar = progressBar(pct, 100);
255
+ console.log(`${PP}${chalk.bold(String(pct) + '%')} cobertura do DS`);
256
+ console.log(`${PPP}${bar} ${chalk.dim(`${coverageData.usages} tokens · ${coverageData.violations} hardcoded`)}`);
257
+ console.log();
258
+ }
259
+ // Patterns with bars (proportional to max count)
260
+ if (patterns.length > 0) {
261
+ const maxCount = Math.max(...patterns.map((p) => p.count));
262
+ for (const pattern of patterns) {
263
+ const bar = progressBar(pattern.count, maxCount);
264
+ const countStr = String(pattern.count).padStart(5);
265
+ console.log(`${PP}${chalk.bold(countStr)} ${pattern.label}`);
266
+ console.log(`${PPP}${bar} ${chalk.dim(pattern.detail)}`);
267
+ console.log(`${PPP}${chalk.dim(`→ ${pattern.action}`)}`);
268
+ console.log();
269
+ }
270
+ }
271
+ }
272
+ /**
273
+ * Report family divergences (Camada 2).
274
+ */
275
+ export async function reportFamilyComparisons(comparisons) {
276
+ if (comparisons.length === 0)
277
+ return;
278
+ console.log();
279
+ await type(`${P}${chalk.bold('famílias de componentes')}`);
280
+ console.log();
281
+ for (const comp of comparisons.slice(0, 4)) {
282
+ const memberNames = comp.members.map((m) => m.name).join(chalk.dim(' · '));
283
+ console.log(`${PP}${chalk.dim(comp.family)} ${memberNames}`);
284
+ console.log();
285
+ for (const div of comp.divergences) {
286
+ console.log(`${PP}${div.property}`);
287
+ for (const v of div.values) {
288
+ const marker = v.value === div.mostCommon ? chalk.green('●') : chalk.yellow('○');
289
+ console.log(`${PPP}${marker} ${chalk.dim(v.component.padEnd(20))} ${v.value}`);
290
+ }
291
+ console.log(`${PPP}${chalk.dim(`→ ${div.suggestion}`)}`);
292
+ console.log();
293
+ }
294
+ }
295
+ }
296
+ /**
297
+ * Print footer with hidden issues count.
298
+ */
299
+ export function reportFooter(totalIssues, printedIssues, showAll) {
300
+ if (!showAll && printedIssues < totalIssues) {
301
+ const hidden = totalIssues - printedIssues;
302
+ console.log(`${P}${chalk.dim(`+ ${hidden} issues não exibidos`)}`);
303
+ console.log(`${P}${chalk.dim(`ilse --all para ver tudo`)}`);
304
+ console.log();
305
+ }
306
+ }
307
+ /**
308
+ * Legacy: full report (tests + fallback).
309
+ */
310
+ export async function reportResults(reports, options) {
311
+ const MAX_ISSUES = options?.showAll ? Infinity : 10;
312
+ const filesWithIssues = reports
313
+ .filter((r) => r.violations.length > 0 || r.insights.length > 0)
314
+ .sort((a, b) => severityWeight(b) - severityWeight(a));
315
+ if (filesWithIssues.length === 0) {
316
+ console.log();
317
+ console.log(`${P}${chalk.green('0 issues')}`);
318
+ console.log();
319
+ return;
320
+ }
321
+ reportScoreHeader(reports);
322
+ let printedIssues = 0;
323
+ for (const report of filesWithIssues) {
324
+ if (printedIssues >= MAX_ISSUES)
325
+ break;
326
+ const remaining = MAX_ISSUES - printedIssues;
327
+ const printed = await reportFileStatic(report, remaining);
328
+ printedIssues += printed;
329
+ }
330
+ let totalIssues = 0;
331
+ for (const report of reports) {
332
+ totalIssues += report.violations.length;
333
+ }
334
+ reportFooter(totalIssues, printedIssues, !!options?.showAll);
335
+ }
336
+ /**
337
+ * Report DS token changes.
338
+ */
339
+ export async function reportDSDiff(diff) {
340
+ console.log();
341
+ console.log(`${P}${chalk.bold.yellow('DS atualizado')}`);
342
+ console.log();
343
+ for (const change of diff.changes) {
344
+ switch (change.type) {
345
+ case 'removed':
346
+ console.log(`${PP}${chalk.red('✗')} ${change.tokenName} ${chalk.dim(`(${change.oldValue})`)}`);
347
+ break;
348
+ case 'changed':
349
+ console.log(`${PP}${chalk.yellow('∆')} ${change.tokenName} ${chalk.dim(change.oldValue)} → ${change.newValue}`);
350
+ break;
351
+ case 'renamed':
352
+ console.log(`${PP}${chalk.blue('→')} ${change.tokenName} → ${change.newName}`);
353
+ break;
354
+ case 'added':
355
+ console.log(`${PP}${chalk.green('+')} ${change.tokenName} ${chalk.dim(`(${change.newValue})`)}`);
356
+ break;
357
+ }
358
+ }
359
+ console.log();
360
+ }
361
+ //# sourceMappingURL=terminal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/reporters/terminal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export type Framework = 'next-app' | 'next-pages' | 'vite-react' | 'cra' | 'remix' | 'astro' | 'unknown';
2
+ export interface FrameworkDetection {
3
+ framework: Framework;
4
+ layoutPath?: string;
5
+ alreadyInstalled?: boolean;
6
+ }
7
+ export declare function detectFramework(cwd?: string): FrameworkDetection;
8
+ //# sourceMappingURL=framework-detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"framework-detect.d.ts","sourceRoot":"","sources":["../../src/setup/framework-detect.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,SAAS,GACjB,UAAU,GACV,YAAY,GACZ,YAAY,GACZ,KAAK,GACL,OAAO,GACP,OAAO,GACP,SAAS,CAAC;AAEd,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AA4BD,wBAAgB,eAAe,CAAC,GAAG,GAAE,MAAsB,GAAG,kBAAkB,CAoF/E"}
@@ -0,0 +1,109 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { join, resolve } from 'node:path';
3
+ function readPackageJson(cwd) {
4
+ const pkgPath = join(cwd, 'package.json');
5
+ if (!existsSync(pkgPath))
6
+ return null;
7
+ try {
8
+ return JSON.parse(readFileSync(pkgPath, 'utf-8'));
9
+ }
10
+ catch {
11
+ return null;
12
+ }
13
+ }
14
+ function findFirstExisting(paths) {
15
+ for (const p of paths) {
16
+ if (existsSync(p))
17
+ return p;
18
+ }
19
+ return undefined;
20
+ }
21
+ function hasIlseImport(filePath) {
22
+ try {
23
+ const content = readFileSync(filePath, 'utf-8');
24
+ return content.includes('ilse-design/react') || content.includes('<Ilse');
25
+ }
26
+ catch {
27
+ return false;
28
+ }
29
+ }
30
+ export function detectFramework(cwd = process.cwd()) {
31
+ const pkg = readPackageJson(cwd);
32
+ const deps = {
33
+ ...(pkg?.dependencies ?? {}),
34
+ ...(pkg?.devDependencies ?? {}),
35
+ };
36
+ // Next.js
37
+ if (deps.next) {
38
+ // App Router first
39
+ const appLayout = findFirstExisting([
40
+ resolve(cwd, 'src/app/layout.tsx'),
41
+ resolve(cwd, 'src/app/layout.jsx'),
42
+ resolve(cwd, 'app/layout.tsx'),
43
+ resolve(cwd, 'app/layout.jsx'),
44
+ ]);
45
+ if (appLayout) {
46
+ return {
47
+ framework: 'next-app',
48
+ layoutPath: appLayout,
49
+ alreadyInstalled: hasIlseImport(appLayout),
50
+ };
51
+ }
52
+ // Pages Router
53
+ const pagesApp = findFirstExisting([
54
+ resolve(cwd, 'src/pages/_app.tsx'),
55
+ resolve(cwd, 'src/pages/_app.jsx'),
56
+ resolve(cwd, 'pages/_app.tsx'),
57
+ resolve(cwd, 'pages/_app.jsx'),
58
+ ]);
59
+ if (pagesApp) {
60
+ return {
61
+ framework: 'next-pages',
62
+ layoutPath: pagesApp,
63
+ alreadyInstalled: hasIlseImport(pagesApp),
64
+ };
65
+ }
66
+ return { framework: 'next-app' };
67
+ }
68
+ // Remix
69
+ if (deps['@remix-run/react'] || deps['@remix-run/node']) {
70
+ const rootPath = findFirstExisting([
71
+ resolve(cwd, 'app/root.tsx'),
72
+ resolve(cwd, 'app/root.jsx'),
73
+ ]);
74
+ if (rootPath) {
75
+ return { framework: 'remix', layoutPath: rootPath, alreadyInstalled: hasIlseImport(rootPath) };
76
+ }
77
+ return { framework: 'remix' };
78
+ }
79
+ // Astro
80
+ if (deps.astro) {
81
+ return { framework: 'astro' };
82
+ }
83
+ // Vite + React
84
+ if (deps.vite && (deps.react || deps['@vitejs/plugin-react'])) {
85
+ const appPath = findFirstExisting([
86
+ resolve(cwd, 'src/App.tsx'),
87
+ resolve(cwd, 'src/App.jsx'),
88
+ resolve(cwd, 'src/main.tsx'),
89
+ resolve(cwd, 'src/main.jsx'),
90
+ ]);
91
+ if (appPath) {
92
+ return { framework: 'vite-react', layoutPath: appPath, alreadyInstalled: hasIlseImport(appPath) };
93
+ }
94
+ return { framework: 'vite-react' };
95
+ }
96
+ // Create React App
97
+ if (deps['react-scripts']) {
98
+ const appPath = findFirstExisting([
99
+ resolve(cwd, 'src/App.tsx'),
100
+ resolve(cwd, 'src/App.jsx'),
101
+ ]);
102
+ if (appPath) {
103
+ return { framework: 'cra', layoutPath: appPath, alreadyInstalled: hasIlseImport(appPath) };
104
+ }
105
+ return { framework: 'cra' };
106
+ }
107
+ return { framework: 'unknown' };
108
+ }
109
+ //# sourceMappingURL=framework-detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"framework-detect.js","sourceRoot":"","sources":["../../src/setup/framework-detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { Framework } from './framework-detect.js';
2
+ export interface InjectResult {
3
+ ok: boolean;
4
+ error?: string;
5
+ diff?: string;
6
+ }
7
+ /**
8
+ * Inject <Ilse /> into a layout file.
9
+ * Strategy: add import at top, add <Ilse /> before closing </body> (or equivalent).
10
+ */
11
+ export declare function injectIlseComponent(filePath: string, framework: Framework): InjectResult;
12
+ //# sourceMappingURL=inject-component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inject-component.d.ts","sourceRoot":"","sources":["../../src/setup/inject-component.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAKD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,YAAY,CA0CxF"}
@@ -0,0 +1,98 @@
1
+ import { readFileSync, writeFileSync } from 'node:fs';
2
+ const IMPORT_STATEMENT = `import { Ilse } from "ilse-design/react";`;
3
+ const COMPONENT_TAG = `<Ilse />`;
4
+ /**
5
+ * Inject <Ilse /> into a layout file.
6
+ * Strategy: add import at top, add <Ilse /> before closing </body> (or equivalent).
7
+ */
8
+ export function injectIlseComponent(filePath, framework) {
9
+ let content;
10
+ try {
11
+ content = readFileSync(filePath, 'utf-8');
12
+ }
13
+ catch (err) {
14
+ return { ok: false, error: `Não foi possível ler ${filePath}: ${err.message}` };
15
+ }
16
+ // Already installed?
17
+ if (content.includes('ilse-design/react') || content.includes('<Ilse')) {
18
+ return { ok: true, diff: '(já instalado)' };
19
+ }
20
+ const lines = content.split('\n');
21
+ const original = [...lines];
22
+ // 1. Insert import after the last import statement
23
+ const lastImportIdx = findLastImportIndex(lines);
24
+ if (lastImportIdx === -1) {
25
+ lines.unshift(IMPORT_STATEMENT, '');
26
+ }
27
+ else {
28
+ lines.splice(lastImportIdx + 1, 0, IMPORT_STATEMENT);
29
+ }
30
+ // 2. Insert <Ilse /> in the right place based on framework
31
+ const injectPoint = findInjectPoint(lines, framework);
32
+ if (injectPoint === -1) {
33
+ return { ok: false, error: 'Não achei onde inserir <Ilse /> neste arquivo. Adicione manualmente.' };
34
+ }
35
+ // Insert before closing tag
36
+ const indent = detectIndent(lines[injectPoint]);
37
+ lines.splice(injectPoint, 0, `${indent}${COMPONENT_TAG}`);
38
+ // Write back
39
+ try {
40
+ writeFileSync(filePath, lines.join('\n'), 'utf-8');
41
+ }
42
+ catch (err) {
43
+ return { ok: false, error: `Não foi possível escrever ${filePath}: ${err.message}` };
44
+ }
45
+ return { ok: true, diff: buildDiff(original, lines) };
46
+ }
47
+ function findLastImportIndex(lines) {
48
+ let last = -1;
49
+ for (let i = 0; i < lines.length; i++) {
50
+ if (/^import\s/.test(lines[i]))
51
+ last = i;
52
+ }
53
+ return last;
54
+ }
55
+ function findInjectPoint(lines, framework) {
56
+ // Priority 1: </body> closing tag (Next.js App Router, Remix)
57
+ for (let i = lines.length - 1; i >= 0; i--) {
58
+ if (/<\/body>/.test(lines[i]))
59
+ return i;
60
+ }
61
+ // Priority 2: Closing fragment after <Component /> or {children} (Pages Router)
62
+ if (framework === 'next-pages') {
63
+ for (let i = lines.length - 1; i >= 0; i--) {
64
+ if (/<Component\s*\{\.\.\.pageProps\}\s*\/>/.test(lines[i]))
65
+ return i + 1;
66
+ }
67
+ }
68
+ // Priority 3: Find </> or </Fragment> or last closing JSX tag before return end
69
+ for (let i = lines.length - 1; i >= 0; i--) {
70
+ if (/^\s*<\/>\s*$/.test(lines[i]))
71
+ return i;
72
+ if (/^\s*<\/React\.Fragment>/.test(lines[i]))
73
+ return i;
74
+ }
75
+ // Fallback: before last closing tag in a return statement
76
+ for (let i = lines.length - 1; i >= 0; i--) {
77
+ if (/^\s*<\/[A-Za-z]+>\s*\);?\s*$/.test(lines[i]))
78
+ return i;
79
+ }
80
+ return -1;
81
+ }
82
+ function detectIndent(line) {
83
+ const match = line.match(/^(\s*)/);
84
+ const base = match ? match[1] : '';
85
+ // Add 2 spaces for nesting inside the closing tag's parent
86
+ return base + ' ';
87
+ }
88
+ function buildDiff(original, modified) {
89
+ const diff = [];
90
+ const importLine = modified.find(l => l.includes('ilse-design/react'));
91
+ const ilseTag = modified.find(l => l.includes('<Ilse />'));
92
+ if (importLine)
93
+ diff.push(`+ ${importLine.trim()}`);
94
+ if (ilseTag)
95
+ diff.push(`+ ${ilseTag.trim()}`);
96
+ return diff.join('\n');
97
+ }
98
+ //# sourceMappingURL=inject-component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inject-component.js","sourceRoot":"","sources":["../../src/setup/inject-component.ts"],"names":[],"mappings":"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"}