feat: enforce CI coverage thresholds + colocate billing guidance (#2811)

- Move bunfig.toml to repo root with valid coverageThreshold syntax
  (line=80%, function=0 to avoid per-file false positives)
- Add --coverage flag to CI test step
- Delete packages/cli/bunfig.toml (superseded by root config)
- Add tests for packages/shared (type-guards, parse, result)
- Colocate billing config into each cloud directory (aws/billing.ts,
  gcp/billing.ts, hetzner/billing.ts, digitalocean/billing.ts)
- Refactor billing-guidance.ts: BillingConfig interface replaces
  cloud-string-keyed Record maps
- Bump CLI version to 0.25.1

Co-authored-by: Claude <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: L <6723574+louisgv@users.noreply.github.com>
This commit is contained in:
A 2026-03-19 22:52:45 -07:00 committed by GitHub
parent aa4b2a23d6
commit 9ae3525030
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
17 changed files with 601 additions and 133 deletions

View file

@ -39,6 +39,7 @@ import {
shellQuote,
validateRegionName,
} from "../shared/ui";
import { hetznerBilling } from "./billing";
const HETZNER_API_BASE = "https://api.hetzner.cloud/v1";
const HETZNER_DASHBOARD_URL = "https://console.hetzner.cloud/";
@ -606,8 +607,8 @@ export async function createServer(
logError(`Failed to create Hetzner server: ${errMsg}`);
if (isBillingError("hetzner", errMsg)) {
const shouldRetry = await handleBillingError("hetzner");
if (isBillingError(hetznerBilling, errMsg)) {
const shouldRetry = await handleBillingError(hetznerBilling);
if (shouldRetry) {
logStep("Retrying server creation...");
const retryResp = await hetznerApi("POST", "/servers", body);
@ -633,7 +634,7 @@ export async function createServer(
logError(`Retry failed: ${retryErr}`);
}
} else {
showNonBillingError("hetzner", [
showNonBillingError(hetznerBilling, [
"Server type or location unavailable",
"Server limit reached for your account",
]);