@xbrowser/cli 0.15.0 → 0.15.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/dist/cli.js CHANGED
@@ -10618,6 +10618,22 @@ var HTTPServer = class {
10618
10618
  };
10619
10619
 
10620
10620
  // src/router.ts
10621
+ var KNOWN_GLOBAL_OPTIONS = /* @__PURE__ */ new Set([
10622
+ "json",
10623
+ "yaml",
10624
+ "session",
10625
+ "cdp",
10626
+ "cdp-endpoint",
10627
+ "version",
10628
+ "v",
10629
+ "help",
10630
+ "h",
10631
+ "target",
10632
+ "port",
10633
+ "token",
10634
+ "timeout",
10635
+ "headless"
10636
+ ]);
10621
10637
  function showCommandHelp(siteName, cmd, siteConfig, mode) {
10622
10638
  const c = cmd;
10623
10639
  if (mode === "json") {
@@ -10766,6 +10782,23 @@ async function routeCommand(argv, stdinCommands) {
10766
10782
  }
10767
10783
  const parsed = parseArgs(argv);
10768
10784
  const { positional, options } = parsed;
10785
+ const command = positional[0];
10786
+ const cmdArgs = positional.slice(1);
10787
+ const isPluginCommand = command ? !allBuiltins.find((b) => b.name === command) && !getCommand(command) && command !== "help" : false;
10788
+ if (!isPluginCommand && command) {
10789
+ const unknownOptions = Object.keys(options).filter((k) => !KNOWN_GLOBAL_OPTIONS.has(k));
10790
+ if (unknownOptions.length > 0) {
10791
+ const unknown = unknownOptions.map((k) => `--${k}`).join(", ");
10792
+ outputError(
10793
+ `Unknown option: ${unknown}
10794
+ Did you mean to use a global flag? Global flags must come BEFORE the command:
10795
+ \u2717 xbrowser goto <url> --cdp-endpoint <endpoint> (treated as unknown)
10796
+ \u2713 xbrowser --cdp <endpoint> goto <url> (correct)
10797
+ Run "xbrowser --help" to see available global options.`
10798
+ );
10799
+ return;
10800
+ }
10801
+ }
10769
10802
  const mode = options.json ? "json" : options.yaml ? "yaml" : "text";
10770
10803
  const sessionName = options.session || process.env.XBROWSER_SESSION || "default";
10771
10804
  const cdpEndpoint = options.cdp;
@@ -10777,8 +10810,6 @@ async function routeCommand(argv, stdinCommands) {
10777
10810
  showMainHelp();
10778
10811
  return;
10779
10812
  }
10780
- const command = positional[0];
10781
- const cmdArgs = positional.slice(1);
10782
10813
  if ((options.help || options.h) && positional.length > 0) {
10783
10814
  const loader = await getPluginLoader();
10784
10815
  const internalLoader = loader.getCore().loader;
@@ -10993,6 +11024,26 @@ Run "xbrowser ${command} --help" to see available commands.`
10993
11024
  const subCmdIdx = pluginNameIdx >= 0 ? argv.indexOf(subCommand, pluginNameIdx + 1) : -1;
10994
11025
  const rawPluginArgs = subCmdIdx >= 0 ? argv.slice(subCmdIdx + 1) : [];
10995
11026
  const params = parsePluginParams(rawPluginArgs, cmdEntry.parameters);
11027
+ if (cmdEntry.parameters) {
11028
+ const schemaAny = cmdEntry.parameters;
11029
+ const def = schemaAny._def;
11030
+ const shapeOrFn = def?.shape ?? schemaAny.shape;
11031
+ const shapeObj = typeof shapeOrFn === "function" ? shapeOrFn() : shapeOrFn;
11032
+ if (shapeObj && typeof shapeObj === "object") {
11033
+ const knownKeys = new Set(Object.keys(shapeObj));
11034
+ knownKeys.add("_target");
11035
+ for (const gk of KNOWN_GLOBAL_OPTIONS) knownKeys.add(gk.replace(/-([a-z])/g, (_, c) => c.toUpperCase()));
11036
+ const unknownKeys = Object.keys(params).filter((k) => !knownKeys.has(k));
11037
+ if (unknownKeys.length > 0) {
11038
+ const unknown = unknownKeys.map((k) => `--${k.replace(/([A-Z])/g, "-$1").toLowerCase()}`).join(", ");
11039
+ outputError(
11040
+ `Unknown parameter: ${unknown}
11041
+ Run "xbrowser ${command} ${subCommand} --help" to see available parameters.`
11042
+ );
11043
+ return;
11044
+ }
11045
+ }
11046
+ }
10996
11047
  if (options.target && !params._target) {
10997
11048
  params._target = options.target;
10998
11049
  }
package/dist/index.js CHANGED
@@ -10932,6 +10932,22 @@ var HTTPServer = class {
10932
10932
  };
10933
10933
 
10934
10934
  // src/router.ts
10935
+ var KNOWN_GLOBAL_OPTIONS = /* @__PURE__ */ new Set([
10936
+ "json",
10937
+ "yaml",
10938
+ "session",
10939
+ "cdp",
10940
+ "cdp-endpoint",
10941
+ "version",
10942
+ "v",
10943
+ "help",
10944
+ "h",
10945
+ "target",
10946
+ "port",
10947
+ "token",
10948
+ "timeout",
10949
+ "headless"
10950
+ ]);
10935
10951
  function showCommandHelp(siteName, cmd, siteConfig, mode) {
10936
10952
  const c = cmd;
10937
10953
  if (mode === "json") {
@@ -11080,6 +11096,23 @@ async function routeCommand(argv, stdinCommands) {
11080
11096
  }
11081
11097
  const parsed = parseArgs(argv);
11082
11098
  const { positional, options } = parsed;
11099
+ const command = positional[0];
11100
+ const cmdArgs = positional.slice(1);
11101
+ const isPluginCommand = command ? !allBuiltins.find((b) => b.name === command) && !getCommand(command) && command !== "help" : false;
11102
+ if (!isPluginCommand && command) {
11103
+ const unknownOptions = Object.keys(options).filter((k) => !KNOWN_GLOBAL_OPTIONS.has(k));
11104
+ if (unknownOptions.length > 0) {
11105
+ const unknown = unknownOptions.map((k) => `--${k}`).join(", ");
11106
+ outputError(
11107
+ `Unknown option: ${unknown}
11108
+ Did you mean to use a global flag? Global flags must come BEFORE the command:
11109
+ \u2717 xbrowser goto <url> --cdp-endpoint <endpoint> (treated as unknown)
11110
+ \u2713 xbrowser --cdp <endpoint> goto <url> (correct)
11111
+ Run "xbrowser --help" to see available global options.`
11112
+ );
11113
+ return;
11114
+ }
11115
+ }
11083
11116
  const mode = options.json ? "json" : options.yaml ? "yaml" : "text";
11084
11117
  const sessionName = options.session || process.env.XBROWSER_SESSION || "default";
11085
11118
  const cdpEndpoint = options.cdp;
@@ -11091,8 +11124,6 @@ async function routeCommand(argv, stdinCommands) {
11091
11124
  showMainHelp();
11092
11125
  return;
11093
11126
  }
11094
- const command = positional[0];
11095
- const cmdArgs = positional.slice(1);
11096
11127
  if ((options.help || options.h) && positional.length > 0) {
11097
11128
  const loader = await getPluginLoader();
11098
11129
  const internalLoader = loader.getCore().loader;
@@ -11307,6 +11338,26 @@ Run "xbrowser ${command} --help" to see available commands.`
11307
11338
  const subCmdIdx = pluginNameIdx >= 0 ? argv.indexOf(subCommand, pluginNameIdx + 1) : -1;
11308
11339
  const rawPluginArgs = subCmdIdx >= 0 ? argv.slice(subCmdIdx + 1) : [];
11309
11340
  const params = parsePluginParams(rawPluginArgs, cmdEntry.parameters);
11341
+ if (cmdEntry.parameters) {
11342
+ const schemaAny = cmdEntry.parameters;
11343
+ const def = schemaAny._def;
11344
+ const shapeOrFn = def?.shape ?? schemaAny.shape;
11345
+ const shapeObj = typeof shapeOrFn === "function" ? shapeOrFn() : shapeOrFn;
11346
+ if (shapeObj && typeof shapeObj === "object") {
11347
+ const knownKeys = new Set(Object.keys(shapeObj));
11348
+ knownKeys.add("_target");
11349
+ for (const gk of KNOWN_GLOBAL_OPTIONS) knownKeys.add(gk.replace(/-([a-z])/g, (_, c) => c.toUpperCase()));
11350
+ const unknownKeys = Object.keys(params).filter((k) => !knownKeys.has(k));
11351
+ if (unknownKeys.length > 0) {
11352
+ const unknown = unknownKeys.map((k) => `--${k.replace(/([A-Z])/g, "-$1").toLowerCase()}`).join(", ");
11353
+ outputError(
11354
+ `Unknown parameter: ${unknown}
11355
+ Run "xbrowser ${command} ${subCommand} --help" to see available parameters.`
11356
+ );
11357
+ return;
11358
+ }
11359
+ }
11360
+ }
11310
11361
  if (options.target && !params._target) {
11311
11362
  params._target = options.target;
11312
11363
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xbrowser/cli",
3
- "version": "0.15.0",
3
+ "version": "0.15.1",
4
4
  "description": "Browser automation CLI for web scraping, headless browsing, SEO analysis, and AI agent workflows. A command-line alternative to Playwright, Puppeteer, and Selenium.",
5
5
  "type": "module",
6
6
  "bin": {