@mohitkumawat/warmup-cli 1.1.2 → 1.2.0
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/README.md +32 -6
- package/dist/commands/default.d.ts +19 -0
- package/dist/commands/default.d.ts.map +1 -0
- package/dist/commands/default.js +49 -0
- package/dist/commands/default.js.map +1 -0
- package/dist/commands/setup.d.ts +47 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +75 -57
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +47 -66
- package/dist/commands/update.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +4 -0
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +68 -99
- package/dist/index.js.map +1 -1
- package/dist/scheduler/index.d.ts +1 -0
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +17 -0
- package/dist/scheduler/index.js.map +1 -1
- package/dist/scheduler/linux.d.ts +3 -2
- package/dist/scheduler/linux.d.ts.map +1 -1
- package/dist/scheduler/linux.js +12 -1
- package/dist/scheduler/linux.js.map +1 -1
- package/dist/ui.d.ts +38 -0
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +322 -123
- package/dist/ui.js.map +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@ Claude Pro and Max subscribers share a **5-hour rolling rate limit window** acro
|
|
|
15
15
|
|
|
16
16
|
## 🟢 The Solution
|
|
17
17
|
|
|
18
|
-
**warmup** starts your rate limit window _before_ you wake up by
|
|
18
|
+
**warmup** starts your rate limit window _before_ you wake up by scheduling one tiny Claude Code ping (~10 tokens) at the right time.
|
|
19
19
|
|
|
20
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
21
|
|
|
@@ -25,9 +25,9 @@ By the time you sit down to work, the window is perfectly timed to expire exactl
|
|
|
25
25
|
12:00 PM → Rate limited! Must wait until 3:00 PM
|
|
26
26
|
|
|
27
27
|
✔ With Smart warmup (2-hour exhaustion):
|
|
28
|
-
|
|
29
|
-
10:00 AM → You start working.
|
|
30
|
-
12:00 PM → You exhaust your limits. BUT the
|
|
28
|
+
7:00 AM → warmup sends one tiny Claude Code ping
|
|
29
|
+
10:00 AM → You start working using the active window.
|
|
30
|
+
12:00 PM → You exhaust your limits. BUT the 7:00 AM window ends right now!
|
|
31
31
|
12:00 PM → Window resets instantly! Full capacity continues.
|
|
32
32
|
```
|
|
33
33
|
*You just saved 3 hours of waiting.*
|
|
@@ -37,11 +37,37 @@ By the time you sit down to work, the window is perfectly timed to expire exactl
|
|
|
37
37
|
## ⚡ Install
|
|
38
38
|
|
|
39
39
|
```bash
|
|
40
|
-
npm install -g warmup-cli
|
|
40
|
+
npm install -g @mohitkumawat/warmup-cli
|
|
41
41
|
```
|
|
42
42
|
|
|
43
43
|
**Prerequisites:** [Claude Code](https://code.claude.com) must be installed and authenticated.
|
|
44
44
|
|
|
45
|
+
## 🚀 Quick Start
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
warmup
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Fresh installs now open a **guided onboarding wizard**. If you want to skip straight to the wizard later, `warmup setup` still works too.
|
|
52
|
+
|
|
53
|
+
## What happens
|
|
54
|
+
|
|
55
|
+
- `warmup` shows the exact scheduled Claude command before it installs anything:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
claude -p ping --max-turns 1
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
- Setup checks Claude Code install + auth, asks about your work start time and how fast you hit limits, then shows an install preview before saving anything.
|
|
62
|
+
- Config and logs stay local in `~/.warmup/`.
|
|
63
|
+
- The scheduler runs locally through native OS tooling.
|
|
64
|
+
|
|
65
|
+
## What does not happen
|
|
66
|
+
|
|
67
|
+
- Setup does **not** send a live Claude request or start your 5-hour window.
|
|
68
|
+
- `warmup` does **not** extract tokens, proxy your session, or depend on a backend service.
|
|
69
|
+
- Nothing is installed until you confirm the schedule preview.
|
|
70
|
+
|
|
45
71
|
## 🧠 Smart Setup
|
|
46
72
|
|
|
47
73
|
We don't ask you to do modulo-math to figure out your 5-hour window. `warmup` uses a **Smart Scheduler**.
|
|
@@ -56,7 +82,7 @@ Just tell it:
|
|
|
56
82
|
|
|
57
83
|
`warmup` automatically calculates the **exact optimal pre-warm time** to ensure your rate limit resets exactly the minute you run out of messages.
|
|
58
84
|
|
|
59
|
-
|
|
85
|
+
Then it shows an install preview with your schedule, expected reset time, local file paths, and scheduler backend before installing the OS-native task.
|
|
60
86
|
|
|
61
87
|
## 🛡️ Bulletproof Boot-Recovery
|
|
62
88
|
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { readConfig } from '../config';
|
|
2
|
+
import { type SetupCommandOptions } from './setup';
|
|
3
|
+
interface OnboardingDependencies {
|
|
4
|
+
confirmStartSetup: () => Promise<boolean>;
|
|
5
|
+
printLogo: () => void;
|
|
6
|
+
printFirstRunIntro: () => void;
|
|
7
|
+
printSetupTransparency: () => void;
|
|
8
|
+
printSetupDeferred: () => void;
|
|
9
|
+
runSetup: (options?: SetupCommandOptions) => Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
interface DefaultCommandDependencies {
|
|
12
|
+
readConfig: typeof readConfig;
|
|
13
|
+
runStatus: () => Promise<void>;
|
|
14
|
+
runFirstRunOnboarding: () => Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
export declare function runFirstRunOnboarding(deps?: Partial<OnboardingDependencies>): Promise<void>;
|
|
17
|
+
export declare function defaultCommand(deps?: Partial<DefaultCommandDependencies>): Promise<'status' | 'onboarding'>;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=default.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default.d.ts","sourceRoot":"","sources":["../../src/commands/default.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAOvC,OAAO,EAAgB,KAAK,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAGjE,UAAU,sBAAsB;IAC9B,iBAAiB,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,sBAAsB,EAAE,MAAM,IAAI,CAAC;IACnC,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5D;AAED,UAAU,0BAA0B;IAClC,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,qBAAqB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C;AAaD,wBAAsB,qBAAqB,CACzC,IAAI,GAAE,OAAO,CAAC,sBAAsB,CAAM,GACzC,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED,wBAAsB,cAAc,CAClC,IAAI,GAAE,OAAO,CAAC,0BAA0B,CAAM,GAC7C,OAAO,CAAC,QAAQ,GAAG,YAAY,CAAC,CAYlC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
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.runFirstRunOnboarding = runFirstRunOnboarding;
|
|
7
|
+
exports.defaultCommand = defaultCommand;
|
|
8
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
9
|
+
const config_1 = require("../config");
|
|
10
|
+
const ui_1 = require("../ui");
|
|
11
|
+
const setup_1 = require("./setup");
|
|
12
|
+
const status_1 = require("./status");
|
|
13
|
+
async function promptToStartSetup() {
|
|
14
|
+
const { startSetup } = await inquirer_1.default.prompt([{
|
|
15
|
+
type: 'confirm',
|
|
16
|
+
name: 'startSetup',
|
|
17
|
+
message: 'Start setup now?',
|
|
18
|
+
default: true,
|
|
19
|
+
}]);
|
|
20
|
+
return startSetup;
|
|
21
|
+
}
|
|
22
|
+
async function runFirstRunOnboarding(deps = {}) {
|
|
23
|
+
const confirmStartSetup = deps.confirmStartSetup ?? promptToStartSetup;
|
|
24
|
+
const showLogo = deps.printLogo ?? ui_1.printLogo;
|
|
25
|
+
const showFirstRunIntro = deps.printFirstRunIntro ?? ui_1.printFirstRunIntro;
|
|
26
|
+
const showSetupTransparency = deps.printSetupTransparency ?? ui_1.printSetupTransparency;
|
|
27
|
+
const showSetupDeferred = deps.printSetupDeferred ?? ui_1.printSetupDeferred;
|
|
28
|
+
const runSetup = deps.runSetup ?? setup_1.setupCommand;
|
|
29
|
+
showLogo();
|
|
30
|
+
showFirstRunIntro();
|
|
31
|
+
showSetupTransparency();
|
|
32
|
+
if (!(await confirmStartSetup())) {
|
|
33
|
+
showSetupDeferred();
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
await runSetup({ skipLogo: true });
|
|
37
|
+
}
|
|
38
|
+
async function defaultCommand(deps = {}) {
|
|
39
|
+
const loadConfig = deps.readConfig ?? config_1.readConfig;
|
|
40
|
+
const runStatus = deps.runStatus ?? status_1.statusCommand;
|
|
41
|
+
const runOnboarding = deps.runFirstRunOnboarding ?? runFirstRunOnboarding;
|
|
42
|
+
if (loadConfig()) {
|
|
43
|
+
await runStatus();
|
|
44
|
+
return 'status';
|
|
45
|
+
}
|
|
46
|
+
await runOnboarding();
|
|
47
|
+
return 'onboarding';
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=default.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default.js","sourceRoot":"","sources":["../../src/commands/default.ts"],"names":[],"mappings":";;;;;AAqCA,sDAoBC;AAED,wCAcC;AAzED,wDAAgC;AAChC,sCAAuC;AACvC,8BAKe;AACf,mCAAiE;AACjE,qCAAyC;AAiBzC,KAAK,UAAU,kBAAkB;IAC/B,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC,CAAC;YAC5C,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,kBAAkB;YAC3B,OAAO,EAAE,IAAI;SACd,CAAC,CAAC,CAAC;IAEJ,OAAO,UAAU,CAAC;AACpB,CAAC;AAEM,KAAK,UAAU,qBAAqB,CACzC,OAAwC,EAAE;IAE1C,MAAM,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,IAAI,kBAAkB,CAAC;IACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,IAAI,cAAS,CAAC;IAC7C,MAAM,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,IAAI,uBAAkB,CAAC;IACxE,MAAM,qBAAqB,GAAG,IAAI,CAAC,sBAAsB,IAAI,2BAAsB,CAAC;IACpF,MAAM,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,IAAI,uBAAkB,CAAC;IACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,oBAAY,CAAC;IAE/C,QAAQ,EAAE,CAAC;IACX,iBAAiB,EAAE,CAAC;IACpB,qBAAqB,EAAE,CAAC;IAExB,IAAI,CAAC,CAAC,MAAM,iBAAiB,EAAE,CAAC,EAAE,CAAC;QACjC,iBAAiB,EAAE,CAAC;QACpB,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AACrC,CAAC;AAEM,KAAK,UAAU,cAAc,CAClC,OAA4C,EAAE;IAE9C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,mBAAU,CAAC;IACjD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,sBAAa,CAAC;IAClD,MAAM,aAAa,GAAG,IAAI,CAAC,qBAAqB,IAAI,qBAAqB,CAAC;IAE1E,IAAI,UAAU,EAAE,EAAE,CAAC;QACjB,MAAM,SAAS,EAAE,CAAC;QAClB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,aAAa,EAAE,CAAC;IACtB,OAAO,YAAY,CAAC;AACtB,CAAC"}
|
package/dist/commands/setup.d.ts
CHANGED
|
@@ -1,2 +1,48 @@
|
|
|
1
|
-
|
|
1
|
+
import { WarmupConfig } from '../config';
|
|
2
|
+
import { type InstallPreviewContent } from '../ui';
|
|
3
|
+
import { type RuntimePaths } from '../runtime';
|
|
4
|
+
export interface SetupCommandOptions {
|
|
5
|
+
skipLogo?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface SetupInstallPlan extends InstallPreviewContent {
|
|
8
|
+
time: string;
|
|
9
|
+
hour: number;
|
|
10
|
+
minute: number;
|
|
11
|
+
}
|
|
12
|
+
interface SpinnerLike {
|
|
13
|
+
succeed(text: string): void;
|
|
14
|
+
fail(text: string): void;
|
|
15
|
+
}
|
|
16
|
+
interface ConfirmAndInstallDependencies {
|
|
17
|
+
printInstallPreview: (preview: InstallPreviewContent) => void;
|
|
18
|
+
confirmInstall: () => Promise<boolean>;
|
|
19
|
+
printSetupDeferred: () => void;
|
|
20
|
+
createInstallSpinner: (schedulerLabel: string) => SpinnerLike;
|
|
21
|
+
ensureConfigDir: () => void;
|
|
22
|
+
resolveRuntimePaths: () => RuntimePaths;
|
|
23
|
+
installSchedule: (options: {
|
|
24
|
+
hour: number;
|
|
25
|
+
minute: number;
|
|
26
|
+
runtime: RuntimePaths;
|
|
27
|
+
}) => void;
|
|
28
|
+
createDefaultConfig: (time: string, timezone: string, runtime: RuntimePaths) => WarmupConfig;
|
|
29
|
+
writeConfig: (config: WarmupConfig) => void;
|
|
30
|
+
animateSetupComplete: (config: WarmupConfig) => Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
/** Generate choices for work start time (30 min increments) */
|
|
33
|
+
export declare function generateStartTimeChoices(): Array<{
|
|
34
|
+
name: string;
|
|
35
|
+
value: number;
|
|
36
|
+
}>;
|
|
37
|
+
/** Calculate the optimal pre-warm time based on user feedback */
|
|
38
|
+
export declare function calculateOptimalPrewarm(startMins: number, exhaustMins: number): {
|
|
39
|
+
time: string;
|
|
40
|
+
h: number;
|
|
41
|
+
m: number;
|
|
42
|
+
explanation: string;
|
|
43
|
+
};
|
|
44
|
+
export declare function buildSetupInstallPlan(startMins: number, exhaustMins: number, timezone: string, overrides?: Partial<Pick<SetupInstallPlan, 'schedulerLabel' | 'note'>>): SetupInstallPlan;
|
|
45
|
+
export declare function confirmAndInstallSchedule(plan: SetupInstallPlan, deps?: Partial<ConfirmAndInstallDependencies>): Promise<'cancelled' | 'installed' | 'failed'>;
|
|
46
|
+
export declare function setupCommand(options?: SetupCommandOptions): Promise<void>;
|
|
47
|
+
export {};
|
|
2
48
|
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAGA,OAAO,EAOL,YAAY,EACb,MAAM,WAAW,CAAC;AAGnB,OAAO,EAQL,KAAK,qBAAqB,EAC3B,MAAM,OAAO,CAAC;AACf,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAKpE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,gBAAiB,SAAQ,qBAAqB;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,WAAW;IACnB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,UAAU,6BAA6B;IACrC,mBAAmB,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,IAAI,CAAC;IAC9D,cAAc,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,oBAAoB,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,WAAW,CAAC;IAC9D,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,mBAAmB,EAAE,MAAM,YAAY,CAAC;IACxC,eAAe,EAAE,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,YAAY,CAAA;KAAE,KAAK,IAAI,CAAC;IAC5F,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,KAAK,YAAY,CAAC;IAC7F,WAAW,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IAC5C,oBAAoB,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/D;AAED,+DAA+D;AAC/D,wBAAgB,wBAAwB,IAAI,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAqBjF;AAED,iEAAiE;AACjE,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAuB7D;AAED,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,SAAS,GAAE,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,MAAM,CAAC,CAAM,GACzE,gBAAgB,CAclB;AAoBD,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,gBAAgB,EACtB,IAAI,GAAE,OAAO,CAAC,6BAA6B,CAAM,GAChD,OAAO,CAAC,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC,CAoC/C;AAED,wBAAsB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6EnF"}
|
package/dist/commands/setup.js
CHANGED
|
@@ -3,6 +3,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.generateStartTimeChoices = generateStartTimeChoices;
|
|
7
|
+
exports.calculateOptimalPrewarm = calculateOptimalPrewarm;
|
|
8
|
+
exports.buildSetupInstallPlan = buildSetupInstallPlan;
|
|
9
|
+
exports.confirmAndInstallSchedule = confirmAndInstallSchedule;
|
|
6
10
|
exports.setupCommand = setupCommand;
|
|
7
11
|
const inquirer_1 = __importDefault(require("inquirer"));
|
|
8
12
|
const chalk_1 = __importDefault(require("chalk"));
|
|
@@ -25,7 +29,6 @@ function generateStartTimeChoices() {
|
|
|
25
29
|
const label = `${h12}:${mStr} ${period}`;
|
|
26
30
|
const minutesSinceMidnight = h * 60 + m;
|
|
27
31
|
let suffix = '';
|
|
28
|
-
// typical work start times
|
|
29
32
|
if (h === 9 && m === 0)
|
|
30
33
|
suffix = ' ← standard';
|
|
31
34
|
if (h === 10 && m === 0)
|
|
@@ -40,16 +43,10 @@ function generateStartTimeChoices() {
|
|
|
40
43
|
}
|
|
41
44
|
/** Calculate the optimal pre-warm time based on user feedback */
|
|
42
45
|
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
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
47
|
if (prewarmMins > startMins) {
|
|
50
48
|
prewarmMins = startMins;
|
|
51
49
|
}
|
|
52
|
-
// Handle midnight wraparound
|
|
53
50
|
if (prewarmMins < 0) {
|
|
54
51
|
prewarmMins += 24 * 60;
|
|
55
52
|
}
|
|
@@ -63,9 +60,71 @@ function calculateOptimalPrewarm(startMins, exhaustMins) {
|
|
|
63
60
|
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
61
|
return { time: timeStr, h, m, explanation };
|
|
65
62
|
}
|
|
66
|
-
|
|
67
|
-
(
|
|
68
|
-
|
|
63
|
+
function buildSetupInstallPlan(startMins, exhaustMins, timezone, overrides = {}) {
|
|
64
|
+
const { time, h, m, explanation } = calculateOptimalPrewarm(startMins, exhaustMins);
|
|
65
|
+
return {
|
|
66
|
+
explanation,
|
|
67
|
+
time,
|
|
68
|
+
hour: h,
|
|
69
|
+
minute: m,
|
|
70
|
+
warmTime: (0, config_1.formatHour)(h, m),
|
|
71
|
+
timezone,
|
|
72
|
+
resetTime: (0, config_1.formatHour)((h + 5) % 24, m),
|
|
73
|
+
schedulerLabel: overrides.schedulerLabel ?? (0, scheduler_1.getSchedulerName)(),
|
|
74
|
+
note: overrides.note,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
async function promptToConfirmInstall() {
|
|
78
|
+
const { confirm } = await inquirer_1.default.prompt([{
|
|
79
|
+
type: 'confirm',
|
|
80
|
+
name: 'confirm',
|
|
81
|
+
message: 'Install this schedule?',
|
|
82
|
+
default: true,
|
|
83
|
+
}]);
|
|
84
|
+
return confirm;
|
|
85
|
+
}
|
|
86
|
+
function createInstallSpinner(schedulerLabel) {
|
|
87
|
+
return (0, ora_1.default)({
|
|
88
|
+
text: `Installing schedule (${schedulerLabel})...`,
|
|
89
|
+
color: 'magenta',
|
|
90
|
+
}).start();
|
|
91
|
+
}
|
|
92
|
+
async function confirmAndInstallSchedule(plan, deps = {}) {
|
|
93
|
+
const showInstallPreview = deps.printInstallPreview ?? ui_1.printInstallPreview;
|
|
94
|
+
const confirmInstall = deps.confirmInstall ?? promptToConfirmInstall;
|
|
95
|
+
const showSetupDeferred = deps.printSetupDeferred ?? ui_1.printSetupDeferred;
|
|
96
|
+
const startInstallSpinner = deps.createInstallSpinner ?? createInstallSpinner;
|
|
97
|
+
const ensureDir = deps.ensureConfigDir ?? config_1.ensureConfigDir;
|
|
98
|
+
const resolveRuntime = deps.resolveRuntimePaths ?? runtime_1.resolveRuntimePaths;
|
|
99
|
+
const install = deps.installSchedule ?? scheduler_1.installSchedule;
|
|
100
|
+
const makeConfig = deps.createDefaultConfig ?? config_1.createDefaultConfig;
|
|
101
|
+
const persistConfig = deps.writeConfig ?? config_1.writeConfig;
|
|
102
|
+
const finishSetup = deps.animateSetupComplete ?? ui_1.animateSetupComplete;
|
|
103
|
+
showInstallPreview(plan);
|
|
104
|
+
if (!(await confirmInstall())) {
|
|
105
|
+
showSetupDeferred();
|
|
106
|
+
return 'cancelled';
|
|
107
|
+
}
|
|
108
|
+
const installSpinner = startInstallSpinner(plan.schedulerLabel);
|
|
109
|
+
try {
|
|
110
|
+
ensureDir();
|
|
111
|
+
const runtime = resolveRuntime();
|
|
112
|
+
install({ hour: plan.hour, minute: plan.minute, runtime });
|
|
113
|
+
const config = makeConfig(plan.time, plan.timezone, runtime);
|
|
114
|
+
persistConfig(config);
|
|
115
|
+
installSpinner.succeed('Schedule installed with boot-recovery');
|
|
116
|
+
await finishSetup(config);
|
|
117
|
+
return 'installed';
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
installSpinner.fail(`Installation failed: ${err.message}`);
|
|
121
|
+
return 'failed';
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async function setupCommand(options = {}) {
|
|
125
|
+
if (!options.skipLogo) {
|
|
126
|
+
(0, ui_1.printLogo)();
|
|
127
|
+
}
|
|
69
128
|
const existing = (0, config_1.readConfig)();
|
|
70
129
|
if (existing) {
|
|
71
130
|
(0, ui_1.printAlreadySetup)(existing);
|
|
@@ -78,7 +137,7 @@ async function setupCommand() {
|
|
|
78
137
|
if (!overwrite)
|
|
79
138
|
return;
|
|
80
139
|
}
|
|
81
|
-
|
|
140
|
+
(0, ui_1.printSetupTransparency)();
|
|
82
141
|
const spinner = (0, ora_1.default)({
|
|
83
142
|
text: 'Checking for Claude Code...',
|
|
84
143
|
color: 'magenta',
|
|
@@ -89,7 +148,6 @@ async function setupCommand() {
|
|
|
89
148
|
return;
|
|
90
149
|
}
|
|
91
150
|
spinner.succeed('Claude Code detected');
|
|
92
|
-
// Check authentication
|
|
93
151
|
const authSpinner = (0, ora_1.default)({
|
|
94
152
|
text: 'Checking Claude Code authentication...',
|
|
95
153
|
color: 'magenta',
|
|
@@ -101,11 +159,9 @@ async function setupCommand() {
|
|
|
101
159
|
return;
|
|
102
160
|
}
|
|
103
161
|
authSpinner.succeed('Claude Code authenticated');
|
|
104
|
-
// Detect timezone
|
|
105
162
|
const timezone = (0, config_1.detectTimezone)();
|
|
106
163
|
console.log(` ${DIM('Timezone:')} ${ACCENT(timezone)} ${DIM('(auto-detected)')}`);
|
|
107
164
|
console.log('');
|
|
108
|
-
// Smart Scheduler Questionnaire
|
|
109
165
|
console.log(chalk_1.default.cyan(' Let\'s optimize your schedule based on your typical usage.'));
|
|
110
166
|
console.log('');
|
|
111
167
|
const { startMins } = await inquirer_1.default.prompt([{
|
|
@@ -113,7 +169,7 @@ async function setupCommand() {
|
|
|
113
169
|
name: 'startMins',
|
|
114
170
|
message: 'When do you usually start your heavy Claude usage each day?',
|
|
115
171
|
choices: generateStartTimeChoices(),
|
|
116
|
-
default: 9 * 60,
|
|
172
|
+
default: 9 * 60,
|
|
117
173
|
pageSize: 12,
|
|
118
174
|
}]);
|
|
119
175
|
const { exhaustMins } = await inquirer_1.default.prompt([{
|
|
@@ -125,49 +181,11 @@ async function setupCommand() {
|
|
|
125
181
|
{ name: '1-2 hours', value: 120 },
|
|
126
182
|
{ name: '2-3 hours', value: 180 },
|
|
127
183
|
{ name: '3-4 hours', value: 240 },
|
|
128
|
-
{ name: 'I rarely hit the limit / 5+ hours', value: 300 }
|
|
184
|
+
{ name: 'I rarely hit the limit / 5+ hours', value: 300 },
|
|
129
185
|
],
|
|
130
|
-
default: 120,
|
|
186
|
+
default: 120,
|
|
131
187
|
}]);
|
|
132
|
-
|
|
133
|
-
|
|
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
|
-
}
|
|
188
|
+
const plan = buildSetupInstallPlan(startMins, exhaustMins, timezone);
|
|
189
|
+
await confirmAndInstallSchedule(plan);
|
|
172
190
|
}
|
|
173
191
|
//# sourceMappingURL=setup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAyDA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAkDnD"}
|
package/dist/commands/update.js
CHANGED
|
@@ -11,49 +11,39 @@ const config_1 = require("../config");
|
|
|
11
11
|
const scheduler_1 = require("../scheduler");
|
|
12
12
|
const ui_1 = require("../ui");
|
|
13
13
|
const runtime_1 = require("../runtime");
|
|
14
|
+
const setup_1 = require("./setup");
|
|
14
15
|
const ACCENT = chalk_1.default.hex('#6C5CE7');
|
|
15
16
|
const DIM = chalk_1.default.gray;
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const label = `${h12}:${mStr} ${period}`;
|
|
25
|
-
const minutesSinceMidnight = h * 60 + m;
|
|
26
|
-
let suffix = '';
|
|
27
|
-
if (h === 9 && m === 0)
|
|
28
|
-
suffix = ' ← standard';
|
|
29
|
-
if (h === 10 && m === 0)
|
|
30
|
-
suffix = ' ← common';
|
|
31
|
-
choices.push({
|
|
32
|
-
name: `${label}${suffix}`,
|
|
33
|
-
value: minutesSinceMidnight,
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
return choices;
|
|
17
|
+
async function promptToConfirmUpdate() {
|
|
18
|
+
const { confirm } = await inquirer_1.default.prompt([{
|
|
19
|
+
type: 'confirm',
|
|
20
|
+
name: 'confirm',
|
|
21
|
+
message: 'Update to this schedule?',
|
|
22
|
+
default: true,
|
|
23
|
+
}]);
|
|
24
|
+
return confirm;
|
|
38
25
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
26
|
+
function printUpdateDeferred() {
|
|
27
|
+
console.log(` ${DIM('Update cancelled. Current schedule is unchanged.')}`);
|
|
28
|
+
console.log('');
|
|
29
|
+
}
|
|
30
|
+
function createUpdateSpinner(schedulerLabel) {
|
|
31
|
+
return (0, ora_1.default)({
|
|
32
|
+
text: `Updating schedule (${schedulerLabel})...`,
|
|
33
|
+
color: 'magenta',
|
|
34
|
+
}).start();
|
|
35
|
+
}
|
|
36
|
+
function buildUpdatedConfig(config, plan, runtime) {
|
|
37
|
+
return {
|
|
38
|
+
...config,
|
|
39
|
+
schedule: {
|
|
40
|
+
...config.schedule,
|
|
41
|
+
time: plan.time,
|
|
42
|
+
timezone: plan.timezone,
|
|
43
|
+
enabled: true,
|
|
44
|
+
},
|
|
45
|
+
runtime,
|
|
46
|
+
};
|
|
57
47
|
}
|
|
58
48
|
async function updateCommand() {
|
|
59
49
|
(0, ui_1.printMiniLogo)();
|
|
@@ -69,8 +59,8 @@ async function updateCommand() {
|
|
|
69
59
|
type: 'list',
|
|
70
60
|
name: 'startMins',
|
|
71
61
|
message: 'When do you usually start your heavy Claude usage each day?',
|
|
72
|
-
choices: generateStartTimeChoices(),
|
|
73
|
-
default: 9 * 60,
|
|
62
|
+
choices: (0, setup_1.generateStartTimeChoices)(),
|
|
63
|
+
default: 9 * 60,
|
|
74
64
|
pageSize: 12,
|
|
75
65
|
}]);
|
|
76
66
|
const { exhaustMins } = await inquirer_1.default.prompt([{
|
|
@@ -82,31 +72,22 @@ async function updateCommand() {
|
|
|
82
72
|
{ name: '1-2 hours', value: 120 },
|
|
83
73
|
{ name: '2-3 hours', value: 180 },
|
|
84
74
|
{ name: '3-4 hours', value: 240 },
|
|
85
|
-
{ name: 'I rarely hit the limit / 5+ hours', value: 300 }
|
|
75
|
+
{ name: 'I rarely hit the limit / 5+ hours', value: 300 },
|
|
86
76
|
],
|
|
87
|
-
default: 120,
|
|
77
|
+
default: 120,
|
|
88
78
|
}]);
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
config.runtime = (0, runtime_1.resolveRuntimePaths)();
|
|
103
|
-
(0, scheduler_1.installSchedule)({ hour: h, minute: m, runtime: config.runtime });
|
|
104
|
-
(0, config_1.writeConfig)(config);
|
|
105
|
-
spinner.succeed('Schedule updated');
|
|
106
|
-
await (0, ui_1.animateSetupComplete)(config);
|
|
107
|
-
}
|
|
108
|
-
catch (err) {
|
|
109
|
-
spinner.fail(`Update failed: ${err.message}`);
|
|
110
|
-
}
|
|
79
|
+
const plan = (0, setup_1.buildSetupInstallPlan)(startMins, exhaustMins, config.schedule.timezone, {
|
|
80
|
+
note: 'Updating the schedule will not send a live pre-warm yet.',
|
|
81
|
+
});
|
|
82
|
+
await (0, setup_1.confirmAndInstallSchedule)(plan, {
|
|
83
|
+
confirmInstall: promptToConfirmUpdate,
|
|
84
|
+
printSetupDeferred: printUpdateDeferred,
|
|
85
|
+
createInstallSpinner: createUpdateSpinner,
|
|
86
|
+
resolveRuntimePaths: runtime_1.resolveRuntimePaths,
|
|
87
|
+
installSchedule: scheduler_1.installSchedule,
|
|
88
|
+
createDefaultConfig: (_time, _timezone, runtime) => buildUpdatedConfig(config, plan, runtime),
|
|
89
|
+
writeConfig: config_1.writeConfig,
|
|
90
|
+
animateSetupComplete: ui_1.animateSetupComplete,
|
|
91
|
+
});
|
|
111
92
|
}
|
|
112
93
|
//# sourceMappingURL=update.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -19,6 +19,7 @@ export interface LogEntry {
|
|
|
19
19
|
actualTime?: string;
|
|
20
20
|
}
|
|
21
21
|
export declare function getConfigDir(): string;
|
|
22
|
+
export declare function getConfigFilePath(): string;
|
|
22
23
|
export declare function getLogsDir(): string;
|
|
23
24
|
export declare function ensureConfigDir(): void;
|
|
24
25
|
export declare function configExists(): boolean;
|