uloop-cli 0.66.1 → 0.67.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/cli.bundle.cjs +57 -20
- package/dist/cli.bundle.cjs.map +2 -2
- package/package.json +3 -3
- package/src/__tests__/port-resolver.test.ts +7 -23
- package/src/__tests__/project-root.test.ts +97 -0
- package/src/cli.ts +17 -1
- package/src/default-tools.json +1 -1
- package/src/direct-unity-client.ts +1 -1
- package/src/port-resolver.ts +0 -10
- package/src/project-root.ts +12 -2
- package/src/skills/skills-command.ts +27 -3
- package/src/skills/target-config.ts +20 -2
- package/src/version.ts +1 -1
package/dist/cli.bundle.cjs
CHANGED
|
@@ -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]
|
|
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(
|
|
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.
|
|
5827
|
+
version: "0.67.0",
|
|
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.
|
|
6275
|
+
var VERSION = "0.67.0";
|
|
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
|
|
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} --
|
|
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) {
|