mover-os 4.6.0 → 4.6.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.
Files changed (2) hide show
  1. package/install.js +80 -22
  2. package/package.json +1 -1
package/install.js CHANGED
@@ -1670,9 +1670,14 @@ async function runUninstall(vaultPath) {
1670
1670
  barLn(`${dim("Could not reach Polar — license not deactivated")}`);
1671
1671
  }
1672
1672
  }
1673
- // Remove config file
1674
- fs.unlinkSync(configPath);
1675
- barLn(`${green("\u2713")} ${dim("~/.mover/config.json")}`);
1673
+ // Remove config file but preserve license key for reinstall
1674
+ if (cfg.licenseKey) {
1675
+ fs.writeFileSync(configPath, JSON.stringify({ licenseKey: cfg.licenseKey }, null, 2), "utf8");
1676
+ barLn(`${green("\u2713")} ${dim("~/.mover/config.json (license key preserved for reinstall)")}`);
1677
+ } else {
1678
+ fs.unlinkSync(configPath);
1679
+ barLn(`${green("\u2713")} ${dim("~/.mover/config.json")}`);
1680
+ }
1676
1681
  removed++;
1677
1682
  } catch {}
1678
1683
  }
@@ -1880,13 +1885,14 @@ const AGENT_REGISTRY = {
1880
1885
  },
1881
1886
  };
1882
1887
 
1883
- // User-selectable agents (14 selections). Each maps to 1+ install targets.
1888
+ // User-selectable agents (15 selections). Each maps to 1+ install targets.
1884
1889
  const AGENT_SELECTIONS = [
1885
1890
  { id: "claude-code", targets: ["claude-code"], name: "Claude Code" },
1886
1891
  { id: "cursor", targets: ["cursor"], name: "Cursor" },
1887
1892
  { id: "cline", targets: ["cline"], name: "Cline" },
1888
1893
  { id: "windsurf", targets: ["windsurf"], name: "Windsurf" },
1889
- { id: "gemini-cli", targets: ["gemini-cli", "antigravity"], name: "Gemini CLI + Antigravity" },
1894
+ { id: "gemini-cli", targets: ["gemini-cli"], name: "Gemini CLI" },
1895
+ { id: "antigravity", targets: ["antigravity"], name: "Antigravity" },
1890
1896
  { id: "copilot", targets: ["copilot"], name: "GitHub Copilot" },
1891
1897
  { id: "codex", targets: ["codex"], name: "Codex" },
1892
1898
  { id: "amazon-q", targets: ["amazon-q"], name: "Amazon Q Developer" },
@@ -5093,6 +5099,21 @@ async function cmdUpdateComprehensive(opts, bundleDir, startTime) {
5093
5099
  return;
5094
5100
  }
5095
5101
 
5102
+ // ── Confirmation gate ──
5103
+ barLn();
5104
+ const updateConfirm = await interactiveSelect(
5105
+ [
5106
+ { id: "yes", name: "Apply updates", tier: `${totalChanged} file${totalChanged > 1 ? "s" : ""} will be updated` },
5107
+ { id: "no", name: "Cancel", tier: "No changes will be made" },
5108
+ ],
5109
+ { multi: false, defaultIndex: 0 }
5110
+ );
5111
+ if (!updateConfirm || updateConfirm === "no") {
5112
+ outro("Update cancelled.");
5113
+ return;
5114
+ }
5115
+ barLn();
5116
+
5096
5117
  // ── Apply safe system files directly (no user customizations in these) ──
5097
5118
  const home = os.homedir();
5098
5119
  let appliedCount = 0;
@@ -5677,8 +5698,9 @@ async function main() {
5677
5698
  if (selectedIds.includes("claude-code")) {
5678
5699
  barLn();
5679
5700
  question("Install Claude Code status line?");
5680
- barLn(dim(" Shows model, project, context usage, and session cost in your terminal."));
5681
- barLn(dim(" Example: [Opus 4.6] my-project | Context: 42% | $3.50"));
5701
+ barLn(dim(" Live status bar with model, context %, project, session cost, and Mover OS data."));
5702
+ barLn(dim(" Example: Opus 4.6 · 24% · my-project (main) · 2h14m · $12.50"));
5703
+ barLn(dim(" ▸ next task · 2/5 done · Sleep by 22:00 · logged 30m ago"));
5682
5704
  barLn();
5683
5705
 
5684
5706
  const slChoice = await interactiveSelect(
@@ -5805,30 +5827,33 @@ async function main() {
5805
5827
  }
5806
5828
  }
5807
5829
 
5808
- // ── Settings step — let user configure before install ──
5830
+ // ── Settings step — let user configure before install (loops until esc) ──
5809
5831
  {
5810
5832
  barLn();
5811
- question("Configure settings " + dim("(esc to use defaults)"));
5833
+ question("Configure settings " + dim("(esc to continue with defaults)"));
5812
5834
  barLn();
5813
- const settingsItems = [
5814
- { id: "review_day", name: "review_day Sunday Weekly review day" },
5815
- { id: "track_food", name: "track_food on Track food in daily notes" },
5816
- { id: "track_sleep", name: "track_sleep on Track sleep in daily notes" },
5817
- { id: "friction_level", name: "friction_level 3 Max friction level (1-4)" },
5818
- ];
5819
- const settingsPick = await interactiveSelect(settingsItems);
5820
- if (settingsPick) {
5835
+ let editingSettings = true;
5836
+ while (editingSettings) {
5837
+ const cfgPath = path.join(os.homedir(), ".mover", "config.json");
5838
+ let cfg = {};
5839
+ if (fs.existsSync(cfgPath)) { try { cfg = JSON.parse(fs.readFileSync(cfgPath, "utf8")); } catch {} }
5840
+ if (!cfg.settings) cfg.settings = {};
5841
+
5842
+ const settingsItems = [
5843
+ { id: "review_day", name: `review_day ${(cfg.settings.review_day || "Sunday").toString().padEnd(12)}Weekly review day` },
5844
+ { id: "track_food", name: `track_food ${(cfg.settings.track_food !== undefined ? (cfg.settings.track_food ? "on" : "off") : "on").padEnd(12)}Track food in daily notes` },
5845
+ { id: "track_sleep", name: `track_sleep ${(cfg.settings.track_sleep !== undefined ? (cfg.settings.track_sleep ? "on" : "off") : "on").padEnd(12)}Track sleep in daily notes` },
5846
+ { id: "friction_level", name: `friction_level ${(cfg.settings.friction_level || 3).toString().padEnd(12)}Max friction level (1-4)` },
5847
+ ];
5848
+ const settingsPick = await interactiveSelect(settingsItems);
5849
+ if (!settingsPick) { editingSettings = false; break; }
5821
5850
  const meta = KNOWN_SETTINGS[settingsPick];
5822
5851
  if (meta) {
5823
- const cfgPath = path.join(os.homedir(), ".mover", "config.json");
5824
- let cfg = {};
5825
- if (fs.existsSync(cfgPath)) { try { cfg = JSON.parse(fs.readFileSync(cfgPath, "utf8")); } catch {} }
5826
- if (!cfg.settings) cfg.settings = {};
5827
5852
  if (meta.type === "boolean") {
5828
5853
  cfg.settings[settingsPick] = !(cfg.settings[settingsPick] !== undefined ? cfg.settings[settingsPick] : meta.defaults);
5829
5854
  statusLine("ok", settingsPick, cfg.settings[settingsPick] ? "on" : "off");
5830
5855
  } else {
5831
- const answer = await textInput({ label: settingsPick, initial: String(meta.defaults) });
5856
+ const answer = await textInput({ label: settingsPick, initial: String(cfg.settings[settingsPick] !== undefined ? cfg.settings[settingsPick] : meta.defaults) });
5832
5857
  if (answer !== null && answer.trim() !== "") {
5833
5858
  cfg.settings[settingsPick] = meta.type === "number" ? parseInt(answer.trim(), 10) : answer.trim();
5834
5859
  statusLine("ok", settingsPick, JSON.stringify(cfg.settings[settingsPick]));
@@ -5840,6 +5865,39 @@ async function main() {
5840
5865
  }
5841
5866
  }
5842
5867
 
5868
+ // ── Confirmation gate — show what will be installed ──
5869
+ {
5870
+ barLn();
5871
+ question(bold("Review your selections:"));
5872
+ barLn();
5873
+ barLn(` ${bold("Vault:")} ${vaultPath}`);
5874
+ barLn(` ${bold("Agents:")} ${selectedAgents.map((a) => a.name).join(", ")}`);
5875
+ if (installSkills && selectedCategories) {
5876
+ barLn(` ${bold("Skills:")} ${[...selectedCategories].join(", ")}`);
5877
+ } else if (installSkills) {
5878
+ barLn(` ${bold("Skills:")} all categories`);
5879
+ } else {
5880
+ barLn(` ${bold("Skills:")} none`);
5881
+ }
5882
+ if (selectedIds.includes("claude-code")) {
5883
+ barLn(` ${bold("Status line:")} ${installStatusLine ? "yes" : "no"}`);
5884
+ }
5885
+ barLn(` ${bold("Prayer:")} ${prayerSetup ? "yes" : "no"}`);
5886
+ barLn();
5887
+
5888
+ const confirmChoice = await interactiveSelect(
5889
+ [
5890
+ { id: "yes", name: "Install", tier: "Proceed with the selections above" },
5891
+ { id: "no", name: "Cancel", tier: "Go back and start over" },
5892
+ ],
5893
+ { multi: false, defaultIndex: 0 }
5894
+ );
5895
+ if (!confirmChoice || confirmChoice === "no") {
5896
+ outro("Cancelled.");
5897
+ return;
5898
+ }
5899
+ }
5900
+
5843
5901
  // ── Install with animated spinners ──
5844
5902
  barLn();
5845
5903
  question(bold("Installing..."));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mover-os",
3
- "version": "4.6.0",
3
+ "version": "4.6.1",
4
4
  "description": "The self-improving OS for AI agents. Turns Obsidian into an execution engine.",
5
5
  "bin": {
6
6
  "moveros": "install.js"