Team Tracker
Team Tracker записує активні хвилини 5-хвилинними блоками, класифікує їх для кожного workspace як internal або external за Git remote активного редактора, і надсилає агрегати в team API SnakeFlow. Функція вимкнена, доки ви не увійдете й не ввімкнете її.
Облік хвилин не залежить від Wake Lock → (запобігання сну ОС): трекер не вважає «людина активна» за фактом утримання wake lock.
Вимоги
- SnakeFlow: Team Tracker — Login (GitHub OAuth у редакторі).
devManager.team.enabled= true (команда входу може увімкнути це автоматично).
Джерела активності
Трекер використовує нативні API ОС — зовнішні утиліти не потрібні на Windows, macOS або Linux X11.
| Платформа | Нативна підтримка | Що отримуєте |
|---|---|---|
| Windows 10/11 | ✅ Вбудовано | GetForegroundWindow + QueryFullProcessImageName + GetWindowTextW через PowerShell |
| macOS | ✅ Вбудовано | System Events (назва програми); заголовок вікна — потребує Accessibility permission (див. нижче) |
| Linux X11 | ✅ xdotool | Клас програми + заголовок вікна. Встановлення: apt install xdotool / dnf install xdotool / pacman -S xdotool |
| Linux Wayland (GNOME) | ⚠️ Потрібне розширення | Встановіть Focused Window D-Bus |
| Linux Wayland (Sway) | ✅ Вбудовано | swaymsg -t get_tree — виявляється через змінну SWAYSOCK |
| Linux Wayland (Hyprland) | ✅ Вбудовано | hyprctl activewindow — виявляється через HYPRLAND_INSTANCE_SIGNATURE |
| Linux Wayland (інші) | ❌ Не підтримується | Деградує до фокусу VS Code + класифікації за репо (без регресії) |
Керуйте джерелом через devManager.team.activeAppSource:
native(за замовчуванням) — нативний API ОС для назви програми та заголовка вікна.off— без відстеження активної програми; лише фокус VS Code + патерни репо.
Дозвіл Accessibility на macOS
Якщо Accessibility не надано, провайдер macOS повертає лише назву програми без заголовка вікна. Щоб увімкнути повне відстеження:
- Відкрийте System Settings → Privacy & Security → Accessibility.
- Увімкніть запис Cursor або VS Code.
- Виконайте SnakeFlow: Team Tracker — Re-check Accessibility Permission (Command Palette).
При першому запуску без дозволу розширення показує одноразове повідомлення.
Що вважається «активним»
Кожен 5-хвилинний тик спершу перевіряє опційний Інтервал сну (примусовий IDLE, якщо локальний час у idleSleepWindow). Успішний тик зараховує 5 хвилин internal.
Далі оцінюються два сигнали:
| Сигнал | Джерело | Роль |
|---|---|---|
| Простій ОС | Windows GetLastInputInfo, macOS HIDIdleTime, Linux xprintidle / Mutter D-Bus / org.freedesktop.ScreenSaver | Основний — справжній вік останнього вводу; стійкий до синтетичних хуків. |
| Фокус IDE | window.state.focused + час останнього фокусу (агрегується по всіх ваших вікнах редактора) | Підтверджує сигнал ОС, коли вікно редактора нещодавно мало системний фокус. |
«Годинник» активності оновлюється лише коли виконується одна з умов trustworthy:
- Лише ОС (Windows / macOS) —
GetLastInputInfo/HIDIdleTimeне можна підробити LL-хуками. - ОС + недавній фокус IDE — ОС звітує недавній ввід і вікно редактора мало системний фокус у межах вікна.
- Лише ОС (Linux) —
xprintidle, Mutter D-Bus абоorg.freedesktop.ScreenSaverзвітує недавній ввід. - Linux pattern fallback — немає OS idle API (напр. COSMIC або відсутній
xprintidle) і сфокусоване вікно редактора збігається з repo-патернами workspace.
Якщо жодна умова не виконується довше за ефективне вікно тиші, тик — IDLE. Ефективне вікно = мінімум серверного idle_window_minutes по workspace. Без membership — вбудоване значення за замовчуванням.
Кілька вікон
Лише одне вікно редактора на машині є leader і рахує час (щоб уникнути подвійного підрахунку). Для тайлінгу / кількох вікон кожне вікно публікує свій фокус і активний repo у спільний файл, а leader зараховує internal-час, коли будь-яке ваше вікно сфокусоване на відповідному repo — навіть якщо сфокусоване вікно не є leader. Follower-вікна показують сьогоднішній загальний час (полічений leader) з позначкою tracking elsewhere та дією Track in this window, щоб примусово зробити поточне вікно leader.
Добу обмежує бекенд (див. API-документацію).
Що зараховується
Team Tracker записує лише internal-час — хвилини, коли ви активно працюєте у сфокусованому вікні редактора над repo, що відповідає патернам репо workspace (glob-списки на сервері; див. Cloud sync → Repo patterns).
Для кожного workspace, до якого ви належите, тик додає +5 internal-хвилин лише якщо одночасно виконуються умови:
- Шлюз активності — спрацювала хоча б одна надійна гілка (див. Що вважається активністю).
- Фокус редактора — якесь ваше вікно SnakeFlow/Cursor/VS Code має OS-фокус (включно з follower-вікнами через спільний focus-файл — див. Кілька вікон).
- Збіг репо — remote активного текстового редактора (
owner/repo) відповідає патернам репо workspace. Порожній список патернів означає «дозволити всі repo».
Якщо хоча б одна умова не виконана — тик пропускається, хвилини не зберігаються. External-бакета немає; невірний repo, відсутній фокус або idle понад вікно просто означають нуль.
Примітка: класифікація за repo завжди береться з remote сфокусованого редактора. Тримайте релевантний файл у фокусі, коли важлива правильна маршрутизація по workspace.
Allowlist програм (адмін)
Адміни workspace ведуть список regex на сервері:
- SnakeFlow Cloud → вкладка Team → панель workspace → редагування allowlist програм (іконка камери).
- SnakeFlow: Team Tracker — Edit App Allowlist — regex через кому; порожній рядок очищає список.
Сервер перевіряє кожен патерн як JavaScript RegExp і відхиляє невалідний синтаксис.
Порада: regex перевіряються і по назві процесу / app, і по заголовку вікна.
Налаштування
| Параметр | Тип | За замовчуванням | Опис |
|---|---|---|---|
devManager.team.enabled | boolean | false | Головний перемикач Team Tracker. |
devManager.team.activeAppSource | string | "native" | Джерело активної програми: native або off. Див. Джерела активності. |
devManager.team.idleWindowMinutes | number | 5 | Заявлене вікно в Settings (1–15); зміна перезапускає collector. Ефективне виявлення обмежене 5–10 хв на клієнті; активне значення — мінімум серверного idle_window_minutes по ваших workspace — див. Що вважається активним. |
devManager.team.dayGoalMinutes | number | 360 | Цільові хвилини для progress bar у tooltip статус-бару (за замовч. 6 год). Лише візуалізація — не змінює підрахунок хвилин. Див. Ціль дня. |
devManager.team.requireTracking | boolean | false | Якщо true — попередження, коли трекінг вимкнено. |
devManager.team.idleSleepWindow | string | "" | Інтервал локального часу HH:MM-HH:MM, у якому трекер примусово IDLE — див. Інтервал сну. |
Зміна enabled, activeAppSource, idleWindowMinutes або idleSleepWindow перезапускає collector без перезавантаження вікна. dayGoalMinutes впливає лише на tooltip статус-бару.
Ціль дня
devManager.team.dayGoalMinutes (60–720, за замовч. 360 = 6 год) визначає, наскільки заповнений виглядає progress bar ▓░ у tooltip Team Tracker. Наведіть на $(watch) — побачите internal-хвилини за день, бар і _(goal: …)_. Це не обмежує й не змінює підрахунок хвилин — лише орієнтир на робочий день.
Інтервал сну
devManager.team.idleSleepWindow (формат HH:MM-HH:MM у локальному часі, за замовчуванням порожньо) — додатковий запобіжник проти хибних спрацьовувань вночі. Поки поточний локальний час потрапляє в інтервал, collector примусово IDLE незалежно від будь-якого сигналу.
Коли вмикати:
- Синтетичний input від програм віддаленого керування або «anti-idle» утиліт (AnyDesk, mouse jiggler) вводить в оману, поки ви спите.
- Запущена довгограюча задача або витік wake lock тримає ОС активною всю ніч.
Інтервал обгортає північ, якщо кінець менший за початок — 23:00-07:00. Порожній рядок вимикає режим.
Команди
| Команда | Опис |
|---|---|
| SnakeFlow: Team Tracker — Login | Вхід; може увімкнути трекінг. |
| SnakeFlow: Team Tracker — Logout | Зупинка та вихід. |
| SnakeFlow: Team Tracker — Status | Повний діагностичний звіт у лозі активності. |
| SnakeFlow: Team Tracker — Show Activity Log | Output-канал з причинами кожної хвилини. |
| SnakeFlow: Team Tracker — Re-check Accessibility Permission (macOS) | Повторно перевірити AX permission після надання у System Settings. |
| SnakeFlow: Team Tracker — Edit App Allowlist | Адмін workspace: allowlist regex для app/title (на сервері). |
| SnakeFlow: Team Tracker — Create Workspace | Адмін: новий workspace + invite. |
| SnakeFlow: Team Tracker — Join Workspace | Вхід за кодом запрошення. |
| SnakeFlow: Team Tracker — Manage Workspaces | Список / контекст. |
| SnakeFlow: Team Tracker — Sync Commits (admin) | Синхронізація агрегованих комітів для дашбордів. |
| SnakeFlow: Team Tracker — Sync Closed Issues (admin) | Синхронізація закритих GitHub issues для дашбордів. |
Синхронізація комітів і закритих issues (адмін)
Адміни workspace з увімкненим Team Tracker і сесією GitHub можуть синхронізувати агреговані дані GitHub у SnakeFlow Cloud (D1). Бекенд не отримує GitHub-токен.
| Метрика | Запит GitHub | Таблиця | Internal / external |
|---|---|---|---|
| Коміти | author:{login} author-date:{YYYY-MM-DD} | daily_commits | Репо відповідає repo patterns → internal; інакше external |
| Закриті issues | assignee:{login} is:issue is:closed closed:{YYYY-MM-DD} | daily_closed_issues | Ті самі repo patterns |
Ці GitHub-метрики окремі від обліку часу — рахують коміти та закриті issues, а не активні хвилини.
- Для закритих issues потрібен assignee — issues без assignee не рахуються.
- Синхронізація щогодини під час трекінгу або вручну командами вище (за замовчуванням 7 UTC-днів).
- SnakeFlow Cloud → Activity показує internal-лічильники комітів/issues; колонка часу — лише matching-repo хвилини.
Погодинна смуга та часові пояси учасників
У SnakeFlow Cloud → Activity для кожного учасника показується добова смуга на 24 години (0h–23h). На бекенді погодинні бакети зберігаються в UTC. Після кожного flush розширення надсилає IANA-часовий пояс учасника; дашборд перетворює UTC-бакети в локальні години перед відмальовуванням смуги.
- Старі учасники без збереженого поясу отримують UTC до наступного push.
- Зміна часового поясу оновиться на наступному push; попередні бакети перераховуються з останнім збереженим значенням.
- Добові суми лишаються на UTC-добах; зсув за поясом застосовується лише до погодинної візуалізації.
Див. також
- Wake Lock → — окрема підсистема запобігання сну ОС
- Усі налаштування →
- Довідник команд палітри →