uloop-cli 0.68.1 → 0.68.3

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.
@@ -795,7 +795,7 @@ ${itemIndentStr}`);
795
795
  var require_option = __commonJS({
796
796
  "node_modules/commander/lib/option.js"(exports2) {
797
797
  var { InvalidArgumentError: InvalidArgumentError2 } = require_error();
798
- var Option2 = class {
798
+ var Option3 = class {
799
799
  /**
800
800
  * Initialize a new `Option` with the given `flags` and `description`.
801
801
  *
@@ -1099,7 +1099,7 @@ var require_option = __commonJS({
1099
1099
  );
1100
1100
  return { shortFlag, longFlag };
1101
1101
  }
1102
- exports2.Option = Option2;
1102
+ exports2.Option = Option3;
1103
1103
  exports2.DualOptions = DualOptions;
1104
1104
  }
1105
1105
  });
@@ -1195,7 +1195,7 @@ var require_command = __commonJS({
1195
1195
  var { Argument: Argument2, humanReadableArgName } = require_argument();
1196
1196
  var { CommanderError: CommanderError2 } = require_error();
1197
1197
  var { Help: Help2, stripColor } = require_help();
1198
- var { Option: Option2, DualOptions } = require_option();
1198
+ var { Option: Option3, DualOptions } = require_option();
1199
1199
  var { suggestSimilar } = require_suggestSimilar();
1200
1200
  var Command2 = class _Command extends EventEmitter {
1201
1201
  /**
@@ -1680,7 +1680,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
1680
1680
  * @return {Option} new option
1681
1681
  */
1682
1682
  createOption(flags, description) {
1683
- return new Option2(flags, description);
1683
+ return new Option3(flags, description);
1684
1684
  }
1685
1685
  /**
1686
1686
  * Wrap parseArgs to catch 'commander.invalidArgument'.
@@ -1805,7 +1805,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
1805
1805
  * @private
1806
1806
  */
1807
1807
  _optionEx(config, flags, description, fn, defaultValue) {
1808
- if (typeof flags === "object" && flags instanceof Option2) {
1808
+ if (typeof flags === "object" && flags instanceof Option3) {
1809
1809
  throw new Error(
1810
1810
  "To add an Option object use addOption() instead of option() or requiredOption()"
1811
1811
  );
@@ -3437,13 +3437,13 @@ var require_commander = __commonJS({
3437
3437
  var { Command: Command2 } = require_command();
3438
3438
  var { CommanderError: CommanderError2, InvalidArgumentError: InvalidArgumentError2 } = require_error();
3439
3439
  var { Help: Help2 } = require_help();
3440
- var { Option: Option2 } = require_option();
3440
+ var { Option: Option3 } = require_option();
3441
3441
  exports2.program = new Command2();
3442
3442
  exports2.createCommand = (name) => new Command2(name);
3443
- exports2.createOption = (flags, description) => new Option2(flags, description);
3443
+ exports2.createOption = (flags, description) => new Option3(flags, description);
3444
3444
  exports2.createArgument = (name, description) => new Argument2(name, description);
3445
3445
  exports2.Command = Command2;
3446
- exports2.Option = Option2;
3446
+ exports2.Option = Option3;
3447
3447
  exports2.Argument = Argument2;
3448
3448
  exports2.Help = Help2;
3449
3449
  exports2.CommanderError = CommanderError2;
@@ -5824,7 +5824,7 @@ var import_path3 = require("path");
5824
5824
 
5825
5825
  // src/default-tools.json
5826
5826
  var default_tools_default = {
5827
- version: "0.68.1",
5827
+ version: "0.68.3",
5828
5828
  tools: [
5829
5829
  {
5830
5830
  name: "compile",
@@ -6064,6 +6064,34 @@ var default_tools_default = {
6064
6064
  }
6065
6065
  }
6066
6066
  },
6067
+ {
6068
+ name: "get-unity-search-providers",
6069
+ description: "Get detailed information about Unity Search providers including display names, descriptions, active status, and capabilities",
6070
+ inputSchema: {
6071
+ type: "object",
6072
+ properties: {
6073
+ ProviderId: {
6074
+ type: "string",
6075
+ description: "Specific provider ID to get details for (empty = all providers). Examples: 'asset', 'scene', 'menu', 'settings'"
6076
+ },
6077
+ ActiveOnly: {
6078
+ type: "boolean",
6079
+ description: "Whether to include only active providers",
6080
+ default: false
6081
+ },
6082
+ SortByPriority: {
6083
+ type: "boolean",
6084
+ description: "Sort providers by priority (lower number = higher priority)",
6085
+ default: true
6086
+ },
6087
+ IncludeDescriptions: {
6088
+ type: "boolean",
6089
+ description: "Include detailed descriptions for each provider",
6090
+ default: true
6091
+ }
6092
+ }
6093
+ }
6094
+ },
6067
6095
  {
6068
6096
  name: "get-menu-items",
6069
6097
  description: "Retrieve Unity MenuItems",
@@ -6263,21 +6291,24 @@ var default_tools_default = {
6263
6291
  // src/tool-cache.ts
6264
6292
  var CACHE_DIR = ".uloop";
6265
6293
  var CACHE_FILE = "tools.json";
6266
- function getCacheDir() {
6294
+ function getCacheDir(projectPath) {
6295
+ if (projectPath !== void 0) {
6296
+ return (0, import_path3.join)(projectPath, CACHE_DIR);
6297
+ }
6267
6298
  const projectRoot = findUnityProjectRoot();
6268
6299
  if (projectRoot === null) {
6269
6300
  return (0, import_path3.join)(process.cwd(), CACHE_DIR);
6270
6301
  }
6271
6302
  return (0, import_path3.join)(projectRoot, CACHE_DIR);
6272
6303
  }
6273
- function getCachePath() {
6274
- return (0, import_path3.join)(getCacheDir(), CACHE_FILE);
6304
+ function getCachePath(projectPath) {
6305
+ return (0, import_path3.join)(getCacheDir(projectPath), CACHE_FILE);
6275
6306
  }
6276
6307
  function getDefaultTools() {
6277
6308
  return default_tools_default;
6278
6309
  }
6279
- function loadToolsCache() {
6280
- const cachePath = getCachePath();
6310
+ function loadToolsCache(projectPath) {
6311
+ const cachePath = getCachePath(projectPath);
6281
6312
  if ((0, import_fs3.existsSync)(cachePath)) {
6282
6313
  try {
6283
6314
  const content = (0, import_fs3.readFileSync)(cachePath, "utf-8");
@@ -6303,6 +6334,10 @@ function hasCacheFile() {
6303
6334
  function getCacheFilePath() {
6304
6335
  return getCachePath();
6305
6336
  }
6337
+ function getDefaultToolNames() {
6338
+ const defaultTools = getDefaultTools();
6339
+ return new Set(defaultTools.tools.map((tool) => tool.name));
6340
+ }
6306
6341
  function getCachedServerVersion() {
6307
6342
  const cachePath = getCachePath();
6308
6343
  if (!(0, import_fs3.existsSync)(cachePath)) {
@@ -6318,7 +6353,7 @@ function getCachedServerVersion() {
6318
6353
  }
6319
6354
 
6320
6355
  // src/version.ts
6321
- var VERSION = "0.68.1";
6356
+ var VERSION = "0.68.3";
6322
6357
 
6323
6358
  // src/spinner.ts
6324
6359
  var SPINNER_FRAMES = ["\u280B", "\u2819", "\u2839", "\u2838", "\u283C", "\u2834", "\u2826", "\u2827", "\u2807", "\u280F"];
@@ -6916,7 +6951,7 @@ var DEPRECATED_SKILLS = [
6916
6951
  "uloop-capture-window",
6917
6952
  // renamed to uloop-screenshot in v0.54.0
6918
6953
  "uloop-get-provider-details"
6919
- // internal development-only tool, not for end users
6954
+ // renamed to uloop-get-unity-search-providers
6920
6955
  ];
6921
6956
 
6922
6957
  // src/tool-settings-loader.ts
@@ -8703,8 +8738,12 @@ async function runLaunchCommand(projectPath, options) {
8703
8738
  }
8704
8739
 
8705
8740
  // src/commands/focus-window.ts
8706
- function registerFocusWindowCommand(program3) {
8707
- program3.command("focus-window").description("Bring Unity Editor window to front using OS-level commands").option("--project-path <path>", "Unity project path").action(async (options) => {
8741
+ function registerFocusWindowCommand(program3, helpGroup) {
8742
+ const cmd = program3.command("focus-window").description("Bring Unity Editor window to front using OS-level commands").option("--project-path <path>", "Unity project path");
8743
+ if (helpGroup !== void 0) {
8744
+ cmd.helpGroup(helpGroup);
8745
+ }
8746
+ cmd.action(async (options) => {
8708
8747
  let projectRoot;
8709
8748
  if (options.projectPath !== void 0) {
8710
8749
  try {
@@ -8762,8 +8801,17 @@ function registerFocusWindowCommand(program3) {
8762
8801
  }
8763
8802
 
8764
8803
  // src/cli.ts
8804
+ var FOCUS_WINDOW_COMMAND = "focus-window";
8765
8805
  var LAUNCH_COMMAND = "launch";
8766
8806
  var UPDATE_COMMAND = "update";
8807
+ var HELP_GROUP_BUILTIN_TOOLS = "Built-in Tools:";
8808
+ var HELP_GROUP_THIRD_PARTY_TOOLS = "Third-party Tools:";
8809
+ var HELP_GROUP_CLI_COMMANDS = "CLI Commands:";
8810
+ var HELP_GROUP_ORDER = [
8811
+ HELP_GROUP_CLI_COMMANDS,
8812
+ HELP_GROUP_BUILTIN_TOOLS,
8813
+ HELP_GROUP_THIRD_PARTY_TOOLS
8814
+ ];
8767
8815
  var NO_SYNC_FLAGS = ["-v", "--version", "-h", "--help"];
8768
8816
  var BUILTIN_COMMANDS = [
8769
8817
  "list",
@@ -8773,12 +8821,47 @@ var BUILTIN_COMMANDS = [
8773
8821
  "fix",
8774
8822
  "skills",
8775
8823
  LAUNCH_COMMAND,
8776
- "focus-window"
8824
+ FOCUS_WINDOW_COMMAND
8777
8825
  ];
8778
8826
  var program2 = new Command();
8779
- program2.name("uloop").description("Unity MCP CLI - Direct communication with Unity Editor").version(VERSION, "-v, --version", "Output the version number").showHelpAfterError("(run with -h for available options)");
8827
+ program2.name("uloop").description("Unity MCP CLI - Direct communication with Unity Editor").version(VERSION, "-v, --version", "Output the version number").showHelpAfterError("(run with -h for available options)").configureHelp({
8828
+ sortSubcommands: true,
8829
+ // commander.js default groupItems determines group display order by registration order,
8830
+ // but CLI commands are registered at module level (before tools), so the default order
8831
+ // would be wrong. We re-implement to enforce HELP_GROUP_ORDER.
8832
+ groupItems(unsortedItems, visibleItems, getGroup) {
8833
+ const groupMap = /* @__PURE__ */ new Map();
8834
+ for (const item of unsortedItems) {
8835
+ const group = getGroup(item);
8836
+ if (!groupMap.has(group)) {
8837
+ groupMap.set(group, []);
8838
+ }
8839
+ }
8840
+ for (const item of visibleItems) {
8841
+ const group = getGroup(item);
8842
+ if (!groupMap.has(group)) {
8843
+ groupMap.set(group, []);
8844
+ }
8845
+ groupMap.get(group).push(item);
8846
+ }
8847
+ const ordered = /* @__PURE__ */ new Map();
8848
+ for (const key of HELP_GROUP_ORDER) {
8849
+ const items = groupMap.get(key);
8850
+ if (items !== void 0) {
8851
+ ordered.set(key, items);
8852
+ groupMap.delete(key);
8853
+ }
8854
+ }
8855
+ for (const [key, value] of groupMap) {
8856
+ ordered.set(key, value);
8857
+ }
8858
+ return ordered;
8859
+ }
8860
+ });
8780
8861
  program2.option("--list-commands", "List all command names (for shell completion)");
8781
8862
  program2.option("--list-options <cmd>", "List options for a command (for shell completion)");
8863
+ program2.commandsGroup(HELP_GROUP_CLI_COMMANDS);
8864
+ program2.helpCommand(true);
8782
8865
  program2.command("list").description("List all available tools from Unity").option("-p, --port <port>", "Unity TCP port").option("--project-path <path>", "Unity project path").action(async (options) => {
8783
8866
  await runWithErrorHandling(() => listAvailableTools(extractGlobalOptions(options)));
8784
8867
  });
@@ -8799,12 +8882,12 @@ program2.command("fix").description("Clean up stale lock files that may prevent
8799
8882
  });
8800
8883
  registerSkillsCommand(program2);
8801
8884
  registerLaunchCommand(program2);
8802
- registerFocusWindowCommand(program2);
8803
- function registerToolCommand(tool) {
8885
+ function registerToolCommand(tool, helpGroup) {
8804
8886
  if (BUILTIN_COMMANDS.includes(tool.name)) {
8805
8887
  return;
8806
8888
  }
8807
- const cmd = program2.command(tool.name).description(tool.description);
8889
+ const firstLine = tool.description.split("\n")[0];
8890
+ const cmd = program2.command(tool.name).description(firstLine).helpGroup(helpGroup);
8808
8891
  const properties = tool.inputSchema.properties;
8809
8892
  for (const [propName, propInfo] of Object.entries(properties)) {
8810
8893
  const optionStr = generateOptionString(propName, propInfo);
@@ -8923,6 +9006,9 @@ function convertValue(value, propInfo) {
8923
9006
  }
8924
9007
  return value;
8925
9008
  }
9009
+ function getToolHelpGroup(toolName, defaultToolNames) {
9010
+ return defaultToolNames.has(toolName) ? HELP_GROUP_BUILTIN_TOOLS : HELP_GROUP_THIRD_PARTY_TOOLS;
9011
+ }
8926
9012
  function extractGlobalOptions(options) {
8927
9013
  return {
8928
9014
  port: options["port"],
@@ -9253,9 +9339,14 @@ function handleCompletionOptions() {
9253
9339
  const projectPath = extractSyncGlobalOptions(args).projectPath;
9254
9340
  if (args.includes("--list-commands")) {
9255
9341
  const tools = loadToolsCache();
9256
- const enabledTools = projectPath !== void 0 ? filterEnabledTools(tools.tools, projectPath) : tools.tools;
9257
- const allCommands = [...BUILTIN_COMMANDS, ...enabledTools.map((t) => t.name)];
9258
- console.log(allCommands.join("\n"));
9342
+ const enabledTools = filterEnabledTools(tools.tools, projectPath);
9343
+ const allCommands = [
9344
+ ...BUILTIN_COMMANDS.filter(
9345
+ (cmd) => cmd !== FOCUS_WINDOW_COMMAND || isToolEnabled(cmd, projectPath)
9346
+ ),
9347
+ ...enabledTools.map((t) => t.name)
9348
+ ];
9349
+ console.log(allCommands.sort().join("\n"));
9259
9350
  return true;
9260
9351
  }
9261
9352
  const listOptionsIdx = args.indexOf("--list-options");
@@ -9271,7 +9362,9 @@ function listOptionsForCommand(cmdName, projectPath) {
9271
9362
  return;
9272
9363
  }
9273
9364
  const tools = loadToolsCache();
9274
- const tool = projectPath !== void 0 ? filterEnabledTools(tools.tools, projectPath).find((t) => t.name === cmdName) : tools.tools.find((t) => t.name === cmdName);
9365
+ const tool = filterEnabledTools(tools.tools, projectPath).find(
9366
+ (t) => t.name === cmdName
9367
+ );
9275
9368
  if (!tool) {
9276
9369
  return;
9277
9370
  }
@@ -9283,6 +9376,9 @@ function listOptionsForCommand(cmdName, projectPath) {
9283
9376
  console.log(options.join("\n"));
9284
9377
  }
9285
9378
  function commandExists(cmdName, projectPath) {
9379
+ if (cmdName === FOCUS_WINDOW_COMMAND) {
9380
+ return isToolEnabled(FOCUS_WINDOW_COMMAND, projectPath);
9381
+ }
9286
9382
  if (BUILTIN_COMMANDS.includes(cmdName)) {
9287
9383
  return true;
9288
9384
  }
@@ -9295,6 +9391,20 @@ function shouldSkipAutoSync(cmdName, args) {
9295
9391
  }
9296
9392
  return args.some((arg) => NO_SYNC_FLAGS.includes(arg));
9297
9393
  }
9394
+ var OPTIONS_WITH_VALUE = /* @__PURE__ */ new Set(["--port", "-p", "--project-path"]);
9395
+ function findCommandName(args) {
9396
+ for (let i = 0; i < args.length; i++) {
9397
+ const arg = args[i];
9398
+ if (arg.startsWith("-")) {
9399
+ if (OPTIONS_WITH_VALUE.has(arg)) {
9400
+ i++;
9401
+ }
9402
+ continue;
9403
+ }
9404
+ return arg;
9405
+ }
9406
+ return void 0;
9407
+ }
9298
9408
  function extractSyncGlobalOptions(args) {
9299
9409
  const options = {};
9300
9410
  for (let i = 0; i < args.length; i++) {
@@ -9329,15 +9439,21 @@ async function main() {
9329
9439
  return;
9330
9440
  }
9331
9441
  const args = process.argv.slice(2);
9332
- const cmdName = args.find((arg) => !arg.startsWith("-"));
9333
9442
  const syncGlobalOptions = extractSyncGlobalOptions(args);
9443
+ const cmdName = findCommandName(args);
9334
9444
  const NO_PROJECT_COMMANDS = [UPDATE_COMMAND, "completion"];
9335
9445
  const skipProjectDetection = cmdName === void 0 || NO_PROJECT_COMMANDS.includes(cmdName);
9336
9446
  if (skipProjectDetection) {
9337
- const defaultTools = getDefaultTools();
9338
- const tools = syncGlobalOptions.projectPath !== void 0 ? filterEnabledTools(defaultTools.tools, syncGlobalOptions.projectPath) : defaultTools.tools;
9447
+ const defaultToolNames2 = getDefaultToolNames();
9448
+ const isTopLevelHelp = cmdName === void 0 && (args.includes("-h") || args.includes("--help"));
9449
+ const shouldFilter = syncGlobalOptions.projectPath !== void 0 || isTopLevelHelp;
9450
+ const sourceTools = shouldFilter ? loadToolsCache(syncGlobalOptions.projectPath).tools : getDefaultTools().tools;
9451
+ const tools = shouldFilter ? filterEnabledTools(sourceTools, syncGlobalOptions.projectPath) : sourceTools;
9452
+ if (!shouldFilter || isToolEnabled(FOCUS_WINDOW_COMMAND, syncGlobalOptions.projectPath)) {
9453
+ registerFocusWindowCommand(program2, HELP_GROUP_BUILTIN_TOOLS);
9454
+ }
9339
9455
  for (const tool of tools) {
9340
- registerToolCommand(tool);
9456
+ registerToolCommand(tool, getToolHelpGroup(tool.name, defaultToolNames2));
9341
9457
  }
9342
9458
  program2.parse();
9343
9459
  return;
@@ -9366,8 +9482,12 @@ async function main() {
9366
9482
  }
9367
9483
  const toolsCache = loadToolsCache();
9368
9484
  const projectPath = syncGlobalOptions.projectPath;
9485
+ const defaultToolNames = getDefaultToolNames();
9486
+ if (isToolEnabled(FOCUS_WINDOW_COMMAND, projectPath)) {
9487
+ registerFocusWindowCommand(program2, HELP_GROUP_BUILTIN_TOOLS);
9488
+ }
9369
9489
  for (const tool of filterEnabledTools(toolsCache.tools, projectPath)) {
9370
- registerToolCommand(tool);
9490
+ registerToolCommand(tool, getToolHelpGroup(tool.name, defaultToolNames));
9371
9491
  }
9372
9492
  if (cmdName && !commandExists(cmdName, projectPath)) {
9373
9493
  if (!isToolEnabled(cmdName, projectPath)) {
@@ -9380,7 +9500,7 @@ async function main() {
9380
9500
  const newCache = loadToolsCache();
9381
9501
  const tool = filterEnabledTools(newCache.tools, projectPath).find((t) => t.name === cmdName);
9382
9502
  if (tool) {
9383
- registerToolCommand(tool);
9503
+ registerToolCommand(tool, getToolHelpGroup(tool.name, defaultToolNames));
9384
9504
  console.log(`\x1B[32m\u2713 Found '${cmdName}' after sync.\x1B[0m
9385
9505
  `);
9386
9506
  } else {