@fragments-sdk/cli 0.7.4 → 0.7.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 (58) hide show
  1. package/LICENSE +1 -4
  2. package/dist/bin.js +33 -14
  3. package/dist/bin.js.map +1 -1
  4. package/dist/{chunk-NEJ2FBTN.js → chunk-CR3XHBGM.js} +2 -2
  5. package/dist/{chunk-S56I5FST.js → chunk-EFQ7SIBX.js} +582 -107
  6. package/dist/chunk-EFQ7SIBX.js.map +1 -0
  7. package/dist/{chunk-UXLGIGSX.js → chunk-GIC3I2KZ.js} +2 -2
  8. package/dist/{chunk-R6IZZSE7.js → chunk-JZNATKQA.js} +9 -3
  9. package/dist/chunk-JZNATKQA.js.map +1 -0
  10. package/dist/{chunk-P33AKQJW.js → chunk-SFWZ4K7C.js} +8 -2
  11. package/dist/{chunk-P33AKQJW.js.map → chunk-SFWZ4K7C.js.map} +1 -1
  12. package/dist/{core-3NMNCLFW.js → core-T7BDYEGO.js} +3 -3
  13. package/dist/{generate-23VLX7QN.js → generate-C2DKFCFJ.js} +4 -4
  14. package/dist/index.d.ts +28 -2
  15. package/dist/index.js +8 -6
  16. package/dist/index.js.map +1 -1
  17. package/dist/{init-VYVYMVHH.js → init-O3FCHEPN.js} +22 -6
  18. package/dist/init-O3FCHEPN.js.map +1 -0
  19. package/dist/mcp-bin.js +3 -3
  20. package/dist/{scan-FZR6YVI5.js → scan-IYTZDUKG.js} +5 -5
  21. package/dist/{service-CFFBHW4X.js → service-VA6XKADO.js} +3 -3
  22. package/dist/{static-viewer-VA2JXSCX.js → static-viewer-5N42MBDR.js} +3 -3
  23. package/dist/{test-VTD7R6G2.js → test-OMMDWL2W.js} +3 -3
  24. package/dist/{tokens-7JA5CPDL.js → tokens-6VJAHFIG.js} +4 -4
  25. package/dist/{viewer-WXTDDQGK.js → viewer-IVP5XC7U.js} +22 -14
  26. package/dist/viewer-IVP5XC7U.js.map +1 -0
  27. package/package.json +4 -2
  28. package/src/bin.ts +4 -0
  29. package/src/commands/add.ts +6 -0
  30. package/src/commands/init.ts +18 -2
  31. package/src/commands/validate.ts +24 -2
  32. package/src/core/config.ts +6 -0
  33. package/src/core/index.ts +1 -0
  34. package/src/core/schema.ts +6 -0
  35. package/src/core/types.ts +21 -0
  36. package/src/index.ts +2 -1
  37. package/src/service/snippet-validation.test.ts +209 -0
  38. package/src/service/snippet-validation.ts +635 -0
  39. package/src/validators.ts +53 -5
  40. package/src/viewer/__tests__/viewer-integration.test.ts +8 -0
  41. package/src/viewer/components/CodePanel.naming.test.tsx +60 -0
  42. package/src/viewer/components/CodePanel.tsx +76 -468
  43. package/src/viewer/components/Layout.tsx +1 -1
  44. package/src/viewer/utils/a11y-fixes.ts +24 -9
  45. package/src/viewer/vite-plugin.ts +9 -1
  46. package/dist/chunk-R6IZZSE7.js.map +0 -1
  47. package/dist/chunk-S56I5FST.js.map +0 -1
  48. package/dist/init-VYVYMVHH.js.map +0 -1
  49. package/dist/viewer-WXTDDQGK.js.map +0 -1
  50. /package/dist/{chunk-NEJ2FBTN.js.map → chunk-CR3XHBGM.js.map} +0 -0
  51. /package/dist/{chunk-UXLGIGSX.js.map → chunk-GIC3I2KZ.js.map} +0 -0
  52. /package/dist/{core-3NMNCLFW.js.map → core-T7BDYEGO.js.map} +0 -0
  53. /package/dist/{generate-23VLX7QN.js.map → generate-C2DKFCFJ.js.map} +0 -0
  54. /package/dist/{scan-FZR6YVI5.js.map → scan-IYTZDUKG.js.map} +0 -0
  55. /package/dist/{service-CFFBHW4X.js.map → service-VA6XKADO.js.map} +0 -0
  56. /package/dist/{static-viewer-VA2JXSCX.js.map → static-viewer-5N42MBDR.js.map} +0 -0
  57. /package/dist/{test-VTD7R6G2.js.map → test-OMMDWL2W.js.map} +0 -0
  58. /package/dist/{tokens-7JA5CPDL.js.map → tokens-6VJAHFIG.js.map} +0 -0
package/LICENSE CHANGED
@@ -1,10 +1,7 @@
1
1
  Functional Source License, Version 1.1, MIT Future License
2
2
 
3
3
  Licensor: Conan McNicholl
4
- Software: Fragments SDK (@fragments-sdk/cli, @fragments-sdk/mcp, @fragments-sdk/context)
5
-
6
- IMPORTANT: The @fragments-sdk/ui package is licensed separately under the MIT License.
7
- See libs/ui/LICENSE for details.
4
+ Software: @fragments-sdk/cli
8
5
 
9
6
  ---
10
7
 
package/dist/bin.js CHANGED
@@ -8,15 +8,16 @@ import {
8
8
  runScreenshotCommand,
9
9
  validateAll,
10
10
  validateCoverage,
11
- validateSchema
12
- } from "./chunk-S56I5FST.js";
11
+ validateSchema,
12
+ validateSnippets
13
+ } from "./chunk-EFQ7SIBX.js";
13
14
  import {
14
15
  scan
15
- } from "./chunk-NEJ2FBTN.js";
16
+ } from "./chunk-CR3XHBGM.js";
16
17
  import {
17
18
  loadConfig,
18
19
  loadFragmentFile
19
- } from "./chunk-R6IZZSE7.js";
20
+ } from "./chunk-JZNATKQA.js";
20
21
  import {
21
22
  discoverFragmentFiles
22
23
  } from "./chunk-AWYCDRPG.js";
@@ -38,8 +39,8 @@ import {
38
39
  } from "./chunk-YMPGYEWK.js";
39
40
  import {
40
41
  generateContext
41
- } from "./chunk-UXLGIGSX.js";
42
- import "./chunk-P33AKQJW.js";
42
+ } from "./chunk-GIC3I2KZ.js";
43
+ import "./chunk-SFWZ4K7C.js";
43
44
  import {
44
45
  BRAND
45
46
  } from "./chunk-EKLMXTWU.js";
@@ -56,6 +57,7 @@ import { dirname as dirname4, join as join10 } from "path";
56
57
  import pc from "picocolors";
57
58
  async function validate(options = {}) {
58
59
  const { config, configDir } = await loadConfig(options.config);
60
+ const componentLimit = Number.isFinite(options.componentLimit) ? options.componentLimit : void 0;
59
61
  console.log(pc.cyan(`
60
62
  ${BRAND.name} Validator
61
63
  `));
@@ -66,9 +68,20 @@ ${BRAND.name} Validator
66
68
  } else if (options.coverage) {
67
69
  console.log(pc.dim("Running coverage validation...\n"));
68
70
  result = await validateCoverage(config, configDir);
71
+ } else if (options.snippets) {
72
+ console.log(pc.dim("Running snippet policy validation...\n"));
73
+ result = await validateSnippets(config, configDir, {
74
+ snippetMode: options.snippetMode,
75
+ componentStart: options.componentStart,
76
+ componentLimit
77
+ });
69
78
  } else {
70
79
  console.log(pc.dim("Running all validations...\n"));
71
- result = await validateAll(config, configDir);
80
+ result = await validateAll(config, configDir, {
81
+ snippetMode: options.snippetMode,
82
+ componentStart: options.componentStart,
83
+ componentLimit
84
+ });
72
85
  }
73
86
  if (result.errors.length > 0) {
74
87
  console.log(pc.red(pc.bold("Errors:")));
@@ -1793,7 +1806,7 @@ ${BRAND.name} Dev Server
1793
1806
  }
1794
1807
  }
1795
1808
  }
1796
- const { createDevServer } = await import("./viewer-WXTDDQGK.js");
1809
+ const { createDevServer } = await import("./viewer-IVP5XC7U.js");
1797
1810
  console.log(pc7.dim("\nStarting dev server..."));
1798
1811
  const parsedPort = typeof port === "string" ? parseInt(port, 10) : port;
1799
1812
  try {
@@ -3777,12 +3790,18 @@ export default defineFragment({
3777
3790
  {
3778
3791
  name: 'Default',
3779
3792
  description: 'Default ${name} appearance',
3793
+ code: \`import { ${name} } from '@/components/${name}';
3794
+
3795
+ <${name}>Example content</${name}>\`,
3780
3796
  render: () => <${name}>Example content</${name}>,
3781
3797
  },
3782
3798
  // TODO: Add more variants
3783
3799
  // {
3784
3800
  // name: 'WithProps',
3785
3801
  // description: '${name} with additional props',
3802
+ // code: \`import { ${name} } from '@/components/${name}';
3803
+ //
3804
+ // <${name} someProp="value">Content</${name}>\`,
3786
3805
  // render: () => <${name} someProp="value">Content</${name}>,
3787
3806
  // },
3788
3807
  ],
@@ -5193,7 +5212,7 @@ var __dirname = dirname4(fileURLToPath(import.meta.url));
5193
5212
  var pkg = JSON.parse(readFileSync(join10(__dirname, "../package.json"), "utf-8"));
5194
5213
  var program = new Command();
5195
5214
  program.name(BRAND.cliCommand).description(`${BRAND.name} - Design system documentation and compliance tool`).version(pkg.version);
5196
- program.command("validate").description("Validate fragment files").option("-c, --config <path>", "Path to config file").option("--schema", "Validate fragment schema only").option("--coverage", "Validate coverage only").action(async (options) => {
5215
+ program.command("validate").description("Validate fragment files").option("-c, --config <path>", "Path to config file").option("--schema", "Validate fragment schema only").option("--coverage", "Validate coverage only").option("--snippets", "Validate snippet/render policy only").option("--snippet-mode <mode>", "Override snippet policy mode (warn|error)").option("--component-start <name>", "Start component name for alphabetical snippet batch validation").option("--component-limit <n>", "Component count for alphabetical snippet batch validation", (value) => Number.parseInt(value, 10)).action(async (options) => {
5197
5216
  try {
5198
5217
  const result = await validate(options);
5199
5218
  if (!result.valid) {
@@ -5558,7 +5577,7 @@ Make sure the dev server is running: ${BRAND.cliCommand} dev`));
5558
5577
  });
5559
5578
  program.command("view").description(`Generate a static HTML viewer for ${BRAND.outFile}`).option("-i, --input <path>", `Path to ${BRAND.outFile}`, BRAND.outFile).option("-o, --output <path>", "Output HTML file path", BRAND.viewerHtmlFile).option("--open", "Open in browser after generation").action(async (options) => {
5560
5579
  try {
5561
- const { generateViewerFromJson } = await import("./static-viewer-VA2JXSCX.js");
5580
+ const { generateViewerFromJson } = await import("./static-viewer-5N42MBDR.js");
5562
5581
  const fs2 = await import("fs/promises");
5563
5582
  const path = await import("path");
5564
5583
  const inputPath = path.resolve(process.cwd(), options.input);
@@ -5606,7 +5625,7 @@ program.command("add").argument("[name]", 'Component name (e.g., "Button", "Text
5606
5625
  });
5607
5626
  program.command("init").description("Initialize fragments in a project (interactive by default)").option("--force", "Overwrite existing config").option("-y, --yes", "Non-interactive mode - auto-detect and use defaults").action(async (options) => {
5608
5627
  try {
5609
- const { init } = await import("./init-VYVYMVHH.js");
5628
+ const { init } = await import("./init-O3FCHEPN.js");
5610
5629
  const result = await init({
5611
5630
  projectRoot: process.cwd(),
5612
5631
  force: options.force,
@@ -5626,7 +5645,7 @@ program.command("init").description("Initialize fragments in a project (interact
5626
5645
  });
5627
5646
  program.command("tokens").description("Discover and list design tokens from CSS/SCSS files").option("-c, --config <path>", "Path to config file").option("--json", "Output as JSON").option("--categories", "Group tokens by category").option("--theme <theme>", "Filter by theme name").option("--category <category>", "Filter by category (color, spacing, typography, etc.)").option("--verbose", "Show all tokens (no truncation)").action(async (options) => {
5628
5647
  try {
5629
- const { tokens } = await import("./tokens-7JA5CPDL.js");
5648
+ const { tokens } = await import("./tokens-6VJAHFIG.js");
5630
5649
  const result = await tokens({
5631
5650
  config: options.config,
5632
5651
  json: options.json,
@@ -5645,7 +5664,7 @@ program.command("tokens").description("Discover and list design tokens from CSS/
5645
5664
  });
5646
5665
  program.command("generate").description("Generate fragment files from component source code").argument("[component]", "Specific component name to generate (optional)").option("--force", "Overwrite existing fragment files").option("--pattern <glob>", "Pattern for component files", "src/components/**/*.tsx").action(async (component, options) => {
5647
5666
  try {
5648
- const { generate } = await import("./generate-23VLX7QN.js");
5667
+ const { generate } = await import("./generate-C2DKFCFJ.js");
5649
5668
  const result = await generate({
5650
5669
  projectRoot: process.cwd(),
5651
5670
  component,
@@ -5672,7 +5691,7 @@ program.command("graph").description("Query the component relationship graph").a
5672
5691
  program.command("test").description("Run interaction tests for fragments with play functions").option("-c, --config <path>", "Path to config file").option("--component <name>", "Filter by component name").option("--tags <tags>", "Filter by tags (comma-separated)").option("--grep <pattern>", "Filter by variant name pattern").option("--exclude <pattern>", "Exclude tests matching pattern").option("--parallel <count>", "Number of parallel browser contexts", parseInt, 4).option("--timeout <ms>", "Timeout per test in milliseconds", parseInt, 3e4).option("--retries <count>", "Number of retries for failed tests", parseInt, 0).option("--bail", "Stop on first failure").option("--browser <name>", "Browser to use (chromium, firefox, webkit)", "chromium").option("--headed", "Run in headed mode (show browser)").option("--a11y", "Run accessibility checks with axe-core").option("--visual", "Capture screenshots for visual regression").option("--update-snapshots", "Update visual snapshots").option("--watch", "Watch mode - re-run on file changes").option("--reporters <names>", "Reporters to use (console, junit, json)", "console").option("-o, --output <dir>", "Output directory for results", "./test-results").option("--server-url <url>", "URL of running dev server (skips starting server)").option("-p, --port <port>", "Port for dev server", parseInt, 6006).option("--ci", "CI mode - non-interactive, exit with code 1 on failure").option("--list", "List available tests without running them").action(async (options) => {
5673
5692
  try {
5674
5693
  const { config, configDir } = await loadConfig(options.config);
5675
- const { runTestCommand, listTests } = await import("./test-VTD7R6G2.js");
5694
+ const { runTestCommand, listTests } = await import("./test-OMMDWL2W.js");
5676
5695
  if (options.list) {
5677
5696
  await listTests(config, configDir, {
5678
5697
  component: options.component,