@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 primaryAPI-ключи
Персональные ключи начинаются с 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 и запишите заявки, которые были действительно поданы.
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Заявка под управлением агента
Для работы по одной заявке позвольте агенту создать и осмотреть кит, скопировать сопроводительное письмо и провести запись трекера через реальный поток статусов заявки.
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 объекты прогресса выводятся по одному на строку перед финальным результатом.
{ "email": string|null, "role": string|null, "refCode": string|null,
"userId": string, "profile": string|null,
"auth": "oauth"|"api_key"|"env_api_key" }{ "active": string|null, "activeSource": string, "envApiKey": boolean,
"accounts": [{ "name": string, "type": "oauth"|"api_key",
"email": string|null, "apiKeyMasked": string|null, "active": boolean }] }{ "id": string, "name": string, "key": string, "masked": string,
"status": "active", "createdAt": string, "expiresAt": string|null,
"lastUsedAt": null, "revokedAt": null }{ "keys": [{ "id": string, "name": string, "masked": string,
"status": "active"|"revoked"|"expired", "createdAt": string,
"expiresAt": string|null, "lastUsedAt": string|null,
"revokedAt": string|null }] }{ "cvs": [{ "id": string, "name": string|null, "updatedAt": string }] }{ "id": string, "name": string|null, "yaml": string }{ "id": string, "name": string|null, "created": boolean,
"warnings": string[], "dashboardUrl": string }{ "plan": string, "credits": number, "cost": number,
"premiumCost": number, "canAfford": boolean }{ "applyKitId": string }{ "phase": string, "at": string }{ "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 }{ "kits": [{ "id": string, "createdAt": string, "status": string|null,
"jobTitle": string|null, "company": string|null, "intensity": string|null,
"tone": string|null, "length": string|null }] }{ "applyKitId": string, "pageCount": number|null, "out": string|null,
"dashboardUrl": string, "hint"?: string }{ "applyKitId": string, "tailoredFileId"?: string,
"pageCountBefore": number|null, "pageCountAfter": number|null,
"changed": boolean, "dashboardUrl": string }{ "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 }] }{ "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 }{ "id": string, "deleted": true }{ "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.