@ginkoai/cli 2.0.6 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/dist/commands/epic/index.d.ts +29 -0
  2. package/dist/commands/epic/index.d.ts.map +1 -0
  3. package/dist/commands/epic/index.js +94 -0
  4. package/dist/commands/epic/index.js.map +1 -0
  5. package/dist/commands/epic/status.d.ts +40 -0
  6. package/dist/commands/epic/status.d.ts.map +1 -0
  7. package/dist/commands/epic/status.js +244 -0
  8. package/dist/commands/epic/status.js.map +1 -0
  9. package/dist/commands/graph/api-client.d.ts +221 -1
  10. package/dist/commands/graph/api-client.d.ts.map +1 -1
  11. package/dist/commands/graph/api-client.js +141 -2
  12. package/dist/commands/graph/api-client.js.map +1 -1
  13. package/dist/commands/graph/load.d.ts.map +1 -1
  14. package/dist/commands/graph/load.js +40 -2
  15. package/dist/commands/graph/load.js.map +1 -1
  16. package/dist/commands/handoff.d.ts +3 -3
  17. package/dist/commands/handoff.d.ts.map +1 -1
  18. package/dist/commands/handoff.js +32 -3
  19. package/dist/commands/handoff.js.map +1 -1
  20. package/dist/commands/migrate/index.d.ts +27 -0
  21. package/dist/commands/migrate/index.d.ts.map +1 -0
  22. package/dist/commands/migrate/index.js +76 -0
  23. package/dist/commands/migrate/index.js.map +1 -0
  24. package/dist/commands/migrate/status-migration.d.ts +58 -0
  25. package/dist/commands/migrate/status-migration.d.ts.map +1 -0
  26. package/dist/commands/migrate/status-migration.js +323 -0
  27. package/dist/commands/migrate/status-migration.js.map +1 -0
  28. package/dist/commands/nudging/index.d.ts +24 -0
  29. package/dist/commands/nudging/index.d.ts.map +1 -0
  30. package/dist/commands/nudging/index.js +175 -0
  31. package/dist/commands/nudging/index.js.map +1 -0
  32. package/dist/commands/sprint/create.d.ts +26 -0
  33. package/dist/commands/sprint/create.d.ts.map +1 -0
  34. package/dist/commands/sprint/create.js +269 -0
  35. package/dist/commands/sprint/create.js.map +1 -0
  36. package/dist/commands/sprint/index.d.ts.map +1 -1
  37. package/dist/commands/sprint/index.js +28 -0
  38. package/dist/commands/sprint/index.js.map +1 -1
  39. package/dist/commands/sprint/quick-fix.d.ts +25 -0
  40. package/dist/commands/sprint/quick-fix.d.ts.map +1 -0
  41. package/dist/commands/sprint/quick-fix.js +151 -0
  42. package/dist/commands/sprint/quick-fix.js.map +1 -0
  43. package/dist/commands/sprint/sprint-pipeline-enhanced.d.ts.map +1 -1
  44. package/dist/commands/sprint/sprint-pipeline-enhanced.js +37 -0
  45. package/dist/commands/sprint/sprint-pipeline-enhanced.js.map +1 -1
  46. package/dist/commands/sprint/status.d.ts +42 -0
  47. package/dist/commands/sprint/status.d.ts.map +1 -0
  48. package/dist/commands/sprint/status.js +298 -0
  49. package/dist/commands/sprint/status.js.map +1 -0
  50. package/dist/commands/start/start-reflection.d.ts +53 -0
  51. package/dist/commands/start/start-reflection.d.ts.map +1 -1
  52. package/dist/commands/start/start-reflection.js +464 -71
  53. package/dist/commands/start/start-reflection.js.map +1 -1
  54. package/dist/commands/sync/sprint-syncer.d.ts +19 -12
  55. package/dist/commands/sync/sprint-syncer.d.ts.map +1 -1
  56. package/dist/commands/sync/sprint-syncer.js +58 -140
  57. package/dist/commands/sync/sprint-syncer.js.map +1 -1
  58. package/dist/commands/sync/sync-command.d.ts.map +1 -1
  59. package/dist/commands/sync/sync-command.js +6 -18
  60. package/dist/commands/sync/sync-command.js.map +1 -1
  61. package/dist/commands/task/index.d.ts +25 -0
  62. package/dist/commands/task/index.d.ts.map +1 -0
  63. package/dist/commands/task/index.js +100 -0
  64. package/dist/commands/task/index.js.map +1 -0
  65. package/dist/commands/task/status.d.ts +46 -0
  66. package/dist/commands/task/status.d.ts.map +1 -0
  67. package/dist/commands/task/status.js +348 -0
  68. package/dist/commands/task/status.js.map +1 -0
  69. package/dist/commands/team/index.d.ts +5 -0
  70. package/dist/commands/team/index.d.ts.map +1 -1
  71. package/dist/commands/team/index.js +28 -0
  72. package/dist/commands/team/index.js.map +1 -1
  73. package/dist/commands/team/status.d.ts +16 -0
  74. package/dist/commands/team/status.d.ts.map +1 -0
  75. package/dist/commands/team/status.js +180 -0
  76. package/dist/commands/team/status.js.map +1 -0
  77. package/dist/index.js +21 -32
  78. package/dist/index.js.map +1 -1
  79. package/dist/lib/adoption-score.d.ts +69 -0
  80. package/dist/lib/adoption-score.d.ts.map +1 -0
  81. package/dist/lib/adoption-score.js +206 -0
  82. package/dist/lib/adoption-score.js.map +1 -0
  83. package/dist/lib/coaching-level.d.ts +127 -0
  84. package/dist/lib/coaching-level.d.ts.map +1 -0
  85. package/dist/lib/coaching-level.js +406 -0
  86. package/dist/lib/coaching-level.js.map +1 -0
  87. package/dist/lib/context-loader-events.d.ts.map +1 -1
  88. package/dist/lib/context-loader-events.js +7 -26
  89. package/dist/lib/context-loader-events.js.map +1 -1
  90. package/dist/lib/event-logger.d.ts +42 -0
  91. package/dist/lib/event-logger.d.ts.map +1 -1
  92. package/dist/lib/event-logger.js +77 -0
  93. package/dist/lib/event-logger.js.map +1 -1
  94. package/dist/lib/output-formatter.d.ts +8 -2
  95. package/dist/lib/output-formatter.d.ts.map +1 -1
  96. package/dist/lib/output-formatter.js +98 -18
  97. package/dist/lib/output-formatter.js.map +1 -1
  98. package/dist/lib/pending-updates.d.ts +148 -0
  99. package/dist/lib/pending-updates.d.ts.map +1 -0
  100. package/dist/lib/pending-updates.js +301 -0
  101. package/dist/lib/pending-updates.js.map +1 -0
  102. package/dist/lib/planning-menu.d.ts +69 -0
  103. package/dist/lib/planning-menu.d.ts.map +1 -0
  104. package/dist/lib/planning-menu.js +342 -0
  105. package/dist/lib/planning-menu.js.map +1 -0
  106. package/dist/lib/sprint-loader.d.ts +86 -14
  107. package/dist/lib/sprint-loader.d.ts.map +1 -1
  108. package/dist/lib/sprint-loader.js +293 -98
  109. package/dist/lib/sprint-loader.js.map +1 -1
  110. package/dist/lib/state-cache.d.ts +142 -0
  111. package/dist/lib/state-cache.d.ts.map +1 -0
  112. package/dist/lib/state-cache.js +259 -0
  113. package/dist/lib/state-cache.js.map +1 -0
  114. package/dist/lib/targeted-coaching.d.ts +71 -0
  115. package/dist/lib/targeted-coaching.d.ts.map +1 -0
  116. package/dist/lib/targeted-coaching.js +318 -0
  117. package/dist/lib/targeted-coaching.js.map +1 -0
  118. package/dist/lib/task-graph-sync.d.ts +105 -0
  119. package/dist/lib/task-graph-sync.d.ts.map +1 -0
  120. package/dist/lib/task-graph-sync.js +178 -0
  121. package/dist/lib/task-graph-sync.js.map +1 -0
  122. package/dist/lib/task-parser.d.ts +109 -0
  123. package/dist/lib/task-parser.d.ts.map +1 -0
  124. package/dist/lib/task-parser.js +407 -0
  125. package/dist/lib/task-parser.js.map +1 -0
  126. package/dist/lib/user-sprint.d.ts +53 -0
  127. package/dist/lib/user-sprint.d.ts.map +1 -1
  128. package/dist/lib/user-sprint.js +137 -2
  129. package/dist/lib/user-sprint.js.map +1 -1
  130. package/dist/lib/work-reconciliation.d.ts +59 -0
  131. package/dist/lib/work-reconciliation.d.ts.map +1 -0
  132. package/dist/lib/work-reconciliation.js +267 -0
  133. package/dist/lib/work-reconciliation.js.map +1 -0
  134. package/dist/templates/ai-instructions-template.d.ts.map +1 -1
  135. package/dist/templates/ai-instructions-template.js +7 -5
  136. package/dist/templates/ai-instructions-template.js.map +1 -1
  137. package/dist/templates/epic-template.md +0 -2
  138. package/dist/types/config.d.ts.map +1 -1
  139. package/dist/types/config.js +7 -5
  140. package/dist/types/config.js.map +1 -1
  141. package/dist/utils/synthesis.d.ts +4 -0
  142. package/dist/utils/synthesis.d.ts.map +1 -1
  143. package/dist/utils/synthesis.js +12 -18
  144. package/dist/utils/synthesis.js.map +1 -1
  145. package/dist/utils/version-check.d.ts +26 -0
  146. package/dist/utils/version-check.d.ts.map +1 -0
  147. package/dist/utils/version-check.js +186 -0
  148. package/dist/utils/version-check.js.map +1 -0
  149. package/package.json +2 -2
@@ -0,0 +1,348 @@
1
+ /**
2
+ * @fileType: command
3
+ * @status: current
4
+ * @updated: 2026-01-19
5
+ * @tags: [cli, task, status, graph-authoritative, epic-015]
6
+ * @related: [../graph/api-client.ts, ../../index.ts]
7
+ * @priority: high
8
+ * @complexity: medium
9
+ * @dependencies: [chalk, commander]
10
+ */
11
+ import chalk from 'chalk';
12
+ import readline from 'readline';
13
+ import { GraphApiClient } from '../graph/api-client.js';
14
+ import { getGraphId } from '../graph/config.js';
15
+ import { getCurrentUser } from '../../utils/auth-storage.js';
16
+ // =============================================================================
17
+ // Helpers
18
+ // =============================================================================
19
+ /**
20
+ * Get graph ID from config
21
+ */
22
+ async function requireGraphId() {
23
+ const graphId = process.env.GINKO_GRAPH_ID || await getGraphId();
24
+ if (!graphId) {
25
+ console.error(chalk.red('✗ Graph not initialized'));
26
+ console.error(chalk.dim(' Run `ginko graph init` first'));
27
+ process.exit(1);
28
+ }
29
+ return graphId;
30
+ }
31
+ /**
32
+ * Prompt user for confirmation
33
+ */
34
+ async function confirm(message) {
35
+ const rl = readline.createInterface({
36
+ input: process.stdin,
37
+ output: process.stdout,
38
+ });
39
+ return new Promise((resolve) => {
40
+ rl.question(`${message} [Y/n] `, (answer) => {
41
+ rl.close();
42
+ resolve(answer.toLowerCase() !== 'n');
43
+ });
44
+ });
45
+ }
46
+ /**
47
+ * Prompt user for input
48
+ */
49
+ async function prompt(message) {
50
+ const rl = readline.createInterface({
51
+ input: process.stdin,
52
+ output: process.stdout,
53
+ });
54
+ return new Promise((resolve) => {
55
+ rl.question(`${message}: `, (answer) => {
56
+ rl.close();
57
+ resolve(answer.trim());
58
+ });
59
+ });
60
+ }
61
+ /**
62
+ * Extract sprint ID from task ID
63
+ * e.g., e015_s01_t01 -> e015_s01
64
+ */
65
+ function extractSprintId(taskId) {
66
+ // Match pattern: e{NNN}_s{NN}_t{NN}
67
+ const match = taskId.match(/^(e\d+_s\d+)_t\d+$/);
68
+ return match ? match[1] : null;
69
+ }
70
+ /**
71
+ * Check if all tasks in sprint are complete and offer to complete sprint
72
+ */
73
+ async function checkSprintCompletion(client, graphId, sprintId, skipPrompt) {
74
+ try {
75
+ const tasks = await client.getSprintTasks(graphId, sprintId);
76
+ const allComplete = tasks.every(t => t.status === 'complete');
77
+ if (allComplete && tasks.length > 0) {
78
+ console.log(chalk.cyan(`\nAll tasks in ${sprintId} are complete.`));
79
+ const shouldComplete = skipPrompt || await confirm('Mark sprint complete?');
80
+ if (shouldComplete) {
81
+ const response = await client.updateSprintStatus(graphId, sprintId, 'complete');
82
+ console.log(chalk.green(`✓ Sprint ${sprintId} marked complete`));
83
+ // Check epic completion
84
+ const epicId = sprintId.split('_')[0]; // e.g., e015_s01 -> e015
85
+ if (epicId) {
86
+ await checkEpicCompletion(client, graphId, epicId, skipPrompt);
87
+ }
88
+ }
89
+ }
90
+ }
91
+ catch (error) {
92
+ // Silently ignore cascade errors - main operation succeeded
93
+ if (process.env.GINKO_DEBUG_API === 'true') {
94
+ console.log(chalk.dim(` Cascade check failed: ${error}`));
95
+ }
96
+ }
97
+ }
98
+ /**
99
+ * Check if all sprints in epic are complete and offer to complete epic
100
+ */
101
+ async function checkEpicCompletion(client, graphId, epicId, skipPrompt) {
102
+ try {
103
+ const sprints = await client.getEpicSprints(graphId, epicId);
104
+ const allComplete = sprints.every(s => s.status === 'complete');
105
+ if (allComplete && sprints.length > 0) {
106
+ console.log(chalk.cyan(`\nAll sprints in ${epicId} are complete.`));
107
+ const shouldComplete = skipPrompt || await confirm('Mark epic complete?');
108
+ if (shouldComplete) {
109
+ await client.updateEpicStatus(graphId, epicId, 'complete');
110
+ console.log(chalk.green(`✓ Epic ${epicId} marked complete`));
111
+ }
112
+ }
113
+ }
114
+ catch (error) {
115
+ // Silently ignore cascade errors
116
+ if (process.env.GINKO_DEBUG_API === 'true') {
117
+ console.log(chalk.dim(` Epic cascade check failed: ${error}`));
118
+ }
119
+ }
120
+ }
121
+ // =============================================================================
122
+ // Commands
123
+ // =============================================================================
124
+ /**
125
+ * Mark task as complete
126
+ * Usage: ginko task complete <taskId> [--cascade] [--yes]
127
+ */
128
+ export async function completeCommand(taskId, options = {}) {
129
+ const graphId = await requireGraphId();
130
+ const client = new GraphApiClient();
131
+ try {
132
+ // Check current status
133
+ const current = await client.getTaskStatus(graphId, taskId);
134
+ if (current.status === 'complete') {
135
+ console.log(chalk.yellow(`Task ${taskId} is already complete (no change)`));
136
+ return;
137
+ }
138
+ // Update status
139
+ const response = await client.updateTaskStatus(graphId, taskId, 'complete');
140
+ console.log(chalk.green(`✓ Task ${taskId} marked complete`));
141
+ if (response.task.title) {
142
+ console.log(chalk.dim(` "${response.task.title}"`));
143
+ }
144
+ // Cascade completion check
145
+ if (options.cascade) {
146
+ const sprintId = extractSprintId(taskId);
147
+ if (sprintId) {
148
+ await checkSprintCompletion(client, graphId, sprintId, !!options.yes);
149
+ }
150
+ }
151
+ }
152
+ catch (error) {
153
+ handleError('complete', taskId, error);
154
+ }
155
+ }
156
+ /**
157
+ * Get task details from graph including assignee
158
+ * Uses the graph nodes API to fetch full task properties
159
+ */
160
+ async function getTaskDetails(client, graphId, taskId) {
161
+ try {
162
+ // Use the graph nodes API to get full task details
163
+ const response = await client.request('GET', `/api/v1/graph/nodes/${encodeURIComponent(taskId)}?graphId=${encodeURIComponent(graphId)}`);
164
+ return {
165
+ assignee: response.node?.properties?.assignee || null,
166
+ title: response.node?.properties?.title || null,
167
+ };
168
+ }
169
+ catch {
170
+ // If we can't get details, assume no assignee
171
+ return { assignee: null, title: null };
172
+ }
173
+ }
174
+ /**
175
+ * Update task assignee in graph
176
+ */
177
+ async function updateTaskAssignee(client, graphId, taskId, assignee) {
178
+ await client.request('PATCH', `/api/v1/graph/nodes/${encodeURIComponent(taskId)}?graphId=${encodeURIComponent(graphId)}`, { assignee });
179
+ }
180
+ /**
181
+ * Mark task as in progress
182
+ * Usage: ginko task start <taskId>
183
+ *
184
+ * Per ADR-061: Starting work on a task requires assignment.
185
+ * If task is unassigned, prompts user to assign to themselves.
186
+ */
187
+ export async function startCommand(taskId, options = {}) {
188
+ const graphId = await requireGraphId();
189
+ const client = new GraphApiClient();
190
+ try {
191
+ // Check current status
192
+ const current = await client.getTaskStatus(graphId, taskId);
193
+ if (current.status === 'in_progress') {
194
+ console.log(chalk.yellow(`Task ${taskId} is already in progress (no change)`));
195
+ return;
196
+ }
197
+ // ADR-061: Check assignment before starting (work cannot be anonymous)
198
+ const taskDetails = await getTaskDetails(client, graphId, taskId);
199
+ const currentUser = await getCurrentUser();
200
+ if (!taskDetails.assignee && currentUser?.email) {
201
+ // Task is unassigned - prompt for assignment per ADR-061
202
+ console.log(chalk.yellow(`\nTask ${taskId} is unassigned.`));
203
+ if (taskDetails.title) {
204
+ console.log(chalk.dim(` "${taskDetails.title}"`));
205
+ }
206
+ const shouldAssign = await confirm(`Assign to you (${currentUser.email})?`);
207
+ if (shouldAssign) {
208
+ await updateTaskAssignee(client, graphId, taskId, currentUser.email);
209
+ console.log(chalk.green(`✓ Assigned to ${currentUser.email}`));
210
+ }
211
+ else {
212
+ // User declined assignment - warn but allow per ADR-061
213
+ console.log(chalk.yellow('⚠ Working without assignment. Work may not be traceable.'));
214
+ }
215
+ }
216
+ // Update status to in_progress
217
+ const response = await client.updateTaskStatus(graphId, taskId, 'in_progress');
218
+ console.log(chalk.cyan(`▶ Task ${taskId} started`));
219
+ if (response.task.title) {
220
+ console.log(chalk.dim(` "${response.task.title}"`));
221
+ }
222
+ }
223
+ catch (error) {
224
+ handleError('start', taskId, error);
225
+ }
226
+ }
227
+ /**
228
+ * Pause task (return to not_started)
229
+ * Usage: ginko task pause <taskId>
230
+ */
231
+ export async function pauseCommand(taskId, options = {}) {
232
+ const graphId = await requireGraphId();
233
+ const client = new GraphApiClient();
234
+ try {
235
+ // Check current status
236
+ const current = await client.getTaskStatus(graphId, taskId);
237
+ if (current.status === 'not_started') {
238
+ console.log(chalk.yellow(`Task ${taskId} is already not started (no change)`));
239
+ return;
240
+ }
241
+ // Update status
242
+ const response = await client.updateTaskStatus(graphId, taskId, 'not_started');
243
+ console.log(chalk.yellow(`⏸ Task ${taskId} paused`));
244
+ if (response.task.title) {
245
+ console.log(chalk.dim(` "${response.task.title}"`));
246
+ }
247
+ }
248
+ catch (error) {
249
+ handleError('pause', taskId, error);
250
+ }
251
+ }
252
+ /**
253
+ * Block task with reason
254
+ * Usage: ginko task block <taskId> [reason]
255
+ */
256
+ export async function blockCommand(taskId, reason, options = {}) {
257
+ const graphId = await requireGraphId();
258
+ const client = new GraphApiClient();
259
+ try {
260
+ // Check current status
261
+ const current = await client.getTaskStatus(graphId, taskId);
262
+ if (current.status === 'blocked') {
263
+ console.log(chalk.yellow(`Task ${taskId} is already blocked`));
264
+ if (current.blocked_reason) {
265
+ console.log(chalk.dim(` Reason: ${current.blocked_reason}`));
266
+ }
267
+ return;
268
+ }
269
+ // Get reason if not provided
270
+ let blockReason = reason;
271
+ if (!blockReason) {
272
+ blockReason = await prompt('Reason for blocking');
273
+ if (!blockReason) {
274
+ console.error(chalk.red('✗ Reason is required for blocking a task'));
275
+ process.exit(1);
276
+ }
277
+ }
278
+ // Update status
279
+ const response = await client.updateTaskStatus(graphId, taskId, 'blocked', blockReason);
280
+ console.log(chalk.red(`⊘ Task ${taskId} blocked`));
281
+ if (response.task.title) {
282
+ console.log(chalk.dim(` "${response.task.title}"`));
283
+ }
284
+ console.log(chalk.dim(` Reason: ${blockReason}`));
285
+ }
286
+ catch (error) {
287
+ handleError('block', taskId, error);
288
+ }
289
+ }
290
+ /**
291
+ * Show task status
292
+ * Usage: ginko task show <taskId>
293
+ */
294
+ export async function showCommand(taskId, options = {}) {
295
+ const graphId = await requireGraphId();
296
+ const client = new GraphApiClient();
297
+ try {
298
+ const status = await client.getTaskStatus(graphId, taskId);
299
+ console.log(chalk.bold(`Task: ${status.id}`));
300
+ console.log(`Status: ${formatStatus(status.status)}`);
301
+ if (status.blocked_reason) {
302
+ console.log(chalk.dim(`Blocked: ${status.blocked_reason}`));
303
+ }
304
+ }
305
+ catch (error) {
306
+ handleError('show', taskId, error);
307
+ }
308
+ }
309
+ // =============================================================================
310
+ // Helpers
311
+ // =============================================================================
312
+ function formatStatus(status) {
313
+ switch (status) {
314
+ case 'complete':
315
+ return chalk.green('✓ complete');
316
+ case 'in_progress':
317
+ return chalk.cyan('▶ in_progress');
318
+ case 'blocked':
319
+ return chalk.red('⊘ blocked');
320
+ case 'not_started':
321
+ default:
322
+ return chalk.dim('○ not_started');
323
+ }
324
+ }
325
+ function handleError(action, taskId, error) {
326
+ if (error instanceof Error) {
327
+ if (error.message.includes('TASK_NOT_FOUND') || error.message.includes('not found')) {
328
+ console.error(chalk.red(`✗ Task not found: ${taskId}`));
329
+ console.error(chalk.dim(' Make sure the task ID is correct and exists in the graph'));
330
+ }
331
+ else if (error.message.includes('AUTH_REQUIRED')) {
332
+ console.error(chalk.red('✗ Authentication required'));
333
+ console.error(chalk.dim(' Run `ginko login` first'));
334
+ }
335
+ else if (error.message.includes('SERVICE_UNAVAILABLE')) {
336
+ console.error(chalk.red('✗ Graph database unavailable'));
337
+ console.error(chalk.dim(' Please try again later'));
338
+ }
339
+ else {
340
+ console.error(chalk.red(`✗ Failed to ${action} task: ${error.message}`));
341
+ }
342
+ }
343
+ else {
344
+ console.error(chalk.red(`✗ Failed to ${action} task`));
345
+ }
346
+ process.exit(1);
347
+ }
348
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/task/status.ts"],"names":[],"mappings":"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"}
@@ -18,5 +18,10 @@ import { Command } from 'commander';
18
18
  * Main team command with subcommands
19
19
  */
20
20
  export declare function teamManagementCommand(): Command;
21
+ /**
22
+ * Team visibility command (EPIC-016 Sprint 3)
23
+ * Shows team-wide work status and unassigned tasks
24
+ */
25
+ export declare function teamVisibilityCommand(): Command;
21
26
  export default teamManagementCommand;
22
27
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/team/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC;;GAEG;AACH,wBAAgB,qBAAqB,YA4FpC;AAGD,eAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/team/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC;;GAEG;AACH,wBAAgB,qBAAqB,YA4FpC;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,YA2BpC;AAGD,eAAe,qBAAqB,CAAC"}
@@ -19,6 +19,7 @@ import { createTeamCommand } from './create.js';
19
19
  import { listTeamsCommand } from './list.js';
20
20
  import { addTeamMemberCommand, removeTeamMemberCommand, listTeamMembersCommand } from './members.js';
21
21
  import { addTeamToProjectCommand, removeTeamFromProjectCommand } from './projects.js';
22
+ import { teamStatusCommand } from './status.js';
22
23
  /**
23
24
  * Main team command with subcommands
24
25
  */
@@ -104,6 +105,33 @@ ${chalk.gray('Learn More:')}
104
105
  });
105
106
  return team;
106
107
  }
108
+ /**
109
+ * Team visibility command (EPIC-016 Sprint 3)
110
+ * Shows team-wide work status and unassigned tasks
111
+ */
112
+ export function teamVisibilityCommand() {
113
+ const team = new Command('team')
114
+ .description('Team visibility commands')
115
+ .addHelpText('after', `
116
+ ${chalk.gray('Commands:')}
117
+ ${chalk.green('ginko team status')} ${chalk.dim('Show team work status and unassigned tasks')}
118
+
119
+ ${chalk.gray('Examples:')}
120
+ ${chalk.green('ginko team status')} ${chalk.dim('View all team members\' current work')}
121
+ `)
122
+ .action(() => {
123
+ // When called without subcommand, show help
124
+ team.help({ error: false });
125
+ });
126
+ // Status command
127
+ team
128
+ .command('status')
129
+ .description('Show team work status and unassigned tasks')
130
+ .action(async () => {
131
+ await teamStatusCommand();
132
+ });
133
+ return team;
134
+ }
107
135
  // Export for use in main CLI
108
136
  export default teamManagementCommand;
109
137
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/team/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACrG,OAAO,EAAE,uBAAuB,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAEtF;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;SAC9B,WAAW,CAAC,iDAAiD,CAAC;SAC9D,kBAAkB,CAAC,yCAAyC,CAAC;SAC7D,WAAW,CACV,OAAO,EACP;EACJ,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC;IACxB,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,wCAAwC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC;IACpG,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,iCAAiC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC;IAC7F,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,mCAAmC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC;;EAE9F,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC;IAC3B,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC;IACjC,KAAK,CAAC,KAAK,CAAC,wBAAwB,CAAC;IACrC,KAAK,CAAC,KAAK,CAAC,4BAA4B,CAAC;IACzC,KAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC;IACvC,KAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC;;EAEhD,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;IACrB,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC;IAChC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC;IAC/B,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC;IAC9B,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC;;EAElC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC;IACvB,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC;CAC3C,CACI;SACA,MAAM,CAAC,GAAG,EAAE;QACX,4CAA4C;QAC5C,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEL,iBAAiB;IACjB,IAAI;SACD,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,mBAAmB,CAAC;SAChC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEL,eAAe;IACf,IAAI;SACD,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,iBAAiB,CAAC;SAC9B,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,gBAAgB,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEL,qBAAqB;IACrB,IAAI;SACD,OAAO,CAAC,qCAAqC,CAAC;SAC9C,WAAW,CAAC,wBAAwB,CAAC;SACrC,MAAM,CAAC,eAAe,EAAE,4BAA4B,EAAE,QAAQ,CAAC;SAC/D,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE;QAChD,MAAM,oBAAoB,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEL,wBAAwB;IACxB,IAAI;SACD,OAAO,CAAC,wCAAwC,CAAC;SACjD,WAAW,CAAC,6BAA6B,CAAC;SAC1C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE;QACvC,MAAM,uBAAuB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEL,uBAAuB;IACvB,IAAI;SACD,OAAO,CAAC,qBAAqB,CAAC;SAC9B,WAAW,CAAC,mBAAmB,CAAC;SAChC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QACvB,MAAM,sBAAsB,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEL,yBAAyB;IACzB,IAAI;SACD,OAAO,CAAC,iCAAiC,CAAC;SAC1C,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,EAAE;QAC9C,MAAM,uBAAuB,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEL,8BAA8B;IAC9B,IAAI;SACD,OAAO,CAAC,sCAAsC,CAAC;SAC/C,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,EAAE;QAC9C,MAAM,4BAA4B,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEL,OAAO,IAAI,CAAC;AACd,CAAC;AAED,6BAA6B;AAC7B,eAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/team/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @fileType: command
3
+ * @status: current
4
+ * @updated: 2026-01-21
5
+ * @tags: [team, status, visibility, epic-016, sprint-3]
6
+ * @related: [../team.ts, ../../lib/output-formatter.ts, ../graph/api-client.ts]
7
+ * @priority: high
8
+ * @complexity: medium
9
+ * @dependencies: [chalk, commander]
10
+ */
11
+ /**
12
+ * Team status command handler
13
+ */
14
+ export declare function teamStatusCommand(): Promise<void>;
15
+ export default teamStatusCommand;
16
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/team/status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAoGH;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAgCvD;AA0FD,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,180 @@
1
+ /**
2
+ * @fileType: command
3
+ * @status: current
4
+ * @updated: 2026-01-21
5
+ * @tags: [team, status, visibility, epic-016, sprint-3]
6
+ * @related: [../team.ts, ../../lib/output-formatter.ts, ../graph/api-client.ts]
7
+ * @priority: high
8
+ * @complexity: medium
9
+ * @dependencies: [chalk, commander]
10
+ */
11
+ /**
12
+ * Team Status Command (EPIC-016 Sprint 3)
13
+ *
14
+ * Displays team-wide work status including:
15
+ * - Member progress with progress bars
16
+ * - Unassigned work summary
17
+ * - Activity timestamps with relative time
18
+ *
19
+ * Usage:
20
+ * ginko team status # Show team work status
21
+ */
22
+ import chalk from 'chalk';
23
+ import { GraphApiClient } from '../graph/api-client.js';
24
+ import { getGraphId } from '../graph/config.js';
25
+ import { formatProgressBar } from '../../lib/output-formatter.js';
26
+ /**
27
+ * Format relative time (e.g., "30m ago", "2h ago", "3d ago")
28
+ */
29
+ function formatRelativeTime(isoDate) {
30
+ if (!isoDate)
31
+ return chalk.dim('never');
32
+ const date = new Date(isoDate);
33
+ const now = new Date();
34
+ const diffMs = now.getTime() - date.getTime();
35
+ const minutes = Math.floor(diffMs / (1000 * 60));
36
+ const hours = Math.floor(diffMs / (1000 * 60 * 60));
37
+ const days = Math.floor(diffMs / (1000 * 60 * 60 * 24));
38
+ if (minutes < 1)
39
+ return chalk.green('just now');
40
+ if (minutes < 60)
41
+ return chalk.green(`${minutes}m ago`);
42
+ if (hours < 24)
43
+ return chalk.yellow(`${hours}h ago`);
44
+ if (days < 7)
45
+ return chalk.dim(`${days}d ago`);
46
+ return chalk.dim(`${days}d ago`);
47
+ }
48
+ /**
49
+ * Format progress as a compact progress bar with percentage
50
+ */
51
+ function formatCompactProgress(complete, total, width = 8) {
52
+ if (total === 0)
53
+ return chalk.dim('no tasks');
54
+ const percent = Math.round((complete / total) * 100);
55
+ const bar = formatProgressBar(percent, width);
56
+ return `${complete}/${total} ${bar} ${percent}%`;
57
+ }
58
+ /**
59
+ * Extract short sprint name (e.g., "EPIC-016 Sprint 1" from full title)
60
+ */
61
+ function formatSprintName(sprint) {
62
+ // Try to extract epic number from ID (e.g., e016_s01 -> EPIC-016)
63
+ const epicMatch = sprint.id.match(/e(\d+)_s(\d+)/);
64
+ if (epicMatch) {
65
+ const epicNum = parseInt(epicMatch[1], 10);
66
+ const sprintNum = parseInt(epicMatch[2], 10);
67
+ return `EPIC-${epicNum.toString().padStart(3, '0')} Sprint ${sprintNum}`;
68
+ }
69
+ // Fallback to epic title + sprint title
70
+ return `${sprint.epic.title} ${sprint.title}`.substring(0, 30);
71
+ }
72
+ /**
73
+ * Team status command handler
74
+ */
75
+ export async function teamStatusCommand() {
76
+ try {
77
+ // Get graphId from config
78
+ const graphId = await getGraphId();
79
+ if (!graphId) {
80
+ console.log(chalk.yellow('⚠️ No project initialized. Run "ginko init" first.'));
81
+ return;
82
+ }
83
+ const client = new GraphApiClient();
84
+ // Fetch team status from API
85
+ const response = await client.request('GET', `/api/v1/team/status?graphId=${encodeURIComponent(graphId)}`);
86
+ // Render output
87
+ renderTeamStatus(response);
88
+ }
89
+ catch (error) {
90
+ if (error instanceof Error) {
91
+ if (error.message.includes('Not authenticated')) {
92
+ console.log(chalk.yellow('⚠️ Not authenticated. Run "ginko login" first.'));
93
+ }
94
+ else if (error.message.includes('ACCESS_DENIED')) {
95
+ console.log(chalk.red('✗ Access denied to this project.'));
96
+ }
97
+ else {
98
+ console.log(chalk.red(`✗ ${error.message}`));
99
+ }
100
+ }
101
+ else {
102
+ console.log(chalk.red('✗ Failed to fetch team status'));
103
+ }
104
+ }
105
+ }
106
+ /**
107
+ * Render team status output with box drawing
108
+ */
109
+ function renderTeamStatus(data) {
110
+ const width = 73;
111
+ const box = {
112
+ topLeft: '┌',
113
+ topRight: '┐',
114
+ bottomLeft: '└',
115
+ bottomRight: '┘',
116
+ horizontal: '─',
117
+ vertical: '│',
118
+ leftT: '├',
119
+ rightT: '┤',
120
+ };
121
+ const hr = box.horizontal.repeat(width);
122
+ const pad = (s, len) => {
123
+ const visibleLen = s.replace(/\x1b\[[0-9;]*m/g, '').length;
124
+ return s + ' '.repeat(Math.max(0, len - visibleLen));
125
+ };
126
+ const lines = [];
127
+ // Header
128
+ lines.push(`${box.topLeft}${hr}${box.topRight}`);
129
+ lines.push(`${box.vertical} ${chalk.bold('Team Status')}${' '.repeat(width - 14)}${box.vertical}`);
130
+ lines.push(`${box.leftT}${hr}${box.rightT}`);
131
+ // Members section
132
+ if (data.members.length === 0) {
133
+ lines.push(`${box.vertical} ${chalk.dim('No team members with assigned work')}${' '.repeat(width - 38)}${box.vertical}`);
134
+ }
135
+ else {
136
+ for (const member of data.members) {
137
+ // Member email line
138
+ const emailLine = ` ${chalk.cyan(member.email)}`;
139
+ lines.push(`${box.vertical}${pad(emailLine, width)}${box.vertical}`);
140
+ // Sprint progress line
141
+ if (member.activeSprint) {
142
+ const sprintName = formatSprintName(member.activeSprint);
143
+ const progress = formatCompactProgress(member.progress.complete, member.progress.total);
144
+ const activity = formatRelativeTime(member.lastActivity);
145
+ const sprintLine = ` └─ ${sprintName} ${progress} active ${activity}`;
146
+ lines.push(`${box.vertical}${pad(sprintLine, width)}${box.vertical}`);
147
+ }
148
+ else {
149
+ const activity = formatRelativeTime(member.lastActivity);
150
+ const noWorkLine = ` └─ ${chalk.dim('(no active work)')} last seen ${activity}`;
151
+ lines.push(`${box.vertical}${pad(noWorkLine, width)}${box.vertical}`);
152
+ }
153
+ // Empty line between members
154
+ lines.push(`${box.vertical}${' '.repeat(width)}${box.vertical}`);
155
+ }
156
+ }
157
+ // Unassigned work section
158
+ if (data.unassigned.length > 0) {
159
+ lines.push(`${box.leftT}${hr}${box.rightT}`);
160
+ lines.push(`${box.vertical} ${chalk.bold('Unassigned Work')}${' '.repeat(width - 18)}${box.vertical}`);
161
+ for (const sprint of data.unassigned.slice(0, 5)) {
162
+ const sprintLine = ` └─ ${sprint.epicTitle} ${sprint.sprintTitle} ${sprint.taskCount} tasks ${chalk.yellow('needs owner')}`;
163
+ lines.push(`${box.vertical}${pad(sprintLine, width)}${box.vertical}`);
164
+ }
165
+ if (data.unassigned.length > 5) {
166
+ const moreLine = ` ${chalk.dim(`... and ${data.unassigned.length - 5} more sprints with unassigned work`)}`;
167
+ lines.push(`${box.vertical}${pad(moreLine, width)}${box.vertical}`);
168
+ }
169
+ }
170
+ // Summary section
171
+ lines.push(`${box.leftT}${hr}${box.rightT}`);
172
+ const summaryLine = ` Summary: ${data.summary.totalMembers} members ${box.vertical} ${data.summary.activeMembers} active today ${box.vertical} ${data.summary.totalUnassigned} unassigned tasks`;
173
+ lines.push(`${box.vertical}${pad(summaryLine, width)}${box.vertical}`);
174
+ // Footer
175
+ lines.push(`${box.bottomLeft}${hr}${box.bottomRight}`);
176
+ // Output
177
+ console.log(lines.join('\n'));
178
+ }
179
+ export default teamStatusCommand;
180
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/team/status.ts"],"names":[],"mappings":"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"}