@specforge/mcp 2.6.0 → 3.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 (237) hide show
  1. package/README.md +73 -0
  2. package/bin/{specforge-mcp → specforge} +0 -5
  3. package/dist/ai-provider/circuit-breaker.d.ts +63 -0
  4. package/dist/ai-provider/circuit-breaker.d.ts.map +1 -0
  5. package/dist/ai-provider/circuit-breaker.js +160 -0
  6. package/dist/ai-provider/circuit-breaker.js.map +1 -0
  7. package/dist/ai-provider/cli-version.d.ts +50 -0
  8. package/dist/ai-provider/cli-version.d.ts.map +1 -0
  9. package/dist/ai-provider/cli-version.js +141 -0
  10. package/dist/ai-provider/cli-version.js.map +1 -0
  11. package/dist/ai-provider/config-loader.d.ts +45 -0
  12. package/dist/ai-provider/config-loader.d.ts.map +1 -0
  13. package/dist/ai-provider/config-loader.js +106 -0
  14. package/dist/ai-provider/config-loader.js.map +1 -0
  15. package/dist/ai-provider/errors.d.ts +48 -0
  16. package/dist/ai-provider/errors.d.ts.map +1 -0
  17. package/dist/ai-provider/errors.js +102 -0
  18. package/dist/ai-provider/errors.js.map +1 -0
  19. package/dist/ai-provider/events.d.ts +73 -0
  20. package/dist/ai-provider/events.d.ts.map +1 -0
  21. package/dist/ai-provider/events.js +75 -0
  22. package/dist/ai-provider/events.js.map +1 -0
  23. package/dist/ai-provider/factory.d.ts +31 -0
  24. package/dist/ai-provider/factory.d.ts.map +1 -0
  25. package/dist/ai-provider/factory.js +100 -0
  26. package/dist/ai-provider/factory.js.map +1 -0
  27. package/dist/ai-provider/index.d.ts +24 -0
  28. package/dist/ai-provider/index.d.ts.map +1 -0
  29. package/dist/ai-provider/index.js +46 -0
  30. package/dist/ai-provider/index.js.map +1 -0
  31. package/dist/ai-provider/instance-coordinator.d.ts +54 -0
  32. package/dist/ai-provider/instance-coordinator.d.ts.map +1 -0
  33. package/dist/ai-provider/instance-coordinator.js +199 -0
  34. package/dist/ai-provider/instance-coordinator.js.map +1 -0
  35. package/dist/ai-provider/jsonl-parser.d.ts +43 -0
  36. package/dist/ai-provider/jsonl-parser.d.ts.map +1 -0
  37. package/dist/ai-provider/jsonl-parser.js +107 -0
  38. package/dist/ai-provider/jsonl-parser.js.map +1 -0
  39. package/dist/ai-provider/lifecycle.d.ts +50 -0
  40. package/dist/ai-provider/lifecycle.d.ts.map +1 -0
  41. package/dist/ai-provider/lifecycle.js +145 -0
  42. package/dist/ai-provider/lifecycle.js.map +1 -0
  43. package/dist/ai-provider/logger.d.ts +69 -0
  44. package/dist/ai-provider/logger.d.ts.map +1 -0
  45. package/dist/ai-provider/logger.js +161 -0
  46. package/dist/ai-provider/logger.js.map +1 -0
  47. package/dist/ai-provider/metrics.d.ts +91 -0
  48. package/dist/ai-provider/metrics.d.ts.map +1 -0
  49. package/dist/ai-provider/metrics.js +187 -0
  50. package/dist/ai-provider/metrics.js.map +1 -0
  51. package/dist/ai-provider/process-manager.d.ts +97 -0
  52. package/dist/ai-provider/process-manager.d.ts.map +1 -0
  53. package/dist/ai-provider/process-manager.js +477 -0
  54. package/dist/ai-provider/process-manager.js.map +1 -0
  55. package/dist/ai-provider/providers/claude-code.d.ts +64 -0
  56. package/dist/ai-provider/providers/claude-code.d.ts.map +1 -0
  57. package/dist/ai-provider/providers/claude-code.js +205 -0
  58. package/dist/ai-provider/providers/claude-code.js.map +1 -0
  59. package/dist/ai-provider/retry-executor.d.ts +52 -0
  60. package/dist/ai-provider/retry-executor.d.ts.map +1 -0
  61. package/dist/ai-provider/retry-executor.js +138 -0
  62. package/dist/ai-provider/retry-executor.js.map +1 -0
  63. package/dist/ai-provider/safe-args.d.ts +58 -0
  64. package/dist/ai-provider/safe-args.d.ts.map +1 -0
  65. package/dist/ai-provider/safe-args.js +176 -0
  66. package/dist/ai-provider/safe-args.js.map +1 -0
  67. package/dist/ai-provider/semaphore.d.ts +50 -0
  68. package/dist/ai-provider/semaphore.d.ts.map +1 -0
  69. package/dist/ai-provider/semaphore.js +97 -0
  70. package/dist/ai-provider/semaphore.js.map +1 -0
  71. package/dist/ai-provider/tracer.d.ts +67 -0
  72. package/dist/ai-provider/tracer.d.ts.map +1 -0
  73. package/dist/ai-provider/tracer.js +209 -0
  74. package/dist/ai-provider/tracer.js.map +1 -0
  75. package/dist/ai-provider/types.d.ts +181 -0
  76. package/dist/ai-provider/types.d.ts.map +1 -0
  77. package/dist/ai-provider/types.js +8 -0
  78. package/dist/ai-provider/types.js.map +1 -0
  79. package/dist/autopilot/agents/agent-runner.d.ts +109 -0
  80. package/dist/autopilot/agents/agent-runner.d.ts.map +1 -0
  81. package/dist/autopilot/agents/agent-runner.js +731 -0
  82. package/dist/autopilot/agents/agent-runner.js.map +1 -0
  83. package/dist/autopilot/agents/agent-selector.d.ts +59 -0
  84. package/dist/autopilot/agents/agent-selector.d.ts.map +1 -0
  85. package/dist/autopilot/agents/agent-selector.js +234 -0
  86. package/dist/autopilot/agents/agent-selector.js.map +1 -0
  87. package/dist/autopilot/agents/model-selector.d.ts +49 -0
  88. package/dist/autopilot/agents/model-selector.d.ts.map +1 -0
  89. package/dist/autopilot/agents/model-selector.js +62 -0
  90. package/dist/autopilot/agents/model-selector.js.map +1 -0
  91. package/dist/autopilot/agents/profiles/builtin.d.ts +55 -0
  92. package/dist/autopilot/agents/profiles/builtin.d.ts.map +1 -0
  93. package/dist/autopilot/agents/profiles/builtin.js +323 -0
  94. package/dist/autopilot/agents/profiles/builtin.js.map +1 -0
  95. package/dist/autopilot/agents/profiles/types.d.ts +98 -0
  96. package/dist/autopilot/agents/profiles/types.d.ts.map +1 -0
  97. package/dist/autopilot/agents/profiles/types.js +17 -0
  98. package/dist/autopilot/agents/profiles/types.js.map +1 -0
  99. package/dist/autopilot/api/autopilot-api-client.d.ts +217 -0
  100. package/dist/autopilot/api/autopilot-api-client.d.ts.map +1 -0
  101. package/dist/autopilot/api/autopilot-api-client.js +402 -0
  102. package/dist/autopilot/api/autopilot-api-client.js.map +1 -0
  103. package/dist/autopilot/cli/abort.d.ts +20 -0
  104. package/dist/autopilot/cli/abort.d.ts.map +1 -0
  105. package/dist/autopilot/cli/abort.js +201 -0
  106. package/dist/autopilot/cli/abort.js.map +1 -0
  107. package/dist/autopilot/cli/display.d.ts +63 -0
  108. package/dist/autopilot/cli/display.d.ts.map +1 -0
  109. package/dist/autopilot/cli/display.js +260 -0
  110. package/dist/autopilot/cli/display.js.map +1 -0
  111. package/dist/autopilot/cli/index.d.ts +24 -0
  112. package/dist/autopilot/cli/index.d.ts.map +1 -0
  113. package/dist/autopilot/cli/index.js +79 -0
  114. package/dist/autopilot/cli/index.js.map +1 -0
  115. package/dist/autopilot/cli/pause.d.ts +18 -0
  116. package/dist/autopilot/cli/pause.d.ts.map +1 -0
  117. package/dist/autopilot/cli/pause.js +110 -0
  118. package/dist/autopilot/cli/pause.js.map +1 -0
  119. package/dist/autopilot/cli/resume.d.ts +22 -0
  120. package/dist/autopilot/cli/resume.d.ts.map +1 -0
  121. package/dist/autopilot/cli/resume.js +172 -0
  122. package/dist/autopilot/cli/resume.js.map +1 -0
  123. package/dist/autopilot/cli/run.d.ts +25 -0
  124. package/dist/autopilot/cli/run.d.ts.map +1 -0
  125. package/dist/autopilot/cli/run.js +220 -0
  126. package/dist/autopilot/cli/run.js.map +1 -0
  127. package/dist/autopilot/cli/status.d.ts +20 -0
  128. package/dist/autopilot/cli/status.d.ts.map +1 -0
  129. package/dist/autopilot/cli/status.js +217 -0
  130. package/dist/autopilot/cli/status.js.map +1 -0
  131. package/dist/autopilot/config.d.ts +45 -0
  132. package/dist/autopilot/config.d.ts.map +1 -0
  133. package/dist/autopilot/config.js +269 -0
  134. package/dist/autopilot/config.js.map +1 -0
  135. package/dist/autopilot/core/dependency-resolver.d.ts +108 -0
  136. package/dist/autopilot/core/dependency-resolver.d.ts.map +1 -0
  137. package/dist/autopilot/core/dependency-resolver.js +394 -0
  138. package/dist/autopilot/core/dependency-resolver.js.map +1 -0
  139. package/dist/autopilot/core/dispatcher.d.ts +215 -0
  140. package/dist/autopilot/core/dispatcher.d.ts.map +1 -0
  141. package/dist/autopilot/core/dispatcher.js +594 -0
  142. package/dist/autopilot/core/dispatcher.js.map +1 -0
  143. package/dist/autopilot/core/failure-handler.d.ts +145 -0
  144. package/dist/autopilot/core/failure-handler.d.ts.map +1 -0
  145. package/dist/autopilot/core/failure-handler.js +308 -0
  146. package/dist/autopilot/core/failure-handler.js.map +1 -0
  147. package/dist/autopilot/core/rate-limit-handler.d.ts +108 -0
  148. package/dist/autopilot/core/rate-limit-handler.d.ts.map +1 -0
  149. package/dist/autopilot/core/rate-limit-handler.js +195 -0
  150. package/dist/autopilot/core/rate-limit-handler.js.map +1 -0
  151. package/dist/autopilot/core/state-manager.d.ts +160 -0
  152. package/dist/autopilot/core/state-manager.d.ts.map +1 -0
  153. package/dist/autopilot/core/state-manager.js +393 -0
  154. package/dist/autopilot/core/state-manager.js.map +1 -0
  155. package/dist/autopilot/core/timeout-manager.d.ts +95 -0
  156. package/dist/autopilot/core/timeout-manager.d.ts.map +1 -0
  157. package/dist/autopilot/core/timeout-manager.js +188 -0
  158. package/dist/autopilot/core/timeout-manager.js.map +1 -0
  159. package/dist/autopilot/git/branch-manager.d.ts +117 -0
  160. package/dist/autopilot/git/branch-manager.d.ts.map +1 -0
  161. package/dist/autopilot/git/branch-manager.js +238 -0
  162. package/dist/autopilot/git/branch-manager.js.map +1 -0
  163. package/dist/autopilot/git/index.d.ts +9 -0
  164. package/dist/autopilot/git/index.d.ts.map +1 -0
  165. package/dist/autopilot/git/index.js +9 -0
  166. package/dist/autopilot/git/index.js.map +1 -0
  167. package/dist/autopilot/git/merge-manager.d.ts +118 -0
  168. package/dist/autopilot/git/merge-manager.d.ts.map +1 -0
  169. package/dist/autopilot/git/merge-manager.js +304 -0
  170. package/dist/autopilot/git/merge-manager.js.map +1 -0
  171. package/dist/autopilot/git/worktree-manager.d.ts +128 -0
  172. package/dist/autopilot/git/worktree-manager.d.ts.map +1 -0
  173. package/dist/autopilot/git/worktree-manager.js +298 -0
  174. package/dist/autopilot/git/worktree-manager.js.map +1 -0
  175. package/dist/autopilot/index.d.ts +30 -0
  176. package/dist/autopilot/index.d.ts.map +1 -0
  177. package/dist/autopilot/index.js +55 -0
  178. package/dist/autopilot/index.js.map +1 -0
  179. package/dist/autopilot/sync/index.d.ts +7 -0
  180. package/dist/autopilot/sync/index.d.ts.map +1 -0
  181. package/dist/autopilot/sync/index.js +7 -0
  182. package/dist/autopilot/sync/index.js.map +1 -0
  183. package/dist/autopilot/sync/sync-manager.d.ts +168 -0
  184. package/dist/autopilot/sync/sync-manager.d.ts.map +1 -0
  185. package/dist/autopilot/sync/sync-manager.js +303 -0
  186. package/dist/autopilot/sync/sync-manager.js.map +1 -0
  187. package/dist/autopilot/types.d.ts +454 -0
  188. package/dist/autopilot/types.d.ts.map +1 -0
  189. package/dist/autopilot/types.js +26 -0
  190. package/dist/autopilot/types.js.map +1 -0
  191. package/dist/autopilot/utils/audit-logger.d.ts +176 -0
  192. package/dist/autopilot/utils/audit-logger.d.ts.map +1 -0
  193. package/dist/autopilot/utils/audit-logger.js +308 -0
  194. package/dist/autopilot/utils/audit-logger.js.map +1 -0
  195. package/dist/autopilot/utils/cost-tracker.d.ts +162 -0
  196. package/dist/autopilot/utils/cost-tracker.d.ts.map +1 -0
  197. package/dist/autopilot/utils/cost-tracker.js +269 -0
  198. package/dist/autopilot/utils/cost-tracker.js.map +1 -0
  199. package/dist/autopilot/utils/index.d.ts +9 -0
  200. package/dist/autopilot/utils/index.d.ts.map +1 -0
  201. package/dist/autopilot/utils/index.js +9 -0
  202. package/dist/autopilot/utils/index.js.map +1 -0
  203. package/dist/autopilot/utils/progress-reporter.d.ts +132 -0
  204. package/dist/autopilot/utils/progress-reporter.d.ts.map +1 -0
  205. package/dist/autopilot/utils/progress-reporter.js +290 -0
  206. package/dist/autopilot/utils/progress-reporter.js.map +1 -0
  207. package/dist/autopilot/worker/worker-pool.d.ts +179 -0
  208. package/dist/autopilot/worker/worker-pool.d.ts.map +1 -0
  209. package/dist/autopilot/worker/worker-pool.js +331 -0
  210. package/dist/autopilot/worker/worker-pool.js.map +1 -0
  211. package/dist/autopilot/worker/worker-session.d.ts +171 -0
  212. package/dist/autopilot/worker/worker-session.d.ts.map +1 -0
  213. package/dist/autopilot/worker/worker-session.js +295 -0
  214. package/dist/autopilot/worker/worker-session.js.map +1 -0
  215. package/dist/cli/index.d.ts +1 -1
  216. package/dist/cli/index.d.ts.map +1 -1
  217. package/dist/cli/index.js +4 -1
  218. package/dist/cli/index.js.map +1 -1
  219. package/dist/index.js +0 -1
  220. package/dist/index.js.map +1 -1
  221. package/dist/tools/core/epic.js +1 -1
  222. package/dist/tools/core/epic.js.map +1 -1
  223. package/dist/tools/core/lookup.d.ts.map +1 -1
  224. package/dist/tools/core/lookup.js +3 -2
  225. package/dist/tools/core/lookup.js.map +1 -1
  226. package/dist/tools/core/specification.js +1 -1
  227. package/dist/tools/core/specification.js.map +1 -1
  228. package/dist/tools/core/ticket.d.ts.map +1 -1
  229. package/dist/tools/core/ticket.js +4 -6
  230. package/dist/tools/core/ticket.js.map +1 -1
  231. package/dist/tools/index.d.ts.map +1 -1
  232. package/dist/tools/index.js +60 -0
  233. package/dist/tools/index.js.map +1 -1
  234. package/dist/validation/index.d.ts.map +1 -1
  235. package/dist/validation/index.js +4 -1
  236. package/dist/validation/index.js.map +1 -1
  237. package/package.json +8 -4
@@ -0,0 +1,402 @@
1
+ /**
2
+ * Autopilot API Client
3
+ *
4
+ * Extended API client for autopilot-specific operations.
5
+ */
6
+ import { ApiClient } from '../../client/api-client.js';
7
+ /**
8
+ * Extended API client for autopilot operations
9
+ */
10
+ export class AutopilotApiClient {
11
+ client;
12
+ constructor(config) {
13
+ this.client = new ApiClient(config);
14
+ }
15
+ /**
16
+ * Get specification by ID
17
+ */
18
+ async getSpecification(specificationId) {
19
+ try {
20
+ const result = await this.client.call('get_specification', { specificationId });
21
+ return result.specification;
22
+ }
23
+ catch (error) {
24
+ console.error('Failed to get specification:', error);
25
+ return null;
26
+ }
27
+ }
28
+ /**
29
+ * Get all epics for a specification
30
+ */
31
+ async getEpics(specificationId) {
32
+ try {
33
+ const result = await this.client.call('list_epics', { specificationId });
34
+ return result.items;
35
+ }
36
+ catch (error) {
37
+ console.error('Failed to list epics:', error);
38
+ return [];
39
+ }
40
+ }
41
+ /**
42
+ * Get all tickets for an epic
43
+ */
44
+ async getTickets(epicId) {
45
+ try {
46
+ const result = await this.client.call('list_tickets', { epicId });
47
+ return result.items;
48
+ }
49
+ catch (error) {
50
+ console.error('Failed to list tickets:', error);
51
+ return [];
52
+ }
53
+ }
54
+ /**
55
+ * Get ticket by ID
56
+ */
57
+ async getTicket(ticketId) {
58
+ try {
59
+ const result = await this.client.call('get_ticket', { ticketId });
60
+ return result.ticket;
61
+ }
62
+ catch (error) {
63
+ console.error('Failed to get ticket:', error);
64
+ return null;
65
+ }
66
+ }
67
+ /**
68
+ * Get ticket dependencies
69
+ */
70
+ async getTicketDependencies(ticketId) {
71
+ try {
72
+ const result = await this.client.call('get_ticket_dependencies', { ticketId });
73
+ return {
74
+ blockedBy: result.blockedBy || [],
75
+ blocks: result.blocks || [],
76
+ };
77
+ }
78
+ catch (error) {
79
+ console.error('Failed to get ticket dependencies:', error);
80
+ return { blockedBy: [], blocks: [] };
81
+ }
82
+ }
83
+ /**
84
+ * Get full implementation context for a ticket
85
+ */
86
+ async getImplementationContext(ticketId) {
87
+ try {
88
+ const result = await this.client.call('get_implementation_context', { ticketId });
89
+ return result;
90
+ }
91
+ catch (error) {
92
+ console.error('Failed to get implementation context:', error);
93
+ return null;
94
+ }
95
+ }
96
+ /**
97
+ * Get ticket context for implementation
98
+ */
99
+ async getTicketContext(ticketId) {
100
+ const context = await this.getImplementationContext(ticketId);
101
+ if (!context)
102
+ return null;
103
+ return {
104
+ ticket: context.ticket,
105
+ epic: context.epic,
106
+ specification: context.specification,
107
+ dependencies: {
108
+ blockedBy: context.dependencies.blockedBy.map(d => ({
109
+ id: d.id,
110
+ title: d.title,
111
+ status: d.status,
112
+ })),
113
+ blocks: context.dependencies.blocks.map(d => ({
114
+ id: d.id,
115
+ title: d.title,
116
+ status: d.status,
117
+ })),
118
+ },
119
+ patterns: context.patterns,
120
+ };
121
+ }
122
+ /**
123
+ * Update ticket status
124
+ */
125
+ async updateTicketStatus(ticketId, status, options) {
126
+ try {
127
+ const result = await this.client.call('update_ticket', {
128
+ ticketId,
129
+ status,
130
+ progress: options?.progress,
131
+ blockReason: options?.blockReason,
132
+ });
133
+ return result.ticket;
134
+ }
135
+ catch (error) {
136
+ console.error('Failed to update ticket status:', error);
137
+ return null;
138
+ }
139
+ }
140
+ /**
141
+ * Mark ticket as completed with extended autopilot data
142
+ */
143
+ async completeTicket(ticketId, options) {
144
+ try {
145
+ const result = await this.client.call('update_ticket', {
146
+ ticketId,
147
+ status: 'done',
148
+ progress: 100,
149
+ completedAt: new Date().toISOString(),
150
+ actualHours: options?.actualHours,
151
+ testsPassed: options?.testsPassed,
152
+ // Extended autopilot completion fields
153
+ filesCreated: options?.filesCreated,
154
+ filesModified: options?.filesModified,
155
+ filesDeleted: options?.filesDeleted,
156
+ tokensUsed: options?.tokensUsed,
157
+ costUsd: options?.costUsd,
158
+ durationMs: options?.durationMs,
159
+ commitSha: options?.commitSha,
160
+ modelUsed: options?.modelUsed,
161
+ });
162
+ return result.ticket;
163
+ }
164
+ catch (error) {
165
+ console.error('Failed to complete ticket:', error);
166
+ return null;
167
+ }
168
+ }
169
+ /**
170
+ * Mark ticket as failed/blocked
171
+ */
172
+ async failTicket(ticketId, reason) {
173
+ try {
174
+ const result = await this.client.call('update_ticket', {
175
+ ticketId,
176
+ status: 'blocked',
177
+ blockReason: reason,
178
+ });
179
+ return result.ticket;
180
+ }
181
+ catch (error) {
182
+ console.error('Failed to mark ticket as blocked:', error);
183
+ return null;
184
+ }
185
+ }
186
+ /**
187
+ * Start working on a ticket (set to in_progress)
188
+ */
189
+ async startTicket(ticketId) {
190
+ try {
191
+ const result = await this.client.call('update_ticket', {
192
+ ticketId,
193
+ status: 'in_progress',
194
+ progress: 0,
195
+ });
196
+ return result.ticket;
197
+ }
198
+ catch (error) {
199
+ console.error('Failed to start ticket:', error);
200
+ return null;
201
+ }
202
+ }
203
+ /**
204
+ * Record test results for a ticket
205
+ */
206
+ async recordTestResults(ticketId, results) {
207
+ try {
208
+ await this.client.call('add_test_result', {
209
+ ticketId,
210
+ testType: results.testType,
211
+ passed: results.passed,
212
+ totalTests: results.totalTests,
213
+ passedTests: results.passedTests,
214
+ failedTests: results.failedTests,
215
+ skippedTests: 0,
216
+ errorDetails: results.errorDetails,
217
+ durationMs: results.durationMs,
218
+ });
219
+ }
220
+ catch (error) {
221
+ console.error('Failed to record test results:', error);
222
+ }
223
+ }
224
+ /**
225
+ * Link a commit to a ticket
226
+ */
227
+ async linkCommit(ticketId, commit) {
228
+ try {
229
+ await this.client.call('link_ticket_artifact', {
230
+ ticketId,
231
+ linkType: 'commit',
232
+ url: commit.url,
233
+ sha: commit.sha,
234
+ title: commit.title,
235
+ });
236
+ }
237
+ catch (error) {
238
+ console.error('Failed to link commit:', error);
239
+ }
240
+ }
241
+ /**
242
+ * Get all tickets for a specification (across all epics)
243
+ */
244
+ async getAllTicketsForSpec(specificationId) {
245
+ const epics = await this.getEpics(specificationId);
246
+ const allTickets = [];
247
+ for (const epic of epics) {
248
+ const tickets = await this.getTickets(epic.id);
249
+ allTickets.push(...tickets);
250
+ }
251
+ return allTickets;
252
+ }
253
+ /**
254
+ * Get ready tickets (dependencies satisfied)
255
+ */
256
+ async getReadyTickets(specificationId) {
257
+ const allTickets = await this.getAllTicketsForSpec(specificationId);
258
+ const readyTickets = [];
259
+ for (const ticket of allTickets) {
260
+ if (ticket.status !== 'todo' && ticket.status !== 'queue') {
261
+ continue;
262
+ }
263
+ const deps = await this.getTicketDependencies(ticket.id);
264
+ const allDepsComplete = deps.blockedBy.every(d => d.status === 'done');
265
+ if (allDepsComplete) {
266
+ readyTickets.push(ticket);
267
+ }
268
+ }
269
+ return readyTickets;
270
+ }
271
+ /**
272
+ * Sync autopilot state to API (for tracking and webapp monitoring)
273
+ */
274
+ async syncAutopilotState(state) {
275
+ try {
276
+ await this.client.call('update_autopilot_run', {
277
+ runId: state.runId,
278
+ status: state.status,
279
+ completedTickets: state.completedTickets.map(t => t.ticketId),
280
+ failedTickets: state.failedTickets.map(t => t.ticketId),
281
+ skippedTickets: state.skippedTickets.map(t => t.ticketId),
282
+ currentEpicId: state.currentEpicId,
283
+ currentTicketId: state.currentTicketId,
284
+ activeWorkers: state.activeWorkers,
285
+ totalCostUsd: state.totalCostUsd,
286
+ totalInputTokens: state.totalInputTokens,
287
+ totalOutputTokens: state.totalOutputTokens,
288
+ pausedAt: state.pausedAt,
289
+ pauseReason: state.pauseReason,
290
+ lastError: state.lastError,
291
+ errorCount: state.errorCount,
292
+ });
293
+ }
294
+ catch (error) {
295
+ // Log but don't fail - sync is non-critical
296
+ console.warn('Failed to sync autopilot state:', error);
297
+ }
298
+ }
299
+ /**
300
+ * Create a new autopilot run
301
+ */
302
+ async createAutopilotRun(options) {
303
+ try {
304
+ const result = await this.client.call('create_autopilot_run', options);
305
+ return { runId: result.run.runId };
306
+ }
307
+ catch (error) {
308
+ console.error('Failed to create autopilot run:', error);
309
+ return null;
310
+ }
311
+ }
312
+ /**
313
+ * Complete an autopilot run
314
+ */
315
+ async completeAutopilotRun(options) {
316
+ try {
317
+ await this.client.call('complete_autopilot_run', options);
318
+ }
319
+ catch (error) {
320
+ console.error('Failed to complete autopilot run:', error);
321
+ }
322
+ }
323
+ /**
324
+ * Create a discovery from parsed AI output
325
+ */
326
+ async createDiscovery(discovery) {
327
+ try {
328
+ const result = await this.client.call('report_discovery', {
329
+ ticketId: discovery.ticketId,
330
+ type: discovery.type,
331
+ description: discovery.description,
332
+ title: discovery.title,
333
+ severity: discovery.severity,
334
+ });
335
+ return { id: result.discoveryId || result.id };
336
+ }
337
+ catch (error) {
338
+ console.error('Failed to create discovery:', error);
339
+ return null;
340
+ }
341
+ }
342
+ /**
343
+ * Create multiple discoveries from parsed AI output
344
+ */
345
+ async createDiscoveries(ticketId, specificationId, discoveries) {
346
+ let created = 0;
347
+ let failed = 0;
348
+ for (const discovery of discoveries) {
349
+ const result = await this.createDiscovery({
350
+ ticketId,
351
+ specificationId,
352
+ type: discovery.type,
353
+ severity: discovery.severity,
354
+ title: discovery.title,
355
+ description: discovery.description,
356
+ });
357
+ if (result) {
358
+ created++;
359
+ }
360
+ else {
361
+ failed++;
362
+ }
363
+ }
364
+ return { created, failed };
365
+ }
366
+ /**
367
+ * Validate API key
368
+ */
369
+ async validateApiKey() {
370
+ try {
371
+ const result = await this.client.validateApiKey();
372
+ return result.valid;
373
+ }
374
+ catch {
375
+ return false;
376
+ }
377
+ }
378
+ /**
379
+ * Create client from McpConfig
380
+ */
381
+ static create(config) {
382
+ return new AutopilotApiClient(config);
383
+ }
384
+ /**
385
+ * Create from API key
386
+ */
387
+ static fromApiKey(apiKey, options) {
388
+ const config = {
389
+ apiKey,
390
+ apiUrl: options?.apiUrl || 'https://mcp.specforge.com.br/mcp',
391
+ debug: false,
392
+ };
393
+ return new AutopilotApiClient(config);
394
+ }
395
+ }
396
+ /**
397
+ * Create an autopilot API client from config
398
+ */
399
+ export function createAutopilotApiClient(config) {
400
+ return AutopilotApiClient.create(config);
401
+ }
402
+ //# sourceMappingURL=autopilot-api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autopilot-api-client.js","sourceRoot":"","sources":["../../../src/autopilot/api/autopilot-api-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Autopilot Abort Command
3
+ *
4
+ * Aborts an autopilot session and cleans up resources.
5
+ */
6
+ import { Command } from 'commander';
7
+ /**
8
+ * Abort command options
9
+ */
10
+ export interface AbortOptions {
11
+ cleanup?: boolean;
12
+ keepBranches?: boolean;
13
+ force?: boolean;
14
+ json?: boolean;
15
+ }
16
+ /**
17
+ * Register abort command
18
+ */
19
+ export declare function registerAbortCommand(program: Command): void;
20
+ //# sourceMappingURL=abort.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abort.d.ts","sourceRoot":"","sources":["../../../src/autopilot/cli/abort.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAwLD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0B3D"}
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Autopilot Abort Command
3
+ *
4
+ * Aborts an autopilot session and cleans up resources.
5
+ */
6
+ import ora from 'ora';
7
+ import * as fs from 'fs/promises';
8
+ import * as path from 'path';
9
+ import { withErrorHandler } from '../../cli/middleware/error-handler.js';
10
+ import { STATE_FILE_NAME } from '../core/state-manager.js';
11
+ import { createWorktreeManager } from '../git/worktree-manager.js';
12
+ import { createBranchManager } from '../git/branch-manager.js';
13
+ import { c, formatCost } from './display.js';
14
+ /**
15
+ * Load state from file
16
+ */
17
+ async function loadState(workingDirectory) {
18
+ const statePath = path.join(workingDirectory, '.specforge', STATE_FILE_NAME);
19
+ try {
20
+ const content = await fs.readFile(statePath, 'utf-8');
21
+ return JSON.parse(content);
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ }
27
+ /**
28
+ * Remove state file
29
+ */
30
+ async function removeStateFile(workingDirectory) {
31
+ const statePath = path.join(workingDirectory, '.specforge', STATE_FILE_NAME);
32
+ try {
33
+ await fs.unlink(statePath);
34
+ }
35
+ catch {
36
+ // Ignore if file doesn't exist
37
+ }
38
+ }
39
+ /**
40
+ * Cleanup worktrees
41
+ */
42
+ async function cleanupWorktrees(workingDirectory) {
43
+ const worktreeManager = createWorktreeManager({ workingDirectory });
44
+ const worktrees = await worktreeManager.listWorktrees();
45
+ const cleaned = [];
46
+ for (const worktree of worktrees) {
47
+ if (worktree.branch?.includes('autopilot/')) {
48
+ try {
49
+ await worktreeManager.removeWorkerWorktree(parseInt(worktree.branch.split('worker-')[1] || '0', 10));
50
+ cleaned.push(worktree.path);
51
+ }
52
+ catch {
53
+ // Ignore cleanup errors
54
+ }
55
+ }
56
+ }
57
+ // Also try to cleanup the worktrees directory
58
+ const worktreesDir = path.join(workingDirectory, '.worktrees');
59
+ try {
60
+ const contents = await fs.readdir(worktreesDir);
61
+ if (contents.length === 0) {
62
+ await fs.rmdir(worktreesDir);
63
+ }
64
+ }
65
+ catch {
66
+ // Ignore
67
+ }
68
+ return cleaned;
69
+ }
70
+ /**
71
+ * Cleanup branches
72
+ */
73
+ async function cleanupBranches(workingDirectory, force) {
74
+ const branchManager = createBranchManager({ workingDirectory });
75
+ const branches = await branchManager.getAutopilotBranches();
76
+ const deleted = [];
77
+ for (const branch of branches) {
78
+ try {
79
+ await branchManager.deleteBranch(branch, force);
80
+ deleted.push(branch);
81
+ }
82
+ catch {
83
+ // Ignore deletion errors
84
+ }
85
+ }
86
+ return deleted;
87
+ }
88
+ /**
89
+ * Abort command action
90
+ */
91
+ async function abortAction(options) {
92
+ const workingDirectory = process.cwd();
93
+ // Confirm abort
94
+ if (!options.force) {
95
+ console.log('');
96
+ console.log(c.yellow('⚠ This will abort the autopilot session and cannot be undone.'));
97
+ console.log('');
98
+ console.log('Use --force to confirm, or Ctrl+C to cancel.');
99
+ console.log('');
100
+ return;
101
+ }
102
+ const spinner = ora({
103
+ text: 'Aborting autopilot session...',
104
+ color: 'cyan',
105
+ }).start();
106
+ try {
107
+ // Load state for summary
108
+ const state = await loadState(workingDirectory);
109
+ const results = {
110
+ stateRemoved: false,
111
+ worktreesCleaned: [],
112
+ branchesCleaned: [],
113
+ };
114
+ // Remove state file
115
+ spinner.text = 'Removing state file...';
116
+ await removeStateFile(workingDirectory);
117
+ results.stateRemoved = true;
118
+ // Cleanup worktrees
119
+ if (options.cleanup !== false) {
120
+ spinner.text = 'Cleaning up worktrees...';
121
+ results.worktreesCleaned = await cleanupWorktrees(workingDirectory);
122
+ }
123
+ // Cleanup branches
124
+ if (!options.keepBranches) {
125
+ spinner.text = 'Cleaning up branches...';
126
+ results.branchesCleaned = await cleanupBranches(workingDirectory, true);
127
+ }
128
+ spinner.succeed('Autopilot session aborted');
129
+ if (options.json) {
130
+ console.log(JSON.stringify({
131
+ success: true,
132
+ runId: state?.runId,
133
+ completed: state?.completedTickets.length ?? 0,
134
+ failed: state?.failedTickets.length ?? 0,
135
+ cost: state?.totalCostUsd ?? 0,
136
+ cleanup: results,
137
+ }, null, 2));
138
+ }
139
+ else {
140
+ console.log('');
141
+ console.log(c.bold('Session Aborted'));
142
+ console.log('');
143
+ if (state) {
144
+ console.log(`Run ID: ${c.dim(state.runId)}`);
145
+ console.log(`Completed: ${c.green(state.completedTickets.length.toString())} tickets`);
146
+ console.log(`Failed: ${c.red(state.failedTickets.length.toString())} tickets`);
147
+ console.log(`Cost incurred: ${c.yellow(formatCost(state.totalCostUsd))}`);
148
+ console.log('');
149
+ }
150
+ console.log(c.bold('Cleanup Summary:'));
151
+ console.log(` State file: ${results.stateRemoved ? c.green('Removed') : c.dim('Not found')}`);
152
+ console.log(` Worktrees: ${results.worktreesCleaned.length > 0
153
+ ? c.green(`${results.worktreesCleaned.length} removed`)
154
+ : c.dim('None')}`);
155
+ console.log(` Branches: ${results.branchesCleaned.length > 0
156
+ ? c.green(`${results.branchesCleaned.length} deleted`)
157
+ : c.dim('None')}`);
158
+ console.log('');
159
+ if (state && state.completedTickets.length > 0) {
160
+ console.log(c.yellow('Note: Commits from completed tickets remain in the repository.'));
161
+ console.log(c.dim('Use `git log` to review changes, or `git reset` to undo if needed.'));
162
+ console.log('');
163
+ }
164
+ }
165
+ }
166
+ catch (error) {
167
+ spinner.fail('Failed to abort');
168
+ throw error;
169
+ }
170
+ }
171
+ /**
172
+ * Register abort command
173
+ */
174
+ export function registerAbortCommand(program) {
175
+ program
176
+ .command('abort')
177
+ .description('Abort autopilot session and cleanup resources')
178
+ .option('-f, --force', 'Confirm abort (required)')
179
+ .option('--cleanup', 'Cleanup worktrees (default: true)')
180
+ .option('--keep-branches', 'Keep autopilot branches')
181
+ .option('--json', 'Output as JSON')
182
+ .addHelpText('after', `
183
+ Examples:
184
+ $ specforge autopilot abort --force # Abort and cleanup
185
+ $ specforge autopilot abort --force --keep-branches # Keep branches
186
+
187
+ Cleanup:
188
+ - Removes .specforge/autopilot-state.json
189
+ - Removes .worktrees/worker-* directories
190
+ - Deletes autopilot/* branches (unless --keep-branches)
191
+
192
+ Note:
193
+ Commits made by completed tickets remain in the repository.
194
+ Use git commands to review or undo changes if needed.
195
+
196
+ Warning:
197
+ This action cannot be undone. Progress cannot be resumed after abort.
198
+ `)
199
+ .action(withErrorHandler(abortAction));
200
+ }
201
+ //# sourceMappingURL=abort.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abort.js","sourceRoot":"","sources":["../../../src/autopilot/cli/abort.ts"],"names":[],"mappings":"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"}