@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.
- package/README.md +88 -7
- package/dist/cli/commands/add.d.ts.map +1 -1
- package/dist/cli/commands/add.js +109 -9
- package/dist/cli/commands/add.js.map +1 -1
- package/dist/cli/commands/figma.d.ts +11 -0
- package/dist/cli/commands/figma.d.ts.map +1 -0
- package/dist/cli/commands/figma.js +178 -0
- package/dist/cli/commands/figma.js.map +1 -0
- package/dist/cli/index.js +4 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/orchestrator/ai-rules-updater.d.ts.map +1 -1
- package/dist/orchestrator/ai-rules-updater.js +2 -0
- package/dist/orchestrator/ai-rules-updater.js.map +1 -1
- package/dist/orchestrator/figma/figma-scaffolder-helpers.d.ts +33 -0
- package/dist/orchestrator/figma/figma-scaffolder-helpers.d.ts.map +1 -0
- package/dist/orchestrator/figma/figma-scaffolder-helpers.js +135 -0
- package/dist/orchestrator/figma/figma-scaffolder-helpers.js.map +1 -0
- package/dist/orchestrator/figma/figma-scaffolder-types.d.ts +25 -0
- package/dist/orchestrator/figma/figma-scaffolder-types.d.ts.map +1 -0
- package/dist/orchestrator/figma/figma-scaffolder-types.js +7 -0
- package/dist/orchestrator/figma/figma-scaffolder-types.js.map +1 -0
- package/dist/orchestrator/figma/figma-scaffolder.d.ts +23 -0
- package/dist/orchestrator/figma/figma-scaffolder.d.ts.map +1 -0
- package/dist/orchestrator/figma/figma-scaffolder.js +212 -0
- package/dist/orchestrator/figma/figma-scaffolder.js.map +1 -0
- package/dist/orchestrator/figma/node-path-collapser.d.ts +16 -0
- package/dist/orchestrator/figma/node-path-collapser.d.ts.map +1 -0
- package/dist/orchestrator/figma/node-path-collapser.js +37 -0
- package/dist/orchestrator/figma/node-path-collapser.js.map +1 -0
- package/dist/orchestrator/figma/spec-figma-renderer.d.ts +44 -0
- package/dist/orchestrator/figma/spec-figma-renderer.d.ts.map +1 -0
- package/dist/orchestrator/figma/spec-figma-renderer.js +45 -0
- package/dist/orchestrator/figma/spec-figma-renderer.js.map +1 -0
- package/dist/orchestrator/figma/spec-figma-section-renderers.d.ts +23 -0
- package/dist/orchestrator/figma/spec-figma-section-renderers.d.ts.map +1 -0
- package/dist/orchestrator/figma/spec-figma-section-renderers.js +47 -0
- package/dist/orchestrator/figma/spec-figma-section-renderers.js.map +1 -0
- package/dist/orchestrator/templates/ai-instructions/claude-cmd-add-screen.md +56 -11
- package/dist/orchestrator/templates/ai-instructions/claude-cmd-create-test.md +30 -17
- package/dist/orchestrator/templates/ai-instructions/claude-cmd-review.md +4 -3
- package/dist/orchestrator/templates/ai-instructions/claude-cmd-run-test.md +33 -1
- package/dist/orchestrator/templates/ai-instructions/claude-config.md +1 -0
- package/dist/orchestrator/templates/ai-instructions/claude-skill-figma-source.md +151 -0
- package/dist/orchestrator/templates/ai-instructions/claude-skill-tc-generation.md +39 -20
- package/dist/orchestrator/templates/ai-instructions/claude-skill-tc-review.md +2 -0
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-add-screen.md +53 -9
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-create-test.md +21 -16
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-review.md +4 -3
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-run-test.md +33 -1
- package/dist/orchestrator/templates/ai-instructions/copilot-config.md +1 -0
- package/dist/orchestrator/templates/ai-instructions/copilot-skill-figma-source.md +151 -0
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-figma-source.md +151 -0
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-selector-fix.md +61 -0
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +51 -25
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-tc-review.md +20 -0
- package/dist/tools/figma/figma-auth.d.ts +36 -0
- package/dist/tools/figma/figma-auth.d.ts.map +1 -0
- package/dist/tools/figma/figma-auth.js +182 -0
- package/dist/tools/figma/figma-auth.js.map +1 -0
- package/dist/tools/figma/figma-cache.d.ts +45 -0
- package/dist/tools/figma/figma-cache.d.ts.map +1 -0
- package/dist/tools/figma/figma-cache.js +191 -0
- package/dist/tools/figma/figma-cache.js.map +1 -0
- package/dist/tools/figma/figma-client-types.d.ts +112 -0
- package/dist/tools/figma/figma-client-types.d.ts.map +1 -0
- package/dist/tools/figma/figma-client-types.js +7 -0
- package/dist/tools/figma/figma-client-types.js.map +1 -0
- package/dist/tools/figma/figma-errors.d.ts +49 -0
- package/dist/tools/figma/figma-errors.d.ts.map +1 -0
- package/dist/tools/figma/figma-errors.js +105 -0
- package/dist/tools/figma/figma-errors.js.map +1 -0
- package/dist/tools/figma/figma-image-downloader.d.ts +25 -0
- package/dist/tools/figma/figma-image-downloader.d.ts.map +1 -0
- package/dist/tools/figma/figma-image-downloader.js +128 -0
- package/dist/tools/figma/figma-image-downloader.js.map +1 -0
- package/dist/tools/figma/figma-node-filter.d.ts +26 -0
- package/dist/tools/figma/figma-node-filter.d.ts.map +1 -0
- package/dist/tools/figma/figma-node-filter.js +164 -0
- package/dist/tools/figma/figma-node-filter.js.map +1 -0
- package/dist/tools/figma/figma-rest-client.d.ts +24 -0
- package/dist/tools/figma/figma-rest-client.d.ts.map +1 -0
- package/dist/tools/figma/figma-rest-client.js +154 -0
- package/dist/tools/figma/figma-rest-client.js.map +1 -0
- package/dist/tools/figma/figma-url-parser.d.ts +18 -0
- package/dist/tools/figma/figma-url-parser.d.ts.map +1 -0
- package/dist/tools/figma/figma-url-parser.js +51 -0
- package/dist/tools/figma/figma-url-parser.js.map +1 -0
- package/dist/utils/exec-file-no-throw.d.ts +20 -0
- package/dist/utils/exec-file-no-throw.d.ts.map +1 -0
- package/dist/utils/exec-file-no-throw.js +36 -0
- package/dist/utils/exec-file-no-throw.js.map +1 -0
- package/package.json +1 -1
- package/src/cli/commands/add.ts +80 -9
- package/src/cli/commands/figma.ts +162 -0
- package/src/cli/index.ts +4 -2
- package/src/orchestrator/ai-rules-updater.ts +2 -0
- package/src/orchestrator/figma/figma-scaffolder-helpers.ts +126 -0
- package/src/orchestrator/figma/figma-scaffolder-types.ts +26 -0
- package/src/orchestrator/figma/figma-scaffolder.ts +209 -0
- package/src/orchestrator/figma/node-path-collapser.ts +38 -0
- package/src/orchestrator/figma/spec-figma-renderer.ts +80 -0
- package/src/orchestrator/figma/spec-figma-section-renderers.ts +46 -0
- package/src/orchestrator/templates/ai-instructions/claude-cmd-add-screen.md +56 -11
- package/src/orchestrator/templates/ai-instructions/claude-cmd-create-test.md +30 -17
- package/src/orchestrator/templates/ai-instructions/claude-cmd-review.md +4 -3
- package/src/orchestrator/templates/ai-instructions/claude-cmd-run-test.md +33 -1
- package/src/orchestrator/templates/ai-instructions/claude-config.md +1 -0
- package/src/orchestrator/templates/ai-instructions/claude-skill-figma-source.md +151 -0
- package/src/orchestrator/templates/ai-instructions/claude-skill-tc-generation.md +39 -20
- package/src/orchestrator/templates/ai-instructions/claude-skill-tc-review.md +2 -0
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-add-screen.md +53 -9
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-create-test.md +21 -16
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-review.md +4 -3
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-run-test.md +33 -1
- package/src/orchestrator/templates/ai-instructions/copilot-config.md +1 -0
- package/src/orchestrator/templates/ai-instructions/copilot-skill-figma-source.md +151 -0
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-figma-source.md +151 -0
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-selector-fix.md +61 -0
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +51 -25
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-tc-review.md +20 -0
- package/src/tools/figma/figma-auth.ts +161 -0
- package/src/tools/figma/figma-cache.ts +184 -0
- package/src/tools/figma/figma-client-types.ts +125 -0
- package/src/tools/figma/figma-errors.ts +127 -0
- package/src/tools/figma/figma-image-downloader.ts +112 -0
- package/src/tools/figma/figma-node-filter.ts +198 -0
- package/src/tools/figma/figma-rest-client.ts +183 -0
- package/src/tools/figma/figma-url-parser.ts +55 -0
- 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-
|
|
34
|
-
/sungen-
|
|
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-
|
|
58
|
-
| Compile & run tests | `/sungen-
|
|
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
|
-
###
|
|
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
|
|
148
|
+
Output: `.feature` + `test-data.yaml` (no selectors — those are generated during run-test)
|
|
68
149
|
|
|
69
|
-
###
|
|
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;
|
|
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"}
|
package/dist/cli/commands/add.js
CHANGED
|
@@ -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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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":"
|
|
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":"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"}
|
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.
|
|
21
|
+
.version('2.5.1');
|
|
21
22
|
// Global options
|
|
22
23
|
program
|
|
23
24
|
.option('-v, --verbose', 'Enable verbose logging');
|
|
24
|
-
// Register commands (
|
|
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) => {
|
package/dist/cli/index.js.map
CHANGED
|
@@ -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;
|
|
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,
|
|
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":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,2CAA6B;AAE7B,2CAA2C;AAC3C,qCAAqC;AACxB,QAAA,qBAAqB,GAAuB;IACvD,SAAS;IACT,CAAC,kBAAkB,EAAE,WAAW,CAAC;IACjC,CAAC,mBAAmB,EAAE,iCAAiC,CAAC;IAExD,yBAAyB;IACzB,CAAC,0BAA0B,EAAE,uCAAuC,CAAC;IACrE,CAAC,2BAA2B,EAAE,wCAAwC,CAAC;IACvE,CAAC,wBAAwB,EAAE,qCAAqC,CAAC;IACjE,CAAC,sBAAsB,EAAE,mCAAmC,CAAC;IAC7D,CAAC,wBAAwB,EAAE,qCAAqC,CAAC;IAEjE,4BAA4B;IAC5B,CAAC,2BAA2B,EAAE,6CAA6C,CAAC;IAC5E,CAAC,4BAA4B,EAAE,8CAA8C,CAAC;IAC9E,CAAC,yBAAyB,EAAE,2CAA2C,CAAC;IACxE,CAAC,uBAAuB,EAAE,yCAAyC,CAAC;IACpE,CAAC,yBAAyB,EAAE,2CAA2C,CAAC;IAExE,uBAAuB;IACvB,CAAC,gCAAgC,EAAE,+CAA+C,CAAC;IACnF,CAAC,+BAA+B,EAAE,8CAA8C,CAAC;IACjF,CAAC,+BAA+B,EAAE,8CAA8C,CAAC;IACjF,CAAC,+BAA+B,EAAE,8CAA8C,CAAC;IACjF,CAAC,wCAAwC,EAAE,uDAAuD,CAAC;IACnG,CAAC,8BAA8B,EAAE,6CAA6C,CAAC;IAC/E,CAAC,2BAA2B,EAAE,0CAA0C,CAAC;IACzE,CAAC,2BAA2B,EAAE,0CAA0C,CAAC;IACzE,CAAC,0BAA0B,EAAE,yCAAyC,CAAC;IACvE,CAAC,+BAA+B,EAAE,8CAA8C,CAAC;IACjF,CAAC,+BAA+B,EAAE,8CAA8C,CAAC;IACjF,CAAC,8BAA8B,EAAE,6CAA6C,CAAC;IAC/E,CAAC,8BAA8B,EAAE,6CAA6C,CAAC;IAE/E,0BAA0B;IAC1B,CAAC,uCAAuC,EAAE,+CAA+C,CAAC;IAC1F,CAAC,sCAAsC,EAAE,8CAA8C,CAAC;IACxF,CAAC,sCAAsC,EAAE,8CAA8C,CAAC;IACxF,CAAC,sCAAsC,EAAE,8CAA8C,CAAC;IACxF,CAAC,+CAA+C,EAAE,uDAAuD,CAAC;IAC1G,CAAC,qCAAqC,EAAE,6CAA6C,CAAC;IACtF,CAAC,kCAAkC,EAAE,0CAA0C,CAAC;IAChF,CAAC,kCAAkC,EAAE,0CAA0C,CAAC;IAChF,CAAC,iCAAiC,EAAE,yCAAyC,CAAC;IAC9E,CAAC,sCAAsC,EAAE,8CAA8C,CAAC;IACxF,CAAC,sCAAsC,EAAE,8CAA8C,CAAC;IACxF,CAAC,qCAAqC,EAAE,6CAA6C,CAAC;IACtF,CAAC,qCAAqC,EAAE,6CAA6C,CAAC;CACvF,CAAC;AAEF,MAAa,cAAc;IAIzB,YAAY,GAAW;QACrB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC;IAC5E,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAe;QAC1B,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QAE/D,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,KAAK,MAAM,CAAC,YAAY,EAAE,aAAa,CAAC,IAAI,6BAAqB,EAAE,CAAC;YAClE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;YACjE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;YAEtD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;gBACjC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC3B,SAAS;YACX,CAAC;YAED,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAE1D,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9B,MAAM,cAAc,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBAC5D,IAAI,cAAc,KAAK,UAAU,EAAE,CAAC;oBAClC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;oBAC9B,SAAS;gBACX,CAAC;gBAED,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;gBACpD,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;oBAC3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;wBAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC/C,CAAC;oBACD,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;gBACpD,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,gBAAgB;QAChB,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,gBAAgB,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;YAChD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACzB,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;YAC9C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACzB,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,yBAAyB,SAAS,CAAC,MAAM,IAAI,CAAC,CAAC;YAC3D,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBAC1B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACzB,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,2BAA2B,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;YAC3D,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACzB,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;QAED,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QACrD,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QACjE,CAAC;aAAM,IAAI,MAAM,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,GAAG,YAAY,4DAA4D,CAAC,CAAC;QAC3F,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,GAAG,YAAY,gCAAgC,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;CACF;AAjGD,wCAiGC"}
|
|
@@ -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"}
|