From b1b1d24e31bd68a480f97d45ae4943c9dee8213a Mon Sep 17 00:00:00 2001 From: Mao Haibo Date: Sun, 30 Aug 2026 20:09:12 +0800 Subject: [PATCH] fix(cli): persist auto-scale rules in JSON mode --- packages/cli/src/commands/scale.test.ts | 22 +++++++++++++++++++++ packages/cli/src/commands/scale.ts | 26 +++++++++++++------------ 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/packages/cli/src/commands/scale.test.ts b/packages/cli/src/commands/scale.test.ts index 2d689d46..fa56fbb1 100644 --- a/packages/cli/src/commands/scale.test.ts +++ b/packages/cli/src/commands/scale.test.ts @@ -382,6 +382,28 @@ describe('auto-scale rules', () => { expect(rules.targetCpuPercent).toBe(65); expect(rules.cooldownSeconds).toBe(300); }); + + it('persists rules when --json is used without --dry-run', async () => { + const dir = makeTempDir(); + const previousHome = process.env.HOME; + const previousUserProfile = process.env.USERPROFILE; + process.env.HOME = dir; + process.env.USERPROFILE = dir; + + try { + const auto = scaleCmd.commands.find(command => command.name() === 'auto'); + await auto?.parseAsync(['--min', '2', '--max', '4', '--json'], { from: 'user' }); + + const saved = JSON.parse(readFileSync(join(dir, '.sh1pt', 'auto-scale.json'), 'utf-8')); + expect(saved.minInstances).toBe(2); + expect(saved.maxInstances).toBe(4); + } finally { + if (previousHome === undefined) delete process.env.HOME; + else process.env.HOME = previousHome; + if (previousUserProfile === undefined) delete process.env.USERPROFILE; + else process.env.USERPROFILE = previousUserProfile; + } + }); }); // --------------------------------------------------------------------------- diff --git a/packages/cli/src/commands/scale.ts b/packages/cli/src/commands/scale.ts index 219adb7c..56e95145 100644 --- a/packages/cli/src/commands/scale.ts +++ b/packages/cli/src/commands/scale.ts @@ -543,25 +543,27 @@ scaleCmd updatedAt: new Date().toISOString(), }; - if (opts.json) { - console.log(JSON.stringify({ rules }, null, 2)); - return; + if (!opts.json) { + console.log(kleur.bold('\nšŸ“Š Auto-Scale Rules')); + console.log(kleur.dim('─'.repeat(52))); + console.log(`${kleur.cyan('Min instances:'.padEnd(20))} ${min}`); + console.log(`${kleur.cyan('Max instances:'.padEnd(20))} ${max}`); + console.log(`${kleur.cyan('Target CPU:'.padEnd(20))} ${targetCpu}%`); + console.log(`${kleur.cyan('Cooldown:'.padEnd(20))} ${cooldown}s (${(cooldown / 60).toFixed(1)} min)`); + console.log(kleur.dim('─'.repeat(52))); } - console.log(kleur.bold('\nšŸ“Š Auto-Scale Rules')); - console.log(kleur.dim('─'.repeat(52))); - console.log(`${kleur.cyan('Min instances:'.padEnd(20))} ${min}`); - console.log(`${kleur.cyan('Max instances:'.padEnd(20))} ${max}`); - console.log(`${kleur.cyan('Target CPU:'.padEnd(20))} ${targetCpu}%`); - console.log(`${kleur.cyan('Cooldown:'.padEnd(20))} ${cooldown}s (${(cooldown / 60).toFixed(1)} min)`); - console.log(kleur.dim('─'.repeat(52))); - if (opts.dryRun) { - console.log(kleur.dim('Dry-run — rules not saved.')); + if (opts.json) console.log(JSON.stringify({ rules }, null, 2)); + else console.log(kleur.dim('Dry-run — rules not saved.')); return; } saveAutoScaleRules(rules); + if (opts.json) { + console.log(JSON.stringify({ rules }, null, 2)); + return; + } console.log(kleur.green('āœ… Auto-scale rules saved.')); console.log(kleur.dim(`Config file: ${AUTO_SCALE_FILE}`)); console.log(kleur.dim('sh1pt cloud will poll metrics and scale up/down based on these rules.'));