Перейти к содержанию

Быстрый старт

Запуск укладывается в три команды: установить, зайти в каталог проекта, набрать flower. Эта страница ставит их в самое начало, а потом рассказывает, что происходит на экране после нажатия Enter, как отвечать, когда он о чём-то спрашивает, и что проверять первым делом, если запустить не получилось.

Установить, зайти в каталог, набрать flower

curl -fsSL https://chenyuheee.github.io/flower/install.sh | sh
cd /path/to/your/project
flower

Первая строка — скрипт, который сам находит uv / pipx / pip и ставит команду flower; нужен только Python ≥ 3.10, ни Node, ни Claude Code CLI ставить не надо. Третья строка идёт без единого аргумента, и кавычки в shell тоже не нужны.

Если хочется другого способа установки (pipx / pip / из исходников) или этот скрипт на вашей машине не работает — смотрите Установку; но читать её целиком перед возвращением сюда не обязательно.

После нажатия Enter

При первом запуске на этой машине он сначала спросит учётные данные: API key или адрес шлюза. Настраивается один раз, сохраняется в ~/.config/flower/.env и дальше действует везде. Если на машине уже установлен и настроен Claude Code, он просто возьмёт тот token и ничего не спросит.

Учётные данные есть — курсор встаёт на >:

要做什么? 一句话就够,回车开始(Ctrl-C 退出)
> 帮我做一个 X

Эта строка читается со стандартного ввода, минуя разбор shell'ом — китайские кавычки, пробелы, восклицательные знаки можно вводить как есть.

Перед стартом он напечатает строку - 验一下凭证… — это настоящая проба API. Если учётные данные отвергнуты, будет ! 凭证被拒:… и тут же вопрос, не перенастроить ли их; если связи нет — (探针没打通:… —— 当作网络问题,照常开跑), и он не будет заставлять вас перенастраивать вполне рабочий token.

Проба прошла — начинается работа, и идёт она в три шага. Каждая строка с полосой == на экране — это граница шага, а 1/3 справа — прогресс:

== 确认需求 ======================================================== 1/3

  ? X 要跑在什么环境上?
     1) 只在我这台 macOS 上
     2) Linux 服务器
     3) 两个都要
你的回答 (回车=跳过,让它自己判断) > 1
  + 只在我这台 macOS 上

  ? 「做完了」以什么为准?
你的回答 (回车=跳过,让它自己判断) > 能跑起来,并且 pytest 全绿
  + 能跑起来,并且 pytest 全绿

  + 完成 9 轮 · $0.53 · 用时 6:02

== 设定目标 ======================================================== 2/3

  ~ 把这份需求拆成能当场验证的条目
  + 完成 12 轮 · $0.41 · 用时 9:06

== 干活 ============================================================ 3/3

  ~ 先看一眼现在有什么,再决定第一刀切哪
  * Read README.md
  > 派人 coder 实现 X 的第一版,带最小测试
  先让 coder 把骨架搭起来,我再看要不要拆第二个人。
  - 上下文 36.8K · 累计 $0.94 · 12:44
  + 完成 12 轮 · $12.34 · 用时 52:53
  + 完成 37 轮 · $1.40 · 用时 58:19

总花费 $14.68 · 清单 /path/to/your/project/runs/manifest.json

Значки всегда ASCII: ~ — размышление, * — вызов инструмента, > — отправка исполнителя, + — успех, x — провал, ? — вопрос, <- — продолжение прошлого раза. Не emoji: emoji и символы псевдографики вызывают откат шрифтовых глифов в терминале, на практике терминал из-за этого падал дважды. Все примеры вывода в этой документации используют именно этот набор ASCII — ровно то же, что у вас на экране.

Ещё на три места стоит посмотреть внимательнее:

  • Две последние строки + 完成 — не дубль. Первая относится к раунду работы, вторая — к раунду вердикта: вердикт выносится в собственной сессии, но отдельной полосы == не заводит, потому что это раунд внутри шага 干活. В манифесте запуска он называется 干活·判定#1.
  • $ в строке + 完成 — это деньги за этот раунд, а 用时 — общее время с начала запуска до текущего момента; это две разные мерки.
  • Строки состояния вида - 上下文 … · 累计 … · … следуют только за главным потоком, контекст subagent'ов в них не входит. Вызовы инструментов subagent'ов по умолчанию показываются с отступом за вертикальной чертой |; а вот то, что они говорят, видно только с -v — это происходящее на месте, а не решения.

Кто выполняет каждый из этих трёх шагов

Шаг на экране Кто выполняет Что делает Замораживается в Подробности
确认需求 Уточнитель Только спрашивает, руками ничего не делает, спрашивает, пока не станет ясно, без ограничения на число раундов; на выходе — бриф из четырёх разделов .flower/notes/需求.md Предварительное уточнение
设定目标 Судья Переводит бриф в «цель + список критериев вердикта», каждый пункт обязан проверяться на месте .flower/notes/目标.md Страж цели
干活 Координатор отправляет subagent'ов Координатор режет работу, отправляет исполнителей, читает отчёты, принимает решения; в конце каждого раунда судья, не участвовавший в работе, независимо решает, «сделано или нет», и при недостижении возвращает работу обратно Сам код Страж цели

Первые два шага — это воплощение двух механизмов, предварительного уточнения и стража цели; третий шаг — тот отрезок, которым они управляют вместе. По умолчанию не больше 3 раундов вердикта (--rounds), а --no-goal выключает всё это целиком — после выключения «он сказал, что сделал» действительно означает «сделано».

У вердикта только три исхода: достигнуто, не достигнуто и в этой среде не проверить. Последние два — разные исходы: «здесь не проверить» никогда не засчитывается как прохождение, вместо этого он останавливается и спрашивает вас.

Один полный запуск стоит недёшево. Замеренные ориентиры: HT002 — поставить существующий проект на macOS и запустить: 4 шага, около 1 часа, $38.24; HT001 — написать терминальную IDE с нуля: 10.4 часа, $171.62. Если хочется сначала посмотреть, о чём он будет спрашивать, и только потом решать, идти ли дальше — есть --clarify-only.

Как отвечать на вопросы

Блок, начинающийся с ?, — это он спрашивает вас. Отвечать можно тремя способами:

  • Ввести номер (1 / 2 / 3) — выбрать этот вариант, экран ответит строкой + <выбранный вариант>.
  • Просто напечатать текст — свободный ответ, не обязательно из списка вариантов.
  • Просто Enter — пропустить, пусть решает сам; экран ответит строкой . 已跳过.

По умолчанию он ждёт вас 1800 секунд (--timeout). Не дождавшись, печатает ! 无人应答 —— 它会自己判断,把假设记进「未知与假设」 и идёт дальше, не зависая. Число вопросов по умолчанию не ограничено (--asks по умолчанию -1); положительное число — жёсткая квота, при её исчерпании печатается ! 提问额度用完.

Пока он работает, вы можете говорить

В самом низу экрана всегда есть строка приглашения, куда можно печатать. Это не украшение: перед каждой порцией вывода она стирается, после — перерисовывается, поэтому её не смывает наверх логами. Текстов два, переключаются по признаку «есть ли неотвеченный вопрос»:

你的回答 (回车=跳过,让它自己判断) >
(直接说 = 加需求,下个检查点送达;? 开头 = 顺便问一句,不打扰它干活) >

Когда неотвеченных вопросов нет, вам доступны две вещи.

Просто напечатать фразу = добавить требование. Его при этом не прерывают, он увидит её при следующей проверке входящих. Квитанция выглядит так:

+ 收到 (它下次查收件箱时会看到;已追加进确认书)

«Добавлено в бриф» здесь важно: фраза одновременно ложится в 需求.md, поэтому переживает границу шага — следующий шаг это новая сессия, она читает только замороженные файлы, и без сброса на диск сказанное равносильно несказанному.

Начать с ? = задать вопрос попутно. Он заведёт отдельную сессию только для чтения и ответит вам; на руках у неё лишь последние 60 событий и содержимое верстака. Эту боковую ветку ведёт оракул, потолок по умолчанию — 12 раундов / $0.5:

? 现在到哪了
# 旁路
  在干活第二轮,coder 刚补完 parser 的测试,正在跑第三次验证。
  ($0.0123,没有打扰正在跑的运行)

Ответил — выбросил: этот диалог не попадает в контекст текущего запуска, а расходы не попадают в основной манифест запуска — они пишутся в собственный файл под runs/aside/. Так что вопрос не влияет на запуск, и жалеть о попавших в счёт деньгах не приходится.

Полноширинный не считается, нужен именно ASCII ?

Боковой вопрос распознаётся только по ASCII ? (0x3f). Полноширинный , который по умолчанию выдаёт китайская раскладка, не распознаётся — такая строка уйдёт во входящие как «добавить требование», без ошибки, просто ответ, которого вы ждёте, не придёт никогда. Это опечатка в коде, она уже занесена в список дефектов; пока её не починили, перед вводом ? переключайте раскладку на английскую.

Заодно про Ctrl+C: первое нажатие во время работы — это прервать текущий раунд и сказать что-нибудь, а не выйти.

! 已打断这一轮。正在跑的 subagent 会丢掉半成品。
  要说什么?(直接回车 = 什么都不说,接着跑;再按一次 Ctrl+C = 退出)
>

Выход происходит только со второго нажатия. (А вот Ctrl-C на самом первом приглашении 要做什么? выходит сразу и печатает 已取消.)

Повторный запуск продолжает прошлый

Наберите flower в том же каталоге ещё раз — и первая фраза уже другая:

接着上次? 直接回车 = 接着做;也可以说点新的;/new = 重开一件事(Ctrl-C 退出)
> 顺便支持代码块高亮
<- 在 ~/proj 接上上次  需求已确认 · 目标 7 条 · 干活上下文 71.4K · 第 3 次唤醒

Строка с <- — это баннер пробуждения, он сообщает текущее состояние этого каталога. Он не станет заново допрашивать вас про требования и не будет заново ставить цели; так же и после kill процесса, и после перезагрузки машины. Сказанная в этот момент фраза добавляется в 需求.md и запускает повторный вывод списка критериев вердикта — без пересчёта судья читал бы старый список, и добавленное вами в вердикт вообще не попало бы. Детали и цена (контекст будет только расти) — в непрерывности.

Не хотите продолжать прошлое — введите /new: требования, цели и родословная предыдущего отрезка будут перемещены в notes/archive/<时间戳>/ (не удалены), и всё начнётся с нуля.

В скриптах, без присмотра

Запрос можно передать и прямо аргументом, а флаги писать хоть до него, хоть после:

flower "帮我做一个 X"                      # запрос как аргумент
flower --rounds 5 "帮我做一个 X"           # флаги впереди
flower "帮我做一个 X" --rounds 5           # флаги в конце, то же самое
echo "帮我做一个 X" | flower --timeout 0   # подача на stdin через пайп, полная автоматика

Можно дать только флаги без запроса — flower --clarify-only сначала спросит, что делать, и пойдёт дальше.

Почему путь «сначала Enter, потом ввод» вообще сохранён. Пара кавычек в командной строке — чистая обуза. Наступали на практике: правая кавычка была набрана китайской , zsh продолжал ждать настоящую закрывающую кавычку (проваливался в приглашение продолжения dquote>), выглядело это как зависшая программа, хотя она не стартовала ни разу. Голый flower читает стандартный ввод, минуя разбор shell'ом: китайские кавычки, пробелы, восклицательные знаки, переводы строк — всё вводится как есть. Вариант с пайпом идёт через тот же вход — когда стандартный ввод не терминал, он не печатает шапку приглашения, а просто читает строку.

Без присмотра обязательно явно указывать --timeout 0

В пайпе, под nohup, в CI отвечать на вопросы некому. Без --timeout 0 получится вот что: первый вопрос будет пропущен из-за «ввод закрыт», а каждый следующий вопрос будет впустую ждать все 1800 секунд — несколько вопросов превращаются в несколько часов холостого хода, и всё это время жгутся деньги. --timeout 0 заставляет все вопросы мгновенно возвращать «никто не ответил», и он идёт дальше, решая сам. Когда стандартный ввод не терминал, flower сначала печатает предупреждение: ! 标准输入不是终端,没人能回答提问。想让它自己判断就加 --timeout 0

Если не запускается

Набрали flower и нет реакции, ругается на учётные данные или вывод сразу выглядит неправильно — сначала проверьте учётные данные и бинарник по отдельности самым дешёвым выстрелом. Один агент, инструменты только на чтение, один выстрел — видно, проходит ли с обоих концов:

flower -v -w /path/to/any/repo once "读一眼这个仓库,一句话说它是干什么的"
Часть Что это
once Один запуск одного агента: без уточнения требований, без постановки целей, без отправки исполнителей
-w PATH Рабочий каталог агента. Не указан — текущий каталог
-v Перед стартом печатает действующую конфигурацию учётных данных, от token остаются первые 4 символа

once по умолчанию даёт только три инструмента — Read, Glob, Grep; писать он ничего не может, поэтому выстрел дешёвый. Замеренный ориентир: Opus 5 с окном в 1 миллион через сторонний шлюз — нижняя планка одного раунда $0.1741, у дешёвых моделей ниже. Раздел «проверить, что установилось» на странице Установки выполняет именно эту команду.

Если проходит, форма будет такой — цифры и текст будут другими, значки нет:

ANTHROPIC_AUTH_TOKEN = sk-1***(共 19 位)
ANTHROPIC_BASE_URL = https://your-gateway.example.com
ANTHROPIC_MODEL = claude-opus-5[1m]
- 验一下凭证…
  ~ 先看目录结构,再挑一两个文件读
  * Glob **/*.py
  * Read README.md
  这是一个用 Rust 写的命令行 HTTP 压测工具。
  - 累计 $0.00 · 0:00
  + 完成 4 轮 · $0.0932 · 用时 0:00

Две вещи надо распознать:

  • Первые строки — действующая конфигурация, напечатанная из-за -v. Подключение не к тому шлюзу видно сразу — это главная причина, по которой флаг существует.
  • $ в строке + 完成 настоящий, а 累计 и 用时 на пути once всегда равны 0 (на каждое событие создаётся новый рендерер, состояние не накапливается).

Если этот выстрел проходит — значит, учётные данные, шлюз, имя модели и встроенный бинарник в порядке, проблема где-то в другом месте. Если не проходит — это относится к установке, возвращайтесь к Установке.

Что читать дальше

Хочу узнать Читать
Что вообще означают эти слова на экране Основные понятия
Все подкоманды и флаги, без единого пропуска Справочник CLI
Почему он сначала задаёт кучу вопросов и как заставить спрашивать меньше Предварительное уточнение
Кто решает, «сделано или нет», и как писать список критериев вердикта Страж цели
Почему повторный запуск в том же каталоге продолжает прошлый Непрерывность
Что он делает, когда контекст заполнился (это не compact) Передача
Учётные данные, шлюз, имя модели, переменные окружения Справочник конфигурации
Заменить терминал, подключить Web / TUI / полную автоматику Слой взаимодействия
Не использовать встроенные три шага, написать свой процесс Проектирование процесса · Python API
Что на самом деле происходит за один настоящий долгий запуск HT001 · HT002
Точное определение какого-то термина Глоссарий