@taskless-app/swarm 0.1.0 → 0.2.0
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 +22 -71
- package/dist/cli.js +1694 -297
- package/dist/overmind.js +1932 -439
- package/docs/HERO.md +3 -0
- package/package.json +17 -15
package/README.md
CHANGED
|
@@ -1,89 +1,40 @@
|
|
|
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
|
-
|
|
15
|
+
Нужно: **Node ≥ 22**, установленный **Claude Code**, аккаунт **Taskless**. Дроны роя
|
|
16
|
+
пишут код через `claude` CLI в изолированных git worktree — репозиторий, с которым
|
|
17
|
+
работаете, тоже должен быть на месте (склонирован локально).
|
|
18
18
|
|
|
19
|
-
|
|
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` (один репо → работает как раньше).
|
|
19
|
+
Без установки — одной командой на задачу:
|
|
30
20
|
|
|
31
21
|
```bash
|
|
32
|
-
|
|
33
|
-
|
|
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> "…" # ответить (разбудит дрона)
|
|
22
|
+
npx @taskless-app/swarm login --workspace <slug> # войти в свой Taskless-воркспейс
|
|
23
|
+
npx @taskless-app/swarm start --repo <путь к репо> # поднять демон роя
|
|
41
24
|
```
|
|
42
25
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
### Объединение двух роёв (миграция истории)
|
|
46
|
-
|
|
47
|
-
Раньше разные репо жили как отдельные рои на разных портах со своими БД (`swarm.db`, `swarm2.db`). Теперь всё в одном инстансе (:7420). Историю второго роя переносим идемпотентным импортом (id ремапятся, повтор — no-op; исходную БД не трогаем — архив):
|
|
26
|
+
Или один раз глобально:
|
|
48
27
|
|
|
49
28
|
```bash
|
|
50
|
-
|
|
29
|
+
npm i -g @taskless-app/swarm
|
|
30
|
+
swarm login --workspace <slug>
|
|
31
|
+
swarm start --repo <путь к репо> # держит процесс живым — разбирает очередь, спавнит/будит дронов
|
|
32
|
+
swarm --help # список остальных команд (spawn/ls/questions/answer/…)
|
|
51
33
|
```
|
|
52
34
|
|
|
53
|
-
|
|
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": … } }`:
|
|
76
|
-
|
|
77
|
-
```bash
|
|
78
|
-
# рекомендация — публичный статус Anthropic напрямую (no-auth, тот же источник, что мониторит taskless):
|
|
79
|
-
SWARM_STORM_URL=https://status.anthropic.com/api/v2/status.json
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
Внешний сигнал только дополняет эвристику (может опаздывать): «down» помогает войти в шторм раньше и удерживает его, пока провайдер не поднимется. Ручки порогов: `SWARM_STORM_DEATHS` (дефолт 2), `SWARM_STORM_WINDOW_MS` (5 мин), `SWARM_STORM_SPAWN_FAILS` (2), `SWARM_STORM_PROBE_INTERVAL_MS` (60 с), `SWARM_STORM_PROBE_CLEAR` (2), `SWARM_STORM_PROBE_TIMEOUT_MS` (20 с).
|
|
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
|
|
35
|
+
Полный гайд по настройке и запуску роя — на [taskless.ru](https://taskless.ru).
|
|
87
36
|
|
|
88
|
-
|
|
37
|
+
## Правообладатель и лицензия
|
|
89
38
|
|
|
39
|
+
© 2026 Ilya Smurov. Проприетарное коммерческое ПО — см. [LICENSE](./LICENSE).
|
|
40
|
+
Использование — только в связке с сервисом Taskless. Вопросы: ilya@smurov.com
|