@proletariat/cli 0.3.22 → 0.3.24

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 (173) hide show
  1. package/LICENSE +190 -21
  2. package/README.md +7 -7
  3. package/dist/commands/action/create.js +1 -1
  4. package/dist/commands/agent/{temp/cleanup.d.ts → cleanup.d.ts} +1 -1
  5. package/dist/commands/agent/{temp/cleanup.js → cleanup.js} +4 -4
  6. package/dist/commands/agent/index.js +8 -8
  7. package/dist/commands/branch/create.js +2 -2
  8. package/dist/commands/epic/create.d.ts +1 -0
  9. package/dist/commands/epic/create.js +39 -2
  10. package/dist/commands/epic/index.js +2 -2
  11. package/dist/commands/{epic/link/remove.d.ts → link/create.d.ts} +6 -7
  12. package/dist/commands/link/create.js +141 -0
  13. package/dist/commands/{epic/link/relates.d.ts → link/index.d.ts} +4 -5
  14. package/dist/commands/link/index.js +87 -0
  15. package/dist/commands/{epic/link/duplicates.d.ts → link/list.d.ts} +7 -4
  16. package/dist/commands/link/list.js +182 -0
  17. package/dist/commands/{spec/link → link}/remove.d.ts +4 -5
  18. package/dist/commands/link/remove.js +120 -0
  19. package/dist/commands/mcp-server.d.ts +22 -0
  20. package/dist/commands/mcp-server.js +98 -0
  21. package/dist/commands/phase/create.js +1 -1
  22. package/dist/commands/project/create.d.ts +1 -0
  23. package/dist/commands/project/create.js +38 -4
  24. package/dist/commands/spec/create.d.ts +1 -0
  25. package/dist/commands/spec/create.js +43 -2
  26. package/dist/commands/spec/index.js +2 -2
  27. package/dist/commands/{agent/staff → staff}/add.js +10 -10
  28. package/dist/commands/{agent/staff → staff}/index.d.ts +1 -1
  29. package/dist/commands/{agent/staff → staff}/index.js +7 -7
  30. package/dist/commands/{agent/staff → staff}/list.js +3 -3
  31. package/dist/commands/{agent/staff → staff}/remove.d.ts +1 -1
  32. package/dist/commands/{agent/staff → staff}/remove.js +8 -8
  33. package/dist/commands/{ticket/template → template}/apply.d.ts +8 -6
  34. package/dist/commands/template/apply.js +262 -0
  35. package/dist/commands/{ticket/template → template}/create.d.ts +5 -6
  36. package/dist/commands/template/create.js +238 -0
  37. package/dist/commands/template/index.js +48 -36
  38. package/dist/commands/{ticket/template → template}/save.d.ts +2 -2
  39. package/dist/commands/template/save.js +104 -0
  40. package/dist/commands/{phase/template → template}/update.d.ts +2 -2
  41. package/dist/commands/template/update.js +99 -0
  42. package/dist/commands/{agent/themes → theme}/add-names.d.ts +1 -1
  43. package/dist/commands/{agent/themes → theme}/add-names.js +6 -6
  44. package/dist/commands/{agent/themes → theme}/create.d.ts +1 -1
  45. package/dist/commands/{agent/themes → theme}/create.js +5 -5
  46. package/dist/commands/{agent/themes → theme}/index.d.ts +1 -1
  47. package/dist/commands/{agent/themes → theme}/index.js +10 -10
  48. package/dist/commands/{agent/themes → theme}/list.d.ts +1 -1
  49. package/dist/commands/{agent/themes → theme}/list.js +5 -5
  50. package/dist/commands/{agent/themes → theme}/set.d.ts +1 -1
  51. package/dist/commands/{agent/themes → theme}/set.js +7 -7
  52. package/dist/commands/ticket/create.d.ts +1 -0
  53. package/dist/commands/ticket/create.js +54 -2
  54. package/dist/commands/ticket/index.js +6 -6
  55. package/dist/commands/work/spawn.js +1 -1
  56. package/dist/lib/mcp/helpers.d.ts +43 -0
  57. package/dist/lib/mcp/helpers.js +57 -0
  58. package/dist/lib/mcp/index.d.ts +6 -0
  59. package/dist/lib/mcp/index.js +6 -0
  60. package/dist/lib/mcp/tools/action.d.ts +6 -0
  61. package/dist/lib/mcp/tools/action.js +88 -0
  62. package/dist/lib/mcp/tools/board.d.ts +6 -0
  63. package/dist/lib/mcp/tools/board.js +139 -0
  64. package/dist/lib/mcp/tools/category.d.ts +6 -0
  65. package/dist/lib/mcp/tools/category.js +84 -0
  66. package/dist/lib/mcp/tools/cli-passthrough.d.ts +15 -0
  67. package/dist/lib/mcp/tools/cli-passthrough.js +333 -0
  68. package/dist/lib/mcp/tools/epic.d.ts +6 -0
  69. package/dist/lib/mcp/tools/epic.js +178 -0
  70. package/dist/lib/mcp/tools/index.d.ts +18 -0
  71. package/dist/lib/mcp/tools/index.js +19 -0
  72. package/dist/lib/mcp/tools/phase.d.ts +6 -0
  73. package/dist/lib/mcp/tools/phase.js +131 -0
  74. package/dist/lib/mcp/tools/project.d.ts +6 -0
  75. package/dist/lib/mcp/tools/project.js +196 -0
  76. package/dist/lib/mcp/tools/roadmap.d.ts +6 -0
  77. package/dist/lib/mcp/tools/roadmap.js +123 -0
  78. package/dist/lib/mcp/tools/spec.d.ts +6 -0
  79. package/dist/lib/mcp/tools/spec.js +196 -0
  80. package/dist/lib/mcp/tools/status.d.ts +6 -0
  81. package/dist/lib/mcp/tools/status.js +109 -0
  82. package/dist/lib/mcp/tools/template.d.ts +6 -0
  83. package/dist/lib/mcp/tools/template.js +107 -0
  84. package/dist/lib/mcp/tools/ticket.d.ts +6 -0
  85. package/dist/lib/mcp/tools/ticket.js +393 -0
  86. package/dist/lib/mcp/tools/view.d.ts +6 -0
  87. package/dist/lib/mcp/tools/view.js +76 -0
  88. package/dist/lib/mcp/tools/work.d.ts +6 -0
  89. package/dist/lib/mcp/tools/work.js +132 -0
  90. package/dist/lib/mcp/tools/workflow.d.ts +6 -0
  91. package/dist/lib/mcp/tools/workflow.js +95 -0
  92. package/dist/lib/mcp/types.d.ts +17 -0
  93. package/dist/lib/mcp/types.js +4 -0
  94. package/dist/lib/prompt-json.d.ts +52 -1
  95. package/dist/lib/prompt-json.js +45 -0
  96. package/oclif.manifest.json +3553 -5457
  97. package/package.json +10 -7
  98. package/dist/commands/agent/temp/index.d.ts +0 -14
  99. package/dist/commands/agent/temp/index.js +0 -85
  100. package/dist/commands/agent/temp/list.d.ts +0 -7
  101. package/dist/commands/agent/temp/list.js +0 -108
  102. package/dist/commands/epic/link/block.d.ts +0 -14
  103. package/dist/commands/epic/link/block.js +0 -81
  104. package/dist/commands/epic/link/duplicates.js +0 -68
  105. package/dist/commands/epic/link/index.d.ts +0 -19
  106. package/dist/commands/epic/link/index.js +0 -272
  107. package/dist/commands/epic/link/relates.js +0 -68
  108. package/dist/commands/epic/link/remove.js +0 -93
  109. package/dist/commands/phase/template/apply.d.ts +0 -17
  110. package/dist/commands/phase/template/apply.js +0 -108
  111. package/dist/commands/phase/template/create.d.ts +0 -17
  112. package/dist/commands/phase/template/create.js +0 -104
  113. package/dist/commands/phase/template/delete.d.ts +0 -17
  114. package/dist/commands/phase/template/delete.js +0 -100
  115. package/dist/commands/phase/template/index.d.ts +0 -15
  116. package/dist/commands/phase/template/index.js +0 -130
  117. package/dist/commands/phase/template/list.d.ts +0 -16
  118. package/dist/commands/phase/template/list.js +0 -97
  119. package/dist/commands/phase/template/update.js +0 -89
  120. package/dist/commands/spec/link/depends.d.ts +0 -14
  121. package/dist/commands/spec/link/depends.js +0 -64
  122. package/dist/commands/spec/link/duplicates.d.ts +0 -14
  123. package/dist/commands/spec/link/duplicates.js +0 -63
  124. package/dist/commands/spec/link/index.d.ts +0 -19
  125. package/dist/commands/spec/link/index.js +0 -207
  126. package/dist/commands/spec/link/relates.d.ts +0 -14
  127. package/dist/commands/spec/link/relates.js +0 -63
  128. package/dist/commands/spec/link/remove.js +0 -96
  129. package/dist/commands/template/phase/apply.d.ts +0 -14
  130. package/dist/commands/template/phase/apply.js +0 -43
  131. package/dist/commands/template/phase/create.d.ts +0 -13
  132. package/dist/commands/template/phase/create.js +0 -38
  133. package/dist/commands/template/phase/delete.d.ts +0 -13
  134. package/dist/commands/template/phase/delete.js +0 -36
  135. package/dist/commands/template/phase/index.d.ts +0 -10
  136. package/dist/commands/template/phase/index.js +0 -63
  137. package/dist/commands/template/phase/list.d.ts +0 -11
  138. package/dist/commands/template/phase/list.js +0 -36
  139. package/dist/commands/template/phase/update.d.ts +0 -14
  140. package/dist/commands/template/phase/update.js +0 -43
  141. package/dist/commands/template/ticket/apply.d.ts +0 -17
  142. package/dist/commands/template/ticket/apply.js +0 -60
  143. package/dist/commands/template/ticket/create.d.ts +0 -20
  144. package/dist/commands/template/ticket/create.js +0 -89
  145. package/dist/commands/template/ticket/delete.d.ts +0 -13
  146. package/dist/commands/template/ticket/delete.js +0 -38
  147. package/dist/commands/template/ticket/index.d.ts +0 -10
  148. package/dist/commands/template/ticket/index.js +0 -63
  149. package/dist/commands/template/ticket/list.d.ts +0 -11
  150. package/dist/commands/template/ticket/list.js +0 -36
  151. package/dist/commands/template/ticket/save.d.ts +0 -15
  152. package/dist/commands/template/ticket/save.js +0 -46
  153. package/dist/commands/ticket/link/block.d.ts +0 -14
  154. package/dist/commands/ticket/link/block.js +0 -96
  155. package/dist/commands/ticket/link/duplicates.d.ts +0 -14
  156. package/dist/commands/ticket/link/duplicates.js +0 -95
  157. package/dist/commands/ticket/link/index.d.ts +0 -19
  158. package/dist/commands/ticket/link/index.js +0 -256
  159. package/dist/commands/ticket/link/relates.d.ts +0 -14
  160. package/dist/commands/ticket/link/relates.js +0 -95
  161. package/dist/commands/ticket/link/remove.d.ts +0 -16
  162. package/dist/commands/ticket/link/remove.js +0 -132
  163. package/dist/commands/ticket/template/apply.js +0 -252
  164. package/dist/commands/ticket/template/create.js +0 -386
  165. package/dist/commands/ticket/template/delete.d.ts +0 -17
  166. package/dist/commands/ticket/template/delete.js +0 -94
  167. package/dist/commands/ticket/template/index.d.ts +0 -15
  168. package/dist/commands/ticket/template/index.js +0 -120
  169. package/dist/commands/ticket/template/list.d.ts +0 -16
  170. package/dist/commands/ticket/template/list.js +0 -112
  171. package/dist/commands/ticket/template/save.js +0 -163
  172. /package/dist/commands/{agent/staff → staff}/add.d.ts +0 -0
  173. /package/dist/commands/{agent/staff → staff}/list.d.ts +0 -0
@@ -0,0 +1,333 @@
1
+ /**
2
+ * MCP CLI Passthrough Tools
3
+ *
4
+ * These tools call CLI commands that don't have a clean storage API.
5
+ * They're wrapped for MCP but return formatted text output.
6
+ */
7
+ import { z } from 'zod';
8
+ import { errorResponse, textResponse } from '../helpers.js';
9
+ export function registerAgentTools(server, ctx) {
10
+ server.tool('agent_list', 'List all agents', { type: z.enum(['staff', 'temp', 'all']).optional() }, async (params) => {
11
+ try {
12
+ const typeFlag = params.type ? `--type ${params.type}` : '';
13
+ const output = ctx.runCommand(`prlt agent list ${typeFlag} --json 2>/dev/null || prlt agent list ${typeFlag}`);
14
+ return textResponse(output);
15
+ }
16
+ catch (error) {
17
+ return errorResponse(error);
18
+ }
19
+ });
20
+ server.tool('agent_status', 'Check agent status', {}, async () => {
21
+ try {
22
+ const output = ctx.runCommand('prlt agent status --json 2>/dev/null || prlt agent status');
23
+ return textResponse(output);
24
+ }
25
+ catch (error) {
26
+ return errorResponse(error);
27
+ }
28
+ });
29
+ server.tool('agent_add', 'Add new agents', {
30
+ names: z.array(z.string()).optional().describe('Agent names'),
31
+ theme: z.string().optional().describe('Theme for names'),
32
+ clone: z.boolean().optional().describe('Use git clone instead of worktree'),
33
+ }, async (params) => {
34
+ try {
35
+ const namesArg = params.names?.join(' ') || '';
36
+ const themeFlag = params.theme ? `--theme ${params.theme}` : '';
37
+ const cloneFlag = params.clone ? '--clone' : '';
38
+ const output = ctx.runCommand(`prlt agent staff add ${namesArg} ${themeFlag} ${cloneFlag} --json`);
39
+ return textResponse(output);
40
+ }
41
+ catch (error) {
42
+ return errorResponse(error);
43
+ }
44
+ });
45
+ server.tool('agent_remove', 'Remove an agent', { name: z.string().describe('Agent name') }, async (params) => {
46
+ try {
47
+ const output = ctx.runCommand(`prlt agent remove ${params.name} --json`);
48
+ return textResponse(output);
49
+ }
50
+ catch (error) {
51
+ return errorResponse(error);
52
+ }
53
+ });
54
+ }
55
+ export function registerDockerTools(server, ctx) {
56
+ server.tool('docker_status', 'Check Docker daemon status', {}, async () => {
57
+ try {
58
+ const output = ctx.runCommand('prlt docker status');
59
+ return textResponse(output);
60
+ }
61
+ catch (error) {
62
+ return errorResponse(error);
63
+ }
64
+ });
65
+ server.tool('docker_list', 'List Docker containers', {}, async () => {
66
+ try {
67
+ const output = ctx.runCommand('prlt docker list');
68
+ return textResponse(output);
69
+ }
70
+ catch (error) {
71
+ return errorResponse(error);
72
+ }
73
+ });
74
+ server.tool('docker_start', 'Start Docker containers', { agent: z.string().optional().describe('Agent name') }, async (params) => {
75
+ try {
76
+ const agentArg = params.agent || '';
77
+ const output = ctx.runCommand(`prlt docker start ${agentArg}`);
78
+ return textResponse(output);
79
+ }
80
+ catch (error) {
81
+ return errorResponse(error);
82
+ }
83
+ });
84
+ server.tool('docker_stop', 'Stop Docker containers', { agent: z.string().optional().describe('Agent name') }, async (params) => {
85
+ try {
86
+ const agentArg = params.agent || '';
87
+ const output = ctx.runCommand(`prlt docker stop ${agentArg}`);
88
+ return textResponse(output);
89
+ }
90
+ catch (error) {
91
+ return errorResponse(error);
92
+ }
93
+ });
94
+ server.tool('docker_logs', 'Get container logs', {
95
+ agent: z.string().describe('Agent name'),
96
+ lines: z.number().optional().describe('Number of lines'),
97
+ }, async (params) => {
98
+ try {
99
+ const linesFlag = params.lines ? `-n ${params.lines}` : '';
100
+ const output = ctx.runCommand(`prlt docker logs ${params.agent} ${linesFlag}`);
101
+ return textResponse(output);
102
+ }
103
+ catch (error) {
104
+ return errorResponse(error);
105
+ }
106
+ });
107
+ }
108
+ export function registerRepoTools(server, ctx) {
109
+ server.tool('repo_list', 'List repositories in workspace', {}, async () => {
110
+ try {
111
+ const output = ctx.runCommand('prlt repo list');
112
+ return textResponse(output);
113
+ }
114
+ catch (error) {
115
+ return errorResponse(error);
116
+ }
117
+ });
118
+ server.tool('repo_add', 'Add a repository', {
119
+ path: z.string().describe('Repository path or URL'),
120
+ name: z.string().optional().describe('Name for the repo'),
121
+ }, async (params) => {
122
+ try {
123
+ const nameFlag = params.name ? `--name ${params.name}` : '';
124
+ const output = ctx.runCommand(`prlt repo add ${params.path} ${nameFlag}`);
125
+ return textResponse(output);
126
+ }
127
+ catch (error) {
128
+ return errorResponse(error);
129
+ }
130
+ });
131
+ server.tool('repo_remove', 'Remove a repository', { name: z.string().describe('Repository name') }, async (params) => {
132
+ try {
133
+ const output = ctx.runCommand(`prlt repo remove ${params.name}`);
134
+ return textResponse(output);
135
+ }
136
+ catch (error) {
137
+ return errorResponse(error);
138
+ }
139
+ });
140
+ }
141
+ export function registerBranchTools(server, ctx) {
142
+ server.tool('branch_list', 'List branches', {}, async () => {
143
+ try {
144
+ const output = ctx.runCommand('prlt branch list');
145
+ return textResponse(output);
146
+ }
147
+ catch (error) {
148
+ return errorResponse(error);
149
+ }
150
+ });
151
+ server.tool('branch_create', 'Create a branch for a ticket', {
152
+ ticket_id: z.string().describe('Ticket ID'),
153
+ name: z.string().optional().describe('Branch name override'),
154
+ }, async (params) => {
155
+ try {
156
+ const nameFlag = params.name ? `--name ${params.name}` : '';
157
+ const output = ctx.runCommand(`prlt branch create ${params.ticket_id} ${nameFlag}`);
158
+ return textResponse(output);
159
+ }
160
+ catch (error) {
161
+ return errorResponse(error);
162
+ }
163
+ });
164
+ server.tool('branch_where', 'Show which ticket/branch you are on', {}, async () => {
165
+ try {
166
+ const output = ctx.runCommand('prlt branch where');
167
+ return textResponse(output);
168
+ }
169
+ catch (error) {
170
+ return errorResponse(error);
171
+ }
172
+ });
173
+ }
174
+ export function registerGitHubTools(server, ctx) {
175
+ server.tool('gh_status', 'Check GitHub CLI status', {}, async () => {
176
+ try {
177
+ const output = ctx.runCommand('prlt gh status');
178
+ return textResponse(output);
179
+ }
180
+ catch (error) {
181
+ return errorResponse(error);
182
+ }
183
+ });
184
+ server.tool('gh_login', 'Login to GitHub', {}, async () => {
185
+ try {
186
+ const output = ctx.runCommand('prlt gh login');
187
+ return textResponse(output);
188
+ }
189
+ catch (error) {
190
+ return errorResponse(error);
191
+ }
192
+ });
193
+ server.tool('pr_create', 'Create a pull request', {
194
+ ticket_id: z.string().optional().describe('Ticket ID'),
195
+ title: z.string().optional().describe('PR title'),
196
+ body: z.string().optional().describe('PR body'),
197
+ draft: z.boolean().optional().describe('Create as draft'),
198
+ }, async (params) => {
199
+ try {
200
+ const ticketArg = params.ticket_id || '';
201
+ const titleFlag = params.title ? `--title "${params.title}"` : '';
202
+ const bodyFlag = params.body ? `--body "${params.body}"` : '';
203
+ const draftFlag = params.draft ? '--draft' : '';
204
+ const output = ctx.runCommand(`prlt pr create ${ticketArg} ${titleFlag} ${bodyFlag} ${draftFlag}`);
205
+ return textResponse(output);
206
+ }
207
+ catch (error) {
208
+ return errorResponse(error);
209
+ }
210
+ });
211
+ server.tool('pr_list', 'List pull requests', {}, async () => {
212
+ try {
213
+ const output = ctx.runCommand('prlt pr list');
214
+ return textResponse(output);
215
+ }
216
+ catch (error) {
217
+ return errorResponse(error);
218
+ }
219
+ });
220
+ server.tool('pr_status', 'Check PR status', {}, async () => {
221
+ try {
222
+ const output = ctx.runCommand('prlt pr status');
223
+ return textResponse(output);
224
+ }
225
+ catch (error) {
226
+ return errorResponse(error);
227
+ }
228
+ });
229
+ }
230
+ export function registerInitTools(server, ctx) {
231
+ server.tool('init', 'Initialize an HQ workspace', {
232
+ name: z.string().describe('HQ name'),
233
+ path: z.string().optional().describe('HQ path'),
234
+ repos: z.array(z.string()).optional().describe('Repository paths'),
235
+ agents: z.array(z.string()).optional().describe('Agent names'),
236
+ pmo: z.boolean().optional().describe('Include PMO'),
237
+ }, async (params) => {
238
+ try {
239
+ const pathFlag = params.path ? `--path ${params.path}` : '';
240
+ const reposFlag = params.repos?.length ? `--repos ${params.repos.join(',')}` : '';
241
+ const agentsFlag = params.agents?.length ? `--agents ${params.agents.join(',')}` : '';
242
+ const pmoFlag = params.pmo === false ? '--no-pmo' : '--pmo';
243
+ const output = ctx.runCommand(`prlt init --name ${params.name} ${pathFlag} ${reposFlag} ${agentsFlag} ${pmoFlag} --json`);
244
+ return textResponse(output);
245
+ }
246
+ catch (error) {
247
+ return errorResponse(error);
248
+ }
249
+ });
250
+ server.tool('pmo_init', 'Initialize PMO in existing workspace', {
251
+ template: z.string().optional().describe('Board template'),
252
+ name: z.string().optional().describe('Board name'),
253
+ }, async (params) => {
254
+ try {
255
+ const templateFlag = params.template ? `--template ${params.template}` : '';
256
+ const nameFlag = params.name ? `--name ${params.name}` : '';
257
+ const output = ctx.runCommand(`prlt pmo init ${templateFlag} ${nameFlag}`);
258
+ return textResponse(output);
259
+ }
260
+ catch (error) {
261
+ return errorResponse(error);
262
+ }
263
+ });
264
+ }
265
+ export function registerUtilityTools(server, ctx) {
266
+ server.tool('whoami', 'Show current context (agent, workspace)', {}, async () => {
267
+ try {
268
+ const output = ctx.runCommand('prlt whoami');
269
+ return textResponse(output);
270
+ }
271
+ catch (error) {
272
+ return errorResponse(error);
273
+ }
274
+ });
275
+ server.tool('commit', 'Create a commit with ticket reference', {
276
+ message: z.string().describe('Commit message'),
277
+ ticket_id: z.string().optional().describe('Ticket ID'),
278
+ }, async (params) => {
279
+ try {
280
+ const ticketArg = params.ticket_id || '';
281
+ const output = ctx.runCommand(`prlt commit "${params.message}" ${ticketArg}`);
282
+ return textResponse(output);
283
+ }
284
+ catch (error) {
285
+ return errorResponse(error);
286
+ }
287
+ });
288
+ server.tool('execution_list', 'List work executions', {}, async () => {
289
+ try {
290
+ const output = ctx.runCommand('prlt execution list');
291
+ return textResponse(output);
292
+ }
293
+ catch (error) {
294
+ return errorResponse(error);
295
+ }
296
+ });
297
+ server.tool('execution_view', 'View execution details', { id: z.string().describe('Execution ID') }, async (params) => {
298
+ try {
299
+ const output = ctx.runCommand(`prlt execution view ${params.id}`);
300
+ return textResponse(output);
301
+ }
302
+ catch (error) {
303
+ return errorResponse(error);
304
+ }
305
+ });
306
+ server.tool('execution_logs', 'Get execution logs', { id: z.string().describe('Execution ID') }, async (params) => {
307
+ try {
308
+ const output = ctx.runCommand(`prlt execution logs ${params.id}`);
309
+ return textResponse(output);
310
+ }
311
+ catch (error) {
312
+ return errorResponse(error);
313
+ }
314
+ });
315
+ server.tool('session_list', 'List tmux sessions', {}, async () => {
316
+ try {
317
+ const output = ctx.runCommand('prlt session list');
318
+ return textResponse(output);
319
+ }
320
+ catch (error) {
321
+ return errorResponse(error);
322
+ }
323
+ });
324
+ server.tool('config_show', 'Show configuration', {}, async () => {
325
+ try {
326
+ const output = ctx.runCommand('prlt config');
327
+ return textResponse(output);
328
+ }
329
+ catch (error) {
330
+ return errorResponse(error);
331
+ }
332
+ });
333
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * MCP Epic Tools
3
+ */
4
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ import type { McpToolContext } from '../types.js';
6
+ export declare function registerEpicTools(server: McpServer, ctx: McpToolContext): void;
@@ -0,0 +1,178 @@
1
+ /**
2
+ * MCP Epic Tools
3
+ */
4
+ import { z } from 'zod';
5
+ import { errorResponse } from '../helpers.js';
6
+ export function registerEpicTools(server, ctx) {
7
+ server.tool('epic_list', 'List epics', {
8
+ project: z.string().optional(),
9
+ status: z.enum(['active', 'draft', 'complete', 'dropped', 'future']).optional(),
10
+ search: z.string().optional(),
11
+ }, async (params) => {
12
+ try {
13
+ let projectId = params.project;
14
+ if (!projectId) {
15
+ const projects = await ctx.storage.listProjects();
16
+ if (projects.length === 0)
17
+ throw new Error('No projects');
18
+ projectId = projects[0].id;
19
+ }
20
+ const epics = await ctx.storage.listEpics(projectId, { status: params.status, search: params.search });
21
+ return {
22
+ content: [{
23
+ type: 'text',
24
+ text: JSON.stringify({
25
+ success: true,
26
+ count: epics.length,
27
+ epics: epics.map((e) => ({
28
+ id: e.id,
29
+ title: e.title,
30
+ status: e.status,
31
+ position: e.position,
32
+ projectId: e.projectId,
33
+ })),
34
+ }, null, 2),
35
+ }],
36
+ };
37
+ }
38
+ catch (error) {
39
+ return errorResponse(error);
40
+ }
41
+ });
42
+ server.tool('epic_create', 'Create an epic', {
43
+ title: z.string().describe('Epic title'),
44
+ project: z.string().optional(),
45
+ description: z.string().optional(),
46
+ status: z.enum(['active', 'draft', 'complete', 'dropped', 'future']).optional(),
47
+ spec_id: z.string().optional(),
48
+ }, async (params) => {
49
+ try {
50
+ let projectId = params.project;
51
+ if (!projectId) {
52
+ const projects = await ctx.storage.listProjects();
53
+ if (projects.length === 0)
54
+ throw new Error('No projects');
55
+ projectId = projects[0].id;
56
+ }
57
+ const epic = await ctx.storage.createEpic(projectId, {
58
+ title: params.title,
59
+ description: params.description,
60
+ status: params.status || 'draft',
61
+ specId: params.spec_id,
62
+ });
63
+ return {
64
+ content: [{
65
+ type: 'text',
66
+ text: JSON.stringify({ success: true, epic: { id: epic.id, title: epic.title, status: epic.status } }, null, 2),
67
+ }],
68
+ };
69
+ }
70
+ catch (error) {
71
+ return errorResponse(error);
72
+ }
73
+ });
74
+ server.tool('epic_show', 'Get epic details with tickets', { id: z.string().describe('Epic ID') }, async (params) => {
75
+ try {
76
+ const epic = await ctx.storage.getEpic(params.id);
77
+ if (!epic)
78
+ throw new Error(`Epic not found: ${params.id}`);
79
+ const tickets = await ctx.storage.getTicketsForEpic(epic.projectId, params.id);
80
+ return {
81
+ content: [{
82
+ type: 'text',
83
+ text: JSON.stringify({
84
+ success: true,
85
+ epic: {
86
+ ...epic,
87
+ ticketCount: tickets.length,
88
+ tickets: tickets.map((t) => ({ id: t.id, title: t.title, statusName: t.statusName, priority: t.priority })),
89
+ createdAt: epic.createdAt.toISOString(),
90
+ updatedAt: epic.updatedAt.toISOString(),
91
+ },
92
+ }, null, 2),
93
+ }],
94
+ };
95
+ }
96
+ catch (error) {
97
+ return errorResponse(error);
98
+ }
99
+ });
100
+ server.tool('epic_update', 'Update an epic', {
101
+ id: z.string().describe('Epic ID'),
102
+ title: z.string().optional(),
103
+ description: z.string().optional(),
104
+ status: z.enum(['active', 'draft', 'complete', 'dropped', 'future']).optional(),
105
+ }, async (params) => {
106
+ try {
107
+ const changes = {};
108
+ if (params.title)
109
+ changes.title = params.title;
110
+ if (params.description !== undefined)
111
+ changes.description = params.description;
112
+ if (params.status)
113
+ changes.status = params.status;
114
+ const epic = await ctx.storage.updateEpic(params.id, changes);
115
+ return {
116
+ content: [{
117
+ type: 'text',
118
+ text: JSON.stringify({ success: true, epic: { id: epic.id, title: epic.title, status: epic.status } }, null, 2),
119
+ }],
120
+ };
121
+ }
122
+ catch (error) {
123
+ return errorResponse(error);
124
+ }
125
+ });
126
+ server.tool('epic_delete', 'Delete an epic', { id: z.string().describe('Epic ID') }, async (params) => {
127
+ try {
128
+ await ctx.storage.deleteEpic(params.id);
129
+ return {
130
+ content: [{
131
+ type: 'text',
132
+ text: JSON.stringify({ success: true, message: `Deleted epic ${params.id}` }, null, 2),
133
+ }],
134
+ };
135
+ }
136
+ catch (error) {
137
+ return errorResponse(error);
138
+ }
139
+ });
140
+ server.tool('epic_reorder', 'Reorder an epic', {
141
+ id: z.string().describe('Epic ID'),
142
+ position: z.number().describe('New position'),
143
+ project: z.string().optional(),
144
+ }, async (params) => {
145
+ try {
146
+ const epic = await ctx.storage.getEpic(params.id);
147
+ if (!epic)
148
+ throw new Error(`Epic not found: ${params.id}`);
149
+ const reordered = await ctx.storage.reorderEpic(params.project || epic.projectId, params.id, params.position);
150
+ return {
151
+ content: [{
152
+ type: 'text',
153
+ text: JSON.stringify({ success: true, epic: { id: reordered.id, position: reordered.position } }, null, 2),
154
+ }],
155
+ };
156
+ }
157
+ catch (error) {
158
+ return errorResponse(error);
159
+ }
160
+ });
161
+ server.tool('epic_add_blocker', 'Add epic dependency', {
162
+ epic_id: z.string().describe('Epic that will be blocked'),
163
+ blocker_id: z.string().describe('Epic that blocks'),
164
+ }, async (params) => {
165
+ try {
166
+ await ctx.storage.createEpicDependency(params.epic_id, params.blocker_id, 'blocks');
167
+ return {
168
+ content: [{
169
+ type: 'text',
170
+ text: JSON.stringify({ success: true, message: 'Epic dependency added' }, null, 2),
171
+ }],
172
+ };
173
+ }
174
+ catch (error) {
175
+ return errorResponse(error);
176
+ }
177
+ });
178
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * MCP Tools - Export all tool registrars
3
+ */
4
+ export { registerTicketTools } from './ticket.js';
5
+ export { registerProjectTools } from './project.js';
6
+ export { registerBoardTools } from './board.js';
7
+ export { registerSpecTools } from './spec.js';
8
+ export { registerEpicTools } from './epic.js';
9
+ export { registerWorkTools } from './work.js';
10
+ export { registerWorkflowTools } from './workflow.js';
11
+ export { registerStatusTools } from './status.js';
12
+ export { registerPhaseTools } from './phase.js';
13
+ export { registerActionTools } from './action.js';
14
+ export { registerRoadmapTools } from './roadmap.js';
15
+ export { registerCategoryTools } from './category.js';
16
+ export { registerTemplateTools } from './template.js';
17
+ export { registerViewTools } from './view.js';
18
+ export { registerAgentTools, registerDockerTools, registerRepoTools, registerBranchTools, registerGitHubTools, registerInitTools, registerUtilityTools, } from './cli-passthrough.js';
@@ -0,0 +1,19 @@
1
+ /**
2
+ * MCP Tools - Export all tool registrars
3
+ */
4
+ export { registerTicketTools } from './ticket.js';
5
+ export { registerProjectTools } from './project.js';
6
+ export { registerBoardTools } from './board.js';
7
+ export { registerSpecTools } from './spec.js';
8
+ export { registerEpicTools } from './epic.js';
9
+ export { registerWorkTools } from './work.js';
10
+ export { registerWorkflowTools } from './workflow.js';
11
+ export { registerStatusTools } from './status.js';
12
+ export { registerPhaseTools } from './phase.js';
13
+ export { registerActionTools } from './action.js';
14
+ export { registerRoadmapTools } from './roadmap.js';
15
+ export { registerCategoryTools } from './category.js';
16
+ export { registerTemplateTools } from './template.js';
17
+ export { registerViewTools } from './view.js';
18
+ // CLI passthrough tools
19
+ export { registerAgentTools, registerDockerTools, registerRepoTools, registerBranchTools, registerGitHubTools, registerInitTools, registerUtilityTools, } from './cli-passthrough.js';
@@ -0,0 +1,6 @@
1
+ /**
2
+ * MCP Phase Tools
3
+ */
4
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ import type { McpToolContext } from '../types.js';
6
+ export declare function registerPhaseTools(server: McpServer, ctx: McpToolContext): void;