Commit Graph

92 Commits

Author SHA1 Message Date
ki.sagidullin
d41c0d172f feat(app): add semantic Version constant 0.1.0
Add exported constant app.Version in major.minor.patch format (0.1.0) with
documentation of the manual increment process (when to bump patch/minor/major).
Include the version in the /help command reply and add tests verifying the
semver format and the version presence in help text.
2026-08-17 15:58:14 +05:00
Hermes
bdd9b41e56 fix: git push не поддерживает --config → глобальная опция -c перед подкомандой
All checks were successful
CI / test (push) Successful in 48s
CI / build-and-package (amd64, linux) (push) Successful in 42s
CI / build-and-package (amd64, windows) (push) Successful in 45s
У `git push` нет длинной опции --config (в отличие от `git clone`),
поэтому пуш feature-ветки после ревью падал с 'unknown option config'
(R6: review push failed). Конфиг http.extraHeader с токеном теперь
передаётся глобальной опцией `-c <key>=<value>` перед подкомандой push.
2026-08-17 15:46:35 +05:00
Hermes
bb9f0bdc43 fix: ревьюер не извлекал вердикт из NDJSON-потока → всегда двойной запуск и failed
All checks were successful
CI / test (push) Successful in 47s
CI / build-and-package (amd64, linux) (push) Successful in 41s
CI / build-and-package (amd64, windows) (push) Successful in 53s
parseReviewVerdict брал первую { и последнюю } из всего stdout и парсил
как один JSON, а stdout ревьювера — это NDJSON-поток opencode (несколько
событий). JSON никогда не парсился → v==nil → reviewWithRetry делал
повтор (вторая сессия ревьюера) → verdict nil → StatusFailed.

Приведено к пути аналитика: opencode.ExtractVerdict достаёт текст
вердикта из NDJSON, затем parseReviewVerdict парсит чистый JSON.
+ регрессионный тест TestWorkerReviewNDJSONPass (verdict внутри
text-парта, проверка single run без retry).
2026-08-17 14:54:55 +05:00
Hermes
262c3a0c1c fix: убрать вложенные бэктики в шаблоне prompt.go — ломали компиляцию
All checks were successful
CI / test (push) Successful in 40s
CI / build-and-package (amd64, linux) (push) Successful in 42s
CI / build-and-package (amd64, windows) (push) Successful in 42s
Маркдаун-разметка `ask`/`propose`/`ready`/`abort` внутри raw-string
шаблона закрывала строку, вызывая syntax error в analyst (CI: test и
обе build-and-package падали с 'unexpected name ask').
2026-08-17 14:19:27 +05:00
Hermes
46065f84fd feat: фаза ready — черновик готов как есть, без требований к изменённым полям
Some checks failed
CI / test (push) Failing after 52s
CI / build-and-package (amd64, linux) (push) Failing after 27s
CI / build-and-package (amd64, windows) (push) Failing after 28s
Аналитик теперь может вернуть phase=ready, когда черновик уже полный и
менять нечего. Раньше модель не могла это выразить и возвращала пустой
propose, который валидатор резал A3 (нет изменённых полей).

- analyst: case ready в validateResponse (без требований к полям)
- core: propose и ready обрабатываются одинаково (applyDraft + E1 + ready)
- prompt/analyst.md: контракт фаз обновлён (ask|propose|ready|abort)
- тест TestDecideReady + README: раздел фаз аналитика
2026-08-17 14:07:05 +05:00
Hermes
168b0042c7 fix: открыть буфер bufio.Scanner до 64МБ — NDJSON-строка с text-партом вердикта >64КБ роняла сканер (ErrTooLong), терялся весь поток после первого события (step_start); добавить диаг. лог lines/bytes/scanerr
All checks were successful
CI / test (push) Successful in 44s
CI / build-and-package (amd64, linux) (push) Successful in 40s
CI / build-and-package (amd64, windows) (push) Successful in 37s
2026-08-17 11:53:24 +05:00
Hermes
e9f7017571 debug: логировать хвост вердикта аналитика и извлечённый JSON (диагностика A3 phase="")
All checks were successful
CI / test (push) Successful in 46s
CI / build-and-package (amd64, linux) (push) Successful in 38s
CI / build-and-package (amd64, windows) (push) Successful in 39s
2026-08-17 11:36:49 +05:00
Hermes
9c5f38698c fix: idle-таймер сбрасывается по live-стриму LLM + дефолт 5м; агенты opencode в agents/ с mode: primary
All checks were successful
CI / test (push) Successful in 56s
CI / build-and-package (amd64, linux) (push) Successful in 42s
CI / build-and-package (amd64, windows) (push) Successful in 40s
- opencode ищет кастомных агентов в поддиректории agents/ (как .opencode),
  а не в корне OPENCODE_CONFIG_DIR → распаковка теперь в <dir>/agents/*.md
- markdown-агентам добавлен mode: primary (иначе subagent по умолчанию)
- idle-детекция сбрасывает таймер при live-строках (text/tool/agent/reasoning),
  а не только по росту БД → «LLM думает и стримит» не считается зависанием
- дефолт idle_timeout поднят с 2м до 5м
2026-08-17 10:57:19 +05:00
Hermes
da775ac227 feat: наблюдение за живой opencode-сессией (/status N показывает что делает агент)
All checks were successful
CI / test (push) Successful in 54s
CI / build-and-package (amd64, linux) (push) Successful in 35s
CI / build-and-package (amd64, windows) (push) Successful in 43s
LiveRegistry собирает live-шаги из stdout процесса opencode по taskID
(через контекст, без изменения интерфейса Runner). /status N для running-задачи
прикладывает живое состояние: активный субагент, давность последнего шага,
последние text-шаги агента. Ничего не перезапускается и не убивается —
только наблюдение по запросу.
2026-08-17 08:05:15 +05:00
Hermes
2255917949 fix: перезапуск задачи начинается с чистого worktree (reset+clean перед checkout -B)
All checks were successful
CI / test (push) Successful in 44s
CI / build-and-package (amd64, linux) (push) Successful in 38s
CI / build-and-package (amd64, windows) (push) Successful in 41s
2026-08-17 00:05:00 +05:00
Hermes
a3c6b5f153 fix: разрешить timeout/failed → collecting (перезапуск сбора через /start и /retry)
All checks were successful
CI / test (push) Successful in 41s
CI / build-and-package (amd64, linux) (push) Successful in 38s
CI / build-and-package (amd64, windows) (push) Successful in 36s
2026-08-16 23:45:05 +05:00
Hermes
80c1097a72 log: логировать каждый переход статуса задачи (task N: status "from" → "to")
All checks were successful
CI / test (push) Successful in 45s
CI / build-and-package (amd64, linux) (push) Successful in 41s
CI / build-and-package (amd64, windows) (push) Successful in 38s
2026-08-16 23:33:13 +05:00
Hermes
76ec7d21f1 fix: блокировать ввод в running-задачу (S3: нельзя running→collecting); разрешены /cancel и /status N
All checks were successful
CI / test (push) Successful in 46s
CI / build-and-package (amd64, linux) (push) Successful in 41s
CI / build-and-package (amd64, windows) (push) Successful in 40s
2026-08-16 23:21:30 +05:00
Hermes
c8cd425b29 fix: генерить task_tag (UUID) при создании задачи; защита feat/' при пустом tag
All checks were successful
CI / test (push) Successful in 46s
CI / build-and-package (amd64, linux) (push) Successful in 44s
CI / build-and-package (amd64, windows) (push) Successful in 41s
2026-08-16 23:07:30 +05:00
Hermes
35d9a74ef1 fix: разрешить формат owner/repo в имени репозитория (E3 был слишком строг, слэш ≠ эскейп)
All checks were successful
CI / test (push) Successful in 50s
CI / build-and-package (amd64, linux) (push) Successful in 40s
CI / build-and-package (amd64, windows) (push) Successful in 45s
2026-08-16 23:00:56 +05:00
Hermes
4044c0866f fix: создавать каталог worktree при старте app (decider запускается до воркера)
All checks were successful
CI / test (push) Successful in 54s
CI / build-and-package (amd64, linux) (push) Successful in 51s
CI / build-and-package (amd64, windows) (push) Successful in 47s
2026-08-16 22:13:36 +05:00
Hermes
e055d1937c fix: создавать каталог worktree в prepareRepos (decider: не могу сменить папку на ./worktrees)
All checks were successful
CI / test (push) Successful in 44s
CI / build-and-package (amd64, linux) (push) Successful in 43s
CI / build-and-package (amd64, windows) (push) Successful in 42s
2026-08-16 22:04:16 +05:00
Hermes
4a6ed57971 worker: add reviewer stage (branch→review→push) with R1-R6 errors
All checks were successful
CI / test (push) Successful in 47s
CI / build-and-package (amd64, linux) (push) Successful in 43s
CI / build-and-package (amd64, windows) (push) Successful in 40s
2026-08-16 21:21:21 +05:00
Hermes
130dc59840 fix: пути (db, worktree) и config.yaml резолвятся рядом с .exe, а не от CWD
All checks were successful
CI / test (push) Successful in 1m5s
CI / build-and-package (amd64, linux) (push) Successful in 44s
CI / build-and-package (amd64, windows) (push) Successful in 43s
2026-08-16 20:31:08 +05:00
Hermes
91e91ac3ce feat: команда /help — справка по всем командам бота
All checks were successful
CI / test (push) Successful in 47s
CI / build-and-package (amd64, linux) (push) Successful in 41s
CI / build-and-package (amd64, windows) (push) Successful in 41s
2026-08-16 20:05:11 +05:00
Hermes
63668a0f69 fix(update): убрать псевдо-версию latest, всё в commit-<sha7>
All checks were successful
CI / test (push) Successful in 59s
CI / build-and-package (amd64, darwin) (push) Successful in 42s
CI / build-and-package (amd64, linux) (push) Successful in 40s
CI / build-and-package (amd64, windows) (push) Successful in 42s
CI / build-and-package (arm64, darwin) (push) Successful in 45s
CI / build-and-package (arm64, linux) (push) Successful in 41s
Gitea: при параллельных PUT матрицы (6 платформ) псевдо-версия 'latest'
переуказывается на каждый снимок, companion-файлы и бинарь разъезжаются
между версиями — checksum U4 ломался.

- CI: публикует бинарь+.version+.sha256 в  (commit-<sha7>), latest не используется
- Updater.ResolveLatest: новейшая commit-* версия из листинга /api/v1/packages/{owner}/generic/{package},
  берём макс id у которой есть бинарь текущей платформы
- Download/Verify/checksum читают ТУ ЖЕ version, а не latest
2026-08-16 13:05:37 +05:00
Hermes
05c17ed1f7 refactor(update): владелец пакета — жёсткая константа packageOwner
All checks were successful
CI / test (push) Successful in 48s
CI / build-and-package (amd64, darwin) (push) Successful in 46s
CI / build-and-package (amd64, linux) (push) Successful in 44s
CI / build-and-package (amd64, windows) (push) Successful in 47s
CI / build-and-package (arm64, darwin) (push) Successful in 45s
CI / build-and-package (arm64, linux) (push) Successful in 47s
- Убран update.owner из конфига, ldflag -X main.updateOwner, vars.TC_GITEA_OWNER и UPDATE_OWNER в Make.
- Владелец пакета = packageOwner (kamelion), совпадает с владельцем репо и создателем токена.
- app.New снова с 3 аргументами; тесты обновлены.
2026-08-16 12:37:53 +05:00
Hermes
8fcafcdffd feat(update): владелец пакета вшивается в бинарь
All checks were successful
CI / test (push) Successful in 42s
CI / build-and-package (amd64, darwin) (push) Successful in 39s
CI / build-and-package (amd64, linux) (push) Successful in 42s
CI / build-and-package (amd64, windows) (push) Successful in 41s
CI / build-and-package (arm64, darwin) (push) Successful in 48s
CI / build-and-package (arm64, linux) (push) Successful in 47s
- -X main.updateOwner (из vars.TC_GITEA_OWNER / Make UPDATE_OWNER), фоллбэк на update.owner в конфиге.
- update.owner больше не обязателен: гейты в startAutoCheck и handleUpdateCmd требуют только update.base_url.
- Обновлены main, app.New (сигнатура), CI, Makefile, тесты.
2026-08-16 12:33:17 +05:00
Hermes
4de6a4241a feat(update): отдельный update.base_url и вшитый токен read:package
All checks were successful
CI / test (push) Successful in 43s
CI / build-and-package (amd64, darwin) (push) Successful in 40s
CI / build-and-package (amd64, linux) (push) Successful in 39s
CI / build-and-package (amd64, windows) (push) Successful in 39s
CI / build-and-package (arm64, darwin) (push) Successful in 36s
CI / build-and-package (arm64, linux) (push) Successful in 39s
- update.base_url (env UPDATE_BASE_URL) — хост обновления, БЕЗ фоллбэка на git.base_url: пустое значение отключает update.
- Убран git.token из пути обновления: теперь отдельный токен.
- Токен read:package вшивается при сборке (-X main.updateToken из секрета TC_UPDATE_TOKEN), приоритет над update.token из конфига.
- Обновлены app.New (сигнатура), main, Makefile, CI, config.example, тесты.
2026-08-16 12:20:53 +05:00
Hermes
44ac7d73bb feat: автообновление бинаря из Gitea Packages (/update, /status, авто-уведомление)
All checks were successful
CI / test (push) Successful in 47s
CI / build-and-package (amd64, darwin) (push) Successful in 40s
CI / build-and-package (amd64, linux) (push) Successful in 40s
CI / build-and-package (amd64, windows) (push) Successful in 39s
CI / build-and-package (arm64, darwin) (push) Successful in 40s
CI / build-and-package (arm64, linux) (push) Successful in 40s
2026-08-16 11:50:23 +05:00
Hermes
bd3d825738 feat: множественные репозитории (Repos) и клонирование в воркере
All checks were successful
CI / test (push) Successful in 46s
CI / build-and-package (amd64, darwin) (push) Successful in 36s
CI / build-and-package (amd64, linux) (push) Successful in 37s
CI / build-and-package (amd64, windows) (push) Successful in 44s
CI / build-and-package (arm64, darwin) (push) Successful in 35s
CI / build-and-package (arm64, linux) (push) Successful in 36s
- Task.Repos []string (XML-колонка repos, обратная совместимость с repo)
- config: блок git {base_url, token}
- аналитик: ответ repos[], шаблон показывает список
- core: propose без repos → возврат в сбор (E1)
- worker вариант A: один dev из общего cwd, prepareRepos клонирует
  недостающие репо (git clone), validateRepoName (E3), ErrRepoNotGit (E4)
- ошибки E1-E4 в worker/errors.go
2026-08-16 09:18:15 +05:00
Hermes
7be75fe14f fix: убран префикс tg:// из chat_id при отправке (chat not found); тесты проверяют ChatID
All checks were successful
CI / test (push) Successful in 54s
CI / build-and-package (amd64, darwin) (push) Successful in 45s
CI / build-and-package (amd64, linux) (push) Successful in 46s
CI / build-and-package (amd64, windows) (push) Successful in 46s
CI / build-and-package (arm64, darwin) (push) Successful in 44s
CI / build-and-package (arm64, linux) (push) Successful in 47s
2026-08-16 00:19:49 +05:00
Hermes
005877bfc5 fix: логировать ошибку getUpdates в polling — тишина не пряталась в консоли
All checks were successful
CI / test (push) Successful in 46s
CI / build-and-package (amd64, darwin) (push) Successful in 44s
CI / build-and-package (amd64, linux) (push) Successful in 43s
CI / build-and-package (amd64, windows) (push) Successful in 44s
CI / build-and-package (arm64, darwin) (push) Successful in 50s
CI / build-and-package (arm64, linux) (push) Successful in 47s
2026-08-15 23:56:24 +05:00
Hermes
2b761aa0bc feat: встроенные агенты opencode (analyst, dev) через go:embed, распаковка по умолчанию в ./agents рядом с бинарём
All checks were successful
CI / test (push) Successful in 38s
CI / build-and-package (amd64, darwin) (push) Successful in 34s
CI / build-and-package (amd64, linux) (push) Successful in 33s
CI / build-and-package (amd64, windows) (push) Successful in 35s
CI / build-and-package (arm64, darwin) (push) Successful in 35s
CI / build-and-package (arm64, linux) (push) Successful in 34s
2026-08-15 15:41:26 +05:00
Hermes
9e7c95e1d8 feat: opencode.config_dir — каталог с агентами (OPENCODE_CONFIG_DIR)
All checks were successful
CI / test (push) Successful in 43s
CI / build-and-package (amd64, darwin) (push) Successful in 40s
CI / build-and-package (amd64, linux) (push) Successful in 39s
CI / build-and-package (amd64, windows) (push) Successful in 41s
CI / build-and-package (arm64, darwin) (push) Successful in 42s
CI / build-and-package (arm64, linux) (push) Successful in 41s
2026-08-15 14:59:10 +05:00
Hermes
87fae9b82c fix: дефолтные пути — ./worktrees и ./ratatoskr.db (независимо от ОС)
All checks were successful
CI / test (push) Successful in 40s
CI / build-and-package (amd64, darwin) (push) Successful in 39s
CI / build-and-package (amd64, linux) (push) Successful in 40s
CI / build-and-package (amd64, windows) (push) Successful in 40s
CI / build-and-package (arm64, darwin) (push) Successful in 42s
CI / build-and-package (arm64, linux) (push) Successful in 45s
2026-08-15 11:26:34 +05:00
Hermes
35fcffe035 config: удалён GiteaCfg (GITEA_URL/GITEA_TOKEN) — нигде не использовался, хранение в локальной SQLite
All checks were successful
build-test / build (push) Successful in 33s
2026-08-15 10:07:54 +05:00
Hermes
c72b41b2c5 app: composition root (A1-A4), Run(ctx), handleIncoming (вариант A), фикс config.Load(""), GetActiveTaskByChatID, main.go обновлён
All checks were successful
build-test / build (push) Successful in 35s
2026-08-15 09:51:03 +05:00
Hermes
4641090398 worker: добавлен пакет worker (W1-W5, poll-цикл, runTask, промпт, тесты) + SetMaxOpenConns(1) для SQLITE_BUSY
All checks were successful
build-test / build (push) Successful in 42s
2026-08-15 09:14:34 +05:00
Hermes
dfe374dd55 internal/analyst: Decider через opencode (A1–A4)
All checks were successful
build-test / build (push) Successful in 1m15s
- Analyst struct: строит Go-template промпт из history+draft
- opencode.Runner.Run (agent=analyst) → ExtractVerdict → ExtractJSON
- Валидация phase/полей → core.Decision
- A1 DecodeFail, A2 RunError, A3 Validation, A4 NotReady
- MockRunner в тестах (11 тестов, зелёные)
- core.runDecide оборачивает ошибки аналитика в D1 ErrDecideFailed
- allow ready→collecting (фикс для правки готового черновика)
2026-08-15 00:32:49 +05:00
Hermes
2957bf0d63 internal/core: ядро-машина состояний (ProcessTurn поверх storage) + история задач в БД
All checks were successful
build-test / build (push) Successful in 1m11s
- status = единственный источник истины (collecting/ready как фазы диалога)
- команды /start /cancel /skip /retry N /status N /continue N
- Decider интерфейс (аналитик→opencode, мок для тестов)
- task_history таблица для промпта аналитика
- allow ready→collecting (правка черновика)
2026-08-15 00:27:16 +05:00
Hermes
089e196dbc internal/storage: SQLite-БД для задач и трассировок (таски + статус-машина, трассы с группировкой по task_id)
All checks were successful
build-test / build (push) Successful in 30s
2026-08-14 23:38:57 +05:00
Hermes
cc180d7517 internal/chat/telegram: long-poll Channel (sendMessage, getUpdates, Options→HTML, apiURL заменяем для тестов)
All checks were successful
build-test / build (push) Successful in 38s
2026-08-14 23:02:58 +05:00
Hermes
238f00ba36 internal/config: загрузка YAML+env (подстановка ${VAR:-default}, defaults, env override, Validate)
All checks were successful
build-test / build (push) Successful in 1m23s
2026-08-14 22:59:23 +05:00
Hermes
c9d69594cc internal/chat: мультиканальный Router (UserID-сессии, routing, pending Ask/ответ) + Channel интерфейс
All checks were successful
build-test / build (push) Successful in 41s
2026-08-14 20:33:04 +05:00
Hermes
4ebafc48d0 internal/opencode: runner (idle/hard timeout, process-group kill, resume-fallback) + verdict/json parsing
All checks were successful
build-test / build (push) Successful in 1m21s
2026-08-14 13:29:05 +05:00
Hermes
53cf901707 ratatoskr-go: стартовый каркас (Go-бинарь, CI, structure)
All checks were successful
build-test / build (push) Successful in 47s
2026-08-14 08:53:57 +05:00