@specforge/mcp 2.0.0 → 2.0.2

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 (80) hide show
  1. package/dist/tools/core/admin.d.ts +7 -0
  2. package/dist/tools/core/admin.d.ts.map +1 -0
  3. package/dist/tools/core/admin.js +77 -0
  4. package/dist/tools/core/admin.js.map +1 -0
  5. package/dist/tools/core/bulk.d.ts +7 -0
  6. package/dist/tools/core/bulk.d.ts.map +1 -0
  7. package/dist/tools/core/bulk.js +125 -0
  8. package/dist/tools/core/bulk.js.map +1 -0
  9. package/dist/tools/core/context.d.ts +7 -0
  10. package/dist/tools/core/context.d.ts.map +1 -0
  11. package/dist/tools/core/context.js +75 -0
  12. package/dist/tools/core/context.js.map +1 -0
  13. package/dist/tools/core/dependency.d.ts +7 -0
  14. package/dist/tools/core/dependency.d.ts.map +1 -0
  15. package/dist/tools/core/dependency.js +74 -0
  16. package/dist/tools/core/dependency.js.map +1 -0
  17. package/dist/tools/core/epic.d.ts +7 -0
  18. package/dist/tools/core/epic.d.ts.map +1 -0
  19. package/dist/tools/core/epic.js +115 -0
  20. package/dist/tools/core/epic.js.map +1 -0
  21. package/dist/tools/core/help.d.ts +6 -0
  22. package/dist/tools/core/help.d.ts.map +1 -0
  23. package/dist/tools/core/help.js +112 -0
  24. package/dist/tools/core/help.js.map +1 -0
  25. package/dist/tools/core/index.d.ts +18 -0
  26. package/dist/tools/core/index.d.ts.map +1 -0
  27. package/dist/tools/core/index.js +20 -0
  28. package/dist/tools/core/index.js.map +1 -0
  29. package/dist/tools/core/job.d.ts +7 -0
  30. package/dist/tools/core/job.d.ts.map +1 -0
  31. package/dist/tools/core/job.js +50 -0
  32. package/dist/tools/core/job.js.map +1 -0
  33. package/dist/tools/core/link.d.ts +7 -0
  34. package/dist/tools/core/link.d.ts.map +1 -0
  35. package/dist/tools/core/link.js +76 -0
  36. package/dist/tools/core/link.js.map +1 -0
  37. package/dist/tools/core/lookup.d.ts +7 -0
  38. package/dist/tools/core/lookup.d.ts.map +1 -0
  39. package/dist/tools/core/lookup.js +107 -0
  40. package/dist/tools/core/lookup.js.map +1 -0
  41. package/dist/tools/core/pattern.d.ts +7 -0
  42. package/dist/tools/core/pattern.d.ts.map +1 -0
  43. package/dist/tools/core/pattern.js +61 -0
  44. package/dist/tools/core/pattern.js.map +1 -0
  45. package/dist/tools/core/project.d.ts +7 -0
  46. package/dist/tools/core/project.d.ts.map +1 -0
  47. package/dist/tools/core/project.js +60 -0
  48. package/dist/tools/core/project.js.map +1 -0
  49. package/dist/tools/core/router.d.ts +3 -0
  50. package/dist/tools/core/router.d.ts.map +1 -0
  51. package/dist/tools/core/router.js +16 -0
  52. package/dist/tools/core/router.js.map +1 -0
  53. package/dist/tools/core/session.d.ts +7 -0
  54. package/dist/tools/core/session.d.ts.map +1 -0
  55. package/dist/tools/core/session.js +117 -0
  56. package/dist/tools/core/session.js.map +1 -0
  57. package/dist/tools/core/specification.d.ts +7 -0
  58. package/dist/tools/core/specification.d.ts.map +1 -0
  59. package/dist/tools/core/specification.js +107 -0
  60. package/dist/tools/core/specification.js.map +1 -0
  61. package/dist/tools/core/ticket.d.ts +7 -0
  62. package/dist/tools/core/ticket.d.ts.map +1 -0
  63. package/dist/tools/core/ticket.js +213 -0
  64. package/dist/tools/core/ticket.js.map +1 -0
  65. package/dist/tools/core/types.d.ts +13 -0
  66. package/dist/tools/core/types.d.ts.map +1 -0
  67. package/dist/tools/core/types.js +3 -0
  68. package/dist/tools/core/types.js.map +1 -0
  69. package/dist/tools/core/workflow.d.ts +7 -0
  70. package/dist/tools/core/workflow.d.ts.map +1 -0
  71. package/dist/tools/core/workflow.js +63 -0
  72. package/dist/tools/core/workflow.js.map +1 -0
  73. package/dist/tools/index.d.ts.map +1 -1
  74. package/dist/tools/index.js +49 -0
  75. package/dist/tools/index.js.map +1 -1
  76. package/dist/types/index.d.ts +38 -1
  77. package/dist/types/index.d.ts.map +1 -1
  78. package/dist/types/index.js +20 -0
  79. package/dist/types/index.js.map +1 -1
  80. package/package.json +1 -1
@@ -0,0 +1,7 @@
1
+ import { Tool } from '@modelcontextprotocol/sdk/types.js';
2
+ import { ConsolidatedToolArgs, OperationHandler } from './types.js';
3
+ import { ApiClient } from '../../client/api-client.js';
4
+ export declare const adminTool: Tool;
5
+ export declare function createAdminOperations(apiClient: ApiClient): Record<string, OperationHandler>;
6
+ export declare function createAdminHandler(apiClient: ApiClient): (args: ConsolidatedToolArgs, userId: string) => Promise<unknown>;
7
+ //# sourceMappingURL=admin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../src/tools/core/admin.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAE1D,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEvD,eAAO,MAAM,SAAS,EAAE,IA+BvB,CAAC;AAUF,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CA+B5F;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,SAAS,oEAGtD"}
@@ -0,0 +1,77 @@
1
+ // mcp/src/tools/core/admin.ts
2
+ import { createOperationRouter } from './router.js';
3
+ export const adminTool = {
4
+ name: 'admin',
5
+ description: `Administrative utilities. Operations:
6
+ - reset_tickets: Reset ticket statuses
7
+ - validate_counts: Validate and fix count aggregations`,
8
+ inputSchema: {
9
+ type: 'object',
10
+ properties: {
11
+ operation: {
12
+ type: 'string',
13
+ enum: ['reset_tickets', 'validate_counts'],
14
+ description: 'The operation to perform',
15
+ },
16
+ // For reset_tickets
17
+ specificationId: { type: 'string', description: 'Specification ID' },
18
+ epicId: { type: 'string', description: 'Epic ID' },
19
+ ticketIds: { type: 'array', items: { type: 'string' } },
20
+ fromTicketId: { type: 'string' },
21
+ allTickets: { type: 'boolean' },
22
+ targetStatus: { type: 'string' },
23
+ resetDependents: { type: 'boolean' },
24
+ includeCompleted: { type: 'boolean' },
25
+ preserveNotes: { type: 'boolean' },
26
+ clearTestResults: { type: 'boolean' },
27
+ // For validate_counts
28
+ projectId: { type: 'string', description: 'Project ID' },
29
+ repair: { type: 'boolean', description: 'Auto-repair issues' },
30
+ verbose: { type: 'boolean', description: 'Verbose output' },
31
+ },
32
+ required: ['operation'],
33
+ },
34
+ };
35
+ function validateRequired(args, ...fields) {
36
+ for (const field of fields) {
37
+ if (args[field] === undefined || args[field] === null || args[field] === '') {
38
+ throw new Error(`${field} is required`);
39
+ }
40
+ }
41
+ }
42
+ export function createAdminOperations(apiClient) {
43
+ return {
44
+ reset_tickets: async (args, _userId) => {
45
+ validateRequired(args, 'specificationId');
46
+ return await apiClient.call('reset_tickets', {
47
+ specificationId: args.specificationId,
48
+ ticketIds: args.ticketIds,
49
+ fromTicketId: args.fromTicketId,
50
+ epicId: args.epicId,
51
+ allTickets: args.allTickets,
52
+ targetStatus: args.targetStatus,
53
+ resetDependents: args.resetDependents,
54
+ includeCompleted: args.includeCompleted,
55
+ preserveNotes: args.preserveNotes,
56
+ clearTestResults: args.clearTestResults,
57
+ });
58
+ },
59
+ validate_counts: async (args, _userId) => {
60
+ if (!args.projectId && !args.specificationId && !args.epicId) {
61
+ throw new Error('Must specify projectId, specificationId, or epicId');
62
+ }
63
+ return await apiClient.call('validate_counts', {
64
+ projectId: args.projectId,
65
+ specificationId: args.specificationId,
66
+ epicId: args.epicId,
67
+ repair: args.repair,
68
+ verbose: args.verbose,
69
+ });
70
+ },
71
+ };
72
+ }
73
+ export function createAdminHandler(apiClient) {
74
+ const operations = createAdminOperations(apiClient);
75
+ return createOperationRouter('admin', operations);
76
+ }
77
+ //# sourceMappingURL=admin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.js","sourceRoot":"","sources":["../../../src/tools/core/admin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Tool } from '@modelcontextprotocol/sdk/types.js';
2
+ import { ConsolidatedToolArgs, OperationHandler } from './types.js';
3
+ import { ApiClient } from '../../client/api-client.js';
4
+ export declare const bulkTool: Tool;
5
+ export declare function createBulkOperations(apiClient: ApiClient): Record<string, OperationHandler>;
6
+ export declare function createBulkHandler(apiClient: ApiClient): (args: ConsolidatedToolArgs, userId: string) => Promise<unknown>;
7
+ //# sourceMappingURL=bulk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk.d.ts","sourceRoot":"","sources":["../../../src/tools/core/bulk.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAE1D,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEvD,eAAO,MAAM,QAAQ,EAAE,IAqDtB,CAAC;AAUF,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CA0D3F;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,SAAS,oEAGrD"}
@@ -0,0 +1,125 @@
1
+ // mcp/src/tools/core/bulk.ts
2
+ import { createOperationRouter } from './router.js';
3
+ export const bulkTool = {
4
+ name: 'bulk',
5
+ description: `Bulk operations on multiple items. Operations:
6
+ - create_tickets: Create multiple tickets at once
7
+ - update_tickets: Update multiple tickets
8
+ - add_dependencies: Add multiple dependencies`,
9
+ inputSchema: {
10
+ type: 'object',
11
+ properties: {
12
+ operation: {
13
+ type: 'string',
14
+ enum: ['create_tickets', 'update_tickets', 'add_dependencies'],
15
+ description: 'The operation to perform',
16
+ },
17
+ // For create_tickets
18
+ epicId: { type: 'string', description: 'Epic ID for create_tickets' },
19
+ tickets: {
20
+ type: 'array',
21
+ items: { type: 'object' },
22
+ description: 'Ticket data for create_tickets',
23
+ },
24
+ // For update_tickets
25
+ updates: {
26
+ type: 'array',
27
+ items: { type: 'object' },
28
+ description: 'Updates for update_tickets',
29
+ },
30
+ // For add_dependencies
31
+ dependencies: {
32
+ type: 'array',
33
+ items: {
34
+ type: 'object',
35
+ properties: {
36
+ ticketId: { type: 'string' },
37
+ dependsOnId: { type: 'string' },
38
+ },
39
+ },
40
+ description: 'Dependencies to add',
41
+ },
42
+ // Options
43
+ onError: {
44
+ type: 'string',
45
+ enum: ['stop', 'continue', 'rollback'],
46
+ description: 'Error handling strategy',
47
+ },
48
+ skipCircularCheck: { type: 'boolean' },
49
+ validateDependencies: { type: 'boolean' },
50
+ atomic: { type: 'boolean' },
51
+ // Response options
52
+ responseMode: { type: 'string', enum: ['full', 'id-only', 'summary'] },
53
+ },
54
+ required: ['operation'],
55
+ },
56
+ };
57
+ function validateRequired(args, ...fields) {
58
+ for (const field of fields) {
59
+ if (args[field] === undefined || args[field] === null || args[field] === '') {
60
+ throw new Error(`${field} is required`);
61
+ }
62
+ }
63
+ }
64
+ export function createBulkOperations(apiClient) {
65
+ return {
66
+ create_tickets: async (args, _userId) => {
67
+ validateRequired(args, 'epicId', 'tickets');
68
+ if (!Array.isArray(args.tickets) || args.tickets.length === 0) {
69
+ throw new Error('tickets array is required and must not be empty');
70
+ }
71
+ // Validate each ticket has a title
72
+ const tickets = args.tickets;
73
+ for (let i = 0; i < tickets.length; i++) {
74
+ if (!tickets[i].title || typeof tickets[i].title !== 'string') {
75
+ throw new Error(`tickets[${i}].title is required and must be a string`);
76
+ }
77
+ }
78
+ return await apiClient.call('bulk_create_tickets', {
79
+ epicId: args.epicId,
80
+ tickets: args.tickets,
81
+ dependencies: args.dependencies,
82
+ onError: args.onError,
83
+ });
84
+ },
85
+ update_tickets: async (args, _userId) => {
86
+ if (!args.updates || !Array.isArray(args.updates) || args.updates.length === 0) {
87
+ throw new Error('updates array is required and must not be empty');
88
+ }
89
+ return await apiClient.call('bulk_update_tickets', {
90
+ updates: args.updates,
91
+ validateDependencies: args.validateDependencies,
92
+ atomic: args.atomic,
93
+ });
94
+ },
95
+ add_dependencies: async (args, _userId) => {
96
+ validateRequired(args, 'dependencies');
97
+ if (!Array.isArray(args.dependencies) || args.dependencies.length === 0) {
98
+ throw new Error('dependencies array is required and must not be empty');
99
+ }
100
+ // Validate each dependency has required fields
101
+ const deps = args.dependencies;
102
+ for (let i = 0; i < deps.length; i++) {
103
+ if (!deps[i].ticketId || typeof deps[i].ticketId !== 'string') {
104
+ throw new Error(`dependencies[${i}].ticketId is required`);
105
+ }
106
+ if (!deps[i].dependsOnId || typeof deps[i].dependsOnId !== 'string') {
107
+ throw new Error(`dependencies[${i}].dependsOnId is required`);
108
+ }
109
+ if (deps[i].ticketId === deps[i].dependsOnId) {
110
+ throw new Error(`dependencies[${i}]: ticket cannot depend on itself`);
111
+ }
112
+ }
113
+ return await apiClient.call('bulk_add_dependencies', {
114
+ dependencies: args.dependencies,
115
+ skipCircularCheck: args.skipCircularCheck,
116
+ onError: args.onError,
117
+ });
118
+ },
119
+ };
120
+ }
121
+ export function createBulkHandler(apiClient) {
122
+ const operations = createBulkOperations(apiClient);
123
+ return createOperationRouter('bulk', operations);
124
+ }
125
+ //# sourceMappingURL=bulk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk.js","sourceRoot":"","sources":["../../../src/tools/core/bulk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Tool } from '@modelcontextprotocol/sdk/types.js';
2
+ import { ConsolidatedToolArgs, OperationHandler } from './types.js';
3
+ import { ApiClient } from '../../client/api-client.js';
4
+ export declare const contextTool: Tool;
5
+ export declare function createContextOperations(apiClient: ApiClient): Record<string, OperationHandler>;
6
+ export declare function createContextHandler(apiClient: ApiClient): (args: ConsolidatedToolArgs, userId: string) => Promise<unknown>;
7
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/tools/core/context.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAE1D,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEvD,eAAO,MAAM,WAAW,EAAE,IA+BzB,CAAC;AAUF,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAgC9F;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,SAAS,oEAGxD"}
@@ -0,0 +1,75 @@
1
+ // mcp/src/tools/core/context.ts
2
+ import { createOperationRouter } from './router.js';
3
+ export const contextTool = {
4
+ name: 'context',
5
+ description: `Get and manage context. Operations:
6
+ - working: Get current working context (project scope)
7
+ - implementation: Get implementation context for a ticket
8
+ - set: Set/update current working context`,
9
+ inputSchema: {
10
+ type: 'object',
11
+ properties: {
12
+ operation: {
13
+ type: 'string',
14
+ enum: ['working', 'implementation', 'set'],
15
+ description: 'The operation to perform',
16
+ },
17
+ // For set working context
18
+ projectId: { type: 'string', description: 'Project ID' },
19
+ specificationId: { type: 'string', description: 'Specification ID' },
20
+ epicId: { type: 'string', description: 'Epic ID' },
21
+ // For implementation context
22
+ ticketId: { type: 'string', description: 'Ticket ID for implementation context' },
23
+ depth: {
24
+ type: 'string',
25
+ enum: ['minimal', 'standard', 'full'],
26
+ description: 'Context depth level',
27
+ },
28
+ // Response options
29
+ format: { type: 'string', enum: ['json', 'toon'] },
30
+ responseMode: { type: 'string', enum: ['full', 'minimal', 'summary', 'id-only'] },
31
+ },
32
+ required: ['operation'],
33
+ },
34
+ };
35
+ function validateRequired(args, ...fields) {
36
+ for (const field of fields) {
37
+ if (args[field] === undefined || args[field] === null || args[field] === '') {
38
+ throw new Error(`${field} is required`);
39
+ }
40
+ }
41
+ }
42
+ export function createContextOperations(apiClient) {
43
+ return {
44
+ working: async (_args, _userId) => {
45
+ // Note: In actual implementation, this uses client.getSessionId()
46
+ // For the consolidated tool, we pass through to the API
47
+ return await apiClient.call('get_working_context', {});
48
+ },
49
+ implementation: async (args, _userId) => {
50
+ validateRequired(args, 'ticketId');
51
+ const depth = args.depth || 'standard';
52
+ return await apiClient.call('get_implementation_context', {
53
+ ticketId: args.ticketId,
54
+ depth,
55
+ });
56
+ },
57
+ set: async (args, _userId) => {
58
+ // At least one context field should be provided
59
+ if (!args.projectId && !args.specificationId && !args.epicId && !args.ticketId) {
60
+ throw new Error('At least one of projectId, specificationId, epicId, or ticketId is required');
61
+ }
62
+ return await apiClient.call('set_working_context', {
63
+ projectId: args.projectId,
64
+ specificationId: args.specificationId,
65
+ epicId: args.epicId,
66
+ ticketId: args.ticketId,
67
+ });
68
+ },
69
+ };
70
+ }
71
+ export function createContextHandler(apiClient) {
72
+ const operations = createContextOperations(apiClient);
73
+ return createOperationRouter('context', operations);
74
+ }
75
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/tools/core/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Tool } from '@modelcontextprotocol/sdk/types.js';
2
+ import { ConsolidatedToolArgs, OperationHandler } from './types.js';
3
+ import { ApiClient } from '../../client/api-client.js';
4
+ export declare const dependencyTool: Tool;
5
+ export declare function createDependencyOperations(apiClient: ApiClient): Record<string, OperationHandler>;
6
+ export declare function createDependencyHandler(apiClient: ApiClient): (args: ConsolidatedToolArgs, userId: string) => Promise<unknown>;
7
+ //# sourceMappingURL=dependency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency.d.ts","sourceRoot":"","sources":["../../../src/tools/core/dependency.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAE1D,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEvD,eAAO,MAAM,cAAc,EAAE,IA8B5B,CAAC;AAUF,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CA8BjG;AAED,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,SAAS,oEAG3D"}
@@ -0,0 +1,74 @@
1
+ // mcp/src/tools/core/dependency.ts
2
+ import { createOperationRouter } from './router.js';
3
+ export const dependencyTool = {
4
+ name: 'dependency',
5
+ description: `Manage ticket dependencies. Operations:
6
+ - add: Add a dependency between tickets
7
+ - remove: Remove a dependency
8
+ - tree: Get dependency tree for a specification`,
9
+ inputSchema: {
10
+ type: 'object',
11
+ properties: {
12
+ operation: {
13
+ type: 'string',
14
+ enum: ['add', 'remove', 'tree'],
15
+ description: 'The operation to perform',
16
+ },
17
+ // For add/remove
18
+ ticketId: { type: 'string', description: 'Ticket ID' },
19
+ dependsOnId: { type: 'string', description: 'Ticket that must complete first' },
20
+ dependencyId: { type: 'string', description: 'Dependency ID for remove' },
21
+ type: {
22
+ type: 'string',
23
+ enum: ['blocks', 'requires', 'related'],
24
+ description: 'Dependency type',
25
+ },
26
+ // For tree
27
+ specificationId: { type: 'string', description: 'Specification ID for tree' },
28
+ // Response options
29
+ format: { type: 'string', enum: ['json', 'toon'] },
30
+ },
31
+ required: ['operation'],
32
+ },
33
+ };
34
+ function validateRequired(args, ...fields) {
35
+ for (const field of fields) {
36
+ if (args[field] === undefined || args[field] === null || args[field] === '') {
37
+ throw new Error(`${field} is required`);
38
+ }
39
+ }
40
+ }
41
+ export function createDependencyOperations(apiClient) {
42
+ return {
43
+ add: async (args, _userId) => {
44
+ validateRequired(args, 'ticketId', 'dependsOnId');
45
+ return await apiClient.call('add_dependency', {
46
+ ticketId: args.ticketId,
47
+ dependsOnId: args.dependsOnId,
48
+ type: args.type,
49
+ });
50
+ },
51
+ remove: async (args, _userId) => {
52
+ // Either dependencyId or (ticketId + dependsOnId) required
53
+ if (!args.dependencyId && !args.ticketId) {
54
+ throw new Error('Either dependencyId or ticketId is required');
55
+ }
56
+ return await apiClient.call('remove_dependency', {
57
+ ticketId: args.ticketId,
58
+ dependsOnId: args.dependsOnId,
59
+ dependencyId: args.dependencyId,
60
+ });
61
+ },
62
+ tree: async (args, _userId) => {
63
+ validateRequired(args, 'specificationId');
64
+ return await apiClient.call('get_dependency_tree', {
65
+ specificationId: args.specificationId,
66
+ });
67
+ },
68
+ };
69
+ }
70
+ export function createDependencyHandler(apiClient) {
71
+ const operations = createDependencyOperations(apiClient);
72
+ return createOperationRouter('dependency', operations);
73
+ }
74
+ //# sourceMappingURL=dependency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency.js","sourceRoot":"","sources":["../../../src/tools/core/dependency.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Tool } from '@modelcontextprotocol/sdk/types.js';
2
+ import { ConsolidatedToolArgs, OperationHandler } from './types.js';
3
+ import { ApiClient } from '../../client/api-client.js';
4
+ export declare const epicTool: Tool;
5
+ export declare function createEpicOperations(apiClient: ApiClient): Record<string, OperationHandler>;
6
+ export declare function createEpicHandler(apiClient: ApiClient): (args: ConsolidatedToolArgs, userId: string) => Promise<unknown>;
7
+ //# sourceMappingURL=epic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"epic.d.ts","sourceRoot":"","sources":["../../../src/tools/core/epic.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAE1D,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEvD,eAAO,MAAM,QAAQ,EAAE,IA4CtB,CAAC;AAUF,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CA2D3F;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,SAAS,oEAGrD"}
@@ -0,0 +1,115 @@
1
+ // mcp/src/tools/core/epic.ts
2
+ import { createOperationRouter } from './router.js';
3
+ export const epicTool = {
4
+ name: 'epic',
5
+ description: `Manage epics. Operations:
6
+ - create: Create a new epic in a specification
7
+ - get: Get epic by ID
8
+ - update: Update epic fields
9
+ - list: List epics with filters
10
+ - lookup: Find epic by title or number`,
11
+ inputSchema: {
12
+ type: 'object',
13
+ properties: {
14
+ operation: {
15
+ type: 'string',
16
+ enum: ['create', 'get', 'update', 'list', 'lookup'],
17
+ description: 'The operation to perform',
18
+ },
19
+ // For get/update
20
+ epicId: { type: 'string', description: 'Epic ID' },
21
+ // For create/list/lookup
22
+ specificationId: { type: 'string', description: 'Specification ID' },
23
+ // For create/update
24
+ title: { type: 'string' },
25
+ description: { type: 'string' },
26
+ objective: { type: 'string' },
27
+ status: { type: 'string', enum: ['pending', 'active', 'done', 'archived'] },
28
+ priority: { type: 'string', enum: ['critical', 'high', 'medium', 'low'] },
29
+ tags: { type: 'array', items: { type: 'string' } },
30
+ estimatedHours: { type: 'number' },
31
+ // For lookup
32
+ number: { type: 'number', description: 'Epic number for lookup' },
33
+ // For list
34
+ filter: {
35
+ type: 'object',
36
+ properties: {
37
+ status: { type: 'string' },
38
+ },
39
+ },
40
+ // Response options
41
+ format: { type: 'string', enum: ['json', 'toon'] },
42
+ responseMode: { type: 'string', enum: ['full', 'minimal', 'summary', 'id-only'] },
43
+ include: { type: 'array', items: { type: 'string' } },
44
+ },
45
+ required: ['operation'],
46
+ },
47
+ };
48
+ function validateRequired(args, ...fields) {
49
+ for (const field of fields) {
50
+ if (args[field] === undefined || args[field] === null || args[field] === '') {
51
+ throw new Error(`${field} is required`);
52
+ }
53
+ }
54
+ }
55
+ export function createEpicOperations(apiClient) {
56
+ return {
57
+ create: async (args, _userId) => {
58
+ validateRequired(args, 'specificationId', 'title', 'description', 'objective');
59
+ return await apiClient.call('create_epic', {
60
+ specificationId: args.specificationId,
61
+ title: args.title,
62
+ description: args.description,
63
+ objective: args.objective,
64
+ priority: args.priority,
65
+ tags: args.tags,
66
+ estimatedHours: args.estimatedHours,
67
+ });
68
+ },
69
+ get: async (args, _userId) => {
70
+ validateRequired(args, 'epicId');
71
+ return await apiClient.call('get_epic', {
72
+ epicId: args.epicId,
73
+ include: args.include,
74
+ });
75
+ },
76
+ update: async (args, _userId) => {
77
+ validateRequired(args, 'epicId');
78
+ return await apiClient.call('update_epic', {
79
+ epicId: args.epicId,
80
+ title: args.title,
81
+ description: args.description,
82
+ objective: args.objective,
83
+ status: args.status,
84
+ priority: args.priority,
85
+ tags: args.tags,
86
+ estimatedHours: args.estimatedHours,
87
+ });
88
+ },
89
+ list: async (args, _userId) => {
90
+ validateRequired(args, 'specificationId');
91
+ const filter = args.filter;
92
+ return await apiClient.call('list_epics', {
93
+ specificationId: args.specificationId,
94
+ status: filter?.status || args.status,
95
+ });
96
+ },
97
+ lookup: async (args, _userId) => {
98
+ validateRequired(args, 'specificationId');
99
+ if (!args.title && args.number === undefined) {
100
+ throw new Error("Must provide either 'title' or 'number'");
101
+ }
102
+ return await apiClient.call('lookup_epic', {
103
+ specificationId: args.specificationId,
104
+ title: args.title,
105
+ number: args.number,
106
+ format: args.format,
107
+ });
108
+ },
109
+ };
110
+ }
111
+ export function createEpicHandler(apiClient) {
112
+ const operations = createEpicOperations(apiClient);
113
+ return createOperationRouter('epic', operations);
114
+ }
115
+ //# sourceMappingURL=epic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"epic.js","sourceRoot":"","sources":["../../../src/tools/core/epic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Tool } from '@modelcontextprotocol/sdk/types.js';
2
+ import { ConsolidatedToolArgs, OperationHandler } from './types.js';
3
+ export declare const helpTool: Tool;
4
+ export declare function createHelpOperations(): Record<string, OperationHandler>;
5
+ export declare function createHelpHandler(): (args: ConsolidatedToolArgs, userId: string) => Promise<unknown>;
6
+ //# sourceMappingURL=help.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../../src/tools/core/help.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAE1D,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AA2CpE,eAAO,MAAM,QAAQ,EAAE,IAkBtB,CAAC;AAUF,wBAAgB,oBAAoB,IAAI,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAyCvE;AAED,wBAAgB,iBAAiB,qEAGhC"}