@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.
- package/dist/commands/agent/agent-client.d.ts +150 -0
- package/dist/commands/agent/agent-client.d.ts.map +1 -0
- package/dist/commands/agent/agent-client.js +170 -0
- package/dist/commands/agent/agent-client.js.map +1 -0
- package/dist/commands/agent/index.d.ts +22 -0
- package/dist/commands/agent/index.d.ts.map +1 -0
- package/dist/commands/agent/index.js +121 -0
- package/dist/commands/agent/index.js.map +1 -0
- package/dist/commands/agent/list.d.ts +22 -0
- package/dist/commands/agent/list.d.ts.map +1 -0
- package/dist/commands/agent/list.js +119 -0
- package/dist/commands/agent/list.js.map +1 -0
- package/dist/commands/agent/register.d.ts +21 -0
- package/dist/commands/agent/register.d.ts.map +1 -0
- package/dist/commands/agent/register.js +97 -0
- package/dist/commands/agent/register.js.map +1 -0
- package/dist/commands/agent/status.d.ts +19 -0
- package/dist/commands/agent/status.d.ts.map +1 -0
- package/dist/commands/agent/status.js +271 -0
- package/dist/commands/agent/status.js.map +1 -0
- package/dist/commands/agent/work.d.ts +22 -0
- package/dist/commands/agent/work.d.ts.map +1 -0
- package/dist/commands/agent/work.js +459 -0
- package/dist/commands/agent/work.js.map +1 -0
- package/dist/commands/checkpoint/create.d.ts +27 -0
- package/dist/commands/checkpoint/create.d.ts.map +1 -0
- package/dist/commands/checkpoint/create.js +82 -0
- package/dist/commands/checkpoint/create.js.map +1 -0
- package/dist/commands/checkpoint/index.d.ts +23 -0
- package/dist/commands/checkpoint/index.d.ts.map +1 -0
- package/dist/commands/checkpoint/index.js +91 -0
- package/dist/commands/checkpoint/index.js.map +1 -0
- package/dist/commands/checkpoint/list.d.ts +27 -0
- package/dist/commands/checkpoint/list.d.ts.map +1 -0
- package/dist/commands/checkpoint/list.js +115 -0
- package/dist/commands/checkpoint/list.js.map +1 -0
- package/dist/commands/checkpoint/show.d.ts +23 -0
- package/dist/commands/checkpoint/show.d.ts.map +1 -0
- package/dist/commands/checkpoint/show.js +102 -0
- package/dist/commands/checkpoint/show.js.map +1 -0
- package/dist/commands/dlq.d.ts +24 -0
- package/dist/commands/dlq.d.ts.map +1 -0
- package/dist/commands/dlq.js +172 -0
- package/dist/commands/dlq.js.map +1 -0
- package/dist/commands/escalation/create.d.ts +22 -0
- package/dist/commands/escalation/create.d.ts.map +1 -0
- package/dist/commands/escalation/create.js +122 -0
- package/dist/commands/escalation/create.js.map +1 -0
- package/dist/commands/escalation/escalation-client.d.ts +101 -0
- package/dist/commands/escalation/escalation-client.d.ts.map +1 -0
- package/dist/commands/escalation/escalation-client.js +129 -0
- package/dist/commands/escalation/escalation-client.js.map +1 -0
- package/dist/commands/escalation/index.d.ts +22 -0
- package/dist/commands/escalation/index.d.ts.map +1 -0
- package/dist/commands/escalation/index.js +94 -0
- package/dist/commands/escalation/index.js.map +1 -0
- package/dist/commands/escalation/list.d.ts +24 -0
- package/dist/commands/escalation/list.d.ts.map +1 -0
- package/dist/commands/escalation/list.js +170 -0
- package/dist/commands/escalation/list.js.map +1 -0
- package/dist/commands/escalation/resolve.d.ts +20 -0
- package/dist/commands/escalation/resolve.d.ts.map +1 -0
- package/dist/commands/escalation/resolve.js +102 -0
- package/dist/commands/escalation/resolve.js.map +1 -0
- package/dist/commands/graph/api-client.d.ts +21 -1
- package/dist/commands/graph/api-client.d.ts.map +1 -1
- package/dist/commands/graph/api-client.js +23 -0
- package/dist/commands/graph/api-client.js.map +1 -1
- package/dist/commands/handoff.d.ts.map +1 -1
- package/dist/commands/handoff.js +9 -1
- package/dist/commands/handoff.js.map +1 -1
- package/dist/commands/log.d.ts +3 -0
- package/dist/commands/log.d.ts.map +1 -1
- package/dist/commands/log.js +73 -14
- package/dist/commands/log.js.map +1 -1
- package/dist/commands/notifications/history.d.ts +21 -0
- package/dist/commands/notifications/history.d.ts.map +1 -0
- package/dist/commands/notifications/history.js +160 -0
- package/dist/commands/notifications/history.js.map +1 -0
- package/dist/commands/notifications/index.d.ts +22 -0
- package/dist/commands/notifications/index.d.ts.map +1 -0
- package/dist/commands/notifications/index.js +87 -0
- package/dist/commands/notifications/index.js.map +1 -0
- package/dist/commands/notifications/list.d.ts +19 -0
- package/dist/commands/notifications/list.d.ts.map +1 -0
- package/dist/commands/notifications/list.js +132 -0
- package/dist/commands/notifications/list.js.map +1 -0
- package/dist/commands/notifications/test.d.ts +19 -0
- package/dist/commands/notifications/test.d.ts.map +1 -0
- package/dist/commands/notifications/test.js +217 -0
- package/dist/commands/notifications/test.js.map +1 -0
- package/dist/commands/orchestrate.d.ts +25 -0
- package/dist/commands/orchestrate.d.ts.map +1 -0
- package/dist/commands/orchestrate.js +858 -0
- package/dist/commands/orchestrate.js.map +1 -0
- package/dist/commands/sprint/deps.d.ts +29 -0
- package/dist/commands/sprint/deps.d.ts.map +1 -0
- package/dist/commands/sprint/deps.js +269 -0
- package/dist/commands/sprint/deps.js.map +1 -0
- package/dist/commands/sprint/index.d.ts +10 -5
- package/dist/commands/sprint/index.d.ts.map +1 -1
- package/dist/commands/sprint/index.js +26 -5
- package/dist/commands/sprint/index.js.map +1 -1
- package/dist/commands/start/index.d.ts.map +1 -1
- package/dist/commands/start/index.js +6 -0
- package/dist/commands/start/index.js.map +1 -1
- package/dist/commands/start/start-reflection.d.ts.map +1 -1
- package/dist/commands/start/start-reflection.js +8 -0
- package/dist/commands/start/start-reflection.js.map +1 -1
- package/dist/commands/verify.d.ts +17 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +232 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/core/session-log-manager.d.ts +1 -1
- package/dist/core/session-log-manager.d.ts.map +1 -1
- package/dist/index.js +78 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/__tests__/task-timeout.test.d.ts +12 -0
- package/dist/lib/__tests__/task-timeout.test.d.ts.map +1 -0
- package/dist/lib/__tests__/task-timeout.test.js +278 -0
- package/dist/lib/__tests__/task-timeout.test.js.map +1 -0
- package/dist/lib/agent-heartbeat.d.ts +68 -0
- package/dist/lib/agent-heartbeat.d.ts.map +1 -0
- package/dist/lib/agent-heartbeat.js +117 -0
- package/dist/lib/agent-heartbeat.js.map +1 -0
- package/dist/lib/checkpoint.d.ts +85 -0
- package/dist/lib/checkpoint.d.ts.map +1 -0
- package/dist/lib/checkpoint.js +323 -0
- package/dist/lib/checkpoint.js.map +1 -0
- package/dist/lib/context-metrics.d.ts +230 -0
- package/dist/lib/context-metrics.d.ts.map +1 -0
- package/dist/lib/context-metrics.js +372 -0
- package/dist/lib/context-metrics.js.map +1 -0
- package/dist/lib/dead-letter-queue.d.ts +108 -0
- package/dist/lib/dead-letter-queue.d.ts.map +1 -0
- package/dist/lib/dead-letter-queue.js +378 -0
- package/dist/lib/dead-letter-queue.js.map +1 -0
- package/dist/lib/event-logger.d.ts +9 -1
- package/dist/lib/event-logger.d.ts.map +1 -1
- package/dist/lib/event-logger.js +45 -3
- package/dist/lib/event-logger.js.map +1 -1
- package/dist/lib/event-queue.d.ts.map +1 -1
- package/dist/lib/event-queue.js +13 -2
- package/dist/lib/event-queue.js.map +1 -1
- package/dist/lib/examples/timeout-demo.d.ts +13 -0
- package/dist/lib/examples/timeout-demo.d.ts.map +1 -0
- package/dist/lib/examples/timeout-demo.js +102 -0
- package/dist/lib/examples/timeout-demo.js.map +1 -0
- package/dist/lib/examples/timeout-integration-example.d.ts +17 -0
- package/dist/lib/examples/timeout-integration-example.d.ts.map +1 -0
- package/dist/lib/examples/timeout-integration-example.js +223 -0
- package/dist/lib/examples/timeout-integration-example.js.map +1 -0
- package/dist/lib/notification-hooks.d.ts +103 -0
- package/dist/lib/notification-hooks.d.ts.map +1 -0
- package/dist/lib/notification-hooks.js +223 -0
- package/dist/lib/notification-hooks.js.map +1 -0
- package/dist/lib/notifications/discord.d.ts +20 -0
- package/dist/lib/notifications/discord.d.ts.map +1 -0
- package/dist/lib/notifications/discord.js +140 -0
- package/dist/lib/notifications/discord.js.map +1 -0
- package/dist/lib/notifications/index.d.ts +66 -0
- package/dist/lib/notifications/index.d.ts.map +1 -0
- package/dist/lib/notifications/index.js +120 -0
- package/dist/lib/notifications/index.js.map +1 -0
- package/dist/lib/notifications/slack.d.ts +20 -0
- package/dist/lib/notifications/slack.d.ts.map +1 -0
- package/dist/lib/notifications/slack.js +186 -0
- package/dist/lib/notifications/slack.js.map +1 -0
- package/dist/lib/notifications/teams.d.ts +20 -0
- package/dist/lib/notifications/teams.d.ts.map +1 -0
- package/dist/lib/notifications/teams.js +146 -0
- package/dist/lib/notifications/teams.js.map +1 -0
- package/dist/lib/notifications/webhook.d.ts +23 -0
- package/dist/lib/notifications/webhook.d.ts.map +1 -0
- package/dist/lib/notifications/webhook.js +65 -0
- package/dist/lib/notifications/webhook.js.map +1 -0
- package/dist/lib/orchestrator-state.d.ts +194 -0
- package/dist/lib/orchestrator-state.d.ts.map +1 -0
- package/dist/lib/orchestrator-state.js +332 -0
- package/dist/lib/orchestrator-state.js.map +1 -0
- package/dist/lib/realtime-cursor.d.ts +107 -0
- package/dist/lib/realtime-cursor.d.ts.map +1 -0
- package/dist/lib/realtime-cursor.js +260 -0
- package/dist/lib/realtime-cursor.js.map +1 -0
- package/dist/lib/rollback.d.ts +86 -0
- package/dist/lib/rollback.d.ts.map +1 -0
- package/dist/lib/rollback.js +405 -0
- package/dist/lib/rollback.js.map +1 -0
- package/dist/lib/sprint-loader.d.ts +39 -2
- package/dist/lib/sprint-loader.d.ts.map +1 -1
- package/dist/lib/sprint-loader.js +269 -5
- package/dist/lib/sprint-loader.js.map +1 -1
- package/dist/lib/stale-agent-detector.d.ts +102 -0
- package/dist/lib/stale-agent-detector.d.ts.map +1 -0
- package/dist/lib/stale-agent-detector.js +156 -0
- package/dist/lib/stale-agent-detector.js.map +1 -0
- package/dist/lib/task-dependencies.d.ts +143 -0
- package/dist/lib/task-dependencies.d.ts.map +1 -0
- package/dist/lib/task-dependencies.js +357 -0
- package/dist/lib/task-dependencies.js.map +1 -0
- package/dist/lib/task-timeout.d.ts +153 -0
- package/dist/lib/task-timeout.d.ts.map +1 -0
- package/dist/lib/task-timeout.js +505 -0
- package/dist/lib/task-timeout.js.map +1 -0
- package/dist/lib/verification/build-check.d.ts +55 -0
- package/dist/lib/verification/build-check.d.ts.map +1 -0
- package/dist/lib/verification/build-check.js +111 -0
- package/dist/lib/verification/build-check.js.map +1 -0
- package/dist/lib/verification/index.d.ts +19 -0
- package/dist/lib/verification/index.d.ts.map +1 -0
- package/dist/lib/verification/index.js +17 -0
- package/dist/lib/verification/index.js.map +1 -0
- package/dist/lib/verification/lint-check.d.ts +34 -0
- package/dist/lib/verification/lint-check.d.ts.map +1 -0
- package/dist/lib/verification/lint-check.js +215 -0
- package/dist/lib/verification/lint-check.js.map +1 -0
- package/dist/lib/verification/test-runner.d.ts +50 -0
- package/dist/lib/verification/test-runner.d.ts.map +1 -0
- package/dist/lib/verification/test-runner.js +225 -0
- package/dist/lib/verification/test-runner.js.map +1 -0
- package/dist/utils/command-helpers.d.ts.map +1 -1
- package/dist/utils/command-helpers.js +7 -0
- package/dist/utils/command-helpers.js.map +1 -1
- 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
|
|
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"}
|