@gitscrum-studio/mcp-server 1.0.0

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 (119) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +250 -0
  3. package/dist/auth/DeviceAuthenticator.d.ts +51 -0
  4. package/dist/auth/DeviceAuthenticator.d.ts.map +1 -0
  5. package/dist/auth/DeviceAuthenticator.js +89 -0
  6. package/dist/auth/DeviceAuthenticator.js.map +1 -0
  7. package/dist/auth/RateLimiter.d.ts +58 -0
  8. package/dist/auth/RateLimiter.d.ts.map +1 -0
  9. package/dist/auth/RateLimiter.js +181 -0
  10. package/dist/auth/RateLimiter.js.map +1 -0
  11. package/dist/auth/TokenManager.d.ts +62 -0
  12. package/dist/auth/TokenManager.d.ts.map +1 -0
  13. package/dist/auth/TokenManager.js +164 -0
  14. package/dist/auth/TokenManager.js.map +1 -0
  15. package/dist/client/GitScrumClient.d.ts +1002 -0
  16. package/dist/client/GitScrumClient.d.ts.map +1 -0
  17. package/dist/client/GitScrumClient.js +1835 -0
  18. package/dist/client/GitScrumClient.js.map +1 -0
  19. package/dist/context/ActiveContext.d.ts +79 -0
  20. package/dist/context/ActiveContext.d.ts.map +1 -0
  21. package/dist/context/ActiveContext.js +151 -0
  22. package/dist/context/ActiveContext.js.map +1 -0
  23. package/dist/index.d.ts +15 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +152 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/tools/activity.d.ts +12 -0
  28. package/dist/tools/activity.d.ts.map +1 -0
  29. package/dist/tools/activity.js +106 -0
  30. package/dist/tools/activity.js.map +1 -0
  31. package/dist/tools/analytics.d.ts +11 -0
  32. package/dist/tools/analytics.d.ts.map +1 -0
  33. package/dist/tools/analytics.js +117 -0
  34. package/dist/tools/analytics.js.map +1 -0
  35. package/dist/tools/auth.d.ts +17 -0
  36. package/dist/tools/auth.d.ts.map +1 -0
  37. package/dist/tools/auth.js +173 -0
  38. package/dist/tools/auth.js.map +1 -0
  39. package/dist/tools/budget.d.ts +12 -0
  40. package/dist/tools/budget.d.ts.map +1 -0
  41. package/dist/tools/budget.js +109 -0
  42. package/dist/tools/budget.js.map +1 -0
  43. package/dist/tools/clientflow.d.ts +12 -0
  44. package/dist/tools/clientflow.d.ts.map +1 -0
  45. package/dist/tools/clientflow.js +476 -0
  46. package/dist/tools/clientflow.js.map +1 -0
  47. package/dist/tools/comments.d.ts +11 -0
  48. package/dist/tools/comments.d.ts.map +1 -0
  49. package/dist/tools/comments.js +99 -0
  50. package/dist/tools/comments.js.map +1 -0
  51. package/dist/tools/discussions.d.ts +12 -0
  52. package/dist/tools/discussions.d.ts.map +1 -0
  53. package/dist/tools/discussions.js +200 -0
  54. package/dist/tools/discussions.js.map +1 -0
  55. package/dist/tools/epics.d.ts +11 -0
  56. package/dist/tools/epics.d.ts.map +1 -0
  57. package/dist/tools/epics.js +122 -0
  58. package/dist/tools/epics.js.map +1 -0
  59. package/dist/tools/labels.d.ts +11 -0
  60. package/dist/tools/labels.d.ts.map +1 -0
  61. package/dist/tools/labels.js +138 -0
  62. package/dist/tools/labels.js.map +1 -0
  63. package/dist/tools/notes.d.ts +11 -0
  64. package/dist/tools/notes.d.ts.map +1 -0
  65. package/dist/tools/notes.js +201 -0
  66. package/dist/tools/notes.js.map +1 -0
  67. package/dist/tools/projects.d.ts +12 -0
  68. package/dist/tools/projects.d.ts.map +1 -0
  69. package/dist/tools/projects.js +272 -0
  70. package/dist/tools/projects.js.map +1 -0
  71. package/dist/tools/search.d.ts +17 -0
  72. package/dist/tools/search.d.ts.map +1 -0
  73. package/dist/tools/search.js +56 -0
  74. package/dist/tools/search.js.map +1 -0
  75. package/dist/tools/shared/actionHandler.d.ts +67 -0
  76. package/dist/tools/shared/actionHandler.d.ts.map +1 -0
  77. package/dist/tools/shared/actionHandler.js +98 -0
  78. package/dist/tools/shared/actionHandler.js.map +1 -0
  79. package/dist/tools/shared/initModules.d.ts +6 -0
  80. package/dist/tools/shared/initModules.d.ts.map +1 -0
  81. package/dist/tools/shared/initModules.js +166 -0
  82. package/dist/tools/shared/initModules.js.map +1 -0
  83. package/dist/tools/shared/toolRegistry.d.ts +45 -0
  84. package/dist/tools/shared/toolRegistry.d.ts.map +1 -0
  85. package/dist/tools/shared/toolRegistry.js +59 -0
  86. package/dist/tools/shared/toolRegistry.js.map +1 -0
  87. package/dist/tools/sprints.d.ts +11 -0
  88. package/dist/tools/sprints.d.ts.map +1 -0
  89. package/dist/tools/sprints.js +271 -0
  90. package/dist/tools/sprints.js.map +1 -0
  91. package/dist/tools/standup.d.ts +11 -0
  92. package/dist/tools/standup.d.ts.map +1 -0
  93. package/dist/tools/standup.js +89 -0
  94. package/dist/tools/standup.js.map +1 -0
  95. package/dist/tools/taskTypes.d.ts +11 -0
  96. package/dist/tools/taskTypes.d.ts.map +1 -0
  97. package/dist/tools/taskTypes.js +132 -0
  98. package/dist/tools/taskTypes.js.map +1 -0
  99. package/dist/tools/tasks.d.ts +12 -0
  100. package/dist/tools/tasks.d.ts.map +1 -0
  101. package/dist/tools/tasks.js +470 -0
  102. package/dist/tools/tasks.js.map +1 -0
  103. package/dist/tools/timeTracking.d.ts +11 -0
  104. package/dist/tools/timeTracking.d.ts.map +1 -0
  105. package/dist/tools/timeTracking.js +174 -0
  106. package/dist/tools/timeTracking.js.map +1 -0
  107. package/dist/tools/userStories.d.ts +11 -0
  108. package/dist/tools/userStories.d.ts.map +1 -0
  109. package/dist/tools/userStories.js +166 -0
  110. package/dist/tools/userStories.js.map +1 -0
  111. package/dist/tools/wiki.d.ts +11 -0
  112. package/dist/tools/wiki.d.ts.map +1 -0
  113. package/dist/tools/wiki.js +154 -0
  114. package/dist/tools/wiki.js.map +1 -0
  115. package/dist/tools/workflows.d.ts +11 -0
  116. package/dist/tools/workflows.d.ts.map +1 -0
  117. package/dist/tools/workflows.js +144 -0
  118. package/dist/tools/workflows.js.map +1 -0
  119. package/package.json +89 -0
@@ -0,0 +1,174 @@
1
+ import { executeAction, success, required, resolveProjectContext } from "./shared/actionHandler.js";
2
+ // ============================================================================
3
+ // Tool Registration
4
+ // ============================================================================
5
+ export function registerTimeTrackingTools() {
6
+ return [
7
+ {
8
+ name: "time",
9
+ description: [
10
+ "Time tracking. Actions: active, start, stop, logs, analytics, team, reports, productivity, timeline.",
11
+ "",
12
+ "Workflow:",
13
+ "1. Use 'active' first to check if there is already a running timer",
14
+ "2. To start: get the task_uuid from 'task' tool (action: my, today, or filter), then call 'start' with task_uuid",
15
+ "3. To stop: get time_tracking_id from 'active' response, then call 'stop'",
16
+ "4. 'logs' shows time entries for a project",
17
+ "5. 'analytics'/'team'/'reports'/'productivity'/'timeline': requires company_slug. Optional: project_slug, period",
18
+ "",
19
+ "'active' and 'logs' require company_slug (auto-resolved if omitted).",
20
+ "'start' requires task_uuid (ask user which task if not specified).",
21
+ "'stop' requires time_tracking_id (get from 'active' response).",
22
+ "Period options: today, yesterday, last-7-days, last-14-days, last-15-days, this-month, last-month, last-30-days",
23
+ ].join("\n"),
24
+ inputSchema: {
25
+ type: "object",
26
+ properties: {
27
+ action: {
28
+ type: "string",
29
+ enum: ["active", "start", "stop", "logs", "analytics", "team", "reports", "productivity", "timeline"],
30
+ description: "Which operation to perform"
31
+ },
32
+ task_uuid: {
33
+ type: "string",
34
+ description: "Task's unique ID to track time on. Required for: start"
35
+ },
36
+ time_tracking_id: {
37
+ type: "string",
38
+ description: "Active timer's ID (get from 'active' action). Required for: stop"
39
+ },
40
+ project_slug: {
41
+ type: "string",
42
+ description: "Project identifier. Required for: logs"
43
+ },
44
+ company_slug: {
45
+ type: "string",
46
+ description: "Workspace identifier. Required for: active, logs (auto-resolved if omitted)"
47
+ },
48
+ description: {
49
+ type: "string",
50
+ description: "What you're working on (optional note for start)"
51
+ },
52
+ period: {
53
+ type: "string",
54
+ description: "Time period for analytics: today, yesterday, last-7-days, last-14-days, this-month, last-month, last-30-days"
55
+ },
56
+ report_type: {
57
+ type: "string",
58
+ description: "For 'reports' action: report type (default: summary)"
59
+ },
60
+ hourly_rate: {
61
+ type: "number",
62
+ description: "For 'reports' action: hourly rate for cost calculations"
63
+ },
64
+ },
65
+ required: ["action"],
66
+ },
67
+ annotations: { title: "Time Tracking", readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
68
+ },
69
+ ];
70
+ }
71
+ // ============================================================================
72
+ // Action Handlers
73
+ // ============================================================================
74
+ const timeHandlers = {
75
+ active: async (client, args) => {
76
+ // Resolve company_slug: use provided, or fetch user's first workspace
77
+ let companySlug = args.company_slug;
78
+ if (!companySlug) {
79
+ const workspaces = await client.getWorkspaces({ perPage: 1 });
80
+ const list = workspaces.data;
81
+ if (list && list.length > 0) {
82
+ companySlug = list[0].slug;
83
+ }
84
+ }
85
+ if (!companySlug)
86
+ return required("company_slug");
87
+ const timer = await client.getActiveTimer(companySlug);
88
+ const ctx = { company_slug: companySlug };
89
+ return success(JSON.stringify(timer || { active: false }, null, 2), ctx);
90
+ },
91
+ start: async (client, args) => {
92
+ if (!args.task_uuid)
93
+ return required("task_uuid (use 'task' tool with action 'my' or 'today' to find the task UUID)");
94
+ const result = await client.startTimer(args.task_uuid, args.description);
95
+ return success(JSON.stringify({ started: true, timer: result }, null, 2));
96
+ },
97
+ stop: async (client, args) => {
98
+ if (!args.time_tracking_id)
99
+ return required("time_tracking_id (use 'time' tool with action 'active' to get the ID)");
100
+ const timer = await client.stopTimer(args.time_tracking_id);
101
+ return success(JSON.stringify({ stopped: true, timer }, null, 2));
102
+ },
103
+ logs: async (client, args) => {
104
+ // Auto-resolve project context
105
+ const resolved = await resolveProjectContext(client, {
106
+ company_slug: args.company_slug,
107
+ project_slug: args.project_slug
108
+ });
109
+ if (!resolved)
110
+ return required("project_slug (or project name to search)");
111
+ const logs = await client.getTimeLogs(resolved.project_slug, resolved.company_slug);
112
+ return success(JSON.stringify(logs, null, 2));
113
+ },
114
+ analytics: async (client, args) => {
115
+ if (!args.company_slug)
116
+ return required("company_slug");
117
+ const data = await client.getTimeTrackingAnalytics(args.company_slug, {
118
+ project_slug: args.project_slug,
119
+ period: args.period,
120
+ });
121
+ const ctx = { company_slug: args.company_slug };
122
+ return success(JSON.stringify(data, null, 2), ctx);
123
+ },
124
+ team: async (client, args) => {
125
+ if (!args.company_slug)
126
+ return required("company_slug");
127
+ const data = await client.getTimeTrackingTeam(args.company_slug, {
128
+ project_slug: args.project_slug,
129
+ period: args.period,
130
+ });
131
+ const ctx = { company_slug: args.company_slug };
132
+ return success(JSON.stringify(data, null, 2), ctx);
133
+ },
134
+ reports: async (client, args) => {
135
+ if (!args.company_slug)
136
+ return required("company_slug");
137
+ const data = await client.getTimeTrackingReports(args.company_slug, {
138
+ project_slug: args.project_slug,
139
+ period: args.period,
140
+ report_type: args.report_type,
141
+ hourly_rate: args.hourly_rate,
142
+ });
143
+ const ctx = { company_slug: args.company_slug };
144
+ return success(JSON.stringify(data, null, 2), ctx);
145
+ },
146
+ productivity: async (client, args) => {
147
+ if (!args.company_slug)
148
+ return required("company_slug");
149
+ const data = await client.getTimeTrackingProductivity(args.company_slug, {
150
+ project_slug: args.project_slug,
151
+ period: args.period,
152
+ });
153
+ const ctx = { company_slug: args.company_slug };
154
+ return success(JSON.stringify(data, null, 2), ctx);
155
+ },
156
+ timeline: async (client, args) => {
157
+ if (!args.company_slug)
158
+ return required("company_slug");
159
+ const data = await client.getTimeTrackingTimeline(args.company_slug, {
160
+ project_slug: args.project_slug,
161
+ period: args.period,
162
+ });
163
+ const ctx = { company_slug: args.company_slug };
164
+ return success(JSON.stringify(data, null, 2), ctx);
165
+ },
166
+ };
167
+ // ============================================================================
168
+ // Main Handler
169
+ // ============================================================================
170
+ export async function handleTimeTrackingTool(client, _name, args = {}) {
171
+ const action = args.action;
172
+ return executeAction(timeHandlers, action, client, args);
173
+ }
174
+ //# sourceMappingURL=timeTracking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeTracking.js","sourceRoot":"","sources":["../../src/tools/timeTracking.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * User Story MCP Tool (Consolidated)
3
+ *
4
+ * Uses Action Handler pattern for clean, extensible code.
5
+ */
6
+ import type { Tool } from "@modelcontextprotocol/sdk/types.js";
7
+ import type { GitScrumClient } from "../client/GitScrumClient.js";
8
+ import { type ToolResponse } from "./shared/actionHandler.js";
9
+ export declare function registerUserStoryTools(): Tool[];
10
+ export declare function handleUserStoryTool(client: GitScrumClient, _name: string, args?: Record<string, unknown>): Promise<ToolResponse>;
11
+ //# sourceMappingURL=userStories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userStories.d.ts","sourceRoot":"","sources":["../../src/tools/userStories.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAML,KAAK,YAAY,EAElB,MAAM,2BAA2B,CAAC;AAMnC,wBAAgB,sBAAsB,IAAI,IAAI,EAAE,CA4D/C;AAoHD,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,YAAY,CAAC,CAIvB"}
@@ -0,0 +1,166 @@
1
+ import { executeAction, success, required, resolveProjectContext } from "./shared/actionHandler.js";
2
+ // ============================================================================
3
+ // Tool Registration
4
+ // ============================================================================
5
+ export function registerUserStoryTools() {
6
+ return [
7
+ {
8
+ name: "user_story",
9
+ description: [
10
+ "User stories. Actions: list, all, get, create, update.",
11
+ "",
12
+ "Workflow:",
13
+ "- 'list': requires company_slug + project_slug (returns stories with their slug)",
14
+ "- 'all': no params needed (returns all user stories across workspaces)",
15
+ "- 'get': requires slug (from 'list' response) + company_slug + project_slug",
16
+ "- 'create': requires title + company_slug + project_slug",
17
+ "- 'update': requires slug (from 'list' response) + company_slug + project_slug",
18
+ ].join("\n"),
19
+ inputSchema: {
20
+ type: "object",
21
+ properties: {
22
+ action: {
23
+ type: "string",
24
+ enum: ["list", "all", "get", "create", "update"],
25
+ description: "Which operation to perform"
26
+ },
27
+ project_slug: {
28
+ type: "string",
29
+ description: "Project identifier (always required)"
30
+ },
31
+ company_slug: {
32
+ type: "string",
33
+ description: "Workspace identifier (always required)"
34
+ },
35
+ slug: {
36
+ type: "string",
37
+ description: "Existing story's unique identifier. Only for: get, update. NOT for create."
38
+ },
39
+ title: {
40
+ type: "string",
41
+ description: "Story title text. Required when creating a new story."
42
+ },
43
+ additional_information: {
44
+ type: "string",
45
+ description: "Story details/context in markdown (optional for create)"
46
+ },
47
+ acceptance_criteria: {
48
+ type: "string",
49
+ description: "Definition of done - what must be true for story to be complete (optional)"
50
+ },
51
+ epic_uuid: {
52
+ type: "string",
53
+ description: "Epic UUID to associate story with (from 'epic' tool 'list'). Optional for create/update"
54
+ },
55
+ user_story_priority_id: {
56
+ type: "number",
57
+ description: "Priority ID (from 'project' action 'efforts'). Optional - auto-defaults on create"
58
+ },
59
+ },
60
+ required: ["action", "company_slug", "project_slug"],
61
+ },
62
+ annotations: { title: "User Stories", readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
63
+ },
64
+ ];
65
+ }
66
+ // ============================================================================
67
+ // Action Handlers
68
+ // ============================================================================
69
+ const userStoryHandlers = {
70
+ list: async (client, args) => {
71
+ // Auto-resolve project context
72
+ const resolved = await resolveProjectContext(client, {
73
+ company_slug: args.company_slug,
74
+ project_slug: args.project_slug
75
+ });
76
+ if (!resolved)
77
+ return required("project_slug (or company_slug + project_slug)");
78
+ const stories = await client.getUserStories(resolved.project_slug, resolved.company_slug);
79
+ const ctx = { company_slug: resolved.company_slug, project_slug: resolved.project_slug };
80
+ return success(JSON.stringify(stories, null, 2), ctx);
81
+ },
82
+ all: async (client) => {
83
+ const stories = await client.getAllWorkspacesUserStories();
84
+ return success(JSON.stringify(stories, null, 2));
85
+ },
86
+ get: async (client, args) => {
87
+ if (!args.slug)
88
+ return required("slug");
89
+ // Auto-resolve project context
90
+ const resolved = await resolveProjectContext(client, {
91
+ company_slug: args.company_slug,
92
+ project_slug: args.project_slug
93
+ });
94
+ if (!resolved)
95
+ return required("project_slug (or company_slug + project_slug)");
96
+ const story = await client.getUserStory(args.slug, resolved.project_slug, resolved.company_slug);
97
+ const ctx = {
98
+ company_slug: resolved.company_slug,
99
+ project_slug: resolved.project_slug,
100
+ user_story_slug: args.slug
101
+ };
102
+ return success(JSON.stringify(story, null, 2), ctx);
103
+ },
104
+ create: async (client, args) => {
105
+ if (!args.title)
106
+ return required("title");
107
+ // Auto-resolve project context
108
+ const resolved = await resolveProjectContext(client, {
109
+ company_slug: args.company_slug,
110
+ project_slug: args.project_slug
111
+ });
112
+ if (!resolved)
113
+ return required("project_slug (or company_slug + project_slug)");
114
+ const story = await client.createUserStory({
115
+ title: args.title,
116
+ project_slug: resolved.project_slug,
117
+ company_slug: resolved.company_slug,
118
+ additional_information: args.additional_information,
119
+ acceptance_criteria: args.acceptance_criteria,
120
+ epic_uuid: args.epic_uuid,
121
+ user_story_priority_id: args.user_story_priority_id,
122
+ });
123
+ const ctx = { company_slug: resolved.company_slug, project_slug: resolved.project_slug };
124
+ return success(JSON.stringify({ created: true, story }, null, 2), ctx);
125
+ },
126
+ update: async (client, args) => {
127
+ if (!args.slug)
128
+ return required("slug");
129
+ const resolved = await resolveProjectContext(client, {
130
+ company_slug: args.company_slug,
131
+ project_slug: args.project_slug
132
+ });
133
+ if (!resolved)
134
+ return required("project_slug (or company_slug + project_slug)");
135
+ const data = {
136
+ project_slug: resolved.project_slug,
137
+ company_slug: resolved.company_slug,
138
+ };
139
+ if (args.title !== undefined)
140
+ data.title = args.title;
141
+ if (args.additional_information !== undefined)
142
+ data.additional_information = args.additional_information;
143
+ if (args.acceptance_criteria !== undefined)
144
+ data.acceptance_criteria = args.acceptance_criteria;
145
+ if (args.epic_uuid !== undefined)
146
+ data.epic_uuid = args.epic_uuid;
147
+ if (args.user_story_priority_id !== undefined)
148
+ data.user_story_priority_id = args.user_story_priority_id;
149
+ const result = await client.updateUserStory(args.slug, data);
150
+ const ctx = {
151
+ company_slug: resolved.company_slug,
152
+ project_slug: resolved.project_slug,
153
+ user_story_slug: args.slug
154
+ };
155
+ return success(JSON.stringify({ updated: true, story: result }, null, 2), ctx);
156
+ },
157
+ };
158
+ // ============================================================================
159
+ // Main Handler
160
+ // ============================================================================
161
+ export async function handleUserStoryTool(client, _name, args = {}) {
162
+ // Auto-resolution is now in handlers
163
+ const action = args.action;
164
+ return executeAction(userStoryHandlers, action, client, args);
165
+ }
166
+ //# sourceMappingURL=userStories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userStories.js","sourceRoot":"","sources":["../../src/tools/userStories.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Wiki MCP Tool (Consolidated)
3
+ *
4
+ * Uses Action Handler pattern for clean, extensible code.
5
+ */
6
+ import type { Tool } from "@modelcontextprotocol/sdk/types.js";
7
+ import type { GitScrumClient } from "../client/GitScrumClient.js";
8
+ import { type ToolResponse } from "./shared/actionHandler.js";
9
+ export declare function registerWikiTools(): Tool[];
10
+ export declare function handleWikiTool(client: GitScrumClient, _name: string, args?: Record<string, unknown>): Promise<ToolResponse>;
11
+ //# sourceMappingURL=wiki.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiki.d.ts","sourceRoot":"","sources":["../../src/tools/wiki.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAML,KAAK,YAAY,EAElB,MAAM,2BAA2B,CAAC;AAMnC,wBAAgB,iBAAiB,IAAI,IAAI,EAAE,CA+D1C;AAyGD,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,YAAY,CAAC,CAGvB"}
@@ -0,0 +1,154 @@
1
+ import { executeAction, success, required, resolveProjectContext } from "./shared/actionHandler.js";
2
+ // ============================================================================
3
+ // Tool Registration
4
+ // ============================================================================
5
+ export function registerWikiTools() {
6
+ return [
7
+ {
8
+ name: "wiki",
9
+ description: [
10
+ "Wiki pages. Actions: list, get, create, update, search.",
11
+ "",
12
+ "All actions require company_slug + project_slug.",
13
+ "'get'/'update' require uuid (from 'list' response).",
14
+ "'search' requires q (search query, min 2 chars).",
15
+ ].join("\n"),
16
+ inputSchema: {
17
+ type: "object",
18
+ properties: {
19
+ action: {
20
+ type: "string",
21
+ enum: ["list", "get", "create", "update", "search"],
22
+ description: "Which operation to perform",
23
+ },
24
+ project_slug: {
25
+ type: "string",
26
+ description: "Project identifier (always required)"
27
+ },
28
+ company_slug: {
29
+ type: "string",
30
+ description: "Workspace identifier (always required)"
31
+ },
32
+ uuid: {
33
+ type: "string",
34
+ description: "Existing page's unique ID. Only for: get, update. NOT for create."
35
+ },
36
+ title: {
37
+ type: "string",
38
+ description: "Page title/heading text. Required when creating a new page."
39
+ },
40
+ content: {
41
+ type: "string",
42
+ description: "Page body text in Markdown. This is the actual content to save. Required for create."
43
+ },
44
+ parent_uuid: {
45
+ type: "string",
46
+ description: "Parent page ID for nested pages (optional)"
47
+ },
48
+ q: {
49
+ type: "string",
50
+ description: "Search query (min 2 chars). Required for search action."
51
+ },
52
+ limit: {
53
+ type: "number",
54
+ description: "Max results for search (default 20, max 50)"
55
+ },
56
+ },
57
+ required: ["action", "company_slug", "project_slug"],
58
+ },
59
+ annotations: {
60
+ title: "Wiki Documentation",
61
+ readOnlyHint: false,
62
+ destructiveHint: false,
63
+ idempotentHint: false,
64
+ openWorldHint: false,
65
+ },
66
+ },
67
+ ];
68
+ }
69
+ // ============================================================================
70
+ // Action Handlers
71
+ // ============================================================================
72
+ const wikiHandlers = {
73
+ list: async (client, args) => {
74
+ const resolved = await resolveProjectContext(client, {
75
+ company_slug: args.company_slug,
76
+ project_slug: args.project_slug
77
+ });
78
+ if (!resolved)
79
+ return required("project_slug (or company_slug + project_slug)");
80
+ const pages = await client.getWikiPages(resolved.project_slug, resolved.company_slug);
81
+ const ctx = { company_slug: resolved.company_slug, project_slug: resolved.project_slug };
82
+ return success(JSON.stringify(pages, null, 2), ctx);
83
+ },
84
+ get: async (client, args) => {
85
+ if (!args.uuid)
86
+ return required("uuid");
87
+ const resolved = await resolveProjectContext(client, {
88
+ company_slug: args.company_slug,
89
+ project_slug: args.project_slug
90
+ });
91
+ if (!resolved)
92
+ return required("project_slug (or company_slug + project_slug)");
93
+ const page = await client.getWikiPage(args.uuid, resolved.project_slug, resolved.company_slug);
94
+ const ctx = { company_slug: resolved.company_slug, project_slug: resolved.project_slug };
95
+ return success(JSON.stringify(page, null, 2), ctx);
96
+ },
97
+ create: async (client, args) => {
98
+ if (!args.title || !args.content)
99
+ return required("title and content");
100
+ const resolved = await resolveProjectContext(client, {
101
+ company_slug: args.company_slug,
102
+ project_slug: args.project_slug
103
+ });
104
+ if (!resolved)
105
+ return required("project_slug (or company_slug + project_slug)");
106
+ const page = await client.createWikiPage({
107
+ title: args.title,
108
+ content: args.content,
109
+ project_slug: resolved.project_slug,
110
+ company_slug: resolved.company_slug,
111
+ parent_uuid: args.parent_uuid,
112
+ });
113
+ const ctx = { company_slug: resolved.company_slug, project_slug: resolved.project_slug };
114
+ return success(JSON.stringify({ created: true, page }, null, 2), ctx);
115
+ },
116
+ update: async (client, args) => {
117
+ if (!args.uuid)
118
+ return required("uuid");
119
+ const resolved = await resolveProjectContext(client, {
120
+ company_slug: args.company_slug,
121
+ project_slug: args.project_slug
122
+ });
123
+ if (!resolved)
124
+ return required("project_slug (or company_slug + project_slug)");
125
+ const updateData = {};
126
+ if (args.title)
127
+ updateData.title = args.title;
128
+ if (args.content)
129
+ updateData.content = args.content;
130
+ await client.updateWikiPage(args.uuid, resolved.project_slug, resolved.company_slug, updateData);
131
+ return success(JSON.stringify({ updated: true, uuid: args.uuid }, null, 2));
132
+ },
133
+ search: async (client, args) => {
134
+ if (!args.q)
135
+ return required("q (search query, min 2 characters)");
136
+ const resolved = await resolveProjectContext(client, {
137
+ company_slug: args.company_slug,
138
+ project_slug: args.project_slug
139
+ });
140
+ if (!resolved)
141
+ return required("project_slug (or company_slug + project_slug)");
142
+ const results = await client.searchWikiPages(resolved.project_slug, resolved.company_slug, args.q, args.limit);
143
+ const ctx = { company_slug: resolved.company_slug, project_slug: resolved.project_slug };
144
+ return success(JSON.stringify(results, null, 2), ctx);
145
+ },
146
+ };
147
+ // ============================================================================
148
+ // Main Handler
149
+ // ============================================================================
150
+ export async function handleWikiTool(client, _name, args = {}) {
151
+ const action = args.action;
152
+ return executeAction(wikiHandlers, action, client, args);
153
+ }
154
+ //# sourceMappingURL=wiki.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiki.js","sourceRoot":"","sources":["../../src/tools/wiki.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Workflow Tools (Kanban Columns) - Consolidated
3
+ *
4
+ * Uses Action Handler pattern for clean, extensible code.
5
+ */
6
+ import type { Tool } from "@modelcontextprotocol/sdk/types.js";
7
+ import type { GitScrumClient } from "../client/GitScrumClient.js";
8
+ import { type ToolResponse } from "./shared/actionHandler.js";
9
+ export declare function registerWorkflowTools(): Tool[];
10
+ export declare function handleWorkflowTool(client: GitScrumClient, _name: string, args?: Record<string, unknown>): Promise<ToolResponse>;
11
+ //# sourceMappingURL=workflows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../../src/tools/workflows.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAOL,KAAK,YAAY,EAElB,MAAM,2BAA2B,CAAC;AAqCnC,wBAAgB,qBAAqB,IAAI,IAAI,EAAE,CAsD9C;AAgED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,YAAY,CAAC,CAGvB"}