@bilalba/fig-mcp 1.0.1 → 1.1.2
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/LICENSE +21 -0
- package/README.md +110 -55
- package/dist/index.js +55 -2
- package/dist/index.js.map +1 -1
- package/dist/inspect-fig.d.ts +1 -1
- package/dist/inspect-fig.d.ts.map +1 -1
- package/dist/inspect-fig.js +7 -3
- package/dist/inspect-fig.js.map +1 -1
- package/package.json +5 -2
- package/dist/debug/debug-stroke-geom.d.ts +0 -2
- package/dist/debug/debug-stroke-geom.d.ts.map +0 -1
- package/dist/debug/debug-stroke-geom.js +0 -67
- package/dist/debug/debug-stroke-geom.js.map +0 -1
- package/dist/debug/debug-transforms.d.ts +0 -2
- package/dist/debug/debug-transforms.d.ts.map +0 -1
- package/dist/debug/debug-transforms.js +0 -97
- package/dist/debug/debug-transforms.js.map +0 -1
- package/dist/debug/debug-vertex.d.ts +0 -2
- package/dist/debug/debug-vertex.d.ts.map +0 -1
- package/dist/debug/debug-vertex.js +0 -72
- package/dist/debug/debug-vertex.js.map +0 -1
- package/dist/debug-group.d.ts +0 -5
- package/dist/debug-group.d.ts.map +0 -1
- package/dist/debug-group.js +0 -44
- package/dist/debug-group.js.map +0 -1
- package/dist/debug-stroke-geom.d.ts +0 -2
- package/dist/debug-stroke-geom.d.ts.map +0 -1
- package/dist/debug-stroke-geom.js +0 -67
- package/dist/debug-stroke-geom.js.map +0 -1
- package/dist/debug-transforms.d.ts +0 -2
- package/dist/debug-transforms.d.ts.map +0 -1
- package/dist/debug-transforms.js +0 -97
- package/dist/debug-transforms.js.map +0 -1
- package/dist/debug-vertex.d.ts +0 -2
- package/dist/debug-vertex.d.ts.map +0 -1
- package/dist/debug-vertex.js +0 -72
- package/dist/debug-vertex.js.map +0 -1
- package/dist/experimental/paint-utils.d.ts +0 -35
- package/dist/experimental/paint-utils.d.ts.map +0 -1
- package/dist/experimental/paint-utils.js +0 -105
- package/dist/experimental/paint-utils.js.map +0 -1
- package/dist/experimental/render-screen-v2.d.ts +0 -32
- package/dist/experimental/render-screen-v2.d.ts.map +0 -1
- package/dist/experimental/render-screen-v2.js +0 -366
- package/dist/experimental/render-screen-v2.js.map +0 -1
- package/dist/experimental/render-screen.d.ts +0 -26
- package/dist/experimental/render-screen.d.ts.map +0 -1
- package/dist/experimental/render-screen.js +0 -547
- package/dist/experimental/render-screen.js.map +0 -1
- package/dist/experimental/render-types.d.ts +0 -43
- package/dist/experimental/render-types.d.ts.map +0 -1
- package/dist/experimental/render-types.js +0 -22
- package/dist/experimental/render-types.js.map +0 -1
- package/dist/experimental/render-utils.d.ts +0 -38
- package/dist/experimental/render-utils.d.ts.map +0 -1
- package/dist/experimental/render-utils.js +0 -126
- package/dist/experimental/render-utils.js.map +0 -1
- package/dist/experimental/screenshot.d.ts +0 -11
- package/dist/experimental/screenshot.d.ts.map +0 -1
- package/dist/experimental/screenshot.js +0 -26
- package/dist/experimental/screenshot.js.map +0 -1
- package/dist/experimental/vector-renderer.d.ts +0 -31
- package/dist/experimental/vector-renderer.d.ts.map +0 -1
- package/dist/experimental/vector-renderer.js +0 -427
- package/dist/experimental/vector-renderer.js.map +0 -1
- package/dist/test-render-v2.d.ts +0 -5
- package/dist/test-render-v2.d.ts.map +0 -1
- package/dist/test-render-v2.js +0 -76
- package/dist/test-render-v2.js.map +0 -1
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 bilal
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,106 +1,161 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @bilalba/fig-mcp
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
MCP server for parsing `.fig` files. Enables AI assistants to understand and extract design information from the `.fig` file format for implementation guidance.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Installation
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
- Extract colors, text content, and styling information
|
|
11
|
-
- Find nodes by type or name
|
|
12
|
-
- Get detailed node information for implementation
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g @bilalba/fig-mcp
|
|
9
|
+
```
|
|
13
10
|
|
|
14
|
-
|
|
11
|
+
Or use directly with npx:
|
|
15
12
|
|
|
16
13
|
```bash
|
|
17
|
-
|
|
18
|
-
npm run build
|
|
14
|
+
npx @bilalba/fig-mcp --help
|
|
19
15
|
```
|
|
20
16
|
|
|
21
|
-
##
|
|
17
|
+
## Quick Start
|
|
22
18
|
|
|
23
|
-
### As MCP Server
|
|
19
|
+
### As MCP Server (for Claude Desktop)
|
|
24
20
|
|
|
25
|
-
Add to your
|
|
21
|
+
Add to your Claude Desktop configuration (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS):
|
|
26
22
|
|
|
27
23
|
```json
|
|
28
24
|
{
|
|
29
25
|
"mcpServers": {
|
|
30
26
|
"fig-mcp": {
|
|
31
|
-
"command": "
|
|
32
|
-
"args": ["/
|
|
27
|
+
"command": "npx",
|
|
28
|
+
"args": ["@bilalba/fig-mcp"]
|
|
33
29
|
}
|
|
34
30
|
}
|
|
35
31
|
}
|
|
36
32
|
```
|
|
37
33
|
|
|
38
|
-
|
|
34
|
+
Then ask Claude to parse your `.fig` files:
|
|
35
|
+
|
|
36
|
+
> "Parse my design.fig file and show me the document structure"
|
|
37
|
+
|
|
38
|
+
### Web Viewer
|
|
39
|
+
|
|
40
|
+
Browse and preview `.fig` files in your browser:
|
|
39
41
|
|
|
40
42
|
```bash
|
|
41
|
-
|
|
42
|
-
|
|
43
|
+
fig-mcp viewer design.fig
|
|
44
|
+
# Opens http://localhost:3000
|
|
45
|
+
```
|
|
43
46
|
|
|
44
|
-
|
|
45
|
-
|
|
47
|
+
Features:
|
|
48
|
+
- Tree navigation with collapsible nodes
|
|
49
|
+
- SVG preview with zoom/pan
|
|
50
|
+
- Node details panel
|
|
51
|
+
- Copy node IDs for MCP tool calls
|
|
46
52
|
|
|
47
|
-
|
|
48
|
-
npx tsx src/inspect-fig.ts design.fig json
|
|
53
|
+
### CLI Inspector
|
|
49
54
|
|
|
50
|
-
|
|
51
|
-
npx tsx src/inspect-fig.ts design.fig stats
|
|
55
|
+
Inspect `.fig` files from the command line:
|
|
52
56
|
|
|
53
|
-
|
|
54
|
-
|
|
57
|
+
```bash
|
|
58
|
+
fig-mcp inspect design.fig summary # Show document structure
|
|
59
|
+
fig-mcp inspect design.fig stats # Show node type counts
|
|
60
|
+
fig-mcp inspect design.fig list # List archive contents
|
|
61
|
+
fig-mcp inspect design.fig json # Output simplified JSON
|
|
55
62
|
```
|
|
56
63
|
|
|
64
|
+
## CLI Commands
|
|
65
|
+
|
|
66
|
+
| Command | Description |
|
|
67
|
+
|---------|-------------|
|
|
68
|
+
| `fig-mcp` | Start MCP server (for AI assistants) |
|
|
69
|
+
| `fig-mcp viewer <file> [port]` | Open web viewer |
|
|
70
|
+
| `fig-mcp inspect <file> [cmd]` | Inspect file |
|
|
71
|
+
| `fig-mcp --help` | Show help |
|
|
72
|
+
| `fig-mcp --version` | Show version |
|
|
73
|
+
|
|
57
74
|
## MCP Tools
|
|
58
75
|
|
|
76
|
+
The MCP server exposes the following tools for AI assistants:
|
|
77
|
+
|
|
78
|
+
### Document Structure
|
|
79
|
+
|
|
59
80
|
| Tool | Description |
|
|
60
81
|
|------|-------------|
|
|
61
82
|
| `parse_fig_file` | Parse and return simplified document structure |
|
|
62
|
-
| `get_document_summary` | Text tree of document structure |
|
|
83
|
+
| `get_document_summary` | Text tree of document structure with pagination |
|
|
84
|
+
| `get_tree_summary` | Hierarchical summary for drill-down navigation |
|
|
85
|
+
| `list_pages` | List all pages (canvases) in the document |
|
|
86
|
+
| `get_page_contents` | Get contents of a specific page |
|
|
87
|
+
|
|
88
|
+
### Node Queries
|
|
89
|
+
|
|
90
|
+
| Tool | Description |
|
|
91
|
+
|------|-------------|
|
|
63
92
|
| `find_nodes` | Find nodes by type or name |
|
|
64
|
-
| `get_node_details` | Get details for a node path |
|
|
93
|
+
| `get_node_details` | Get details for a node by path |
|
|
94
|
+
| `get_node_by_id` | Get details for a node by GUID |
|
|
65
95
|
| `get_layout_info` | Get inferred layout properties |
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
|
96
|
+
|
|
97
|
+
### Content Extraction
|
|
98
|
+
|
|
99
|
+
| Tool | Description |
|
|
100
|
+
|------|-------------|
|
|
101
|
+
| `get_text_content` | Extract all text content |
|
|
102
|
+
| `get_colors` | Extract unique color palette |
|
|
103
|
+
| `list_nodes_with_fills` | List nodes with fill paints |
|
|
104
|
+
|
|
105
|
+
### Image & Rendering
|
|
106
|
+
|
|
107
|
+
| Tool | Description |
|
|
108
|
+
|------|-------------|
|
|
109
|
+
| `list_images` | List all images with metadata |
|
|
110
|
+
| `get_image` | Get image by hash (base64) |
|
|
111
|
+
| `get_thumbnail` | Get document thumbnail |
|
|
112
|
+
| `render_screen` | Render node subtree as PNG |
|
|
113
|
+
| `get_vector` | Export vector as SVG, PDF, PNG, or WebP |
|
|
114
|
+
|
|
115
|
+
### Debugging
|
|
116
|
+
|
|
117
|
+
| Tool | Description |
|
|
118
|
+
|------|-------------|
|
|
119
|
+
| `get_schema_info` | Kiwi schema information |
|
|
120
|
+
| `get_raw_message` | Raw decoded message |
|
|
121
|
+
| `list_archive_contents` | List files in the archive |
|
|
122
|
+
| `clear_cache` | Clear file cache |
|
|
70
123
|
|
|
71
124
|
## How It Works
|
|
72
125
|
|
|
73
|
-
1. `.fig` files are ZIP archives containing
|
|
126
|
+
1. `.fig` files are ZIP archives containing:
|
|
127
|
+
- `canvas.fig` - Main document data (kiwi binary format)
|
|
128
|
+
- `meta.json` - File metadata
|
|
129
|
+
- `thumbnail.png` - Preview image
|
|
130
|
+
- `images/` - Image assets
|
|
131
|
+
|
|
74
132
|
2. The `canvas.fig` uses Evan Wallace's [kiwi](https://github.com/evanw/kiwi) binary format
|
|
133
|
+
|
|
75
134
|
3. The kiwi schema is embedded in each file and extracted at parse time
|
|
76
|
-
|
|
135
|
+
|
|
136
|
+
4. Document data is decoded and transformed into structured information
|
|
137
|
+
|
|
77
138
|
5. Layout properties are inferred from node positions and auto-layout settings
|
|
78
139
|
|
|
79
|
-
##
|
|
140
|
+
## Features
|
|
80
141
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
│ └── inspect-fig.ts # CLI tool
|
|
93
|
-
├── kiwi/ # Cloned kiwi library
|
|
94
|
-
├── CLAUDE.md # Development guide
|
|
95
|
-
└── TODO.md # Project roadmap
|
|
96
|
-
```
|
|
142
|
+
- Parse `.fig` files locally without API access
|
|
143
|
+
- Extract document structure, nodes, and hierarchy
|
|
144
|
+
- Infer layout properties (flexbox-like direction, gap, padding, alignment)
|
|
145
|
+
- Extract colors, text content, and styling information
|
|
146
|
+
- Render nodes to PNG screenshots
|
|
147
|
+
- Export vectors as SVG, PDF, PNG, or WebP
|
|
148
|
+
- Full effect support (shadows, blurs)
|
|
149
|
+
|
|
150
|
+
## Requirements
|
|
151
|
+
|
|
152
|
+
- Node.js 18 or higher
|
|
97
153
|
|
|
98
154
|
## Limitations
|
|
99
155
|
|
|
100
156
|
- The `.fig` format is undocumented and may change
|
|
101
|
-
- Some complex properties (vector networks, gradients) may not be fully parsed
|
|
102
|
-
- Blob data (embedded images in fills) is not decoded
|
|
103
157
|
- This is for local `.fig` files only (use a cloud API for hosted files)
|
|
158
|
+
- Some complex properties may not be fully parsed
|
|
104
159
|
|
|
105
160
|
## License
|
|
106
161
|
|
package/dist/index.js
CHANGED
|
@@ -9,8 +9,53 @@ import open from "open";
|
|
|
9
9
|
import { startServer } from "./mcp/server.js";
|
|
10
10
|
import { startHttpServer } from "./http-server.js";
|
|
11
11
|
import { createServer as createViewerServer } from "./web-viewer/server.js";
|
|
12
|
+
import { runInspect } from "./inspect-fig.js";
|
|
13
|
+
import { readFileSync } from "fs";
|
|
14
|
+
import { fileURLToPath } from "url";
|
|
15
|
+
import { dirname, join } from "path";
|
|
12
16
|
const args = process.argv.slice(2);
|
|
13
|
-
|
|
17
|
+
const command = args[0];
|
|
18
|
+
// Get package.json for version
|
|
19
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
20
|
+
const pkg = JSON.parse(readFileSync(join(__dirname, "../package.json"), "utf-8"));
|
|
21
|
+
if (command === "--version" || command === "-v") {
|
|
22
|
+
console.log(pkg.version);
|
|
23
|
+
process.exit(0);
|
|
24
|
+
}
|
|
25
|
+
if (command === "--help" || command === "-h" || command === "help") {
|
|
26
|
+
console.log(`
|
|
27
|
+
fig-mcp v${pkg.version} - MCP server for parsing .fig files
|
|
28
|
+
|
|
29
|
+
Usage:
|
|
30
|
+
fig-mcp Start MCP server (for AI assistants)
|
|
31
|
+
fig-mcp viewer <file> [port] Start web viewer for a .fig file
|
|
32
|
+
fig-mcp inspect <file> [command] Inspect a .fig file
|
|
33
|
+
|
|
34
|
+
Viewer:
|
|
35
|
+
Opens a local web UI to browse and preview .fig file contents.
|
|
36
|
+
Default port: 3000
|
|
37
|
+
|
|
38
|
+
Inspect commands:
|
|
39
|
+
list - List archive contents
|
|
40
|
+
schema - Show kiwi schema info
|
|
41
|
+
summary - Show document structure (default)
|
|
42
|
+
raw - Show raw message (truncated)
|
|
43
|
+
json - Output simplified JSON
|
|
44
|
+
stats - Show node type statistics
|
|
45
|
+
|
|
46
|
+
Options:
|
|
47
|
+
--help, -h Show this help
|
|
48
|
+
--version, -v Show version
|
|
49
|
+
|
|
50
|
+
Examples:
|
|
51
|
+
fig-mcp viewer design.fig # Open viewer on port 3000
|
|
52
|
+
fig-mcp viewer design.fig 8080 # Open viewer on port 8080
|
|
53
|
+
fig-mcp inspect design.fig summary # Show document structure
|
|
54
|
+
fig-mcp inspect design.fig stats # Show node type counts
|
|
55
|
+
`);
|
|
56
|
+
process.exit(0);
|
|
57
|
+
}
|
|
58
|
+
if (command === "viewer") {
|
|
14
59
|
const figFile = args[1];
|
|
15
60
|
const port = parseInt(args[2] || "3000", 10);
|
|
16
61
|
if (!figFile) {
|
|
@@ -22,7 +67,10 @@ if (args[0] === "viewer") {
|
|
|
22
67
|
void open(url);
|
|
23
68
|
});
|
|
24
69
|
}
|
|
25
|
-
else {
|
|
70
|
+
else if (command === "inspect") {
|
|
71
|
+
await runInspect(args.slice(1));
|
|
72
|
+
}
|
|
73
|
+
else if (!command) {
|
|
26
74
|
// Start HTTP server for image serving
|
|
27
75
|
startHttpServer();
|
|
28
76
|
// Exit when stdin closes (MCP client disconnected)
|
|
@@ -35,4 +83,9 @@ else {
|
|
|
35
83
|
process.exit(1);
|
|
36
84
|
});
|
|
37
85
|
}
|
|
86
|
+
else {
|
|
87
|
+
console.error(`Unknown command: ${command}`);
|
|
88
|
+
console.error("Run 'fig-mcp --help' for usage information.");
|
|
89
|
+
process.exit(1);
|
|
90
|
+
}
|
|
38
91
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,YAAY,IAAI,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/inspect-fig.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inspect-fig.d.ts","sourceRoot":"","sources":["../src/inspect-fig.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG"}
|
|
1
|
+
{"version":3,"file":"inspect-fig.d.ts","sourceRoot":"","sources":["../src/inspect-fig.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG;AAcH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4H9D"}
|
package/dist/inspect-fig.js
CHANGED
|
@@ -13,8 +13,7 @@
|
|
|
13
13
|
* json - Output simplified JSON
|
|
14
14
|
*/
|
|
15
15
|
import { readFigFile, listFigContents, parseCanvasFig, getSchemaInfo, extractDocumentTree, getDocumentSummary, simplifyNode, countNodesByType, } from "./parser/index.js";
|
|
16
|
-
async function
|
|
17
|
-
const args = process.argv.slice(2);
|
|
16
|
+
export async function runInspect(args) {
|
|
18
17
|
if (args.length === 0) {
|
|
19
18
|
console.log(`
|
|
20
19
|
Fig Inspector - Inspect .fig files
|
|
@@ -130,5 +129,10 @@ Commands:
|
|
|
130
129
|
process.exit(1);
|
|
131
130
|
}
|
|
132
131
|
}
|
|
133
|
-
|
|
132
|
+
// Run when executed directly
|
|
133
|
+
const isDirectExecution = import.meta.url === `file://${process.argv[1]}` ||
|
|
134
|
+
process.argv[1]?.endsWith('inspect-fig.ts');
|
|
135
|
+
if (isDirectExecution) {
|
|
136
|
+
runInspect(process.argv.slice(2));
|
|
137
|
+
}
|
|
134
138
|
//# sourceMappingURL=inspect-fig.js.map
|
package/dist/inspect-fig.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inspect-fig.js","sourceRoot":"","sources":["../src/inspect-fig.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG;AAGH,OAAO,EACL,WAAW,EACX,eAAe,EACf,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAE3B,
|
|
1
|
+
{"version":3,"file":"inspect-fig.js","sourceRoot":"","sources":["../src/inspect-fig.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bilalba/fig-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.2",
|
|
4
4
|
"description": "MCP server for parsing .fig files",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"fig",
|
|
@@ -26,15 +26,18 @@
|
|
|
26
26
|
},
|
|
27
27
|
"files": [
|
|
28
28
|
"dist",
|
|
29
|
-
"package.json",
|
|
30
29
|
"README.md",
|
|
31
30
|
"LICENSE"
|
|
32
31
|
],
|
|
32
|
+
"engines": {
|
|
33
|
+
"node": ">=18"
|
|
34
|
+
},
|
|
33
35
|
"directories": {
|
|
34
36
|
"test": "tests"
|
|
35
37
|
},
|
|
36
38
|
"scripts": {
|
|
37
39
|
"build": "tsc",
|
|
40
|
+
"prepublishOnly": "npm run build",
|
|
38
41
|
"dev": "tsx watch src/index.ts",
|
|
39
42
|
"start": "node dist/index.js",
|
|
40
43
|
"test": "tsx src/test-parser.ts",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"debug-stroke-geom.d.ts","sourceRoot":"","sources":["../../src/debug/debug-stroke-geom.ts"],"names":[],"mappings":""}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Debug strokeGeometry for complex vector 457:1697
|
|
3
|
-
*/
|
|
4
|
-
import { readFigFile } from "../parser/index.js";
|
|
5
|
-
import { parseCanvasFig, formatGUID, extractDocumentTree } from "../parser/kiwi-parser.js";
|
|
6
|
-
async function debug() {
|
|
7
|
-
const archive = await readFigFile("/Users/billy/Downloads/AutoDevice (Copy).fig");
|
|
8
|
-
const parsed = parseCanvasFig(archive.canvasFig);
|
|
9
|
-
const doc = extractDocumentTree(parsed.message);
|
|
10
|
-
if (!doc)
|
|
11
|
-
return;
|
|
12
|
-
const nodeIndex = new Map();
|
|
13
|
-
function indexNode(node) {
|
|
14
|
-
nodeIndex.set(formatGUID(node.guid), node);
|
|
15
|
-
if (node.children) {
|
|
16
|
-
for (const child of node.children) {
|
|
17
|
-
indexNode(child);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
indexNode(doc);
|
|
22
|
-
const blobs = parsed.message["blobs"];
|
|
23
|
-
// Check all 3 vectors in frame 457:1694
|
|
24
|
-
for (const id of ["457:1695", "457:1696", "457:1697"]) {
|
|
25
|
-
const rawNode = nodeIndex.get(id);
|
|
26
|
-
if (!rawNode) {
|
|
27
|
-
console.log(`Node ${id} not found`);
|
|
28
|
-
continue;
|
|
29
|
-
}
|
|
30
|
-
const node = rawNode;
|
|
31
|
-
console.log(`\n${"=".repeat(60)}`);
|
|
32
|
-
console.log(`Node ${id}: ${node.name}`);
|
|
33
|
-
console.log("fillGeometry:", JSON.stringify(node.fillGeometry, null, 2));
|
|
34
|
-
console.log("strokeGeometry:", JSON.stringify(node.strokeGeometry, null, 2));
|
|
35
|
-
// If strokeGeometry has commandsBlob, decode it
|
|
36
|
-
const strokeGeom = node.strokeGeometry;
|
|
37
|
-
if (strokeGeom?.[0]?.commandsBlob !== undefined && blobs) {
|
|
38
|
-
const blobIdx = strokeGeom[0].commandsBlob;
|
|
39
|
-
const bytes = blobs[blobIdx].bytes;
|
|
40
|
-
console.log(`\nstrokeGeometry[0].commandsBlob (${bytes.length} bytes):`);
|
|
41
|
-
// Decode path commands
|
|
42
|
-
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.length);
|
|
43
|
-
const cmdNames = { 0: "Z", 1: "M", 2: "L", 3: "Q", 4: "C", 5: "Q2" };
|
|
44
|
-
const argCounts = { 0: 0, 1: 2, 2: 2, 3: 4, 4: 6, 5: 4 };
|
|
45
|
-
let offset = 0;
|
|
46
|
-
const cmds = [];
|
|
47
|
-
while (offset < bytes.length) {
|
|
48
|
-
const cmd = bytes[offset++];
|
|
49
|
-
const name = cmdNames[cmd] ?? `?${cmd}`;
|
|
50
|
-
const argCount = argCounts[cmd];
|
|
51
|
-
if (argCount === undefined) {
|
|
52
|
-
cmds.push(`${name}(unknown)`);
|
|
53
|
-
break;
|
|
54
|
-
}
|
|
55
|
-
const args = [];
|
|
56
|
-
for (let i = 0; i < argCount && offset + 4 <= bytes.length; i++) {
|
|
57
|
-
args.push(view.getFloat32(offset, true));
|
|
58
|
-
offset += 4;
|
|
59
|
-
}
|
|
60
|
-
cmds.push(`${name}(${args.map(a => a.toFixed(2)).join(", ")})`);
|
|
61
|
-
}
|
|
62
|
-
console.log(cmds.join(" → "));
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
debug().catch(console.error);
|
|
67
|
-
//# sourceMappingURL=debug-stroke-geom.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"debug-stroke-geom.js","sourceRoot":"","sources":["../../src/debug/debug-stroke-geom.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"debug-transforms.d.ts","sourceRoot":"","sources":["../../src/debug/debug-transforms.ts"],"names":[],"mappings":""}
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Debug transforms - show what transform data exists on nodes
|
|
3
|
-
*/
|
|
4
|
-
import { readFigFile } from "../parser/index.js";
|
|
5
|
-
import { parseCanvasFig, extractDocumentTree, formatGUID } from "../parser/kiwi-parser.js";
|
|
6
|
-
const FILE_PATH = "/Users/billy/Downloads/AutoDevice (Copy).fig";
|
|
7
|
-
const NODE_ID = process.argv[2] || "457:1681";
|
|
8
|
-
function normalizeNodeId(nodeId) {
|
|
9
|
-
let normalized = nodeId.trim();
|
|
10
|
-
if (/^\d+-\d+$/.test(normalized)) {
|
|
11
|
-
normalized = normalized.replace('-', ':');
|
|
12
|
-
}
|
|
13
|
-
return normalized;
|
|
14
|
-
}
|
|
15
|
-
async function debug() {
|
|
16
|
-
const normalizedId = normalizeNodeId(NODE_ID);
|
|
17
|
-
console.log("Node ID:", normalizedId);
|
|
18
|
-
const archive = await readFigFile(FILE_PATH);
|
|
19
|
-
const parsed = parseCanvasFig(archive.canvasFig);
|
|
20
|
-
const doc = extractDocumentTree(parsed.message);
|
|
21
|
-
if (!doc) {
|
|
22
|
-
console.log("Failed to extract document");
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
const nodeIndex = new Map();
|
|
26
|
-
function indexNode(node) {
|
|
27
|
-
nodeIndex.set(formatGUID(node.guid), node);
|
|
28
|
-
if (node.children) {
|
|
29
|
-
for (const child of node.children) {
|
|
30
|
-
indexNode(child);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
indexNode(doc);
|
|
35
|
-
const node = nodeIndex.get(normalizedId);
|
|
36
|
-
if (!node) {
|
|
37
|
-
console.log("Node not found:", normalizedId);
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
const sceneNode = node;
|
|
41
|
-
console.log("\n=== ROOT NODE ===");
|
|
42
|
-
console.log("Name:", node.name);
|
|
43
|
-
console.log("Type:", node.type);
|
|
44
|
-
console.log("x:", sceneNode.x);
|
|
45
|
-
console.log("y:", sceneNode.y);
|
|
46
|
-
console.log("width:", sceneNode.width);
|
|
47
|
-
console.log("height:", sceneNode.height);
|
|
48
|
-
console.log("transform:", sceneNode.transform);
|
|
49
|
-
if (node.children) {
|
|
50
|
-
console.log("\n=== CHILDREN ===");
|
|
51
|
-
for (const child of node.children) {
|
|
52
|
-
const childScene = child;
|
|
53
|
-
console.log("\n--- Child:", child.name, "(", child.type, ") ---");
|
|
54
|
-
console.log("x:", childScene.x);
|
|
55
|
-
console.log("y:", childScene.y);
|
|
56
|
-
console.log("width:", childScene.width);
|
|
57
|
-
console.log("height:", childScene.height);
|
|
58
|
-
console.log("transform:", childScene.transform);
|
|
59
|
-
console.log("size:", childScene.size);
|
|
60
|
-
console.log("vectorData?.normalizedSize:", childScene.vectorData?.normalizedSize);
|
|
61
|
-
console.log("fillGeometry count:", childScene.fillGeometry?.length || 0);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
// Show what renderScreen uses vs what nodeToSvg uses
|
|
65
|
-
console.log("\n=== TRANSFORM USAGE COMPARISON ===");
|
|
66
|
-
console.log("\nrenderScreen (vector-renderer.ts):");
|
|
67
|
-
console.log(" - Uses getLocalTransform() which reads node.transform matrix");
|
|
68
|
-
console.log(" - Composes transforms: multiplyTransforms(parentTransform, localTransform)");
|
|
69
|
-
console.log(" - Handles rotation properly");
|
|
70
|
-
console.log("\nnodeToSvg (vector-export.ts):");
|
|
71
|
-
console.log(" - Uses offset-based positioning only (x/y accumulation)");
|
|
72
|
-
console.log(" - Creates identity-like transform with just scale");
|
|
73
|
-
console.log(" - IGNORES node.transform matrix entirely!");
|
|
74
|
-
// Check if children have transforms
|
|
75
|
-
console.log("\n=== DO CHILDREN HAVE TRANSFORMS? ===");
|
|
76
|
-
if (node.children) {
|
|
77
|
-
for (const child of node.children) {
|
|
78
|
-
const childScene = child;
|
|
79
|
-
const hasTransform = childScene.transform != null;
|
|
80
|
-
const isIdentity = childScene.transform &&
|
|
81
|
-
Math.abs(childScene.transform.m00 - 1) < 0.001 &&
|
|
82
|
-
Math.abs(childScene.transform.m01) < 0.001 &&
|
|
83
|
-
Math.abs(childScene.transform.m10) < 0.001 &&
|
|
84
|
-
Math.abs(childScene.transform.m11 - 1) < 0.001;
|
|
85
|
-
console.log(`${child.name}:`);
|
|
86
|
-
console.log(` hasTransform: ${hasTransform}`);
|
|
87
|
-
if (hasTransform) {
|
|
88
|
-
console.log(` isIdentity: ${isIdentity}`);
|
|
89
|
-
console.log(` m00=${childScene.transform.m00}, m01=${childScene.transform.m01}`);
|
|
90
|
-
console.log(` m10=${childScene.transform.m10}, m11=${childScene.transform.m11}`);
|
|
91
|
-
console.log(` m02=${childScene.transform.m02}, m12=${childScene.transform.m12}`);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
debug().catch(console.error);
|
|
97
|
-
//# sourceMappingURL=debug-transforms.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"debug-transforms.js","sourceRoot":"","sources":["../../src/debug/debug-transforms.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"debug-vertex.d.ts","sourceRoot":"","sources":["../../src/debug/debug-vertex.ts"],"names":[],"mappings":""}
|