GitHub Integration — Гайд по настройке

Phase 49.3 (Light) — webhook-уведомления + UI sidebar feed для подключённых GitHub-репозиториев. Без bidirectional sync (это Phase 49.5+ Heavy).

Arc OS принимает webhook-события из подключённых GitHub-репозиториев и одновременно:

  1. Отправляет Telegram-уведомление владельцу проєкта
  2. Обновляет sidebar feed в Workspace ContextRail (поллинг 30 сек)

Архитектура

GitHub repo
    │  (push / PR / CI / issue events)
    ▼
arc-os.co/api/webhooks/github
    │  HMAC-SHA256 timing-safe verify (X-Hub-Signature-256)
    │  Rate limit 100 req/min/project
    │  Payload max 50KB
    ▼
shared/routes/github.ts handleGithubWebhook
    ├─→ DB: github_events (для UI feed)
    └─→ shared/github-notifier.ts → Telegram (master bot token)

Поддерживаемые события: push, pull_request, workflow_run, issues. Остальные (releases, deployments, discussions) игнорируются.

Multi-repo: один проект может подключить несколько репозиториев (например, frontend + backend + docs). Ограничение: UNIQUE(project_name, owner, repo).


Быстрая настройка (3 минуты)

1. Сгенерируй webhook URL + secret

arc github link <project-name> <owner/repo>

Пример:

arc github link arc-v2 SerhiiInUa/citadel-v2

CLI вернёт:

2. Добавь webhook в GitHub-репозиторий

На странице https://github.com/<owner>/<repo>/settings/hooks:

  1. Нажми Add webhook
  2. Payload URL: https://arc-os.co/api/webhooks/github
  3. Content type: application/json (важно!)
  4. Secret: вставь значение из вывода CLI
  5. Which events? → «Let me select individual events»:
    • ☑ Pushes
    • ☑ Pull requests
    • ☑ Workflow runs
    • ☑ Issues
  6. Active
  7. Нажми Add webhook

GitHub сразу отправит тестовый ping-ивент — он будет молча отклонён (Arc ожидает только поддерживаемые типы). Это нормально.

3. Проверь, что всё работает

Сделай push в репозиторий, или открой PR, или запусти workflow. Через ~1-3 секунды:


Управление подключениями

Список подключённых репозиториев

arc github links arc-v2

Удалить подключение

arc github unlink arc-v2 <id>

ID берётся из вывода arc github links. Webhook в GitHub при этом не удаляется автоматически — невалидные подписи будут молча отклоняться. Лучший воркфлоу: сначала удали webhook в GitHub UI, затем arc github unlink.


Безопасность


Что видно в sidebar

ContextRail (правая панель в Workspace) показывает секцию GitHub


Telegram-уведомления

Master Bot отправляет форматированное сообщение владельцу проекта:

🔀 [arc-v2] SerhiiInUa/citadel-v2
PR #42 opened: feat: add lazy worker lifecycle by @Sergei89
View on GitHub

Иконки:


Устранение неполадок

Webhook возвращает 401 на тестовый ping

Ожидаемо — Arc молча отклоняет неподдерживаемые события (например, ping). Обрабатываются только production-события (push, PR, workflow_run, issues).

Webhook возвращает 401 на push-ивент

  1. Убедись, что в настройках webhook GitHub выбран Content type: application/json (не form-urlencoded)
  2. Проверь secret — должен точно совпадать с тем, что вернул arc github link
  3. Если secret утерян — удали подключение и создай заново (arc github unlinkarc github link)

Sidebar feed пустой, хотя Telegram-уведомления приходят

  1. Убедись, что ContextRail вообще виден (viewport ≥1280px)
  2. Жёсткое обновление страницы (Ctrl+Shift+R) — компонент кешируется
  3. Проверь БД: sqlite3 data/citadel.db "SELECT COUNT(*) FROM github_events WHERE project_name='<name>';"

Telegram-уведомления не приходят

  1. Убедись, что у проекта есть owner_id в БД: sqlite3 ... "SELECT name, owner_id FROM projects;"
  2. Проверь токен master bot в vault: grep MASTER_BOT_TOKEN config/vault.json (должен быть зашифрован)
  3. Ивент есть в БД, но уведомление не отправлено → смотри логи master: tmux capture-pane -t citadel-master -p | grep github-notifier

Превышен rate limit

Жёсткий лимит 100 req/min/project. При CI с тысячами runner-ов — повысь в shared/routes/github.ts:RATE_MAX.


API эндпоинты

Подробно: API Reference.

Эндпоинт Auth Описание
POST /api/crm/projects/:name/github JWT Подключить репозиторий
GET /api/crm/projects/:name/github JWT Список подключений
DELETE /api/crm/projects/:name/github/:id JWT Отключить
GET /api/crm/projects/:name/github/events?limit=N JWT Список событий (макс. 200)
POST /api/webhooks/github HMAC Публичный приёмник

Roadmap

Фаза Скоуп Статус
49.3 Webhook-приёмник + Telegram ✅ DONE
49.3.1 UI sidebar feed ✅ DONE
49.4 API поллинг, вкладка GitHub в Workspace, multi-repo дашборд BACKLOG (P2)
49.5 Двунаправленная синхронизация задач, авто-ревью PR воркерами BACKLOG (P2)