@ginkoai/cli 1.6.2 → 1.7.1

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 (224) hide show
  1. package/dist/commands/agent/agent-client.d.ts +150 -0
  2. package/dist/commands/agent/agent-client.d.ts.map +1 -0
  3. package/dist/commands/agent/agent-client.js +170 -0
  4. package/dist/commands/agent/agent-client.js.map +1 -0
  5. package/dist/commands/agent/index.d.ts +22 -0
  6. package/dist/commands/agent/index.d.ts.map +1 -0
  7. package/dist/commands/agent/index.js +121 -0
  8. package/dist/commands/agent/index.js.map +1 -0
  9. package/dist/commands/agent/list.d.ts +22 -0
  10. package/dist/commands/agent/list.d.ts.map +1 -0
  11. package/dist/commands/agent/list.js +119 -0
  12. package/dist/commands/agent/list.js.map +1 -0
  13. package/dist/commands/agent/register.d.ts +21 -0
  14. package/dist/commands/agent/register.d.ts.map +1 -0
  15. package/dist/commands/agent/register.js +97 -0
  16. package/dist/commands/agent/register.js.map +1 -0
  17. package/dist/commands/agent/status.d.ts +19 -0
  18. package/dist/commands/agent/status.d.ts.map +1 -0
  19. package/dist/commands/agent/status.js +271 -0
  20. package/dist/commands/agent/status.js.map +1 -0
  21. package/dist/commands/agent/work.d.ts +22 -0
  22. package/dist/commands/agent/work.d.ts.map +1 -0
  23. package/dist/commands/agent/work.js +459 -0
  24. package/dist/commands/agent/work.js.map +1 -0
  25. package/dist/commands/checkpoint/create.d.ts +27 -0
  26. package/dist/commands/checkpoint/create.d.ts.map +1 -0
  27. package/dist/commands/checkpoint/create.js +82 -0
  28. package/dist/commands/checkpoint/create.js.map +1 -0
  29. package/dist/commands/checkpoint/index.d.ts +23 -0
  30. package/dist/commands/checkpoint/index.d.ts.map +1 -0
  31. package/dist/commands/checkpoint/index.js +91 -0
  32. package/dist/commands/checkpoint/index.js.map +1 -0
  33. package/dist/commands/checkpoint/list.d.ts +27 -0
  34. package/dist/commands/checkpoint/list.d.ts.map +1 -0
  35. package/dist/commands/checkpoint/list.js +115 -0
  36. package/dist/commands/checkpoint/list.js.map +1 -0
  37. package/dist/commands/checkpoint/show.d.ts +23 -0
  38. package/dist/commands/checkpoint/show.d.ts.map +1 -0
  39. package/dist/commands/checkpoint/show.js +102 -0
  40. package/dist/commands/checkpoint/show.js.map +1 -0
  41. package/dist/commands/dlq.d.ts +24 -0
  42. package/dist/commands/dlq.d.ts.map +1 -0
  43. package/dist/commands/dlq.js +172 -0
  44. package/dist/commands/dlq.js.map +1 -0
  45. package/dist/commands/escalation/create.d.ts +22 -0
  46. package/dist/commands/escalation/create.d.ts.map +1 -0
  47. package/dist/commands/escalation/create.js +122 -0
  48. package/dist/commands/escalation/create.js.map +1 -0
  49. package/dist/commands/escalation/escalation-client.d.ts +101 -0
  50. package/dist/commands/escalation/escalation-client.d.ts.map +1 -0
  51. package/dist/commands/escalation/escalation-client.js +129 -0
  52. package/dist/commands/escalation/escalation-client.js.map +1 -0
  53. package/dist/commands/escalation/index.d.ts +22 -0
  54. package/dist/commands/escalation/index.d.ts.map +1 -0
  55. package/dist/commands/escalation/index.js +94 -0
  56. package/dist/commands/escalation/index.js.map +1 -0
  57. package/dist/commands/escalation/list.d.ts +24 -0
  58. package/dist/commands/escalation/list.d.ts.map +1 -0
  59. package/dist/commands/escalation/list.js +170 -0
  60. package/dist/commands/escalation/list.js.map +1 -0
  61. package/dist/commands/escalation/resolve.d.ts +20 -0
  62. package/dist/commands/escalation/resolve.d.ts.map +1 -0
  63. package/dist/commands/escalation/resolve.js +102 -0
  64. package/dist/commands/escalation/resolve.js.map +1 -0
  65. package/dist/commands/graph/api-client.d.ts +21 -1
  66. package/dist/commands/graph/api-client.d.ts.map +1 -1
  67. package/dist/commands/graph/api-client.js +23 -0
  68. package/dist/commands/graph/api-client.js.map +1 -1
  69. package/dist/commands/handoff.d.ts.map +1 -1
  70. package/dist/commands/handoff.js +9 -1
  71. package/dist/commands/handoff.js.map +1 -1
  72. package/dist/commands/log.d.ts +3 -0
  73. package/dist/commands/log.d.ts.map +1 -1
  74. package/dist/commands/log.js +73 -14
  75. package/dist/commands/log.js.map +1 -1
  76. package/dist/commands/notifications/history.d.ts +21 -0
  77. package/dist/commands/notifications/history.d.ts.map +1 -0
  78. package/dist/commands/notifications/history.js +160 -0
  79. package/dist/commands/notifications/history.js.map +1 -0
  80. package/dist/commands/notifications/index.d.ts +22 -0
  81. package/dist/commands/notifications/index.d.ts.map +1 -0
  82. package/dist/commands/notifications/index.js +87 -0
  83. package/dist/commands/notifications/index.js.map +1 -0
  84. package/dist/commands/notifications/list.d.ts +19 -0
  85. package/dist/commands/notifications/list.d.ts.map +1 -0
  86. package/dist/commands/notifications/list.js +132 -0
  87. package/dist/commands/notifications/list.js.map +1 -0
  88. package/dist/commands/notifications/test.d.ts +19 -0
  89. package/dist/commands/notifications/test.d.ts.map +1 -0
  90. package/dist/commands/notifications/test.js +217 -0
  91. package/dist/commands/notifications/test.js.map +1 -0
  92. package/dist/commands/orchestrate.d.ts +25 -0
  93. package/dist/commands/orchestrate.d.ts.map +1 -0
  94. package/dist/commands/orchestrate.js +858 -0
  95. package/dist/commands/orchestrate.js.map +1 -0
  96. package/dist/commands/sprint/deps.d.ts +29 -0
  97. package/dist/commands/sprint/deps.d.ts.map +1 -0
  98. package/dist/commands/sprint/deps.js +269 -0
  99. package/dist/commands/sprint/deps.js.map +1 -0
  100. package/dist/commands/sprint/index.d.ts +10 -5
  101. package/dist/commands/sprint/index.d.ts.map +1 -1
  102. package/dist/commands/sprint/index.js +26 -5
  103. package/dist/commands/sprint/index.js.map +1 -1
  104. package/dist/commands/start/index.d.ts.map +1 -1
  105. package/dist/commands/start/index.js +6 -0
  106. package/dist/commands/start/index.js.map +1 -1
  107. package/dist/commands/start/start-reflection.d.ts.map +1 -1
  108. package/dist/commands/start/start-reflection.js +8 -0
  109. package/dist/commands/start/start-reflection.js.map +1 -1
  110. package/dist/commands/verify.d.ts +17 -0
  111. package/dist/commands/verify.d.ts.map +1 -0
  112. package/dist/commands/verify.js +232 -0
  113. package/dist/commands/verify.js.map +1 -0
  114. package/dist/core/session-log-manager.d.ts +1 -1
  115. package/dist/core/session-log-manager.d.ts.map +1 -1
  116. package/dist/index.js +78 -1
  117. package/dist/index.js.map +1 -1
  118. package/dist/lib/__tests__/task-timeout.test.d.ts +12 -0
  119. package/dist/lib/__tests__/task-timeout.test.d.ts.map +1 -0
  120. package/dist/lib/__tests__/task-timeout.test.js +278 -0
  121. package/dist/lib/__tests__/task-timeout.test.js.map +1 -0
  122. package/dist/lib/agent-heartbeat.d.ts +68 -0
  123. package/dist/lib/agent-heartbeat.d.ts.map +1 -0
  124. package/dist/lib/agent-heartbeat.js +117 -0
  125. package/dist/lib/agent-heartbeat.js.map +1 -0
  126. package/dist/lib/checkpoint.d.ts +85 -0
  127. package/dist/lib/checkpoint.d.ts.map +1 -0
  128. package/dist/lib/checkpoint.js +323 -0
  129. package/dist/lib/checkpoint.js.map +1 -0
  130. package/dist/lib/context-metrics.d.ts +230 -0
  131. package/dist/lib/context-metrics.d.ts.map +1 -0
  132. package/dist/lib/context-metrics.js +372 -0
  133. package/dist/lib/context-metrics.js.map +1 -0
  134. package/dist/lib/dead-letter-queue.d.ts +108 -0
  135. package/dist/lib/dead-letter-queue.d.ts.map +1 -0
  136. package/dist/lib/dead-letter-queue.js +378 -0
  137. package/dist/lib/dead-letter-queue.js.map +1 -0
  138. package/dist/lib/event-logger.d.ts +9 -1
  139. package/dist/lib/event-logger.d.ts.map +1 -1
  140. package/dist/lib/event-logger.js +45 -3
  141. package/dist/lib/event-logger.js.map +1 -1
  142. package/dist/lib/event-queue.d.ts.map +1 -1
  143. package/dist/lib/event-queue.js +13 -2
  144. package/dist/lib/event-queue.js.map +1 -1
  145. package/dist/lib/examples/timeout-demo.d.ts +13 -0
  146. package/dist/lib/examples/timeout-demo.d.ts.map +1 -0
  147. package/dist/lib/examples/timeout-demo.js +102 -0
  148. package/dist/lib/examples/timeout-demo.js.map +1 -0
  149. package/dist/lib/examples/timeout-integration-example.d.ts +17 -0
  150. package/dist/lib/examples/timeout-integration-example.d.ts.map +1 -0
  151. package/dist/lib/examples/timeout-integration-example.js +223 -0
  152. package/dist/lib/examples/timeout-integration-example.js.map +1 -0
  153. package/dist/lib/notification-hooks.d.ts +103 -0
  154. package/dist/lib/notification-hooks.d.ts.map +1 -0
  155. package/dist/lib/notification-hooks.js +223 -0
  156. package/dist/lib/notification-hooks.js.map +1 -0
  157. package/dist/lib/notifications/discord.d.ts +20 -0
  158. package/dist/lib/notifications/discord.d.ts.map +1 -0
  159. package/dist/lib/notifications/discord.js +140 -0
  160. package/dist/lib/notifications/discord.js.map +1 -0
  161. package/dist/lib/notifications/index.d.ts +66 -0
  162. package/dist/lib/notifications/index.d.ts.map +1 -0
  163. package/dist/lib/notifications/index.js +120 -0
  164. package/dist/lib/notifications/index.js.map +1 -0
  165. package/dist/lib/notifications/slack.d.ts +20 -0
  166. package/dist/lib/notifications/slack.d.ts.map +1 -0
  167. package/dist/lib/notifications/slack.js +186 -0
  168. package/dist/lib/notifications/slack.js.map +1 -0
  169. package/dist/lib/notifications/teams.d.ts +20 -0
  170. package/dist/lib/notifications/teams.d.ts.map +1 -0
  171. package/dist/lib/notifications/teams.js +146 -0
  172. package/dist/lib/notifications/teams.js.map +1 -0
  173. package/dist/lib/notifications/webhook.d.ts +23 -0
  174. package/dist/lib/notifications/webhook.d.ts.map +1 -0
  175. package/dist/lib/notifications/webhook.js +65 -0
  176. package/dist/lib/notifications/webhook.js.map +1 -0
  177. package/dist/lib/orchestrator-state.d.ts +194 -0
  178. package/dist/lib/orchestrator-state.d.ts.map +1 -0
  179. package/dist/lib/orchestrator-state.js +332 -0
  180. package/dist/lib/orchestrator-state.js.map +1 -0
  181. package/dist/lib/realtime-cursor.d.ts +107 -0
  182. package/dist/lib/realtime-cursor.d.ts.map +1 -0
  183. package/dist/lib/realtime-cursor.js +260 -0
  184. package/dist/lib/realtime-cursor.js.map +1 -0
  185. package/dist/lib/rollback.d.ts +86 -0
  186. package/dist/lib/rollback.d.ts.map +1 -0
  187. package/dist/lib/rollback.js +405 -0
  188. package/dist/lib/rollback.js.map +1 -0
  189. package/dist/lib/sprint-loader.d.ts +39 -2
  190. package/dist/lib/sprint-loader.d.ts.map +1 -1
  191. package/dist/lib/sprint-loader.js +269 -5
  192. package/dist/lib/sprint-loader.js.map +1 -1
  193. package/dist/lib/stale-agent-detector.d.ts +102 -0
  194. package/dist/lib/stale-agent-detector.d.ts.map +1 -0
  195. package/dist/lib/stale-agent-detector.js +156 -0
  196. package/dist/lib/stale-agent-detector.js.map +1 -0
  197. package/dist/lib/task-dependencies.d.ts +143 -0
  198. package/dist/lib/task-dependencies.d.ts.map +1 -0
  199. package/dist/lib/task-dependencies.js +357 -0
  200. package/dist/lib/task-dependencies.js.map +1 -0
  201. package/dist/lib/task-timeout.d.ts +153 -0
  202. package/dist/lib/task-timeout.d.ts.map +1 -0
  203. package/dist/lib/task-timeout.js +505 -0
  204. package/dist/lib/task-timeout.js.map +1 -0
  205. package/dist/lib/verification/build-check.d.ts +55 -0
  206. package/dist/lib/verification/build-check.d.ts.map +1 -0
  207. package/dist/lib/verification/build-check.js +111 -0
  208. package/dist/lib/verification/build-check.js.map +1 -0
  209. package/dist/lib/verification/index.d.ts +19 -0
  210. package/dist/lib/verification/index.d.ts.map +1 -0
  211. package/dist/lib/verification/index.js +17 -0
  212. package/dist/lib/verification/index.js.map +1 -0
  213. package/dist/lib/verification/lint-check.d.ts +34 -0
  214. package/dist/lib/verification/lint-check.d.ts.map +1 -0
  215. package/dist/lib/verification/lint-check.js +215 -0
  216. package/dist/lib/verification/lint-check.js.map +1 -0
  217. package/dist/lib/verification/test-runner.d.ts +50 -0
  218. package/dist/lib/verification/test-runner.d.ts.map +1 -0
  219. package/dist/lib/verification/test-runner.js +225 -0
  220. package/dist/lib/verification/test-runner.js.map +1 -0
  221. package/dist/utils/command-helpers.d.ts.map +1 -1
  222. package/dist/utils/command-helpers.js +7 -0
  223. package/dist/utils/command-helpers.js.map +1 -1
  224. package/package.json +1 -1
@@ -0,0 +1,405 @@
1
+ /**
2
+ * @fileType: utility
3
+ * @status: current
4
+ * @updated: 2025-12-07
5
+ * @tags: [rollback, resilience, checkpoint, git, epic-004-sprint5, task-3]
6
+ * @related: [checkpoint.ts, event-logger.ts, orchestrator-state.ts]
7
+ * @priority: high
8
+ * @complexity: high
9
+ * @dependencies: [fs-extra, simple-git, checkpoint.ts]
10
+ */
11
+ import fs from 'fs-extra';
12
+ import path from 'path';
13
+ import simpleGit from 'simple-git';
14
+ import { getGinkoDir, getProjectRoot } from '../utils/helpers.js';
15
+ import { getCheckpoint } from './checkpoint.js';
16
+ import { logEvent } from './event-logger.js';
17
+ /**
18
+ * Get path to rollback history directory
19
+ */
20
+ async function getRollbackHistoryDir() {
21
+ const ginkoDir = await getGinkoDir();
22
+ const rollbackDir = path.join(ginkoDir, 'rollbacks');
23
+ await fs.ensureDir(rollbackDir);
24
+ return rollbackDir;
25
+ }
26
+ /**
27
+ * Get path to rollback history file
28
+ */
29
+ async function getRollbackHistoryPath() {
30
+ const rollbackDir = await getRollbackHistoryDir();
31
+ return path.join(rollbackDir, 'history.json');
32
+ }
33
+ /**
34
+ * Load rollback history from disk
35
+ */
36
+ async function loadRollbackHistory() {
37
+ try {
38
+ const historyPath = await getRollbackHistoryPath();
39
+ if (!await fs.pathExists(historyPath)) {
40
+ return {
41
+ version: '1.0',
42
+ rollbacks: {},
43
+ last_updated: new Date().toISOString()
44
+ };
45
+ }
46
+ const history = await fs.readJSON(historyPath);
47
+ // Convert date strings back to Date objects
48
+ Object.values(history.rollbacks).forEach((entry) => {
49
+ entry.timestamp = new Date(entry.timestamp);
50
+ if (entry.undoneAt) {
51
+ entry.undoneAt = new Date(entry.undoneAt);
52
+ }
53
+ });
54
+ return history;
55
+ }
56
+ catch (error) {
57
+ console.warn('[ROLLBACK] Failed to load history:', error);
58
+ return {
59
+ version: '1.0',
60
+ rollbacks: {},
61
+ last_updated: new Date().toISOString()
62
+ };
63
+ }
64
+ }
65
+ /**
66
+ * Save rollback history to disk
67
+ */
68
+ async function saveRollbackHistory(history) {
69
+ try {
70
+ const historyPath = await getRollbackHistoryPath();
71
+ history.last_updated = new Date().toISOString();
72
+ await fs.writeJSON(historyPath, history, { spaces: 2 });
73
+ }
74
+ catch (error) {
75
+ console.error('[ROLLBACK] Failed to save history:', error);
76
+ throw error;
77
+ }
78
+ }
79
+ /**
80
+ * Add rollback entry to history
81
+ */
82
+ async function addToHistory(entry) {
83
+ const history = await loadRollbackHistory();
84
+ history.rollbacks[entry.id] = entry;
85
+ await saveRollbackHistory(history);
86
+ }
87
+ /**
88
+ * Generate rollback ID
89
+ * Format: rb_<timestamp>_<checkpointId>
90
+ */
91
+ function generateRollbackId(checkpointId) {
92
+ const timestamp = Date.now();
93
+ return `rb_${timestamp}_${checkpointId}`;
94
+ }
95
+ /**
96
+ * Get current git commit hash
97
+ */
98
+ async function getCurrentCommit() {
99
+ const projectRoot = await getProjectRoot();
100
+ const git = simpleGit(projectRoot);
101
+ const log = await git.log({ maxCount: 1 });
102
+ return log.latest?.hash || 'unknown';
103
+ }
104
+ /**
105
+ * Check if working directory is clean
106
+ */
107
+ async function isWorkingDirectoryClean() {
108
+ const projectRoot = await getProjectRoot();
109
+ const git = simpleGit(projectRoot);
110
+ const status = await git.status();
111
+ return status.isClean();
112
+ }
113
+ /**
114
+ * Count changed files between two commits
115
+ */
116
+ async function countChangedFiles(fromCommit, toCommit) {
117
+ const projectRoot = await getProjectRoot();
118
+ const git = simpleGit(projectRoot);
119
+ const diff = await git.diff(['--name-only', `${fromCommit}...${toCommit}`]);
120
+ return diff.split('\n').filter(line => line.trim().length > 0).length;
121
+ }
122
+ /**
123
+ * Release task for re-claiming
124
+ * Updates task status to 'available' by calling graph API
125
+ */
126
+ async function releaseTask(taskId, agentId) {
127
+ try {
128
+ // Import agent client for task release
129
+ const { AgentClient } = await import('../commands/agent/agent-client.js');
130
+ // Call release endpoint
131
+ await AgentClient.releaseTask(taskId, agentId);
132
+ console.log(`[ROLLBACK] Released task ${taskId} for re-claiming`);
133
+ }
134
+ catch (error) {
135
+ // Log warning but don't fail rollback if task release fails
136
+ console.warn(`[ROLLBACK] Failed to release task ${taskId}:`, error instanceof Error ? error.message : String(error));
137
+ }
138
+ }
139
+ /**
140
+ * Rollback to a specific checkpoint
141
+ *
142
+ * Process:
143
+ * 1. Verify checkpoint exists
144
+ * 2. Stash current work (if dirty) with reference
145
+ * 3. Reset to checkpoint commit
146
+ * 4. Create rollback event
147
+ * 5. Release task for re-claiming
148
+ *
149
+ * @param checkpointId - Checkpoint ID to roll back to
150
+ * @param options - Rollback options
151
+ * @returns RollbackResult with success status and details
152
+ */
153
+ export async function rollbackToCheckpoint(checkpointId, options) {
154
+ console.log(`[ROLLBACK] Starting rollback to checkpoint ${checkpointId}`);
155
+ try {
156
+ // 1. Verify checkpoint exists
157
+ const checkpoint = await getCheckpoint(checkpointId);
158
+ if (!checkpoint) {
159
+ return {
160
+ success: false,
161
+ checkpointId,
162
+ previousCommit: 'unknown',
163
+ rolledBackTo: 'unknown',
164
+ filesRestored: 0,
165
+ error: `Checkpoint ${checkpointId} not found`
166
+ };
167
+ }
168
+ console.log(`[ROLLBACK] Found checkpoint for task ${checkpoint.taskId}`);
169
+ console.log(`[ROLLBACK] Target commit: ${checkpoint.gitCommit.substring(0, 7)}`);
170
+ // Get current commit before rollback
171
+ const previousCommit = await getCurrentCommit();
172
+ console.log(`[ROLLBACK] Current commit: ${previousCommit.substring(0, 7)}`);
173
+ // Check if we're already at the target commit
174
+ if (previousCommit === checkpoint.gitCommit) {
175
+ console.log('[ROLLBACK] Already at target commit, no rollback needed');
176
+ return {
177
+ success: true,
178
+ checkpointId,
179
+ previousCommit,
180
+ rolledBackTo: checkpoint.gitCommit,
181
+ filesRestored: 0
182
+ };
183
+ }
184
+ const projectRoot = await getProjectRoot();
185
+ const git = simpleGit(projectRoot);
186
+ // 2. Check for dirty working directory
187
+ const isClean = await isWorkingDirectoryClean();
188
+ let stashRef;
189
+ if (!isClean) {
190
+ if (!options?.force) {
191
+ return {
192
+ success: false,
193
+ checkpointId,
194
+ previousCommit,
195
+ rolledBackTo: checkpoint.gitCommit,
196
+ filesRestored: 0,
197
+ error: 'Working directory has uncommitted changes. Use --force to stash and rollback.'
198
+ };
199
+ }
200
+ // Stash current work
201
+ console.log('[ROLLBACK] Stashing current work...');
202
+ const stashMessage = `pre-rollback-${checkpointId}`;
203
+ await git.stash(['push', '-m', stashMessage]);
204
+ // Get stash reference
205
+ const stashList = await git.stashList();
206
+ if (stashList.latest) {
207
+ stashRef = stashList.latest.hash; // Use the stash hash as reference
208
+ console.log(`[ROLLBACK] Stashed as: ${stashRef}`);
209
+ }
210
+ }
211
+ // 3. Verify target commit exists
212
+ try {
213
+ await git.revparse([checkpoint.gitCommit]);
214
+ }
215
+ catch (error) {
216
+ return {
217
+ success: false,
218
+ checkpointId,
219
+ previousCommit,
220
+ rolledBackTo: checkpoint.gitCommit,
221
+ filesRestored: 0,
222
+ error: `Target commit ${checkpoint.gitCommit} not found in repository`
223
+ };
224
+ }
225
+ // Count files that will change
226
+ const filesRestored = await countChangedFiles(previousCommit, checkpoint.gitCommit);
227
+ // 4. Reset to checkpoint commit
228
+ console.log(`[ROLLBACK] Resetting to commit ${checkpoint.gitCommit.substring(0, 7)}...`);
229
+ await git.checkout(checkpoint.gitCommit);
230
+ console.log(`[ROLLBACK] Successfully rolled back ${filesRestored} files`);
231
+ // 5. Create rollback event
232
+ try {
233
+ await logEvent({
234
+ category: 'git',
235
+ description: `Rolled back to checkpoint ${checkpointId} (commit ${checkpoint.gitCommit.substring(0, 7)}) from commit ${previousCommit.substring(0, 7)}. ${filesRestored} files restored.${options?.reason ? ` Reason: ${options.reason}` : ''}`,
236
+ impact: 'high',
237
+ files: checkpoint.filesModified,
238
+ commit_hash: checkpoint.gitCommit,
239
+ tags: ['rollback', 'checkpoint', checkpoint.taskId]
240
+ });
241
+ }
242
+ catch (error) {
243
+ console.warn('[ROLLBACK] Failed to create rollback event:', error);
244
+ }
245
+ // 6. Release task for re-claiming
246
+ try {
247
+ await releaseTask(checkpoint.taskId, checkpoint.agentId);
248
+ }
249
+ catch (error) {
250
+ console.warn('[ROLLBACK] Failed to release task:', error);
251
+ }
252
+ // 7. Record in rollback history
253
+ const rollbackId = generateRollbackId(checkpointId);
254
+ const rollbackEntry = {
255
+ id: rollbackId,
256
+ checkpointId,
257
+ taskId: checkpoint.taskId,
258
+ agentId: checkpoint.agentId,
259
+ timestamp: new Date(),
260
+ previousCommit,
261
+ rolledBackTo: checkpoint.gitCommit,
262
+ stashRef,
263
+ filesRestored,
264
+ reason: options?.reason,
265
+ undone: false
266
+ };
267
+ await addToHistory(rollbackEntry);
268
+ return {
269
+ success: true,
270
+ checkpointId,
271
+ stashRef,
272
+ previousCommit,
273
+ rolledBackTo: checkpoint.gitCommit,
274
+ filesRestored
275
+ };
276
+ }
277
+ catch (error) {
278
+ console.error('[ROLLBACK] Rollback failed:', error);
279
+ return {
280
+ success: false,
281
+ checkpointId,
282
+ previousCommit: 'unknown',
283
+ rolledBackTo: 'unknown',
284
+ filesRestored: 0,
285
+ error: error instanceof Error ? error.message : 'Unknown error during rollback'
286
+ };
287
+ }
288
+ }
289
+ /**
290
+ * Undo a rollback by applying the stashed changes
291
+ *
292
+ * @param stashRef - Git stash reference to apply
293
+ * @returns Success status and error message if failed
294
+ */
295
+ export async function undoRollback(stashRef) {
296
+ console.log(`[ROLLBACK] Undoing rollback by applying stash ${stashRef}`);
297
+ try {
298
+ const projectRoot = await getProjectRoot();
299
+ const git = simpleGit(projectRoot);
300
+ // Verify stash exists
301
+ const stashList = await git.stashList();
302
+ const stashExists = stashList.all.some(stash => stash.hash === stashRef);
303
+ if (!stashExists) {
304
+ return {
305
+ success: false,
306
+ error: `Stash ${stashRef} not found`
307
+ };
308
+ }
309
+ // Check for clean working directory
310
+ const isClean = await isWorkingDirectoryClean();
311
+ if (!isClean) {
312
+ return {
313
+ success: false,
314
+ error: 'Working directory has uncommitted changes. Commit or stash changes before undoing rollback.'
315
+ };
316
+ }
317
+ // Apply stash
318
+ await git.stash(['apply', stashRef]);
319
+ console.log(`[ROLLBACK] Successfully applied stash ${stashRef}`);
320
+ // Log event
321
+ try {
322
+ await logEvent({
323
+ category: 'git',
324
+ description: `Undid rollback by applying stash ${stashRef}`,
325
+ impact: 'medium',
326
+ tags: ['rollback', 'undo']
327
+ });
328
+ }
329
+ catch (error) {
330
+ console.warn('[ROLLBACK] Failed to create undo event:', error);
331
+ }
332
+ // Update rollback history
333
+ const history = await loadRollbackHistory();
334
+ const rollbackEntry = Object.values(history.rollbacks).find(rb => rb.stashRef === stashRef && !rb.undone);
335
+ if (rollbackEntry) {
336
+ rollbackEntry.undone = true;
337
+ rollbackEntry.undoneAt = new Date();
338
+ await saveRollbackHistory(history);
339
+ }
340
+ return { success: true };
341
+ }
342
+ catch (error) {
343
+ console.error('[ROLLBACK] Undo failed:', error);
344
+ return {
345
+ success: false,
346
+ error: error instanceof Error ? error.message : 'Unknown error during undo'
347
+ };
348
+ }
349
+ }
350
+ /**
351
+ * Get rollback history, optionally filtered by task ID
352
+ *
353
+ * @param taskId - Optional task ID to filter by
354
+ * @returns Array of rollback entries, sorted by timestamp (newest first)
355
+ */
356
+ export async function getRollbackHistory(taskId) {
357
+ try {
358
+ const history = await loadRollbackHistory();
359
+ let rollbacks = Object.values(history.rollbacks);
360
+ // Filter by task ID if provided
361
+ if (taskId) {
362
+ rollbacks = rollbacks.filter(rb => rb.taskId === taskId);
363
+ }
364
+ // Sort by timestamp (newest first)
365
+ rollbacks.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());
366
+ return rollbacks;
367
+ }
368
+ catch (error) {
369
+ console.warn('[ROLLBACK] Failed to get rollback history:', error);
370
+ return [];
371
+ }
372
+ }
373
+ /**
374
+ * Get rollback entry by ID
375
+ */
376
+ export async function getRollbackById(rollbackId) {
377
+ try {
378
+ const history = await loadRollbackHistory();
379
+ const rollback = history.rollbacks[rollbackId];
380
+ return rollback || null;
381
+ }
382
+ catch (error) {
383
+ console.warn(`[ROLLBACK] Failed to get rollback ${rollbackId}:`, error);
384
+ return null;
385
+ }
386
+ }
387
+ /**
388
+ * Clear rollback history (for testing)
389
+ */
390
+ export async function clearRollbackHistory() {
391
+ try {
392
+ const historyPath = await getRollbackHistoryPath();
393
+ const emptyHistory = {
394
+ version: '1.0',
395
+ rollbacks: {},
396
+ last_updated: new Date().toISOString()
397
+ };
398
+ await fs.writeJSON(historyPath, emptyHistory, { spaces: 2 });
399
+ }
400
+ catch (error) {
401
+ console.error('[ROLLBACK] Failed to clear history:', error);
402
+ throw error;
403
+ }
404
+ }
405
+ //# sourceMappingURL=rollback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollback.js","sourceRoot":"","sources":["../../src/lib/rollback.ts"],"names":[],"mappings":"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"}
@@ -10,8 +10,32 @@
10
10
  */
11
11
  /**
12
12
  * Task state enumeration
13
+ * - todo: [ ] Not started
14
+ * - in_progress: [@] Currently being worked on
15
+ * - paused: [Z] Temporarily on hold (sleeping)
16
+ * - complete: [x] Finished
13
17
  */
14
- export type TaskState = 'todo' | 'in_progress' | 'complete';
18
+ export type TaskState = 'todo' | 'in_progress' | 'paused' | 'complete';
19
+ /**
20
+ * Acceptance criterion type - auto-detected from description (EPIC-004 Sprint 3)
21
+ * - test: Unit tests, specs, test suites
22
+ * - build: Compilation, build process
23
+ * - lint: Linting, code style checks
24
+ * - performance: Response time, latency metrics
25
+ * - manual: Human review, approval
26
+ * - custom: Other criteria with custom commands
27
+ */
28
+ export type CriterionType = 'test' | 'build' | 'lint' | 'performance' | 'manual' | 'custom';
29
+ /**
30
+ * Acceptance criterion for task verification (EPIC-004 Sprint 3)
31
+ */
32
+ export interface AcceptanceCriterion {
33
+ id: string;
34
+ description: string;
35
+ type: CriterionType;
36
+ threshold?: number;
37
+ command?: string;
38
+ }
15
39
  /**
16
40
  * Individual task from sprint checklist
17
41
  */
@@ -26,6 +50,8 @@ export interface Task {
26
50
  relatedADRs?: string[];
27
51
  relatedPatterns?: string[];
28
52
  relatedGotchas?: string[];
53
+ acceptanceCriteria?: AcceptanceCriterion[];
54
+ dependsOn?: string[];
29
55
  }
30
56
  /**
31
57
  * Sprint checklist with task states and progress
@@ -36,12 +62,14 @@ export interface SprintChecklist {
36
62
  progress: {
37
63
  complete: number;
38
64
  inProgress: number;
65
+ paused: number;
39
66
  todo: number;
40
67
  total: number;
41
68
  };
42
69
  tasks: Task[];
43
70
  currentTask?: Task;
44
71
  recentCompletions: Task[];
72
+ dependencyWarnings?: string[];
45
73
  }
46
74
  /**
47
75
  * Find active sprint file
@@ -50,6 +78,15 @@ export interface SprintChecklist {
50
78
  * 1. Check CURRENT-SPRINT.md for "Between Sprints" status → return null
51
79
  * 2. Check CURRENT-SPRINT.md for sprint reference → return that file
52
80
  * 3. Fall back to scanning SPRINT-*.md files for first incomplete one
81
+ * - Respects frontmatter `status` field: active > not_started > (skip paused/complete)
82
+ *
83
+ * Valid status values:
84
+ * - active: Currently being worked on
85
+ * - not_started: Planned but not yet started
86
+ * - paused: Temporarily on hold (skipped by auto-detection)
87
+ * - complete: Finished (skipped by auto-detection)
88
+ * - proposed: Not yet approved (skipped by auto-detection)
89
+ * - abandoned: Cancelled (skipped by auto-detection)
53
90
  *
54
91
  * @param projectRoot - Project root directory
55
92
  * @returns Path to active sprint file or null (if between sprints)
@@ -61,7 +98,7 @@ export declare function findActiveSprint(projectRoot?: string): Promise<string |
61
98
  * Looks for:
62
99
  * - Sprint name from title (# SPRINT: ...)
63
100
  * - Tasks from ## Sprint Tasks or ### TASK-N sections
64
- * - Checkbox states: [ ], [@], [x]
101
+ * - Checkbox states: [ ], [@], [Z], [x]
65
102
  * - Task metadata (files, priority, effort)
66
103
  *
67
104
  * @param markdown - Sprint markdown content
@@ -1 +1 @@
1
- {"version":3,"file":"sprint-loader.d.ts","sourceRoot":"","sources":["../../src/lib/sprint-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAmBH;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,aAAa,GAAG,UAAU,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,iBAAiB,EAAE,IAAI,EAAE,CAAC;CAC3B;AAiBD;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqGnF;AAeD;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,CAiKxF;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAe/F;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,eAAe,EAAE,QAAQ,GAAE,MAAU,GAAG,MAAM,CAqD9F;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAmC3D"}
1
+ {"version":3,"file":"sprint-loader.d.ts","sourceRoot":"","sources":["../../src/lib/sprint-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAmBH;;;;;;GAMG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,aAAa,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEvE;;;;;;;;GAQG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,aAAa,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE5F;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,kBAAkB,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC3C,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,iBAAiB,EAAE,IAAI,EAAE,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC/B;AA0CD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyInF;AA4JD;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,CAmPxF;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAe/F;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,eAAe,EAAE,QAAQ,GAAE,MAAU,GAAG,MAAM,CAyD9F;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAmC3D"}