Перейти до вмісту

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 X11xdotoolКлас програми + заголовок вікна. Встановлення: 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 повертає лише назву програми без заголовка вікна. Щоб увімкнути повне відстеження:

  1. Відкрийте System Settings → Privacy & Security → Accessibility.
  2. Увімкніть запис Cursor або VS Code.
  3. Виконайте 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Основний — справжній вік останнього вводу; стійкий до синтетичних хуків.
Фокус IDEwindow.state.focused + час останнього фокусу (агрегується по всіх ваших вікнах редактора)Підтверджує сигнал ОС, коли вікно редактора нещодавно мало системний фокус.

«Годинник» активності оновлюється лише коли виконується одна з умов trustworthy:

  1. Лише ОС (Windows / macOS)GetLastInputInfo / HIDIdleTime не можна підробити LL-хуками.
  2. ОС + недавній фокус IDE — ОС звітує недавній ввід і вікно редактора мало системний фокус у межах вікна.
  3. Лише ОС (Linux)xprintidle, Mutter D-Bus або org.freedesktop.ScreenSaver звітує недавній ввід.
  4. 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-хвилин лише якщо одночасно виконуються умови:

  1. Шлюз активності — спрацювала хоча б одна надійна гілка (див. Що вважається активністю).
  2. Фокус редактора — якесь ваше вікно SnakeFlow/Cursor/VS Code має OS-фокус (включно з follower-вікнами через спільний focus-файл — див. Кілька вікон).
  3. Збіг репо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.enabledbooleanfalseГоловний перемикач Team Tracker.
devManager.team.activeAppSourcestring"native"Джерело активної програми: native або off. Див. Джерела активності.
devManager.team.idleWindowMinutesnumber5Заявлене вікно в Settings (1–15); зміна перезапускає collector. Ефективне виявлення обмежене 5–10 хв на клієнті; активне значення — мінімум серверного idle_window_minutes по ваших workspace — див. Що вважається активним.
devManager.team.dayGoalMinutesnumber360Цільові хвилини для progress bar у tooltip статус-бару (за замовч. 6 год). Лише візуалізація — не змінює підрахунок хвилин. Див. Ціль дня.
devManager.team.requireTrackingbooleanfalseЯкщо true — попередження, коли трекінг вимкнено.
devManager.team.idleSleepWindowstring""Інтервал локального часу 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 LogOutput-канал з причинами кожної хвилини.
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
Закриті issuesassignee:{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-добах; зсув за поясом застосовується лише до погодинної візуалізації.

Див. також