@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.
Files changed (2) hide show
  1. package/README.md +15 -76
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -1,89 +1,28 @@
1
- # @taskless/swarm-daemon
1
+ # @taskless-app/swarm
2
2
 
3
- Локальный control plane для флота AI-агентов (Claude Code). Ребёнок Taskless: **Taskless** — источник задач (воля), **Swarm** — рой дронов, что их выполняют. Вайб — мифо-рой: псионная связь, коконы, стаи.
3
+ Рой AI-агентов, которые пишут код за вас — под управлением [Taskless](https://taskless.ru).
4
4
 
5
- > Пакет монорепо `taskless` (переехал из отдельного репо `taskless-swarm`, TASWM-31). Чистое ядро типов + логики — в `@taskless/swarm-core`; этот пакет — overmind-процесс (демон, launcher, дрон-MCP, CLI, web).
5
+ ## Что это
6
6
 
7
- - **overmind** — демон-контроллер: спавнит дронов, следит, держит вопросы, ведёт SQLite, мост к Taskless по REST.
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
- Дизайн: [docs/design.md](docs/design.md).
9
+ ## Для чего
12
10
 
13
- ## Оркестратору
11
+ Превратить задачи в готовый код без ручной работы. Ставите задачи в Taskless — рой сам разбирает крупную работу на дронов, они делают её параллельно и присылают PR на ревью. Вы дирижируете, а не печатаете.
14
12
 
15
- Агент, который дирижирует роем, а не пишет код сам, — читает [docs/ORCHESTRATOR.md](docs/ORCHESTRATOR.md). Там устав: диагноз → спека → делегирование → ревью, area-локи, смертность дронов, опс-дисциплина. Это ядро будущего плагина — подключил swarm, и агент сразу знает свою роль.
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
- # рекомендация — публичный статус Anthropic напрямую (no-auth, тот же источник, что мониторит taskless):
79
- SWARM_STORM_URL=https://status.anthropic.com/api/v2/status.json
18
+ npm i -g @taskless-app/swarm
19
+ swarm login # войти в свой Taskless-воркспейс
20
+ swarm --help # список команд
80
21
  ```
81
22
 
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
23
+ Полный гайд по настройке и запуску роя — на [taskless.ru](https://taskless.ru).
87
24
 
88
- Тесты и typecheck роя подхватывает общий CI монорепо ([`.github/workflows/ci.yml`](../../.github/workflows/ci.yml)): `pnpm typecheck` и `pnpm test` = `turbo run …` по всем пакетам workspace. Пакет со скриптами `typecheck`/`test`/`build` попадает в прогон автоматически — своего `ci.yml` рой больше не держит (удалён при переезде). Раннер тот же self-hosted `firstvds`.
25
+ ## Правообладатель и лицензия
89
26
 
27
+ © 2026 Ilya Smurov. Проприетарное коммерческое ПО — см. [LICENSE](./LICENSE).
28
+ Использование — только в связке с сервисом Taskless. Вопросы: ilya@smurov.com
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@taskless-app/swarm",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "type": "module",
5
5
  "description": "Local control plane for a fleet of AI coding agents (drones), coordinating through Taskless. The overmind runs the swarm.",
6
6
  "keywords": [