Skip to content

@roasted/cli

Полный справочник CLI

Неинтерактивный харнес для поиска работы для людей и агентов. Начните с одного исходного резюме, создайте адаптированный кит для каждой вакансии, отрендерите PDF и запишите заявку.

Установка и старт

Установите глобальный пакет и следуйте золотому пути ниже. Исполняемый файл называется roasted. Он включает продакшн-настройки подключения, поэтому настройка окружения не требуется.

терминал
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>

Ориентация для агентов

Каждая команда принимает --json, каждый ввод может поступать из флагов или stdin, и ничего не запрашивается после вызова. Агентам следует парсить stdout и ветвиться по стабильным кодам ошибок, а не по тексту сообщений.

  • Успех завершается кодом 0. Любая ошибка завершается кодом 1 и возвращает объект ошибки в режиме JSON.
  • apply create --no-wait немедленно возвращает ID apply-кита для fan-out и последующего опроса.
  • apply create --watch стримит по одной NDJSON-строке на фазу перед финальным результатом.
  • ROASTED_API_KEY переопределяет сохранённые профили для эфемерных headless-запусков.
  • --profile или ROASTED_PROFILE выбирает именованный аккаунт без переключения глобального состояния.

Аутентификация и профили

Вход в браузере использует PKCE. Сессии хранятся в ~/.roasted/profiles.json с правами только для владельца, где это поддерживается. Порядок выбора: ROASTED_API_KEY, --profile, ROASTED_PROFILE, затем активный профиль. OAuth-сессии обновляются автоматически. Профили с API-ключом заново обменивают сохранённый ключ, когда сессия истекает.

терминал
roasted login --profile primary
roasted login --profile second --api-key -
roasted accounts
roasted switch second
roasted cv list --profile primary

API-ключи

Персональные ключи начинаются с rmt_pat_ и показываются один раз. Сервер хранит только их хэш. Используйте --api-key -, чтобы прочитать ключ из stdin и не оставлять его в истории shell.

терминал
roasted keys create ci-runner --ttl never
roasted login --api-key rmt_pat_...
ROASTED_API_KEY=rmt_pat_... roasted cv list

Справочник команд

Аутентификация и аккаунты

КомандаНазначение
roasted login [--api-key <key|->]Войти через браузерный PKCE или API-ключ.
roasted accountsПоказать список профилей и активный.
roasted switch <name>Сделать именованный профиль активным.
roasted whoamiПоказать текущую личность, роль, реферальный код и профиль.
roasted logout [--all]Удалить выбранный профиль или все профили.
roasted keys create <name> [--ttl <ttl>]Создать персональный API-ключ со сроком действия 30d, 90d, 1y или never.
roasted keys listПоказать список ключей со статусом и последним использованием.
roasted keys revoke <id|name>Отозвать ключ по ID или имени.

Резюме

КомандаНазначение
roasted cv listПоказать резюме аккаунта, сначала новые.
roasted cv search <query>Отфильтровать резюме по имени.
roasted cv pull <id|name> [--out file]Скачать YAML резюме в stdout или файл.
roasted cv push <file> [--id <id>] [--name <name>]Создать или обновить резюме из валидированного YAML или JSON.

Apply-киты

КомандаНазначение
roasted apply planПоказать план, баланс кредитов и стоимость китов.
roasted apply create --cv <id|name>Сгенерировать адаптированное резюме и сопроводительное письмо. Это тратит кредиты.
roasted apply listПоказать список apply-китов, сначала новые.
roasted apply get <id>Прочитать статус и результаты. Добавьте --pages, чтобы отрендерить и посчитать страницы.
roasted apply cv <kitId> [--out file]Скачать YAML адаптированного резюме.
roasted apply push <kitId> <file.yaml>Проверить и загрузить отредактированное вручную адаптированное резюме.
roasted apply pdf <id>Отрендерить серверную копию адаптированного резюме локально.
roasted apply shrink <id>Подогнать адаптированное резюме под одну страницу. Это может потратить кредит.

Трекер заявок

КомандаНазначение
roasted app list [--status <status>]Показать список заявок, при необходимости отфильтрованных по статусу.
roasted app get <id>Прочитать полную запись заявки.
roasted app addСоздать заявку вручную или из готового apply-кита.
roasted app status <id> <status>Изменить статус и опционально задать финальный результат или заметку.
roasted app note <id> <text>Задать заметки. Пустое значение очищает их.
roasted app rm <id>Удалить заявку.

Поток apply-кита

Команда create по умолчанию ждёт, затем выводит результат и URL дашборда. Используйте get для дешёвого опроса и добавляйте --pages только когда нужно количество страниц. Ссылки на резюме разрешаются по точному ID, затем по уникальному совпадению имени без учёта регистра.

терминал
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>

Описание вакансии и флаги формирования

Укажите ровно один из --jd-file, --jd или --jd-stdin. Текст короче 50 символов отклоняется. Формируйте результат с помощью intensity safe|smart|bold, tone auto|professional|confident|conversational, length concise|standard|detailed, formality formal|neutral|casual, флагов language и instruction, --premium и переключателя сопроводительного письма. Недопустимые значения дают сбой до того, как потратятся кредиты.

Безопасное редактирование адаптированного резюме

Скачайте через apply cv, отредактируйте локально, затем загрузите через apply push перед рендерингом. Серверная копия каноническая. Если вы пропустите push, apply pdf заново отрендерит старую серверную версию и проигнорирует локальные изменения.

PDF и подгонка под одну страницу

apply pdf использует локальный бинарник typst. Без него команда завершается успешно со ссылкой на дашборд и подсказкой по установке. apply shrink проверяет количество страниц, когда доступен рендерер, останавливается без трат, если резюме уже помещается, и сохраняет обновлённый YAML обратно в кит.

Что стоит денег

  • Бесплатно: вход, управление аккаунтом и ключами, команды резюме, проверки плана и чтение трекера.
  • Hunter Pass плюс кредиты: apply create и apply shrink. Предварительная проверка отклоняет бесплатные планы или недостаточный баланс до генерации.
  • Hunter Pass: создание записей в трекере, включая записи, перенесённые из apply-кита. Статус, заметки, удаление и чтение не ограничены.
  • Сбои генерации возвращаются бэкендом. CLI никогда не меняет балансы сам.

Сквозные плейбуки

Пакетная воронка

Загрузите одно исходное резюме, стартуйте по одному киту на каждое сохранённое описание вакансии без ожидания, опросите каждый ID, отрендерите PDF и запишите заявки, которые были действительно поданы.

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

Заявка под управлением агента

Для работы по одной заявке позвольте агенту создать и осмотреть кит, скопировать сопроводительное письмо и провести запись трекера через реальный поток статусов заявки.

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

Схемы JSON-вывода

Примеры ниже показывают формы, критичные для оркестрации. Nullable-поля остаются присутствующими. В режиме watch объекты прогресса выводятся по одному на строку перед финальным результатом.

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 } }

Команды со списком оборачивают строки в массивы cvs, kits, applications или keys. Команды с деталями возвращают полную запись, включая nullable-метаданные вакансии, таймстампы, ID связанных файлов, исходное содержимое и URL дашборда.

Коды выхода и каталог ошибок

Все команды завершаются кодом 0 при успехе и 1 при любой ошибке. В режиме JSON проверяйте error.code. Коды ошибок бэкенда от генерации и сжатия проходят без изменений. PAID_PLAN_REQUIRED на бесплатном аккаунте не сбой, а ожидаемое поведение: apply-киты и новые записи в трекере требуют активный Hunter Pass, и подписка снимает этот код.

  • Аутентификация и профили: 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.
  • Резюме и apply-киты: 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.
  • Трекер: BAD_STATUS, BAD_OUTCOME, OUTCOME_REQUIRES_CLOSED, APP_EMPTY, APP_ARG_CONFLICT, PAID_PLAN_REQUIRED, KIT_NOT_READY, NOT_FOUND.