roast-my-design-system 9.2.5 → 9.2.6

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/README.md CHANGED
@@ -142,11 +142,11 @@ Eleven reports, hosted exactly as the tool writes them. Every number determinist
142
142
 
143
143
  The full report for vercel/ai-chatbot. The verdict answers what the agent will learn here, the gap section comes first, then "What the repo teaches the agent", Claude's read of the scan:
144
144
 
145
- ![The full diagnosis report for vercel/ai-chatbot in dark mode: a fixed side panel with the health score and what it measures, the stack, how the repo was read as a shadcn install, an index of every section and what is not the team's and not counted; then where the agent will have to guess, the fixes you can make right now, each with what it is worth and its copy-the-fix-prompt button, the wrapped present with the agent rules, an agent trap callout, 3-yardstick tiles including the 2 shadcn tiles, the adoption map treemap, palette forensics, the shadcn theme variable by variable, spacing receipts, typography specimens, offenders, duplicates, and the component usage ledger](assets/report-full-dark.png?v=9.2.4)
145
+ ![The full diagnosis report for vercel/ai-chatbot in dark mode: a fixed side panel with the health score and what it measures, the stack, how the repo was read as a shadcn install, an index of every section and what is not the team's and not counted; then where the agent will have to guess, the fixes you can make right now, each with what it is worth and its copy-the-fix-prompt button, the wrapped present with the agent rules, an agent trap callout, 3-yardstick tiles including the 2 shadcn tiles, the adoption map treemap, palette forensics, the shadcn theme variable by variable, spacing receipts, typography specimens, offenders, duplicates, and the component usage ledger](assets/report-full-dark.png?v=9.2.6)
146
146
 
147
147
  The same report in light mode (one file, built-in toggle):
148
148
 
149
- ![The diagnosis report in light mode](assets/report-light-hero.png?v=9.2.4)
149
+ ![The diagnosis report in light mode](assets/report-light-hero.png?v=9.2.6)
150
150
 
151
151
  ## Why the numbers hold
152
152
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "roast-my-design-system",
3
- "version": "9.2.5",
3
+ "version": "9.2.6",
4
4
  "mcpName": "io.github.gregkozakiewicz/roast-my-design-system",
5
5
  "description": "Your AI can write the UI. This makes sure it writes your UI. A deterministic scanner scores your design system 0-100 against 112 public repos, reads React and web components (Stencil, Lit), hands you a copy-paste fix prompt for each top finding, writes rules for Claude, Cursor, Copilot and Windsurf with --apply, and runs as a local MCP server with --mcp.",
6
6
  "keywords": [
@@ -1534,7 +1534,7 @@ function skippedLine() {
1534
1534
  const parts = [];
1535
1535
  if (skippedDirs.length) {
1536
1536
  const list = skippedDirs.slice(0, 6).map((e) => `<span class="mono">${esc(e.dir)}/</span> (${n(e.files)} UI file${e.files === 1 ? '' : 's'})`).join(', ');
1537
- parts.push(`<div class="excl">Left out by design: ${list}${skippedDirs.length > 6 ? ` and ${n(skippedDirs.length - 6)} more` : ''}. A docs site, a demo, an examples folder or a replaced app carries its own styling, which is not the product's design language.</div>`);
1537
+ parts.push(`<div class="excl">Left out by design: ${list}${skippedDirs.length > 6 ? ` and ${n(skippedDirs.length - 6)} more` : ''}. A docs site, a demo, an examples folder, a replaced app or the templates a project generator copies out carries its own styling, which is not the product's design language.</div>`);
1538
1538
  }
1539
1539
  const ra = h.files?.readAnyway;
1540
1540
  if (ra) parts.push(`<div class="excl"><span class="mono">${esc(ra.dir)}/</span> is normally left out, but it holds ${n(ra.files)} UI files, more than the rest of the repo, so it was read as the product.</div>`);
@@ -36,7 +36,7 @@ const SKIP_DIRS = new Set([
36
36
  'examples', 'example', 'demos', 'demo', 'playground', 'fixtures',
37
37
  // Test/fixture surfaces are not the product's design language — counting a
38
38
  // story's `export const Default` 36× would poison the diagnosis numbers.
39
- '__tests__', '__mocks__', '__fixtures__', '__snapshots__',
39
+ '__tests__', '__mocks__', '__fixtures__', '__testfixtures__', '__snapshots__',
40
40
  'cypress', 'e2e', 'playwright', 'test', 'tests', '.storybook',
41
41
  ]);
42
42
 
@@ -78,6 +78,15 @@ const STYLE_EXTS = new Set(['.css', '.scss', '.sass', '.less']);
78
78
  // (2026-09-17). Named in the report like any other skipped folder.
79
79
  const LEGACY_DIR_RE = /^(?:old|legacy|deprecated|archive|archived)$|[-_](?:old|legacy|deprecated)$|^(?:old|legacy)[-_]/i;
80
80
 
81
+ // Scaffolding: the code a project generator copies into someone else's new
82
+ // repo, not the product. A starters/ folder, or a templates folder kept by a
83
+ // generator (create-app, a cli), a script or a dev tool: backstage's
84
+ // create-app/templates, the dashboard starter's scripts/cleanup-templates,
85
+ // BuilderIO's starters (133 duplicate copies). The name alone is not enough:
86
+ // backstage's scaffolder form templates, OpenCTI's case templates and
87
+ // nocobase's block templates are screens of the product (2026-09-30).
88
+ const SCAFFOLD_DIR_RE = /(^|\/)starters$|(^|\/)(?:create-[\w-]+|cli|scripts|dev|generators?)\/(?:[^/]+\/)*[\w-]*templates?$/i;
89
+
81
90
  export function walkRepo(root, maxDepth = 14, exclusions = null, readAnyway = new Set()) {
82
91
  const files = { code: [], styles: [], other: [] };
83
92
  const excluded = exclusions?.match ?? (() => null);
@@ -135,6 +144,7 @@ export function walkRepo(root, maxDepth = 14, exclusions = null, readAnyway = ne
135
144
  const p = join(dir, e.name);
136
145
  if (e.name === 'public' && e.isDirectory() && !hasComponentSource(p)) continue;
137
146
  const rel = relative(root, p).replaceAll('\\', '/');
147
+ if (e.isDirectory() && SCAFFOLD_DIR_RE.test(rel)) { countSkipped(p, rel); continue; }
138
148
  const hit = excluded(rel);
139
149
  if (hit) {
140
150
  if (e.isDirectory()) countExcluded(p, depth + 1, hit);
@@ -1,7 +1,7 @@
1
1
  // Single version constant for the engine — imported by diagnose (report
2
2
  // footer) and rules (generated-by line). This is the bump spot that used to
3
3
  // live as a const inside diagnose/index.mjs.
4
- export const VERSION = '9.2.5';
4
+ export const VERSION = '9.2.6';
5
5
  // The shape of harvest.json and summary.json. Bumped only when a field is
6
6
  // renamed, removed or changes meaning; a new field is not a new schema. A
7
7
  // tool comparing two scans compares like with like by this number, not by VERSION.