
Une seule commande évalue l'ensemble de votre compte cloud — erreurs de configuration, observabilité manquante et posture de sécurité.
Une seule commande évalue l'ensemble de votre compte cloud — les mauvaises configurations, l'observabilité manquante et la posture de sécurité, classés par les cinq choses à corriger en premier.
Pointez-le vers AWS, Cloudflare, Vercel, Supabase, Render, Fly.io ou Railway et il revient avec un score, ce qui est cassé et une correction pour chacun — assez autonome pour être confié directement à un agent.
npx cloud-doctor
https://github.com/user-attachments/assets/60b610ab-7aee-4c3a-8d9e-83f045c8cc56
Cela sélectionne un fournisseur, résout votre identité (profil AWS, jeton API, …) et exécute l'analyse de manière interactive. Pour aller directement à un fournisseur :
npx cloud-doctor aws --profile prod
npx cloud-doctor cloudflare --yes
npx cloud-doctor vercel --yes
Si ~/.npmrc a min-release-age défini (durcissement de la chaîne d'approvisionnement) et bloque les nouvelles versions :
# =<number>, 0 chosen as example
npm x --min-release-age=0 cloud-doctor -- aws profiles
Vous préférez la version de pointe ? Les versions alpha sont publiées sous leur propre tag : npx cloud-doctor@alpha.
Les jetons d'authentification peuvent être définis comme variables d'environnement ou vous pouvez les fournir lorsque l'interface textuelle le demande :
CLOUDFLARE_API_TOKEN=cfut_aHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1kUXc0dzlXZ1hjUQ== npx cloud-doctor cloudflare
(ne décodez pas le jeton en base64)
ou
$ npx cloud-doctor cloudflare
Cloudflare credentials are not set — enter them below.
Kept for this run only, never written to disk. Skip these prompts: export CLOUDFLARE_API_TOKEN
tableau de bord → Mon profil → Jetons API
? Cloudflare read-only API token › <input>
À venir : Google Cloud, Kubernetes et Bases de données (Postgres, MySQL, Redis) — voir Quelle est la suite.
npx cloud-doctor # pick provider (default AWS) → pick identity → scan
npx cloud-doctor aws # AWS fast path
npx cloud-doctor aws --profile prod # non-interactive when unambiguous
npx cloud-doctor aws --yes --json # CI, machine-readable output
npx cloud-doctor aws --yes --json --fail-under 75 # CI gate on the score
npx cloud-doctor cloudflare --yes # needs CLOUDFLARE_API_TOKEN
npx cloud-doctor vercel --yes # needs VERCEL_TOKEN (+ VERCEL_TEAM_ID)
npx cloud-doctor supabase --yes # needs SUPABASE_ACCESS_TOKEN
npx cloud-doctor render --yes # needs RENDER_API_KEY
npx cloud-doctor fly --yes # needs FLY_API_TOKEN (+ FLY_ORG)
npx cloud-doctor railway --yes # needs RAILWAY_API_TOKEN
npx cloud-doctor aws profiles # list ~/.aws/config profiles
npx cloud-doctor aws whoami # show resolved AWS identity
--yes ignore les invites (sûr pour CI) ; --json imprime un rapport stable et versionné par schéma au lieu de la vue terminal ; --verbose imprime chaque résultat au lieu des principaux contrevenants ; --no-color désactive la sortie couleur.
Les scores ne sont jamais falsifiés : si zéro règle a pu s'exécuter, le score est null avec le libellé "Aucune vérification effectuée", jamais un 100 vide.
Ajustez les règles par fournisseur via doctor.config.ts (ou doctor.config.json, ou cloudDoctor dans package.json) :
import { defineConfig } from "cloud-doctor/api";
export default defineConfig({
defaultProvider: "aws",
aws: {
profile: "prod",
regions: ["us-east-1", "eu-west-1"],
account: "123456789012",
},
rules: {
"aws/s3-unencrypted-bucket": "off",
"aws/iam-user-access-key": "error",
},
});
"off" désactive une règle ; "error" / "warning" remplace sa sévérité. Les règles désactivées sont retirées du score et divulguées comme atténuées — jamais silencieusement soustraites.
Une CLI légère sur un registre de plugins — chaque fournisseur implémente le même contrat, donc la CLI ne traite jamais un cas particulier par rapport à un autre.
Chaque fournisseur implémente CloudDoctorPlugin :
discoverIdentities() — liste les profils/projets/comptes pour le sélecteurresolveIdentity() — mappe les drapeaux/env/config → identité, sans appels réseauvalidateIdentity() — prouve que les identifiants fonctionnent (sts:GetCallerIdentity ou équivalent)scan() — exécute les règles conditionnées, retourne les diagnostics + scoreLes nouveaux fournisseurs s'enregistrent dans packages/plugins/src/index.ts.
gcloud, k8s et db arrivent bientôt.
pnpm install
pnpm build
pnpm typecheck
pnpm test
Pour une vérification pratique des règles sans toucher à un vrai compte cloud, le dépôt fournit un harnais de simulation http-mock et Moto/fab : (ps : fab l'interface en ligne de commande pour générer un environnement de test, actuellement privé, le projet de dépendance sera également rendu open-source)
pnpm mock:up <scenario> # boot a persistent mock instance
eval "$(pnpm -s mock:env <scenario>)" # point env vars at it
pnpm mock:run <scenario> # run the CLI against it
Merci à react-doctor
| Fournisseur | Commande | Authentification |
|---|
| AWS | cloud-doctor aws | Chaîne d'identification du SDK AWS — --profile, AWS_PROFILE, variables d'environnement, SSO, identité web |
| Cloudflare | cloud-doctor cloudflare | CLOUDFLARE_API_TOKEN |
| Vercel | cloud-doctor vercel | VERCEL_TOKEN (+ optionnel VERCEL_TEAM_ID) |
| Supabase | cloud-doctor supabase | SUPABASE_ACCESS_TOKEN |
| Render | cloud-doctor render | RENDER_API_KEY |
| Fly.io | cloud-doctor fly | FLY_API_TOKEN (+ optionnel FLY_ORG) |
| Railway | cloud-doctor railway | RAILWAY_API_TOKEN (jeton d'espace de travail/compte) |
| Paquet | Rôle |
|---|
packages/cloud-doctor | CLI (commander, prompts, ora) + API programmatique diagnose() |
packages/core | Registre de plugins, notation, chargement de configuration, types partagés |
packages/plugin-* | Un paquet par fournisseur — découverte d'identité + règles |
packages/plugins | Registre par défaut reliant tous les fournisseurs |