cssprobe-cli 0.2.7 → 0.2.9

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/AGENTS.md CHANGED
@@ -55,6 +55,8 @@ src/
55
55
 
56
56
  ### Session Management
57
57
  - `open [url]` — Open browser in session mode (non-blocking)
58
+ - `--viewport <WxH>` — Set viewport size (e.g. `--viewport 1280x720`)
59
+ - `--state <file>` — Load saved state (cookies + localStorage)
58
60
  - `close` — Close the browser session
59
61
  - `status` — Show current session status
60
62
 
@@ -68,11 +70,16 @@ src/
68
70
  - `inject-css <css>` — Inject CSS into the current page
69
71
 
70
72
  ### Browser
73
+ - `resize <width> <height>` — Resize browser viewport
74
+ - `eval <expression>` — Evaluate JavaScript (browser context)
75
+ - `playwright <call>` — Execute Playwright API call (Node.js context)
71
76
  - `screenshot` — Take a screenshot
72
- - `eval <expression>` — Evaluate JavaScript
73
77
 
74
78
  ### State
75
79
  - `state-import [file]` — Import cookies from Netscape format
80
+ - `--out <file>` — Output state file path (default: `~/.cssprobe-cli/states/imported.json`)
81
+ - `--name <name>` — Custom name for the state file (e.g. `mysite` or `mysite.json`)
82
+ - `--merge <file>` — Existing state file to merge into
76
83
 
77
84
  ### Config
78
85
  - `config-show` / `config-set` / `config-list` / `config-use` / `config-new` / `config-path`
package/README.md CHANGED
@@ -26,6 +26,9 @@ cssprobe-cli skill-install
26
26
  # Open browser (non-blocking, starts daemon session)
27
27
  cssprobe-cli open https://getbootstrap.com/docs/5.3/examples/checkout
28
28
 
29
+ # Open with custom viewport
30
+ cssprobe-cli open https://example.com --viewport 1280x720
31
+
29
32
  # Inspect with CSS selector
30
33
  cssprobe-cli inspect .container
31
34
 
@@ -68,6 +71,12 @@ cssprobe-cli close
68
71
  ```bash
69
72
  # Import cookies from browser export (Netscape format)
70
73
  cssprobe-cli state-import cookies.txt --out ~/.cssprobe-cli/states/mysite.json
74
+
75
+ # Or use --name for simpler syntax
76
+ cssprobe-cli state-import cookies.txt --name mysite
77
+
78
+ # Open browser with saved state
79
+ cssprobe-cli open https://mysite.com --state ~/.cssprobe-cli/states/mysite.json
71
80
  ```
72
81
 
73
82
  ### 4. JSON Output
@@ -113,6 +122,8 @@ cssprobe-cli close
113
122
 
114
123
  ```bash
115
124
  cssprobe-cli open [url] # Open browser in session mode (non-blocking)
125
+ cssprobe-cli open [url] --viewport 1280x720 # Open with custom viewport
126
+ cssprobe-cli open [url] --state ~/.cssprobe-cli/states/mysite.json # Open with saved state
116
127
  cssprobe-cli close # Close browser session
117
128
  cssprobe-cli status # Show session status
118
129
  ```
@@ -135,8 +146,10 @@ cssprobe-cli inject-css <css> # Inject CSS into current page
135
146
  ### Browser
136
147
 
137
148
  ```bash
149
+ cssprobe-cli resize <width> <height> # Resize browser viewport
150
+ cssprobe-cli eval <expression> # Evaluate JavaScript (browser context)
151
+ cssprobe-cli playwright <call> # Execute Playwright API (Node.js context)
138
152
  cssprobe-cli screenshot # Take screenshot
139
- cssprobe-cli eval <expression> # Evaluate JavaScript
140
153
  ```
141
154
 
142
155
  ### State
@@ -208,6 +221,9 @@ Import cookies from Netscape format (browser export standard) into a Playwright
208
221
  # From file
209
222
  cssprobe-cli state-import cookies.txt --out mystate.json
210
223
 
224
+ # From file with custom name (saves to ~/.cssprobe-cli/states/<name>.json)
225
+ cssprobe-cli state-import cookies.txt --name mysite
226
+
211
227
  # From stdin
212
228
  cat cookies.txt | cssprobe-cli state-import --out mystate.json
213
229
 
@@ -55,6 +55,8 @@ const open = (0, command_1.declareCommand)({
55
55
  options: z.object({
56
56
  browser: z.enum(['chromium', 'firefox', 'webkit']).optional().describe('browser engine (default chromium)'),
57
57
  headed: z.boolean().optional().describe('show the browser window'),
58
+ viewport: z.string().optional().describe('viewport size as WxH (e.g. 1280x720)'),
59
+ state: z.string().optional().describe('path to saved state file (cookies + localStorage)'),
58
60
  }),
59
61
  });
60
62
  const close = (0, command_1.declareCommand)({
@@ -126,14 +128,31 @@ const screenshot = (0, command_1.declareCommand)({
126
128
  'full-page': z.boolean().optional().describe('take screenshot of the full scrollable page'),
127
129
  }),
128
130
  });
131
+ const resize = (0, command_1.declareCommand)({
132
+ name: 'resize',
133
+ category: 'core',
134
+ description: 'Resize the browser viewport',
135
+ args: z.object({
136
+ width: numberArg.describe('viewport width'),
137
+ height: numberArg.describe('viewport height'),
138
+ }),
139
+ });
129
140
  const evalCmd = (0, command_1.declareCommand)({
130
141
  name: 'eval',
131
142
  category: 'core',
132
- description: 'Evaluate JavaScript expression on the page',
143
+ description: 'Evaluate JavaScript expression on the page (browser context)',
133
144
  args: z.object({
134
145
  expression: z.string().describe('JavaScript expression to evaluate'),
135
146
  }),
136
147
  });
148
+ const playwrightCmd = (0, command_1.declareCommand)({
149
+ name: 'playwright',
150
+ category: 'core',
151
+ description: 'Execute Playwright API call (Node.js context)',
152
+ args: z.object({
153
+ call: z.string().describe('Playwright API call, e.g. "page.setViewportSize({width: 1280, height: 720})"'),
154
+ }),
155
+ });
137
156
  // ── state management ──
138
157
  const stateImport = (0, command_1.declareCommand)({
139
158
  name: 'state-import',
@@ -144,6 +163,7 @@ const stateImport = (0, command_1.declareCommand)({
144
163
  }),
145
164
  options: z.object({
146
165
  out: z.string().optional().describe('output state file path (default: ~/.cssprobe-cli/states/imported.json)'),
166
+ name: z.string().optional().describe('custom name for the state file (e.g. mysite or mysite.json)'),
147
167
  merge: z.string().optional().describe('existing state file to merge into'),
148
168
  }),
149
169
  });
@@ -222,7 +242,7 @@ const commandsArray = [
222
242
  // cssprobe
223
243
  inspect, tree, layout, findings, injectCss,
224
244
  // browser
225
- screenshot, evalCmd,
245
+ resize, evalCmd, playwrightCmd, screenshot,
226
246
  // state
227
247
  stateImport,
228
248
  // config
@@ -58,6 +58,8 @@ async function program() {
58
58
  case 'inject-css':
59
59
  case 'screenshot':
60
60
  case 'eval':
61
+ case 'resize':
62
+ case 'playwright':
61
63
  await handleSessionCommand(commandName, command, rawArgs, output);
62
64
  return;
63
65
  }
@@ -109,10 +111,30 @@ async function handleOpen(command, args, output) {
109
111
  const url = parsed.url || 'about:blank';
110
112
  const browser = parsed.browser || 'chromium';
111
113
  const headed = !!parsed.headed;
114
+ const viewportStr = parsed.viewport;
115
+ const state = parsed.state;
116
+ // Parse viewport
117
+ let viewport;
118
+ if (viewportStr) {
119
+ const parts = viewportStr.split('x');
120
+ if (parts.length !== 2) {
121
+ output.error('Invalid viewport format. Use WxH (e.g. 1280x720)');
122
+ return;
123
+ }
124
+ const width = parseInt(parts[0], 10);
125
+ const height = parseInt(parts[1], 10);
126
+ if (isNaN(width) || isNaN(height)) {
127
+ output.error('Invalid viewport dimensions. Must be numbers.');
128
+ return;
129
+ }
130
+ viewport = { width, height };
131
+ }
112
132
  // Start daemon
113
133
  const { pid } = await session_1.Session.startDaemon({
114
134
  browser,
115
135
  headed,
136
+ viewport,
137
+ state,
116
138
  _: ['open', url],
117
139
  }, 'open');
118
140
  // Wait a bit for daemon to start
@@ -126,6 +148,7 @@ async function handleOpen(command, args, output) {
126
148
  sessionId: 'default',
127
149
  pid,
128
150
  url,
151
+ viewport: viewport || { width: 1280, height: 720 },
129
152
  };
130
153
  if (output.json) {
131
154
  console.log(JSON.stringify(result, null, 2));
@@ -134,6 +157,7 @@ async function handleOpen(command, args, output) {
134
157
  console.log(`Browser opened at ${url}`);
135
158
  console.log(`Session ID: default`);
136
159
  console.log(`PID: ${pid}`);
160
+ console.log(`Viewport: ${viewport?.width || 1280}x${viewport?.height || 720}`);
137
161
  }
138
162
  }
139
163
  catch (e) {
@@ -372,7 +396,16 @@ async function handleStateImport(command, args, output) {
372
396
  const cmdArgs = splitArgs(args);
373
397
  const parsed = (0, command_1.parseCommand)(command, cmdArgs);
374
398
  const filePath = parsed.file;
375
- const outPath = parsed.out || path_1.default.join(os_1.default.homedir(), '.cssprobe-cli', 'states', 'imported.json');
399
+ const name = parsed.name;
400
+ let outPath = parsed.out;
401
+ if (!outPath && name) {
402
+ // Use custom name in default states directory
403
+ const fileName = name.endsWith('.json') ? name : `${name}.json`;
404
+ outPath = path_1.default.join(os_1.default.homedir(), '.cssprobe-cli', 'states', fileName);
405
+ }
406
+ else if (!outPath) {
407
+ outPath = path_1.default.join(os_1.default.homedir(), '.cssprobe-cli', 'states', 'imported.json');
408
+ }
376
409
  const mergePath = parsed.merge;
377
410
  let content;
378
411
  if (filePath) {
@@ -7,5 +7,10 @@ import type { ClientInfo } from './session';
7
7
  export interface DaemonOptions {
8
8
  headed?: boolean;
9
9
  browser?: string;
10
+ viewport?: {
11
+ width: number;
12
+ height: number;
13
+ };
14
+ state?: string;
10
15
  }
11
16
  export declare function startDaemon(sessionName: string, clientInfo: ClientInfo, options: DaemonOptions): Promise<string>;
@@ -16,6 +16,7 @@ const socketConnection_1 = require("../utils/socketConnection");
16
16
  const launcher_1 = require("../browser/launcher");
17
17
  const analyzer_1 = require("../engine/analyzer");
18
18
  const renderer_1 = require("../engine/renderer");
19
+ const AsyncFunction = Object.getPrototypeOf(async function () { }).constructor;
19
20
  async function startDaemon(sessionName, clientInfo, options) {
20
21
  const sessionConfig = createSessionConfig(clientInfo, sessionName, options);
21
22
  const { socketPath } = sessionConfig;
@@ -32,6 +33,8 @@ async function startDaemon(sessionName, clientInfo, options) {
32
33
  const launcher = new launcher_1.BrowserLauncher({
33
34
  browser: options.browser || 'chromium',
34
35
  headed: options.headed !== false,
36
+ viewport: options.viewport,
37
+ state: options.state,
35
38
  });
36
39
  const server = net_1.default.createServer(socket => {
37
40
  const connection = new socketConnection_1.SocketConnection(socket);
@@ -173,6 +176,30 @@ async function executeCommand(launcher, args) {
173
176
  const result = await page.evaluate(expression);
174
177
  return { text: JSON.stringify(result, null, 2) };
175
178
  }
179
+ case 'resize': {
180
+ const width = parseInt(params[0], 10);
181
+ const height = parseInt(params[1], 10);
182
+ if (isNaN(width) || isNaN(height))
183
+ throw new Error('Usage: cssprobe-cli resize <width> <height>');
184
+ const page = launcher.getPage();
185
+ if (!page)
186
+ throw new Error('Browser is not open. Run: cssprobe-cli open <url>');
187
+ await page.setViewportSize({ width, height });
188
+ return { text: JSON.stringify({ width, height }) };
189
+ }
190
+ case 'playwright': {
191
+ const call = params[0];
192
+ if (!call)
193
+ throw new Error('Playwright API call is required');
194
+ const page = launcher.getPage();
195
+ if (!page)
196
+ throw new Error('Browser is not open. Run: cssprobe-cli open <url>');
197
+ // Create a safe eval context with page and browser objects
198
+ const asyncFunction = new AsyncFunction('page', 'browser', `return ${call}`);
199
+ const browser = page.context().browser();
200
+ const result = await asyncFunction(page, browser);
201
+ return { text: JSON.stringify(result, null, 2) };
202
+ }
176
203
  default:
177
204
  throw new Error(`Unknown command: ${command}`);
178
205
  }
@@ -12,6 +12,7 @@ const sessionName = args[0] || 'default';
12
12
  const options = {
13
13
  headed: args.includes('--headed'),
14
14
  browser: args.find(a => a.startsWith('--browser='))?.split('=')[1],
15
+ state: args.find(a => a.startsWith('--state='))?.split('=')[1],
15
16
  };
16
17
  async function main() {
17
18
  try {
@@ -84,6 +84,8 @@ class Session {
84
84
  daemonArgs.push('--headed');
85
85
  if (args.browser)
86
86
  daemonArgs.push(`--browser=${args.browser}`);
87
+ if (args.state)
88
+ daemonArgs.push(`--state=${args.state}`);
87
89
  const child = require('child_process').spawn(process.execPath, daemonArgs, {
88
90
  detached: true,
89
91
  stdio: ['ignore', 'pipe', err],
@@ -31,7 +31,7 @@ var require_package = __commonJS({
31
31
  "package.json"(exports2, module2) {
32
32
  module2.exports = {
33
33
  name: "cssprobe-cli",
34
- version: "0.2.7",
34
+ version: "0.2.9",
35
35
  description: "Runtime CSS probe \u2014 inspect layout, colors, backgrounds, fonts and more in a live browser. AI agents and shell automation.",
36
36
  keywords: [
37
37
  "css",
@@ -1169,6 +1169,8 @@ function renderJSON(snapshot, findings, brief = false) {
1169
1169
  }
1170
1170
 
1171
1171
  // src/daemon/daemon.ts
1172
+ var AsyncFunction = Object.getPrototypeOf(async function() {
1173
+ }).constructor;
1172
1174
  async function startDaemon(sessionName2, clientInfo, options2) {
1173
1175
  const sessionConfig = createSessionConfig(clientInfo, sessionName2, options2);
1174
1176
  const { socketPath } = sessionConfig;
@@ -1181,7 +1183,9 @@ async function startDaemon(sessionName2, clientInfo, options2) {
1181
1183
  }
1182
1184
  const launcher = new BrowserLauncher({
1183
1185
  browser: options2.browser || "chromium",
1184
- headed: options2.headed !== false
1186
+ headed: options2.headed !== false,
1187
+ viewport: options2.viewport,
1188
+ state: options2.state
1185
1189
  });
1186
1190
  const server = import_net.default.createServer((socket) => {
1187
1191
  const connection = new SocketConnection(socket);
@@ -1320,6 +1324,29 @@ async function executeCommand(launcher, args2) {
1320
1324
  const result = await page.evaluate(expression);
1321
1325
  return { text: JSON.stringify(result, null, 2) };
1322
1326
  }
1327
+ case "resize": {
1328
+ const width = parseInt(params[0], 10);
1329
+ const height = parseInt(params[1], 10);
1330
+ if (isNaN(width) || isNaN(height))
1331
+ throw new Error("Usage: cssprobe-cli resize <width> <height>");
1332
+ const page = launcher.getPage();
1333
+ if (!page)
1334
+ throw new Error("Browser is not open. Run: cssprobe-cli open <url>");
1335
+ await page.setViewportSize({ width, height });
1336
+ return { text: JSON.stringify({ width, height }) };
1337
+ }
1338
+ case "playwright": {
1339
+ const call = params[0];
1340
+ if (!call)
1341
+ throw new Error("Playwright API call is required");
1342
+ const page = launcher.getPage();
1343
+ if (!page)
1344
+ throw new Error("Browser is not open. Run: cssprobe-cli open <url>");
1345
+ const asyncFunction = new AsyncFunction("page", "browser", `return ${call}`);
1346
+ const browser = page.context().browser();
1347
+ const result = await asyncFunction(page, browser);
1348
+ return { text: JSON.stringify(result, null, 2) };
1349
+ }
1323
1350
  default:
1324
1351
  throw new Error(`Unknown command: ${command}`);
1325
1352
  }
@@ -1426,7 +1453,8 @@ var args = process.argv.slice(2);
1426
1453
  var sessionName = args[0] || "default";
1427
1454
  var options = {
1428
1455
  headed: args.includes("--headed"),
1429
- browser: args.find((a) => a.startsWith("--browser="))?.split("=")[1]
1456
+ browser: args.find((a) => a.startsWith("--browser="))?.split("=")[1],
1457
+ state: args.find((a) => a.startsWith("--state="))?.split("=")[1]
1430
1458
  };
1431
1459
  async function main() {
1432
1460
  try {
package/dist/help.json CHANGED
@@ -1,11 +1,13 @@
1
1
  {
2
- "global": "Usage: cssprobe-cli <command> [args] [options]\n\n\nSession Management:\n open [url] open browser in session mode (non-blocking)\n close close the browser session\n status show current session status\n eval <expression> evaluate javascript expression on the page\n state-import [file] import cookies from netscape format file\n\nCSS Inspection:\n inspect <selector> inspect the runtime css of a page element\n tree <selector> show dom tree structure\n layout <selector> show ascii layout diagram\n findings <selector> show only issues/warnings/errors\n inject-css <css> inject css into the current page\n\nExport:\n screenshot take a screenshot of the current page\n\nConfiguration:\n config-show show current configuration\n config-set <key> <value> set a configuration value\n config-list list all profiles\n config-use <name> switch active profile\n config-new <name> create a new profile\n config-path show configuration file path\n\nAgent Skills:\n skill-install install agent skill for cssprobe-cli\n skill-uninstall remove agent skill for cssprobe-cli\n\nGlobal options:\n --help [command] print help\n --json output response as JSON\n --raw output only the result value\n --version print version\n -p, --profile <name> use named profile (or CSSPROBE_PROFILE env)",
2
+ "global": "Usage: cssprobe-cli <command> [args] [options]\n\n\nSession Management:\n open [url] open browser in session mode (non-blocking)\n close close the browser session\n status show current session status\n resize <width> <height> resize the browser viewport\n eval <expression> evaluate javascript expression on the page (browser context)\n playwright <call> execute playwright api call (node.js context)\n state-import [file] import cookies from netscape format file\n\nCSS Inspection:\n inspect <selector> inspect the runtime css of a page element\n tree <selector> show dom tree structure\n layout <selector> show ascii layout diagram\n findings <selector> show only issues/warnings/errors\n inject-css <css> inject css into the current page\n\nExport:\n screenshot take a screenshot of the current page\n\nConfiguration:\n config-show show current configuration\n config-set <key> <value> set a configuration value\n config-list list all profiles\n config-use <name> switch active profile\n config-new <name> create a new profile\n config-path show configuration file path\n\nAgent Skills:\n skill-install install agent skill for cssprobe-cli\n skill-uninstall remove agent skill for cssprobe-cli\n\nGlobal options:\n --help [command] print help\n --json output response as JSON\n --raw output only the result value\n --version print version\n -p, --profile <name> use named profile (or CSSPROBE_PROFILE env)",
3
3
  "commands": {
4
4
  "open": {
5
- "help": "cssprobe-cli open [url]\n\nOpen browser in session mode (non-blocking)\n\nArguments:\n [url] url, file:// path, or local html file path\nOptions:\n --browser browser engine (default chromium)\n --headed show the browser window\n\nGlobal options:\n --json output as JSON\n --profile, -p <name> use named profile",
5
+ "help": "cssprobe-cli open [url]\n\nOpen browser in session mode (non-blocking)\n\nArguments:\n [url] url, file:// path, or local html file path\nOptions:\n --browser browser engine (default chromium)\n --headed show the browser window\n --viewport viewport size as wxh (e.g. 1280x720)\n --state path to saved state file (cookies + localstorage)\n\nGlobal options:\n --json output as JSON\n --profile, -p <name> use named profile",
6
6
  "flags": {
7
7
  "browser": "string",
8
- "headed": "boolean"
8
+ "headed": "boolean",
9
+ "viewport": "string",
10
+ "state": "string"
9
11
  },
10
12
  "args": [
11
13
  "url"
@@ -63,24 +65,40 @@
63
65
  "css"
64
66
  ]
65
67
  },
66
- "screenshot": {
67
- "help": "cssprobe-cli screenshot \n\nTake a screenshot of the current page\n\nOptions:\n --full-page take screenshot of the full scrollable page\n\nGlobal options:\n --json output as JSON\n --profile, -p <name> use named profile",
68
- "flags": {
69
- "full-page": "boolean"
70
- },
71
- "args": []
68
+ "resize": {
69
+ "help": "cssprobe-cli resize <width> <height>\n\nResize the browser viewport\n\nArguments:\n <width> viewport width\n <height> viewport height\n\nGlobal options:\n --json output as JSON\n --profile, -p <name> use named profile",
70
+ "flags": {},
71
+ "args": [
72
+ "width",
73
+ "height"
74
+ ]
72
75
  },
73
76
  "eval": {
74
- "help": "cssprobe-cli eval <expression>\n\nEvaluate JavaScript expression on the page\n\nArguments:\n <expression> javascript expression to evaluate\n\nGlobal options:\n --json output as JSON\n --profile, -p <name> use named profile",
77
+ "help": "cssprobe-cli eval <expression>\n\nEvaluate JavaScript expression on the page (browser context)\n\nArguments:\n <expression> javascript expression to evaluate\n\nGlobal options:\n --json output as JSON\n --profile, -p <name> use named profile",
75
78
  "flags": {},
76
79
  "args": [
77
80
  "expression"
78
81
  ]
79
82
  },
83
+ "playwright": {
84
+ "help": "cssprobe-cli playwright <call>\n\nExecute Playwright API call (Node.js context)\n\nArguments:\n <call> playwright api call, e.g. \"page.setviewportsize({width: 1280, height: 720})\"\n\nGlobal options:\n --json output as JSON\n --profile, -p <name> use named profile",
85
+ "flags": {},
86
+ "args": [
87
+ "call"
88
+ ]
89
+ },
90
+ "screenshot": {
91
+ "help": "cssprobe-cli screenshot \n\nTake a screenshot of the current page\n\nOptions:\n --full-page take screenshot of the full scrollable page\n\nGlobal options:\n --json output as JSON\n --profile, -p <name> use named profile",
92
+ "flags": {
93
+ "full-page": "boolean"
94
+ },
95
+ "args": []
96
+ },
80
97
  "state-import": {
81
- "help": "cssprobe-cli state-import [file]\n\nImport cookies from Netscape format file\n\nArguments:\n [file] netscape cookie file path (reads from stdin if omitted)\nOptions:\n --out output state file path (default: ~/.cssprobe-cli/states/imported.json)\n --merge existing state file to merge into\n\nGlobal options:\n --json output as JSON\n --profile, -p <name> use named profile",
98
+ "help": "cssprobe-cli state-import [file]\n\nImport cookies from Netscape format file\n\nArguments:\n [file] netscape cookie file path (reads from stdin if omitted)\nOptions:\n --out output state file path (default: ~/.cssprobe-cli/states/imported.json)\n --name custom name for the state file (e.g. mysite or mysite.json)\n --merge existing state file to merge into\n\nGlobal options:\n --json output as JSON\n --profile, -p <name> use named profile",
82
99
  "flags": {
83
100
  "out": "string",
101
+ "name": "string",
84
102
  "merge": "string"
85
103
  },
86
104
  "args": [
@@ -182,6 +182,9 @@ function buildSkillMd() {
182
182
  '# From file',
183
183
  'cssprobe-cli state-import cookies.txt --out mystate.json',
184
184
  '',
185
+ '# From file with custom name (saves to ~/.cssprobe-cli/states/<name>.json)',
186
+ 'cssprobe-cli state-import cookies.txt --name mysite',
187
+ '',
185
188
  '# From stdin',
186
189
  'cat cookies.txt | cssprobe-cli state-import --out mystate.json',
187
190
  '',
@@ -222,7 +225,7 @@ function buildSkillMd() {
222
225
  '',
223
226
  BT3 + 'bash',
224
227
  '# Import cookies first',
225
- 'cssprobe-cli state-import exported-cookies.txt --out ~/.cssprobe-cli/states/app.json',
228
+ 'cssprobe-cli state-import exported-cookies.txt --name app',
226
229
  '',
227
230
  '# Then inspect with state',
228
231
  'cssprobe-cli inspect https://app.example.com/dashboard ".main-panel" --state ~/.cssprobe-cli/states/app.json',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cssprobe-cli",
3
- "version": "0.2.7",
3
+ "version": "0.2.9",
4
4
  "description": "Runtime CSS probe — inspect layout, colors, backgrounds, fonts and more in a live browser. AI agents and shell automation.",
5
5
  "keywords": [
6
6
  "css",