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.

Files changed (2) hide show
  1. package/install.js +67 -38
  2. 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
- // How to open the vault in each agent
1392
- const agentOpen = {
1393
- "claude-code": { cmd: `cd "${vaultPath}" && claude`, name: "Claude Code" },
1394
- cursor: { cmd: `Open Cursor → File → Open Folder → select vault`, name: "Cursor" },
1395
- cline: { cmd: `Open VS Code → File → Open Folder → select vault`, name: "Cline (VS Code)" },
1396
- codex: { cmd: `cd "${vaultPath}" && codex`, name: "Codex" },
1397
- windsurf: { cmd: `Open Windsurf → File → Open Folder → select vault`, name: "Windsurf" },
1398
- openclaw: { cmd: `cd "${vaultPath}" && openclaw`, name: "OpenClaw" },
1399
- antigravity: { cmd: `cd "${vaultPath}" && gemini`, name: "Antigravity" },
1400
- "roo-code": { cmd: `Open VS Code → File → Open Folder → select vault`, name: "Roo Code" },
1401
- copilot: { cmd: `Open VS Code → File → Open Folder → select vault`, name: "Copilot" },
1402
- amp: { cmd: `cd "${vaultPath}" && amp`, name: "Amp" },
1403
- aider: { cmd: `cd "${vaultPath}" && aider`, name: "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 agent = agentOpen[primaryAgent.id] || { cmd: "Open your AI agent in the vault", name: "your agent" };
1427
+ const agentNames = selectedAgents.map((a) => agentInfo[a.id]?.name || a.name);
1428
+ const agentList = agentNames.join(", ");
1409
1429
 
1410
- // Box-drawn summary panel
1411
- const boxW = 58;
1412
- const pad = (s, w) => {
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(gray(` ┌${"".repeat(boxW)}┐`));
1418
- ln(gray(` │`) + pad(` ${bold("Next steps")}`, boxW) + gray(`│`));
1419
- ln(gray(` │${"".repeat(boxW)}│`));
1420
- ln(gray(` │`) + pad(` ${cyan("1")} Open your vault in ${bold("Obsidian")} ${dim("(for viewing files)")}`, boxW) + gray(`│`));
1421
- ln(gray(` │`) + pad(` ${dim(vaultPath.length > 48 ? "..." + vaultPath.slice(-45) : vaultPath)}`, boxW) + gray(`│`));
1422
- ln(gray(` │`) + pad(` ${cyan("2")} Open the vault in ${bold(agent.name)} ${dim("(your AI agent)")}`, boxW) + gray(`│`));
1423
- ln(gray(` │`) + pad(` ${dim(agent.cmd.length > 48 ? agent.cmd.slice(0, 48) + "..." : agent.cmd)}`, boxW) + gray(`│`));
1424
- ln(gray(` │`) + pad(` ${cyan("3")} Enable theme in Obsidian`, boxW) + gray(`│`));
1425
- ln(gray(` │`) + pad(` ${dim("Settings → Appearance → CSS snippets → minimal-theme")}`, boxW) + gray(`│`));
1426
- ln(gray(` │`) + pad(` ${cyan("4")} Run ${bold(command)} in ${agent.name}`, boxW) + gray(`│`));
1427
- ln(gray(` │`) + pad(` ${dim(updateMode ? "Syncs your Engine with the latest version" : "Builds your Identity, Strategy, and Goals")}`, boxW) + gray(`│`));
1428
- ln(gray(` │${" ".repeat(boxW)}│`));
1429
- ln(gray(` │`) + pad(` ${dim("Obsidian = view your files")}`, boxW) + gray(`│`));
1430
- ln(gray(` │`) + pad(` ${dim(agent.name + " = where you work with the AI")}`, boxW) + gray(`│`));
1431
- ln(gray(` │${" ".repeat(boxW)}│`));
1432
- ln(gray(` │`) + pad(` ${dim("/morning → [work] → /log → /analyse-day → /plan-tomorrow")}`, boxW) + gray(`│`));
1433
- ln(gray(` └${"".repeat(boxW)}┘`));
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
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mover-os",
3
- "version": "4.0.1",
3
+ "version": "4.0.2",
4
4
  "description": "The self-improving OS for AI agents. Turns Obsidian into an execution engine.",
5
5
  "bin": {
6
6
  "mover-os": "install.js"