@mohitkumawat/warmup-cli 1.1.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.
Files changed (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +107 -0
  3. package/dist/commands/execute.d.ts +6 -0
  4. package/dist/commands/execute.d.ts.map +1 -0
  5. package/dist/commands/execute.js +52 -0
  6. package/dist/commands/execute.js.map +1 -0
  7. package/dist/commands/pause.d.ts +2 -0
  8. package/dist/commands/pause.d.ts.map +1 -0
  9. package/dist/commands/pause.js +18 -0
  10. package/dist/commands/pause.js.map +1 -0
  11. package/dist/commands/resume.d.ts +2 -0
  12. package/dist/commands/resume.d.ts.map +1 -0
  13. package/dist/commands/resume.js +18 -0
  14. package/dist/commands/resume.js.map +1 -0
  15. package/dist/commands/setup.d.ts +2 -0
  16. package/dist/commands/setup.d.ts.map +1 -0
  17. package/dist/commands/setup.js +173 -0
  18. package/dist/commands/setup.js.map +1 -0
  19. package/dist/commands/status.d.ts +2 -0
  20. package/dist/commands/status.d.ts.map +1 -0
  21. package/dist/commands/status.js +14 -0
  22. package/dist/commands/status.js.map +1 -0
  23. package/dist/commands/test.d.ts +2 -0
  24. package/dist/commands/test.d.ts.map +1 -0
  25. package/dist/commands/test.js +27 -0
  26. package/dist/commands/test.js.map +1 -0
  27. package/dist/commands/uninstall.d.ts +2 -0
  28. package/dist/commands/uninstall.d.ts.map +1 -0
  29. package/dist/commands/uninstall.js +38 -0
  30. package/dist/commands/uninstall.js.map +1 -0
  31. package/dist/commands/update.d.ts +2 -0
  32. package/dist/commands/update.d.ts.map +1 -0
  33. package/dist/commands/update.js +112 -0
  34. package/dist/commands/update.js.map +1 -0
  35. package/dist/config.d.ts +51 -0
  36. package/dist/config.d.ts.map +1 -0
  37. package/dist/config.js +320 -0
  38. package/dist/config.js.map +1 -0
  39. package/dist/index.d.ts +3 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +113 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/runtime.d.ts +9 -0
  44. package/dist/runtime.d.ts.map +1 -0
  45. package/dist/runtime.js +91 -0
  46. package/dist/runtime.js.map +1 -0
  47. package/dist/scheduler/index.d.ts +15 -0
  48. package/dist/scheduler/index.d.ts.map +1 -0
  49. package/dist/scheduler/index.js +103 -0
  50. package/dist/scheduler/index.js.map +1 -0
  51. package/dist/scheduler/linux.d.ts +12 -0
  52. package/dist/scheduler/linux.d.ts.map +1 -0
  53. package/dist/scheduler/linux.js +301 -0
  54. package/dist/scheduler/linux.js.map +1 -0
  55. package/dist/scheduler/macos.d.ts +16 -0
  56. package/dist/scheduler/macos.d.ts.map +1 -0
  57. package/dist/scheduler/macos.js +170 -0
  58. package/dist/scheduler/macos.js.map +1 -0
  59. package/dist/scheduler/windows.d.ts +14 -0
  60. package/dist/scheduler/windows.d.ts.map +1 -0
  61. package/dist/scheduler/windows.js +139 -0
  62. package/dist/scheduler/windows.js.map +1 -0
  63. package/dist/ui.d.ts +19 -0
  64. package/dist/ui.d.ts.map +1 -0
  65. package/dist/ui.js +329 -0
  66. package/dist/ui.js.map +1 -0
  67. package/dist/warmup.d.ts +32 -0
  68. package/dist/warmup.d.ts.map +1 -0
  69. package/dist/warmup.js +154 -0
  70. package/dist/warmup.js.map +1 -0
  71. package/package.json +60 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Mohit
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,107 @@
1
+ # ☕ warmup
2
+
3
+ [![npm version](https://badge.fury.io/js/warmup-cli.svg)](https://badge.fury.io/js/warmup-cli)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
+
6
+ **Pre-warm your Claude rate limits while you sleep.**
7
+
8
+ One command. Zero daily effort. Full Claude capacity when you need it.
9
+
10
+ ---
11
+
12
+ ## 🛑 The Problem
13
+
14
+ Claude Pro and Max subscribers share a **5-hour rolling rate limit window** across Claude Code, Cowork, and claude.ai. When you start an intensive coding session, you burn through your allocation quickly and are forced to wait 2-3 hours for the window to reset.
15
+
16
+ ## 🟢 The Solution
17
+
18
+ **warmup** starts your rate limit window _before_ you wake up by sending a tiny invisible message (~10 tokens) through Claude Code at a scheduled time.
19
+
20
+ By the time you sit down to work, the window is perfectly timed to expire exactly when you need it, granting you a **100% fresh allocation** right in the middle of your workday.
21
+
22
+ ```
23
+ ✖ Without warmup:
24
+ 10:00 AM → You start working, window starts
25
+ 12:00 PM → Rate limited! Must wait until 3:00 PM
26
+
27
+ ✔ With Smart warmup (2-hour exhaustion):
28
+ 5:00 AM → warmup sends invisible "ping"
29
+ 10:00 AM → You start working.
30
+ 12:00 PM → You exhaust your limits. BUT the 5:00 AM window ends right now!
31
+ 12:00 PM → Window resets instantly! Full capacity continues.
32
+ ```
33
+ *You just saved 3 hours of waiting.*
34
+
35
+ ---
36
+
37
+ ## ⚡ Install
38
+
39
+ ```bash
40
+ npm install -g warmup-cli
41
+ ```
42
+
43
+ **Prerequisites:** [Claude Code](https://code.claude.com) must be installed and authenticated.
44
+
45
+ ## 🧠 Smart Setup
46
+
47
+ We don't ask you to do modulo-math to figure out your 5-hour window. `warmup` uses a **Smart Scheduler**.
48
+
49
+ ```bash
50
+ warmup setup
51
+ ```
52
+
53
+ Just tell it:
54
+ 1. **When you start working** (e.g., 9:00 AM)
55
+ 2. **How quickly you exhaust your limits** (e.g., 1-2 hours)
56
+
57
+ `warmup` automatically calculates the **exact optimal pre-warm time** to ensure your rate limit resets exactly the minute you run out of messages.
58
+
59
+ That's it. The OS scheduler installs it in the background. You'll never touch it again.
60
+
61
+ ## 🛡️ Bulletproof Boot-Recovery
62
+
63
+ **What if my computer is off or asleep at the scheduled pre-warm time?**
64
+
65
+ `warmup` handles this automatically using native OS features. If your laptop was closed at your 5:00 AM pre-warm time, the pre-warm fires **immediately upon waking your machine** (e.g., at 8:00 AM).
66
+
67
+ It has built-in deduplication guards, so it will *never* double-fire or accidentally consume a second rate-limit window, even if you restart your computer 10 times a day.
68
+
69
+ Supported universally:
70
+ - **macOS:** `launchd` with `RunAtLoad`
71
+ - **Linux:** `systemd` user timers with `Persistent=true`
72
+ - **Windows:** Task Scheduler with `StartWhenAvailable`
73
+
74
+ ## 🛠️ Commands
75
+
76
+ | Command | Description |
77
+ |---------|-------------|
78
+ | `warmup setup` | Smart interactive setup wizard |
79
+ | `warmup status` | Show schedule and live window progress bar |
80
+ | `warmup test` | Fire a pre-warm right now |
81
+ | `warmup update` | Change your schedule / re-run the smart wizard |
82
+ | `warmup pause` | Pause the daily schedule |
83
+ | `warmup resume` | Resume the daily schedule |
84
+ | `warmup uninstall` | Remove the background task |
85
+
86
+
87
+ ## ❓ FAQ
88
+
89
+ **Is this ToS-compliant?**
90
+ Yes. The request goes strictly through the official Claude Code CLI using your local authenticated session. We never extract, store, or proxy your OAuth token. This is functionally identical to you typing a message into the CLI.
91
+
92
+ **Does this work for claude.ai web chat?**
93
+ Yes! The subscription rate limit pool is shared across claude.ai, Claude Code, and Cowork. Pre-warming through the CLI grants you limits on the web interface too.
94
+
95
+ **What if I travel to a different timezone?**
96
+ Run `warmup update`. Your new timezone is auto-detected.
97
+
98
+ ## 🗑️ Uninstall
99
+
100
+ ```bash
101
+ warmup uninstall # removes the OS background task
102
+ npm uninstall -g warmup-cli # removes the package
103
+ ```
104
+
105
+ ---
106
+ **License:** MIT
107
+ **Author:** Mohit
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Internal command called by the OS scheduler (launchd/systemd/schtasks).
3
+ * Not user-facing. Determines whether this is a normal run or boot-recovery.
4
+ */
5
+ export declare function executeCommand(): Promise<void>;
6
+ //# sourceMappingURL=execute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/commands/execute.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CA4CpD"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.executeCommand = executeCommand;
4
+ const config_1 = require("../config");
5
+ const warmup_1 = require("../warmup");
6
+ const ui_1 = require("../ui");
7
+ /**
8
+ * Internal command called by the OS scheduler (launchd/systemd/schtasks).
9
+ * Not user-facing. Determines whether this is a normal run or boot-recovery.
10
+ */
11
+ async function executeCommand() {
12
+ const config = (0, config_1.readConfig)();
13
+ if (!config || !config.schedule.enabled) {
14
+ process.exit(0);
15
+ return;
16
+ }
17
+ const isBootRecovery = (0, warmup_1.shouldBootRecover)(config);
18
+ if (isBootRecovery) {
19
+ const [h, m] = config.schedule.time.split(':').map(Number);
20
+ const scheduledTime = (0, config_1.formatHour)(h, m);
21
+ const now = new Date();
22
+ const actualTime = now.toLocaleTimeString('en-US', {
23
+ timeZone: config.schedule.timezone,
24
+ hour: 'numeric',
25
+ minute: '2-digit',
26
+ hour12: true,
27
+ });
28
+ // These animations only show if running in an interactive terminal
29
+ if (process.stdout.isTTY) {
30
+ await (0, ui_1.animateBootRecovery)(scheduledTime, actualTime);
31
+ }
32
+ const result = (0, warmup_1.executeWarmup)(true);
33
+ if (result.success && process.stdout.isTTY) {
34
+ // Boot-recovery reset = NOW + 5 hours, not scheduled time + 5
35
+ const resetTime = new Date(now.getTime() + 5 * 60 * 60 * 1000)
36
+ .toLocaleTimeString('en-US', {
37
+ timeZone: config.schedule.timezone,
38
+ hour: 'numeric',
39
+ minute: '2-digit',
40
+ hour12: true,
41
+ });
42
+ await (0, ui_1.animateBootRecoverySuccess)(resetTime);
43
+ }
44
+ }
45
+ else if ((0, config_1.isNearScheduledTime)(config.schedule.time, config.schedule.timezone)) {
46
+ // Normal scheduled execution — only fire if we're near the scheduled time
47
+ (0, warmup_1.executeWarmup)(false);
48
+ }
49
+ // If neither boot-recovery nor near scheduled time, do nothing.
50
+ // This prevents RunAtLoad / reboot from firing pointless pre-warms.
51
+ }
52
+ //# sourceMappingURL=execute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.js","sourceRoot":"","sources":["../../src/commands/execute.ts"],"names":[],"mappings":";;AAWA,wCA4CC;AAvDD,sCAAwE;AACxE,sCAA6D;AAC7D,8BAGe;AAEf;;;GAGG;AACI,KAAK,UAAU,cAAc;IAClC,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,MAAM,cAAc,GAAG,IAAA,0BAAiB,EAAC,MAAM,CAAC,CAAC;IAEjD,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC3D,MAAM,aAAa,GAAG,IAAA,mBAAU,EAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,GAAG,CAAC,kBAAkB,CAAC,OAAO,EAAE;YACjD,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ;YAClC,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,IAAI;SACb,CAAC,CAAC;QAEH,mEAAmE;QACnE,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACzB,MAAM,IAAA,wBAAmB,EAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,MAAM,GAAG,IAAA,sBAAa,EAAC,IAAI,CAAC,CAAC;QAEnC,IAAI,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAC3C,8DAA8D;YAC9D,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;iBAC3D,kBAAkB,CAAC,OAAO,EAAE;gBAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ;gBAClC,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,IAAI;aACb,CAAC,CAAC;YACL,MAAM,IAAA,+BAA0B,EAAC,SAAS,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;SAAM,IAAI,IAAA,4BAAmB,EAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/E,0EAA0E;QAC1E,IAAA,sBAAa,EAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,gEAAgE;IAChE,oEAAoE;AACtE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function pauseCommand(): Promise<void>;
2
+ //# sourceMappingURL=pause.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pause.d.ts","sourceRoot":"","sources":["../../src/commands/pause.ts"],"names":[],"mappings":"AAIA,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAWlD"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pauseCommand = pauseCommand;
4
+ const config_1 = require("../config");
5
+ const scheduler_1 = require("../scheduler");
6
+ const ui_1 = require("../ui");
7
+ async function pauseCommand() {
8
+ const config = (0, config_1.readConfig)();
9
+ if (!config) {
10
+ (0, ui_1.printNotSetup)();
11
+ return;
12
+ }
13
+ config.schedule.enabled = false;
14
+ (0, config_1.writeConfig)(config);
15
+ (0, scheduler_1.pauseSchedule)();
16
+ (0, ui_1.printPaused)();
17
+ }
18
+ //# sourceMappingURL=pause.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pause.js","sourceRoot":"","sources":["../../src/commands/pause.ts"],"names":[],"mappings":";;AAIA,oCAWC;AAfD,sCAAoD;AACpD,4CAA6C;AAC7C,8BAAmD;AAE5C,KAAK,UAAU,YAAY;IAChC,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAA,kBAAa,GAAE,CAAC;QAChB,OAAO;IACT,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;IAChC,IAAA,oBAAW,EAAC,MAAM,CAAC,CAAC;IACpB,IAAA,yBAAa,GAAE,CAAC;IAChB,IAAA,gBAAW,GAAE,CAAC;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function resumeCommand(): Promise<void>;
2
+ //# sourceMappingURL=resume.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume.d.ts","sourceRoot":"","sources":["../../src/commands/resume.ts"],"names":[],"mappings":"AAIA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAWnD"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resumeCommand = resumeCommand;
4
+ const config_1 = require("../config");
5
+ const scheduler_1 = require("../scheduler");
6
+ const ui_1 = require("../ui");
7
+ async function resumeCommand() {
8
+ const config = (0, config_1.readConfig)();
9
+ if (!config) {
10
+ (0, ui_1.printNotSetup)();
11
+ return;
12
+ }
13
+ config.schedule.enabled = true;
14
+ (0, config_1.writeConfig)(config);
15
+ (0, scheduler_1.resumeSchedule)();
16
+ (0, ui_1.printResumed)(config);
17
+ }
18
+ //# sourceMappingURL=resume.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume.js","sourceRoot":"","sources":["../../src/commands/resume.ts"],"names":[],"mappings":";;AAIA,sCAWC;AAfD,sCAAoD;AACpD,4CAA8C;AAC9C,8BAAoD;AAE7C,KAAK,UAAU,aAAa;IACjC,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAA,kBAAa,GAAE,CAAC;QAChB,OAAO;IACT,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;IAC/B,IAAA,oBAAW,EAAC,MAAM,CAAC,CAAC;IACpB,IAAA,0BAAc,GAAE,CAAC;IACjB,IAAA,iBAAY,EAAC,MAAM,CAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function setupCommand(): Promise<void>;
2
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AA6EA,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CA0HlD"}
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.setupCommand = setupCommand;
7
+ const inquirer_1 = __importDefault(require("inquirer"));
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const ora_1 = __importDefault(require("ora"));
10
+ const config_1 = require("../config");
11
+ const warmup_1 = require("../warmup");
12
+ const scheduler_1 = require("../scheduler");
13
+ const ui_1 = require("../ui");
14
+ const runtime_1 = require("../runtime");
15
+ const ACCENT = chalk_1.default.hex('#6C5CE7');
16
+ const DIM = chalk_1.default.gray;
17
+ /** Generate choices for work start time (30 min increments) */
18
+ function generateStartTimeChoices() {
19
+ const choices = [];
20
+ for (let h = 0; h < 24; h++) {
21
+ for (const m of [0, 30]) {
22
+ const period = h >= 12 ? 'PM' : 'AM';
23
+ const h12 = h > 12 ? h - 12 : h === 0 ? 12 : h;
24
+ const mStr = m.toString().padStart(2, '0');
25
+ const label = `${h12}:${mStr} ${period}`;
26
+ const minutesSinceMidnight = h * 60 + m;
27
+ let suffix = '';
28
+ // typical work start times
29
+ if (h === 9 && m === 0)
30
+ suffix = ' ← standard';
31
+ if (h === 10 && m === 0)
32
+ suffix = ' ← common';
33
+ choices.push({
34
+ name: `${label}${suffix}`,
35
+ value: minutesSinceMidnight,
36
+ });
37
+ }
38
+ }
39
+ return choices;
40
+ }
41
+ /** Calculate the optimal pre-warm time based on user feedback */
42
+ function calculateOptimalPrewarm(startMins, exhaustMins) {
43
+ // We want the 5-hour window to end EXACTLY when they exhaust their limits.
44
+ // Window End = Start Time + Exhaustion Time
45
+ // Pre-warm Time = Window End - 5 hours
46
+ let prewarmMins = startMins + exhaustMins - (5 * 60);
47
+ // If exhaust time > 5 hours, pre-warm time would be *after* start time, which defeats the purpose.
48
+ // Cap it so pre-warm is at absolute maximum their start time.
49
+ if (prewarmMins > startMins) {
50
+ prewarmMins = startMins;
51
+ }
52
+ // Handle midnight wraparound
53
+ if (prewarmMins < 0) {
54
+ prewarmMins += 24 * 60;
55
+ }
56
+ const h = Math.floor(prewarmMins / 60) % 24;
57
+ const m = prewarmMins % 60;
58
+ const timeStr = `${h.toString().padStart(2, '0')}:${m.toString().padStart(2, '0')}`;
59
+ const resetMins = (prewarmMins + 5 * 60) % (24 * 60);
60
+ const resetH = Math.floor(resetMins / 60);
61
+ const resetM = resetMins % 60;
62
+ const resetStr = (0, config_1.formatHour)(resetH, resetM);
63
+ const explanation = `To ensure your rate limit window resets completely at ${resetStr} exactly when you run out, we'll run the pre-warm at ${(0, config_1.formatHour)(h, m)}.`;
64
+ return { time: timeStr, h, m, explanation };
65
+ }
66
+ async function setupCommand() {
67
+ (0, ui_1.printLogo)();
68
+ // Check if already set up
69
+ const existing = (0, config_1.readConfig)();
70
+ if (existing) {
71
+ (0, ui_1.printAlreadySetup)(existing);
72
+ const { overwrite } = await inquirer_1.default.prompt([{
73
+ type: 'confirm',
74
+ name: 'overwrite',
75
+ message: 'Do you want to reconfigure?',
76
+ default: false,
77
+ }]);
78
+ if (!overwrite)
79
+ return;
80
+ }
81
+ // Check Claude Code
82
+ const spinner = (0, ora_1.default)({
83
+ text: 'Checking for Claude Code...',
84
+ color: 'magenta',
85
+ }).start();
86
+ if (!(0, warmup_1.isClaudeInstalled)()) {
87
+ spinner.fail('Claude Code not found');
88
+ (0, ui_1.printNoClaudeCode)();
89
+ return;
90
+ }
91
+ spinner.succeed('Claude Code detected');
92
+ // Check authentication
93
+ const authSpinner = (0, ora_1.default)({
94
+ text: 'Checking Claude Code authentication...',
95
+ color: 'magenta',
96
+ }).start();
97
+ if (!(0, warmup_1.isClaudeAuthenticated)()) {
98
+ authSpinner.fail('Claude Code is not authenticated');
99
+ console.log(` ${DIM('Run')} ${ACCENT('claude')} ${DIM('first and complete authentication.')}`);
100
+ console.log('');
101
+ return;
102
+ }
103
+ authSpinner.succeed('Claude Code authenticated');
104
+ // Detect timezone
105
+ const timezone = (0, config_1.detectTimezone)();
106
+ console.log(` ${DIM('Timezone:')} ${ACCENT(timezone)} ${DIM('(auto-detected)')}`);
107
+ console.log('');
108
+ // Smart Scheduler Questionnaire
109
+ console.log(chalk_1.default.cyan(' Let\'s optimize your schedule based on your typical usage.'));
110
+ console.log('');
111
+ const { startMins } = await inquirer_1.default.prompt([{
112
+ type: 'list',
113
+ name: 'startMins',
114
+ message: 'When do you usually start your heavy Claude usage each day?',
115
+ choices: generateStartTimeChoices(),
116
+ default: 9 * 60, // 9:00 AM
117
+ pageSize: 12,
118
+ }]);
119
+ const { exhaustMins } = await inquirer_1.default.prompt([{
120
+ type: 'list',
121
+ name: 'exhaustMins',
122
+ message: 'How quickly do you usually hit your Pro/Max rate limit after starting?',
123
+ choices: [
124
+ { name: '< 1 hour', value: 60 },
125
+ { name: '1-2 hours', value: 120 },
126
+ { name: '2-3 hours', value: 180 },
127
+ { name: '3-4 hours', value: 240 },
128
+ { name: 'I rarely hit the limit / 5+ hours', value: 300 }
129
+ ],
130
+ default: 120, // 2 hours
131
+ }]);
132
+ // Calculate
133
+ const { time, h, m, explanation } = calculateOptimalPrewarm(startMins, exhaustMins);
134
+ const resetH = (h + 5) % 24;
135
+ console.log('');
136
+ console.log(` ${chalk_1.default.bgCyan.black(' OPTIMAL SCHEDULE ')}`);
137
+ console.log(` ${chalk_1.default.cyan('💡')} ${DIM(explanation)}`);
138
+ console.log('');
139
+ console.log(` ${DIM('Pre-warm at:')} ${ACCENT((0, config_1.formatHour)(h, m))}`);
140
+ console.log(` ${DIM('Window resets:')} ${ACCENT(`~${(0, config_1.formatHour)(resetH, m)}`)}`);
141
+ console.log(` ${DIM('Platform:')} ${ACCENT((0, scheduler_1.getPlatformName)())}`);
142
+ console.log(` ${DIM('Boot-recovery:')} ${ACCENT('enabled')}`);
143
+ console.log('');
144
+ const { confirm } = await inquirer_1.default.prompt([{
145
+ type: 'confirm',
146
+ name: 'confirm',
147
+ message: 'Set up this schedule?',
148
+ default: true,
149
+ }]);
150
+ if (!confirm) {
151
+ console.log(DIM('\n Setup cancelled.\n'));
152
+ return;
153
+ }
154
+ // Install
155
+ const installSpinner = (0, ora_1.default)({
156
+ text: `Installing schedule (${(0, scheduler_1.getPlatformName)()})...`,
157
+ color: 'magenta',
158
+ }).start();
159
+ try {
160
+ (0, config_1.ensureConfigDir)();
161
+ const runtime = (0, runtime_1.resolveRuntimePaths)();
162
+ (0, scheduler_1.installSchedule)({ hour: h, minute: m, runtime });
163
+ const config = (0, config_1.createDefaultConfig)(time, timezone, runtime);
164
+ (0, config_1.writeConfig)(config);
165
+ installSpinner.succeed('Schedule installed with boot-recovery');
166
+ // Animate the setup complete visualization
167
+ await (0, ui_1.animateSetupComplete)(config);
168
+ }
169
+ catch (err) {
170
+ installSpinner.fail(`Installation failed: ${err.message}`);
171
+ }
172
+ }
173
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function statusCommand(): Promise<void>;
2
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAGA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAQnD"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.statusCommand = statusCommand;
4
+ const config_1 = require("../config");
5
+ const ui_1 = require("../ui");
6
+ async function statusCommand() {
7
+ const config = (0, config_1.readConfig)();
8
+ if (!config) {
9
+ (0, ui_1.printNotSetup)();
10
+ return;
11
+ }
12
+ await (0, ui_1.displayStatus)(config, { needsRuntimeRefresh: !config.runtime });
13
+ }
14
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":";;AAGA,sCAQC;AAXD,sCAAuC;AACvC,8BAAqD;AAE9C,KAAK,UAAU,aAAa;IACjC,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAA,kBAAa,GAAE,CAAC;QAChB,OAAO;IACT,CAAC;IAED,MAAM,IAAA,kBAAa,EAAC,MAAM,EAAE,EAAE,mBAAmB,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;AACxE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function testCommand(): Promise<void>;
2
+ //# sourceMappingURL=test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"AAWA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAuBjD"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.testCommand = testCommand;
4
+ const config_1 = require("../config");
5
+ const warmup_1 = require("../warmup");
6
+ const ui_1 = require("../ui");
7
+ async function testCommand() {
8
+ (0, ui_1.printMiniLogo)();
9
+ const config = (0, config_1.readConfig)();
10
+ if (!config) {
11
+ (0, ui_1.printNotSetup)();
12
+ return;
13
+ }
14
+ if (!(0, warmup_1.isClaudeInstalled)()) {
15
+ (0, ui_1.printNoClaudeCode)();
16
+ return;
17
+ }
18
+ await (0, ui_1.animateTestWarmup)();
19
+ const result = (0, warmup_1.executeWarmup)(false);
20
+ if (result.success) {
21
+ await (0, ui_1.animateTestSuccess)(result.duration);
22
+ }
23
+ else {
24
+ await (0, ui_1.animateTestFailure)(result.message);
25
+ }
26
+ }
27
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":";;AAWA,kCAuBC;AAlCD,sCAAuC;AACvC,sCAA6D;AAC7D,8BAOe;AAER,KAAK,UAAU,WAAW;IAC/B,IAAA,kBAAa,GAAE,CAAC;IAEhB,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAA,kBAAa,GAAE,CAAC;QAChB,OAAO;IACT,CAAC;IAED,IAAI,CAAC,IAAA,0BAAiB,GAAE,EAAE,CAAC;QACzB,IAAA,sBAAiB,GAAE,CAAC;QACpB,OAAO;IACT,CAAC;IAED,MAAM,IAAA,sBAAiB,GAAE,CAAC;IAE1B,MAAM,MAAM,GAAG,IAAA,sBAAa,EAAC,KAAK,CAAC,CAAC;IAEpC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,IAAA,uBAAkB,EAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;SAAM,CAAC;QACN,MAAM,IAAA,uBAAkB,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function uninstallCommand(): Promise<void>;
2
+ //# sourceMappingURL=uninstall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AAQA,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CA2BtD"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.uninstallCommand = uninstallCommand;
7
+ const inquirer_1 = __importDefault(require("inquirer"));
8
+ const config_1 = require("../config");
9
+ const scheduler_1 = require("../scheduler");
10
+ const ui_1 = require("../ui");
11
+ const chalk_1 = __importDefault(require("chalk"));
12
+ const DIM = chalk_1.default.gray;
13
+ async function uninstallCommand() {
14
+ (0, ui_1.printMiniLogo)();
15
+ const config = (0, config_1.readConfig)();
16
+ if (!config) {
17
+ (0, ui_1.printNotSetup)();
18
+ return;
19
+ }
20
+ const { confirm } = await inquirer_1.default.prompt([{
21
+ type: 'confirm',
22
+ name: 'confirm',
23
+ message: 'Remove warmup scheduled task?',
24
+ default: false,
25
+ }]);
26
+ if (!confirm) {
27
+ console.log(DIM('\n Cancelled.\n'));
28
+ return;
29
+ }
30
+ try {
31
+ (0, scheduler_1.uninstallSchedule)();
32
+ (0, ui_1.printUninstalled)();
33
+ }
34
+ catch (err) {
35
+ console.log(`\n ${chalk_1.default.red('Error:')} ${err.message}\n`);
36
+ }
37
+ }
38
+ //# sourceMappingURL=uninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":";;;;;AAQA,4CA2BC;AAnCD,wDAAgC;AAChC,sCAAuC;AACvC,4CAAiD;AACjD,8BAAuE;AACvE,kDAA0B;AAE1B,MAAM,GAAG,GAAG,eAAK,CAAC,IAAI,CAAC;AAEhB,KAAK,UAAU,gBAAgB;IACpC,IAAA,kBAAa,GAAE,CAAC;IAEhB,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAA,kBAAa,GAAE,CAAC;QAChB,OAAO;IACT,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC,CAAC;YACzC,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,+BAA+B;YACxC,OAAO,EAAE,KAAK;SACf,CAAC,CAAC,CAAC;IAEJ,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACrC,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,IAAA,6BAAiB,GAAE,CAAC;QACpB,IAAA,qBAAgB,GAAE,CAAC;IACrB,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,OAAO,eAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function updateCommand(): Promise<void>;
2
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AA8DA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CA+DnD"}