mover-os 4.0.1 → 4.0.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.

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 +60 -41
  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
 
@@ -1280,6 +1300,24 @@ async function main() {
1280
1300
  let totalSteps = 0;
1281
1301
  const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
1282
1302
 
1303
+ // 0. Legacy cleanup (remove files from older installer versions)
1304
+ const legacyPaths = [
1305
+ path.join(vaultPath, "src"), // hooks used to install here
1306
+ path.join(vaultPath, "SOUL.md"), // old soul file
1307
+ ];
1308
+ for (const lp of legacyPaths) {
1309
+ if (fs.existsSync(lp)) {
1310
+ try {
1311
+ const stat = fs.statSync(lp);
1312
+ if (stat.isDirectory()) {
1313
+ fs.rmSync(lp, { recursive: true, force: true });
1314
+ } else {
1315
+ fs.unlinkSync(lp);
1316
+ }
1317
+ } catch {}
1318
+ }
1319
+ }
1320
+
1283
1321
  // 1. Vault structure
1284
1322
  let sp = spinner("Vault structure");
1285
1323
  const dirsCreated = createVaultStructure(vaultPath);
@@ -1388,49 +1426,30 @@ async function main() {
1388
1426
  const verb = updateMode ? "updated" : "installed";
1389
1427
  outro(`${green("Done.")} Mover OS v${VERSION} ${verb}. ${dim(`${totalSteps} steps in ${elapsed}s`)}`);
1390
1428
 
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" },
1404
- };
1405
-
1406
- const primaryAgent = selectedAgents[0];
1407
1429
  const command = updateMode ? "/update" : "/setup";
1408
- const agent = agentOpen[primaryAgent.id] || { cmd: "Open your AI agent in the vault", name: "your agent" };
1430
+ const agentNames = selectedAgents.map((a) => a.name);
1409
1431
 
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
- };
1416
-
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)}┘`));
1432
+ ln(` ${bold("Next steps")}`);
1433
+ ln();
1434
+ ln(` ${cyan("1")} Open your vault in ${bold("Obsidian")}`);
1435
+ ln(` ${dim("This is where you view and browse your files")}`);
1436
+ ln();
1437
+ ln(` ${cyan("2")} Open the vault folder in your AI agent`);
1438
+ ln(` ${dim("Installed: " + agentNames.join(", "))}`);
1439
+ ln();
1440
+ ln(` ${cyan("3")} Enable the Obsidian theme`);
1441
+ ln(` ${dim("Settings → Appearance → CSS snippets → minimal-theme")}`);
1442
+ ln();
1443
+ ln(` ${cyan("4")} Run ${bold(command)}`);
1444
+ ln(` ${dim(updateMode ? "Syncs your Engine with the latest version" : "Builds your Identity, Strategy, and Goals")}`);
1445
+ ln();
1446
+ ln(gray(" ─────────────────────────────────────"));
1447
+ ln();
1448
+ ln(` ${dim("Obsidian = view your files")}`);
1449
+ ln(` ${dim("Your AI agent = where you work")}`);
1450
+ ln();
1451
+ ln(` ${dim("/morning [work] /log")}`);
1452
+ ln(` ${dim("/analyse-day /plan-tomorrow")}`);
1434
1453
  ln();
1435
1454
  }
1436
1455
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mover-os",
3
- "version": "4.0.1",
3
+ "version": "4.0.3",
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"