Быстрый старт¶
Запуск укладывается в три команды: установить, зайти в каталог проекта, набрать flower. Эта страница ставит их в самое начало, а потом рассказывает, что происходит на экране после нажатия Enter, как отвечать, когда он о чём-то спрашивает, и что проверять первым делом, если запустить не получилось.
Установить, зайти в каталог, набрать flower¶
Первая строка — скрипт, который сам находит uv / pipx / pip и ставит команду flower; нужен только Python ≥ 3.10, ни Node, ни Claude Code CLI ставить не надо. Третья строка идёт без единого аргумента, и кавычки в shell тоже не нужны.
Если хочется другого способа установки (pipx / pip / из исходников) или этот скрипт на вашей машине не работает — смотрите Установку; но читать её целиком перед возвращением сюда не обязательно.
После нажатия Enter¶
При первом запуске на этой машине он сначала спросит учётные данные: API key или адрес шлюза. Настраивается один раз, сохраняется в ~/.config/flower/.env и дальше действует везде. Если на машине уже установлен и настроен Claude Code, он просто возьмёт тот token и ничего не спросит.
Учётные данные есть — курсор встаёт на >:
Эта строка читается со стандартного ввода, минуя разбор 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:
Ответил — выбросил: этот диалог не попадает в контекст текущего запуска, а расходы не попадают в основной манифест запуска — они пишутся в собственный файл под runs/aside/. Так что вопрос не влияет на запуск, и жалеть о попавших в счёт деньгах не приходится.
Полноширинный ? не считается, нужен именно ASCII ?
Боковой вопрос распознаётся только по ASCII ? (0x3f). Полноширинный ?, который по умолчанию выдаёт китайская раскладка, не распознаётся — такая строка уйдёт во входящие как «добавить требование», без ошибки, просто ответ, которого вы ждёте, не придёт никогда. Это опечатка в коде, она уже занесена в список дефектов; пока её не починили, перед вводом ? переключайте раскладку на английскую.
Заодно про 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 и нет реакции, ругается на учётные данные или вывод сразу выглядит неправильно — сначала проверьте учётные данные и бинарник по отдельности самым дешёвым выстрелом. Один агент, инструменты только на чтение, один выстрел — видно, проходит ли с обоих концов:
| Часть | Что это |
|---|---|
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 |
| Точное определение какого-то термина | Глоссарий |