mover-os 4.4.2 → 4.4.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.
- package/install.js +226 -169
- package/package.json +1 -1
package/install.js
CHANGED
|
@@ -182,7 +182,17 @@ async function printHeader(animate = IS_TTY) {
|
|
|
182
182
|
}
|
|
183
183
|
} catch {}
|
|
184
184
|
|
|
185
|
-
|
|
185
|
+
const pkgVer = require("./package.json").version;
|
|
186
|
+
ln(` ${dim(`v${pkgVer}`)} ${gray("the agentic operating system for obsidian")}${infoRight ? ` ${infoRight}` : ""}`);
|
|
187
|
+
|
|
188
|
+
// Non-blocking update check
|
|
189
|
+
try {
|
|
190
|
+
const latest = execSync("npm view mover-os version", { encoding: "utf8", timeout: 5000 }).trim();
|
|
191
|
+
if (latest && latest !== pkgVer && compareVersions(latest, pkgVer) > 0) {
|
|
192
|
+
ln(` ${yellow(`Update available: v${pkgVer} → v${latest}`)} ${dim(`run ${bold("moveros update")}`)}`);
|
|
193
|
+
}
|
|
194
|
+
} catch {}
|
|
195
|
+
|
|
186
196
|
ln();
|
|
187
197
|
ln(gray(" ─────────────────────────────────────────────"));
|
|
188
198
|
ln();
|
|
@@ -3847,230 +3857,270 @@ async function cmdRestore(opts) {
|
|
|
3847
3857
|
|
|
3848
3858
|
// ─── moveros help ──────────────────────────────────────────────────────────
|
|
3849
3859
|
async function cmdHelp(opts) {
|
|
3850
|
-
//
|
|
3860
|
+
// Animated typing helper
|
|
3861
|
+
const typeOut = async (text, speed = 12) => {
|
|
3862
|
+
if (!IS_TTY) { ln(text); return; }
|
|
3863
|
+
const raw = strip(text);
|
|
3864
|
+
let rawIdx = 0, ansiIdx = 0;
|
|
3865
|
+
// Build mapping of raw char positions to the styled string slices
|
|
3866
|
+
while (rawIdx < raw.length) {
|
|
3867
|
+
w(text[ansiIdx] || "");
|
|
3868
|
+
if (text[ansiIdx] && text[ansiIdx] !== "\x1b" && !text.slice(Math.max(0, ansiIdx - 10), ansiIdx).match(/\x1b\[[^m]*$/)) {
|
|
3869
|
+
rawIdx++;
|
|
3870
|
+
}
|
|
3871
|
+
ansiIdx++;
|
|
3872
|
+
if (rawIdx % 2 === 0) await sleep(speed);
|
|
3873
|
+
}
|
|
3874
|
+
// flush remaining ANSI codes
|
|
3875
|
+
while (ansiIdx < text.length) { w(text[ansiIdx]); ansiIdx++; }
|
|
3876
|
+
w("\n");
|
|
3877
|
+
};
|
|
3878
|
+
|
|
3879
|
+
const typeLine = async (text, speed = 8) => {
|
|
3880
|
+
if (!IS_TTY) { ln(` ${text}`); return; }
|
|
3881
|
+
w(" ");
|
|
3882
|
+
for (let i = 0; i < text.length; i++) {
|
|
3883
|
+
w(text[i]);
|
|
3884
|
+
if (text[i] !== "\x1b" && i % 3 === 0) await sleep(speed);
|
|
3885
|
+
}
|
|
3886
|
+
w("\n");
|
|
3887
|
+
};
|
|
3888
|
+
|
|
3851
3889
|
const pages = [
|
|
3852
3890
|
{
|
|
3853
|
-
title: "
|
|
3891
|
+
title: "What is Mover OS?",
|
|
3854
3892
|
body: [
|
|
3855
|
-
`${bold("
|
|
3893
|
+
`${bold("Your second brain, but it actually works.")}`,
|
|
3856
3894
|
"",
|
|
3857
|
-
"
|
|
3858
|
-
"
|
|
3859
|
-
"Copilot, Codex, and more. Same brain, every editor.",
|
|
3895
|
+
"Most productivity systems fail because you have to maintain them.",
|
|
3896
|
+
"Mover OS is different — your AI agents maintain it for you.",
|
|
3860
3897
|
"",
|
|
3861
|
-
|
|
3862
|
-
|
|
3863
|
-
` ${cyan("2.")} ${bold("Workflows")} run your day — plan, execute, log, analyse, repeat`,
|
|
3864
|
-
` ${cyan("3.")} ${bold("Skills")} give your AI agents deep domain knowledge`,
|
|
3865
|
-
` ${cyan("4.")} The system ${bold("learns")} from your behavior and adapts`,
|
|
3898
|
+
"You tell your AI who you are, what you're building, and where",
|
|
3899
|
+
"you're going. It remembers across every session, every editor.",
|
|
3866
3900
|
"",
|
|
3867
|
-
`${dim("
|
|
3901
|
+
`${dim("Three things make it work:")}`,
|
|
3902
|
+
` ${cyan("1.")} The ${bold("Engine")} — files that store your identity, strategy, goals`,
|
|
3903
|
+
` ${cyan("2.")} ${bold("Workflows")} — 23 commands that run your day (plan, build, log, repeat)`,
|
|
3904
|
+
` ${cyan("3.")} ${bold("Skills")} — 61 packs that make your AI genuinely useful`,
|
|
3905
|
+
"",
|
|
3906
|
+
`Works across 16 agents. Claude Code, Cursor, Gemini, all of them.`,
|
|
3907
|
+
`Same context, every editor. ${dim("Press → to continue.")}`,
|
|
3868
3908
|
],
|
|
3869
3909
|
},
|
|
3870
3910
|
{
|
|
3871
|
-
title: "The Engine
|
|
3911
|
+
title: "The Engine",
|
|
3872
3912
|
body: [
|
|
3873
|
-
`${dim("
|
|
3913
|
+
`${dim("Your identity, stored as markdown. Read by every AI session.")}`,
|
|
3874
3914
|
"",
|
|
3875
|
-
|
|
3915
|
+
` ${cyan("Identity_Prime.md")} Who you are — values, strengths, anti-patterns`,
|
|
3916
|
+
` ${cyan("Strategy.md")} What you're betting on right now`,
|
|
3917
|
+
` ${cyan("Active_Context.md")} What's happening today — focus, blockers, energy`,
|
|
3918
|
+
` ${cyan("Goals.md")} Where you're heading — 90 days to 10 years`,
|
|
3919
|
+
` ${cyan("Mover_Dossier.md")} What you've got — skills, audience, assets`,
|
|
3920
|
+
` ${cyan("Auto_Learnings.md")} What the AI has noticed about your behavior`,
|
|
3876
3921
|
"",
|
|
3877
|
-
|
|
3878
|
-
|
|
3879
|
-
` ${cyan("Active_Context.md")} What's happening NOW — blockers, focus, state`,
|
|
3880
|
-
` ${cyan("Goals.md")} Where you're going — 90d, 1yr, 10yr targets`,
|
|
3881
|
-
` ${cyan("Mover_Dossier.md")} What you have — skills, capital, network`,
|
|
3882
|
-
` ${cyan("Auto_Learnings.md")} What the AI notices — behavioral patterns`,
|
|
3922
|
+
"These files are yours. The system never overwrites them.",
|
|
3923
|
+
"Every workflow reads them. They evolve as you do.",
|
|
3883
3924
|
"",
|
|
3884
|
-
|
|
3885
|
-
"Every AI session reads them. Every workflow updates them.",
|
|
3886
|
-
`Your Engine ${bold("evolves")} as you do.`,
|
|
3925
|
+
`${dim("Location:")} 02_Areas/Engine/`,
|
|
3887
3926
|
],
|
|
3888
3927
|
},
|
|
3889
3928
|
{
|
|
3890
|
-
title: "Daily
|
|
3929
|
+
title: "Your Daily Loop",
|
|
3891
3930
|
body: [
|
|
3892
|
-
`${
|
|
3931
|
+
`${dim("The rhythm that makes it stick:")}`,
|
|
3893
3932
|
"",
|
|
3894
|
-
` ${green("→")} ${bold("/morning")}
|
|
3895
|
-
` ${green("→")} ${bold("[WORK]")} Build, ship, create
|
|
3896
|
-
` ${green("→")} ${bold("/log")} Capture what happened
|
|
3897
|
-
` ${green("→")} ${bold("/analyse-day")}
|
|
3898
|
-
` ${green("→")} ${bold("/plan-tomorrow")}
|
|
3933
|
+
` ${green("→")} ${bold("/morning")} Check in. Set your one thing for the day.`,
|
|
3934
|
+
` ${green("→")} ${bold("[WORK]")} Build, ship, create.`,
|
|
3935
|
+
` ${green("→")} ${bold("/log")} Capture what happened. Plan syncs automatically.`,
|
|
3936
|
+
` ${green("→")} ${bold("/analyse-day")} Honest audit. What worked, what didn't.`,
|
|
3937
|
+
` ${green("→")} ${bold("/plan-tomorrow")} Set up tomorrow before you close the laptop.`,
|
|
3899
3938
|
"",
|
|
3900
|
-
|
|
3901
|
-
` ${green("→")} ${bold("/review-week")} Sunday deep review + strategy validation`,
|
|
3939
|
+
` ${dim("Sundays:")} ${bold("/review-week")} — zoom out, validate strategy, clean the system.`,
|
|
3902
3940
|
"",
|
|
3903
|
-
|
|
3904
|
-
"
|
|
3905
|
-
`Every workflow hands off to the next — ${bold("no dead ends")}.`,
|
|
3941
|
+
"Miss a day, the system notices. Miss three, /reboot kicks in.",
|
|
3942
|
+
"Each workflow hands off to the next. No dead ends.",
|
|
3906
3943
|
],
|
|
3907
3944
|
},
|
|
3908
3945
|
{
|
|
3909
|
-
title: "
|
|
3946
|
+
title: "23 Workflows",
|
|
3910
3947
|
body: [
|
|
3911
|
-
`${
|
|
3912
|
-
`${bold("Build:")} /ignite /overview /refactor-plan /capture /debrief`,
|
|
3913
|
-
`${bold("Think:")} /debug-resistance /pivot-strategy /mover-ideas /screenshot`,
|
|
3914
|
-
`${bold("Grow:")} /harvest /history /reboot`,
|
|
3915
|
-
`${bold("Meta:")} /setup /update /walkthrough /migrate /mover-check /mover-report`,
|
|
3948
|
+
`${dim("Slash commands inside your AI agent. Type / and go.")}`,
|
|
3916
3949
|
"",
|
|
3917
|
-
`${
|
|
3918
|
-
|
|
3919
|
-
|
|
3920
|
-
|
|
3921
|
-
|
|
3922
|
-
` ${cyan("•")} ${bold("/screenshot")} does meta-analysis of your AI session patterns`,
|
|
3950
|
+
`${bold("Daily:")} /morning /log /analyse-day /plan-tomorrow /review-week`,
|
|
3951
|
+
`${bold("Projects:")} /ignite /overview /refactor-plan /capture /debrief`,
|
|
3952
|
+
`${bold("Strategy:")} /debug-resistance /pivot-strategy /mover-ideas /screenshot`,
|
|
3953
|
+
`${bold("Growth:")} /harvest /history /reboot`,
|
|
3954
|
+
`${bold("System:")} /setup /update /walkthrough /migrate /mover-check`,
|
|
3923
3955
|
"",
|
|
3924
|
-
"
|
|
3956
|
+
`${dim("Highlights:")}`,
|
|
3957
|
+
` ${bold("/ignite")} Starts any project — interrogation, brief, plan`,
|
|
3958
|
+
` ${bold("/debug-resistance")} Figures out WHY you're avoiding something`,
|
|
3959
|
+
` ${bold("/harvest")} Turns conversations into permanent knowledge`,
|
|
3960
|
+
` ${bold("/screenshot")} Meta-analysis of how you actually use AI`,
|
|
3925
3961
|
],
|
|
3926
3962
|
},
|
|
3927
3963
|
{
|
|
3928
|
-
title: "
|
|
3964
|
+
title: "61 Skill Packs",
|
|
3929
3965
|
body: [
|
|
3930
|
-
`${
|
|
3966
|
+
`${dim("Specialized knowledge your AI loads automatically.")}`,
|
|
3931
3967
|
"",
|
|
3932
|
-
|
|
3933
|
-
` ${cyan("
|
|
3934
|
-
` ${cyan("
|
|
3935
|
-
` ${cyan("
|
|
3936
|
-
` ${cyan("
|
|
3937
|
-
` ${cyan("seo")} Audits, schema markup, programmatic SEO, content`,
|
|
3938
|
-
` ${cyan("design")} UI/UX, frontend design, Obsidian markdown/canvas`,
|
|
3939
|
-
` ${cyan("obsidian")} JSON Canvas, Bases, Obsidian CLI, markdown`,
|
|
3968
|
+
` ${cyan("dev")} TDD, debugging, refactoring, error handling, React`,
|
|
3969
|
+
` ${cyan("marketing")} Copywriting, SEO, CRO, social media, email sequences`,
|
|
3970
|
+
` ${cyan("strategy")} Pricing, launch strategy, competitor analysis`,
|
|
3971
|
+
` ${cyan("design")} UI/UX, frontend patterns, accessibility`,
|
|
3972
|
+
` ${cyan("obsidian")} Canvas, Bases, markdown, CLI automation`,
|
|
3940
3973
|
"",
|
|
3941
|
-
`${dim("System skills (always
|
|
3942
|
-
` friction-enforcer
|
|
3943
|
-
`
|
|
3974
|
+
`${dim("System skills (always watching):")}`,
|
|
3975
|
+
` ${bold("friction-enforcer")} Pushes back when you drift from your plan`,
|
|
3976
|
+
` ${bold("pattern-detector")} Spots recurring behavior across sessions`,
|
|
3977
|
+
` ${bold("plan-md-guardian")} Protects your roadmap from corruption`,
|
|
3978
|
+
` ${bold("workflow-router")} Suggests the right workflow for the moment`,
|
|
3944
3979
|
"",
|
|
3945
|
-
"
|
|
3980
|
+
"You choose categories during install. Skills activate on context.",
|
|
3946
3981
|
],
|
|
3947
3982
|
},
|
|
3948
3983
|
{
|
|
3949
3984
|
title: "The Friction System",
|
|
3950
3985
|
body: [
|
|
3951
|
-
`${
|
|
3986
|
+
`${dim("Your AI has opinions. That's the point.")}`,
|
|
3952
3987
|
"",
|
|
3953
|
-
` ${dim("Level 1")} ${cyan("Surface")}
|
|
3954
|
-
` ${dim("Level 2")} ${yellow("Justify")}
|
|
3955
|
-
` ${dim("Level 3")} ${red("Earn It")}
|
|
3956
|
-
` ${dim("Level 4")} ${red("Hard Block")}
|
|
3988
|
+
` ${dim("Level 1")} ${cyan("Surface")} "Your plan says X. You're doing Y. Intentional?"`,
|
|
3989
|
+
` ${dim("Level 2")} ${yellow("Justify")} "Why is this more important than your Single Test?"`,
|
|
3990
|
+
` ${dim("Level 3")} ${red("Earn It")} Stops helping with off-plan work entirely.`,
|
|
3991
|
+
` ${dim("Level 4")} ${red("Hard Block")} Won't delete Engine files without a reason.`,
|
|
3957
3992
|
"",
|
|
3958
|
-
|
|
3959
|
-
|
|
3960
|
-
"when you're avoiding the hard thing.",
|
|
3993
|
+
"You can always push through. It's awareness, not a wall.",
|
|
3994
|
+
"But if you're avoiding the hard thing, the AI won't pretend.",
|
|
3961
3995
|
"",
|
|
3962
|
-
`${dim("
|
|
3963
|
-
`
|
|
3996
|
+
`${dim("Smart gate:")} If the work is genuinely useful (compound value,`,
|
|
3997
|
+
`exploration), it logs ${dim("[COMPOUND]")} and doesn't escalate.`,
|
|
3964
3998
|
],
|
|
3965
3999
|
},
|
|
3966
4000
|
{
|
|
3967
|
-
title: "
|
|
4001
|
+
title: "What is this CLI?",
|
|
3968
4002
|
body: [
|
|
3969
|
-
`${bold("
|
|
4003
|
+
`${bold("Terminal utilities that don't need an AI session.")}`,
|
|
3970
4004
|
"",
|
|
3971
|
-
|
|
3972
|
-
|
|
3973
|
-
|
|
3974
|
-
` ${cyan("3.")} Patterns surface proactively in workflows`,
|
|
3975
|
-
` ${cyan("4.")} You confirm or dismiss — the system adapts`,
|
|
4005
|
+
"Your AI agents handle the complex stuff — planning, analysis,",
|
|
4006
|
+
"writing. This CLI handles everything else: quick lookups, status",
|
|
4007
|
+
"checks, maintenance, things you want instantly.",
|
|
3976
4008
|
"",
|
|
3977
|
-
`${dim("
|
|
3978
|
-
` ${
|
|
3979
|
-
` ${
|
|
3980
|
-
` ${
|
|
3981
|
-
` ${yellow("Scope Creep")} Tasks growing beyond plan boundaries`,
|
|
3982
|
-
` ${yellow("Energy Cycles")} Performance tied to sleep/food/time`,
|
|
4009
|
+
`${dim("How it fits together:")}`,
|
|
4010
|
+
` ${cyan("Workflows")} Run inside AI agents (/morning, /log, /ignite)`,
|
|
4011
|
+
` ${cyan("Skills")} Loaded by AI agents automatically`,
|
|
4012
|
+
` ${cyan("CLI")} Runs in your terminal, no AI needed`,
|
|
3983
4013
|
"",
|
|
3984
|
-
|
|
4014
|
+
"The CLI supplements your agents. It never replaces them.",
|
|
4015
|
+
`Think of it as ${bold("htop for your productivity")} — instant, free, always there.`,
|
|
3985
4016
|
],
|
|
3986
4017
|
},
|
|
3987
4018
|
{
|
|
3988
|
-
title: "
|
|
4019
|
+
title: "CLI — Status & Insight",
|
|
3989
4020
|
body: [
|
|
3990
|
-
`${
|
|
4021
|
+
`${dim("See what's happening without opening an AI session.")}`,
|
|
3991
4022
|
"",
|
|
3992
|
-
|
|
3993
|
-
`
|
|
3994
|
-
` Copilot Amazon Q OpenCode Kilo Code`,
|
|
4023
|
+
` ${cyan("pulse")} Dashboard — tasks, streaks, energy, blockers`,
|
|
4024
|
+
` ${dim("Like htop for your day. One glance.")}`,
|
|
3995
4025
|
"",
|
|
3996
|
-
|
|
3997
|
-
`
|
|
4026
|
+
` ${cyan("replay")} Session replay — what you did, when, drift analysis`,
|
|
4027
|
+
` ${dim("\"You planned 4 tasks, completed 2, drifted into 3.\"")}`,
|
|
3998
4028
|
"",
|
|
3999
|
-
|
|
4000
|
-
`
|
|
4029
|
+
` ${cyan("diff")} Engine evolution — how your strategy changed over time`,
|
|
4030
|
+
` ${dim("Git-powered. Shows exactly when and why.")}`,
|
|
4031
|
+
"",
|
|
4032
|
+
` ${cyan("context")} What each agent sees — loaded rules, skills, token count`,
|
|
4033
|
+
` ${dim("Debug why an agent is behaving differently.")}`,
|
|
4034
|
+
"",
|
|
4035
|
+
` ${cyan("doctor")} Health check — are all agents configured correctly?`,
|
|
4036
|
+
],
|
|
4037
|
+
},
|
|
4038
|
+
{
|
|
4039
|
+
title: "CLI — Quick Actions",
|
|
4040
|
+
body: [
|
|
4041
|
+
`${dim("Do things fast without starting a session.")}`,
|
|
4042
|
+
"",
|
|
4043
|
+
` ${cyan("capture")} Quick capture — task, idea, link, brain dump`,
|
|
4044
|
+
` ${dim("moveros capture --task \"Fix the login bug\"")}`,
|
|
4001
4045
|
"",
|
|
4002
|
-
"
|
|
4003
|
-
`
|
|
4004
|
-
|
|
4046
|
+
` ${cyan("who")} Entity lookup — search People, Orgs, Places`,
|
|
4047
|
+
` ${dim("moveros who \"Ishaaq\" → everything you know about them")}`,
|
|
4048
|
+
"",
|
|
4049
|
+
` ${cyan("warm")} Pre-warm an AI session with fresh context`,
|
|
4050
|
+
` ${dim("Run before opening Claude/Cursor. Eliminates cold start.")}`,
|
|
4051
|
+
"",
|
|
4052
|
+
` ${cyan("prayer")} Mosque timetable — next prayer in your status line`,
|
|
4053
|
+
` ${dim("Paste or fetch. Shows countdown. Optional.")}`,
|
|
4005
4054
|
],
|
|
4006
4055
|
},
|
|
4007
4056
|
{
|
|
4008
|
-
title: "CLI
|
|
4057
|
+
title: "CLI — Maintenance",
|
|
4009
4058
|
body: [
|
|
4010
|
-
`${
|
|
4059
|
+
`${dim("Keep everything in sync without thinking about it.")}`,
|
|
4060
|
+
"",
|
|
4061
|
+
` ${cyan("sync")} Update all agents to latest rules and skills`,
|
|
4062
|
+
` ${dim("One command updates 16 agents. Shows what changed.")}`,
|
|
4011
4063
|
"",
|
|
4012
|
-
` ${cyan("
|
|
4013
|
-
`
|
|
4014
|
-
|
|
4015
|
-
` ${cyan("
|
|
4016
|
-
`
|
|
4017
|
-
|
|
4018
|
-
` ${cyan("
|
|
4019
|
-
`
|
|
4020
|
-
|
|
4021
|
-
` ${cyan("
|
|
4022
|
-
`
|
|
4023
|
-
` ${cyan("moveros warm")} Pre-warm an AI session with context`,
|
|
4064
|
+
` ${cyan("backup")} Backup Engine, Areas, or agent configs`,
|
|
4065
|
+
` ${dim("With manifest. Knows what's in each backup.")}`,
|
|
4066
|
+
"",
|
|
4067
|
+
` ${cyan("restore")} Restore from any backup — selective, safe`,
|
|
4068
|
+
` ${dim("Creates a safety backup before restoring.")}`,
|
|
4069
|
+
"",
|
|
4070
|
+
` ${cyan("settings")} View/edit config from terminal`,
|
|
4071
|
+
` ${dim("moveros settings set review_day sunday")}`,
|
|
4072
|
+
"",
|
|
4073
|
+
` ${cyan("update")} Update CLI + workflows + skills in one go`,
|
|
4074
|
+
` ${dim("Self-updates the CLI, then pulls latest payload.")}`,
|
|
4024
4075
|
],
|
|
4025
4076
|
},
|
|
4026
4077
|
{
|
|
4027
|
-
title: "
|
|
4078
|
+
title: "16 Agents, One Brain",
|
|
4028
4079
|
body: [
|
|
4029
|
-
`${
|
|
4080
|
+
`${dim("Install once. Every agent gets the same context.")}`,
|
|
4030
4081
|
"",
|
|
4031
|
-
|
|
4032
|
-
`
|
|
4033
|
-
`
|
|
4082
|
+
`${dim("Full tier")} ${dim("(rules + skills + commands + hooks):")}`,
|
|
4083
|
+
` Claude Code Cursor Cline Windsurf Gemini CLI`,
|
|
4084
|
+
` Copilot Amazon Q OpenCode Kilo Code`,
|
|
4034
4085
|
"",
|
|
4035
|
-
`${dim("
|
|
4036
|
-
`
|
|
4037
|
-
` ${cyan("•")} Strategic task count (vitality excluded)`,
|
|
4038
|
-
` ${cyan("•")} Vitality slot machine — rotates reminders every minute`,
|
|
4039
|
-
` ${cyan("•")} Next prayer time (if ${dim("show_prayer_times: true")} in settings)`,
|
|
4040
|
-
` ${cyan("•")} Time since last /log — so you never forget`,
|
|
4041
|
-
` ${cyan("•")} Rate limit bars with reset times`,
|
|
4086
|
+
`${dim("Enhanced tier")} ${dim("(rules + skills):")}`,
|
|
4087
|
+
` Codex Amp Roo Code Antigravity`,
|
|
4042
4088
|
"",
|
|
4043
|
-
|
|
4089
|
+
`${dim("Basic tier")} ${dim("(rules only):")}`,
|
|
4090
|
+
` Continue Aider`,
|
|
4091
|
+
"",
|
|
4092
|
+
"Switch editors whenever. Your Engine follows you.",
|
|
4093
|
+
`${cyan("moveros sync")} keeps them all current.`,
|
|
4044
4094
|
],
|
|
4045
4095
|
},
|
|
4046
4096
|
{
|
|
4047
|
-
title: "
|
|
4097
|
+
title: "Get Started",
|
|
4048
4098
|
body: [
|
|
4049
|
-
`${bold("
|
|
4099
|
+
`${bold("Five minutes to a system that remembers everything.")}`,
|
|
4050
4100
|
"",
|
|
4051
|
-
` ${cyan("1.")} Run ${bold("/setup")} in
|
|
4101
|
+
` ${cyan("1.")} Run ${bold("/setup")} in your AI agent — it'll interview you`,
|
|
4052
4102
|
` ${cyan("2.")} Run ${bold("/morning")} to start your first session`,
|
|
4053
4103
|
` ${cyan("3.")} Work. Build. Ship.`,
|
|
4054
|
-
` ${cyan("4.")} Run ${bold("/log")}
|
|
4104
|
+
` ${cyan("4.")} Run ${bold("/log")} when you're done — captures everything`,
|
|
4055
4105
|
` ${cyan("5.")} Run ${bold("/plan-tomorrow")} before bed`,
|
|
4056
4106
|
"",
|
|
4057
|
-
`${dim("
|
|
4058
|
-
` ${
|
|
4059
|
-
` ${
|
|
4060
|
-
|
|
4061
|
-
|
|
4107
|
+
`${dim("Two things to know:")}`,
|
|
4108
|
+
` ${bold("Single Test")} — the one thing that makes today a win`,
|
|
4109
|
+
` ${bold("Sacrifice")} — what you won't do (just as important)`,
|
|
4110
|
+
"",
|
|
4111
|
+
"The system learns from you. The more you use it, the sharper it gets.",
|
|
4062
4112
|
"",
|
|
4063
|
-
`${dim("moveros.dev")}
|
|
4113
|
+
`${dim("moveros.dev")}`,
|
|
4064
4114
|
],
|
|
4065
4115
|
},
|
|
4066
4116
|
];
|
|
4067
4117
|
|
|
4068
4118
|
// Paginated display with keyboard navigation
|
|
4069
4119
|
let page = 0;
|
|
4120
|
+
const seen = new Set();
|
|
4070
4121
|
|
|
4071
|
-
function renderPage() {
|
|
4122
|
+
async function renderPage(animate) {
|
|
4072
4123
|
const p = pages[page];
|
|
4073
|
-
// Clear screen area
|
|
4074
4124
|
w("\x1b[2J\x1b[H"); // clear screen, cursor to top
|
|
4075
4125
|
ln();
|
|
4076
4126
|
|
|
@@ -4086,9 +4136,14 @@ async function cmdHelp(opts) {
|
|
|
4086
4136
|
ln(` ${S.cyan}└${"─".repeat(56)}┘${S.reset}`);
|
|
4087
4137
|
ln();
|
|
4088
4138
|
|
|
4089
|
-
// Body
|
|
4090
|
-
|
|
4091
|
-
|
|
4139
|
+
// Body — animate on first visit, instant on revisit
|
|
4140
|
+
if (animate && !seen.has(page)) {
|
|
4141
|
+
for (const line of p.body) {
|
|
4142
|
+
await typeLine(line, 6);
|
|
4143
|
+
}
|
|
4144
|
+
seen.add(page);
|
|
4145
|
+
} else {
|
|
4146
|
+
for (const line of p.body) ln(` ${line}`);
|
|
4092
4147
|
}
|
|
4093
4148
|
ln();
|
|
4094
4149
|
ln();
|
|
@@ -4103,7 +4158,6 @@ async function cmdHelp(opts) {
|
|
|
4103
4158
|
|
|
4104
4159
|
return new Promise((resolve) => {
|
|
4105
4160
|
if (!IS_TTY) {
|
|
4106
|
-
// Non-interactive: dump all pages
|
|
4107
4161
|
for (const p of pages) {
|
|
4108
4162
|
ln(bold(`\n## ${p.title}\n`));
|
|
4109
4163
|
for (const line of p.body) ln(` ${line}`);
|
|
@@ -4118,22 +4172,32 @@ async function cmdHelp(opts) {
|
|
|
4118
4172
|
stdin.setEncoding("utf8");
|
|
4119
4173
|
w(S.hide);
|
|
4120
4174
|
|
|
4121
|
-
|
|
4175
|
+
let navigating = false;
|
|
4176
|
+
const go = async (newPage) => {
|
|
4177
|
+
if (navigating) return;
|
|
4178
|
+
navigating = true;
|
|
4179
|
+
page = newPage;
|
|
4180
|
+
await renderPage(true);
|
|
4181
|
+
navigating = false;
|
|
4182
|
+
};
|
|
4183
|
+
|
|
4184
|
+
go(0); // initial render with animation
|
|
4122
4185
|
|
|
4123
4186
|
const handler = (data) => {
|
|
4187
|
+
if (navigating) return; // ignore input during animation
|
|
4124
4188
|
if (data === "\x1b[C" || data === "l" || data === " ") {
|
|
4125
|
-
if (page < pages.length - 1)
|
|
4189
|
+
if (page < pages.length - 1) go(page + 1);
|
|
4126
4190
|
} else if (data === "\x1b[D" || data === "h") {
|
|
4127
|
-
if (page > 0)
|
|
4191
|
+
if (page > 0) go(page - 1);
|
|
4128
4192
|
} else if (data === "q" || data === "\x1b" || data === "\x03") {
|
|
4129
4193
|
stdin.removeListener("data", handler);
|
|
4130
4194
|
stdin.setRawMode(false);
|
|
4131
4195
|
stdin.pause();
|
|
4132
4196
|
w(S.show);
|
|
4133
|
-
w("\x1b[2J\x1b[H");
|
|
4197
|
+
w("\x1b[2J\x1b[H");
|
|
4134
4198
|
resolve();
|
|
4135
4199
|
} else if (data === "\r" || data === "\n") {
|
|
4136
|
-
if (page < pages.length - 1)
|
|
4200
|
+
if (page < pages.length - 1) go(page + 1);
|
|
4137
4201
|
else {
|
|
4138
4202
|
stdin.removeListener("data", handler);
|
|
4139
4203
|
stdin.setRawMode(false);
|
|
@@ -4154,27 +4218,20 @@ async function cmdTest(opts) { barLn(yellow("moveros test — not yet implemente
|
|
|
4154
4218
|
|
|
4155
4219
|
// ─── Interactive Main Menu ────────────────────────────────────────────────────
|
|
4156
4220
|
async function cmdMainMenu() {
|
|
4157
|
-
const
|
|
4158
|
-
|
|
4159
|
-
|
|
4160
|
-
|
|
4161
|
-
|
|
4162
|
-
|
|
4221
|
+
const menuOrder = [
|
|
4222
|
+
"install", "update",
|
|
4223
|
+
"pulse", "replay", "diff",
|
|
4224
|
+
"doctor", "sync", "context", "warm",
|
|
4225
|
+
"capture", "who",
|
|
4226
|
+
"settings", "prayer", "backup", "restore", "help",
|
|
4163
4227
|
];
|
|
4164
4228
|
|
|
4165
|
-
const menuItems =
|
|
4166
|
-
|
|
4167
|
-
|
|
4168
|
-
|
|
4169
|
-
|
|
4170
|
-
|
|
4171
|
-
menuItems.push({
|
|
4172
|
-
id: cmd,
|
|
4173
|
-
name: `${cmd.padEnd(12)} ${dim(meta.desc)}`,
|
|
4174
|
-
tier: `${cat.header}`,
|
|
4175
|
-
});
|
|
4176
|
-
}
|
|
4177
|
-
}
|
|
4229
|
+
const menuItems = menuOrder
|
|
4230
|
+
.filter(cmd => { const m = CLI_COMMANDS[cmd]; return m && !m.hidden; })
|
|
4231
|
+
.map(cmd => ({
|
|
4232
|
+
id: cmd,
|
|
4233
|
+
name: `${cmd.padEnd(12)} ${dim(CLI_COMMANDS[cmd].desc)}`,
|
|
4234
|
+
}));
|
|
4178
4235
|
|
|
4179
4236
|
question(`${bold("moveros")} ${dim("— choose a command")}`);
|
|
4180
4237
|
barLn();
|
|
@@ -5020,9 +5077,9 @@ async function main() {
|
|
|
5020
5077
|
} else if (method === "fetch") {
|
|
5021
5078
|
barLn();
|
|
5022
5079
|
const city = await textInput({ label: "City (e.g. London, Watford, Istanbul)", placeholder: "London" });
|
|
5023
|
-
if (city === null)
|
|
5080
|
+
if (city === null) return;
|
|
5024
5081
|
const country = await textInput({ label: "Country", placeholder: "United Kingdom" });
|
|
5025
|
-
if (country === null)
|
|
5082
|
+
if (country === null) return;
|
|
5026
5083
|
barLn();
|
|
5027
5084
|
|
|
5028
5085
|
if (city && country) {
|