tt-agent
v0.1.2
Published
Local MCP server and CLI for preparing Tempo worklogs from Git, calendar, Toggl and incidents.
Maintainers
Readme
TT-Agent
Локальный MCP-first ассистент для подготовки и отправки worklog'ов в Tempo на основе Git-активности, календаря, Toggl и инцидентов.
Пользовательская установка вынесена в INSTALLATION.md. В этом файле оставлена информация для разработки, отладки и сопровождения проекта.
Статус
Проект находится в MVP-стадии.
Основной runtime-интерфейс — MCP server через stdio. CLI остаётся служебным слоем для локальной отладки, админских операций и проверки отдельных pipeline'ов без внешнего MCP-клиента.
Установка через npm
После публикации пакет можно запускать как локальный MCP stdio server:
npx tt-agentИли установить глобально:
npm install -g tt-agent
tt-agentMCP-конфиг для клиента должен запускать бинарь tt-agent. Например:
{
"mcpServers": {
"tt-agent": {
"command": "npx",
"args": ["tt-agent"]
}
}
}Если нужно явно запускать alias tt-agent-mcp, используйте npm package selector:
npx --package tt-agent tt-agent-mcpКонфигурация npm-установки
Runtime-конфиг хранится вне npm-пакета, в домашней директории пользователя:
~/.tt-agent/application.ymlСоздать дефолтный конфиг можно командой:
npx --package tt-agent tt initЕсли пакет установлен глобально:
tt initПосле этого откройте ~/.tt-agent/application.yml и внесите токены и настройки. Этот файл локальный, в npm-пакет не входит и не должен попадать в Git.
Минимальные обязательные поля для отправки worklog'ов:
integrations:
jira:
enabled: true
url: "https://your-company.atlassian.net/"
email: "[email protected]"
token: "jira-api-token"
tempo:
token: "tempo-api-token"
authorAccountId: "optional-tempo-author-account-id"При npm-запуске Git-репозитории не нужно монтировать: сервер работает как обычный локальный процесс и читает пути напрямую.
Чтобы collector не учитывал чужие коммиты из git log --all, укажите свой Git author name и email. Обычно их можно посмотреть так:
git config --global user.name
git config --global user.emailsources:
git:
enabled: true
authors: ["Your Name"]
authorEmails: ["[email protected]"]
repos:
- path: /Users/you/IdeaProjects/project-a
name: project-a
- path: /Users/you/IdeaProjects/project-b
name: project-bauthors должен совпадать с Git author name, а authorEmails — с Git author email в ваших коммитах. Если оба списка пустые, collector берёт коммиты всех авторов. Collector сканирует git log --all, поэтому видит коммиты не только текущей ветки.
Безопасность конфигурации:
- не храните реальные токены в
config/application.ymlвнутри репозитория - используйте
~/.tt-agent/application.ymlдля локальных секретов - перед публикацией проверяйте
npm pack --dry-run - при случайном попадании токена в файл проекта токен нужно отозвать и выпустить новый
Архитектура
Основной поток:
- MCP-клиент вызывает tool из
src/mcp/server.ts. src/mcp/tools.tsмаршрутизирует вызов в core workflow.- Collectors собирают события из Git, Calendar, Toggl и incidents.
- Core слой строит drafts, summary, weekly review или explanation.
- Submitter отправляет подтверждённые worklog'и в Tempo.
Ключевые каталоги:
src/mcp— stdio MCP server и tool dispatchersrc/chat— conversational routing свободного текстаsrc/core— доменная логика, drafts, summary, submit-flow, incidentssrc/collectors— сбор данных из источниковsrc/sources— registry источниковsrc/integrations— внешние клиенты и интеграцииsrc/db— SQLite schema и migrationssrc/cli— CLI команды для debug/admin сценариевsrc/tests— Vitest тесты
Локальная разработка
Установить зависимости:
npm installСобрать TypeScript:
npm run buildПроверить npm-пакет перед публикацией:
npm run pack:dry-runЗапустить тесты:
npm run testЗапустить CLI из исходников:
npm run dev -- chat "что я делал на этой неделе"После сборки доступен бинарь tt из dist/cli/index.js.
Конфигурация для разработки
Runtime-конфиг хранится в application.yml.
Для Docker Compose файл config/application.yml монтируется в контейнер как:
/home/node/.tt-agent/application.ymlДля локального CLI/debug режима tt init может создать конфиг в:
~/.tt-agent/application.ymlПолная пользовательская схема настройки описана в INSTALLATION.md. Для разработки обычно важно проверить:
integrations.jira.enabledintegrations.jira.urlintegrations.jira.emailintegrations.jira.tokenintegrations.tempo.tokenintegrations.tempo.authorAccountIdsources.git.enabledsources.git.repossources.calendar.enabledsources.toggl.enabledsources.incidents.enabledmcp.debugmcp.exposeLowLevel
Docker для разработки
Локальная сборка из исходников запускается через override:
docker compose -f docker-compose.yml -f docker-compose.local.yml up -d --buildТекущий docker-compose.yml:
- поднимает сервис
tt-agent - монтирует
config/application.yml - использует named volume
tt-agent-dataдля data-dir контейнера
Если для Git collector нужны локальные репозитории, добавьте volume mounts в compose-конфиг и укажите соответствующие пути в sources.git.repos.
CLI / Debug
tt chat — основной helper для проверки conversational routing:
tt chat "что я делал на этой неделе"Он маршрутизирует запрос к подходящему workflow:
tt_timesheet_todaytt_timesheet_rangett_weekly_reviewtt_explain_drafttt_create_incident
Если текст не распознан, CLI возвращает help/clarification. Результат — агрегированный JSON-ответ.
Полезные команды:
tt init
tt config show
tt config set tempo.token YOUR_TEMPO_TOKEN
tt debug prompt todayMCP Tools
Базовые tools, доступные всегда:
tt_timesheet_todaytt_timesheet_rangett_weekly_reviewtt_explain_drafttt_conversett_submit_tempott_create_incidenttt_update_drafttt_assign_timett_move_time
Toggl tool публикуется только при sources.toggl.enabled: true:
tt_submit_toggl_to_tempo
Low-level tools скрыты по умолчанию и включаются через mcp.exposeLowLevel: true:
tt_scan_daytt_get_summarytt_suggest_worklogstt_rebuild_draftstt_clear_drafts
Основные workflows
tt_timesheet_today:
- сканирует источники за день
- строит worklog drafts
- возвращает
summary,summaryText,drafts,draftsCount,readyToSubmit
tt_timesheet_range:
- работает с
date,startDate,endDate,period,range,days - возвращает range summary, issue/project summary, problem days и day reports
tt_weekly_review:
- строит обзор недели или произвольного диапазона
- возвращает summary по issue, project, incidents, meetings и дням
tt_explain_draft:
- объясняет, почему время попало в конкретный Jira issue
- возвращает provenance, confidence, drafts и
summaryText
tt_converse:
- принимает свободный текст
- сам выбирает подходящий workflow
Submit и destructive операции
tt_submit_tempo можно вызывать на реальную отправку только после явного подтверждения пользователя:
dryRun=trueне требует реальной отправкиdryRun=falseтребуетconfirm=true
tt_submit_toggl_to_tempo работает аналогично и доступен только при включённом Toggl.
tt_clear_drafts требует:
userRequested=trueconfirm=truedestructive=true
tt_rebuild_drafts очищает и пересобирает drafts, поэтому должен вызываться только по явному запросу пользователя.
Draft Editing
tt_update_draft поддерживает операции:
setDuration(issueKey,minutes)setDescription(issueKey,description)delete(issueKey)split(issueKey,parts)
tt_assign_time назначает timeline block на issue key из обнаруженных за день ключей.
tt_move_time переносит минуты между issue key из обнаруженных за день ключей.
Toggl Import
Toggl Track интеграция опциональна.
Пока sources.toggl.enabled: false, tool tt_submit_toggl_to_tempo не публикуется. Если Toggl включён, импорт читает entries из Toggl Track API v9 за выбранный день, извлекает Jira issue key из description и отправляет их в Tempo после явного confirm=true.
Для импорта в Tempo у Toggl entry должен быть Jira key в description, например:
PROJ-123 описание работыprojectId и tags работают как необязательные фильтры импортируемых Toggl entries.
Тесты
Тесты лежат в src/tests и запускаются через Vitest:
npm run testПеред изменениями в core workflow желательно запускать весь набор тестов. Для узких правок можно запускать отдельный тест напрямую через Vitest, например:
npx vitest run src/tests/weeklyReview.test.tsОграничения MVP
src/integrations/jiraClient.tsпока не используется основным submit-flow- low-level MCP tools скрыты по умолчанию и включаются только через
mcp.exposeLowLevel: true - основной сценарий проекта не зависит от локальной LLM
