Skip to content

@roasted/cli

Référence CLI complète

Un harnais de recherche d'emploi non interactif pour les personnes et les agents. Commencez par un seul CV source, créez un kit sur mesure pour chaque poste, générez le PDF et enregistrez la candidature.

Installer et démarrer

Installez le paquet global et suivez le chemin idéal ci-dessous. L'exécutable est roasted. Il inclut les paramètres de connexion de production, donc aucune configuration d'environnement n'est requise.

terminal
npm i -g @roasted/cli
roasted login
roasted cv push ./resume.yaml --name "Backend Engineer"
roasted apply plan
roasted apply create --cv "Backend Engineer" --jd-file ./jd.txt
roasted apply pdf <applyKitId> --out resume.pdf
roasted app add --from-kit <applyKitId>

Orientation pour agents

Chaque commande accepte --json, chaque entrée peut provenir de flags ou de stdin, et rien ne demande de saisie après l'invocation. Les agents devraient parser stdout et se brancher sur des codes d'erreur stables plutôt que sur le texte du message.

  • Le succès se termine par 0. Toute erreur se termine par 1 et renvoie un objet d'erreur en mode JSON.
  • apply create --no-wait renvoie immédiatement l'ID du kit de candidature pour la parallélisation et le polling ultérieur.
  • apply create --watch diffuse une ligne NDJSON par phase avant le résultat final.
  • ROASTED_API_KEY remplace les profils stockés pour les exécutions headless éphémères.
  • --profile ou ROASTED_PROFILE sélectionne un compte nommé sans changer l'état global.

Authentification et profils

La connexion par navigateur utilise PKCE. Les sessions vivent dans ~/.roasted/profiles.json avec des permissions réservées au propriétaire lorsque cela est pris en charge. L'ordre de sélection est ROASTED_API_KEY, --profile, ROASTED_PROFILE, puis le profil actif. Les sessions OAuth se rafraîchissent automatiquement. Les profils à clé d'API rééchangent leur clé stockée lorsqu'une session expire.

terminal
roasted login --profile primary
roasted login --profile second --api-key -
roasted accounts
roasted switch second
roasted cv list --profile primary

Clés d'API

Les clés personnelles commencent par rmt_pat_ et ne sont affichées qu'une fois. Seul leur hash est stocké par le serveur. Utilisez --api-key - pour lire une clé depuis stdin et la garder hors de l'historique du shell.

terminal
roasted keys create ci-runner --ttl never
roasted login --api-key rmt_pat_...
ROASTED_API_KEY=rmt_pat_... roasted cv list

Référence des commandes

Authentification et comptes

CommandeObjectif
roasted login [--api-key <key|->]Se connecter via PKCE navigateur ou une clé d'API.
roasted accountsLister les profils et afficher celui qui est actif.
roasted switch <name>Rendre actif un profil nommé.
roasted whoamiAfficher l'identité actuelle, le rôle, le code de parrainage et le profil.
roasted logout [--all]Supprimer le profil sélectionné ou tous les profils.
roasted keys create <name> [--ttl <ttl>]Créer une clé d'API personnelle avec une expiration 30d, 90d, 1y ou never.
roasted keys listLister les clés avec leur statut et leur dernière utilisation.
roasted keys revoke <id|name>Révoquer une clé par ID ou par nom.

CV

CommandeObjectif
roasted cv listLister les CV du compte, du plus récent au plus ancien.
roasted cv search <query>Filtrer les CV par nom.
roasted cv pull <id|name> [--out file]Télécharger le YAML du CV vers stdout ou un fichier.
roasted cv push <file> [--id <id>] [--name <name>]Créer ou mettre à jour un CV à partir de YAML ou JSON validé.

Kits de candidature

CommandeObjectif
roasted apply planAfficher le forfait, le solde de crédits et les coûts des kits.
roasted apply create --cv <id|name>Générer un CV sur mesure et une lettre de motivation. Cela consomme des crédits.
roasted apply listLister les kits de candidature, du plus récent au plus ancien.
roasted apply get <id>Lire le statut et les résultats. Ajoutez --pages pour générer et compter les pages.
roasted apply cv <kitId> [--out file]Télécharger le YAML du CV sur mesure.
roasted apply push <kitId> <file.yaml>Valider et téléverser un CV sur mesure édité à la main.
roasted apply pdf <id>Générer localement la copie serveur du CV sur mesure.
roasted apply shrink <id>Ajuster le CV sur mesure à une page. Cela peut consommer un crédit.

Suivi des candidatures

CommandeObjectif
roasted app list [--status <status>]Lister les candidatures, éventuellement filtrées par statut.
roasted app get <id>Lire une fiche de candidature complète.
roasted app addCréer une candidature manuellement ou à partir d'un kit de candidature prêt.
roasted app status <id> <status>Changer le statut et définir éventuellement un résultat de clôture ou une note.
roasted app note <id> <text>Définir des notes. Une valeur vide les efface.
roasted app rm <id>Supprimer une candidature.

Flux du kit de candidature

La commande create attend par défaut, puis affiche le résultat et l'URL du tableau de bord. Utilisez get pour un polling peu coûteux et n'ajoutez --pages que lorsque le nombre de pages est nécessaire. Les références de CV se résolvent par ID exact, puis par une correspondance de nom unique insensible à la casse.

terminal
roasted cv list
roasted apply plan
roasted apply create --cv "Backend Engineer" --jd-file ./jd.txt \
  --intensity smart --tone professional --length concise
roasted apply get <id> --pages --json
roasted apply cv <id> --out tailored.yaml
roasted apply push <id> tailored.yaml
roasted apply pdf <id> --out resume.pdf
roasted apply shrink <id>

Description de poste et flags de mise en forme

Fournissez exactement l'un de --jd-file, --jd ou --jd-stdin. Un texte de moins de 50 caractères est rejeté. Mettez en forme le résultat avec intensity safe|smart|bold, tone auto|professional|confident|conversational, length concise|standard|detailed, formality formal|neutral|casual, les flags de langue et d'instruction, --premium et le toggle de lettre de motivation. Les valeurs invalides échouent avant que des crédits ne soient dépensés.

Éditer le CV sur mesure en toute sécurité

Téléchargez avec apply cv, éditez localement, puis téléversez avec apply push avant de générer. La copie serveur fait foi. Si vous sautez le push, apply pdf regénère l'ancienne version serveur et ignore les modifications locales.

PDF et ajustement à une page

apply pdf utilise le binaire typst local. Sans lui, la commande se termine avec succès avec un lien vers le tableau de bord et une indication d'installation. apply shrink vérifie le nombre de pages lorsqu'un générateur est disponible, s'arrête sans rien dépenser si le CV tient déjà, et enregistre le YAML révisé dans le kit.

Ce qui coûte de l'argent

  • Gratuit : connexion, gestion des comptes et des clés, commandes de CV, vérifications du forfait et lectures du suivi.
  • Hunter Pass plus crédits : apply create et apply shrink. Un contrôle préalable rejette les forfaits gratuits ou les soldes insuffisants avant la génération.
  • Hunter Pass : créer des entrées de suivi, y compris les entrées reliées à un kit de candidature. Le statut, les notes, la suppression et les lectures ne sont pas bloqués.
  • Les échecs de génération sont remboursés par le backend. La CLI ne modifie jamais les soldes elle-même.

Playbooks de bout en bout

Pipeline par lots

Poussez un seul CV source, lancez un kit par description de poste enregistrée sans attendre, faites le polling de chaque ID, générez les PDF et enregistrez les candidatures réellement soumises.

shell
roasted cv push ./canon-resume.yaml --name "Backend Engineer" --json
CV=$(roasted cv list --json | jq -r '.cvs[] | select(.name=="Backend Engineer") | .id')
for jd in jds/*.txt; do
  roasted apply create --cv "$CV" --jd-file "$jd" --no-wait --json
done > kits.ndjson
jq -r '.applyKitId' kits.ndjson | while read -r id; do
  while :; do
    kit=$(roasted apply get "$id" --json) || { printf 'Retrying kit %s
' "$id" >&2; sleep 2; continue; }
    status=$(printf '%s' "$kit" | jq -r '.status')
    case "$status" in
      ready) break ;;
      generating) sleep 2 ;;
      *) printf 'Kit %s stopped with status: %s
' "$id" "$status" >&2; continue 2 ;;
    esac
  done
  roasted apply pdf "$id" --out "out/$id.pdf" --json
  roasted app add --from-kit "$id" --status applied --json
done

Candidature pilotée par un agent

Pour un travail à la fois, laissez l'agent créer et inspecter le kit, copier la lettre de motivation et faire progresser la fiche de suivi à travers le vrai flux de statuts de candidature.

shell
roasted apply create --cv "QA Engineer" --jd-file ./jd.txt \
  --cv-lang en --cl-lang en --intensity smart --json
ID=<applyKitId>
roasted apply get "$ID" --pages --json
roasted apply shrink "$ID" --json
roasted apply get "$ID" --json | jq -r '.coverLetter' > cover-letter.txt
roasted app add --from-kit "$ID" --status saved --json
roasted app status <appId> applied --json
roasted app status <appId> interviewing --json
roasted app status <appId> closed --outcome offer --json

Schémas de sortie JSON

Les exemples ci-dessous montrent les formes critiques pour l'orchestration. Les champs nullables restent présents. En mode watch, les objets de progression sont émis une ligne par ligne avant le résultat final.

whoami
{ "email": string|null, "role": string|null, "refCode": string|null,
  "userId": string, "profile": string|null,
  "auth": "oauth"|"api_key"|"env_api_key" }
accounts
{ "active": string|null, "activeSource": string, "envApiKey": boolean,
  "accounts": [{ "name": string, "type": "oauth"|"api_key",
    "email": string|null, "apiKeyMasked": string|null, "active": boolean }] }
keys create
{ "id": string, "name": string, "key": string, "masked": string,
  "status": "active", "createdAt": string, "expiresAt": string|null,
  "lastUsedAt": null, "revokedAt": null }
keys list
{ "keys": [{ "id": string, "name": string, "masked": string,
  "status": "active"|"revoked"|"expired", "createdAt": string,
  "expiresAt": string|null, "lastUsedAt": string|null,
  "revokedAt": string|null }] }
cv list / cv search
{ "cvs": [{ "id": string, "name": string|null, "updatedAt": string }] }
cv pull
{ "id": string, "name": string|null, "yaml": string }
cv push
{ "id": string, "name": string|null, "created": boolean,
  "warnings": string[], "dashboardUrl": string }
apply plan
{ "plan": string, "credits": number, "cost": number,
  "premiumCost": number, "canAfford": boolean }
apply create --no-wait
{ "applyKitId": string }
apply create --watch
{ "phase": string, "at": string }
apply create / apply get
{ "id": string, "createdAt": string,
  "status": "generating"|"ready"|"failed", "progressStep": string|null,
  "jobTitle": string|null, "company": string|null, "location": string|null,
  "seniority": string|null, "salaryRange": string|null, "techStack": string[],
  "keyRequirements": string[], "niceToHave": string[], "deadline": string|null,
  "intensity": string|null, "tone": string|null, "length": string|null,
  "coverLetter": string|null, "includeCoverLetter": boolean, "premium": boolean,
  "sourceCvFileId": string|null, "tailoredFileId": string|null,
  "failureReason": string|null, "generatedAt": string|null,
  "dashboardUrl": string, "pageCount": number|null }
apply list
{ "kits": [{ "id": string, "createdAt": string, "status": string|null,
  "jobTitle": string|null, "company": string|null, "intensity": string|null,
  "tone": string|null, "length": string|null }] }
apply pdf
{ "applyKitId": string, "pageCount": number|null, "out": string|null,
  "dashboardUrl": string, "hint"?: string }
apply shrink
{ "applyKitId": string, "tailoredFileId"?: string,
  "pageCountBefore": number|null, "pageCountAfter": number|null,
  "changed": boolean, "dashboardUrl": string }
app list
{ "applications": [{ "id": string, "status": string|null,
  "outcome": string|null, "company": string|null, "position": string|null,
  "location": string|null, "source": string|null, "appliedAt": string|null,
  "createdAt": string, "updatedAt": string }] }
app get / add / save / status / note
{ "id": string, "status": string|null, "outcome": string|null,
  "company": string|null, "position": string|null, "location": string|null,
  "salaryRange": string|null, "seniority": string|null, "sourceUrl": string|null,
  "contactPerson": string|null, "contactEmail": string|null, "deadline": string|null,
  "cvFileId": string|null, "applyKitId": string|null, "appliedAt": string|null,
  "source": string|null, "jdText": string|null, "coverLetter": string|null,
  "notes": string|null, "techStack": string[], "keyRequirements": string[],
  "niceToHave": string[], "createdAt": string, "updatedAt": string,
  "dashboardUrl": string }
app rm
{ "id": string, "deleted": true }
error
{ "error": { "code": string, "message": string } }

Les commandes de liste enveloppent les lignes dans des tableaux cvs, kits, applications ou keys. Les commandes de détail renvoient la fiche complète, y compris les métadonnées de poste nullables, les horodatages, les ID de fichiers liés, le contenu source et l'URL du tableau de bord.

Codes de sortie et catalogue d'erreurs

Toutes les commandes se terminent par 0 en cas de succès et 1 en cas d'erreur. En mode JSON, inspectez error.code. Les codes d'erreur backend issus de la génération et de la réduction passent inchangés. PAID_PLAN_REQUIRED sur un compte gratuit est un comportement attendu, pas une panne : les kits de candidature et les nouvelles entrées de suivi demandent un Hunter Pass actif, et s'abonner lève ce code.

  • Authentification et profils : NO_SESSION, SESSION_EXPIRED, AUTH_UNAVAILABLE, BAD_PROFILE, PROFILE_NOT_FOUND, PROFILE_STORE_CORRUPT, API_KEY_INVALID, API_KEY_EXCHANGE_FAILED, BAD_KEY_NAME, BAD_TTL, KEY_NOT_FOUND, KEY_AMBIGUOUS.
  • CV et kits de candidature : CV_NOT_FOUND, CV_AMBIGUOUS, BAD_CV_YAML, FILE_NOT_FOUND, JD_MISSING, JD_CONFLICT, JD_TOO_SHORT, BAD_INTENSITY, BAD_TONE, BAD_LENGTH, BAD_FORMALITY, PAID_PLAN_REQUIRED, INSUFFICIENT_CREDITS, NOT_FOUND, NO_TAILORED_FILE, NO_YAML, NO_CV_CONTENT, TYPST_COMPILE_FAILED, KIT_TIMEOUT.
  • Suivi : BAD_STATUS, BAD_OUTCOME, OUTCOME_REQUIRES_CLOSED, APP_EMPTY, APP_ARG_CONFLICT, PAID_PLAN_REQUIRED, KIT_NOT_READY, NOT_FOUND.