feat: Add version management, session tracking, and commit linking

Phase 1: Version Management
- Migration 006: Add git_tag, git_sha columns to versions
- New tools: version_add, version_list, version_show, version_update,
  version_release, version_assign_task
- Links versions to git tags for release tracking

Phase 2: Session/Task Activity Tracking
- Migration 007: Create task_activity table
- Track task changes per session (created, updated, status_change, closed)
- Session ID from env/cache file (usage-stats format)
- New tool: session_tasks to query tasks by session

Phase 3: Commit-Task Linking
- Migration 008: Create task_commits junction table
- New tools: task_commit_add, task_commit_remove, task_commits_list,
  task_link_commits (batch parsing)
- Stores SHA references only (Gitea MCP owns full data)
- Commits shown in task_show output

17 new MCP tools total. All migrations applied to docker-host postgres.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Christian Gick
2026-01-10 10:28:21 +02:00
parent e12cccf718
commit 5015b1416f
9 changed files with 930 additions and 0 deletions

View File

@@ -24,6 +24,8 @@ import { taskLink, checklistAdd, checklistToggle, taskResolveDuplicate } from '.
import { epicAdd, epicList, epicShow, epicAssign, epicClose } from './tools/epics.js';
import { taskDelegations, taskDelegationQuery } from './tools/delegations.js';
import { projectLock, projectUnlock, projectLockStatus, projectContext } from './tools/locks.js';
import { versionAdd, versionList, versionShow, versionUpdate, versionRelease, versionAssignTask } from './tools/versions.js';
import { taskCommitAdd, taskCommitRemove, taskCommitsList, taskLinkCommits, sessionTasks } from './tools/commits.js';
// Create MCP server
const server = new Server(
@@ -189,6 +191,81 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
result = await projectContext();
break;
// Versions
case 'version_add':
result = await versionAdd({
project: a.project,
version: a.version,
build_number: a.build_number,
status: a.status,
release_notes: a.release_notes,
});
break;
case 'version_list':
result = await versionList({
project: a.project,
status: a.status,
limit: a.limit,
});
break;
case 'version_show':
result = await versionShow(a.id);
break;
case 'version_update':
result = await versionUpdate({
id: a.id,
status: a.status,
git_tag: a.git_tag,
git_sha: a.git_sha,
release_notes: a.release_notes,
release_date: a.release_date,
});
break;
case 'version_release':
result = await versionRelease({
id: a.id,
git_tag: a.git_tag,
});
break;
case 'version_assign_task':
result = await versionAssignTask({
task_id: a.task_id,
version_id: a.version_id,
});
break;
// Commits
case 'task_commit_add':
result = await taskCommitAdd({
task_id: a.task_id,
commit_sha: a.commit_sha,
repo: a.repo,
source: a.source,
});
break;
case 'task_commit_remove':
result = await taskCommitRemove({
task_id: a.task_id,
commit_sha: a.commit_sha,
});
break;
case 'task_commits_list':
result = await taskCommitsList(a.task_id);
break;
case 'task_link_commits':
result = await taskLinkCommits({
repo: a.repo,
commits: a.commits,
dry_run: a.dry_run,
});
break;
case 'session_tasks':
result = await sessionTasks({
session_id: a.session_id,
limit: a.limit,
});
break;
default:
throw new Error(`Unknown tool: ${name}`);
}