@ginkoai/cli 1.6.1 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. package/README.md +34 -0
  2. package/dist/commands/agent/agent-client.d.ts +150 -0
  3. package/dist/commands/agent/agent-client.d.ts.map +1 -0
  4. package/dist/commands/agent/agent-client.js +170 -0
  5. package/dist/commands/agent/agent-client.js.map +1 -0
  6. package/dist/commands/agent/index.d.ts +22 -0
  7. package/dist/commands/agent/index.d.ts.map +1 -0
  8. package/dist/commands/agent/index.js +121 -0
  9. package/dist/commands/agent/index.js.map +1 -0
  10. package/dist/commands/agent/list.d.ts +22 -0
  11. package/dist/commands/agent/list.d.ts.map +1 -0
  12. package/dist/commands/agent/list.js +119 -0
  13. package/dist/commands/agent/list.js.map +1 -0
  14. package/dist/commands/agent/register.d.ts +21 -0
  15. package/dist/commands/agent/register.d.ts.map +1 -0
  16. package/dist/commands/agent/register.js +97 -0
  17. package/dist/commands/agent/register.js.map +1 -0
  18. package/dist/commands/agent/status.d.ts +19 -0
  19. package/dist/commands/agent/status.d.ts.map +1 -0
  20. package/dist/commands/agent/status.js +271 -0
  21. package/dist/commands/agent/status.js.map +1 -0
  22. package/dist/commands/agent/work.d.ts +22 -0
  23. package/dist/commands/agent/work.d.ts.map +1 -0
  24. package/dist/commands/agent/work.js +459 -0
  25. package/dist/commands/agent/work.js.map +1 -0
  26. package/dist/commands/checkpoint/create.d.ts +27 -0
  27. package/dist/commands/checkpoint/create.d.ts.map +1 -0
  28. package/dist/commands/checkpoint/create.js +82 -0
  29. package/dist/commands/checkpoint/create.js.map +1 -0
  30. package/dist/commands/checkpoint/index.d.ts +23 -0
  31. package/dist/commands/checkpoint/index.d.ts.map +1 -0
  32. package/dist/commands/checkpoint/index.js +91 -0
  33. package/dist/commands/checkpoint/index.js.map +1 -0
  34. package/dist/commands/checkpoint/list.d.ts +27 -0
  35. package/dist/commands/checkpoint/list.d.ts.map +1 -0
  36. package/dist/commands/checkpoint/list.js +115 -0
  37. package/dist/commands/checkpoint/list.js.map +1 -0
  38. package/dist/commands/checkpoint/show.d.ts +23 -0
  39. package/dist/commands/checkpoint/show.d.ts.map +1 -0
  40. package/dist/commands/checkpoint/show.js +102 -0
  41. package/dist/commands/checkpoint/show.js.map +1 -0
  42. package/dist/commands/dlq.d.ts +24 -0
  43. package/dist/commands/dlq.d.ts.map +1 -0
  44. package/dist/commands/dlq.js +172 -0
  45. package/dist/commands/dlq.js.map +1 -0
  46. package/dist/commands/epic.d.ts +29 -0
  47. package/dist/commands/epic.d.ts.map +1 -0
  48. package/dist/commands/epic.js +322 -0
  49. package/dist/commands/epic.js.map +1 -0
  50. package/dist/commands/escalation/create.d.ts +22 -0
  51. package/dist/commands/escalation/create.d.ts.map +1 -0
  52. package/dist/commands/escalation/create.js +122 -0
  53. package/dist/commands/escalation/create.js.map +1 -0
  54. package/dist/commands/escalation/escalation-client.d.ts +101 -0
  55. package/dist/commands/escalation/escalation-client.d.ts.map +1 -0
  56. package/dist/commands/escalation/escalation-client.js +129 -0
  57. package/dist/commands/escalation/escalation-client.js.map +1 -0
  58. package/dist/commands/escalation/index.d.ts +22 -0
  59. package/dist/commands/escalation/index.d.ts.map +1 -0
  60. package/dist/commands/escalation/index.js +94 -0
  61. package/dist/commands/escalation/index.js.map +1 -0
  62. package/dist/commands/escalation/list.d.ts +24 -0
  63. package/dist/commands/escalation/list.d.ts.map +1 -0
  64. package/dist/commands/escalation/list.js +170 -0
  65. package/dist/commands/escalation/list.js.map +1 -0
  66. package/dist/commands/escalation/resolve.d.ts +20 -0
  67. package/dist/commands/escalation/resolve.d.ts.map +1 -0
  68. package/dist/commands/escalation/resolve.js +102 -0
  69. package/dist/commands/escalation/resolve.js.map +1 -0
  70. package/dist/commands/graph/api-client.d.ts +222 -1
  71. package/dist/commands/graph/api-client.d.ts.map +1 -1
  72. package/dist/commands/graph/api-client.js +82 -0
  73. package/dist/commands/graph/api-client.js.map +1 -1
  74. package/dist/commands/handoff.d.ts.map +1 -1
  75. package/dist/commands/handoff.js +9 -1
  76. package/dist/commands/handoff.js.map +1 -1
  77. package/dist/commands/log.d.ts +3 -0
  78. package/dist/commands/log.d.ts.map +1 -1
  79. package/dist/commands/log.js +110 -16
  80. package/dist/commands/log.js.map +1 -1
  81. package/dist/commands/notifications/history.d.ts +21 -0
  82. package/dist/commands/notifications/history.d.ts.map +1 -0
  83. package/dist/commands/notifications/history.js +160 -0
  84. package/dist/commands/notifications/history.js.map +1 -0
  85. package/dist/commands/notifications/index.d.ts +22 -0
  86. package/dist/commands/notifications/index.d.ts.map +1 -0
  87. package/dist/commands/notifications/index.js +87 -0
  88. package/dist/commands/notifications/index.js.map +1 -0
  89. package/dist/commands/notifications/list.d.ts +19 -0
  90. package/dist/commands/notifications/list.d.ts.map +1 -0
  91. package/dist/commands/notifications/list.js +132 -0
  92. package/dist/commands/notifications/list.js.map +1 -0
  93. package/dist/commands/notifications/test.d.ts +19 -0
  94. package/dist/commands/notifications/test.d.ts.map +1 -0
  95. package/dist/commands/notifications/test.js +217 -0
  96. package/dist/commands/notifications/test.js.map +1 -0
  97. package/dist/commands/orchestrate.d.ts +25 -0
  98. package/dist/commands/orchestrate.d.ts.map +1 -0
  99. package/dist/commands/orchestrate.js +858 -0
  100. package/dist/commands/orchestrate.js.map +1 -0
  101. package/dist/commands/sprint/deps.d.ts +29 -0
  102. package/dist/commands/sprint/deps.d.ts.map +1 -0
  103. package/dist/commands/sprint/deps.js +269 -0
  104. package/dist/commands/sprint/deps.js.map +1 -0
  105. package/dist/commands/sprint/index.d.ts +10 -5
  106. package/dist/commands/sprint/index.d.ts.map +1 -1
  107. package/dist/commands/sprint/index.js +26 -5
  108. package/dist/commands/sprint/index.js.map +1 -1
  109. package/dist/commands/start/index.d.ts.map +1 -1
  110. package/dist/commands/start/index.js +6 -0
  111. package/dist/commands/start/index.js.map +1 -1
  112. package/dist/commands/start/start-reflection.d.ts +11 -0
  113. package/dist/commands/start/start-reflection.d.ts.map +1 -1
  114. package/dist/commands/start/start-reflection.js +150 -12
  115. package/dist/commands/start/start-reflection.js.map +1 -1
  116. package/dist/commands/verify.d.ts +17 -0
  117. package/dist/commands/verify.d.ts.map +1 -0
  118. package/dist/commands/verify.js +232 -0
  119. package/dist/commands/verify.js.map +1 -0
  120. package/dist/core/session-log-manager.d.ts +1 -1
  121. package/dist/core/session-log-manager.d.ts.map +1 -1
  122. package/dist/core/session-log-manager.js +12 -3
  123. package/dist/core/session-log-manager.js.map +1 -1
  124. package/dist/index.js +98 -1
  125. package/dist/index.js.map +1 -1
  126. package/dist/lib/__tests__/task-timeout.test.d.ts +12 -0
  127. package/dist/lib/__tests__/task-timeout.test.d.ts.map +1 -0
  128. package/dist/lib/__tests__/task-timeout.test.js +278 -0
  129. package/dist/lib/__tests__/task-timeout.test.js.map +1 -0
  130. package/dist/lib/agent-heartbeat.d.ts +68 -0
  131. package/dist/lib/agent-heartbeat.d.ts.map +1 -0
  132. package/dist/lib/agent-heartbeat.js +117 -0
  133. package/dist/lib/agent-heartbeat.js.map +1 -0
  134. package/dist/lib/checkpoint.d.ts +85 -0
  135. package/dist/lib/checkpoint.d.ts.map +1 -0
  136. package/dist/lib/checkpoint.js +323 -0
  137. package/dist/lib/checkpoint.js.map +1 -0
  138. package/dist/lib/context-metrics.d.ts +230 -0
  139. package/dist/lib/context-metrics.d.ts.map +1 -0
  140. package/dist/lib/context-metrics.js +372 -0
  141. package/dist/lib/context-metrics.js.map +1 -0
  142. package/dist/lib/dead-letter-queue.d.ts +108 -0
  143. package/dist/lib/dead-letter-queue.d.ts.map +1 -0
  144. package/dist/lib/dead-letter-queue.js +378 -0
  145. package/dist/lib/dead-letter-queue.js.map +1 -0
  146. package/dist/lib/event-logger.d.ts +9 -1
  147. package/dist/lib/event-logger.d.ts.map +1 -1
  148. package/dist/lib/event-logger.js +45 -3
  149. package/dist/lib/event-logger.js.map +1 -1
  150. package/dist/lib/event-queue.d.ts.map +1 -1
  151. package/dist/lib/event-queue.js +13 -2
  152. package/dist/lib/event-queue.js.map +1 -1
  153. package/dist/lib/examples/timeout-demo.d.ts +13 -0
  154. package/dist/lib/examples/timeout-demo.d.ts.map +1 -0
  155. package/dist/lib/examples/timeout-demo.js +102 -0
  156. package/dist/lib/examples/timeout-demo.js.map +1 -0
  157. package/dist/lib/examples/timeout-integration-example.d.ts +17 -0
  158. package/dist/lib/examples/timeout-integration-example.d.ts.map +1 -0
  159. package/dist/lib/examples/timeout-integration-example.js +223 -0
  160. package/dist/lib/examples/timeout-integration-example.js.map +1 -0
  161. package/dist/lib/notification-hooks.d.ts +103 -0
  162. package/dist/lib/notification-hooks.d.ts.map +1 -0
  163. package/dist/lib/notification-hooks.js +223 -0
  164. package/dist/lib/notification-hooks.js.map +1 -0
  165. package/dist/lib/notifications/discord.d.ts +20 -0
  166. package/dist/lib/notifications/discord.d.ts.map +1 -0
  167. package/dist/lib/notifications/discord.js +140 -0
  168. package/dist/lib/notifications/discord.js.map +1 -0
  169. package/dist/lib/notifications/index.d.ts +66 -0
  170. package/dist/lib/notifications/index.d.ts.map +1 -0
  171. package/dist/lib/notifications/index.js +120 -0
  172. package/dist/lib/notifications/index.js.map +1 -0
  173. package/dist/lib/notifications/slack.d.ts +20 -0
  174. package/dist/lib/notifications/slack.d.ts.map +1 -0
  175. package/dist/lib/notifications/slack.js +186 -0
  176. package/dist/lib/notifications/slack.js.map +1 -0
  177. package/dist/lib/notifications/teams.d.ts +20 -0
  178. package/dist/lib/notifications/teams.d.ts.map +1 -0
  179. package/dist/lib/notifications/teams.js +146 -0
  180. package/dist/lib/notifications/teams.js.map +1 -0
  181. package/dist/lib/notifications/webhook.d.ts +23 -0
  182. package/dist/lib/notifications/webhook.d.ts.map +1 -0
  183. package/dist/lib/notifications/webhook.js +65 -0
  184. package/dist/lib/notifications/webhook.js.map +1 -0
  185. package/dist/lib/orchestrator-state.d.ts +194 -0
  186. package/dist/lib/orchestrator-state.d.ts.map +1 -0
  187. package/dist/lib/orchestrator-state.js +332 -0
  188. package/dist/lib/orchestrator-state.js.map +1 -0
  189. package/dist/lib/output-formatter.d.ts +25 -1
  190. package/dist/lib/output-formatter.d.ts.map +1 -1
  191. package/dist/lib/output-formatter.js +37 -17
  192. package/dist/lib/output-formatter.js.map +1 -1
  193. package/dist/lib/realtime-cursor.d.ts +107 -0
  194. package/dist/lib/realtime-cursor.d.ts.map +1 -0
  195. package/dist/lib/realtime-cursor.js +260 -0
  196. package/dist/lib/realtime-cursor.js.map +1 -0
  197. package/dist/lib/rollback.d.ts +86 -0
  198. package/dist/lib/rollback.d.ts.map +1 -0
  199. package/dist/lib/rollback.js +405 -0
  200. package/dist/lib/rollback.js.map +1 -0
  201. package/dist/lib/sprint-loader.d.ts +41 -2
  202. package/dist/lib/sprint-loader.d.ts.map +1 -1
  203. package/dist/lib/sprint-loader.js +335 -9
  204. package/dist/lib/sprint-loader.js.map +1 -1
  205. package/dist/lib/stale-agent-detector.d.ts +102 -0
  206. package/dist/lib/stale-agent-detector.d.ts.map +1 -0
  207. package/dist/lib/stale-agent-detector.js +156 -0
  208. package/dist/lib/stale-agent-detector.js.map +1 -0
  209. package/dist/lib/task-dependencies.d.ts +143 -0
  210. package/dist/lib/task-dependencies.d.ts.map +1 -0
  211. package/dist/lib/task-dependencies.js +357 -0
  212. package/dist/lib/task-dependencies.js.map +1 -0
  213. package/dist/lib/task-timeout.d.ts +153 -0
  214. package/dist/lib/task-timeout.d.ts.map +1 -0
  215. package/dist/lib/task-timeout.js +505 -0
  216. package/dist/lib/task-timeout.js.map +1 -0
  217. package/dist/lib/verification/build-check.d.ts +55 -0
  218. package/dist/lib/verification/build-check.d.ts.map +1 -0
  219. package/dist/lib/verification/build-check.js +111 -0
  220. package/dist/lib/verification/build-check.js.map +1 -0
  221. package/dist/lib/verification/index.d.ts +19 -0
  222. package/dist/lib/verification/index.d.ts.map +1 -0
  223. package/dist/lib/verification/index.js +17 -0
  224. package/dist/lib/verification/index.js.map +1 -0
  225. package/dist/lib/verification/lint-check.d.ts +34 -0
  226. package/dist/lib/verification/lint-check.d.ts.map +1 -0
  227. package/dist/lib/verification/lint-check.js +215 -0
  228. package/dist/lib/verification/lint-check.js.map +1 -0
  229. package/dist/lib/verification/test-runner.d.ts +50 -0
  230. package/dist/lib/verification/test-runner.d.ts.map +1 -0
  231. package/dist/lib/verification/test-runner.js +225 -0
  232. package/dist/lib/verification/test-runner.js.map +1 -0
  233. package/dist/templates/ai-instructions-template.d.ts +3 -2
  234. package/dist/templates/ai-instructions-template.d.ts.map +1 -1
  235. package/dist/templates/ai-instructions-template.js +104 -2
  236. package/dist/templates/ai-instructions-template.js.map +1 -1
  237. package/dist/templates/epic-template.md +319 -0
  238. package/dist/utils/command-helpers.d.ts +10 -0
  239. package/dist/utils/command-helpers.d.ts.map +1 -1
  240. package/dist/utils/command-helpers.js +59 -1
  241. package/dist/utils/command-helpers.js.map +1 -1
  242. package/dist/utils/pattern-confidence.d.ts +82 -0
  243. package/dist/utils/pattern-confidence.d.ts.map +1 -0
  244. package/dist/utils/pattern-confidence.js +172 -0
  245. package/dist/utils/pattern-confidence.js.map +1 -0
  246. 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"}