@specforge/mcp 2.0.1 → 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 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../src/tools/core/router.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEpE,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,IAE9B,MAAM,oBAAoB,EAAE,QAAQ,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC,CAe5E"}
@@ -0,0 +1,16 @@
1
+ // mcp/src/tools/core/router.ts
2
+ export function createOperationRouter(toolName, operations) {
3
+ return async (args, userId) => {
4
+ const { operation } = args;
5
+ if (!operation || typeof operation !== 'string') {
6
+ throw new Error(`${toolName}: operation is required`);
7
+ }
8
+ const handler = operations[operation];
9
+ if (!handler) {
10
+ const validOps = Object.keys(operations).join(', ');
11
+ throw new Error(`${toolName}: unknown operation '${operation}'. Valid: ${validOps}`);
12
+ }
13
+ return handler(args, userId);
14
+ };
15
+ }
16
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../../src/tools/core/router.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAI/B,MAAM,UAAU,qBAAqB,CACnC,QAAgB,EAChB,UAA4C;IAE5C,OAAO,KAAK,EAAE,IAA0B,EAAE,MAAc,EAAoB,EAAE;QAC5E,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;QAE3B,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,yBAAyB,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,wBAAwB,SAAS,aAAa,QAAQ,EAAE,CAAC,CAAC;QACvF,CAAC;QAED,OAAO,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/B,CAAC,CAAC;AACJ,CAAC"}
@@ -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 sessionTool: Tool;
5
+ export declare function createSessionOperations(apiClient: ApiClient): Record<string, OperationHandler>;
6
+ export declare function createSessionHandler(apiClient: ApiClient): (args: ConsolidatedToolArgs, userId: string) => Promise<unknown>;
7
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/tools/core/session.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+CzB,CAAC;AAgBF,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAqD9F;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,SAAS,oEAGxD"}
@@ -0,0 +1,117 @@
1
+ // mcp/src/tools/core/session.ts
2
+ import { createOperationRouter } from './router.js';
3
+ export const sessionTool = {
4
+ name: 'session',
5
+ description: `Manage work sessions. Operations:
6
+ - start: Start working on a ticket
7
+ - complete: Complete the current session
8
+ - progress: Report progress on current session
9
+ - end: End session without completing
10
+ - report: Get session report`,
11
+ inputSchema: {
12
+ type: 'object',
13
+ properties: {
14
+ operation: {
15
+ type: 'string',
16
+ enum: ['start', 'complete', 'progress', 'end', 'report'],
17
+ description: 'The operation to perform',
18
+ },
19
+ // For start
20
+ ticketId: { type: 'string', description: 'Ticket ID for start/complete/progress' },
21
+ // For end
22
+ sessionId: { type: 'string', description: 'Session ID for end' },
23
+ // For complete
24
+ summary: { type: 'string', description: 'Summary for complete/end' },
25
+ filesCreated: { type: 'array', items: { type: 'string' } },
26
+ filesModified: { type: 'array', items: { type: 'string' } },
27
+ actualHours: { type: 'number' },
28
+ validated: { type: 'boolean' },
29
+ skipValidation: {
30
+ type: 'boolean',
31
+ description: 'Skip acceptance criteria validation check (for complete operation)',
32
+ default: false,
33
+ },
34
+ // For progress
35
+ progress: { type: 'number', description: 'Progress percentage (0-100)' },
36
+ message: { type: 'string', description: 'Progress message' },
37
+ // For end
38
+ status: { type: 'string', description: 'End status' },
39
+ // For report
40
+ type: { type: 'string', description: 'Report type' },
41
+ scope: { type: 'string', description: 'Report scope' },
42
+ scopeId: { type: 'string', description: 'Scope ID' },
43
+ startDate: { type: 'string' },
44
+ endDate: { type: 'string' },
45
+ // Response options
46
+ format: { type: 'string', enum: ['json', 'toon'] },
47
+ },
48
+ required: ['operation'],
49
+ },
50
+ };
51
+ function validateRequired(args, ...fields) {
52
+ for (const field of fields) {
53
+ if (args[field] === undefined || args[field] === null || args[field] === '') {
54
+ throw new Error(`${field} is required`);
55
+ }
56
+ }
57
+ }
58
+ function validateRange(value, field, min, max) {
59
+ if (value < min || value > max) {
60
+ throw new Error(`${field} must be between ${min} and ${max}`);
61
+ }
62
+ }
63
+ export function createSessionOperations(apiClient) {
64
+ return {
65
+ start: async (args, _userId) => {
66
+ validateRequired(args, 'ticketId');
67
+ return await apiClient.call('start_work_session', {
68
+ ticketId: args.ticketId,
69
+ });
70
+ },
71
+ complete: async (args, _userId) => {
72
+ validateRequired(args, 'ticketId', 'summary');
73
+ return await apiClient.call('complete_work_session', {
74
+ ticketId: args.ticketId,
75
+ summary: args.summary,
76
+ filesModified: args.filesModified,
77
+ filesCreated: args.filesCreated,
78
+ actualHours: args.actualHours,
79
+ validated: args.validated,
80
+ skipValidation: args.skipValidation,
81
+ });
82
+ },
83
+ progress: async (args, _userId) => {
84
+ validateRequired(args, 'ticketId', 'progress');
85
+ validateRange(args.progress, 'progress', 0, 100);
86
+ return await apiClient.call('report_progress', {
87
+ ticketId: args.ticketId,
88
+ progress: args.progress,
89
+ message: args.message,
90
+ });
91
+ },
92
+ end: async (args, _userId) => {
93
+ validateRequired(args, 'sessionId', 'status');
94
+ return await apiClient.call('end_session', {
95
+ sessionId: args.sessionId,
96
+ status: args.status,
97
+ summary: args.summary,
98
+ });
99
+ },
100
+ report: async (args, _userId) => {
101
+ validateRequired(args, 'type', 'scope', 'scopeId');
102
+ return await apiClient.call('get_report', {
103
+ type: args.type,
104
+ scope: args.scope,
105
+ scopeId: args.scopeId,
106
+ format: args.format ?? 'json',
107
+ startDate: args.startDate,
108
+ endDate: args.endDate,
109
+ });
110
+ },
111
+ };
112
+ }
113
+ export function createSessionHandler(apiClient) {
114
+ const operations = createSessionOperations(apiClient);
115
+ return createOperationRouter('session', operations);
116
+ }
117
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/tools/core/session.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 specificationTool: Tool;
5
+ export declare function createSpecificationOperations(apiClient: ApiClient): Record<string, OperationHandler>;
6
+ export declare function createSpecificationHandler(apiClient: ApiClient): (args: ConsolidatedToolArgs, userId: string) => Promise<unknown>;
7
+ //# sourceMappingURL=specification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specification.d.ts","sourceRoot":"","sources":["../../../src/tools/core/specification.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,iBAAiB,EAAE,IA2C/B,CAAC;AAUF,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAoDpG;AAED,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,SAAS,oEAG9D"}
@@ -0,0 +1,107 @@
1
+ // mcp/src/tools/core/specification.ts
2
+ import { createOperationRouter } from './router.js';
3
+ export const specificationTool = {
4
+ name: 'specification',
5
+ description: `Manage specifications. Operations:
6
+ - create: Create a new specification
7
+ - get: Get specification by ID
8
+ - update: Update specification fields
9
+ - import: Import specification from YAML/JSON
10
+ - list: List specifications`,
11
+ inputSchema: {
12
+ type: 'object',
13
+ properties: {
14
+ operation: {
15
+ type: 'string',
16
+ enum: ['create', 'get', 'update', 'import', 'list'],
17
+ description: 'The operation to perform',
18
+ },
19
+ // For get/update
20
+ specificationId: { type: 'string', description: 'Specification ID' },
21
+ // For create/list/import
22
+ projectId: { type: 'string', description: 'Project ID' },
23
+ // For create/update
24
+ title: { type: 'string' },
25
+ description: { type: 'string' },
26
+ status: { type: 'string', enum: ['draft', 'active', 'completed', 'archived'] },
27
+ priority: { type: 'string', enum: ['critical', 'high', 'medium', 'low'] },
28
+ tags: { type: 'array', items: { type: 'string' } },
29
+ // For import
30
+ content: { type: 'string', description: 'YAML/JSON content for import' },
31
+ specificationTypeId: { type: 'string' },
32
+ // For list
33
+ filter: {
34
+ type: 'object',
35
+ properties: {
36
+ status: { type: 'string' },
37
+ },
38
+ },
39
+ // Response options
40
+ format: { type: 'string', enum: ['json', 'toon'] },
41
+ responseMode: { type: 'string', enum: ['full', 'minimal', 'summary', 'id-only'] },
42
+ include: { type: 'array', items: { type: 'string' } },
43
+ },
44
+ required: ['operation'],
45
+ },
46
+ };
47
+ function validateRequired(args, ...fields) {
48
+ for (const field of fields) {
49
+ if (args[field] === undefined || args[field] === null || args[field] === '') {
50
+ throw new Error(`${field} is required`);
51
+ }
52
+ }
53
+ }
54
+ export function createSpecificationOperations(apiClient) {
55
+ return {
56
+ create: async (args, _userId) => {
57
+ validateRequired(args, 'projectId', 'title');
58
+ return await apiClient.call('create_specification', {
59
+ projectId: args.projectId,
60
+ title: args.title,
61
+ description: args.description,
62
+ priority: args.priority,
63
+ tags: args.tags,
64
+ });
65
+ },
66
+ get: async (args, _userId) => {
67
+ validateRequired(args, 'specificationId');
68
+ return await apiClient.call('get_specification', {
69
+ specificationId: args.specificationId,
70
+ include: args.include,
71
+ });
72
+ },
73
+ update: async (args, _userId) => {
74
+ validateRequired(args, 'specificationId');
75
+ return await apiClient.call('update_specification', {
76
+ specificationId: args.specificationId,
77
+ title: args.title,
78
+ description: args.description,
79
+ status: args.status,
80
+ priority: args.priority,
81
+ tags: args.tags,
82
+ });
83
+ },
84
+ import: async (args, _userId) => {
85
+ validateRequired(args, 'projectId', 'content');
86
+ return await apiClient.call('import_specification', {
87
+ projectId: args.projectId,
88
+ content: args.content,
89
+ title: args.title,
90
+ specificationTypeId: args.specificationTypeId,
91
+ });
92
+ },
93
+ list: async (args, _userId) => {
94
+ validateRequired(args, 'projectId');
95
+ const filter = args.filter;
96
+ return await apiClient.call('list_specifications', {
97
+ projectId: args.projectId,
98
+ status: filter?.status || args.status,
99
+ });
100
+ },
101
+ };
102
+ }
103
+ export function createSpecificationHandler(apiClient) {
104
+ const operations = createSpecificationOperations(apiClient);
105
+ return createOperationRouter('specification', operations);
106
+ }
107
+ //# sourceMappingURL=specification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specification.js","sourceRoot":"","sources":["../../../src/tools/core/specification.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 ticketTool: Tool;
5
+ export declare function createTicketOperations(apiClient: ApiClient): Record<string, OperationHandler>;
6
+ export declare function createTicketHandler(apiClient: ApiClient): (args: ConsolidatedToolArgs, userId: string) => Promise<unknown>;
7
+ //# sourceMappingURL=ticket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticket.d.ts","sourceRoot":"","sources":["../../../src/tools/core/ticket.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,UAAU,EAAE,IA6FxB,CAAC;AAUF,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CA+G7F;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,SAAS,oEAGvD"}
@@ -0,0 +1,213 @@
1
+ // mcp/src/tools/core/ticket.ts
2
+ import { createOperationRouter } from './router.js';
3
+ export const ticketTool = {
4
+ name: 'ticket',
5
+ description: `Manage tickets. Operations:
6
+ - create: Create a new ticket in an epic
7
+ - get: Get ticket by ID
8
+ - update: Update ticket fields
9
+ - list: List tickets with filters
10
+ - search: Search tickets by query
11
+ - validate: Validate acceptance criteria
12
+ - test_results: Record automated test results`,
13
+ inputSchema: {
14
+ type: 'object',
15
+ properties: {
16
+ operation: {
17
+ type: 'string',
18
+ enum: ['create', 'get', 'update', 'list', 'search', 'validate', 'test_results'],
19
+ description: 'The operation to perform',
20
+ },
21
+ // For get/update
22
+ ticketId: { type: 'string', description: 'Ticket ID' },
23
+ // For create
24
+ epicId: { type: 'string', description: 'Epic ID for create' },
25
+ title: { type: 'string' },
26
+ description: { type: 'string' },
27
+ // Common fields
28
+ status: { type: 'string', enum: ['pending', 'active', 'done', 'archived'] },
29
+ priority: { type: 'string', enum: ['critical', 'high', 'medium', 'low'] },
30
+ complexity: { type: 'string' },
31
+ estimatedHours: { type: 'number' },
32
+ tags: { type: 'array', items: { type: 'string' } },
33
+ // For list
34
+ filter: {
35
+ type: 'object',
36
+ properties: {
37
+ epicId: { type: 'string' },
38
+ status: { type: 'string' },
39
+ priority: { type: 'string' },
40
+ },
41
+ },
42
+ // For search
43
+ query: { type: 'string' },
44
+ // For search scope
45
+ projectId: { type: 'string' },
46
+ specificationId: { type: 'string' },
47
+ // Response options
48
+ format: { type: 'string', enum: ['json', 'toon'] },
49
+ responseMode: { type: 'string', enum: ['full', 'minimal', 'summary', 'id-only'] },
50
+ include: { type: 'array', items: { type: 'string' } },
51
+ // Validation operation parameters (TS-003)
52
+ criterionId: {
53
+ type: 'string',
54
+ description: 'ID of criterion to validate (for validate operation)',
55
+ },
56
+ passed: {
57
+ type: 'boolean',
58
+ description: 'Whether criterion passed validation',
59
+ },
60
+ notes: {
61
+ type: 'string',
62
+ description: 'Validation notes',
63
+ },
64
+ validations: {
65
+ type: 'array',
66
+ items: {
67
+ type: 'object',
68
+ properties: {
69
+ criterionId: { type: 'string' },
70
+ passed: { type: 'boolean' },
71
+ notes: { type: 'string' },
72
+ },
73
+ required: ['criterionId', 'passed'],
74
+ },
75
+ description: 'Bulk validate multiple criteria',
76
+ },
77
+ // Test results operation parameters (TS-003)
78
+ tests: {
79
+ type: 'array',
80
+ items: {
81
+ type: 'object',
82
+ properties: {
83
+ name: { type: 'string' },
84
+ file: { type: 'string' },
85
+ line: { type: 'number' },
86
+ status: { type: 'string', enum: ['passed', 'failed', 'skipped'] },
87
+ output: { type: 'string' },
88
+ },
89
+ required: ['name', 'file', 'status'],
90
+ },
91
+ description: 'Automated test results to record',
92
+ },
93
+ },
94
+ required: ['operation'],
95
+ },
96
+ };
97
+ function validateRequired(args, ...fields) {
98
+ for (const field of fields) {
99
+ if (args[field] === undefined || args[field] === null || args[field] === '') {
100
+ throw new Error(`${field} is required`);
101
+ }
102
+ }
103
+ }
104
+ export function createTicketOperations(apiClient) {
105
+ return {
106
+ create: async (args, _userId) => {
107
+ validateRequired(args, 'epicId', 'title');
108
+ return await apiClient.call('create_ticket', {
109
+ epicId: args.epicId,
110
+ title: args.title,
111
+ description: args.description,
112
+ status: args.status,
113
+ priority: args.priority,
114
+ complexity: args.complexity,
115
+ estimatedHours: args.estimatedHours,
116
+ tags: args.tags,
117
+ });
118
+ },
119
+ get: async (args, _userId) => {
120
+ validateRequired(args, 'ticketId');
121
+ return await apiClient.call('get_ticket', {
122
+ ticketId: args.ticketId,
123
+ include: args.include,
124
+ });
125
+ },
126
+ update: async (args, _userId) => {
127
+ validateRequired(args, 'ticketId');
128
+ return await apiClient.call('update_ticket', {
129
+ ticketId: args.ticketId,
130
+ title: args.title,
131
+ description: args.description,
132
+ status: args.status,
133
+ priority: args.priority,
134
+ complexity: args.complexity,
135
+ estimatedHours: args.estimatedHours,
136
+ tags: args.tags,
137
+ });
138
+ },
139
+ list: async (args, _userId) => {
140
+ const filter = args.filter;
141
+ const epicId = filter?.epicId || args.epicId;
142
+ if (!epicId) {
143
+ throw new Error('epicId is required (in filter.epicId or epicId)');
144
+ }
145
+ return await apiClient.call('list_tickets', {
146
+ epicId,
147
+ status: filter?.status || args.status,
148
+ });
149
+ },
150
+ search: async (args, _userId) => {
151
+ if (!args.query) {
152
+ throw new Error('query is required for search operation');
153
+ }
154
+ if (!args.projectId && !args.specificationId && !args.epicId) {
155
+ throw new Error('One of projectId, specificationId, or epicId is required');
156
+ }
157
+ return await apiClient.call('search_tickets', {
158
+ query: args.query,
159
+ projectId: args.projectId,
160
+ specificationId: args.specificationId,
161
+ epicId: args.epicId,
162
+ });
163
+ },
164
+ validate: async (args, userId) => {
165
+ validateRequired(args, 'ticketId');
166
+ if (args.criterionId !== undefined) {
167
+ // Single criterion validation
168
+ if (args.passed === undefined) {
169
+ throw new Error('passed is required when criterionId is provided');
170
+ }
171
+ return await apiClient.call('validate_criterion', {
172
+ ticketId: args.ticketId,
173
+ criterionId: args.criterionId,
174
+ passed: args.passed,
175
+ notes: args.notes,
176
+ validatedBy: userId,
177
+ });
178
+ }
179
+ else if (args.validations) {
180
+ // Bulk validation
181
+ if (!Array.isArray(args.validations) || args.validations.length === 0) {
182
+ throw new Error('validations must be a non-empty array');
183
+ }
184
+ return await apiClient.call('validate_all_criteria', {
185
+ ticketId: args.ticketId,
186
+ validations: args.validations,
187
+ validatedBy: userId,
188
+ });
189
+ }
190
+ else {
191
+ // Get validation status
192
+ return await apiClient.call('get_validation_status', {
193
+ ticketId: args.ticketId,
194
+ });
195
+ }
196
+ },
197
+ test_results: async (args, _userId) => {
198
+ validateRequired(args, 'ticketId');
199
+ if (!args.tests || !Array.isArray(args.tests) || args.tests.length === 0) {
200
+ throw new Error('tests must be a non-empty array');
201
+ }
202
+ return await apiClient.call('record_test_results', {
203
+ ticketId: args.ticketId,
204
+ tests: args.tests,
205
+ });
206
+ },
207
+ };
208
+ }
209
+ export function createTicketHandler(apiClient) {
210
+ const operations = createTicketOperations(apiClient);
211
+ return createOperationRouter('ticket', operations);
212
+ }
213
+ //# sourceMappingURL=ticket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticket.js","sourceRoot":"","sources":["../../../src/tools/core/ticket.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { Tool } from '@modelcontextprotocol/sdk/types.js';
2
+ export interface ConsolidatedToolArgs {
3
+ operation: string;
4
+ format?: 'json' | 'toon';
5
+ responseMode?: 'full' | 'minimal' | 'summary' | 'id-only';
6
+ [key: string]: unknown;
7
+ }
8
+ export type OperationHandler<T = unknown> = (args: ConsolidatedToolArgs, userId: string) => Promise<T>;
9
+ export interface ToolDefinition {
10
+ tool: Tool;
11
+ operations: Record<string, OperationHandler>;
12
+ }
13
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/tools/core/types.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAE1D,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC1D,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,GAAG,OAAO,IAAI,CAC1C,IAAI,EAAE,oBAAoB,EAC1B,MAAM,EAAE,MAAM,KACX,OAAO,CAAC,CAAC,CAAC,CAAC;AAEhB,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,IAAI,CAAC;IACX,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAC9C"}
@@ -0,0 +1,3 @@
1
+ // mcp/src/tools/core/types.ts
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/tools/core/types.ts"],"names":[],"mappings":"AAAA,8BAA8B"}
@@ -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 workflowTool: Tool;
5
+ export declare function createWorkflowOperations(apiClient: ApiClient): Record<string, OperationHandler>;
6
+ export declare function createWorkflowHandler(apiClient: ApiClient): (args: ConsolidatedToolArgs, userId: string) => Promise<unknown>;
7
+ //# sourceMappingURL=workflow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../../src/tools/core/workflow.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,YAAY,EAAE,IAsB1B,CAAC;AAUF,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CA2B/F;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,SAAS,oEAGzD"}
@@ -0,0 +1,63 @@
1
+ // mcp/src/tools/core/workflow.ts
2
+ import { createOperationRouter } from './router.js';
3
+ export const workflowTool = {
4
+ name: 'workflow',
5
+ description: `Get workflow information. Operations:
6
+ - next_actionable: Get tickets ready to work on
7
+ - blocked: Get blocked tickets
8
+ - critical_path: Get critical path through dependencies`,
9
+ inputSchema: {
10
+ type: 'object',
11
+ properties: {
12
+ operation: {
13
+ type: 'string',
14
+ enum: ['next_actionable', 'blocked', 'critical_path'],
15
+ description: 'The operation to perform',
16
+ },
17
+ specificationId: { type: 'string', description: 'Specification ID' },
18
+ projectId: { type: 'string', description: 'Project ID for next_actionable' },
19
+ limit: { type: 'number', description: 'Limit results' },
20
+ // Response options
21
+ format: { type: 'string', enum: ['json', 'toon'] },
22
+ },
23
+ required: ['operation'],
24
+ },
25
+ };
26
+ function validateRequired(args, ...fields) {
27
+ for (const field of fields) {
28
+ if (args[field] === undefined || args[field] === null || args[field] === '') {
29
+ throw new Error(`${field} is required`);
30
+ }
31
+ }
32
+ }
33
+ export function createWorkflowOperations(apiClient) {
34
+ return {
35
+ next_actionable: async (args, _userId) => {
36
+ if (!args.specificationId && !args.projectId) {
37
+ throw new Error('Either specificationId or projectId is required');
38
+ }
39
+ return await apiClient.call('get_next_actionable_tickets', {
40
+ specificationId: args.specificationId,
41
+ projectId: args.projectId,
42
+ limit: args.limit ?? 5,
43
+ });
44
+ },
45
+ blocked: async (args, _userId) => {
46
+ validateRequired(args, 'specificationId');
47
+ return await apiClient.call('get_blocked_tickets', {
48
+ specificationId: args.specificationId,
49
+ });
50
+ },
51
+ critical_path: async (args, _userId) => {
52
+ validateRequired(args, 'specificationId');
53
+ return await apiClient.call('get_critical_path', {
54
+ specificationId: args.specificationId,
55
+ });
56
+ },
57
+ };
58
+ }
59
+ export function createWorkflowHandler(apiClient) {
60
+ const operations = createWorkflowOperations(apiClient);
61
+ return createOperationRouter('workflow', operations);
62
+ }
63
+ //# sourceMappingURL=workflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../../src/tools/core/workflow.ts"],"names":[],"mappings":"AAAA,iCAAiC;AAGjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAIpD,MAAM,CAAC,MAAM,YAAY,GAAS;IAChC,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE;;;wDAGyC;IACtD,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,iBAAiB,EAAE,SAAS,EAAE,eAAe,CAAC;gBACrD,WAAW,EAAE,0BAA0B;aACxC;YACD,eAAe,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE;YACpE,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gCAAgC,EAAE;YAC5E,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE;YACvD,mBAAmB;YACnB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE;SACnD;QACD,QAAQ,EAAE,CAAC,WAAW,CAAC;KACxB;CACF,CAAC;AAEF,SAAS,gBAAgB,CAAC,IAA0B,EAAE,GAAG,MAAgB;IACvE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;YAC5E,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,cAAc,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,SAAoB;IAC3D,OAAO;QACL,eAAe,EAAE,KAAK,EAAE,IAA0B,EAAE,OAAe,EAAE,EAAE;YACrE,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC7C,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;YACrE,CAAC;YACD,OAAO,MAAM,SAAS,CAAC,IAAI,CAAC,6BAA6B,EAAE;gBACzD,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC;aACvB,CAAC,CAAC;QACL,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,IAA0B,EAAE,OAAe,EAAE,EAAE;YAC7D,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;YAC1C,OAAO,MAAM,SAAS,CAAC,IAAI,CAAC,qBAAqB,EAAE;gBACjD,eAAe,EAAE,IAAI,CAAC,eAAe;aACtC,CAAC,CAAC;QACL,CAAC;QAED,aAAa,EAAE,KAAK,EAAE,IAA0B,EAAE,OAAe,EAAE,EAAE;YACnE,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;YAC1C,OAAO,MAAM,SAAS,CAAC,IAAI,CAAC,mBAAmB,EAAE;gBAC/C,eAAe,EAAE,IAAI,CAAC,eAAe;aACtC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,SAAoB;IACxD,MAAM,UAAU,GAAG,wBAAwB,CAAC,SAAS,CAAC,CAAC;IACvD,OAAO,qBAAqB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AACvD,CAAC"}