uloop-cli 0.66.1 → 0.67.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.
@@ -5520,7 +5520,7 @@ var DirectUnityClient = class {
5520
5520
  cleanup();
5521
5521
  reject(
5522
5522
  new Error(
5523
- `Request timed out after ${NETWORK_TIMEOUT_MS}ms. Unity may be frozen or busy. [For AI] Run 'uloop focus-window' to bring Unity to the front, then retry the tool. If the issue persists, report this to the user and ask how to proceed. Do NOT kill Unity processes without user permission.`
5523
+ `Request timed out after ${NETWORK_TIMEOUT_MS}ms. Unity may be frozen or busy. [For AI] Report this to the user and ask how to proceed.`
5524
5524
  )
5525
5525
  );
5526
5526
  }, NETWORK_TIMEOUT_MS);
@@ -5653,15 +5653,19 @@ function findUnityProjectInParents(startPath) {
5653
5653
  currentPath = parentPath;
5654
5654
  }
5655
5655
  }
5656
+ var hasWarnedMultipleProjects = false;
5656
5657
  function findUnityProjectRoot(startPath = process.cwd()) {
5657
5658
  const childProjects = findUnityProjectsInChildren(startPath, CHILD_SEARCH_MAX_DEPTH);
5658
5659
  if (childProjects.length > 0) {
5659
- if (childProjects.length > 1) {
5660
+ if (childProjects.length > 1 && !hasWarnedMultipleProjects) {
5661
+ hasWarnedMultipleProjects = true;
5660
5662
  console.error("\x1B[33mWarning: Multiple Unity projects found in child directories:\x1B[0m");
5661
5663
  for (const project of childProjects) {
5662
5664
  console.error(` - ${project}`);
5663
5665
  }
5664
- console.error(`\x1B[33mUsing: ${childProjects[0]}\x1B[0m`);
5666
+ console.error(
5667
+ "\x1B[33mRun from a Unity project root or use --project-path to specify one.\x1B[0m"
5668
+ );
5665
5669
  console.error("");
5666
5670
  }
5667
5671
  return childProjects[0];
@@ -5746,17 +5750,10 @@ function normalizePort(port) {
5746
5750
  return port;
5747
5751
  }
5748
5752
  function resolvePortFromUnitySettings(settings) {
5749
- const serverPort = normalizePort(settings.serverPort);
5750
5753
  const customPort = normalizePort(settings.customPort);
5751
- if (settings.isServerRunning === true && serverPort !== null) {
5752
- return serverPort;
5753
- }
5754
5754
  if (customPort !== null) {
5755
5755
  return customPort;
5756
5756
  }
5757
- if (serverPort !== null) {
5758
- return serverPort;
5759
- }
5760
5757
  return null;
5761
5758
  }
5762
5759
  function validateProjectPath(projectPath) {
@@ -5827,7 +5824,7 @@ var import_path3 = require("path");
5827
5824
 
5828
5825
  // src/default-tools.json
5829
5826
  var default_tools_default = {
5830
- version: "0.66.1",
5827
+ version: "0.67.1",
5831
5828
  tools: [
5832
5829
  {
5833
5830
  name: "compile",
@@ -6275,7 +6272,7 @@ function getCachedServerVersion() {
6275
6272
  }
6276
6273
 
6277
6274
  // src/version.ts
6278
- var VERSION = "0.66.1";
6275
+ var VERSION = "0.67.1";
6279
6276
 
6280
6277
  // src/spinner.ts
6281
6278
  var SPINNER_FRAMES = ["\u280B", "\u2819", "\u2839", "\u2838", "\u283C", "\u2834", "\u2826", "\u2827", "\u2807", "\u280F"];
@@ -7473,9 +7470,27 @@ var TARGET_CONFIGS = {
7473
7470
  displayName: "Codex CLI",
7474
7471
  projectDir: ".codex",
7475
7472
  skillFileName: "SKILL.md"
7473
+ },
7474
+ cursor: {
7475
+ id: "cursor",
7476
+ displayName: "Cursor",
7477
+ projectDir: ".cursor",
7478
+ skillFileName: "SKILL.md"
7479
+ },
7480
+ gemini: {
7481
+ id: "gemini",
7482
+ displayName: "Gemini CLI",
7483
+ projectDir: ".gemini",
7484
+ skillFileName: "SKILL.md"
7485
+ },
7486
+ windsurf: {
7487
+ id: "windsurf",
7488
+ displayName: "Windsurf",
7489
+ projectDir: ".windsurf",
7490
+ skillFileName: "SKILL.md"
7476
7491
  }
7477
7492
  };
7478
- var ALL_TARGET_IDS = ["claude", "codex"];
7493
+ var ALL_TARGET_IDS = ["claude", "codex", "cursor", "gemini", "windsurf"];
7479
7494
  function getTargetConfig(id) {
7480
7495
  return TARGET_CONFIGS[id];
7481
7496
  }
@@ -7483,12 +7498,12 @@ function getTargetConfig(id) {
7483
7498
  // src/skills/skills-command.ts
7484
7499
  function registerSkillsCommand(program3) {
7485
7500
  const skillsCmd = program3.command("skills").description("Manage uloop skills for AI coding tools");
7486
- skillsCmd.command("list").description("List all uloop skills and their installation status").option("-g, --global", "Check global installation").option("--claude", "Check Claude Code installation").option("--codex", "Check Codex CLI installation").action((options) => {
7501
+ skillsCmd.command("list").description("List all uloop skills and their installation status").option("-g, --global", "Check global installation").option("--claude", "Check Claude Code installation").option("--codex", "Check Codex CLI installation").option("--cursor", "Check Cursor installation").option("--gemini", "Check Gemini CLI installation").option("--windsurf", "Check Windsurf installation").action((options) => {
7487
7502
  const targets = resolveTargets(options);
7488
7503
  const global = options.global ?? false;
7489
7504
  listSkills(targets, global);
7490
7505
  });
7491
- skillsCmd.command("install").description("Install all uloop skills").option("-g, --global", "Install to global location").option("--claude", "Install to Claude Code").option("--codex", "Install to Codex CLI").action((options) => {
7506
+ skillsCmd.command("install").description("Install all uloop skills").option("-g, --global", "Install to global location").option("--claude", "Install to Claude Code").option("--codex", "Install to Codex CLI").option("--cursor", "Install to Cursor").option("--gemini", "Install to Gemini CLI").option("--windsurf", "Install to Windsurf").action((options) => {
7492
7507
  const targets = resolveTargets(options);
7493
7508
  if (targets.length === 0) {
7494
7509
  showTargetGuidance("install");
@@ -7496,7 +7511,7 @@ function registerSkillsCommand(program3) {
7496
7511
  }
7497
7512
  installSkills(targets, options.global ?? false);
7498
7513
  });
7499
- skillsCmd.command("uninstall").description("Uninstall all uloop skills").option("-g, --global", "Uninstall from global location").option("--claude", "Uninstall from Claude Code").option("--codex", "Uninstall from Codex CLI").action((options) => {
7514
+ skillsCmd.command("uninstall").description("Uninstall all uloop skills").option("-g, --global", "Uninstall from global location").option("--claude", "Uninstall from Claude Code").option("--codex", "Uninstall from Codex CLI").option("--cursor", "Uninstall from Cursor").option("--gemini", "Uninstall from Gemini CLI").option("--windsurf", "Uninstall from Windsurf").action((options) => {
7500
7515
  const targets = resolveTargets(options);
7501
7516
  if (targets.length === 0) {
7502
7517
  showTargetGuidance("uninstall");
@@ -7513,6 +7528,15 @@ function resolveTargets(options) {
7513
7528
  if (options.codex) {
7514
7529
  targets.push(getTargetConfig("codex"));
7515
7530
  }
7531
+ if (options.cursor) {
7532
+ targets.push(getTargetConfig("cursor"));
7533
+ }
7534
+ if (options.gemini) {
7535
+ targets.push(getTargetConfig("gemini"));
7536
+ }
7537
+ if (options.windsurf) {
7538
+ targets.push(getTargetConfig("windsurf"));
7539
+ }
7516
7540
  return targets;
7517
7541
  }
7518
7542
  function showTargetGuidance(command) {
@@ -7522,14 +7546,17 @@ Please specify at least one target for '${command}':`);
7522
7546
  console.log("Available targets:");
7523
7547
  console.log(" --claude Claude Code (.claude/skills/)");
7524
7548
  console.log(" --codex Codex CLI (.codex/skills/)");
7549
+ console.log(" --cursor Cursor (.cursor/skills/)");
7550
+ console.log(" --gemini Gemini CLI (.gemini/skills/)");
7551
+ console.log(" --windsurf Windsurf (.windsurf/skills/)");
7525
7552
  console.log("");
7526
7553
  console.log("Options:");
7527
- console.log(" -g, --global Use global location (~/.claude/ or ~/.codex/)");
7554
+ console.log(" -g, --global Use global location");
7528
7555
  console.log("");
7529
7556
  console.log("Examples:");
7530
7557
  console.log(` uloop skills ${command} --claude`);
7531
- console.log(` uloop skills ${command} --codex --global`);
7532
- console.log(` uloop skills ${command} --claude --codex`);
7558
+ console.log(` uloop skills ${command} --cursor --global`);
7559
+ console.log(` uloop skills ${command} --claude --codex --cursor --gemini`);
7533
7560
  }
7534
7561
  function listSkills(targets, global) {
7535
7562
  const location = global ? "Global" : "Project";
@@ -8637,7 +8664,7 @@ var BUILTIN_COMMANDS = [
8637
8664
  "focus-window"
8638
8665
  ];
8639
8666
  var program2 = new Command();
8640
- program2.name("uloop").description("Unity MCP CLI - Direct communication with Unity Editor").version(VERSION, "-v, --version", "Output the version number");
8667
+ 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)");
8641
8668
  program2.option("--list-commands", "List all command names (for shell completion)");
8642
8669
  program2.option("--list-options <cmd>", "List options for a command (for shell completion)");
8643
8670
  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) => {
@@ -9186,6 +9213,16 @@ async function main() {
9186
9213
  const args = process.argv.slice(2);
9187
9214
  const cmdName = args.find((arg) => !arg.startsWith("-"));
9188
9215
  const syncGlobalOptions = extractSyncGlobalOptions(args);
9216
+ const NO_PROJECT_COMMANDS = [UPDATE_COMMAND, "completion"];
9217
+ const skipProjectDetection = cmdName === void 0 || NO_PROJECT_COMMANDS.includes(cmdName);
9218
+ if (skipProjectDetection) {
9219
+ const defaultTools = getDefaultTools();
9220
+ for (const tool of defaultTools.tools) {
9221
+ registerToolCommand(tool);
9222
+ }
9223
+ program2.parse();
9224
+ return;
9225
+ }
9189
9226
  if (!shouldSkipAutoSync(cmdName, args)) {
9190
9227
  const cachedVersion = loadToolsCache().version;
9191
9228
  if (hasCacheFile() && cachedVersion !== VERSION) {