@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.
- package/LICENSE +21 -0
- package/README.md +107 -0
- package/dist/commands/execute.d.ts +6 -0
- package/dist/commands/execute.d.ts.map +1 -0
- package/dist/commands/execute.js +52 -0
- package/dist/commands/execute.js.map +1 -0
- package/dist/commands/pause.d.ts +2 -0
- package/dist/commands/pause.d.ts.map +1 -0
- package/dist/commands/pause.js +18 -0
- package/dist/commands/pause.js.map +1 -0
- package/dist/commands/resume.d.ts +2 -0
- package/dist/commands/resume.d.ts.map +1 -0
- package/dist/commands/resume.js +18 -0
- package/dist/commands/resume.js.map +1 -0
- package/dist/commands/setup.d.ts +2 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +173 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +14 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/test.d.ts +2 -0
- package/dist/commands/test.d.ts.map +1 -0
- package/dist/commands/test.js +27 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/commands/uninstall.d.ts +2 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +38 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts +2 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +112 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/config.d.ts +51 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +320 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +113 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime.d.ts +9 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +91 -0
- package/dist/runtime.js.map +1 -0
- package/dist/scheduler/index.d.ts +15 -0
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +103 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/scheduler/linux.d.ts +12 -0
- package/dist/scheduler/linux.d.ts.map +1 -0
- package/dist/scheduler/linux.js +301 -0
- package/dist/scheduler/linux.js.map +1 -0
- package/dist/scheduler/macos.d.ts +16 -0
- package/dist/scheduler/macos.d.ts.map +1 -0
- package/dist/scheduler/macos.js +170 -0
- package/dist/scheduler/macos.js.map +1 -0
- package/dist/scheduler/windows.d.ts +14 -0
- package/dist/scheduler/windows.d.ts.map +1 -0
- package/dist/scheduler/windows.js +139 -0
- package/dist/scheduler/windows.js.map +1 -0
- package/dist/ui.d.ts +19 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +329 -0
- package/dist/ui.js.map +1 -0
- package/dist/warmup.d.ts +32 -0
- package/dist/warmup.d.ts.map +1 -0
- package/dist/warmup.js +154 -0
- package/dist/warmup.js.map +1 -0
- 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
|
+
[](https://badge.fury.io/js/warmup-cli)
|
|
4
|
+
[](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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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":";;;;;AA6EA,oCA0HC;AAvMD,wDAAgC;AAChC,kDAA0B;AAC1B,8CAAsB;AACtB,sCAOmB;AACnB,sCAAqE;AACrE,4CAAgE;AAChE,8BAA8F;AAC9F,wCAAiD;AAEjD,MAAM,MAAM,GAAG,eAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACpC,MAAM,GAAG,GAAG,eAAK,CAAC,IAAI,CAAC;AAEvB,+DAA+D;AAC/D,SAAS,wBAAwB;IAC/B,MAAM,OAAO,GAAG,EAAE,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YACrC,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/C,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAC3C,MAAM,KAAK,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC;YACzC,MAAM,oBAAoB,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAExC,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,2BAA2B;YAC3B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;gBAAE,MAAM,GAAG,aAAa,CAAC;YAC/C,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC;gBAAE,MAAM,GAAG,WAAW,CAAC;YAE9C,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,GAAG,KAAK,GAAG,MAAM,EAAE;gBACzB,KAAK,EAAE,oBAAoB;aAC5B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,iEAAiE;AACjE,SAAS,uBAAuB,CAAC,SAAiB,EAAE,WAAmB;IACrE,2EAA2E;IAC3E,4CAA4C;IAC5C,uCAAuC;IACvC,IAAI,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAErD,mGAAmG;IACnG,8DAA8D;IAC9D,IAAI,WAAW,GAAG,SAAS,EAAE,CAAC;QAC5B,WAAW,GAAG,SAAS,CAAC;IAC1B,CAAC;IAED,6BAA6B;IAC7B,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACpB,WAAW,IAAI,EAAE,GAAG,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;IAC5C,MAAM,CAAC,GAAG,WAAW,GAAG,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IAEpF,MAAM,SAAS,GAAG,CAAC,WAAW,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,SAAS,GAAG,EAAE,CAAC;IAE9B,MAAM,QAAQ,GAAG,IAAA,mBAAU,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE5C,MAAM,WAAW,GAAG,yDAAyD,QAAQ,wDAAwD,IAAA,mBAAU,EAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC;IAEjK,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC;AAC9C,CAAC;AAEM,KAAK,UAAU,YAAY;IAChC,IAAA,cAAS,GAAE,CAAC;IAEZ,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,IAAA,mBAAU,GAAE,CAAC;IAC9B,IAAI,QAAQ,EAAE,CAAC;QACb,IAAA,sBAAiB,EAAC,QAAQ,CAAC,CAAC;QAC5B,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC,CAAC;gBAC3C,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,6BAA6B;gBACtC,OAAO,EAAE,KAAK;aACf,CAAC,CAAC,CAAC;QACJ,IAAI,CAAC,SAAS;YAAE,OAAO;IACzB,CAAC;IAED,oBAAoB;IACpB,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC;QAClB,IAAI,EAAE,6BAA6B;QACnC,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC,KAAK,EAAE,CAAC;IAEX,IAAI,CAAC,IAAA,0BAAiB,GAAE,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACtC,IAAA,sBAAiB,GAAE,CAAC;QACpB,OAAO;IACT,CAAC;IACD,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAExC,uBAAuB;IACvB,MAAM,WAAW,GAAG,IAAA,aAAG,EAAC;QACtB,IAAI,EAAE,wCAAwC;QAC9C,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC,KAAK,EAAE,CAAC;IAEX,IAAI,CAAC,IAAA,8BAAqB,GAAE,EAAE,CAAC;QAC7B,WAAW,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,oCAAoC,CAAC,EAAE,CAAC,CAAC;QAChG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IACD,WAAW,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAEjD,kBAAkB;IAClB,MAAM,QAAQ,GAAG,IAAA,uBAAc,GAAE,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACnF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,gCAAgC;IAChC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC,CAAC;IACxF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC,CAAC;YAC3C,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,6DAA6D;YACtE,OAAO,EAAE,wBAAwB,EAAE;YACnC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,UAAU;YAC3B,QAAQ,EAAE,EAAE;SACb,CAAC,CAAC,CAAC;IAEJ,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC,CAAC;YAC7C,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,wEAAwE;YACjF,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE;gBAC/B,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE;gBACjC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE;gBACjC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE;gBACjC,EAAE,IAAI,EAAE,mCAAmC,EAAE,KAAK,EAAE,GAAG,EAAE;aAC1D;YACD,OAAO,EAAE,GAAG,EAAE,UAAU;SACzB,CAAC,CAAC,CAAC;IAEJ,YAAY;IACZ,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,uBAAuB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACpF,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IAE5B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,cAAc,CAAC,IAAI,MAAM,CAAC,IAAA,mBAAU,EAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,gBAAgB,CAAC,IAAI,MAAM,CAAC,IAAI,IAAA,mBAAU,EAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACjF,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC,IAAA,2BAAe,GAAE,CAAC,EAAE,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,gBAAgB,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC,CAAC;YACzC,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,uBAAuB;YAChC,OAAO,EAAE,IAAI;SACd,CAAC,CAAC,CAAC;IAEJ,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;QAC3C,OAAO;IACT,CAAC;IAED,UAAU;IACV,MAAM,cAAc,GAAG,IAAA,aAAG,EAAC;QACzB,IAAI,EAAE,wBAAwB,IAAA,2BAAe,GAAE,MAAM;QACrD,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC,KAAK,EAAE,CAAC;IAEX,IAAI,CAAC;QACH,IAAA,wBAAe,GAAE,CAAC;QAClB,MAAM,OAAO,GAAG,IAAA,6BAAmB,GAAE,CAAC;QACtC,IAAA,2BAAe,EAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAEjD,MAAM,MAAM,GAAG,IAAA,4BAAmB,EAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5D,IAAA,oBAAW,EAAC,MAAM,CAAC,CAAC;QAEpB,cAAc,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC;QAEhE,2CAA2C;QAC3C,MAAM,IAAA,yBAAoB,EAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,cAAc,CAAC,IAAI,CAAC,wBAAwB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|