Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions packages/cli/src/commands/scale.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
});
});

// ---------------------------------------------------------------------------
Expand Down
26 changes: 14 additions & 12 deletions packages/cli/src/commands/scale.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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.'));
Expand Down
Loading