@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,269 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: command
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2026-01-26
|
|
5
|
+
* @tags: [sprint, create, conversational, ai, epic-016-s04]
|
|
6
|
+
* @related: [index.ts, quick-fix.ts, ../../lib/planning-menu.ts]
|
|
7
|
+
* @priority: high
|
|
8
|
+
* @complexity: medium
|
|
9
|
+
* @dependencies: [prompts, chalk, ora, ai-service]
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Conversational Sprint Creation (EPIC-016 Sprint 4 t03)
|
|
13
|
+
*
|
|
14
|
+
* Lightweight flow for creating feature sprints:
|
|
15
|
+
* 1. User describes what they're building
|
|
16
|
+
* 2. AI breaks down into tasks
|
|
17
|
+
* 3. User confirms or edits
|
|
18
|
+
* 4. Sprint created and assigned
|
|
19
|
+
*/
|
|
20
|
+
import prompts from 'prompts';
|
|
21
|
+
import chalk from 'chalk';
|
|
22
|
+
import ora from 'ora';
|
|
23
|
+
import { getUserEmail } from '../../utils/helpers.js';
|
|
24
|
+
import { GraphApiClient } from '../graph/api-client.js';
|
|
25
|
+
import { getGraphId, isGraphInitialized } from '../graph/config.js';
|
|
26
|
+
import { setUserCurrentSprint, createAssignmentFromSprintId } from '../../lib/user-sprint.js';
|
|
27
|
+
// =============================================================================
|
|
28
|
+
// Sprint ID Generation
|
|
29
|
+
// =============================================================================
|
|
30
|
+
/**
|
|
31
|
+
* Generate the next ad-hoc sprint ID for today
|
|
32
|
+
* Format: adhoc_{YYMMDD}_s{NN}
|
|
33
|
+
*/
|
|
34
|
+
async function generateNextAdhocSprintId(graphId) {
|
|
35
|
+
const today = new Date();
|
|
36
|
+
const dateStr = `${String(today.getFullYear()).slice(2)}${String(today.getMonth() + 1).padStart(2, '0')}${String(today.getDate()).padStart(2, '0')}`;
|
|
37
|
+
const client = new GraphApiClient();
|
|
38
|
+
try {
|
|
39
|
+
// Query existing sprints to find next sequence number
|
|
40
|
+
const response = await client.request('GET', `/api/v1/sprint/list?graphId=${encodeURIComponent(graphId)}&prefix=adhoc_${dateStr}`);
|
|
41
|
+
const todayPrefix = `adhoc_${dateStr}_s`;
|
|
42
|
+
const existingNumbers = (response.sprints || [])
|
|
43
|
+
.map(s => s.id)
|
|
44
|
+
.filter(id => id.startsWith(todayPrefix))
|
|
45
|
+
.map(id => parseInt(id.replace(todayPrefix, ''), 10))
|
|
46
|
+
.filter(n => !isNaN(n));
|
|
47
|
+
const nextNum = existingNumbers.length > 0 ? Math.max(...existingNumbers) + 1 : 1;
|
|
48
|
+
return `adhoc_${dateStr}_s${String(nextNum).padStart(2, '0')}`;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Fallback to s01 if query fails
|
|
52
|
+
return `adhoc_${dateStr}_s01`;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// =============================================================================
|
|
56
|
+
// AI Task Breakdown
|
|
57
|
+
// =============================================================================
|
|
58
|
+
/**
|
|
59
|
+
* Use AI to break down a feature description into tasks
|
|
60
|
+
*/
|
|
61
|
+
async function breakdownFeatureWithAI(description) {
|
|
62
|
+
try {
|
|
63
|
+
const { createAIService } = await import('../../services/ai-service.js');
|
|
64
|
+
const aiService = createAIService();
|
|
65
|
+
const prompt = `You are a software project manager. Given a feature description, break it down into 2-6 actionable tasks.
|
|
66
|
+
|
|
67
|
+
Feature: ${description}
|
|
68
|
+
|
|
69
|
+
Return JSON with this structure:
|
|
70
|
+
{
|
|
71
|
+
"name": "Sprint name (3-5 words, no quotes)",
|
|
72
|
+
"goal": "One sentence describing the sprint goal",
|
|
73
|
+
"tasks": [
|
|
74
|
+
{ "title": "Task title (action-oriented)", "estimate": "2h", "priority": "HIGH" }
|
|
75
|
+
]
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
Guidelines:
|
|
79
|
+
- Sprint name should be concise and descriptive
|
|
80
|
+
- Each task should be completable in 1-4 hours
|
|
81
|
+
- Use CRITICAL/HIGH/MEDIUM/LOW for priority
|
|
82
|
+
- First task should enable the core feature
|
|
83
|
+
- Include a testing/validation task
|
|
84
|
+
- Estimates should be realistic (1h, 2h, 3h, 4h)`;
|
|
85
|
+
const plan = await aiService.extractJSON(prompt);
|
|
86
|
+
return plan;
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
console.error(chalk.dim('AI breakdown failed, using simple structure'));
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Create a simple sprint plan without AI
|
|
95
|
+
*/
|
|
96
|
+
function createSimpleSprintPlan(description) {
|
|
97
|
+
return {
|
|
98
|
+
name: description.slice(0, 50),
|
|
99
|
+
goal: description,
|
|
100
|
+
tasks: [
|
|
101
|
+
{ title: 'Implement core functionality', estimate: '2h', priority: 'HIGH' },
|
|
102
|
+
{ title: 'Test and validate', estimate: '1h', priority: 'MEDIUM' },
|
|
103
|
+
]
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
// =============================================================================
|
|
107
|
+
// Sprint Markdown Generation
|
|
108
|
+
// =============================================================================
|
|
109
|
+
/**
|
|
110
|
+
* Generate sprint markdown compatible with sync API
|
|
111
|
+
*/
|
|
112
|
+
function generateSprintMarkdown(sprintId, plan, userEmail) {
|
|
113
|
+
const today = new Date();
|
|
114
|
+
const endDate = new Date(today.getTime() + 14 * 24 * 60 * 60 * 1000);
|
|
115
|
+
const formatDate = (d) => d.toISOString().split('T')[0];
|
|
116
|
+
let markdown = `# SPRINT: ${plan.name}
|
|
117
|
+
|
|
118
|
+
## Sprint Overview
|
|
119
|
+
|
|
120
|
+
**Sprint Goal**: ${plan.goal}
|
|
121
|
+
**Duration**: ${formatDate(today)} to ${formatDate(endDate)}
|
|
122
|
+
**Type**: Feature
|
|
123
|
+
**Progress:** 0% (0/${plan.tasks.length} tasks complete)
|
|
124
|
+
**ID:** \`${sprintId}\`
|
|
125
|
+
|
|
126
|
+
**Success Criteria:**
|
|
127
|
+
- Feature implemented and tested
|
|
128
|
+
- Code reviewed and merged
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Sprint Tasks
|
|
133
|
+
|
|
134
|
+
`;
|
|
135
|
+
plan.tasks.forEach((task, i) => {
|
|
136
|
+
const taskNum = String(i + 1).padStart(2, '0');
|
|
137
|
+
const taskId = `${sprintId}_t${taskNum}`;
|
|
138
|
+
markdown += `### ${taskId}: ${task.title} (${task.estimate})
|
|
139
|
+
**Status:** [ ] Not Started
|
|
140
|
+
**Priority:** ${task.priority}
|
|
141
|
+
**Owner:** ${userEmail}
|
|
142
|
+
|
|
143
|
+
**Goal:** ${task.title}
|
|
144
|
+
|
|
145
|
+
**Acceptance Criteria:**
|
|
146
|
+
- [ ] Implementation complete
|
|
147
|
+
- [ ] Tests passing
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
`;
|
|
152
|
+
});
|
|
153
|
+
markdown += `## Related Documents
|
|
154
|
+
|
|
155
|
+
- **Epic**: Ad-Hoc Work
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
**Sprint Status**: Active
|
|
160
|
+
**Start Date**: ${formatDate(today)}
|
|
161
|
+
**Created By**: ${userEmail}
|
|
162
|
+
`;
|
|
163
|
+
return markdown;
|
|
164
|
+
}
|
|
165
|
+
// =============================================================================
|
|
166
|
+
// Main Command
|
|
167
|
+
// =============================================================================
|
|
168
|
+
/**
|
|
169
|
+
* Create a new feature sprint (conversational flow)
|
|
170
|
+
*/
|
|
171
|
+
export async function createSprintCommand(options = {}) {
|
|
172
|
+
// 1. Check prerequisites
|
|
173
|
+
if (!await isGraphInitialized()) {
|
|
174
|
+
console.log(chalk.yellow('Graph not initialized.'));
|
|
175
|
+
console.log(chalk.dim('Run `ginko graph init` to enable sprint tracking.'));
|
|
176
|
+
return { success: false, message: 'Graph not initialized' };
|
|
177
|
+
}
|
|
178
|
+
const graphId = await getGraphId();
|
|
179
|
+
if (!graphId) {
|
|
180
|
+
return { success: false, message: 'No graph ID found' };
|
|
181
|
+
}
|
|
182
|
+
// 2. Get feature description
|
|
183
|
+
const { description } = await prompts({
|
|
184
|
+
type: 'text',
|
|
185
|
+
name: 'description',
|
|
186
|
+
message: 'What are you building?',
|
|
187
|
+
validate: (value) => value.trim().length >= 10
|
|
188
|
+
? true
|
|
189
|
+
: 'Please describe your feature in more detail (10+ chars)',
|
|
190
|
+
});
|
|
191
|
+
if (!description) {
|
|
192
|
+
return { success: false, message: 'Cancelled' };
|
|
193
|
+
}
|
|
194
|
+
// 3. Break down into tasks
|
|
195
|
+
const spinner = ora('Breaking down into tasks...').start();
|
|
196
|
+
let plan;
|
|
197
|
+
const aiPlan = await breakdownFeatureWithAI(description);
|
|
198
|
+
if (aiPlan) {
|
|
199
|
+
plan = aiPlan;
|
|
200
|
+
spinner.succeed('Tasks generated');
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
plan = createSimpleSprintPlan(description);
|
|
204
|
+
spinner.info('Using simple task structure');
|
|
205
|
+
}
|
|
206
|
+
// 4. Display plan for confirmation
|
|
207
|
+
console.log('');
|
|
208
|
+
console.log(chalk.cyan('Sprint: ') + chalk.bold(plan.name));
|
|
209
|
+
console.log(chalk.dim('Goal: ') + plan.goal);
|
|
210
|
+
console.log('');
|
|
211
|
+
console.log(chalk.dim('Tasks:'));
|
|
212
|
+
plan.tasks.forEach((task, i) => {
|
|
213
|
+
console.log(chalk.dim(` ${i + 1}. ${task.title} (${task.estimate})`));
|
|
214
|
+
});
|
|
215
|
+
console.log('');
|
|
216
|
+
console.log(chalk.dim('This will be tracked under the Ad-Hoc Epic.'));
|
|
217
|
+
// 5. Confirm
|
|
218
|
+
const { action } = await prompts({
|
|
219
|
+
type: 'select',
|
|
220
|
+
name: 'action',
|
|
221
|
+
message: 'Look good?',
|
|
222
|
+
choices: [
|
|
223
|
+
{ title: 'Yes, create it', value: 'yes' },
|
|
224
|
+
{ title: 'Cancel', value: 'cancel' },
|
|
225
|
+
],
|
|
226
|
+
});
|
|
227
|
+
if (action !== 'yes') {
|
|
228
|
+
console.log(chalk.dim('Cancelled.'));
|
|
229
|
+
return { success: false, message: 'Cancelled by user' };
|
|
230
|
+
}
|
|
231
|
+
// 6. Generate sprint ID and markdown
|
|
232
|
+
const createSpinner = ora('Creating sprint...').start();
|
|
233
|
+
const sprintId = await generateNextAdhocSprintId(graphId);
|
|
234
|
+
const userEmail = await getUserEmail();
|
|
235
|
+
const markdown = generateSprintMarkdown(sprintId, plan, userEmail);
|
|
236
|
+
// 7. Sync to graph
|
|
237
|
+
try {
|
|
238
|
+
const client = new GraphApiClient();
|
|
239
|
+
await client.request('POST', '/api/v1/sprint/sync', { graphId, sprintContent: markdown });
|
|
240
|
+
// 8. Auto-assign sprint to user
|
|
241
|
+
await setUserCurrentSprint(createAssignmentFromSprintId(sprintId, plan.name));
|
|
242
|
+
// 9. Start first task
|
|
243
|
+
const firstTaskId = `${sprintId}_t01`;
|
|
244
|
+
try {
|
|
245
|
+
await client.updateTaskStatus(graphId, firstTaskId, 'in_progress');
|
|
246
|
+
}
|
|
247
|
+
catch {
|
|
248
|
+
// Non-critical - task might not have been created yet
|
|
249
|
+
}
|
|
250
|
+
createSpinner.succeed('Sprint created');
|
|
251
|
+
console.log('');
|
|
252
|
+
console.log(chalk.green(`✓ Created sprint ${chalk.bold(sprintId)} with ${plan.tasks.length} tasks`));
|
|
253
|
+
console.log(chalk.cyan(` Starting task 1: ${plan.tasks[0].title}`));
|
|
254
|
+
return {
|
|
255
|
+
success: true,
|
|
256
|
+
sprintId,
|
|
257
|
+
taskCount: plan.tasks.length,
|
|
258
|
+
message: 'Sprint created successfully'
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
catch (error) {
|
|
262
|
+
createSpinner.fail('Failed to create sprint');
|
|
263
|
+
console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
|
|
264
|
+
return { success: false, message: 'Failed to sync sprint to graph' };
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
// Export for CLI registration
|
|
268
|
+
export default createSprintCommand;
|
|
269
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/sprint/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/sprint/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/sprint/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAOtF;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,GAAE,MAAW,EAAE,OAAO,GAAE,GAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB/F;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,OAAO,CA4CvC;AAGD,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,CAAC;AAClD,YAAY,EAAE,aAAa,EAAE,CAAC;AAE9B,eAAe,aAAa,CAAC"}
|
|
@@ -12,6 +12,10 @@ import { Command } from 'commander';
|
|
|
12
12
|
import { SprintPipeline } from './sprint-pipeline.js';
|
|
13
13
|
import { EnhancedSprintPipeline } from './sprint-pipeline-enhanced.js';
|
|
14
14
|
import { createDepsCommand } from './deps.js';
|
|
15
|
+
import { createSprintStatusCommands, addSprintStatusShortcuts } from './status.js';
|
|
16
|
+
// EPIC-016 Sprint 4: Conversational sprint creation
|
|
17
|
+
import { createSprintCommand as createSprintAction } from './create.js';
|
|
18
|
+
import { createQuickFixTask } from './quick-fix.js';
|
|
15
19
|
/**
|
|
16
20
|
* Sprint command router
|
|
17
21
|
* Routes to enhanced pipeline by default (ADR-014 Safe Defaults)
|
|
@@ -52,6 +56,30 @@ export function sprintCommand() {
|
|
|
52
56
|
.action((intent, options) => sprintCommandAction(intent, options));
|
|
53
57
|
// Add subcommands (EPIC-004 Sprint 4)
|
|
54
58
|
sprint.addCommand(createDepsCommand());
|
|
59
|
+
// Add status commands (EPIC-015 Sprint 1)
|
|
60
|
+
sprint.addCommand(createSprintStatusCommands());
|
|
61
|
+
addSprintStatusShortcuts(sprint);
|
|
62
|
+
// EPIC-016 Sprint 4: Conversational sprint creation (t03)
|
|
63
|
+
sprint
|
|
64
|
+
.command('create')
|
|
65
|
+
.description('Create a new feature sprint (conversational)')
|
|
66
|
+
.option('--adhoc', 'Link to Ad-Hoc epic (default: true)')
|
|
67
|
+
.option('--epic <epicId>', 'Link to specific epic')
|
|
68
|
+
.action(async (options) => {
|
|
69
|
+
await createSprintAction(options);
|
|
70
|
+
});
|
|
71
|
+
// EPIC-016 Sprint 4: Quick-fix fast path (t04)
|
|
72
|
+
sprint
|
|
73
|
+
.command('quick-fix <description>')
|
|
74
|
+
.alias('qf')
|
|
75
|
+
.description('Create a single-task sprint for a quick fix')
|
|
76
|
+
.action(async (description) => {
|
|
77
|
+
const result = await createQuickFixTask(description);
|
|
78
|
+
if (result.success) {
|
|
79
|
+
console.log(`✓ Created: ${result.taskId} - ${description}`);
|
|
80
|
+
console.log(' Run `ginko task complete` when done.');
|
|
81
|
+
}
|
|
82
|
+
});
|
|
55
83
|
return sprint;
|
|
56
84
|
}
|
|
57
85
|
// Export both for direct usage
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/sprint/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAiB,MAAM,+BAA+B,CAAC;AACtF,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/sprint/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: command
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2026-01-26
|
|
5
|
+
* @tags: [sprint, quick-fix, single-task, epic-016-s04]
|
|
6
|
+
* @related: [index.ts, create.ts, ../../lib/planning-menu.ts]
|
|
7
|
+
* @priority: high
|
|
8
|
+
* @complexity: low
|
|
9
|
+
* @dependencies: [chalk, ora]
|
|
10
|
+
*/
|
|
11
|
+
export interface QuickFixResult {
|
|
12
|
+
success: boolean;
|
|
13
|
+
taskId?: string;
|
|
14
|
+
sprintId?: string;
|
|
15
|
+
message?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Create a quick-fix task with minimal ceremony
|
|
19
|
+
*
|
|
20
|
+
* @param description - One-line description of the fix
|
|
21
|
+
* @returns Result with task and sprint IDs
|
|
22
|
+
*/
|
|
23
|
+
export declare function createQuickFixTask(description: string): Promise<QuickFixResult>;
|
|
24
|
+
export default createQuickFixTask;
|
|
25
|
+
//# sourceMappingURL=quick-fix.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quick-fix.d.ts","sourceRoot":"","sources":["../../../src/commands/sprint/quick-fix.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA2BH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAkGD;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,cAAc,CAAC,CA2DzB;AAGD,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: command
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2026-01-26
|
|
5
|
+
* @tags: [sprint, quick-fix, single-task, epic-016-s04]
|
|
6
|
+
* @related: [index.ts, create.ts, ../../lib/planning-menu.ts]
|
|
7
|
+
* @priority: high
|
|
8
|
+
* @complexity: low
|
|
9
|
+
* @dependencies: [chalk, ora]
|
|
10
|
+
*/
|
|
11
|
+
import ora from 'ora';
|
|
12
|
+
import { getUserEmail } from '../../utils/helpers.js';
|
|
13
|
+
import { GraphApiClient } from '../graph/api-client.js';
|
|
14
|
+
import { getGraphId, isGraphInitialized } from '../graph/config.js';
|
|
15
|
+
import { setUserCurrentSprint, createAssignmentFromSprintId } from '../../lib/user-sprint.js';
|
|
16
|
+
// =============================================================================
|
|
17
|
+
// Sprint ID Generation
|
|
18
|
+
// =============================================================================
|
|
19
|
+
/**
|
|
20
|
+
* Generate the next ad-hoc sprint ID for today
|
|
21
|
+
* Format: adhoc_{YYMMDD}_s{NN}
|
|
22
|
+
*/
|
|
23
|
+
async function generateNextAdhocSprintId(graphId) {
|
|
24
|
+
const today = new Date();
|
|
25
|
+
const dateStr = `${String(today.getFullYear()).slice(2)}${String(today.getMonth() + 1).padStart(2, '0')}${String(today.getDate()).padStart(2, '0')}`;
|
|
26
|
+
const client = new GraphApiClient();
|
|
27
|
+
try {
|
|
28
|
+
const response = await client.request('GET', `/api/v1/sprint/list?graphId=${encodeURIComponent(graphId)}&prefix=adhoc_${dateStr}`);
|
|
29
|
+
const todayPrefix = `adhoc_${dateStr}_s`;
|
|
30
|
+
const existingNumbers = (response.sprints || [])
|
|
31
|
+
.map(s => s.id)
|
|
32
|
+
.filter(id => id.startsWith(todayPrefix))
|
|
33
|
+
.map(id => parseInt(id.replace(todayPrefix, ''), 10))
|
|
34
|
+
.filter(n => !isNaN(n));
|
|
35
|
+
const nextNum = existingNumbers.length > 0 ? Math.max(...existingNumbers) + 1 : 1;
|
|
36
|
+
return `adhoc_${dateStr}_s${String(nextNum).padStart(2, '0')}`;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return `adhoc_${dateStr}_s01`;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// =============================================================================
|
|
43
|
+
// Sprint Markdown Generation
|
|
44
|
+
// =============================================================================
|
|
45
|
+
/**
|
|
46
|
+
* Generate minimal sprint markdown for a single task
|
|
47
|
+
*/
|
|
48
|
+
function generateQuickFixMarkdown(sprintId, taskId, description, userEmail) {
|
|
49
|
+
const today = new Date();
|
|
50
|
+
const formatDate = (d) => d.toISOString().split('T')[0];
|
|
51
|
+
return `# SPRINT: Quick Fix - ${description.slice(0, 40)}
|
|
52
|
+
|
|
53
|
+
## Sprint Overview
|
|
54
|
+
|
|
55
|
+
**Sprint Goal**: ${description}
|
|
56
|
+
**Duration**: ${formatDate(today)} (1 task)
|
|
57
|
+
**Type**: Bugfix
|
|
58
|
+
**Progress:** 0% (0/1 tasks complete)
|
|
59
|
+
**ID:** \`${sprintId}\`
|
|
60
|
+
|
|
61
|
+
**Success Criteria:**
|
|
62
|
+
- Fix implemented and verified
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Sprint Tasks
|
|
67
|
+
|
|
68
|
+
### ${taskId}: ${description} (1h)
|
|
69
|
+
**Status:** [@] In Progress
|
|
70
|
+
**Priority:** HIGH
|
|
71
|
+
**Owner:** ${userEmail}
|
|
72
|
+
|
|
73
|
+
**Goal:** ${description}
|
|
74
|
+
|
|
75
|
+
**Acceptance Criteria:**
|
|
76
|
+
- [ ] Fix implemented
|
|
77
|
+
- [ ] Verified working
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Related Documents
|
|
82
|
+
|
|
83
|
+
- **Epic**: Ad-Hoc Work
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
**Sprint Status**: Active
|
|
88
|
+
**Start Date**: ${formatDate(today)}
|
|
89
|
+
**Created By**: ${userEmail}
|
|
90
|
+
`;
|
|
91
|
+
}
|
|
92
|
+
// =============================================================================
|
|
93
|
+
// Main Function
|
|
94
|
+
// =============================================================================
|
|
95
|
+
/**
|
|
96
|
+
* Create a quick-fix task with minimal ceremony
|
|
97
|
+
*
|
|
98
|
+
* @param description - One-line description of the fix
|
|
99
|
+
* @returns Result with task and sprint IDs
|
|
100
|
+
*/
|
|
101
|
+
export async function createQuickFixTask(description) {
|
|
102
|
+
// 1. Check prerequisites
|
|
103
|
+
if (!await isGraphInitialized()) {
|
|
104
|
+
return { success: false, message: 'Graph not initialized' };
|
|
105
|
+
}
|
|
106
|
+
const graphId = await getGraphId();
|
|
107
|
+
if (!graphId) {
|
|
108
|
+
return { success: false, message: 'No graph ID found' };
|
|
109
|
+
}
|
|
110
|
+
if (!description || description.trim().length < 5) {
|
|
111
|
+
return { success: false, message: 'Description too short' };
|
|
112
|
+
}
|
|
113
|
+
const spinner = ora('Creating quick-fix task...').start();
|
|
114
|
+
try {
|
|
115
|
+
// 2. Generate IDs
|
|
116
|
+
const sprintId = await generateNextAdhocSprintId(graphId);
|
|
117
|
+
const taskId = `${sprintId}_t01`;
|
|
118
|
+
const userEmail = await getUserEmail();
|
|
119
|
+
// 3. Generate markdown
|
|
120
|
+
const markdown = generateQuickFixMarkdown(sprintId, taskId, description.trim(), userEmail);
|
|
121
|
+
// 4. Sync to graph
|
|
122
|
+
const client = new GraphApiClient();
|
|
123
|
+
await client.request('POST', '/api/v1/sprint/sync', { graphId, sprintContent: markdown });
|
|
124
|
+
// 5. Auto-assign sprint
|
|
125
|
+
await setUserCurrentSprint(createAssignmentFromSprintId(sprintId, `Quick Fix: ${description.slice(0, 30)}`));
|
|
126
|
+
// 6. Start the task
|
|
127
|
+
try {
|
|
128
|
+
await client.updateTaskStatus(graphId, taskId, 'in_progress');
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
// Non-critical
|
|
132
|
+
}
|
|
133
|
+
spinner.succeed('Quick-fix task created');
|
|
134
|
+
return {
|
|
135
|
+
success: true,
|
|
136
|
+
taskId,
|
|
137
|
+
sprintId,
|
|
138
|
+
message: 'Quick-fix task created and started'
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
spinner.fail('Failed to create quick-fix task');
|
|
143
|
+
return {
|
|
144
|
+
success: false,
|
|
145
|
+
message: error instanceof Error ? error.message : 'Unknown error'
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Export for CLI registration
|
|
150
|
+
export default createQuickFixTask;
|
|
151
|
+
//# sourceMappingURL=quick-fix.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quick-fix.js","sourceRoot":"","sources":["../../../src/commands/sprint/quick-fix.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sprint-pipeline-enhanced.d.ts","sourceRoot":"","sources":["../../../src/commands/sprint/sprint-pipeline-enhanced.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,kBAAkB,EAAmB,MAAM,oCAAoC,CAAC;AAOzF;;GAEG;AACH,MAAM,WAAW,aAAa;IAE5B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IAGjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAqCD;;;;;;;;GAQG;AACH,qBAAa,sBAAuB,SAAQ,kBAAkB;IAC5D,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,QAAQ,CAAiB;gBAErB,MAAM,GAAE,MAA+B,EAAE,OAAO,GAAE,aAAkB;IAmChF;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAajC;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAkCnC;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAyDpC;;OAEG;IACH,eAAe,IAAI,IAAI;
|
|
1
|
+
{"version":3,"file":"sprint-pipeline-enhanced.d.ts","sourceRoot":"","sources":["../../../src/commands/sprint/sprint-pipeline-enhanced.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,kBAAkB,EAAmB,MAAM,oCAAoC,CAAC;AAOzF;;GAEG;AACH,MAAM,WAAW,aAAa;IAE5B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IAGjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAqCD;;;;;;;;GAQG;AACH,qBAAa,sBAAuB,SAAQ,kBAAkB;IAC5D,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,QAAQ,CAAiB;gBAErB,MAAM,GAAE,MAA+B,EAAE,OAAO,GAAE,aAAkB;IAmChF;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAajC;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAkCnC;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAyDpC;;OAEG;IACH,eAAe,IAAI,IAAI;IA6OvB;;OAEG;IACH,eAAe,IAAI,IAAI;IA6BvB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgC3B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IA+B9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA+BzB;;OAEG;YACW,mBAAmB;IAqCjC;;OAEG;YACW,oBAAoB;IAmClC;;OAEG;YACW,kBAAkB;IA+BhC;;OAEG;YACW,oBAAoB;IA4BlC;;OAEG;YACW,eAAe;IAyB7B;;OAEG;IACH,OAAO,CAAC,cAAc;IAStB;;OAEG;YACW,YAAY;IAqB1B;;OAEG;YACW,WAAW;IAUzB;;OAEG;YACW,eAAe;IAU7B;;OAEG;IACH,OAAO,CAAC,eAAe;IAsBvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAkC1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAQxB;;OAEG;YACW,eAAe;IAuB7B,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,SAAS;YAQH,iBAAiB;IAI/B,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,gBAAgB;YAMV,mBAAmB;IAejC;;OAEG;IACH,OAAO,CAAC,eAAe;CAYxB;AAED;;GAEG;AACH,qBAAa,+BAA+B;IAC1C,OAAO,CAAC,QAAQ,CAAyB;;IAMnC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,GAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAmBhE;AAED,eAAe,sBAAsB,CAAC"}
|
|
@@ -284,6 +284,43 @@ export class EnhancedSprintPipeline extends SimplePipelineBase {
|
|
|
284
284
|
});
|
|
285
285
|
}
|
|
286
286
|
sections.push('');
|
|
287
|
+
// Auto-generated UAT Task (e014_s02_t06)
|
|
288
|
+
sections.push(`### UAT & Polish (Final Task)\n`);
|
|
289
|
+
sections.push(`**Goal:** Verify sprint deliverables and ensure production readiness\n`);
|
|
290
|
+
// Generate testing checklist derived from sprint scope
|
|
291
|
+
const totalItems = (context.parsedIntent?.requestedItems?.length || 0) +
|
|
292
|
+
(context.backlogItems?.userStories?.length || 0) +
|
|
293
|
+
(context.backlogItems?.tasks?.length || 0);
|
|
294
|
+
// Scale UAT complexity based on sprint size
|
|
295
|
+
if (totalItems <= 3) {
|
|
296
|
+
// Small sprint: brief UAT
|
|
297
|
+
sections.push(`**Acceptance Criteria:**`);
|
|
298
|
+
sections.push(`- [ ] All sprint tasks completed and working`);
|
|
299
|
+
sections.push(`- [ ] Build passes with no errors`);
|
|
300
|
+
sections.push(`- [ ] Quick manual verification of changes`);
|
|
301
|
+
}
|
|
302
|
+
else if (totalItems <= 7) {
|
|
303
|
+
// Medium sprint: standard UAT
|
|
304
|
+
sections.push(`**Acceptance Criteria:**`);
|
|
305
|
+
sections.push(`- [ ] All sprint tasks completed and working`);
|
|
306
|
+
sections.push(`- [ ] Build passes with no errors`);
|
|
307
|
+
sections.push(`- [ ] Unit tests pass for new code`);
|
|
308
|
+
sections.push(`- [ ] Manual verification of each feature`);
|
|
309
|
+
sections.push(`- [ ] Documentation updated if needed`);
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
// Large sprint: detailed UAT
|
|
313
|
+
sections.push(`**Acceptance Criteria:**`);
|
|
314
|
+
sections.push(`- [ ] All sprint tasks completed and working`);
|
|
315
|
+
sections.push(`- [ ] Build passes with no errors or warnings`);
|
|
316
|
+
sections.push(`- [ ] Unit tests pass with adequate coverage`);
|
|
317
|
+
sections.push(`- [ ] Integration tests pass`);
|
|
318
|
+
sections.push(`- [ ] Manual verification of each feature`);
|
|
319
|
+
sections.push(`- [ ] Edge cases tested`);
|
|
320
|
+
sections.push(`- [ ] Documentation updated`);
|
|
321
|
+
sections.push(`- [ ] Performance acceptable`);
|
|
322
|
+
}
|
|
323
|
+
sections.push('');
|
|
287
324
|
// Acceptance Criteria
|
|
288
325
|
sections.push(`## ✅ Acceptance Criteria\n`);
|
|
289
326
|
sections.push(`- [ ] All committed items completed`);
|