@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.
- package/dist/commands/epic/index.d.ts +29 -0
- package/dist/commands/epic/index.d.ts.map +1 -0
- package/dist/commands/epic/index.js +94 -0
- package/dist/commands/epic/index.js.map +1 -0
- package/dist/commands/epic/status.d.ts +40 -0
- package/dist/commands/epic/status.d.ts.map +1 -0
- package/dist/commands/epic/status.js +244 -0
- package/dist/commands/epic/status.js.map +1 -0
- package/dist/commands/graph/api-client.d.ts +221 -1
- package/dist/commands/graph/api-client.d.ts.map +1 -1
- package/dist/commands/graph/api-client.js +141 -2
- package/dist/commands/graph/api-client.js.map +1 -1
- package/dist/commands/graph/load.d.ts.map +1 -1
- package/dist/commands/graph/load.js +40 -2
- package/dist/commands/graph/load.js.map +1 -1
- package/dist/commands/handoff.d.ts +3 -3
- package/dist/commands/handoff.d.ts.map +1 -1
- package/dist/commands/handoff.js +32 -3
- package/dist/commands/handoff.js.map +1 -1
- package/dist/commands/migrate/index.d.ts +27 -0
- package/dist/commands/migrate/index.d.ts.map +1 -0
- package/dist/commands/migrate/index.js +76 -0
- package/dist/commands/migrate/index.js.map +1 -0
- package/dist/commands/migrate/status-migration.d.ts +58 -0
- package/dist/commands/migrate/status-migration.d.ts.map +1 -0
- package/dist/commands/migrate/status-migration.js +323 -0
- package/dist/commands/migrate/status-migration.js.map +1 -0
- package/dist/commands/nudging/index.d.ts +24 -0
- package/dist/commands/nudging/index.d.ts.map +1 -0
- package/dist/commands/nudging/index.js +175 -0
- package/dist/commands/nudging/index.js.map +1 -0
- package/dist/commands/sprint/create.d.ts +26 -0
- package/dist/commands/sprint/create.d.ts.map +1 -0
- package/dist/commands/sprint/create.js +269 -0
- package/dist/commands/sprint/create.js.map +1 -0
- package/dist/commands/sprint/index.d.ts.map +1 -1
- package/dist/commands/sprint/index.js +28 -0
- package/dist/commands/sprint/index.js.map +1 -1
- package/dist/commands/sprint/quick-fix.d.ts +25 -0
- package/dist/commands/sprint/quick-fix.d.ts.map +1 -0
- package/dist/commands/sprint/quick-fix.js +151 -0
- package/dist/commands/sprint/quick-fix.js.map +1 -0
- package/dist/commands/sprint/sprint-pipeline-enhanced.d.ts.map +1 -1
- package/dist/commands/sprint/sprint-pipeline-enhanced.js +37 -0
- package/dist/commands/sprint/sprint-pipeline-enhanced.js.map +1 -1
- package/dist/commands/sprint/status.d.ts +42 -0
- package/dist/commands/sprint/status.d.ts.map +1 -0
- package/dist/commands/sprint/status.js +298 -0
- package/dist/commands/sprint/status.js.map +1 -0
- package/dist/commands/start/start-reflection.d.ts +53 -0
- package/dist/commands/start/start-reflection.d.ts.map +1 -1
- package/dist/commands/start/start-reflection.js +464 -71
- package/dist/commands/start/start-reflection.js.map +1 -1
- package/dist/commands/sync/sprint-syncer.d.ts +19 -12
- package/dist/commands/sync/sprint-syncer.d.ts.map +1 -1
- package/dist/commands/sync/sprint-syncer.js +58 -140
- package/dist/commands/sync/sprint-syncer.js.map +1 -1
- package/dist/commands/sync/sync-command.d.ts.map +1 -1
- package/dist/commands/sync/sync-command.js +6 -18
- package/dist/commands/sync/sync-command.js.map +1 -1
- package/dist/commands/task/index.d.ts +25 -0
- package/dist/commands/task/index.d.ts.map +1 -0
- package/dist/commands/task/index.js +100 -0
- package/dist/commands/task/index.js.map +1 -0
- package/dist/commands/task/status.d.ts +46 -0
- package/dist/commands/task/status.d.ts.map +1 -0
- package/dist/commands/task/status.js +348 -0
- package/dist/commands/task/status.js.map +1 -0
- package/dist/commands/team/index.d.ts +5 -0
- package/dist/commands/team/index.d.ts.map +1 -1
- package/dist/commands/team/index.js +28 -0
- package/dist/commands/team/index.js.map +1 -1
- package/dist/commands/team/status.d.ts +16 -0
- package/dist/commands/team/status.d.ts.map +1 -0
- package/dist/commands/team/status.js +180 -0
- package/dist/commands/team/status.js.map +1 -0
- package/dist/index.js +21 -32
- package/dist/index.js.map +1 -1
- package/dist/lib/adoption-score.d.ts +69 -0
- package/dist/lib/adoption-score.d.ts.map +1 -0
- package/dist/lib/adoption-score.js +206 -0
- package/dist/lib/adoption-score.js.map +1 -0
- package/dist/lib/coaching-level.d.ts +127 -0
- package/dist/lib/coaching-level.d.ts.map +1 -0
- package/dist/lib/coaching-level.js +406 -0
- package/dist/lib/coaching-level.js.map +1 -0
- package/dist/lib/context-loader-events.d.ts.map +1 -1
- package/dist/lib/context-loader-events.js +7 -26
- package/dist/lib/context-loader-events.js.map +1 -1
- package/dist/lib/event-logger.d.ts +42 -0
- package/dist/lib/event-logger.d.ts.map +1 -1
- package/dist/lib/event-logger.js +77 -0
- package/dist/lib/event-logger.js.map +1 -1
- package/dist/lib/output-formatter.d.ts +8 -2
- package/dist/lib/output-formatter.d.ts.map +1 -1
- package/dist/lib/output-formatter.js +98 -18
- package/dist/lib/output-formatter.js.map +1 -1
- package/dist/lib/pending-updates.d.ts +148 -0
- package/dist/lib/pending-updates.d.ts.map +1 -0
- package/dist/lib/pending-updates.js +301 -0
- package/dist/lib/pending-updates.js.map +1 -0
- package/dist/lib/planning-menu.d.ts +69 -0
- package/dist/lib/planning-menu.d.ts.map +1 -0
- package/dist/lib/planning-menu.js +342 -0
- package/dist/lib/planning-menu.js.map +1 -0
- package/dist/lib/sprint-loader.d.ts +86 -14
- package/dist/lib/sprint-loader.d.ts.map +1 -1
- package/dist/lib/sprint-loader.js +293 -98
- package/dist/lib/sprint-loader.js.map +1 -1
- package/dist/lib/state-cache.d.ts +142 -0
- package/dist/lib/state-cache.d.ts.map +1 -0
- package/dist/lib/state-cache.js +259 -0
- package/dist/lib/state-cache.js.map +1 -0
- package/dist/lib/targeted-coaching.d.ts +71 -0
- package/dist/lib/targeted-coaching.d.ts.map +1 -0
- package/dist/lib/targeted-coaching.js +318 -0
- package/dist/lib/targeted-coaching.js.map +1 -0
- package/dist/lib/task-graph-sync.d.ts +105 -0
- package/dist/lib/task-graph-sync.d.ts.map +1 -0
- package/dist/lib/task-graph-sync.js +178 -0
- package/dist/lib/task-graph-sync.js.map +1 -0
- package/dist/lib/task-parser.d.ts +109 -0
- package/dist/lib/task-parser.d.ts.map +1 -0
- package/dist/lib/task-parser.js +407 -0
- package/dist/lib/task-parser.js.map +1 -0
- package/dist/lib/user-sprint.d.ts +53 -0
- package/dist/lib/user-sprint.d.ts.map +1 -1
- package/dist/lib/user-sprint.js +137 -2
- package/dist/lib/user-sprint.js.map +1 -1
- package/dist/lib/work-reconciliation.d.ts +59 -0
- package/dist/lib/work-reconciliation.d.ts.map +1 -0
- package/dist/lib/work-reconciliation.js +267 -0
- package/dist/lib/work-reconciliation.js.map +1 -0
- package/dist/templates/ai-instructions-template.d.ts.map +1 -1
- package/dist/templates/ai-instructions-template.js +7 -5
- package/dist/templates/ai-instructions-template.js.map +1 -1
- package/dist/templates/epic-template.md +0 -2
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +7 -5
- package/dist/types/config.js.map +1 -1
- package/dist/utils/synthesis.d.ts +4 -0
- package/dist/utils/synthesis.d.ts.map +1 -1
- package/dist/utils/synthesis.js +12 -18
- package/dist/utils/synthesis.js.map +1 -1
- package/dist/utils/version-check.d.ts +26 -0
- package/dist/utils/version-check.d.ts.map +1 -0
- package/dist/utils/version-check.js +186 -0
- package/dist/utils/version-check.js.map +1 -0
- 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;
|
|
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;
|
|
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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"}
|