@vibescope/mcp-server 0.1.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/api-client.d.ts +120 -2
- package/dist/api-client.js +51 -5
- package/dist/handlers/bodies-of-work.js +84 -50
- package/dist/handlers/cost.js +62 -54
- package/dist/handlers/decisions.js +29 -16
- package/dist/handlers/deployment.js +114 -107
- package/dist/handlers/discovery.d.ts +3 -0
- package/dist/handlers/discovery.js +55 -657
- package/dist/handlers/fallback.js +42 -28
- package/dist/handlers/file-checkouts.d.ts +18 -0
- package/dist/handlers/file-checkouts.js +101 -0
- package/dist/handlers/findings.d.ts +14 -1
- package/dist/handlers/findings.js +104 -28
- package/dist/handlers/git-issues.js +36 -32
- package/dist/handlers/ideas.js +44 -26
- package/dist/handlers/index.d.ts +2 -0
- package/dist/handlers/index.js +6 -0
- package/dist/handlers/milestones.js +34 -27
- package/dist/handlers/organizations.js +86 -78
- package/dist/handlers/progress.js +22 -11
- package/dist/handlers/project.js +62 -22
- package/dist/handlers/requests.js +15 -11
- package/dist/handlers/roles.d.ts +18 -0
- package/dist/handlers/roles.js +130 -0
- package/dist/handlers/session.js +52 -15
- package/dist/handlers/sprints.js +78 -65
- package/dist/handlers/tasks.js +135 -74
- package/dist/handlers/tool-docs.d.ts +4 -3
- package/dist/handlers/tool-docs.js +252 -5
- package/dist/handlers/validation.js +30 -14
- package/dist/index.js +25 -7
- package/dist/tools.js +417 -4
- package/package.json +1 -1
- package/src/api-client.ts +161 -8
- package/src/handlers/__test-setup__.ts +12 -0
- package/src/handlers/bodies-of-work.ts +127 -111
- package/src/handlers/cost.test.ts +34 -44
- package/src/handlers/cost.ts +77 -92
- package/src/handlers/decisions.test.ts +3 -2
- package/src/handlers/decisions.ts +32 -27
- package/src/handlers/deployment.ts +144 -190
- package/src/handlers/discovery.test.ts +4 -5
- package/src/handlers/discovery.ts +60 -746
- package/src/handlers/fallback.test.ts +78 -0
- package/src/handlers/fallback.ts +51 -38
- package/src/handlers/file-checkouts.test.ts +477 -0
- package/src/handlers/file-checkouts.ts +127 -0
- package/src/handlers/findings.test.ts +274 -2
- package/src/handlers/findings.ts +123 -57
- package/src/handlers/git-issues.ts +40 -80
- package/src/handlers/ideas.ts +56 -54
- package/src/handlers/index.ts +6 -0
- package/src/handlers/milestones.test.ts +1 -1
- package/src/handlers/milestones.ts +47 -45
- package/src/handlers/organizations.ts +104 -129
- package/src/handlers/progress.ts +24 -22
- package/src/handlers/project.ts +89 -57
- package/src/handlers/requests.ts +18 -14
- package/src/handlers/roles.test.ts +303 -0
- package/src/handlers/roles.ts +208 -0
- package/src/handlers/session.test.ts +37 -2
- package/src/handlers/session.ts +64 -21
- package/src/handlers/sprints.ts +114 -134
- package/src/handlers/tasks.test.ts +61 -0
- package/src/handlers/tasks.ts +170 -139
- package/src/handlers/tool-docs.ts +1024 -0
- package/src/handlers/validation.test.ts +53 -1
- package/src/handlers/validation.ts +32 -21
- package/src/index.ts +25 -7
- package/src/tools.ts +417 -4
- package/dist/config/tool-categories.d.ts +0 -31
- package/dist/config/tool-categories.js +0 -253
- package/dist/knowledge.d.ts +0 -6
- package/dist/knowledge.js +0 -218
- package/src/knowledge.ts +0 -230
|
@@ -6,12 +6,23 @@
|
|
|
6
6
|
* - claim_validation
|
|
7
7
|
* - validate_task
|
|
8
8
|
*/
|
|
9
|
-
import {
|
|
9
|
+
import { parseArgs, uuidValidator } from '../validators.js';
|
|
10
10
|
import { getApiClient } from '../api-client.js';
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
// Argument schemas for type-safe parsing
|
|
12
|
+
const getTasksAwaitingValidationSchema = {
|
|
13
|
+
project_id: { type: 'string', required: true, validate: uuidValidator },
|
|
14
|
+
};
|
|
15
|
+
const claimValidationSchema = {
|
|
16
|
+
task_id: { type: 'string', required: true, validate: uuidValidator },
|
|
17
|
+
};
|
|
18
|
+
const validateTaskSchema = {
|
|
19
|
+
task_id: { type: 'string', required: true, validate: uuidValidator },
|
|
20
|
+
approved: { type: 'boolean', required: true },
|
|
21
|
+
validation_notes: { type: 'string' },
|
|
22
|
+
skip_pr_check: { type: 'boolean' },
|
|
23
|
+
};
|
|
24
|
+
export const getTasksAwaitingValidation = async (args, _ctx) => {
|
|
25
|
+
const { project_id } = parseArgs(args, getTasksAwaitingValidationSchema);
|
|
15
26
|
const apiClient = getApiClient();
|
|
16
27
|
const response = await apiClient.getTasksAwaitingValidation(project_id);
|
|
17
28
|
if (!response.ok) {
|
|
@@ -20,9 +31,7 @@ export const getTasksAwaitingValidation = async (args, ctx) => {
|
|
|
20
31
|
return { result: response.data };
|
|
21
32
|
};
|
|
22
33
|
export const claimValidation = async (args, ctx) => {
|
|
23
|
-
const { task_id } = args;
|
|
24
|
-
validateRequired(task_id, 'task_id');
|
|
25
|
-
validateUUID(task_id, 'task_id');
|
|
34
|
+
const { task_id } = parseArgs(args, claimValidationSchema);
|
|
26
35
|
const { session } = ctx;
|
|
27
36
|
const currentSessionId = session.currentSessionId;
|
|
28
37
|
const apiClient = getApiClient();
|
|
@@ -33,20 +42,27 @@ export const claimValidation = async (args, ctx) => {
|
|
|
33
42
|
return { result: response.data };
|
|
34
43
|
};
|
|
35
44
|
export const validateTask = async (args, ctx) => {
|
|
36
|
-
const { task_id, validation_notes,
|
|
37
|
-
validateRequired(task_id, 'task_id');
|
|
38
|
-
validateUUID(task_id, 'task_id');
|
|
39
|
-
if (approved === undefined) {
|
|
40
|
-
throw new Error('approved is required');
|
|
41
|
-
}
|
|
45
|
+
const { task_id, approved, validation_notes, skip_pr_check } = parseArgs(args, validateTaskSchema);
|
|
42
46
|
const { session } = ctx;
|
|
43
47
|
const currentSessionId = session.currentSessionId;
|
|
44
48
|
const apiClient = getApiClient();
|
|
45
49
|
const response = await apiClient.validateTask(task_id, {
|
|
46
50
|
approved,
|
|
47
51
|
validation_notes,
|
|
52
|
+
skip_pr_check,
|
|
48
53
|
}, currentSessionId || undefined);
|
|
49
54
|
if (!response.ok) {
|
|
55
|
+
// Handle PR required error specially
|
|
56
|
+
if (response.error === 'pr_required') {
|
|
57
|
+
return {
|
|
58
|
+
result: {
|
|
59
|
+
error: 'pr_required',
|
|
60
|
+
message: response.data?.message || 'A Pull Request is required before validation approval. Create a PR and add it via add_task_reference.',
|
|
61
|
+
workflow: response.data?.workflow,
|
|
62
|
+
action_required: 'Create a PR for this task and add it via add_task_reference(task_id, pr_url, label: "Pull Request")',
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
}
|
|
50
66
|
throw new Error(response.error || 'Failed to validate task');
|
|
51
67
|
}
|
|
52
68
|
return { result: response.data };
|
package/dist/index.js
CHANGED
|
@@ -606,8 +606,8 @@ Returns session info, persona, and next task. Use mode:'full' for complete conte
|
|
|
606
606
|
},
|
|
607
607
|
task_type: {
|
|
608
608
|
type: 'string',
|
|
609
|
-
enum: ['frontend', 'backend', 'database', 'mcp', 'testing', 'docs', 'infra', 'other'],
|
|
610
|
-
description: 'Task category
|
|
609
|
+
enum: ['frontend', 'backend', 'database', 'feature', 'bugfix', 'design', 'mcp', 'testing', 'docs', 'infra', 'other'],
|
|
610
|
+
description: 'Task category (frontend, backend, database, feature, bugfix, design, mcp, testing, docs, infra, other)',
|
|
611
611
|
},
|
|
612
612
|
},
|
|
613
613
|
required: ['project_id', 'title'],
|
|
@@ -655,8 +655,8 @@ Returns session info, persona, and next task. Use mode:'full' for complete conte
|
|
|
655
655
|
},
|
|
656
656
|
task_type: {
|
|
657
657
|
type: 'string',
|
|
658
|
-
enum: ['frontend', 'backend', 'database', 'mcp', 'testing', 'docs', 'infra', 'other'],
|
|
659
|
-
description: 'Task category (frontend, backend, database, mcp, testing, docs, infra, other)',
|
|
658
|
+
enum: ['frontend', 'backend', 'database', 'feature', 'bugfix', 'design', 'mcp', 'testing', 'docs', 'infra', 'other'],
|
|
659
|
+
description: 'Task category (frontend, backend, database, feature, bugfix, design, mcp, testing, docs, infra, other)',
|
|
660
660
|
},
|
|
661
661
|
},
|
|
662
662
|
required: ['task_id'],
|
|
@@ -1371,6 +1371,10 @@ Returns subtasks with aggregate completion stats.`,
|
|
|
1371
1371
|
type: 'string',
|
|
1372
1372
|
description: 'Session ID from start_work_session (optional, uses current session if not provided)',
|
|
1373
1373
|
},
|
|
1374
|
+
current_worktree_path: {
|
|
1375
|
+
type: ['string', 'null'],
|
|
1376
|
+
description: 'Report your current git worktree path (e.g., "../project-task-abc123"). Set to null to clear.',
|
|
1377
|
+
},
|
|
1374
1378
|
},
|
|
1375
1379
|
},
|
|
1376
1380
|
},
|
|
@@ -1420,7 +1424,7 @@ Returns subtasks with aggregate completion stats.`,
|
|
|
1420
1424
|
},
|
|
1421
1425
|
{
|
|
1422
1426
|
name: 'validate_task',
|
|
1423
|
-
description: 'Validate a completed task. Include test results in validation_notes.',
|
|
1427
|
+
description: 'Validate a completed task. Include test results in validation_notes. For github-flow/git-flow projects, a PR must exist before approval (add via add_task_reference).',
|
|
1424
1428
|
inputSchema: {
|
|
1425
1429
|
type: 'object',
|
|
1426
1430
|
properties: {
|
|
@@ -1436,6 +1440,10 @@ Returns subtasks with aggregate completion stats.`,
|
|
|
1436
1440
|
type: 'boolean',
|
|
1437
1441
|
description: 'Whether the task passes validation (true = approved, false = needs more work)',
|
|
1438
1442
|
},
|
|
1443
|
+
skip_pr_check: {
|
|
1444
|
+
type: 'boolean',
|
|
1445
|
+
description: 'Skip PR existence check (use only for tasks that legitimately do not need a PR)',
|
|
1446
|
+
},
|
|
1439
1447
|
},
|
|
1440
1448
|
required: ['task_id', 'approved'],
|
|
1441
1449
|
},
|
|
@@ -2143,7 +2151,8 @@ Bodies of work allow organizing related tasks with optional auto-deployment on c
|
|
|
2143
2151
|
},
|
|
2144
2152
|
{
|
|
2145
2153
|
name: 'get_body_of_work',
|
|
2146
|
-
description: `Get a body of work with all its tasks organized by phase
|
|
2154
|
+
description: `Get a body of work with all its tasks organized by phase.
|
|
2155
|
+
Use summary_only: true to get task counts and next task instead of full task arrays (saves tokens).`,
|
|
2147
2156
|
inputSchema: {
|
|
2148
2157
|
type: 'object',
|
|
2149
2158
|
properties: {
|
|
@@ -2151,6 +2160,10 @@ Bodies of work allow organizing related tasks with optional auto-deployment on c
|
|
|
2151
2160
|
type: 'string',
|
|
2152
2161
|
description: 'Body of work UUID',
|
|
2153
2162
|
},
|
|
2163
|
+
summary_only: {
|
|
2164
|
+
type: 'boolean',
|
|
2165
|
+
description: 'Return task counts and next task instead of full task arrays (default: false)',
|
|
2166
|
+
},
|
|
2154
2167
|
},
|
|
2155
2168
|
required: ['body_of_work_id'],
|
|
2156
2169
|
},
|
|
@@ -2426,7 +2439,8 @@ Sprints start in 'planning' status where tasks can be added with story points.`,
|
|
|
2426
2439
|
{
|
|
2427
2440
|
name: 'get_sprint',
|
|
2428
2441
|
description: `Get a sprint with all its tasks organized by phase (pre/core/post).
|
|
2429
|
-
Includes progress percentage, velocity points, and committed points
|
|
2442
|
+
Includes progress percentage, velocity points, and committed points.
|
|
2443
|
+
Use summary_only: true to get task counts and next task instead of full task arrays (saves tokens).`,
|
|
2430
2444
|
inputSchema: {
|
|
2431
2445
|
type: 'object',
|
|
2432
2446
|
properties: {
|
|
@@ -2434,6 +2448,10 @@ Includes progress percentage, velocity points, and committed points.`,
|
|
|
2434
2448
|
type: 'string',
|
|
2435
2449
|
description: 'Sprint UUID',
|
|
2436
2450
|
},
|
|
2451
|
+
summary_only: {
|
|
2452
|
+
type: 'boolean',
|
|
2453
|
+
description: 'Return task counts and next task instead of full task arrays (default: false)',
|
|
2454
|
+
},
|
|
2437
2455
|
},
|
|
2438
2456
|
required: ['sprint_id'],
|
|
2439
2457
|
},
|
package/dist/tools.js
CHANGED
|
@@ -881,15 +881,29 @@ Returns session info, persona, role, and next task. Use mode:'full' for complete
|
|
|
881
881
|
},
|
|
882
882
|
{
|
|
883
883
|
name: 'get_findings',
|
|
884
|
-
description: `Get findings for a project, optionally filtered by category, severity, or status.`,
|
|
884
|
+
description: `Get findings for a project, optionally filtered by category, severity, or status. Use summary_only=true to reduce token usage by returning only essential fields (id, title, category, severity, status). For just counts, use get_findings_stats instead.`,
|
|
885
885
|
inputSchema: {
|
|
886
886
|
type: 'object',
|
|
887
887
|
properties: {
|
|
888
888
|
project_id: { type: 'string', description: 'Project UUID' },
|
|
889
889
|
category: { type: 'string', enum: ['performance', 'security', 'code_quality', 'accessibility', 'documentation', 'architecture', 'testing', 'other'], description: 'Filter by category (optional)' },
|
|
890
890
|
severity: { type: 'string', enum: ['info', 'low', 'medium', 'high', 'critical'], description: 'Filter by severity (optional)' },
|
|
891
|
-
status: { type: 'string', enum: ['open', 'addressed', 'dismissed', 'wontfix'], description: 'Filter by status (default:
|
|
892
|
-
limit: { type: 'number', description: 'Max number of findings to return (default 50)' },
|
|
891
|
+
status: { type: 'string', enum: ['open', 'addressed', 'dismissed', 'wontfix'], description: 'Filter by status (default: open)' },
|
|
892
|
+
limit: { type: 'number', description: 'Max number of findings to return (default 50, max 200)' },
|
|
893
|
+
offset: { type: 'number', description: 'Number of findings to skip for pagination (default 0)' },
|
|
894
|
+
search_query: { type: 'string', description: 'Search findings by title' },
|
|
895
|
+
summary_only: { type: 'boolean', description: 'When true, returns only id, title, category, severity, status (reduces tokens by ~80%). Default: false' },
|
|
896
|
+
},
|
|
897
|
+
required: ['project_id'],
|
|
898
|
+
},
|
|
899
|
+
},
|
|
900
|
+
{
|
|
901
|
+
name: 'get_findings_stats',
|
|
902
|
+
description: `Get aggregate statistics about findings for a project. Returns total count and breakdowns by status, severity, and category. Much more token-efficient than get_findings when you just need to understand the overall state.`,
|
|
903
|
+
inputSchema: {
|
|
904
|
+
type: 'object',
|
|
905
|
+
properties: {
|
|
906
|
+
project_id: { type: 'string', description: 'Project UUID' },
|
|
893
907
|
},
|
|
894
908
|
required: ['project_id'],
|
|
895
909
|
},
|
|
@@ -1100,6 +1114,10 @@ Returns subtasks with aggregate completion stats.`,
|
|
|
1100
1114
|
type: 'string',
|
|
1101
1115
|
description: 'Session ID from start_work_session (optional, uses current session if not provided)',
|
|
1102
1116
|
},
|
|
1117
|
+
current_worktree_path: {
|
|
1118
|
+
type: ['string', 'null'],
|
|
1119
|
+
description: 'Report your current git worktree path (e.g., "../project-task-abc123"). Set to null to clear.',
|
|
1120
|
+
},
|
|
1103
1121
|
},
|
|
1104
1122
|
},
|
|
1105
1123
|
},
|
|
@@ -1149,7 +1167,7 @@ Returns subtasks with aggregate completion stats.`,
|
|
|
1149
1167
|
},
|
|
1150
1168
|
{
|
|
1151
1169
|
name: 'validate_task',
|
|
1152
|
-
description: 'Validate a completed task. Include test results in validation_notes.',
|
|
1170
|
+
description: 'Validate a completed task. Include test results in validation_notes. For github-flow/git-flow projects, a PR must exist before approval (add via add_task_reference).',
|
|
1153
1171
|
inputSchema: {
|
|
1154
1172
|
type: 'object',
|
|
1155
1173
|
properties: {
|
|
@@ -1165,6 +1183,10 @@ Returns subtasks with aggregate completion stats.`,
|
|
|
1165
1183
|
type: 'boolean',
|
|
1166
1184
|
description: 'Whether the task passes validation (true = approved, false = needs more work)',
|
|
1167
1185
|
},
|
|
1186
|
+
skip_pr_check: {
|
|
1187
|
+
type: 'boolean',
|
|
1188
|
+
description: 'Skip PR existence check (use only for tasks that legitimately do not need a PR)',
|
|
1189
|
+
},
|
|
1168
1190
|
},
|
|
1169
1191
|
required: ['task_id', 'approved'],
|
|
1170
1192
|
},
|
|
@@ -1348,6 +1370,10 @@ Returns subtasks with aggregate completion stats.`,
|
|
|
1348
1370
|
type: 'boolean',
|
|
1349
1371
|
description: 'When true, converted task blocks all other work until complete',
|
|
1350
1372
|
},
|
|
1373
|
+
recurring: {
|
|
1374
|
+
type: 'boolean',
|
|
1375
|
+
description: 'When true, requirement resets to pending when a new deployment is requested',
|
|
1376
|
+
},
|
|
1351
1377
|
},
|
|
1352
1378
|
required: ['project_id', 'type', 'title'],
|
|
1353
1379
|
},
|
|
@@ -2499,4 +2525,391 @@ Only returns tasks where all dependencies are completed.`,
|
|
|
2499
2525
|
required: ['project_id'],
|
|
2500
2526
|
},
|
|
2501
2527
|
},
|
|
2528
|
+
// ============================================================================
|
|
2529
|
+
// Sprint Tools
|
|
2530
|
+
// ============================================================================
|
|
2531
|
+
{
|
|
2532
|
+
name: 'create_sprint',
|
|
2533
|
+
description: `Create a new sprint. Sprints are time-bounded bodies of work with velocity tracking.
|
|
2534
|
+
Sprints start in 'planning' status where tasks can be added with story points.`,
|
|
2535
|
+
inputSchema: {
|
|
2536
|
+
type: 'object',
|
|
2537
|
+
properties: {
|
|
2538
|
+
project_id: {
|
|
2539
|
+
type: 'string',
|
|
2540
|
+
description: 'Project UUID',
|
|
2541
|
+
},
|
|
2542
|
+
title: {
|
|
2543
|
+
type: 'string',
|
|
2544
|
+
description: 'Sprint title (e.g., "Sprint 5" or "Q1 Release")',
|
|
2545
|
+
},
|
|
2546
|
+
goal: {
|
|
2547
|
+
type: 'string',
|
|
2548
|
+
description: 'Sprint goal statement',
|
|
2549
|
+
},
|
|
2550
|
+
start_date: {
|
|
2551
|
+
type: 'string',
|
|
2552
|
+
description: 'Start date (YYYY-MM-DD)',
|
|
2553
|
+
},
|
|
2554
|
+
end_date: {
|
|
2555
|
+
type: 'string',
|
|
2556
|
+
description: 'End date (YYYY-MM-DD)',
|
|
2557
|
+
},
|
|
2558
|
+
auto_deploy_on_completion: {
|
|
2559
|
+
type: 'boolean',
|
|
2560
|
+
description: 'Automatically request deployment when sprint completes (default: false)',
|
|
2561
|
+
},
|
|
2562
|
+
deploy_environment: {
|
|
2563
|
+
type: 'string',
|
|
2564
|
+
enum: ['development', 'staging', 'production'],
|
|
2565
|
+
description: 'Target environment for auto-deploy (default: production)',
|
|
2566
|
+
},
|
|
2567
|
+
deploy_version_bump: {
|
|
2568
|
+
type: 'string',
|
|
2569
|
+
enum: ['patch', 'minor', 'major'],
|
|
2570
|
+
description: 'Version bump for auto-deploy (default: minor)',
|
|
2571
|
+
},
|
|
2572
|
+
},
|
|
2573
|
+
required: ['project_id', 'title', 'start_date', 'end_date'],
|
|
2574
|
+
},
|
|
2575
|
+
},
|
|
2576
|
+
{
|
|
2577
|
+
name: 'update_sprint',
|
|
2578
|
+
description: `Update a sprint's details. Can update title, goal, dates, and deployment settings.`,
|
|
2579
|
+
inputSchema: {
|
|
2580
|
+
type: 'object',
|
|
2581
|
+
properties: {
|
|
2582
|
+
sprint_id: {
|
|
2583
|
+
type: 'string',
|
|
2584
|
+
description: 'Sprint UUID',
|
|
2585
|
+
},
|
|
2586
|
+
title: {
|
|
2587
|
+
type: 'string',
|
|
2588
|
+
description: 'New sprint title',
|
|
2589
|
+
},
|
|
2590
|
+
goal: {
|
|
2591
|
+
type: 'string',
|
|
2592
|
+
description: 'New sprint goal',
|
|
2593
|
+
},
|
|
2594
|
+
start_date: {
|
|
2595
|
+
type: 'string',
|
|
2596
|
+
description: 'New start date (YYYY-MM-DD)',
|
|
2597
|
+
},
|
|
2598
|
+
end_date: {
|
|
2599
|
+
type: 'string',
|
|
2600
|
+
description: 'New end date (YYYY-MM-DD)',
|
|
2601
|
+
},
|
|
2602
|
+
auto_deploy_on_completion: {
|
|
2603
|
+
type: 'boolean',
|
|
2604
|
+
description: 'Auto-deploy setting',
|
|
2605
|
+
},
|
|
2606
|
+
deploy_environment: {
|
|
2607
|
+
type: 'string',
|
|
2608
|
+
enum: ['development', 'staging', 'production'],
|
|
2609
|
+
description: 'Target environment',
|
|
2610
|
+
},
|
|
2611
|
+
deploy_version_bump: {
|
|
2612
|
+
type: 'string',
|
|
2613
|
+
enum: ['patch', 'minor', 'major'],
|
|
2614
|
+
description: 'Version bump type',
|
|
2615
|
+
},
|
|
2616
|
+
},
|
|
2617
|
+
required: ['sprint_id'],
|
|
2618
|
+
},
|
|
2619
|
+
},
|
|
2620
|
+
{
|
|
2621
|
+
name: 'get_sprint',
|
|
2622
|
+
description: `Get a sprint with all its tasks organized by phase (pre/core/post).
|
|
2623
|
+
Includes progress percentage, velocity points, and committed points.
|
|
2624
|
+
Use summary_only: true to get task counts and next task instead of full task arrays (saves tokens).`,
|
|
2625
|
+
inputSchema: {
|
|
2626
|
+
type: 'object',
|
|
2627
|
+
properties: {
|
|
2628
|
+
sprint_id: {
|
|
2629
|
+
type: 'string',
|
|
2630
|
+
description: 'Sprint UUID',
|
|
2631
|
+
},
|
|
2632
|
+
summary_only: {
|
|
2633
|
+
type: 'boolean',
|
|
2634
|
+
description: 'Return task counts and next task instead of full task arrays (default: false)',
|
|
2635
|
+
},
|
|
2636
|
+
},
|
|
2637
|
+
required: ['sprint_id'],
|
|
2638
|
+
},
|
|
2639
|
+
},
|
|
2640
|
+
{
|
|
2641
|
+
name: 'get_sprints',
|
|
2642
|
+
description: `List sprints for a project with velocity metrics.
|
|
2643
|
+
Returns sprints sorted by sprint_number descending (most recent first).`,
|
|
2644
|
+
inputSchema: {
|
|
2645
|
+
type: 'object',
|
|
2646
|
+
properties: {
|
|
2647
|
+
project_id: {
|
|
2648
|
+
type: 'string',
|
|
2649
|
+
description: 'Project UUID',
|
|
2650
|
+
},
|
|
2651
|
+
status: {
|
|
2652
|
+
type: 'string',
|
|
2653
|
+
enum: ['planning', 'active', 'in_review', 'retrospective', 'completed', 'cancelled'],
|
|
2654
|
+
description: 'Filter by sprint status (optional)',
|
|
2655
|
+
},
|
|
2656
|
+
limit: {
|
|
2657
|
+
type: 'number',
|
|
2658
|
+
description: 'Max sprints to return (default: 20, max: 100)',
|
|
2659
|
+
},
|
|
2660
|
+
},
|
|
2661
|
+
required: ['project_id'],
|
|
2662
|
+
},
|
|
2663
|
+
},
|
|
2664
|
+
{
|
|
2665
|
+
name: 'delete_sprint',
|
|
2666
|
+
description: `Delete a sprint. Tasks are preserved but no longer grouped.`,
|
|
2667
|
+
inputSchema: {
|
|
2668
|
+
type: 'object',
|
|
2669
|
+
properties: {
|
|
2670
|
+
sprint_id: {
|
|
2671
|
+
type: 'string',
|
|
2672
|
+
description: 'Sprint UUID',
|
|
2673
|
+
},
|
|
2674
|
+
},
|
|
2675
|
+
required: ['sprint_id'],
|
|
2676
|
+
},
|
|
2677
|
+
},
|
|
2678
|
+
{
|
|
2679
|
+
name: 'start_sprint',
|
|
2680
|
+
description: `Start a sprint. Transitions from 'planning' to 'active' status.
|
|
2681
|
+
Locks the committed_points at the current total story points.`,
|
|
2682
|
+
inputSchema: {
|
|
2683
|
+
type: 'object',
|
|
2684
|
+
properties: {
|
|
2685
|
+
sprint_id: {
|
|
2686
|
+
type: 'string',
|
|
2687
|
+
description: 'Sprint UUID',
|
|
2688
|
+
},
|
|
2689
|
+
},
|
|
2690
|
+
required: ['sprint_id'],
|
|
2691
|
+
},
|
|
2692
|
+
},
|
|
2693
|
+
{
|
|
2694
|
+
name: 'complete_sprint',
|
|
2695
|
+
description: `Complete a sprint. Handles retrospective phase and auto-deployment if configured.
|
|
2696
|
+
Status flow: active → in_review → retrospective → completed`,
|
|
2697
|
+
inputSchema: {
|
|
2698
|
+
type: 'object',
|
|
2699
|
+
properties: {
|
|
2700
|
+
sprint_id: {
|
|
2701
|
+
type: 'string',
|
|
2702
|
+
description: 'Sprint UUID',
|
|
2703
|
+
},
|
|
2704
|
+
retrospective_notes: {
|
|
2705
|
+
type: 'string',
|
|
2706
|
+
description: 'Sprint retrospective notes',
|
|
2707
|
+
},
|
|
2708
|
+
skip_retrospective: {
|
|
2709
|
+
type: 'boolean',
|
|
2710
|
+
description: 'Skip retrospective phase and go directly to completed (default: false)',
|
|
2711
|
+
},
|
|
2712
|
+
},
|
|
2713
|
+
required: ['sprint_id'],
|
|
2714
|
+
},
|
|
2715
|
+
},
|
|
2716
|
+
{
|
|
2717
|
+
name: 'add_task_to_sprint',
|
|
2718
|
+
description: `Add a task to a sprint with optional story points.
|
|
2719
|
+
Tasks can be added during 'planning' status. Story points contribute to committed_points.`,
|
|
2720
|
+
inputSchema: {
|
|
2721
|
+
type: 'object',
|
|
2722
|
+
properties: {
|
|
2723
|
+
sprint_id: {
|
|
2724
|
+
type: 'string',
|
|
2725
|
+
description: 'Sprint UUID',
|
|
2726
|
+
},
|
|
2727
|
+
task_id: {
|
|
2728
|
+
type: 'string',
|
|
2729
|
+
description: 'Task UUID to add',
|
|
2730
|
+
},
|
|
2731
|
+
story_points: {
|
|
2732
|
+
type: 'number',
|
|
2733
|
+
description: 'Story point estimate (optional, must be non-negative integer)',
|
|
2734
|
+
},
|
|
2735
|
+
phase: {
|
|
2736
|
+
type: 'string',
|
|
2737
|
+
enum: ['pre', 'core', 'post'],
|
|
2738
|
+
description: 'Task phase (default: core)',
|
|
2739
|
+
},
|
|
2740
|
+
},
|
|
2741
|
+
required: ['sprint_id', 'task_id'],
|
|
2742
|
+
},
|
|
2743
|
+
},
|
|
2744
|
+
{
|
|
2745
|
+
name: 'remove_task_from_sprint',
|
|
2746
|
+
description: `Remove a task from a sprint. Task is preserved but returns to backlog.`,
|
|
2747
|
+
inputSchema: {
|
|
2748
|
+
type: 'object',
|
|
2749
|
+
properties: {
|
|
2750
|
+
sprint_id: {
|
|
2751
|
+
type: 'string',
|
|
2752
|
+
description: 'Sprint UUID',
|
|
2753
|
+
},
|
|
2754
|
+
task_id: {
|
|
2755
|
+
type: 'string',
|
|
2756
|
+
description: 'Task UUID to remove',
|
|
2757
|
+
},
|
|
2758
|
+
},
|
|
2759
|
+
required: ['sprint_id', 'task_id'],
|
|
2760
|
+
},
|
|
2761
|
+
},
|
|
2762
|
+
{
|
|
2763
|
+
name: 'get_sprint_backlog',
|
|
2764
|
+
description: `Get tasks from backlog/pending that can be added to a sprint.
|
|
2765
|
+
Returns tasks not already assigned to any body of work or sprint.`,
|
|
2766
|
+
inputSchema: {
|
|
2767
|
+
type: 'object',
|
|
2768
|
+
properties: {
|
|
2769
|
+
project_id: {
|
|
2770
|
+
type: 'string',
|
|
2771
|
+
description: 'Project UUID',
|
|
2772
|
+
},
|
|
2773
|
+
sprint_id: {
|
|
2774
|
+
type: 'string',
|
|
2775
|
+
description: 'Sprint UUID to exclude already-added tasks (optional)',
|
|
2776
|
+
},
|
|
2777
|
+
},
|
|
2778
|
+
required: ['project_id'],
|
|
2779
|
+
},
|
|
2780
|
+
},
|
|
2781
|
+
{
|
|
2782
|
+
name: 'get_sprint_velocity',
|
|
2783
|
+
description: `Get velocity metrics for completed sprints.
|
|
2784
|
+
Returns committed vs completed points and average velocity.`,
|
|
2785
|
+
inputSchema: {
|
|
2786
|
+
type: 'object',
|
|
2787
|
+
properties: {
|
|
2788
|
+
project_id: {
|
|
2789
|
+
type: 'string',
|
|
2790
|
+
description: 'Project UUID',
|
|
2791
|
+
},
|
|
2792
|
+
limit: {
|
|
2793
|
+
type: 'number',
|
|
2794
|
+
description: 'Number of sprints to analyze (default: 10, max: 50)',
|
|
2795
|
+
},
|
|
2796
|
+
},
|
|
2797
|
+
required: ['project_id'],
|
|
2798
|
+
},
|
|
2799
|
+
},
|
|
2800
|
+
// ============================================================================
|
|
2801
|
+
// Git Issue Tools
|
|
2802
|
+
// ============================================================================
|
|
2803
|
+
{
|
|
2804
|
+
name: 'add_git_issue',
|
|
2805
|
+
description: `Record a git-related issue (merge conflict, push failure, etc.). Auto-created by claim_validation when conflicts detected.`,
|
|
2806
|
+
inputSchema: {
|
|
2807
|
+
type: 'object',
|
|
2808
|
+
properties: {
|
|
2809
|
+
project_id: {
|
|
2810
|
+
type: 'string',
|
|
2811
|
+
description: 'Project UUID',
|
|
2812
|
+
},
|
|
2813
|
+
issue_type: {
|
|
2814
|
+
type: 'string',
|
|
2815
|
+
enum: ['merge_conflict', 'push_failed', 'rebase_needed', 'branch_diverged', 'pr_not_mergeable'],
|
|
2816
|
+
description: 'Type of git issue',
|
|
2817
|
+
},
|
|
2818
|
+
branch: {
|
|
2819
|
+
type: 'string',
|
|
2820
|
+
description: 'Branch where the issue occurred',
|
|
2821
|
+
},
|
|
2822
|
+
target_branch: {
|
|
2823
|
+
type: 'string',
|
|
2824
|
+
description: 'Target branch for merge/rebase (optional)',
|
|
2825
|
+
},
|
|
2826
|
+
pr_url: {
|
|
2827
|
+
type: 'string',
|
|
2828
|
+
description: 'Pull request URL if applicable (optional)',
|
|
2829
|
+
},
|
|
2830
|
+
conflicting_files: {
|
|
2831
|
+
type: 'array',
|
|
2832
|
+
items: { type: 'string' },
|
|
2833
|
+
description: 'List of files with conflicts (optional)',
|
|
2834
|
+
},
|
|
2835
|
+
error_message: {
|
|
2836
|
+
type: 'string',
|
|
2837
|
+
description: 'Error message from git operation (optional)',
|
|
2838
|
+
},
|
|
2839
|
+
task_id: {
|
|
2840
|
+
type: 'string',
|
|
2841
|
+
description: 'Related task UUID (optional)',
|
|
2842
|
+
},
|
|
2843
|
+
},
|
|
2844
|
+
required: ['project_id', 'issue_type', 'branch'],
|
|
2845
|
+
},
|
|
2846
|
+
},
|
|
2847
|
+
{
|
|
2848
|
+
name: 'resolve_git_issue',
|
|
2849
|
+
description: `Mark a git issue as resolved.`,
|
|
2850
|
+
inputSchema: {
|
|
2851
|
+
type: 'object',
|
|
2852
|
+
properties: {
|
|
2853
|
+
git_issue_id: {
|
|
2854
|
+
type: 'string',
|
|
2855
|
+
description: 'Git issue UUID',
|
|
2856
|
+
},
|
|
2857
|
+
resolution_note: {
|
|
2858
|
+
type: 'string',
|
|
2859
|
+
description: 'How the issue was resolved (optional)',
|
|
2860
|
+
},
|
|
2861
|
+
auto_resolved: {
|
|
2862
|
+
type: 'boolean',
|
|
2863
|
+
description: 'Whether this was auto-resolved (e.g., PR became mergeable)',
|
|
2864
|
+
},
|
|
2865
|
+
},
|
|
2866
|
+
required: ['git_issue_id'],
|
|
2867
|
+
},
|
|
2868
|
+
},
|
|
2869
|
+
{
|
|
2870
|
+
name: 'get_git_issues',
|
|
2871
|
+
description: `Get git issues for a project, optionally filtered by status, type, or branch.`,
|
|
2872
|
+
inputSchema: {
|
|
2873
|
+
type: 'object',
|
|
2874
|
+
properties: {
|
|
2875
|
+
project_id: {
|
|
2876
|
+
type: 'string',
|
|
2877
|
+
description: 'Project UUID',
|
|
2878
|
+
},
|
|
2879
|
+
status: {
|
|
2880
|
+
type: 'string',
|
|
2881
|
+
enum: ['open', 'resolved'],
|
|
2882
|
+
description: 'Filter by status (default: open)',
|
|
2883
|
+
},
|
|
2884
|
+
issue_type: {
|
|
2885
|
+
type: 'string',
|
|
2886
|
+
enum: ['merge_conflict', 'push_failed', 'rebase_needed', 'branch_diverged', 'pr_not_mergeable'],
|
|
2887
|
+
description: 'Filter by issue type (optional)',
|
|
2888
|
+
},
|
|
2889
|
+
branch: {
|
|
2890
|
+
type: 'string',
|
|
2891
|
+
description: 'Filter by branch (optional)',
|
|
2892
|
+
},
|
|
2893
|
+
limit: {
|
|
2894
|
+
type: 'number',
|
|
2895
|
+
description: 'Max issues to return (default: 50)',
|
|
2896
|
+
},
|
|
2897
|
+
},
|
|
2898
|
+
required: ['project_id'],
|
|
2899
|
+
},
|
|
2900
|
+
},
|
|
2901
|
+
{
|
|
2902
|
+
name: 'delete_git_issue',
|
|
2903
|
+
description: `Delete a git issue.`,
|
|
2904
|
+
inputSchema: {
|
|
2905
|
+
type: 'object',
|
|
2906
|
+
properties: {
|
|
2907
|
+
git_issue_id: {
|
|
2908
|
+
type: 'string',
|
|
2909
|
+
description: 'Git issue UUID',
|
|
2910
|
+
},
|
|
2911
|
+
},
|
|
2912
|
+
required: ['git_issue_id'],
|
|
2913
|
+
},
|
|
2914
|
+
},
|
|
2502
2915
|
];
|