mover-os 4.0.1 → 4.0.2
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.
Potentially problematic release.
This version of mover-os might be problematic. Click here for more details.
- package/install.js +67 -38
- package/package.json +1 -1
package/install.js
CHANGED
|
@@ -1093,6 +1093,21 @@ function preflight() {
|
|
|
1093
1093
|
const plat = process.platform === "win32" ? "Windows" : process.platform === "darwin" ? "macOS" : "Linux";
|
|
1094
1094
|
issues.push({ label: "Platform", status: "ok", detail: plat });
|
|
1095
1095
|
|
|
1096
|
+
// Obsidian — check common install locations
|
|
1097
|
+
let hasObsidian = false;
|
|
1098
|
+
if (process.platform === "darwin") {
|
|
1099
|
+
hasObsidian = fs.existsSync("/Applications/Obsidian.app");
|
|
1100
|
+
} else if (process.platform === "win32") {
|
|
1101
|
+
hasObsidian = fs.existsSync(path.join(os.homedir(), "AppData", "Local", "Obsidian"));
|
|
1102
|
+
} else {
|
|
1103
|
+
hasObsidian = cmdExists("obsidian") || fs.existsSync(path.join(os.homedir(), ".config", "obsidian"));
|
|
1104
|
+
}
|
|
1105
|
+
issues.push({
|
|
1106
|
+
label: "Obsidian",
|
|
1107
|
+
status: hasObsidian ? "ok" : "warn",
|
|
1108
|
+
detail: hasObsidian ? "found" : "not found — get it at obsidian.md",
|
|
1109
|
+
});
|
|
1110
|
+
|
|
1096
1111
|
return issues;
|
|
1097
1112
|
}
|
|
1098
1113
|
|
|
@@ -1239,6 +1254,11 @@ async function main() {
|
|
|
1239
1254
|
_detected: detectedIds.includes(a.id),
|
|
1240
1255
|
}));
|
|
1241
1256
|
|
|
1257
|
+
if (detectedIds.length === 0) {
|
|
1258
|
+
barLn(yellow("No AI agents detected."));
|
|
1259
|
+
barLn(dim("You need at least one to use Mover OS. Recommended: Claude Code (claude.ai/code)"));
|
|
1260
|
+
barLn();
|
|
1261
|
+
}
|
|
1242
1262
|
question(`Select your AI agents${detectedIds.length > 0 ? dim(" (detected agents pre-selected)") : ""}`);
|
|
1243
1263
|
barLn();
|
|
1244
1264
|
|
|
@@ -1388,49 +1408,58 @@ async function main() {
|
|
|
1388
1408
|
const verb = updateMode ? "updated" : "installed";
|
|
1389
1409
|
outro(`${green("Done.")} Mover OS v${VERSION} ${verb}. ${dim(`${totalSteps} steps in ${elapsed}s`)}`);
|
|
1390
1410
|
|
|
1391
|
-
//
|
|
1392
|
-
const
|
|
1393
|
-
"claude-code": {
|
|
1394
|
-
cursor: {
|
|
1395
|
-
cline: {
|
|
1396
|
-
codex: {
|
|
1397
|
-
windsurf: {
|
|
1398
|
-
openclaw: {
|
|
1399
|
-
antigravity: {
|
|
1400
|
-
"roo-code": {
|
|
1401
|
-
copilot: {
|
|
1402
|
-
amp: {
|
|
1403
|
-
aider: {
|
|
1411
|
+
// Agent display names and CLI commands
|
|
1412
|
+
const agentInfo = {
|
|
1413
|
+
"claude-code": { name: "Claude Code", cli: "claude" },
|
|
1414
|
+
cursor: { name: "Cursor", cli: null },
|
|
1415
|
+
cline: { name: "Cline", cli: null },
|
|
1416
|
+
codex: { name: "Codex", cli: "codex" },
|
|
1417
|
+
windsurf: { name: "Windsurf", cli: null },
|
|
1418
|
+
openclaw: { name: "OpenClaw", cli: "openclaw" },
|
|
1419
|
+
antigravity: { name: "Antigravity", cli: "gemini" },
|
|
1420
|
+
"roo-code": { name: "Roo Code", cli: null },
|
|
1421
|
+
copilot: { name: "Copilot", cli: null },
|
|
1422
|
+
amp: { name: "Amp", cli: "amp" },
|
|
1423
|
+
aider: { name: "Aider", cli: "aider" },
|
|
1404
1424
|
};
|
|
1405
1425
|
|
|
1406
|
-
const primaryAgent = selectedAgents[0];
|
|
1407
1426
|
const command = updateMode ? "/update" : "/setup";
|
|
1408
|
-
const
|
|
1427
|
+
const agentNames = selectedAgents.map((a) => agentInfo[a.id]?.name || a.name);
|
|
1428
|
+
const agentList = agentNames.join(", ");
|
|
1409
1429
|
|
|
1410
|
-
//
|
|
1411
|
-
const
|
|
1412
|
-
const
|
|
1413
|
-
const visible = strip(s).length;
|
|
1414
|
-
return visible < w ? s + " ".repeat(w - visible) : s;
|
|
1415
|
-
};
|
|
1430
|
+
// CLI agents get "cd + run" instructions, GUI agents get "open folder"
|
|
1431
|
+
const cliAgents = selectedAgents.filter((a) => agentInfo[a.id]?.cli);
|
|
1432
|
+
const guiAgents = selectedAgents.filter((a) => !agentInfo[a.id]?.cli);
|
|
1416
1433
|
|
|
1417
|
-
ln(
|
|
1418
|
-
ln(
|
|
1419
|
-
ln(
|
|
1420
|
-
ln(
|
|
1421
|
-
ln(
|
|
1422
|
-
ln(
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
ln(
|
|
1433
|
-
ln(
|
|
1434
|
+
ln(` ${bold("Next steps")}`);
|
|
1435
|
+
ln();
|
|
1436
|
+
ln(` ${cyan("1")} Open your vault in ${bold("Obsidian")}`);
|
|
1437
|
+
ln(` ${dim("Obsidian is where you view and browse your files")}`);
|
|
1438
|
+
ln();
|
|
1439
|
+
ln(` ${cyan("2")} Open the vault in your AI agent`);
|
|
1440
|
+
if (cliAgents.length > 0) {
|
|
1441
|
+
const cmds = cliAgents.map((a) => agentInfo[a.id].cli);
|
|
1442
|
+
ln(` ${dim("cd")} ${vaultPath}`);
|
|
1443
|
+
ln(` ${dim("then run:")} ${cmds.map((c) => bold(c)).join(dim(" or "))}`);
|
|
1444
|
+
}
|
|
1445
|
+
if (guiAgents.length > 0) {
|
|
1446
|
+
const names = guiAgents.map((a) => bold(agentInfo[a.id]?.name || a.name)).join(dim(", "));
|
|
1447
|
+
ln(` ${dim("Open")} ${names} ${dim("→ open the vault folder")}`);
|
|
1448
|
+
}
|
|
1449
|
+
ln();
|
|
1450
|
+
ln(` ${cyan("3")} Enable the Obsidian theme`);
|
|
1451
|
+
ln(` ${dim("Settings → Appearance → CSS snippets → toggle on minimal-theme")}`);
|
|
1452
|
+
ln();
|
|
1453
|
+
ln(` ${cyan("4")} Run ${bold(command)} in your agent`);
|
|
1454
|
+
ln(` ${dim(updateMode ? "Syncs your Engine with the latest version" : "Builds your Identity, Strategy, and Goals")}`);
|
|
1455
|
+
ln();
|
|
1456
|
+
ln(gray(" ─────────────────────────────────────"));
|
|
1457
|
+
ln();
|
|
1458
|
+
ln(` ${dim("Obsidian = view your files")}`);
|
|
1459
|
+
ln(` ${dim("Your AI agent = where you work")}`);
|
|
1460
|
+
ln();
|
|
1461
|
+
ln(` ${dim("/morning → [work] → /log")}`);
|
|
1462
|
+
ln(` ${dim("/analyse-day → /plan-tomorrow")}`);
|
|
1434
1463
|
ln();
|
|
1435
1464
|
}
|
|
1436
1465
|
|