@sun-asterisk/sungen 2.5.0 → 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 (129) 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/index.js +4 -2
  10. package/dist/cli/index.js.map +1 -1
  11. package/dist/orchestrator/ai-rules-updater.d.ts.map +1 -1
  12. package/dist/orchestrator/ai-rules-updater.js +2 -0
  13. package/dist/orchestrator/ai-rules-updater.js.map +1 -1
  14. package/dist/orchestrator/figma/figma-scaffolder-helpers.d.ts +33 -0
  15. package/dist/orchestrator/figma/figma-scaffolder-helpers.d.ts.map +1 -0
  16. package/dist/orchestrator/figma/figma-scaffolder-helpers.js +135 -0
  17. package/dist/orchestrator/figma/figma-scaffolder-helpers.js.map +1 -0
  18. package/dist/orchestrator/figma/figma-scaffolder-types.d.ts +25 -0
  19. package/dist/orchestrator/figma/figma-scaffolder-types.d.ts.map +1 -0
  20. package/dist/orchestrator/figma/figma-scaffolder-types.js +7 -0
  21. package/dist/orchestrator/figma/figma-scaffolder-types.js.map +1 -0
  22. package/dist/orchestrator/figma/figma-scaffolder.d.ts +23 -0
  23. package/dist/orchestrator/figma/figma-scaffolder.d.ts.map +1 -0
  24. package/dist/orchestrator/figma/figma-scaffolder.js +212 -0
  25. package/dist/orchestrator/figma/figma-scaffolder.js.map +1 -0
  26. package/dist/orchestrator/figma/node-path-collapser.d.ts +16 -0
  27. package/dist/orchestrator/figma/node-path-collapser.d.ts.map +1 -0
  28. package/dist/orchestrator/figma/node-path-collapser.js +37 -0
  29. package/dist/orchestrator/figma/node-path-collapser.js.map +1 -0
  30. package/dist/orchestrator/figma/spec-figma-renderer.d.ts +44 -0
  31. package/dist/orchestrator/figma/spec-figma-renderer.d.ts.map +1 -0
  32. package/dist/orchestrator/figma/spec-figma-renderer.js +45 -0
  33. package/dist/orchestrator/figma/spec-figma-renderer.js.map +1 -0
  34. package/dist/orchestrator/figma/spec-figma-section-renderers.d.ts +23 -0
  35. package/dist/orchestrator/figma/spec-figma-section-renderers.d.ts.map +1 -0
  36. package/dist/orchestrator/figma/spec-figma-section-renderers.js +47 -0
  37. package/dist/orchestrator/figma/spec-figma-section-renderers.js.map +1 -0
  38. package/dist/orchestrator/templates/ai-instructions/claude-cmd-add-screen.md +56 -11
  39. package/dist/orchestrator/templates/ai-instructions/claude-cmd-create-test.md +30 -17
  40. package/dist/orchestrator/templates/ai-instructions/claude-cmd-review.md +4 -3
  41. package/dist/orchestrator/templates/ai-instructions/claude-cmd-run-test.md +33 -1
  42. package/dist/orchestrator/templates/ai-instructions/claude-config.md +1 -0
  43. package/dist/orchestrator/templates/ai-instructions/claude-skill-figma-source.md +151 -0
  44. package/dist/orchestrator/templates/ai-instructions/claude-skill-tc-generation.md +39 -20
  45. package/dist/orchestrator/templates/ai-instructions/claude-skill-tc-review.md +2 -0
  46. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-add-screen.md +53 -9
  47. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-create-test.md +21 -16
  48. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-review.md +4 -3
  49. package/dist/orchestrator/templates/ai-instructions/copilot-cmd-run-test.md +33 -1
  50. package/dist/orchestrator/templates/ai-instructions/copilot-config.md +1 -0
  51. package/dist/orchestrator/templates/ai-instructions/copilot-skill-figma-source.md +151 -0
  52. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-figma-source.md +151 -0
  53. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-selector-fix.md +61 -0
  54. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +51 -25
  55. package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-tc-review.md +20 -0
  56. package/dist/tools/figma/figma-auth.d.ts +36 -0
  57. package/dist/tools/figma/figma-auth.d.ts.map +1 -0
  58. package/dist/tools/figma/figma-auth.js +182 -0
  59. package/dist/tools/figma/figma-auth.js.map +1 -0
  60. package/dist/tools/figma/figma-cache.d.ts +45 -0
  61. package/dist/tools/figma/figma-cache.d.ts.map +1 -0
  62. package/dist/tools/figma/figma-cache.js +191 -0
  63. package/dist/tools/figma/figma-cache.js.map +1 -0
  64. package/dist/tools/figma/figma-client-types.d.ts +112 -0
  65. package/dist/tools/figma/figma-client-types.d.ts.map +1 -0
  66. package/dist/tools/figma/figma-client-types.js +7 -0
  67. package/dist/tools/figma/figma-client-types.js.map +1 -0
  68. package/dist/tools/figma/figma-errors.d.ts +49 -0
  69. package/dist/tools/figma/figma-errors.d.ts.map +1 -0
  70. package/dist/tools/figma/figma-errors.js +105 -0
  71. package/dist/tools/figma/figma-errors.js.map +1 -0
  72. package/dist/tools/figma/figma-image-downloader.d.ts +25 -0
  73. package/dist/tools/figma/figma-image-downloader.d.ts.map +1 -0
  74. package/dist/tools/figma/figma-image-downloader.js +128 -0
  75. package/dist/tools/figma/figma-image-downloader.js.map +1 -0
  76. package/dist/tools/figma/figma-node-filter.d.ts +26 -0
  77. package/dist/tools/figma/figma-node-filter.d.ts.map +1 -0
  78. package/dist/tools/figma/figma-node-filter.js +164 -0
  79. package/dist/tools/figma/figma-node-filter.js.map +1 -0
  80. package/dist/tools/figma/figma-rest-client.d.ts +24 -0
  81. package/dist/tools/figma/figma-rest-client.d.ts.map +1 -0
  82. package/dist/tools/figma/figma-rest-client.js +154 -0
  83. package/dist/tools/figma/figma-rest-client.js.map +1 -0
  84. package/dist/tools/figma/figma-url-parser.d.ts +18 -0
  85. package/dist/tools/figma/figma-url-parser.d.ts.map +1 -0
  86. package/dist/tools/figma/figma-url-parser.js +51 -0
  87. package/dist/tools/figma/figma-url-parser.js.map +1 -0
  88. package/dist/utils/exec-file-no-throw.d.ts +20 -0
  89. package/dist/utils/exec-file-no-throw.d.ts.map +1 -0
  90. package/dist/utils/exec-file-no-throw.js +36 -0
  91. package/dist/utils/exec-file-no-throw.js.map +1 -0
  92. package/package.json +1 -1
  93. package/src/cli/commands/add.ts +80 -9
  94. package/src/cli/commands/figma.ts +162 -0
  95. package/src/cli/index.ts +4 -2
  96. package/src/orchestrator/ai-rules-updater.ts +2 -0
  97. package/src/orchestrator/figma/figma-scaffolder-helpers.ts +126 -0
  98. package/src/orchestrator/figma/figma-scaffolder-types.ts +26 -0
  99. package/src/orchestrator/figma/figma-scaffolder.ts +209 -0
  100. package/src/orchestrator/figma/node-path-collapser.ts +38 -0
  101. package/src/orchestrator/figma/spec-figma-renderer.ts +80 -0
  102. package/src/orchestrator/figma/spec-figma-section-renderers.ts +46 -0
  103. package/src/orchestrator/templates/ai-instructions/claude-cmd-add-screen.md +56 -11
  104. package/src/orchestrator/templates/ai-instructions/claude-cmd-create-test.md +30 -17
  105. package/src/orchestrator/templates/ai-instructions/claude-cmd-review.md +4 -3
  106. package/src/orchestrator/templates/ai-instructions/claude-cmd-run-test.md +33 -1
  107. package/src/orchestrator/templates/ai-instructions/claude-config.md +1 -0
  108. package/src/orchestrator/templates/ai-instructions/claude-skill-figma-source.md +151 -0
  109. package/src/orchestrator/templates/ai-instructions/claude-skill-tc-generation.md +39 -20
  110. package/src/orchestrator/templates/ai-instructions/claude-skill-tc-review.md +2 -0
  111. package/src/orchestrator/templates/ai-instructions/copilot-cmd-add-screen.md +53 -9
  112. package/src/orchestrator/templates/ai-instructions/copilot-cmd-create-test.md +21 -16
  113. package/src/orchestrator/templates/ai-instructions/copilot-cmd-review.md +4 -3
  114. package/src/orchestrator/templates/ai-instructions/copilot-cmd-run-test.md +33 -1
  115. package/src/orchestrator/templates/ai-instructions/copilot-config.md +1 -0
  116. package/src/orchestrator/templates/ai-instructions/copilot-skill-figma-source.md +151 -0
  117. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-figma-source.md +151 -0
  118. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-selector-fix.md +61 -0
  119. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +51 -25
  120. package/src/orchestrator/templates/ai-instructions/github-skill-sungen-tc-review.md +20 -0
  121. package/src/tools/figma/figma-auth.ts +161 -0
  122. package/src/tools/figma/figma-cache.ts +184 -0
  123. package/src/tools/figma/figma-client-types.ts +125 -0
  124. package/src/tools/figma/figma-errors.ts +127 -0
  125. package/src/tools/figma/figma-image-downloader.ts +112 -0
  126. package/src/tools/figma/figma-node-filter.ts +198 -0
  127. package/src/tools/figma/figma-rest-client.ts +183 -0
  128. package/src/tools/figma/figma-url-parser.ts +55 -0
  129. package/src/utils/exec-file-no-throw.ts +45 -0
package/README.md CHANGED
@@ -30,22 +30,103 @@ sungen init --base-url https://your-app.com
30
30
  # Use AI slash commands to generate tests
31
31
  # In GitHub Copilot Chat:
32
32
  /sungen-add-screen login /auth/login
33
- /sungen-make-tc login
34
- /sungen-make-test login
33
+ /sungen-create-test login
34
+ /sungen-run-test login
35
35
  ```
36
36
 
37
37
  ---
38
38
 
39
+ ## Generate from Figma (web-only, no desktop)
40
+
41
+ Use a Figma design URL as the source for screen specs and test scaffolding — no live app needed.
42
+
43
+ ### Quick start (5 steps)
44
+
45
+ ```bash
46
+ # 1. Authenticate once — stores PAT in .env (gitignored)
47
+ sungen figma auth set
48
+
49
+ # 2. Scaffold screen from a Figma frame URL
50
+ sungen add --screen my-screen --figma "https://www.figma.com/design/<key>/<name>?node-id=<id>"
51
+
52
+ # 3. Generate test cases (AI reads spec_figma.md + ui/*.png)
53
+ # /sungen:create-test my-screen
54
+
55
+ # 4. Review syntax and coverage
56
+ # /sungen:review my-screen
57
+
58
+ # 5. Generate selectors + compile + run (no live page needed for compilation)
59
+ # /sungen:run-test my-screen
60
+ ```
61
+
62
+ ### PAT setup
63
+
64
+ 1. Go to **figma.com → Settings → Security → Personal access tokens**
65
+ 2. Click **Generate new token**
66
+ 3. Set scopes: `file_content:read`, `file_metadata:read`
67
+ 4. Copy the token — it is shown once
68
+ 5. Run `sungen figma auth set` and paste when prompted
69
+
70
+ ### Figma URL format
71
+
72
+ ```
73
+ https://www.figma.com/design/<fileKey>/<fileName>?node-id=<nodeId>
74
+ ```
75
+
76
+ Example:
77
+ ```
78
+ https://www.figma.com/design/AbCdEfGhIjKlMnOpQrSt/My-App?node-id=1-23
79
+ ```
80
+
81
+ The `node-id` selects a specific frame or component. Right-click any frame in Figma → "Copy link to selection" to get the correct URL.
82
+
83
+ ### Flags
84
+
85
+ | Flag | Default | Description |
86
+ |------|---------|-------------|
87
+ | `--refresh` | false | Re-fetch image even if cached |
88
+ | `--scale <n>` | 2 | Export resolution multiplier (1–4) |
89
+ | `--hi-res` | false | Alias for `--scale 4` |
90
+
91
+ ### Cache
92
+
93
+ Rendered PNGs are cached in `.sungen/figma-cache/` (gitignored). On re-run, cached images are used unless `--refresh` is passed. Cache entries are keyed by file version — a new Figma publish busts the cache automatically.
94
+
95
+ ### Migration notes
96
+
97
+ Existing screens are unaffected. To add Figma specs to an existing screen:
98
+
99
+ ```bash
100
+ sungen add --screen <existing-screen> --figma <figma-url>
101
+ ```
102
+
103
+ This adds `spec_figma.md` + `requirements/ui/*.png` without touching `spec.md` or `.feature` files (idempotent).
104
+
105
+ ### Troubleshooting
106
+
107
+ | Error | Cause | Fix |
108
+ |-------|-------|-----|
109
+ | `401 Unauthorized` | PAT invalid or expired | Re-run `sungen figma auth set` |
110
+ | `403 Forbidden` | No access to file | Request access from file owner in Figma |
111
+ | `429 Too Many Requests` | Rate limited | Automatic exponential backoff; wait and retry |
112
+ | Expired S3 URL | Image URL expired (~30 days) | Re-run `sungen add --figma` — PNGs are downloaded locally so this is rare |
113
+
114
+ ---
115
+
39
116
  ## CLI Commands
40
117
 
41
118
  | Command | Description |
42
119
  |---------|-------------|
43
120
  | `sungen init` | Scaffold project + generate AI rules |
44
121
  | `sungen add --screen <name> --path <path>` | Create screen with empty templates |
122
+ | `sungen add --screen <name> --figma <url>` | Scaffold from Figma frame (alternative to `--path`) |
45
123
  | `sungen add --screen <name> --feature <name>` | Add feature file to existing screen |
46
124
  | `sungen generate --screen <name>` | Compile Gherkin → Playwright .spec.ts |
47
125
  | `sungen generate --all` | Compile all screens |
48
126
  | `sungen makeauth <role>` | Capture browser auth state (SSO support) |
127
+ | `sungen figma auth set` | Store Figma PAT (one-time setup) |
128
+ | `sungen figma auth check` | Verify PAT is stored and valid |
129
+ | `sungen figma auth clear` | Remove stored PAT |
49
130
 
50
131
  ---
51
132
 
@@ -54,19 +135,19 @@ sungen init --base-url https://your-app.com
54
135
  | Action | GitHub Copilot (VS Code) | Claude Code |
55
136
  |--------|--------------------------|-------------|
56
137
  | Add screen | `/sungen-add-screen login /auth/login` | `/sungen:add-screen login /auth/login` |
57
- | Create test cases | `/sungen-make-tc login` | `/sungen:make-tc login` |
58
- | Compile & run tests | `/sungen-make-test login` | `/sungen:make-test login` |
138
+ | Create test cases | `/sungen-create-test login` | `/sungen:create-test login` |
139
+ | Compile & run tests | `/sungen-run-test login` | `/sungen:run-test login` |
59
140
 
60
- ### make-tc — Create test cases
141
+ ### create-test — Create test cases
61
142
 
62
143
  AI acts as a **Senior QA Engineer**. Supports 3 input modes:
63
144
  - **Live page** — AI visits the page via MCP Playwright, analyzes UI elements
64
145
  - **Figma / screenshots** — AI generates tests from static designs
65
146
  - **Update mode** — AI detects existing tests and asks: add new, expand, or replace
66
147
 
67
- Output: `.feature` + `test-data.yaml` (no selectors — those are generated during make-test)
148
+ Output: `.feature` + `test-data.yaml` (no selectors — those are generated during run-test)
68
149
 
69
- ### make-test — Compile & run
150
+ ### run-test — Compile & run
70
151
 
71
152
  AI acts as a **Senior Developer**:
72
153
  1. Explores live page → generates `selectors.yaml`
@@ -1 +1 @@
1
- {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+BzD"}
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoGzD"}
@@ -1,6 +1,41 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.registerAddCommand = registerAddCommand;
37
+ const fs = __importStar(require("node:fs"));
38
+ const path = __importStar(require("node:path"));
4
39
  function registerAddCommand(program) {
5
40
  program
6
41
  .command('add')
@@ -10,21 +45,86 @@ function registerAddCommand(program) {
10
45
  .option('-c, --capture', 'Auto-capture a live-page screenshot to requirements/ui/ (requires --path)')
11
46
  .option('-f, --feature <name>', 'Add additional feature file to existing screen')
12
47
  .option('-d, --description <text>', 'Screen description')
48
+ .option('--figma <url>', "Figma share URL — fetch design node and generate spec_figma.md + ui/*.png. QUOTE the URL ('...'): the '&' in Figma links backgrounds the shell otherwise.")
49
+ .option('--refresh', 'Bypass Figma cache and re-fetch from API (use with --figma)')
50
+ .option('--scale <n>', 'PNG export scale factor (default: 2)', parseFloat, 2)
51
+ .option('--hi-res', 'Export at 4× scale (shorthand for --scale 4)')
13
52
  .action(async (options) => {
14
53
  try {
15
54
  if (options.capture && !options.path) {
16
55
  console.error('Error: --capture requires --path to be set');
17
56
  process.exit(1);
18
57
  }
19
- const { ScreenManager } = require('../../orchestrator/screen-manager');
20
- const manager = new ScreenManager();
21
- await manager.addScreen({
22
- name: options.screen,
23
- path: options.path,
24
- capture: options.capture,
25
- feature: options.feature,
26
- description: options.description,
27
- });
58
+ // When --figma is set on an existing screen, skip scaffolding and
59
+ // just refresh Figma-derived files (spec_figma.md, ui/*.png).
60
+ const screenDir = path.join(process.cwd(), 'qa', 'screens', options.screen);
61
+ const featureFile = path.join(screenDir, 'features', `${options.screen}.feature`);
62
+ const screenAlreadyExists = fs.existsSync(featureFile);
63
+ if (!(options.figma && screenAlreadyExists)) {
64
+ const { ScreenManager } = require('../../orchestrator/screen-manager');
65
+ const manager = new ScreenManager();
66
+ await manager.addScreen({
67
+ name: options.screen,
68
+ path: options.path,
69
+ capture: options.capture,
70
+ feature: options.feature,
71
+ description: options.description,
72
+ });
73
+ }
74
+ else {
75
+ console.log(`Screen "${options.screen}" already exists — refreshing Figma assets only.`);
76
+ }
77
+ // Figma branch: run after directory scaffolding is complete
78
+ if (options.figma) {
79
+ const { FigmaScaffolder } = require('../../orchestrator/figma/figma-scaffolder');
80
+ const scale = options.hiRes ? 4 : (options.scale ?? 2);
81
+ try {
82
+ const result = await FigmaScaffolder.run({
83
+ screenName: options.screen,
84
+ figmaUrl: options.figma,
85
+ cwd: process.cwd(),
86
+ refresh: options.refresh ?? false,
87
+ scale,
88
+ });
89
+ console.log('\nFigma import complete:');
90
+ console.log(` ${result.specFigmaPath}`);
91
+ for (const img of result.imagePaths) {
92
+ console.log(` qa/screens/${options.screen}/requirements/${img}`);
93
+ }
94
+ if (result.specMdCreated) {
95
+ console.log(` qa/screens/${options.screen}/requirements/spec.md (stub created)`);
96
+ }
97
+ // Loud banner: Tell the calling agent to
98
+ // invoke the `sungen-figma-source` skill to synthesize the narrative sections in spec_figma.md, since
99
+ // the CLI cannot do this (synthesis is LLM-driven off the cached raw JSON).
100
+ console.log('');
101
+ console.log('==============================================================');
102
+ console.log(' NEXT STEP (REQUIRED — DO NOT SKIP)');
103
+ console.log('==============================================================');
104
+ console.log(' spec_figma.md envelope is written but narrative is EMPTY.');
105
+ console.log(' Invoke the `sungen-figma-source` skill NOW to synthesize');
106
+ console.log(' the 7 sections (Purpose / ASCII Layout / Regions / Actions /');
107
+ console.log(' Form Fields / Data Columns / Navigation) below the');
108
+ console.log(' `<!-- SYNTHESIS-BELOW -->` marker.');
109
+ console.log('');
110
+ console.log(' Read the cached raw node JSON at:');
111
+ console.log(` .sungen/figma-cache/<fileKey>/<versionId>/<nodeId>-raw.json`);
112
+ console.log(' and append the narrative below the marker in:');
113
+ console.log(` ${result.specFigmaPath}`);
114
+ console.log('==============================================================');
115
+ }
116
+ catch (figmaError) {
117
+ const msg = figmaError instanceof Error ? figmaError.message : String(figmaError);
118
+ // Surface remediation hint when available
119
+ const remediation = figmaError instanceof Error &&
120
+ 'remediation' in figmaError &&
121
+ typeof figmaError.remediation === 'string'
122
+ ? `\nHint: ${figmaError.remediation}`
123
+ : '';
124
+ console.error(`\nFigma import failed: ${msg}${remediation}`);
125
+ process.exit(1);
126
+ }
127
+ }
28
128
  }
29
129
  catch (error) {
30
130
  console.error('Error:', error instanceof Error ? error.message : error);
@@ -1 +1 @@
1
- {"version":3,"file":"add.js","sourceRoot":"","sources":["../../../src/cli/commands/add.ts"],"names":[],"mappings":";;AAEA,gDA+BC;AA/BD,SAAgB,kBAAkB,CAAC,OAAgB;IACjD,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,+GAA+G,CAAC;SAC5H,cAAc,CAAC,iBAAiB,EAAE,aAAa,CAAC;SAChD,MAAM,CAAC,mBAAmB,EAAE,kCAAkC,CAAC;SAC/D,MAAM,CAAC,eAAe,EAAE,2EAA2E,CAAC;SACpG,MAAM,CAAC,sBAAsB,EAAE,gDAAgD,CAAC;SAChF,MAAM,CAAC,0BAA0B,EAAE,oBAAoB,CAAC;SACxD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBACrC,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;gBAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,mCAAmC,CAAC,CAAC;YACvE,MAAM,OAAO,GAAG,IAAI,aAAa,EAAE,CAAC;YAEpC,MAAM,OAAO,CAAC,SAAS,CAAC;gBACtB,IAAI,EAAE,OAAO,CAAC,MAAM;gBACpB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,WAAW,EAAE,OAAO,CAAC,WAAW;aACjC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../../src/cli/commands/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * `sungen figma` subcommand dispatcher.
3
+ *
4
+ * Subcommands:
5
+ * sungen figma auth set — prompt for PAT, validate via /v1/me, persist to .env
6
+ * sungen figma auth check — load PAT, call /v1/me, print handle + email
7
+ * sungen figma auth clear — remove FIGMA_PAT from .env
8
+ */
9
+ import { Command } from 'commander';
10
+ export declare function registerFigmaCommand(program: Command): void;
11
+ //# sourceMappingURL=figma.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"figma.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/figma.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0HpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8B3D"}
@@ -0,0 +1,178 @@
1
+ "use strict";
2
+ /**
3
+ * `sungen figma` subcommand dispatcher.
4
+ *
5
+ * Subcommands:
6
+ * sungen figma auth set — prompt for PAT, validate via /v1/me, persist to .env
7
+ * sungen figma auth check — load PAT, call /v1/me, print handle + email
8
+ * sungen figma auth clear — remove FIGMA_PAT from .env
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
22
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
23
+ }) : function(o, v) {
24
+ o["default"] = v;
25
+ });
26
+ var __importStar = (this && this.__importStar) || (function () {
27
+ var ownKeys = function(o) {
28
+ ownKeys = Object.getOwnPropertyNames || function (o) {
29
+ var ar = [];
30
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
31
+ return ar;
32
+ };
33
+ return ownKeys(o);
34
+ };
35
+ return function (mod) {
36
+ if (mod && mod.__esModule) return mod;
37
+ var result = {};
38
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
39
+ __setModuleDefault(result, mod);
40
+ return result;
41
+ };
42
+ })();
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.registerFigmaCommand = registerFigmaCommand;
45
+ const readline = __importStar(require("readline"));
46
+ const figma_auth_1 = require("../../tools/figma/figma-auth");
47
+ const FIGMA_API_BASE = 'https://api.figma.com';
48
+ // ---------------------------------------------------------------------------
49
+ // Helpers
50
+ // ---------------------------------------------------------------------------
51
+ /** Read a line from stdin without echoing characters (hidden input). */
52
+ function readHiddenInput(prompt) {
53
+ return new Promise((resolve) => {
54
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
55
+ // Disable echoing by replacing the _writeToOutput method
56
+ rl._writeToOutput = (str) => {
57
+ // Only write the prompt, not the typed characters
58
+ if (str === prompt)
59
+ rl.output.write(str);
60
+ };
61
+ rl.question(prompt, (answer) => {
62
+ rl.output.write('\n');
63
+ rl.close();
64
+ resolve(answer.trim());
65
+ });
66
+ });
67
+ }
68
+ /**
69
+ * Call GET /v1/me with the given PAT.
70
+ * Returns parsed body on 2xx, throws with a scrubbed error message on failure.
71
+ */
72
+ async function callFigmaMe(pat) {
73
+ let response;
74
+ try {
75
+ response = await fetch(`${FIGMA_API_BASE}/v1/me`, {
76
+ headers: { 'X-Figma-Token': pat },
77
+ });
78
+ }
79
+ catch (err) {
80
+ throw new Error(`Network error reaching Figma API: ${err.message ?? 'unknown'}`);
81
+ }
82
+ if (!response.ok) {
83
+ const status = response.status;
84
+ if (status === 403 || status === 401) {
85
+ throw new Error(`Figma API returned ${status}: token is invalid or lacks read scope.`);
86
+ }
87
+ throw new Error(`Figma API returned unexpected status ${status}.`);
88
+ }
89
+ return response.json();
90
+ }
91
+ // ---------------------------------------------------------------------------
92
+ // Subcommand handlers
93
+ // ---------------------------------------------------------------------------
94
+ async function handleAuthSet(options, cwd) {
95
+ let pat = options.token;
96
+ if (!pat) {
97
+ pat = await readHiddenInput('Enter Figma Personal Access Token: ');
98
+ }
99
+ if (!pat) {
100
+ console.error('Error: token cannot be empty.');
101
+ process.exit(1);
102
+ }
103
+ console.log('Validating token with Figma API…');
104
+ let me;
105
+ try {
106
+ me = await callFigmaMe(pat);
107
+ }
108
+ catch (err) {
109
+ console.error(`Error: ${err.message}`);
110
+ process.exit(1);
111
+ }
112
+ try {
113
+ await (0, figma_auth_1.savePat)(cwd, pat);
114
+ }
115
+ catch (err) {
116
+ console.error(`Error: ${err.message}`);
117
+ process.exit(1);
118
+ }
119
+ console.log(`Token validated and saved. Authenticated as: ${me.handle} <${me.email}>`);
120
+ }
121
+ async function handleAuthCheck(cwd) {
122
+ try {
123
+ await (0, figma_auth_1.assertSafeToUse)(cwd);
124
+ }
125
+ catch (err) {
126
+ console.error(`Error: ${err.message}`);
127
+ process.exit(1);
128
+ }
129
+ const pat = (0, figma_auth_1.loadPat)(cwd);
130
+ if (!pat) {
131
+ console.error('Error: No FIGMA_PAT configured. Run `sungen figma auth set` first.');
132
+ process.exit(1);
133
+ }
134
+ let me;
135
+ try {
136
+ me = await callFigmaMe(pat);
137
+ }
138
+ catch (err) {
139
+ console.error(`Error: ${err.message}`);
140
+ process.exit(1);
141
+ }
142
+ console.log(`Authenticated as: ${me.handle} <${me.email}>`);
143
+ }
144
+ async function handleAuthClear(cwd) {
145
+ (0, figma_auth_1.clearPat)(cwd);
146
+ console.log('FIGMA_PAT removed from .env.');
147
+ }
148
+ // ---------------------------------------------------------------------------
149
+ // Command registration
150
+ // ---------------------------------------------------------------------------
151
+ function registerFigmaCommand(program) {
152
+ const figma = program
153
+ .command('figma')
154
+ .description('Figma integration — manage authentication and (future) asset fetching');
155
+ const auth = figma
156
+ .command('auth')
157
+ .description('Manage Figma Personal Access Token');
158
+ auth
159
+ .command('set')
160
+ .description('Validate and save a Figma PAT to .env')
161
+ .option('--token <token>', 'PAT value (for scripting; prefer interactive prompt)')
162
+ .action(async (options) => {
163
+ await handleAuthSet(options, process.cwd());
164
+ });
165
+ auth
166
+ .command('check')
167
+ .description('Verify saved PAT by calling /v1/me and print account info')
168
+ .action(async () => {
169
+ await handleAuthCheck(process.cwd());
170
+ });
171
+ auth
172
+ .command('clear')
173
+ .description('Remove FIGMA_PAT from .env')
174
+ .action(async () => {
175
+ await handleAuthClear(process.cwd());
176
+ });
177
+ }
178
+ //# sourceMappingURL=figma.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"figma.js","sourceRoot":"","sources":["../../../src/cli/commands/figma.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4HH,oDA8BC;AAvJD,mDAAqC;AACrC,6DAA2F;AAG3F,MAAM,cAAc,GAAG,uBAAuB,CAAC;AAE/C,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,wEAAwE;AACxE,SAAS,eAAe,CAAC,MAAc;IACrC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACtF,yDAAyD;QACxD,EAAU,CAAC,cAAc,GAAG,CAAC,GAAW,EAAE,EAAE;YAC3C,kDAAkD;YAClD,IAAI,GAAG,KAAK,MAAM;gBAAG,EAAU,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpD,CAAC,CAAC;QACF,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;YAC5B,EAAU,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,WAAW,CAAC,GAAW;IACpC,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,cAAc,QAAQ,EAAE;YAChD,OAAO,EAAE,EAAE,eAAe,EAAE,GAAG,EAAE;SAClC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,qCAAqC,GAAG,CAAC,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC/B,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,sBAAsB,MAAM,yCAAyC,CAAC,CAAC;QACzF,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,wCAAwC,MAAM,GAAG,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,EAA8B,CAAC;AACrD,CAAC;AAED,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E,KAAK,UAAU,aAAa,CAAC,OAA2B,EAAE,GAAW;IACnE,IAAI,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC;IAExB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,GAAG,GAAG,MAAM,eAAe,CAAC,qCAAqC,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAChD,IAAI,EAAmB,CAAC;IACxB,IAAI,CAAC;QACH,EAAE,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAA,oBAAO,EAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,gDAAgD,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC;AACzF,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,GAAW;IACxC,IAAI,CAAC;QACH,MAAM,IAAA,4BAAe,EAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,GAAG,GAAG,IAAA,oBAAO,EAAC,GAAG,CAAC,CAAC;IACzB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,oEAAoE,CAAC,CAAC;QACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,EAAmB,CAAC;IACxB,IAAI,CAAC;QACH,EAAE,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC;AAC9D,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,GAAW;IACxC,IAAA,qBAAQ,EAAC,GAAG,CAAC,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;AAC9C,CAAC;AAED,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,SAAgB,oBAAoB,CAAC,OAAgB;IACnD,MAAM,KAAK,GAAG,OAAO;SAClB,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,uEAAuE,CAAC,CAAC;IAExF,MAAM,IAAI,GAAG,KAAK;SACf,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,oCAAoC,CAAC,CAAC;IAErD,IAAI;SACD,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,uCAAuC,CAAC;SACpD,MAAM,CAAC,iBAAiB,EAAE,sDAAsD,CAAC;SACjF,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,2DAA2D,CAAC;SACxE,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,eAAe,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,eAAe,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACP,CAAC"}
package/dist/cli/index.js CHANGED
@@ -12,22 +12,24 @@ const generate_1 = require("./commands/generate");
12
12
  const makeauth_1 = require("./commands/makeauth");
13
13
  const update_1 = require("./commands/update");
14
14
  const delivery_1 = require("./commands/delivery");
15
+ const figma_1 = require("./commands/figma");
15
16
  async function main() {
16
17
  const program = new commander_1.Command();
17
18
  program
18
19
  .name('sungen')
19
20
  .description('Deterministic E2E Test Compiler — Gherkin + Selectors → Playwright')
20
- .version('2.5.0');
21
+ .version('2.5.1');
21
22
  // Global options
22
23
  program
23
24
  .option('-v, --verbose', 'Enable verbose logging');
24
- // Register commands (6)
25
+ // Register commands (7)
25
26
  (0, init_1.registerInitCommand)(program);
26
27
  (0, add_1.registerAddCommand)(program);
27
28
  (0, generate_1.registerGenerateCommand)(program);
28
29
  (0, makeauth_1.registerMakeauthCommand)(program);
29
30
  (0, update_1.registerUpdateCommand)(program);
30
31
  (0, delivery_1.registerDeliveryCommand)(program);
32
+ (0, figma_1.registerFigmaCommand)(program);
31
33
  await program.parseAsync(process.argv);
32
34
  }
33
35
  main().catch((error) => {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;AACA;;;GAGG;;AAEH,yCAAoC;AACpC,0CAAsD;AACtD,wCAAoD;AACpD,kDAA8D;AAC9D,kDAA8D;AAC9D,8CAA0D;AAC1D,kDAA8D;AAE9D,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,QAAQ,CAAC;SACd,WAAW,CAAC,oEAAoE,CAAC;SACjF,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB,iBAAiB;IACjB,OAAO;SACJ,MAAM,CAAC,eAAe,EAAE,wBAAwB,CAAC,CAAC;IAErD,wBAAwB;IACxB,IAAA,0BAAmB,EAAC,OAAO,CAAC,CAAC;IAC7B,IAAA,wBAAkB,EAAC,OAAO,CAAC,CAAC;IAC5B,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;IACjC,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;IACjC,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;IAC/B,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;IAEjC,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;AACA;;;GAGG;;AAEH,yCAAoC;AACpC,0CAAsD;AACtD,wCAAoD;AACpD,kDAA8D;AAC9D,kDAA8D;AAC9D,8CAA0D;AAC1D,kDAA8D;AAC9D,4CAAwD;AAExD,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,QAAQ,CAAC;SACd,WAAW,CAAC,oEAAoE,CAAC;SACjF,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB,iBAAiB;IACjB,OAAO;SACJ,MAAM,CAAC,eAAe,EAAE,wBAAwB,CAAC,CAAC;IAErD,wBAAwB;IACxB,IAAA,0BAAmB,EAAC,OAAO,CAAC,CAAC;IAC7B,IAAA,wBAAkB,EAAC,OAAO,CAAC,CAAC;IAC5B,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;IACjC,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;IACjC,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;IAC/B,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;IACjC,IAAA,4BAAoB,EAAC,OAAO,CAAC,CAAC;IAE9B,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ai-rules-updater.d.ts","sourceRoot":"","sources":["../../src/orchestrator/ai-rules-updater.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,eAAO,MAAM,qBAAqB,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EA8CnD,CAAC;AAEF,qBAAa,cAAc;IACzB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,aAAa,CAAS;gBAElB,GAAG,EAAE,MAAM;IAKjB,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAwF7C"}
1
+ {"version":3,"file":"ai-rules-updater.d.ts","sourceRoot":"","sources":["../../src/orchestrator/ai-rules-updater.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,eAAO,MAAM,qBAAqB,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAgDnD,CAAC;AAEF,qBAAa,cAAc;IACzB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,aAAa,CAAS;gBAElB,GAAG,EAAE,MAAM;IAKjB,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAwF7C"}
@@ -72,6 +72,7 @@ exports.AI_RULES_FILE_MAPPING = [
72
72
  ['claude-skill-capture-figma.md', '.claude/skills/sungen-capture-figma/SKILL.md'],
73
73
  ['claude-skill-capture-local.md', '.claude/skills/sungen-capture-local/SKILL.md'],
74
74
  ['claude-skill-capture-live.md', '.claude/skills/sungen-capture-live/SKILL.md'],
75
+ ['claude-skill-figma-source.md', '.claude/skills/sungen-figma-source/SKILL.md'],
75
76
  // Skills — GitHub Copilot
76
77
  ['github-skill-sungen-gherkin-syntax.md', '.github/skills/sungen-gherkin-syntax/SKILL.md'],
77
78
  ['github-skill-sungen-selector-keys.md', '.github/skills/sungen-selector-keys/SKILL.md'],
@@ -85,6 +86,7 @@ exports.AI_RULES_FILE_MAPPING = [
85
86
  ['github-skill-sungen-capture-figma.md', '.github/skills/sungen-capture-figma/SKILL.md'],
86
87
  ['github-skill-sungen-capture-local.md', '.github/skills/sungen-capture-local/SKILL.md'],
87
88
  ['github-skill-sungen-capture-live.md', '.github/skills/sungen-capture-live/SKILL.md'],
89
+ ['github-skill-sungen-figma-source.md', '.github/skills/sungen-figma-source/SKILL.md'],
88
90
  ];
89
91
  class AIRulesUpdater {
90
92
  constructor(cwd) {
@@ -1 +1 @@
1
- {"version":3,"file":"ai-rules-updater.js","sourceRoot":"","sources":["../../src/orchestrator/ai-rules-updater.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ai-rules-updater.js","sourceRoot":"","sources":["../../src/orchestrator/ai-rules-updater.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Internal helpers for figma-scaffolder.ts.
3
+ * Extracted to keep the main orchestration file under 200 LOC.
4
+ */
5
+ import type { Ora } from 'ora';
6
+ /** Sanitize a Figma frame/variant name to a safe filename (lowercase, dashes). */
7
+ export declare function sanitizeName(name: string): string;
8
+ /** Read generator version from root package.json. Falls back to "sungen". */
9
+ export declare function readGeneratorVersion(cwd: string): string;
10
+ /** Minimal spec.md stub pointing users to spec_figma.md. */
11
+ export declare function minimalSpecMd(screenName: string): string;
12
+ export interface DownloadImagesOptions {
13
+ cwd: string;
14
+ fileKey: string;
15
+ versionId: string;
16
+ uiDir: string;
17
+ imageNodeIds: string[];
18
+ mainNodeId: string;
19
+ variantNames: string[];
20
+ /** Pre-warmed cache entries (nodeId → bytes). */
21
+ cachedImages: Map<string, Buffer>;
22
+ /** URL map from getImageUrls response (nodeId → signed URL). */
23
+ imageUrls: Record<string, string | null>;
24
+ frameBaseName: string;
25
+ scaleKind: `${number}x`;
26
+ spinner: Ora;
27
+ }
28
+ /**
29
+ * Download (or copy from cache) images for each node ID.
30
+ * Returns relative paths (e.g. "ui/login-frame.png") for each successfully written file.
31
+ */
32
+ export declare function downloadImages(opts: DownloadImagesOptions): Promise<string[]>;
33
+ //# sourceMappingURL=figma-scaffolder-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"figma-scaffolder-helpers.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/figma/figma-scaffolder-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAQ/B,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKjD;AAMD,6EAA6E;AAC7E,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAWxD;AAED,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAexD;AAMD,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,iDAAiD;IACjD,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,GAAG,MAAM,GAAG,CAAC;IACxB,OAAO,EAAE,GAAG,CAAC;CACd;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAyCnF"}