@visual-layer/cli 1.0.0

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/dist/bin.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":""}
package/dist/bin.js ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ import { runCli } from './index.js';
3
+ runCli(process.argv).catch((err) => {
4
+ const code = err.code ?? 'internal_error';
5
+ process.stderr.write(`${code}: ${err instanceof Error ? err.message : String(err)}\n`);
6
+ process.exit(1);
7
+ });
8
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACjC,MAAM,IAAI,GAAI,GAAyB,CAAC,IAAI,IAAI,gBAAgB,CAAC;IACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @visual-layer/cli — debug + CI fallback.
3
+ *
4
+ * Commands:
5
+ * visual-layer capture browser --snapshot <path|-> [--viewport WxH] [--dpr N] [--out path]
6
+ * visual-layer capture figma --file <key> --node <id> [--token <tok>] [--mock <fixture>] [--include-image] [--out path]
7
+ * visual-layer ground --graph <path> --instruction "<text>" [--topK N] [--out path]
8
+ * visual-layer inspect --graph <path>
9
+ * visual-layer compare --expected <path> --actual <path> [--mode fixture-v0] [--out path]
10
+ * visual-layer eval --fixtures <dir> [--topK N]
11
+ */
12
+ import { Command } from 'commander';
13
+ import { type Warning } from '@visual-layer/core';
14
+ export declare const CLI_VERSION = "0.1.0";
15
+ export declare function createProgram(): Command;
16
+ export declare function runCli(argv: readonly string[]): Promise<void>;
17
+ export type { Warning };
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EAIL,KAAK,OAAO,EACb,MAAM,oBAAoB,CAAC;AAI5B,eAAO,MAAM,WAAW,UAAU,CAAC;AAmGnC,wBAAgB,aAAa,IAAI,OAAO,CA0HvC;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAKnE;AAED,YAAY,EAAE,OAAO,EAAE,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,240 @@
1
+ /**
2
+ * @visual-layer/cli — debug + CI fallback.
3
+ *
4
+ * Commands:
5
+ * visual-layer capture browser --snapshot <path|-> [--viewport WxH] [--dpr N] [--out path]
6
+ * visual-layer capture figma --file <key> --node <id> [--token <tok>] [--mock <fixture>] [--include-image] [--out path]
7
+ * visual-layer ground --graph <path> --instruction "<text>" [--topK N] [--out path]
8
+ * visual-layer inspect --graph <path>
9
+ * visual-layer compare --expected <path> --actual <path> [--mode fixture-v0] [--out path]
10
+ * visual-layer eval --fixtures <dir> [--topK N]
11
+ */
12
+ import { Command } from 'commander';
13
+ import { readFileSync, writeFileSync, existsSync, readdirSync, mkdirSync } from 'node:fs';
14
+ import { isDeepStrictEqual } from 'node:util';
15
+ import path from 'node:path';
16
+ import { snapshotToScreenGraph, ScreenGraph, } from '@visual-layer/core';
17
+ import { groundInstruction, compareGraphs, evalGrounding } from '@visual-layer/grounding';
18
+ import { HttpFigmaClient, MockFigmaClient, captureFigma } from '@visual-layer/figma-rest';
19
+ export const CLI_VERSION = '0.1.0';
20
+ /**
21
+ * MCP server entries written by `visual-layer init`. visual-layer owns the
22
+ * normalize adapter; chrome-devtools-mcp is the external browser engine
23
+ * (separate npm package, separate stdio process — §18.6 engine boundary).
24
+ */
25
+ const MCP_SERVER_ENTRIES = {
26
+ 'visual-layer': { type: 'stdio', command: 'npx', args: ['-y', '@visual-layer/mcp-server'] },
27
+ 'chrome-devtools': { type: 'stdio', command: 'npx', args: ['-y', 'chrome-devtools-mcp@latest'] },
28
+ };
29
+ function readJson(file) {
30
+ const raw = file === '-' ? readStdin() : readFileSync(resolvePath(file), 'utf8');
31
+ return JSON.parse(raw);
32
+ }
33
+ function readStdin() {
34
+ // ponytail: synchronous stdin read; fine for CLI pipe usage
35
+ try {
36
+ return readFileSync(0, 'utf8');
37
+ }
38
+ catch {
39
+ throw new Error('no snapshot provided on stdin and no --snapshot given');
40
+ }
41
+ }
42
+ function resolvePath(p) {
43
+ return path.isAbsolute(p) ? p : path.resolve(process.cwd(), p);
44
+ }
45
+ function writeOutput(data, opts) {
46
+ const json = JSON.stringify(data, null, 2);
47
+ if (opts.out) {
48
+ const abs = resolvePath(opts.out);
49
+ mkdirSync(path.dirname(abs), { recursive: true });
50
+ writeFileSync(abs, json + '\n', 'utf8');
51
+ process.stdout.write(`${opts.out}\n`);
52
+ }
53
+ else {
54
+ process.stdout.write(json + '\n');
55
+ }
56
+ }
57
+ function parseViewport(s) {
58
+ if (!s)
59
+ return undefined;
60
+ const m = /^(\d+)x(\d+)$/.exec(s);
61
+ if (!m)
62
+ throw new Error(`--viewport must be WxH, got "${s}"`);
63
+ return { width: Number(m[1]), height: Number(m[2]) };
64
+ }
65
+ /**
66
+ * Write/merge `.mcp.json` in `targetDir` with the VisualLayer + chrome-devtools
67
+ * servers. Idempotent: re-running is a no-op. Non-destructive: existing entries
68
+ * under our keys that differ are skipped unless `force` is set; unrelated keys
69
+ * are always preserved.
70
+ */
71
+ function initMcpJson(targetDir, opts) {
72
+ const mcpPath = path.join(targetDir, '.mcp.json');
73
+ // ponytail: loose shape — preserve any unrelated top-level keys on write.
74
+ const base = {};
75
+ if (existsSync(mcpPath)) {
76
+ try {
77
+ Object.assign(base, JSON.parse(readFileSync(mcpPath, 'utf8')));
78
+ }
79
+ catch {
80
+ throw new Error(`.mcp.json exists but is not valid JSON: ${mcpPath}`);
81
+ }
82
+ }
83
+ if (!base.mcpServers || typeof base.mcpServers !== 'object')
84
+ base.mcpServers = {};
85
+ const lines = [];
86
+ let changed = false;
87
+ for (const [name, entry] of Object.entries(MCP_SERVER_ENTRIES)) {
88
+ const existing = base.mcpServers[name];
89
+ if (existing === undefined) {
90
+ base.mcpServers[name] = entry;
91
+ lines.push(` + ${name}: added`);
92
+ changed = true;
93
+ }
94
+ else if (isDeepStrictEqual(existing, entry)) {
95
+ lines.push(` = ${name}: already configured`);
96
+ }
97
+ else if (opts.force) {
98
+ base.mcpServers[name] = entry;
99
+ lines.push(` ~ ${name}: overwritten (--force)`);
100
+ changed = true;
101
+ }
102
+ else {
103
+ lines.push(` ! ${name}: differs, skipped (use --force to overwrite)`);
104
+ }
105
+ }
106
+ if (changed) {
107
+ mkdirSync(targetDir, { recursive: true });
108
+ writeFileSync(mcpPath, JSON.stringify(base, null, 2) + '\n', 'utf8');
109
+ }
110
+ return [
111
+ changed ? `Wrote ${mcpPath}` : `No changes (${mcpPath})`,
112
+ ...lines,
113
+ 'Restart Claude Code to load the servers.',
114
+ ].join('\n');
115
+ }
116
+ export function createProgram() {
117
+ const program = new Command();
118
+ program
119
+ .name('visual-layer')
120
+ .description('VisualLayer CLI — debug + CI fallback')
121
+ .version(CLI_VERSION)
122
+ // Throw instead of process.exit so callers (tests, MCP server) can handle errors.
123
+ .exitOverride();
124
+ const capture = program.command('capture').description('Capture a ScreenGraph');
125
+ capture
126
+ .command('browser')
127
+ .description('Normalize a chrome-devtools-mcp snapshot into a ScreenGraph')
128
+ .option('--snapshot <path|->', 'snapshot JSON file path, or "-" for stdin')
129
+ .option('--viewport <WxH>', 'viewport size, e.g. 1440x900')
130
+ .option('--dpr <n>', 'device pixel ratio', parseFloat)
131
+ .option('--out <path>', 'write graph JSON to file instead of stdout')
132
+ .action((opts) => {
133
+ const snapPath = opts.snapshot ?? '-';
134
+ const snapshot = readJson(snapPath);
135
+ const viewport = parseViewport(opts.viewport);
136
+ if (viewport && opts.dpr)
137
+ viewport.dpr = opts.dpr;
138
+ const { graph } = snapshotToScreenGraph(snapshot, { viewport });
139
+ writeOutput(graph, { out: opts.out });
140
+ });
141
+ capture
142
+ .command('figma')
143
+ .description('Capture a Figma node into a ScreenGraph')
144
+ .requiredOption('--file <key>', 'Figma file key')
145
+ .requiredOption('--node <id>', 'Figma node id')
146
+ .option('--token <tok>', 'Figma token (overrides FIGMA_TOKEN env)')
147
+ .option('--mock <fixture>', 'path to a mock Figma file JSON (no network)')
148
+ .option('--include-image', 'fetch rendered image ref')
149
+ .option('--out <path>', 'write graph JSON to file instead of stdout')
150
+ .action(async (opts) => {
151
+ const client = opts.mock
152
+ ? new MockFigmaClient({ [opts.file]: JSON.parse(readFileSync(resolvePath(opts.mock), 'utf8')) })
153
+ : new HttpFigmaClient({ token: opts.token });
154
+ const { graph } = await captureFigma(client, {
155
+ fileKey: opts.file,
156
+ nodeId: opts.node,
157
+ includeImage: opts.includeImage === true,
158
+ });
159
+ writeOutput(graph, { out: opts.out });
160
+ });
161
+ program
162
+ .command('ground')
163
+ .description('Ground an instruction against a ScreenGraph')
164
+ .requiredOption('--graph <path>', 'ScreenGraph JSON path')
165
+ .requiredOption('--instruction <text>', 'natural-language instruction')
166
+ .option('--topK <n>', 'top-K candidates', (v) => Number(v), 5)
167
+ .option('--out <path>', 'write result JSON to file instead of stdout')
168
+ .action((opts) => {
169
+ const graph = ScreenGraph.parse(readJson(opts.graph));
170
+ const result = groundInstruction(graph, opts.instruction, { topK: opts.topK });
171
+ writeOutput(result, { out: opts.out });
172
+ });
173
+ program
174
+ .command('inspect')
175
+ .description('Print a human-readable ScreenGraph summary')
176
+ .requiredOption('--graph <path>', 'ScreenGraph JSON path')
177
+ .action((opts) => {
178
+ const g = ScreenGraph.parse(readJson(opts.graph));
179
+ const lines = [];
180
+ lines.push(`ScreenGraph ${g.id} (source=${g.source}, v${g.version})`);
181
+ lines.push(` interactables: ${g.interactables.length}`);
182
+ if (g.viewport)
183
+ lines.push(` viewport: ${g.viewport.width}x${g.viewport.height}${g.viewport.dpr ? ` @${g.viewport.dpr}x` : ''}`);
184
+ lines.push(' top interactables:');
185
+ for (const i of g.interactables.slice(0, 20)) {
186
+ const label = i.text ?? i.name ?? '(no label)';
187
+ lines.push(` [${i.role ?? '?'}] ${label} bbox=${JSON.stringify(i.bbox)} src=${i.source.join('+')}`);
188
+ }
189
+ if (g.warnings.length > 0) {
190
+ lines.push(` warnings (${g.warnings.length}):`);
191
+ for (const w of g.warnings.slice(0, 20))
192
+ lines.push(` ${w.severity} ${w.code}: ${w.message}`);
193
+ }
194
+ process.stdout.write(lines.join('\n') + '\n');
195
+ });
196
+ program
197
+ .command('compare')
198
+ .description('Compare two ScreenGraphs (fixture-v0)')
199
+ .requiredOption('--expected <path>', 'expected ScreenGraph JSON')
200
+ .requiredOption('--actual <path>', 'actual ScreenGraph JSON')
201
+ .option('--mode <mode>', 'compare mode', 'fixture-v0')
202
+ .option('--out <path>', 'write result JSON to file instead of stdout')
203
+ .action((opts) => {
204
+ const expected = ScreenGraph.parse(readJson(opts.expected));
205
+ const actual = ScreenGraph.parse(readJson(opts.actual));
206
+ const result = compareGraphs(expected, actual, { mode: opts.mode });
207
+ writeOutput(result, { out: opts.out });
208
+ });
209
+ program
210
+ .command('eval')
211
+ .description('Run the fixture grounding eval harness')
212
+ .requiredOption('--fixtures <dir>', 'directory of fixture JSON files')
213
+ .option('--topK <n>', 'top-K', (v) => Number(v), 1)
214
+ .action((opts) => {
215
+ const dir = resolvePath(opts.fixtures);
216
+ if (!existsSync(dir))
217
+ throw new Error(`fixtures dir not found: ${dir}`);
218
+ const files = readdirSync(dir).filter((f) => f.endsWith('.json')).sort();
219
+ const fixtures = files.map((f) => JSON.parse(readFileSync(path.join(dir, f), 'utf8')));
220
+ const result = evalGrounding(fixtures, { topK: opts.topK });
221
+ writeOutput(result, { out: undefined });
222
+ });
223
+ program
224
+ .command('init')
225
+ .description('Write/merge .mcp.json with visual-layer + chrome-devtools MCP servers')
226
+ .option('--cwd <path>', 'target directory (default: current directory)')
227
+ .option('--force', 'overwrite existing visual-layer/chrome-devtools entries that differ')
228
+ .action((opts) => {
229
+ const out = initMcpJson(resolvePath(opts.cwd ?? process.cwd()), { force: opts.force === true });
230
+ process.stdout.write(out + '\n');
231
+ });
232
+ return program;
233
+ }
234
+ export async function runCli(argv) {
235
+ const program = createProgram();
236
+ // argv is the full process.argv ([nodePath, scriptPath, ...userArgs]);
237
+ // default parsing strips the first two. Tests pass user-only args with from:'user'.
238
+ await program.parseAsync(argv);
239
+ }
240
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@visual-layer/cli",
3
+ "version": "1.0.0",
4
+ "description": "CLI debug and CI fallback for VisualLayer",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://gitlab.com/locotine/vision-layer.git",
10
+ "directory": "packages/cli"
11
+ },
12
+ "publishConfig": {
13
+ "access": "public"
14
+ },
15
+ "main": "./dist/index.js",
16
+ "types": "./dist/index.d.ts",
17
+ "bin": {
18
+ "visual-layer": "./dist/bin.js"
19
+ },
20
+ "exports": {
21
+ ".": {
22
+ "types": "./dist/index.d.ts",
23
+ "import": "./dist/index.js"
24
+ }
25
+ },
26
+ "files": [
27
+ "dist"
28
+ ],
29
+ "dependencies": {
30
+ "commander": "^12.1.0",
31
+ "@visual-layer/grounding": "1.0.0",
32
+ "@visual-layer/core": "1.0.0",
33
+ "@visual-layer/figma-rest": "1.0.0"
34
+ },
35
+ "scripts": {
36
+ "build": "tsc -b",
37
+ "typecheck": "tsc -b"
38
+ }
39
+ }