@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.
Files changed (76) hide show
  1. package/README.md +1 -1
  2. package/dist/api-client.d.ts +120 -2
  3. package/dist/api-client.js +51 -5
  4. package/dist/handlers/bodies-of-work.js +84 -50
  5. package/dist/handlers/cost.js +62 -54
  6. package/dist/handlers/decisions.js +29 -16
  7. package/dist/handlers/deployment.js +114 -107
  8. package/dist/handlers/discovery.d.ts +3 -0
  9. package/dist/handlers/discovery.js +55 -657
  10. package/dist/handlers/fallback.js +42 -28
  11. package/dist/handlers/file-checkouts.d.ts +18 -0
  12. package/dist/handlers/file-checkouts.js +101 -0
  13. package/dist/handlers/findings.d.ts +14 -1
  14. package/dist/handlers/findings.js +104 -28
  15. package/dist/handlers/git-issues.js +36 -32
  16. package/dist/handlers/ideas.js +44 -26
  17. package/dist/handlers/index.d.ts +2 -0
  18. package/dist/handlers/index.js +6 -0
  19. package/dist/handlers/milestones.js +34 -27
  20. package/dist/handlers/organizations.js +86 -78
  21. package/dist/handlers/progress.js +22 -11
  22. package/dist/handlers/project.js +62 -22
  23. package/dist/handlers/requests.js +15 -11
  24. package/dist/handlers/roles.d.ts +18 -0
  25. package/dist/handlers/roles.js +130 -0
  26. package/dist/handlers/session.js +52 -15
  27. package/dist/handlers/sprints.js +78 -65
  28. package/dist/handlers/tasks.js +135 -74
  29. package/dist/handlers/tool-docs.d.ts +4 -3
  30. package/dist/handlers/tool-docs.js +252 -5
  31. package/dist/handlers/validation.js +30 -14
  32. package/dist/index.js +25 -7
  33. package/dist/tools.js +417 -4
  34. package/package.json +1 -1
  35. package/src/api-client.ts +161 -8
  36. package/src/handlers/__test-setup__.ts +12 -0
  37. package/src/handlers/bodies-of-work.ts +127 -111
  38. package/src/handlers/cost.test.ts +34 -44
  39. package/src/handlers/cost.ts +77 -92
  40. package/src/handlers/decisions.test.ts +3 -2
  41. package/src/handlers/decisions.ts +32 -27
  42. package/src/handlers/deployment.ts +144 -190
  43. package/src/handlers/discovery.test.ts +4 -5
  44. package/src/handlers/discovery.ts +60 -746
  45. package/src/handlers/fallback.test.ts +78 -0
  46. package/src/handlers/fallback.ts +51 -38
  47. package/src/handlers/file-checkouts.test.ts +477 -0
  48. package/src/handlers/file-checkouts.ts +127 -0
  49. package/src/handlers/findings.test.ts +274 -2
  50. package/src/handlers/findings.ts +123 -57
  51. package/src/handlers/git-issues.ts +40 -80
  52. package/src/handlers/ideas.ts +56 -54
  53. package/src/handlers/index.ts +6 -0
  54. package/src/handlers/milestones.test.ts +1 -1
  55. package/src/handlers/milestones.ts +47 -45
  56. package/src/handlers/organizations.ts +104 -129
  57. package/src/handlers/progress.ts +24 -22
  58. package/src/handlers/project.ts +89 -57
  59. package/src/handlers/requests.ts +18 -14
  60. package/src/handlers/roles.test.ts +303 -0
  61. package/src/handlers/roles.ts +208 -0
  62. package/src/handlers/session.test.ts +37 -2
  63. package/src/handlers/session.ts +64 -21
  64. package/src/handlers/sprints.ts +114 -134
  65. package/src/handlers/tasks.test.ts +61 -0
  66. package/src/handlers/tasks.ts +170 -139
  67. package/src/handlers/tool-docs.ts +1024 -0
  68. package/src/handlers/validation.test.ts +53 -1
  69. package/src/handlers/validation.ts +32 -21
  70. package/src/index.ts +25 -7
  71. package/src/tools.ts +417 -4
  72. package/dist/config/tool-categories.d.ts +0 -31
  73. package/dist/config/tool-categories.js +0 -253
  74. package/dist/knowledge.d.ts +0 -6
  75. package/dist/knowledge.js +0 -218
  76. package/src/knowledge.ts +0 -230
@@ -6,12 +6,23 @@
6
6
  * - claim_validation
7
7
  * - validate_task
8
8
  */
9
- import { validateRequired, validateUUID } from '../validators.js';
9
+ import { parseArgs, uuidValidator } from '../validators.js';
10
10
  import { getApiClient } from '../api-client.js';
11
- export const getTasksAwaitingValidation = async (args, ctx) => {
12
- const { project_id } = args;
13
- validateRequired(project_id, 'project_id');
14
- validateUUID(project_id, 'project_id');
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, approved } = args;
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 for visual grouping (frontend, backend, database, mcp, testing, docs, infra, other)',
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: all)' },
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
  ];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibescope/mcp-server",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "description": "MCP server for Vibescope - AI project tracking tools",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",