@sun-asterisk/sungen 2.4.6 → 2.5.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 (206) hide show
  1. package/README.md +88 -7
  2. package/dist/cli/commands/add.d.ts.map +1 -1
  3. package/dist/cli/commands/add.js +109 -9
  4. package/dist/cli/commands/add.js.map +1 -1
  5. package/dist/cli/commands/figma.d.ts +11 -0
  6. package/dist/cli/commands/figma.d.ts.map +1 -0
  7. package/dist/cli/commands/figma.js +178 -0
  8. package/dist/cli/commands/figma.js.map +1 -0
  9. package/dist/cli/commands/generate.d.ts.map +1 -1
  10. package/dist/cli/commands/generate.js +2 -0
  11. package/dist/cli/commands/generate.js.map +1 -1
  12. package/dist/cli/index.js +4 -2
  13. package/dist/cli/index.js.map +1 -1
  14. package/dist/generators/gherkin-parser/index.d.ts +1 -0
  15. package/dist/generators/gherkin-parser/index.d.ts.map +1 -1
  16. package/dist/generators/gherkin-parser/index.js +3 -0
  17. package/dist/generators/gherkin-parser/index.js.map +1 -1
  18. package/dist/generators/test-generator/adapters/adapter-interface.d.ts +29 -1
  19. package/dist/generators/test-generator/adapters/adapter-interface.d.ts.map +1 -1
  20. package/dist/generators/test-generator/adapters/playwright/playwright-adapter.d.ts +21 -1
  21. package/dist/generators/test-generator/adapters/playwright/playwright-adapter.d.ts.map +1 -1
  22. package/dist/generators/test-generator/adapters/playwright/playwright-adapter.js +11 -2
  23. package/dist/generators/test-generator/adapters/playwright/playwright-adapter.js.map +1 -1
  24. package/dist/generators/test-generator/adapters/playwright/templates/after-all.hbs +8 -0
  25. package/dist/generators/test-generator/adapters/playwright/templates/after-each.hbs +8 -0
  26. package/dist/generators/test-generator/adapters/playwright/templates/before-all.hbs +8 -0
  27. package/dist/generators/test-generator/adapters/playwright/templates/imports.hbs +3 -0
  28. package/dist/generators/test-generator/adapters/playwright/templates/test-file.hbs +24 -0
  29. package/dist/generators/test-generator/code-generator.d.ts +2 -0
  30. package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
  31. package/dist/generators/test-generator/code-generator.js +109 -12
  32. package/dist/generators/test-generator/code-generator.js.map +1 -1
  33. package/dist/generators/test-generator/step-mapper.d.ts +1 -0
  34. package/dist/generators/test-generator/step-mapper.d.ts.map +1 -1
  35. package/dist/generators/test-generator/step-mapper.js +1 -1
  36. package/dist/generators/test-generator/step-mapper.js.map +1 -1
  37. package/dist/generators/test-generator/template-engine.d.ts +29 -1
  38. package/dist/generators/test-generator/template-engine.d.ts.map +1 -1
  39. package/dist/generators/test-generator/template-engine.js +11 -2
  40. package/dist/generators/test-generator/template-engine.js.map +1 -1
  41. package/dist/generators/test-generator/utils/data-resolver.d.ts +11 -2
  42. package/dist/generators/test-generator/utils/data-resolver.d.ts.map +1 -1
  43. package/dist/generators/test-generator/utils/data-resolver.js +36 -25
  44. package/dist/generators/test-generator/utils/data-resolver.js.map +1 -1
  45. package/dist/generators/test-generator/utils/runtime-data-transformer.d.ts +7 -0
  46. package/dist/generators/test-generator/utils/runtime-data-transformer.d.ts.map +1 -0
  47. package/dist/generators/test-generator/utils/runtime-data-transformer.js +42 -0
  48. package/dist/generators/test-generator/utils/runtime-data-transformer.js.map +1 -0
  49. package/dist/generators/types.d.ts +1 -0
  50. package/dist/generators/types.d.ts.map +1 -1
  51. package/dist/generators/types.js.map +1 -1
  52. package/dist/orchestrator/ai-rules-updater.d.ts.map +1 -1
  53. package/dist/orchestrator/ai-rules-updater.js +2 -0
  54. package/dist/orchestrator/ai-rules-updater.js.map +1 -1
  55. package/dist/orchestrator/figma/figma-scaffolder-helpers.d.ts +33 -0
  56. package/dist/orchestrator/figma/figma-scaffolder-helpers.d.ts.map +1 -0
  57. package/dist/orchestrator/figma/figma-scaffolder-helpers.js +135 -0
  58. package/dist/orchestrator/figma/figma-scaffolder-helpers.js.map +1 -0
  59. package/dist/orchestrator/figma/figma-scaffolder-types.d.ts +25 -0
  60. package/dist/orchestrator/figma/figma-scaffolder-types.d.ts.map +1 -0
  61. package/dist/orchestrator/figma/figma-scaffolder-types.js +7 -0
  62. package/dist/orchestrator/figma/figma-scaffolder-types.js.map +1 -0
  63. package/dist/orchestrator/figma/figma-scaffolder.d.ts +23 -0
  64. package/dist/orchestrator/figma/figma-scaffolder.d.ts.map +1 -0
  65. package/dist/orchestrator/figma/figma-scaffolder.js +212 -0
  66. package/dist/orchestrator/figma/figma-scaffolder.js.map +1 -0
  67. package/dist/orchestrator/figma/node-path-collapser.d.ts +16 -0
  68. package/dist/orchestrator/figma/node-path-collapser.d.ts.map +1 -0
  69. package/dist/orchestrator/figma/node-path-collapser.js +37 -0
  70. package/dist/orchestrator/figma/node-path-collapser.js.map +1 -0
  71. package/dist/orchestrator/figma/spec-figma-renderer.d.ts +44 -0
  72. package/dist/orchestrator/figma/spec-figma-renderer.d.ts.map +1 -0
  73. package/dist/orchestrator/figma/spec-figma-renderer.js +45 -0
  74. package/dist/orchestrator/figma/spec-figma-renderer.js.map +1 -0
  75. package/dist/orchestrator/figma/spec-figma-section-renderers.d.ts +23 -0
  76. package/dist/orchestrator/figma/spec-figma-section-renderers.d.ts.map +1 -0
  77. package/dist/orchestrator/figma/spec-figma-section-renderers.js +47 -0
  78. package/dist/orchestrator/figma/spec-figma-section-renderers.js.map +1 -0
  79. package/dist/orchestrator/project-initializer.d.ts +9 -0
  80. package/dist/orchestrator/project-initializer.d.ts.map +1 -1
  81. package/dist/orchestrator/project-initializer.js +74 -10
  82. package/dist/orchestrator/project-initializer.js.map +1 -1
  83. package/dist/orchestrator/templates/ai-instructions/claude-cmd-add-screen.md +56 -11
  84. package/dist/orchestrator/templates/ai-instructions/claude-cmd-create-test.md +30 -17
  85. package/dist/orchestrator/templates/ai-instructions/claude-cmd-review.md +4 -3
  86. package/dist/orchestrator/templates/ai-instructions/claude-cmd-run-test.md +34 -2
  87. package/dist/orchestrator/templates/ai-instructions/claude-config.md +12 -2
  88. package/dist/orchestrator/templates/ai-instructions/claude-skill-figma-source.md +151 -0
  89. package/dist/orchestrator/templates/ai-instructions/claude-skill-gherkin-syntax.md +66 -13
  90. package/dist/orchestrator/templates/ai-instructions/claude-skill-tc-generation.md +93 -23
  91. package/dist/orchestrator/templates/ai-instructions/claude-skill-tc-review.md +2 -0
  92. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-add-screen.md +53 -9
  93. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-create-test.md +21 -16
  94. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-review.md +4 -3
  95. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-run-test.md +34 -2
  96. package/dist/orchestrator/templates/ai-instructions/copilot-config.md +12 -2
  97. package/dist/orchestrator/templates/ai-instructions/copilot-skill-figma-source.md +151 -0
  98. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-figma-source.md +151 -0
  99. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-gherkin-syntax.md +86 -13
  100. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-selector-fix.md +61 -0
  101. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +105 -28
  102. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-tc-review.md +20 -0
  103. package/dist/orchestrator/templates/specs-base.d.ts +12 -1
  104. package/dist/orchestrator/templates/specs-base.d.ts.map +1 -1
  105. package/dist/orchestrator/templates/specs-base.js +47 -5
  106. package/dist/orchestrator/templates/specs-base.js.map +1 -1
  107. package/dist/orchestrator/templates/specs-base.ts +65 -7
  108. package/dist/orchestrator/templates/specs-test-data.d.ts +14 -0
  109. package/dist/orchestrator/templates/specs-test-data.d.ts.map +1 -0
  110. package/dist/orchestrator/templates/specs-test-data.js +100 -0
  111. package/dist/orchestrator/templates/specs-test-data.js.map +1 -0
  112. package/dist/orchestrator/templates/specs-test-data.ts +66 -0
  113. package/dist/tools/figma/figma-auth.d.ts +36 -0
  114. package/dist/tools/figma/figma-auth.d.ts.map +1 -0
  115. package/dist/tools/figma/figma-auth.js +182 -0
  116. package/dist/tools/figma/figma-auth.js.map +1 -0
  117. package/dist/tools/figma/figma-cache.d.ts +45 -0
  118. package/dist/tools/figma/figma-cache.d.ts.map +1 -0
  119. package/dist/tools/figma/figma-cache.js +191 -0
  120. package/dist/tools/figma/figma-cache.js.map +1 -0
  121. package/dist/tools/figma/figma-client-types.d.ts +112 -0
  122. package/dist/tools/figma/figma-client-types.d.ts.map +1 -0
  123. package/dist/tools/figma/figma-client-types.js +7 -0
  124. package/dist/tools/figma/figma-client-types.js.map +1 -0
  125. package/dist/tools/figma/figma-errors.d.ts +49 -0
  126. package/dist/tools/figma/figma-errors.d.ts.map +1 -0
  127. package/dist/tools/figma/figma-errors.js +105 -0
  128. package/dist/tools/figma/figma-errors.js.map +1 -0
  129. package/dist/tools/figma/figma-image-downloader.d.ts +25 -0
  130. package/dist/tools/figma/figma-image-downloader.d.ts.map +1 -0
  131. package/dist/tools/figma/figma-image-downloader.js +128 -0
  132. package/dist/tools/figma/figma-image-downloader.js.map +1 -0
  133. package/dist/tools/figma/figma-node-filter.d.ts +26 -0
  134. package/dist/tools/figma/figma-node-filter.d.ts.map +1 -0
  135. package/dist/tools/figma/figma-node-filter.js +164 -0
  136. package/dist/tools/figma/figma-node-filter.js.map +1 -0
  137. package/dist/tools/figma/figma-rest-client.d.ts +24 -0
  138. package/dist/tools/figma/figma-rest-client.d.ts.map +1 -0
  139. package/dist/tools/figma/figma-rest-client.js +154 -0
  140. package/dist/tools/figma/figma-rest-client.js.map +1 -0
  141. package/dist/tools/figma/figma-url-parser.d.ts +18 -0
  142. package/dist/tools/figma/figma-url-parser.d.ts.map +1 -0
  143. package/dist/tools/figma/figma-url-parser.js +51 -0
  144. package/dist/tools/figma/figma-url-parser.js.map +1 -0
  145. package/dist/utils/exec-file-no-throw.d.ts +20 -0
  146. package/dist/utils/exec-file-no-throw.d.ts.map +1 -0
  147. package/dist/utils/exec-file-no-throw.js +36 -0
  148. package/dist/utils/exec-file-no-throw.js.map +1 -0
  149. package/package.json +1 -1
  150. package/src/cli/commands/add.ts +80 -9
  151. package/src/cli/commands/figma.ts +162 -0
  152. package/src/cli/commands/generate.ts +2 -0
  153. package/src/cli/index.ts +4 -2
  154. package/src/generators/gherkin-parser/index.ts +4 -0
  155. package/src/generators/test-generator/adapters/adapter-interface.ts +12 -1
  156. package/src/generators/test-generator/adapters/playwright/playwright-adapter.ts +14 -2
  157. package/src/generators/test-generator/adapters/playwright/templates/after-all.hbs +8 -0
  158. package/src/generators/test-generator/adapters/playwright/templates/after-each.hbs +8 -0
  159. package/src/generators/test-generator/adapters/playwright/templates/before-all.hbs +8 -0
  160. package/src/generators/test-generator/adapters/playwright/templates/imports.hbs +3 -0
  161. package/src/generators/test-generator/adapters/playwright/templates/test-file.hbs +24 -0
  162. package/src/generators/test-generator/code-generator.ts +122 -13
  163. package/src/generators/test-generator/step-mapper.ts +2 -2
  164. package/src/generators/test-generator/template-engine.ts +28 -2
  165. package/src/generators/test-generator/utils/data-resolver.ts +45 -27
  166. package/src/generators/test-generator/utils/runtime-data-transformer.ts +51 -0
  167. package/src/generators/types.ts +1 -0
  168. package/src/orchestrator/ai-rules-updater.ts +2 -0
  169. package/src/orchestrator/figma/figma-scaffolder-helpers.ts +126 -0
  170. package/src/orchestrator/figma/figma-scaffolder-types.ts +26 -0
  171. package/src/orchestrator/figma/figma-scaffolder.ts +209 -0
  172. package/src/orchestrator/figma/node-path-collapser.ts +38 -0
  173. package/src/orchestrator/figma/spec-figma-renderer.ts +80 -0
  174. package/src/orchestrator/figma/spec-figma-section-renderers.ts +46 -0
  175. package/src/orchestrator/project-initializer.ts +84 -10
  176. package/src/orchestrator/templates/ai-instructions/claude-cmd-add-screen.md +56 -11
  177. package/src/orchestrator/templates/ai-instructions/claude-cmd-create-test.md +30 -17
  178. package/src/orchestrator/templates/ai-instructions/claude-cmd-review.md +4 -3
  179. package/src/orchestrator/templates/ai-instructions/claude-cmd-run-test.md +34 -2
  180. package/src/orchestrator/templates/ai-instructions/claude-config.md +12 -2
  181. package/src/orchestrator/templates/ai-instructions/claude-skill-figma-source.md +151 -0
  182. package/src/orchestrator/templates/ai-instructions/claude-skill-gherkin-syntax.md +66 -13
  183. package/src/orchestrator/templates/ai-instructions/claude-skill-tc-generation.md +93 -23
  184. package/src/orchestrator/templates/ai-instructions/claude-skill-tc-review.md +2 -0
  185. package/src/orchestrator/templates/ai-instructions/copilot-cmd-add-screen.md +53 -9
  186. package/src/orchestrator/templates/ai-instructions/copilot-cmd-create-test.md +21 -16
  187. package/src/orchestrator/templates/ai-instructions/copilot-cmd-review.md +4 -3
  188. package/src/orchestrator/templates/ai-instructions/copilot-cmd-run-test.md +34 -2
  189. package/src/orchestrator/templates/ai-instructions/copilot-config.md +12 -2
  190. package/src/orchestrator/templates/ai-instructions/copilot-skill-figma-source.md +151 -0
  191. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-figma-source.md +151 -0
  192. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-gherkin-syntax.md +86 -13
  193. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-selector-fix.md +61 -0
  194. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +105 -28
  195. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-tc-review.md +20 -0
  196. package/src/orchestrator/templates/specs-base.ts +65 -7
  197. package/src/orchestrator/templates/specs-test-data.ts +66 -0
  198. package/src/tools/figma/figma-auth.ts +161 -0
  199. package/src/tools/figma/figma-cache.ts +184 -0
  200. package/src/tools/figma/figma-client-types.ts +125 -0
  201. package/src/tools/figma/figma-errors.ts +127 -0
  202. package/src/tools/figma/figma-image-downloader.ts +112 -0
  203. package/src/tools/figma/figma-node-filter.ts +198 -0
  204. package/src/tools/figma/figma-rest-client.ts +183 -0
  205. package/src/tools/figma/figma-url-parser.ts +55 -0
  206. package/src/utils/exec-file-no-throw.ts +45 -0
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Figma PAT lifecycle: load, save, clear, and safety checks.
3
+ *
4
+ * Storage: <cwd>/.env key=FIGMA_PAT
5
+ * Override: process.env.FIGMA_PAT (CI path — skips file read)
6
+ *
7
+ * Safeguards enforced on every save AND every assertSafeToUse call:
8
+ * 1. .env must appear in .gitignore (abort if not).
9
+ * 2. No tracked file may contain "FIGMA_PAT=" (git grep scan).
10
+ */
11
+ /**
12
+ * Load the Figma PAT.
13
+ * Priority: process.env.FIGMA_PAT > .env file.
14
+ * Returns undefined when no PAT is configured.
15
+ */
16
+ export declare function loadPat(cwd: string): string | undefined;
17
+ /**
18
+ * Persist PAT to <cwd>/.env, upserting only the FIGMA_PAT key.
19
+ * Aborts with an actionable error if safeguards are violated.
20
+ *
21
+ * @throws Error with remediation instructions on safeguard failure.
22
+ */
23
+ export declare function savePat(cwd: string, token: string): Promise<void>;
24
+ /**
25
+ * Remove FIGMA_PAT line from <cwd>/.env.
26
+ * No-op when key is not present.
27
+ */
28
+ export declare function clearPat(cwd: string): void;
29
+ /**
30
+ * Run tracked-file scan on every Figma CLI / skill invocation.
31
+ * Aborts with actionable message if FIGMA_PAT= is found in any tracked file.
32
+ *
33
+ * @throws Error with remediation instructions on safeguard failure.
34
+ */
35
+ export declare function assertSafeToUse(cwd: string): Promise<void>;
36
+ //# sourceMappingURL=figma-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"figma-auth.d.ts","sourceRoot":"","sources":["../../../src/tools/figma/figma-auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAiEH;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAWvD;AAED;;;;;GAKG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCvE;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAM1C;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAShE"}
@@ -0,0 +1,182 @@
1
+ "use strict";
2
+ /**
3
+ * Figma PAT lifecycle: load, save, clear, and safety checks.
4
+ *
5
+ * Storage: <cwd>/.env key=FIGMA_PAT
6
+ * Override: process.env.FIGMA_PAT (CI path — skips file read)
7
+ *
8
+ * Safeguards enforced on every save AND every assertSafeToUse call:
9
+ * 1. .env must appear in .gitignore (abort if not).
10
+ * 2. No tracked file may contain "FIGMA_PAT=" (git grep scan).
11
+ */
12
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ var desc = Object.getOwnPropertyDescriptor(m, k);
15
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
16
+ desc = { enumerable: true, get: function() { return m[k]; } };
17
+ }
18
+ Object.defineProperty(o, k2, desc);
19
+ }) : (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ o[k2] = m[k];
22
+ }));
23
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
24
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
25
+ }) : function(o, v) {
26
+ o["default"] = v;
27
+ });
28
+ var __importStar = (this && this.__importStar) || (function () {
29
+ var ownKeys = function(o) {
30
+ ownKeys = Object.getOwnPropertyNames || function (o) {
31
+ var ar = [];
32
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
33
+ return ar;
34
+ };
35
+ return ownKeys(o);
36
+ };
37
+ return function (mod) {
38
+ if (mod && mod.__esModule) return mod;
39
+ var result = {};
40
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
41
+ __setModuleDefault(result, mod);
42
+ return result;
43
+ };
44
+ })();
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.loadPat = loadPat;
47
+ exports.savePat = savePat;
48
+ exports.clearPat = clearPat;
49
+ exports.assertSafeToUse = assertSafeToUse;
50
+ const fs = __importStar(require("fs"));
51
+ const path = __importStar(require("path"));
52
+ const exec_file_no_throw_1 = require("../../utils/exec-file-no-throw");
53
+ const PAT_KEY = 'FIGMA_PAT';
54
+ const ENV_FILE = '.env';
55
+ const GITIGNORE_FILE = '.gitignore';
56
+ // ---------------------------------------------------------------------------
57
+ // Internal helpers
58
+ // ---------------------------------------------------------------------------
59
+ function envFilePath(cwd) {
60
+ return path.join(cwd, ENV_FILE);
61
+ }
62
+ function gitignorePath(cwd) {
63
+ return path.join(cwd, GITIGNORE_FILE);
64
+ }
65
+ /**
66
+ * Read .env file lines, return empty array when file does not exist.
67
+ */
68
+ function readEnvLines(cwd) {
69
+ const fp = envFilePath(cwd);
70
+ if (!fs.existsSync(fp))
71
+ return [];
72
+ return fs.readFileSync(fp, 'utf8').split('\n');
73
+ }
74
+ /**
75
+ * Write lines back to .env, preserving a trailing newline.
76
+ */
77
+ function writeEnvLines(cwd, lines) {
78
+ fs.writeFileSync(envFilePath(cwd), lines.join('\n'), 'utf8');
79
+ }
80
+ /**
81
+ * Check whether .env (or .env.*) is covered by .gitignore.
82
+ */
83
+ function isEnvIgnored(cwd) {
84
+ const gp = gitignorePath(cwd);
85
+ if (!fs.existsSync(gp))
86
+ return false;
87
+ const content = fs.readFileSync(gp, 'utf8');
88
+ // Accept ".env", ".env.local", ".env.*", or "*.env" patterns
89
+ return /^\s*(\.env[\w.*]*|\*\.env)\s*$/m.test(content);
90
+ }
91
+ /**
92
+ * Run `git grep -l "FIGMA_PAT="` in cwd.
93
+ * Returns list of matching tracked file paths (empty = safe).
94
+ */
95
+ async function findTrackedFilesWithPat(cwd) {
96
+ const result = await (0, exec_file_no_throw_1.execFileNoThrow)('git', ['grep', '-l', `${PAT_KEY}=`], cwd);
97
+ if (result.status === 0 && result.stdout.trim()) {
98
+ return result.stdout.trim().split('\n').filter(Boolean);
99
+ }
100
+ return [];
101
+ }
102
+ // ---------------------------------------------------------------------------
103
+ // Public API
104
+ // ---------------------------------------------------------------------------
105
+ /**
106
+ * Load the Figma PAT.
107
+ * Priority: process.env.FIGMA_PAT > .env file.
108
+ * Returns undefined when no PAT is configured.
109
+ */
110
+ function loadPat(cwd) {
111
+ if (process.env[PAT_KEY])
112
+ return process.env[PAT_KEY];
113
+ const lines = readEnvLines(cwd);
114
+ for (const line of lines) {
115
+ const trimmed = line.trim();
116
+ if (trimmed.startsWith(`${PAT_KEY}=`)) {
117
+ return trimmed.slice(PAT_KEY.length + 1).trim();
118
+ }
119
+ }
120
+ return undefined;
121
+ }
122
+ /**
123
+ * Persist PAT to <cwd>/.env, upserting only the FIGMA_PAT key.
124
+ * Aborts with an actionable error if safeguards are violated.
125
+ *
126
+ * @throws Error with remediation instructions on safeguard failure.
127
+ */
128
+ async function savePat(cwd, token) {
129
+ // Safeguard 1: .env must be gitignored
130
+ if (!isEnvIgnored(cwd)) {
131
+ throw new Error(`Refusing to save FIGMA_PAT: ".env" is not listed in ${GITIGNORE_FILE}.\n` +
132
+ `Add the following line to ${path.join(cwd, GITIGNORE_FILE)} and re-run:\n\n .env\n`);
133
+ }
134
+ // Safeguard 2: no tracked file may contain FIGMA_PAT=
135
+ const leakedFiles = await findTrackedFilesWithPat(cwd);
136
+ if (leakedFiles.length > 0) {
137
+ throw new Error(`Refusing to save FIGMA_PAT: token key found in tracked file(s):\n` +
138
+ leakedFiles.map((f) => ` ${f}`).join('\n') +
139
+ `\n\nRemove FIGMA_PAT from those files, commit the removal, then re-run.\n`);
140
+ }
141
+ // Upsert: replace existing line or append
142
+ const lines = readEnvLines(cwd);
143
+ const idx = lines.findIndex((l) => l.trim().startsWith(`${PAT_KEY}=`));
144
+ const newLine = `${PAT_KEY}=${token}`;
145
+ if (idx >= 0) {
146
+ lines[idx] = newLine;
147
+ }
148
+ else {
149
+ // Ensure file ends with newline before appending
150
+ if (lines.length > 0 && lines[lines.length - 1] !== '') {
151
+ lines.push('');
152
+ }
153
+ lines.push(newLine);
154
+ }
155
+ writeEnvLines(cwd, lines);
156
+ }
157
+ /**
158
+ * Remove FIGMA_PAT line from <cwd>/.env.
159
+ * No-op when key is not present.
160
+ */
161
+ function clearPat(cwd) {
162
+ const lines = readEnvLines(cwd);
163
+ const filtered = lines.filter((l) => !l.trim().startsWith(`${PAT_KEY}=`));
164
+ if (filtered.length !== lines.length) {
165
+ writeEnvLines(cwd, filtered);
166
+ }
167
+ }
168
+ /**
169
+ * Run tracked-file scan on every Figma CLI / skill invocation.
170
+ * Aborts with actionable message if FIGMA_PAT= is found in any tracked file.
171
+ *
172
+ * @throws Error with remediation instructions on safeguard failure.
173
+ */
174
+ async function assertSafeToUse(cwd) {
175
+ const leakedFiles = await findTrackedFilesWithPat(cwd);
176
+ if (leakedFiles.length > 0) {
177
+ throw new Error(`Security check failed: FIGMA_PAT found in tracked file(s):\n` +
178
+ leakedFiles.map((f) => ` ${f}`).join('\n') +
179
+ `\n\nRemove FIGMA_PAT from those files and commit the removal before using Figma commands.\n`);
180
+ }
181
+ }
182
+ //# sourceMappingURL=figma-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"figma-auth.js","sourceRoot":"","sources":["../../../src/tools/figma/figma-auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Version-keyed disk cache for Figma node JSON and rendered images.
3
+ *
4
+ * Layout:
5
+ * <cwd>/.sungen/figma-cache/<fileKey>/<versionId>/<safeNodeId>.json (filtered node)
6
+ * <cwd>/.sungen/figma-cache/<fileKey>/<versionId>/<safeNodeId>-raw.json (unfiltered API response)
7
+ * <cwd>/.sungen/figma-cache/<fileKey>/<versionId>/<safeNodeId>-<scale>.png
8
+ *
9
+ * Cache directory is created on first write (permissions 0o700 on Unix).
10
+ * `bustOldVersions` retains the N most recently modified version dirs.
11
+ */
12
+ import type { FigmaCacheKind } from './figma-client-types';
13
+ /**
14
+ * Read a cached entry. Returns `undefined` on cache miss.
15
+ *
16
+ * @param kind 'json' for filtered node data, '<n>x' for PNG images.
17
+ */
18
+ export declare function get(cwd: string, fileKey: string, versionId: string, nodeId: string, kind: FigmaCacheKind): Buffer | undefined;
19
+ /**
20
+ * Write data to the cache.
21
+ * Creates the version directory (mode 0o700) if it does not exist.
22
+ *
23
+ * @param kind 'json' for filtered node data, '<n>x' for PNG images.
24
+ */
25
+ export declare function put(cwd: string, fileKey: string, versionId: string, nodeId: string, kind: FigmaCacheKind, data: Buffer | string): void;
26
+ /**
27
+ * Find the newest on-disk version that has a cached raw node JSON for `nodeId`.
28
+ * Returns `undefined` when no usable cache exists.
29
+ *
30
+ * Lets the scaffolder skip an expensive `/v1/files/:key/nodes` call on Starter
31
+ * plans where REST quota is severely restricted.
32
+ */
33
+ export declare function findLatestCachedVersion(cwd: string, fileKey: string, nodeId: string): string | undefined;
34
+ /**
35
+ * Remove all version directories for `fileKey` except the `keep` most recent.
36
+ *
37
+ * Directories are ordered by mtime descending; oldest are deleted first.
38
+ * No-op when fewer than `keep` versions exist.
39
+ *
40
+ * @param keep Number of versions to retain (default 3).
41
+ */
42
+ export declare function bustOldVersions(cwd: string, fileKey: string, currentVersion: string, options?: {
43
+ keep?: number;
44
+ }): void;
45
+ //# sourceMappingURL=figma-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"figma-cache.d.ts","sourceRoot":"","sources":["../../../src/tools/figma/figma-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAiC3D;;;;GAIG;AACH,wBAAgB,GAAG,CACjB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,cAAc,GACnB,MAAM,GAAG,SAAS,CAWpB;AAED;;;;;GAKG;AACH,wBAAgB,GAAG,CACjB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,MAAM,GAAG,MAAM,GACpB,IAAI,CASN;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,SAAS,CAyBpB;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAC9B,IAAI,CAqCN"}
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+ /**
3
+ * Version-keyed disk cache for Figma node JSON and rendered images.
4
+ *
5
+ * Layout:
6
+ * <cwd>/.sungen/figma-cache/<fileKey>/<versionId>/<safeNodeId>.json (filtered node)
7
+ * <cwd>/.sungen/figma-cache/<fileKey>/<versionId>/<safeNodeId>-raw.json (unfiltered API response)
8
+ * <cwd>/.sungen/figma-cache/<fileKey>/<versionId>/<safeNodeId>-<scale>.png
9
+ *
10
+ * Cache directory is created on first write (permissions 0o700 on Unix).
11
+ * `bustOldVersions` retains the N most recently modified version dirs.
12
+ */
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || (function () {
30
+ var ownKeys = function(o) {
31
+ ownKeys = Object.getOwnPropertyNames || function (o) {
32
+ var ar = [];
33
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
+ return ar;
35
+ };
36
+ return ownKeys(o);
37
+ };
38
+ return function (mod) {
39
+ if (mod && mod.__esModule) return mod;
40
+ var result = {};
41
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
+ __setModuleDefault(result, mod);
43
+ return result;
44
+ };
45
+ })();
46
+ Object.defineProperty(exports, "__esModule", { value: true });
47
+ exports.get = get;
48
+ exports.put = put;
49
+ exports.findLatestCachedVersion = findLatestCachedVersion;
50
+ exports.bustOldVersions = bustOldVersions;
51
+ const fs = __importStar(require("node:fs"));
52
+ const path = __importStar(require("node:path"));
53
+ // ---------------------------------------------------------------------------
54
+ // Path helpers
55
+ // ---------------------------------------------------------------------------
56
+ const CACHE_ROOT = path.join('.sungen', 'figma-cache');
57
+ /** Replace characters unsafe for filenames (colons, slashes, spaces). */
58
+ function safeId(id) {
59
+ return id.replace(/[:/\\s]/g, '_');
60
+ }
61
+ function cacheDir(cwd, fileKey, versionId) {
62
+ return path.join(cwd, CACHE_ROOT, safeId(fileKey), safeId(versionId));
63
+ }
64
+ function cacheFilename(nodeId, kind) {
65
+ const safe = safeId(nodeId);
66
+ if (kind === 'json')
67
+ return `${safe}.json`;
68
+ if (kind === 'raw')
69
+ return `${safe}-raw.json`;
70
+ // kind is like "2x", "1x", etc.
71
+ return `${safe}-${kind}.png`;
72
+ }
73
+ function ensureDir(dir) {
74
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
75
+ }
76
+ // ---------------------------------------------------------------------------
77
+ // Public API
78
+ // ---------------------------------------------------------------------------
79
+ /**
80
+ * Read a cached entry. Returns `undefined` on cache miss.
81
+ *
82
+ * @param kind 'json' for filtered node data, '<n>x' for PNG images.
83
+ */
84
+ function get(cwd, fileKey, versionId, nodeId, kind) {
85
+ const filePath = path.join(cacheDir(cwd, fileKey, versionId), cacheFilename(nodeId, kind));
86
+ if (!fs.existsSync(filePath))
87
+ return undefined;
88
+ try {
89
+ return fs.readFileSync(filePath);
90
+ }
91
+ catch {
92
+ return undefined;
93
+ }
94
+ }
95
+ /**
96
+ * Write data to the cache.
97
+ * Creates the version directory (mode 0o700) if it does not exist.
98
+ *
99
+ * @param kind 'json' for filtered node data, '<n>x' for PNG images.
100
+ */
101
+ function put(cwd, fileKey, versionId, nodeId, kind, data) {
102
+ const dir = cacheDir(cwd, fileKey, versionId);
103
+ ensureDir(dir);
104
+ const filePath = path.join(dir, cacheFilename(nodeId, kind));
105
+ const payload = typeof data === 'string' ? Buffer.from(data, 'utf8') : data;
106
+ // Atomic write: tmp → rename
107
+ const tmpPath = `${filePath}.tmp`;
108
+ fs.writeFileSync(tmpPath, payload, { mode: 0o600 });
109
+ fs.renameSync(tmpPath, filePath);
110
+ }
111
+ /**
112
+ * Find the newest on-disk version that has a cached raw node JSON for `nodeId`.
113
+ * Returns `undefined` when no usable cache exists.
114
+ *
115
+ * Lets the scaffolder skip an expensive `/v1/files/:key/nodes` call on Starter
116
+ * plans where REST quota is severely restricted.
117
+ */
118
+ function findLatestCachedVersion(cwd, fileKey, nodeId) {
119
+ const keyDir = path.join(cwd, CACHE_ROOT, safeId(fileKey));
120
+ if (!fs.existsSync(keyDir))
121
+ return undefined;
122
+ let entries;
123
+ try {
124
+ entries = fs.readdirSync(keyDir, { withFileTypes: true });
125
+ }
126
+ catch {
127
+ return undefined;
128
+ }
129
+ const rawFilename = cacheFilename(nodeId, 'raw');
130
+ const candidates = entries
131
+ .filter((e) => e.isDirectory())
132
+ .map((e) => {
133
+ const rawPath = path.join(keyDir, e.name, rawFilename);
134
+ if (!fs.existsSync(rawPath))
135
+ return undefined;
136
+ let mtime = 0;
137
+ try {
138
+ mtime = fs.statSync(rawPath).mtimeMs;
139
+ }
140
+ catch { /* ignore */ }
141
+ return { versionDir: e.name, mtime };
142
+ })
143
+ .filter((x) => x !== undefined)
144
+ .sort((a, b) => b.mtime - a.mtime);
145
+ return candidates[0]?.versionDir;
146
+ }
147
+ /**
148
+ * Remove all version directories for `fileKey` except the `keep` most recent.
149
+ *
150
+ * Directories are ordered by mtime descending; oldest are deleted first.
151
+ * No-op when fewer than `keep` versions exist.
152
+ *
153
+ * @param keep Number of versions to retain (default 3).
154
+ */
155
+ function bustOldVersions(cwd, fileKey, currentVersion, options = {}) {
156
+ const keep = options.keep ?? 3;
157
+ const keyDir = path.join(cwd, CACHE_ROOT, safeId(fileKey));
158
+ if (!fs.existsSync(keyDir))
159
+ return;
160
+ let entries;
161
+ try {
162
+ entries = fs.readdirSync(keyDir, { withFileTypes: true });
163
+ }
164
+ catch {
165
+ return;
166
+ }
167
+ const versionDirs = entries
168
+ .filter((e) => e.isDirectory())
169
+ .map((e) => {
170
+ const fullPath = path.join(keyDir, e.name);
171
+ let mtime = 0;
172
+ try {
173
+ mtime = fs.statSync(fullPath).mtimeMs;
174
+ }
175
+ catch { /* ignore */ }
176
+ return { name: e.name, fullPath, mtime };
177
+ })
178
+ // Ensure current version is always kept (bump its mtime artificially)
179
+ .map((d) => d.name === safeId(currentVersion)
180
+ ? { ...d, mtime: Number.MAX_SAFE_INTEGER }
181
+ : d)
182
+ .sort((a, b) => b.mtime - a.mtime); // newest first
183
+ const toDelete = versionDirs.slice(keep);
184
+ for (const dir of toDelete) {
185
+ try {
186
+ fs.rmSync(dir.fullPath, { recursive: true, force: true });
187
+ }
188
+ catch { /* best-effort */ }
189
+ }
190
+ }
191
+ //# sourceMappingURL=figma-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"figma-cache.js","sourceRoot":"","sources":["../../../src/tools/figma/figma-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Shared types for Figma integration.
3
+ * Used by figma-auth.ts, figma-url-parser.ts, and REST client modules.
4
+ */
5
+ /** Authentication configuration for Figma API. */
6
+ export interface FigmaAuthConfig {
7
+ /** Personal Access Token — never log this value. */
8
+ pat: string;
9
+ }
10
+ /** Parsed reference to a specific Figma node. */
11
+ export interface FigmaNodeRef {
12
+ /** Figma file key extracted from URL (alphanumeric, 20+ chars). */
13
+ fileKey: string;
14
+ /** Node ID in API form: "1:23" (colon-separated). Absent when URL has no node-id param. */
15
+ nodeId?: string;
16
+ }
17
+ /** Minimal /v1/me response shape used for PAT validation. */
18
+ export interface FigmaMeResponse {
19
+ id: string;
20
+ email: string;
21
+ handle: string;
22
+ }
23
+ /** Result of a PAT validation call. */
24
+ export interface FigmaAuthCheckResult {
25
+ valid: boolean;
26
+ handle?: string;
27
+ email?: string;
28
+ error?: string;
29
+ }
30
+ /** Raw Figma node as returned by the API (loose — unknown fields allowed). */
31
+ export interface FigmaRawNode {
32
+ id: string;
33
+ name: string;
34
+ type: string;
35
+ /** Text content for TEXT nodes. */
36
+ characters?: string;
37
+ /** Component set variant properties. */
38
+ componentPropertyDefinitions?: Record<string, unknown>;
39
+ /** Variant property values for COMPONENT nodes. */
40
+ componentProperties?: Record<string, {
41
+ value: string;
42
+ type: string;
43
+ }>;
44
+ /** Bounding box from absoluteBoundingBox. */
45
+ absoluteBoundingBox?: {
46
+ x: number;
47
+ y: number;
48
+ width: number;
49
+ height: number;
50
+ };
51
+ /** Child nodes. */
52
+ children?: FigmaRawNode[];
53
+ /** Allow any additional Figma fields. */
54
+ [key: string]: unknown;
55
+ }
56
+ /** Response from GET /v1/files/:key/nodes */
57
+ export interface FigmaFileNodesResponse {
58
+ nodes: Record<string, {
59
+ document: FigmaRawNode;
60
+ } | null>;
61
+ /** Current file version ID. */
62
+ version: string;
63
+ }
64
+ /** Response from GET /v1/images/:key */
65
+ export interface FigmaImageUrlsResponse {
66
+ /** Map of nodeId → signed S3 URL (transient — do not persist). */
67
+ images: Record<string, string | null>;
68
+ err: string | null;
69
+ }
70
+ /** Role inferred from component name suffix. */
71
+ export type FigmaNodeRole = 'button' | 'textbox' | 'link' | 'image' | null;
72
+ /** Pruned, minimal Figma node for downstream LLM / test generation. */
73
+ export interface FilteredFigmaNode {
74
+ id: string;
75
+ name: string;
76
+ type: string;
77
+ /** Text content (TEXT nodes only). */
78
+ text?: string;
79
+ /** Component set name (COMPONENT / COMPONENT_SET nodes). */
80
+ componentName?: string;
81
+ /** Variant property map from componentProperties. */
82
+ variantProps?: Record<string, string>;
83
+ /** Inferred accessibility / interaction role. */
84
+ role?: FigmaNodeRole;
85
+ /** Bounding rectangle in file coordinates. */
86
+ boundingBox?: {
87
+ x: number;
88
+ y: number;
89
+ w: number;
90
+ h: number;
91
+ };
92
+ children: FilteredFigmaNode[];
93
+ }
94
+ /** A single text label extracted from the node tree. */
95
+ export interface FigmaTextLabel {
96
+ text: string;
97
+ nodePath: string;
98
+ }
99
+ /** A single variant definition extracted from a COMPONENT_SET. */
100
+ export interface FigmaVariantDefinition {
101
+ nodeId: string;
102
+ name: string;
103
+ variantProps: Record<string, string>;
104
+ }
105
+ export interface FigmaImageOptions {
106
+ /** Render scale. Default 2. */
107
+ scale?: number;
108
+ /** Image format. Default 'png'. */
109
+ format?: 'png' | 'jpg' | 'svg' | 'pdf';
110
+ }
111
+ export type FigmaCacheKind = 'json' | 'raw' | `${number}x`;
112
+ //# sourceMappingURL=figma-client-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"figma-client-types.d.ts","sourceRoot":"","sources":["../../../src/tools/figma/figma-client-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ /**
3
+ * Shared types for Figma integration.
4
+ * Used by figma-auth.ts, figma-url-parser.ts, and REST client modules.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ //# sourceMappingURL=figma-client-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"figma-client-types.js","sourceRoot":"","sources":["../../../src/tools/figma/figma-client-types.ts"],"names":[],"mappings":";AAAA;;;GAGG"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Typed error classes for Figma API failures.
3
+ * Each error carries an actionable remediation message for CLI output.
4
+ *
5
+ * Never include PAT values in error messages or remediation text.
6
+ */
7
+ /** Common base for all Figma errors. */
8
+ declare abstract class FigmaBaseError extends Error {
9
+ /** Human-readable instruction shown to the user on failure. */
10
+ readonly remediation: string;
11
+ constructor(message: string, remediation: string);
12
+ }
13
+ /**
14
+ * HTTP 401 — PAT is missing, expired, or invalid.
15
+ */
16
+ export declare class FigmaAuthError extends FigmaBaseError {
17
+ constructor(message?: string);
18
+ }
19
+ /**
20
+ * HTTP 403 / 404 — PAT valid but insufficient access, or resource not found.
21
+ */
22
+ export declare class FigmaAccessError extends FigmaBaseError {
23
+ readonly statusCode: 403 | 404;
24
+ constructor(statusCode: 403 | 404, message?: string);
25
+ }
26
+ /**
27
+ * HTTP 429 — Rate limited by Figma API.
28
+ */
29
+ export declare class FigmaRateLimitError extends FigmaBaseError {
30
+ /** Seconds to wait before retrying, parsed from Retry-After header. */
31
+ readonly retryAfter: number;
32
+ readonly planTier?: string;
33
+ readonly bucket?: string;
34
+ readonly upgradeLink?: string;
35
+ constructor(retryAfter: number, message?: string, opts?: {
36
+ planTier?: string;
37
+ bucket?: string;
38
+ upgradeLink?: string;
39
+ });
40
+ }
41
+ /**
42
+ * Network / transport failure (timeout, DNS, stream error, etc.).
43
+ */
44
+ export declare class FigmaNetworkError extends FigmaBaseError {
45
+ readonly cause: unknown;
46
+ constructor(message: string, cause?: unknown);
47
+ }
48
+ export {};
49
+ //# sourceMappingURL=figma-errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"figma-errors.d.ts","sourceRoot":"","sources":["../../../src/tools/figma/figma-errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,wCAAwC;AACxC,uBAAe,cAAe,SAAQ,KAAK;IACzC,+DAA+D;IAC/D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAEjB,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;CAKjD;AAMD;;GAEG;AACH,qBAAa,cAAe,SAAQ,cAAc;gBACpC,OAAO,SAAuC;CAM3D;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,cAAc;IAClD,QAAQ,CAAC,UAAU,EAAE,GAAG,GAAG,GAAG,CAAC;gBAEnB,UAAU,EAAE,GAAG,GAAG,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM;CAYpD;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,cAAc;IACrD,uEAAuE;IACvE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;gBAG5B,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,EAChB,IAAI,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO;CAyB1E;AAgBD;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,cAAc;IACnD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;gBAEZ,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAO7C"}