@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,459 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: command
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2025-12-07
|
|
5
|
+
* @tags: [agent, worker, cli, epic-004, sprint-4, multi-agent, context-loading]
|
|
6
|
+
* @related: [register.ts, agent-client.ts, ../start/index.ts, ../orchestrate.ts]
|
|
7
|
+
* @priority: high
|
|
8
|
+
* @complexity: high
|
|
9
|
+
* @dependencies: [commander, chalk, ora, agent-heartbeat, start, event-logger]
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Agent Work Command (EPIC-004 Sprint 4 TASK-8)
|
|
13
|
+
*
|
|
14
|
+
* Worker agent that loads project context and polls for task assignments.
|
|
15
|
+
*
|
|
16
|
+
* Worker Startup Flow:
|
|
17
|
+
* 1. Register as worker agent (or use existing from .ginko/agent.json)
|
|
18
|
+
* 2. Call `ginko start` to load project context (events, patterns, ADRs)
|
|
19
|
+
* 3. Start heartbeat to maintain online status
|
|
20
|
+
* 4. Enter polling loop for task assignments
|
|
21
|
+
* 5. On assignment: claim task atomically, load task-specific context
|
|
22
|
+
* 6. Execute task (AI does actual work), log events, verify, complete
|
|
23
|
+
* 7. Report completion/blocker via events
|
|
24
|
+
* 8. Return to polling
|
|
25
|
+
*
|
|
26
|
+
* Context Loading Strategy:
|
|
27
|
+
* - **Startup:** Full project context via `ginko start` (patterns, ADRs, events)
|
|
28
|
+
* - **Per-Task:** Lazy load task-specific files + acceptance criteria from graph
|
|
29
|
+
* - **Orchestrator:** Provides task metadata ONLY, not full project context
|
|
30
|
+
*
|
|
31
|
+
* This implements the "Worker Self-Context Loading" pattern where workers
|
|
32
|
+
* are responsible for their own context acquisition, reducing orchestrator
|
|
33
|
+
* coupling and enabling autonomous operation.
|
|
34
|
+
*/
|
|
35
|
+
import chalk from 'chalk';
|
|
36
|
+
import ora from 'ora';
|
|
37
|
+
import fs from 'fs/promises';
|
|
38
|
+
import path from 'path';
|
|
39
|
+
import { AgentClient } from './agent-client.js';
|
|
40
|
+
import { requireGinkoRoot } from '../../utils/ginko-root.js';
|
|
41
|
+
import { startCommand } from '../start/index.js';
|
|
42
|
+
import { startHeartbeat, shutdownHeartbeat } from '../../lib/agent-heartbeat.js';
|
|
43
|
+
import { loadGraphConfig } from '../graph/config.js';
|
|
44
|
+
import { logEvent } from '../../lib/event-logger.js';
|
|
45
|
+
/**
|
|
46
|
+
* Worker agent that loads context and polls for tasks
|
|
47
|
+
*/
|
|
48
|
+
export async function workAgentCommand(options) {
|
|
49
|
+
let agentConfig = null;
|
|
50
|
+
let graphId = null;
|
|
51
|
+
const stats = {
|
|
52
|
+
tasksCompleted: 0,
|
|
53
|
+
tasksFailed: 0,
|
|
54
|
+
tasksReleased: 0,
|
|
55
|
+
startedAt: new Date(),
|
|
56
|
+
lastTaskAt: null,
|
|
57
|
+
};
|
|
58
|
+
try {
|
|
59
|
+
// ============================================================
|
|
60
|
+
// PHASE 1: Agent Registration or Discovery
|
|
61
|
+
// ============================================================
|
|
62
|
+
const spinner = ora('Initializing worker agent...').start();
|
|
63
|
+
const projectRoot = await requireGinkoRoot();
|
|
64
|
+
const agentConfigPath = path.join(projectRoot, '.ginko', 'agent.json');
|
|
65
|
+
// Load graph config for task queries
|
|
66
|
+
const graphConfig = await loadGraphConfig();
|
|
67
|
+
if (!graphConfig?.graphId) {
|
|
68
|
+
spinner.warn(chalk.yellow('No graph configured - running in local-only mode'));
|
|
69
|
+
console.log(chalk.dim(' Run `ginko graph init` to enable cloud task assignment'));
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
graphId = graphConfig.graphId;
|
|
73
|
+
}
|
|
74
|
+
// Check if agent already registered
|
|
75
|
+
try {
|
|
76
|
+
const configData = await fs.readFile(agentConfigPath, 'utf-8');
|
|
77
|
+
const parsedConfig = JSON.parse(configData);
|
|
78
|
+
agentConfig = parsedConfig;
|
|
79
|
+
spinner.succeed(chalk.green(`Found existing agent: ${parsedConfig.name}`));
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
// No agent registered - register new one
|
|
83
|
+
if (error.code === 'ENOENT') {
|
|
84
|
+
if (!options.capabilities || !options.name) {
|
|
85
|
+
spinner.fail(chalk.red('No agent registered'));
|
|
86
|
+
console.error(chalk.red(' Either an existing agent must be registered, or --name and --capabilities must be provided.'));
|
|
87
|
+
console.log('');
|
|
88
|
+
console.log(chalk.dim('💡 Register an agent:'));
|
|
89
|
+
console.log(chalk.dim(' ginko agent register --name "Worker-1" --capabilities typescript,testing'));
|
|
90
|
+
console.log('');
|
|
91
|
+
console.log(chalk.dim('💡 Or provide inline:'));
|
|
92
|
+
console.log(chalk.dim(' ginko agent work --name "Worker-1" --capabilities typescript,testing'));
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
spinner.text = 'Registering new worker agent...';
|
|
96
|
+
// Parse capabilities
|
|
97
|
+
const capabilities = options.capabilities
|
|
98
|
+
.split(',')
|
|
99
|
+
.map(c => c.trim())
|
|
100
|
+
.filter(c => c.length > 0);
|
|
101
|
+
if (capabilities.length === 0) {
|
|
102
|
+
spinner.fail(chalk.red('Failed to register agent'));
|
|
103
|
+
console.error(chalk.red(' At least one capability is required'));
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
// Register agent
|
|
107
|
+
try {
|
|
108
|
+
const response = await AgentClient.register({
|
|
109
|
+
name: options.name,
|
|
110
|
+
capabilities,
|
|
111
|
+
status: 'active',
|
|
112
|
+
});
|
|
113
|
+
// Store config
|
|
114
|
+
agentConfig = {
|
|
115
|
+
agentId: response.agentId,
|
|
116
|
+
name: response.name,
|
|
117
|
+
capabilities: response.capabilities,
|
|
118
|
+
status: response.status,
|
|
119
|
+
organizationId: response.organizationId,
|
|
120
|
+
registeredAt: response.createdAt,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
catch (regError) {
|
|
124
|
+
spinner.warn(chalk.yellow(`Agent registration failed: ${regError.message}`));
|
|
125
|
+
console.log(chalk.dim(' Creating local-only agent config...'));
|
|
126
|
+
// Create local agent config for offline operation
|
|
127
|
+
agentConfig = {
|
|
128
|
+
agentId: `local-worker-${Date.now()}`,
|
|
129
|
+
name: options.name,
|
|
130
|
+
capabilities,
|
|
131
|
+
status: 'active',
|
|
132
|
+
organizationId: 'local',
|
|
133
|
+
registeredAt: new Date().toISOString(),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
await fs.mkdir(path.dirname(agentConfigPath), { recursive: true });
|
|
137
|
+
await fs.writeFile(agentConfigPath, JSON.stringify(agentConfig, null, 2), 'utf-8');
|
|
138
|
+
spinner.succeed(chalk.green(`Registered agent: ${agentConfig.name}`));
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
throw error;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (!agentConfig) {
|
|
145
|
+
throw new Error('Failed to initialize agent config');
|
|
146
|
+
}
|
|
147
|
+
// ============================================================
|
|
148
|
+
// PHASE 2: Project Context Loading via `ginko start`
|
|
149
|
+
// ============================================================
|
|
150
|
+
console.log('');
|
|
151
|
+
console.log(chalk.bold.cyan('🧠 Loading project context...'));
|
|
152
|
+
console.log('');
|
|
153
|
+
// Call ginko start to load full project context
|
|
154
|
+
// This loads:
|
|
155
|
+
// - Event stream (ADR-043)
|
|
156
|
+
// - Active patterns and gotchas
|
|
157
|
+
// - Architecture Decision Records (ADRs)
|
|
158
|
+
// - Sprint context and current tasks
|
|
159
|
+
// - Session logs and handoffs
|
|
160
|
+
await startCommand({ quiet: true });
|
|
161
|
+
console.log('');
|
|
162
|
+
console.log(chalk.green('✓ Project context loaded'));
|
|
163
|
+
// ============================================================
|
|
164
|
+
// PHASE 3: Start Heartbeat
|
|
165
|
+
// ============================================================
|
|
166
|
+
console.log('');
|
|
167
|
+
console.log(chalk.bold.cyan('💓 Starting heartbeat...'));
|
|
168
|
+
startHeartbeat(agentConfig.agentId);
|
|
169
|
+
console.log(chalk.green('✓ Heartbeat started (30s interval)'));
|
|
170
|
+
// ============================================================
|
|
171
|
+
// PHASE 4: Task Polling Loop
|
|
172
|
+
// ============================================================
|
|
173
|
+
console.log('');
|
|
174
|
+
console.log(chalk.bold.cyan('🔄 Entering task polling loop...'));
|
|
175
|
+
console.log(chalk.dim(` Agent: ${agentConfig.name} (${agentConfig.agentId})`));
|
|
176
|
+
console.log(chalk.dim(` Capabilities: ${agentConfig.capabilities.join(', ')}`));
|
|
177
|
+
console.log(chalk.dim(` Poll interval: ${options.pollInterval || 5}s`));
|
|
178
|
+
if (options.maxTasks && options.maxTasks > 0) {
|
|
179
|
+
console.log(chalk.dim(` Max tasks: ${options.maxTasks}`));
|
|
180
|
+
}
|
|
181
|
+
console.log('');
|
|
182
|
+
console.log(chalk.yellow('⏳ Waiting for task assignments... (Ctrl+C to stop)'));
|
|
183
|
+
// Setup graceful shutdown handlers
|
|
184
|
+
let isShuttingDown = false;
|
|
185
|
+
const gracefulShutdown = async (signal) => {
|
|
186
|
+
if (isShuttingDown)
|
|
187
|
+
return;
|
|
188
|
+
isShuttingDown = true;
|
|
189
|
+
console.log('');
|
|
190
|
+
console.log(chalk.yellow(`\n📡 Received ${signal}, shutting down gracefully...`));
|
|
191
|
+
// Log final stats
|
|
192
|
+
displayFinalStats(stats);
|
|
193
|
+
// Stop heartbeat and send final update
|
|
194
|
+
await shutdownHeartbeat();
|
|
195
|
+
console.log(chalk.green('✓ Worker agent stopped'));
|
|
196
|
+
process.exit(0);
|
|
197
|
+
};
|
|
198
|
+
process.on('SIGINT', () => gracefulShutdown('SIGINT'));
|
|
199
|
+
process.on('SIGTERM', () => gracefulShutdown('SIGTERM'));
|
|
200
|
+
// Start polling loop
|
|
201
|
+
await pollForTasks(agentConfig, graphId, stats, options.pollInterval || 5, options.maxTasks || 0);
|
|
202
|
+
// If we exit the loop normally (max tasks reached), show stats
|
|
203
|
+
displayFinalStats(stats);
|
|
204
|
+
await shutdownHeartbeat();
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
console.error(chalk.red('\n❌ Worker agent failed:'));
|
|
208
|
+
console.error(chalk.red(` ${error.message}`));
|
|
209
|
+
// Cleanup on error
|
|
210
|
+
if (agentConfig) {
|
|
211
|
+
try {
|
|
212
|
+
await shutdownHeartbeat();
|
|
213
|
+
}
|
|
214
|
+
catch (cleanupError) {
|
|
215
|
+
// Ignore cleanup errors
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
process.exit(1);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Poll for available task assignments
|
|
223
|
+
*
|
|
224
|
+
* This loop:
|
|
225
|
+
* 1. Queries for available tasks matching agent capabilities
|
|
226
|
+
* 2. Claims first available task atomically
|
|
227
|
+
* 3. Loads task-specific context (files, acceptance criteria)
|
|
228
|
+
* 4. Presents task to AI for execution
|
|
229
|
+
* 5. Reports completion/blocker via events
|
|
230
|
+
* 6. Returns to polling
|
|
231
|
+
*/
|
|
232
|
+
async function pollForTasks(agentConfig, graphId, stats, pollIntervalSeconds, maxTasks) {
|
|
233
|
+
let consecutiveErrors = 0;
|
|
234
|
+
const MAX_CONSECUTIVE_ERRORS = 5;
|
|
235
|
+
// Polling loop
|
|
236
|
+
while (true) {
|
|
237
|
+
// Check if we've hit max tasks limit
|
|
238
|
+
if (maxTasks > 0 && stats.tasksCompleted >= maxTasks) {
|
|
239
|
+
console.log('');
|
|
240
|
+
console.log(chalk.green(`✓ Max tasks reached (${maxTasks})`));
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
try {
|
|
244
|
+
// If no graph configured, can't poll for tasks
|
|
245
|
+
if (!graphId) {
|
|
246
|
+
await sleep(pollIntervalSeconds * 1000);
|
|
247
|
+
continue;
|
|
248
|
+
}
|
|
249
|
+
// Step 1: Query for available tasks
|
|
250
|
+
const availableResponse = await AgentClient.getAvailableTasks(graphId, agentConfig.capabilities, 5 // Get up to 5 tasks to choose from
|
|
251
|
+
);
|
|
252
|
+
if (availableResponse.tasks.length === 0) {
|
|
253
|
+
// No tasks available, keep polling
|
|
254
|
+
consecutiveErrors = 0;
|
|
255
|
+
await sleep(pollIntervalSeconds * 1000);
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
// Step 2: Try to claim tasks (in order of priority)
|
|
259
|
+
let claimedTask = null;
|
|
260
|
+
for (const task of availableResponse.tasks) {
|
|
261
|
+
try {
|
|
262
|
+
// Attempt atomic claim
|
|
263
|
+
const claimResponse = await AgentClient.claimTask(task.id, agentConfig.agentId);
|
|
264
|
+
console.log('');
|
|
265
|
+
console.log(chalk.green(`✓ Claimed task: ${chalk.bold(task.id)} - ${task.title}`));
|
|
266
|
+
console.log(chalk.dim(` Effort: ${task.effort} | Priority: ${task.priority}`));
|
|
267
|
+
// Build task assignment
|
|
268
|
+
claimedTask = {
|
|
269
|
+
taskId: task.id,
|
|
270
|
+
title: task.title,
|
|
271
|
+
description: task.description,
|
|
272
|
+
effort: task.effort,
|
|
273
|
+
priority: task.priority,
|
|
274
|
+
requiredCapabilities: task.requiredCapabilities,
|
|
275
|
+
acceptanceCriteria: [], // Will be loaded
|
|
276
|
+
};
|
|
277
|
+
// Log claim event
|
|
278
|
+
await logEvent({
|
|
279
|
+
category: 'achievement',
|
|
280
|
+
description: `Claimed task ${task.id}: ${task.title}`,
|
|
281
|
+
tags: ['worker-agent', 'task-claimed'],
|
|
282
|
+
impact: 'medium',
|
|
283
|
+
});
|
|
284
|
+
break; // Successfully claimed, stop trying others
|
|
285
|
+
}
|
|
286
|
+
catch (claimError) {
|
|
287
|
+
// 409 Conflict = task already claimed, try next
|
|
288
|
+
if (claimError.message.includes('409') || claimError.message.includes('already claimed')) {
|
|
289
|
+
console.log(chalk.dim(` ${task.id} already claimed, trying next...`));
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
// Other error, throw
|
|
293
|
+
throw claimError;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
if (!claimedTask) {
|
|
297
|
+
// All tasks were claimed by others, keep polling
|
|
298
|
+
await sleep(pollIntervalSeconds * 1000);
|
|
299
|
+
continue;
|
|
300
|
+
}
|
|
301
|
+
// Step 3: Load task-specific context
|
|
302
|
+
try {
|
|
303
|
+
console.log(chalk.dim(' Loading task context...'));
|
|
304
|
+
claimedTask.context = await loadTaskContext(claimedTask.taskId, graphId);
|
|
305
|
+
}
|
|
306
|
+
catch (contextError) {
|
|
307
|
+
console.log(chalk.yellow(` ⚠️ Failed to load task context: ${contextError.message}`));
|
|
308
|
+
// Continue anyway - context is optional enhancement
|
|
309
|
+
}
|
|
310
|
+
// Step 4: Present task for execution
|
|
311
|
+
await presentTaskForExecution(claimedTask, agentConfig, stats);
|
|
312
|
+
// Reset error counter on success
|
|
313
|
+
consecutiveErrors = 0;
|
|
314
|
+
}
|
|
315
|
+
catch (error) {
|
|
316
|
+
consecutiveErrors++;
|
|
317
|
+
console.error(chalk.red(`\n⚠️ Error during task polling: ${error.message}`));
|
|
318
|
+
if (consecutiveErrors >= MAX_CONSECUTIVE_ERRORS) {
|
|
319
|
+
console.error(chalk.red(`\n❌ Too many consecutive errors (${MAX_CONSECUTIVE_ERRORS}), exiting...`));
|
|
320
|
+
throw new Error('Too many polling errors');
|
|
321
|
+
}
|
|
322
|
+
console.log(chalk.dim(` Retrying in 30 seconds... (${consecutiveErrors}/${MAX_CONSECUTIVE_ERRORS})`));
|
|
323
|
+
await sleep(30000);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Load task-specific context for execution
|
|
329
|
+
*
|
|
330
|
+
* Loads:
|
|
331
|
+
* - Task-specific files (if specified in task metadata)
|
|
332
|
+
* - Related patterns and gotchas
|
|
333
|
+
* - Task constraints (ADRs, technical requirements)
|
|
334
|
+
*
|
|
335
|
+
* This is LAZY LOADING - only loads what's needed for the specific task,
|
|
336
|
+
* complementing the full project context loaded at startup.
|
|
337
|
+
*/
|
|
338
|
+
async function loadTaskContext(taskId, graphId) {
|
|
339
|
+
return await AgentClient.getTaskContext(taskId, graphId);
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Present task for AI execution
|
|
343
|
+
*
|
|
344
|
+
* In the worker agent model, the AI is the executor. This function:
|
|
345
|
+
* 1. Displays the task details and context
|
|
346
|
+
* 2. Outputs structured information for AI to act on
|
|
347
|
+
* 3. Waits for completion signal (via event or manual input)
|
|
348
|
+
*
|
|
349
|
+
* For autonomous operation, the AI reads this output and executes the task.
|
|
350
|
+
* For supervised operation, a human reviews and guides the AI.
|
|
351
|
+
*/
|
|
352
|
+
async function presentTaskForExecution(task, agentConfig, stats) {
|
|
353
|
+
console.log('');
|
|
354
|
+
console.log(chalk.bold.cyan('═'.repeat(60)));
|
|
355
|
+
console.log(chalk.bold.cyan(`📋 TASK: ${task.taskId}`));
|
|
356
|
+
console.log(chalk.bold.cyan('═'.repeat(60)));
|
|
357
|
+
console.log('');
|
|
358
|
+
console.log(chalk.bold('Title:'), task.title);
|
|
359
|
+
console.log(chalk.bold('Description:'), task.description || '(none)');
|
|
360
|
+
console.log(chalk.bold('Effort:'), task.effort);
|
|
361
|
+
console.log(chalk.bold('Priority:'), task.priority);
|
|
362
|
+
if (task.requiredCapabilities.length > 0) {
|
|
363
|
+
console.log(chalk.bold('Required Capabilities:'), task.requiredCapabilities.join(', '));
|
|
364
|
+
}
|
|
365
|
+
// Display context if available
|
|
366
|
+
if (task.context) {
|
|
367
|
+
if (task.context.files.length > 0) {
|
|
368
|
+
console.log('');
|
|
369
|
+
console.log(chalk.bold('Files to Work On:'));
|
|
370
|
+
for (const file of task.context.files) {
|
|
371
|
+
console.log(chalk.dim(` • ${file}`));
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
if (task.context.patterns.length > 0) {
|
|
375
|
+
console.log('');
|
|
376
|
+
console.log(chalk.bold('Applicable Patterns:'));
|
|
377
|
+
for (const pattern of task.context.patterns) {
|
|
378
|
+
const confidenceIcon = pattern.confidence === 'high' ? '★' : pattern.confidence === 'medium' ? '◐' : '○';
|
|
379
|
+
console.log(chalk.dim(` ${confidenceIcon} ${pattern.name}`));
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
if (task.context.gotchas.length > 0) {
|
|
383
|
+
console.log('');
|
|
384
|
+
console.log(chalk.bold('Watch Out For:'));
|
|
385
|
+
for (const gotcha of task.context.gotchas) {
|
|
386
|
+
const severityIcon = gotcha.severity === 'critical' ? '🚨' : gotcha.severity === 'high' ? '⚠️' : '💡';
|
|
387
|
+
console.log(chalk.yellow(` ${severityIcon} ${gotcha.description}`));
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
if (task.context.constraints.length > 0) {
|
|
391
|
+
console.log('');
|
|
392
|
+
console.log(chalk.bold('Constraints:'));
|
|
393
|
+
for (const constraint of task.context.constraints) {
|
|
394
|
+
console.log(chalk.dim(` • [${constraint.type}] ${constraint.description}`));
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
console.log('');
|
|
399
|
+
console.log(chalk.bold.cyan('─'.repeat(60)));
|
|
400
|
+
console.log(chalk.bold('Instructions:'));
|
|
401
|
+
console.log(chalk.dim(' 1. Execute the task described above'));
|
|
402
|
+
console.log(chalk.dim(' 2. Log progress with: ginko log "description" --category=achievement'));
|
|
403
|
+
console.log(chalk.dim(' 3. If blocked: ginko log "description" --category=blocker --blocked-by="reason"'));
|
|
404
|
+
console.log(chalk.dim(' 4. When complete: ginko log "Completed TASK-ID" --category=achievement --impact=high'));
|
|
405
|
+
console.log(chalk.bold.cyan('─'.repeat(60)));
|
|
406
|
+
console.log('');
|
|
407
|
+
// Log that task is being worked on
|
|
408
|
+
await logEvent({
|
|
409
|
+
category: 'achievement',
|
|
410
|
+
description: `Started working on ${task.taskId}: ${task.title}`,
|
|
411
|
+
tags: ['worker-agent', 'task-started', task.taskId],
|
|
412
|
+
impact: 'medium',
|
|
413
|
+
});
|
|
414
|
+
// In autonomous mode, we would now execute via Claude SDK
|
|
415
|
+
// For now, we simulate task completion after a brief pause
|
|
416
|
+
// The AI reading this output should take over and do the actual work
|
|
417
|
+
console.log(chalk.yellow('⏳ Awaiting task execution...'));
|
|
418
|
+
console.log(chalk.dim(' (This is where the AI would execute the task)'));
|
|
419
|
+
console.log('');
|
|
420
|
+
// For demo purposes, wait briefly then mark as "presented"
|
|
421
|
+
// In real usage, this would integrate with Claude SDK for autonomous execution
|
|
422
|
+
await sleep(2000);
|
|
423
|
+
// Update stats
|
|
424
|
+
stats.lastTaskAt = new Date();
|
|
425
|
+
// For now, we return after presenting - the AI takes over
|
|
426
|
+
// Task completion would come via event or manual completion
|
|
427
|
+
// In a fully autonomous system, we'd have an execution loop here
|
|
428
|
+
console.log(chalk.green(`✓ Task ${task.taskId} presented for execution`));
|
|
429
|
+
console.log('');
|
|
430
|
+
// Note: In real implementation, we would:
|
|
431
|
+
// 1. Wait for completion event from the AI
|
|
432
|
+
// 2. Or timeout and release the task
|
|
433
|
+
// 3. For now, we just continue polling
|
|
434
|
+
// Increment completed (for demo - in real use this would be after actual completion)
|
|
435
|
+
stats.tasksCompleted++;
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Display final statistics
|
|
439
|
+
*/
|
|
440
|
+
function displayFinalStats(stats) {
|
|
441
|
+
const duration = Date.now() - stats.startedAt.getTime();
|
|
442
|
+
const minutes = Math.floor(duration / 60000);
|
|
443
|
+
const seconds = Math.floor((duration % 60000) / 1000);
|
|
444
|
+
console.log('');
|
|
445
|
+
console.log(chalk.bold('📊 Worker Stats'));
|
|
446
|
+
console.log(chalk.dim('─'.repeat(40)));
|
|
447
|
+
console.log(` Duration: ${minutes}m ${seconds}s`);
|
|
448
|
+
console.log(` Tasks completed: ${chalk.green(stats.tasksCompleted.toString())}`);
|
|
449
|
+
console.log(` Tasks failed: ${chalk.red(stats.tasksFailed.toString())}`);
|
|
450
|
+
console.log(` Tasks released: ${chalk.yellow(stats.tasksReleased.toString())}`);
|
|
451
|
+
console.log(chalk.dim('─'.repeat(40)));
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Helper: Sleep for ms milliseconds
|
|
455
|
+
*/
|
|
456
|
+
function sleep(ms) {
|
|
457
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
458
|
+
}
|
|
459
|
+
//# sourceMappingURL=work.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"work.js","sourceRoot":"","sources":["../../../src/commands/agent/work.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: command
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2025-12-07
|
|
5
|
+
* @tags: [checkpoint, create, cli, epic-004-sprint5, task-1]
|
|
6
|
+
* @related: [checkpoint.ts, list.ts, show.ts]
|
|
7
|
+
* @priority: high
|
|
8
|
+
* @complexity: medium
|
|
9
|
+
* @dependencies: [chalk, ora, checkpoint]
|
|
10
|
+
*/
|
|
11
|
+
interface CreateCheckpointOptions {
|
|
12
|
+
task: string;
|
|
13
|
+
message?: string;
|
|
14
|
+
agent?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Create a checkpoint for current work state
|
|
18
|
+
*
|
|
19
|
+
* Captures:
|
|
20
|
+
* - Current git commit hash
|
|
21
|
+
* - Modified files since task start
|
|
22
|
+
* - Last event ID from event stream
|
|
23
|
+
* - Optional message and metadata
|
|
24
|
+
*/
|
|
25
|
+
export declare function createCheckpointCommand(options: CreateCheckpointOptions): Promise<void>;
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=create.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/checkpoint/create.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,UAAU,uBAAuB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;GAQG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwE7F"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: command
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2025-12-07
|
|
5
|
+
* @tags: [checkpoint, create, cli, epic-004-sprint5, task-1]
|
|
6
|
+
* @related: [checkpoint.ts, list.ts, show.ts]
|
|
7
|
+
* @priority: high
|
|
8
|
+
* @complexity: medium
|
|
9
|
+
* @dependencies: [chalk, ora, checkpoint]
|
|
10
|
+
*/
|
|
11
|
+
import chalk from 'chalk';
|
|
12
|
+
import ora from 'ora';
|
|
13
|
+
import { createCheckpoint } from '../../lib/checkpoint.js';
|
|
14
|
+
/**
|
|
15
|
+
* Create a checkpoint for current work state
|
|
16
|
+
*
|
|
17
|
+
* Captures:
|
|
18
|
+
* - Current git commit hash
|
|
19
|
+
* - Modified files since task start
|
|
20
|
+
* - Last event ID from event stream
|
|
21
|
+
* - Optional message and metadata
|
|
22
|
+
*/
|
|
23
|
+
export async function createCheckpointCommand(options) {
|
|
24
|
+
const spinner = ora('Creating checkpoint...').start();
|
|
25
|
+
try {
|
|
26
|
+
// Validate task ID format
|
|
27
|
+
if (!options.task) {
|
|
28
|
+
spinner.fail(chalk.red('Task ID is required'));
|
|
29
|
+
console.log(chalk.dim('Usage: ginko checkpoint create --task TASK-1'));
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
// Create checkpoint
|
|
33
|
+
const checkpoint = await createCheckpoint(options.task, options.agent, options.message);
|
|
34
|
+
spinner.succeed(chalk.green('Checkpoint created successfully'));
|
|
35
|
+
// Display checkpoint details
|
|
36
|
+
console.log(chalk.gray('\n' + '─'.repeat(50)));
|
|
37
|
+
console.log(chalk.bold('Checkpoint Details:'));
|
|
38
|
+
console.log(` ${chalk.dim('ID:')} ${chalk.cyan(checkpoint.id)}`);
|
|
39
|
+
console.log(` ${chalk.dim('Task:')} ${chalk.cyan(checkpoint.taskId)}`);
|
|
40
|
+
console.log(` ${chalk.dim('Agent:')} ${chalk.dim(checkpoint.agentId)}`);
|
|
41
|
+
console.log(` ${chalk.dim('Timestamp:')} ${chalk.dim(checkpoint.timestamp.toLocaleString())}`);
|
|
42
|
+
if (checkpoint.message) {
|
|
43
|
+
console.log(` ${chalk.dim('Message:')} ${checkpoint.message}`);
|
|
44
|
+
}
|
|
45
|
+
console.log(chalk.gray('\n' + '─'.repeat(50)));
|
|
46
|
+
console.log(chalk.bold('Captured State:'));
|
|
47
|
+
console.log(` ${chalk.dim('Git commit:')} ${chalk.cyan(checkpoint.gitCommit.substring(0, 7))} ${chalk.dim(`(full: ${checkpoint.gitCommit})`)}`);
|
|
48
|
+
console.log(` ${chalk.dim('Modified files:')} ${chalk.yellow(checkpoint.filesModified.length)} files`);
|
|
49
|
+
if (checkpoint.filesModified.length > 0 && checkpoint.filesModified.length <= 5) {
|
|
50
|
+
checkpoint.filesModified.forEach(file => {
|
|
51
|
+
console.log(` ${chalk.dim('•')} ${file}`);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
else if (checkpoint.filesModified.length > 5) {
|
|
55
|
+
checkpoint.filesModified.slice(0, 5).forEach(file => {
|
|
56
|
+
console.log(` ${chalk.dim('•')} ${file}`);
|
|
57
|
+
});
|
|
58
|
+
console.log(` ${chalk.dim(`... and ${checkpoint.filesModified.length - 5} more files`)}`);
|
|
59
|
+
}
|
|
60
|
+
console.log(` ${chalk.dim('Event stream position:')} ${chalk.dim(checkpoint.eventsSince)}`);
|
|
61
|
+
console.log(chalk.gray('\n' + '─'.repeat(50)));
|
|
62
|
+
console.log(chalk.dim('Next steps:'));
|
|
63
|
+
console.log(chalk.dim(` • View checkpoint: ${chalk.cyan(`ginko checkpoint show ${checkpoint.id}`)}`));
|
|
64
|
+
console.log(chalk.dim(` • List checkpoints: ${chalk.cyan(`ginko checkpoint list --task ${checkpoint.taskId}`)}`));
|
|
65
|
+
console.log(chalk.dim(` • Rollback (future): ${chalk.cyan(`ginko rollback ${checkpoint.id}`)}`));
|
|
66
|
+
console.log();
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
spinner.fail(chalk.red('Failed to create checkpoint'));
|
|
70
|
+
if (error instanceof Error) {
|
|
71
|
+
console.error(chalk.red(`\n✗ Error: ${error.message}`));
|
|
72
|
+
if (error.message.includes('git')) {
|
|
73
|
+
console.log(chalk.dim('\nMake sure you are in a git repository'));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
console.error(chalk.red('\n✗ An unexpected error occurred'));
|
|
78
|
+
}
|
|
79
|
+
process.exit(1);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/checkpoint/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: command
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2025-12-07
|
|
5
|
+
* @tags: [checkpoint, cli, epic-004-sprint5, task-1, resilience]
|
|
6
|
+
* @related: [create.ts, list.ts, show.ts, checkpoint.ts]
|
|
7
|
+
* @priority: high
|
|
8
|
+
* @complexity: medium
|
|
9
|
+
* @dependencies: [commander, chalk]
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Checkpoint Commands (EPIC-004 Sprint 5 TASK-1)
|
|
13
|
+
*
|
|
14
|
+
* CLI commands for creating, listing, and inspecting checkpoints
|
|
15
|
+
* Checkpoints enable rollback and recovery for multi-agent task execution
|
|
16
|
+
*/
|
|
17
|
+
import { Command } from 'commander';
|
|
18
|
+
/**
|
|
19
|
+
* Main checkpoint command with subcommands
|
|
20
|
+
*/
|
|
21
|
+
export declare function checkpointCommand(): Command;
|
|
22
|
+
export default checkpointCommand;
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/checkpoint/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC;;GAEG;AACH,wBAAgB,iBAAiB,YAsEhC;AAGD,eAAe,iBAAiB,CAAC"}
|