@taskless-app/swarm 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -76
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,89 +1,28 @@
|
|
|
1
|
-
# @taskless/swarm
|
|
1
|
+
# @taskless-app/swarm
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Рой AI-агентов, которые пишут код за вас — под управлением [Taskless](https://taskless.ru).
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## Что это
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
- **drone** — один прогон агента в изолированном git-worktree.
|
|
9
|
-
- **swarm** — CLI для человека (`swarm spawn <slug>`, `swarm ls`, `swarm answer`).
|
|
7
|
+
CLI, который поднимает у вас на машине **рой дронов** — автономных AI-агентов на базе Claude Code. Каждый дрон берёт задачу, пишет код в изолированной ветке и открывает pull request. Задачи, координация и прогресс — в вашем воркспейсе Taskless.
|
|
10
8
|
|
|
11
|
-
|
|
9
|
+
## Для чего
|
|
12
10
|
|
|
13
|
-
|
|
11
|
+
Превратить задачи в готовый код без ручной работы. Ставите задачи в Taskless — рой сам разбирает крупную работу на дронов, они делают её параллельно и присылают PR на ревью. Вы дирижируете, а не печатаете.
|
|
14
12
|
|
|
15
|
-
|
|
13
|
+
## Как пользоваться
|
|
16
14
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
**v1 собран, петля замкнута** — тесты зелёные. Компоненты: ядро БД, `swarm` CLI, git-worktree, спавн (area-lock), launcher (`claude`), дрон-MCP (`report_step`/`ask`/`done`, блокирующий ask), Taskless REST-клиент, `gh`-мерж, демон `overmind` (очередь→спавн, review→мерж→finish). Рой сам оживляет умерших дронов (`--continue`), сам чинит review-PR, конфликтующий с `main` (**merge-main-in**: вливает main в ветку PR без rebase/force, тривиальный конфликт — авто, сложный — дроном-резолвером), и переживает падение Anthropic **штормовым режимом** (замирает и сам поднимается после отбоя; см. ниже и [docs/ORCHESTRATOR.md](docs/ORCHESTRATOR.md)).
|
|
20
|
-
|
|
21
|
-
До боевого прогона осталось: реальный end-to-end на живой задаче (запущенный claude-дрон), сверить Taskless REST-эндпоинты (в `taskless.ts` помечены `TODO`), reviewer-drone. Roadmap v2 (HTTP-транспорт, stall-детект, аннотации дизайн-ревью) — в `docs/design.md`.
|
|
22
|
-
|
|
23
|
-
## Стек
|
|
24
|
-
|
|
25
|
-
Node (ESM) · `better-sqlite3` · `execa` · `@hono/node-server` · `@modelcontextprotocol/sdk` · `@taskless/swarm-core` · `gh` CLI · `git worktree`. Сборка/тесты — turbo + tsc + vitest (как весь монорепо).
|
|
26
|
-
|
|
27
|
-
## Запуск
|
|
28
|
-
|
|
29
|
-
**Один overmind + один web (:7420) на все репо.** Репо — свойство прогона: один демон, одна БД, один дашборд обслуживают несколько репозиториев. `SWARM_REPO` теперь лишь **дефолт** для `spawn` без `--repo` (один репо → работает как раньше).
|
|
30
|
-
|
|
31
|
-
```bash
|
|
32
|
-
# всё из корня монорепо через pnpm-фильтр (скрипты overmind/swarm — tsx-обёртки)
|
|
33
|
-
pnpm --filter @taskless/swarm-daemon test # набор тестов (vitest)
|
|
34
|
-
# демон: SWARM_REPO — дефолтный репо для задач без своего --repo
|
|
35
|
-
SWARM_REPO=~/projects/smurov/taskless pnpm --filter @taskless/swarm-daemon overmind
|
|
36
|
-
pnpm --filter @taskless/swarm-daemon swarm spawn PRJ2-27 call-timeline # в дефолтный репо
|
|
37
|
-
pnpm --filter @taskless/swarm-daemon swarm spawn TS-9 --repo ~/projects/smurov/other
|
|
38
|
-
pnpm --filter @taskless/swarm-daemon swarm ls # статус роя (в скобках — basename репо)
|
|
39
|
-
pnpm --filter @taskless/swarm-daemon swarm questions # открытые вопросы дронов
|
|
40
|
-
pnpm --filter @taskless/swarm-daemon swarm answer <id> "…" # ответить (разбудит дрона)
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
Дашборд группирует дронов секциями по репо (заголовок — basename, счётчик «N дронов · M в работе») с фильтром «все / <repo>»; форма spawn принимает необязательный `repo`.
|
|
44
|
-
|
|
45
|
-
### Объединение двух роёв (миграция истории)
|
|
46
|
-
|
|
47
|
-
Раньше разные репо жили как отдельные рои на разных портах со своими БД (`swarm.db`, `swarm2.db`). Теперь всё в одном инстансе (:7420). Историю второго роя переносим идемпотентным импортом (id ремапятся, повтор — no-op; исходную БД не трогаем — архив):
|
|
48
|
-
|
|
49
|
-
```bash
|
|
50
|
-
pnpm --filter @taskless/swarm-daemon swarm import-db ~/.taskless-swarm/swarm2.db --repo ~/projects/smurov/other
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
Второй процесс (7421) после импорта гасим руками. История из `swarm2.db` появится во вкладке «История».
|
|
54
|
-
|
|
55
|
-
Опц.: `TASKLESS_TOKEN=… TASKLESS_API=https://taskless.ru` — включить Taskless-интеграцию (иначе slug-only).
|
|
56
|
-
|
|
57
|
-
### Вход и выбор воркспейса (`swarm login`)
|
|
58
|
-
|
|
59
|
-
Демон ходит в прод-Taskless от имени оператора — тот же OAuth 2.1 + PKCE, что у Claude Code. `swarm login` поднимает loopback-морду, открывает браузер на согласие и **блокирующе ждёт**, пока токены не лягут в `~/.taskless-swarm/oauth.json` (0600, refresh ротируется). Затем спрашивает воркспейс (`who_am_i`/`list_workspaces`) и пишет выбор в `~/.taskless-swarm/workspace.json` — демон **пинит `workspaceId` сам**, не полагаясь на серверный фолбэк «первый воркспейс».
|
|
60
|
-
|
|
61
|
-
```bash
|
|
62
|
-
pnpm --filter @taskless/swarm-daemon swarm login # браузер + выбор воркспейса
|
|
63
|
-
pnpm --filter @taskless/swarm-daemon swarm login --workspace smurov # без интерактива (slug|id)
|
|
64
|
-
pnpm --filter @taskless/swarm-daemon swarm login --no-open # не открывать браузер сам
|
|
65
|
-
pnpm --filter @taskless/swarm-daemon swarm whoami # кто вошёл и в каком воркспейсе
|
|
66
|
-
pnpm --filter @taskless/swarm-daemon swarm logout # забыть токены + выбор
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
Headless-сервер без браузера: проброс порта — `ssh -L 7420:127.0.0.1:7420 сервер`, открыть напечатанный `http://127.0.0.1:7420/login` в локальном браузере (device-code RFC 8628 пока не поддержан прод-OAuth). `TASKLESS_WORKSPACE=…` в env переопределяет сохранённый выбор. После входа тонкий клиент оживает: `SWARM_BACKEND=client pnpm --filter @taskless/swarm-daemon start` — hydrate из прода, `swarm_*` тулы больше не отдают `swarm_not_enabled` (для юзеров из `PLATFORM_ADMIN_EMAILS`).
|
|
70
|
-
|
|
71
|
-
### Штормовой режим (падение Anthropic)
|
|
72
|
-
|
|
73
|
-
Когда Anthropic лежит, рой не сыпется каскадом, а замирает и ждёт: не спавнит новых дронов, умерших держит как `storm_dead` («в коконе» — worktree цел, лимит оживлений не тратится), раз в 60 с пробит API дешёвой health-probe и после двух успешных проб подряд сам поднимает всех через `--continue`. В вебе — красный баннер «Псионная связь потеряна — Anthropic штормит. Рой замер, дроны в коконах». Подробнее для оператора — [docs/ORCHESTRATOR.md](docs/ORCHESTRATOR.md).
|
|
74
|
-
|
|
75
|
-
Своя эвристика (окно смертей + health-probe) самодостаточна и работает без настройки. Вторым слоем можно подключить внешний сигнал — эндпоинт, который отдаёт `{ "down": boolean }` **или** statuspage.io-формат `{ "status": { "indicator": … } }`:
|
|
15
|
+
Нужно: **Node ≥ 22**, установленный **Claude Code**, аккаунт **Taskless**.
|
|
76
16
|
|
|
77
17
|
```bash
|
|
78
|
-
|
|
79
|
-
|
|
18
|
+
npm i -g @taskless-app/swarm
|
|
19
|
+
swarm login # войти в свой Taskless-воркспейс
|
|
20
|
+
swarm --help # список команд
|
|
80
21
|
```
|
|
81
22
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
> Готового публичного `{down}`-эндпоинта у taskless нет: он мониторит те же statuspage'ы (`packages/api/src/status/probes.ts`), но его `/status` закрыт admin-ролью. Хочешь брать сигнал из taskless — подними тонкий публичный прокси над его данными; иначе указывай `SWARM_STORM_URL` прямо на статус Anthropic (выше). <!-- TODO: если в taskless появится публичный `{down}`, задокументировать его URL здесь -->
|
|
85
|
-
|
|
86
|
-
## CI
|
|
23
|
+
Полный гайд по настройке и запуску роя — на [taskless.ru](https://taskless.ru).
|
|
87
24
|
|
|
88
|
-
|
|
25
|
+
## Правообладатель и лицензия
|
|
89
26
|
|
|
27
|
+
© 2026 Ilya Smurov. Проприетарное коммерческое ПО — см. [LICENSE](./LICENSE).
|
|
28
|
+
Использование — только в связке с сервисом Taskless. Вопросы: ilya@smurov.com
|
package/package.json
CHANGED