@ginkoai/cli 2.1.0 → 2.1.2

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 (92) hide show
  1. package/dist/commands/graph/api-client.d.ts +36 -1
  2. package/dist/commands/graph/api-client.d.ts.map +1 -1
  3. package/dist/commands/graph/api-client.js +32 -2
  4. package/dist/commands/graph/api-client.js.map +1 -1
  5. package/dist/commands/graph/config.d.ts +6 -1
  6. package/dist/commands/graph/config.d.ts.map +1 -1
  7. package/dist/commands/graph/config.js +9 -1
  8. package/dist/commands/graph/config.js.map +1 -1
  9. package/dist/commands/graph/init.d.ts +1 -1
  10. package/dist/commands/graph/init.d.ts.map +1 -1
  11. package/dist/commands/graph/init.js +17 -2
  12. package/dist/commands/graph/init.js.map +1 -1
  13. package/dist/commands/handoff.d.ts +3 -3
  14. package/dist/commands/handoff.d.ts.map +1 -1
  15. package/dist/commands/handoff.js +32 -3
  16. package/dist/commands/handoff.js.map +1 -1
  17. package/dist/commands/nudging/index.d.ts +24 -0
  18. package/dist/commands/nudging/index.d.ts.map +1 -0
  19. package/dist/commands/nudging/index.js +175 -0
  20. package/dist/commands/nudging/index.js.map +1 -0
  21. package/dist/commands/sprint/create.d.ts +26 -0
  22. package/dist/commands/sprint/create.d.ts.map +1 -0
  23. package/dist/commands/sprint/create.js +269 -0
  24. package/dist/commands/sprint/create.js.map +1 -0
  25. package/dist/commands/sprint/index.d.ts.map +1 -1
  26. package/dist/commands/sprint/index.js +24 -0
  27. package/dist/commands/sprint/index.js.map +1 -1
  28. package/dist/commands/sprint/quick-fix.d.ts +25 -0
  29. package/dist/commands/sprint/quick-fix.d.ts.map +1 -0
  30. package/dist/commands/sprint/quick-fix.js +151 -0
  31. package/dist/commands/sprint/quick-fix.js.map +1 -0
  32. package/dist/commands/sprint/sprint-pipeline-enhanced.d.ts.map +1 -1
  33. package/dist/commands/sprint/sprint-pipeline-enhanced.js +37 -0
  34. package/dist/commands/sprint/sprint-pipeline-enhanced.js.map +1 -1
  35. package/dist/commands/sprint/status.d.ts.map +1 -1
  36. package/dist/commands/sprint/status.js +21 -1
  37. package/dist/commands/sprint/status.js.map +1 -1
  38. package/dist/commands/start/start-reflection.d.ts +14 -0
  39. package/dist/commands/start/start-reflection.d.ts.map +1 -1
  40. package/dist/commands/start/start-reflection.js +180 -9
  41. package/dist/commands/start/start-reflection.js.map +1 -1
  42. package/dist/commands/task/status.d.ts +3 -0
  43. package/dist/commands/task/status.d.ts.map +1 -1
  44. package/dist/commands/task/status.js +48 -1
  45. package/dist/commands/task/status.js.map +1 -1
  46. package/dist/commands/team/index.d.ts +5 -0
  47. package/dist/commands/team/index.d.ts.map +1 -1
  48. package/dist/commands/team/index.js +28 -0
  49. package/dist/commands/team/index.js.map +1 -1
  50. package/dist/commands/team/status.d.ts +16 -0
  51. package/dist/commands/team/status.d.ts.map +1 -0
  52. package/dist/commands/team/status.js +180 -0
  53. package/dist/commands/team/status.js.map +1 -0
  54. package/dist/index.js +10 -3
  55. package/dist/index.js.map +1 -1
  56. package/dist/lib/adoption-score.d.ts +69 -0
  57. package/dist/lib/adoption-score.d.ts.map +1 -0
  58. package/dist/lib/adoption-score.js +206 -0
  59. package/dist/lib/adoption-score.js.map +1 -0
  60. package/dist/lib/coaching-level.d.ts +127 -0
  61. package/dist/lib/coaching-level.d.ts.map +1 -0
  62. package/dist/lib/coaching-level.js +406 -0
  63. package/dist/lib/coaching-level.js.map +1 -0
  64. package/dist/lib/event-logger.d.ts +42 -0
  65. package/dist/lib/event-logger.d.ts.map +1 -1
  66. package/dist/lib/event-logger.js +77 -0
  67. package/dist/lib/event-logger.js.map +1 -1
  68. package/dist/lib/planning-menu.d.ts +69 -0
  69. package/dist/lib/planning-menu.d.ts.map +1 -0
  70. package/dist/lib/planning-menu.js +342 -0
  71. package/dist/lib/planning-menu.js.map +1 -0
  72. package/dist/lib/targeted-coaching.d.ts +71 -0
  73. package/dist/lib/targeted-coaching.d.ts.map +1 -0
  74. package/dist/lib/targeted-coaching.js +318 -0
  75. package/dist/lib/targeted-coaching.js.map +1 -0
  76. package/dist/lib/task-parser.d.ts +2 -0
  77. package/dist/lib/task-parser.d.ts.map +1 -1
  78. package/dist/lib/task-parser.js +23 -0
  79. package/dist/lib/task-parser.js.map +1 -1
  80. package/dist/lib/user-sprint.d.ts +53 -0
  81. package/dist/lib/user-sprint.d.ts.map +1 -1
  82. package/dist/lib/user-sprint.js +137 -2
  83. package/dist/lib/user-sprint.js.map +1 -1
  84. package/dist/lib/work-reconciliation.d.ts +59 -0
  85. package/dist/lib/work-reconciliation.d.ts.map +1 -0
  86. package/dist/lib/work-reconciliation.js +267 -0
  87. package/dist/lib/work-reconciliation.js.map +1 -0
  88. package/dist/utils/version-check.d.ts +26 -0
  89. package/dist/utils/version-check.d.ts.map +1 -0
  90. package/dist/utils/version-check.js +186 -0
  91. package/dist/utils/version-check.js.map +1 -0
  92. package/package.json +2 -2
@@ -0,0 +1,175 @@
1
+ /**
2
+ * @fileType: command-index
3
+ * @status: current
4
+ * @updated: 2026-01-26
5
+ * @tags: [cli, nudging, coaching, command, epic-016-s05]
6
+ * @related: [coaching-level.ts, adoption-score.ts]
7
+ * @priority: high
8
+ * @complexity: low
9
+ * @dependencies: [commander, chalk]
10
+ */
11
+ /**
12
+ * ginko nudging - Manual override for coaching intensity (EPIC-016 Sprint 5 Task 2)
13
+ *
14
+ * Usage:
15
+ * ginko nudging # View current level
16
+ * ginko nudging minimal # Set to minimal (expert mode)
17
+ * ginko nudging standard # Set to balanced guidance
18
+ * ginko nudging supportive # Set to extra help
19
+ * ginko nudging auto # Return to auto-adjustment
20
+ */
21
+ import { Command } from 'commander';
22
+ import chalk from 'chalk';
23
+ import { getCoachingContext, setCoachingOverride, } from '../../lib/coaching-level.js';
24
+ import { getGraphId } from '../graph/config.js';
25
+ import { logCoachingLevelChange } from '../../lib/event-logger.js';
26
+ // =============================================================================
27
+ // Level Descriptions
28
+ // =============================================================================
29
+ const LEVEL_INFO = {
30
+ minimal: {
31
+ emoji: '🚀',
32
+ label: 'Minimal',
33
+ description: 'Brief prompts, assume competence',
34
+ },
35
+ standard: {
36
+ emoji: '📋',
37
+ label: 'Standard',
38
+ description: 'Balanced guidance with context',
39
+ },
40
+ supportive: {
41
+ emoji: '🤝',
42
+ label: 'Supportive',
43
+ description: 'Detailed prompts with examples',
44
+ },
45
+ };
46
+ const SOURCE_LABELS = {
47
+ dashboard: 'Live dashboard insights',
48
+ cache: 'Cached insights',
49
+ adoption_fallback: 'Local adoption score (offline)',
50
+ };
51
+ // =============================================================================
52
+ // Display Helpers
53
+ // =============================================================================
54
+ function formatScore(score) {
55
+ if (score >= 75)
56
+ return chalk.green(`${score}`);
57
+ if (score >= 60)
58
+ return chalk.yellow(`${score}`);
59
+ return chalk.red(`${score}`);
60
+ }
61
+ function formatLevel(level) {
62
+ const info = LEVEL_INFO[level];
63
+ return `${info.emoji} ${info.label}`;
64
+ }
65
+ // =============================================================================
66
+ // View Command
67
+ // =============================================================================
68
+ async function viewNudgingStatus() {
69
+ const graphId = await getGraphId();
70
+ const context = await getCoachingContext(graphId || undefined);
71
+ console.log(chalk.cyan('\n🎯 Coaching Settings\n'));
72
+ // Current level
73
+ const levelInfo = LEVEL_INFO[context.level];
74
+ console.log(` Current level: ${formatLevel(context.level)}`);
75
+ console.log(chalk.dim(` ${levelInfo.description}`));
76
+ // Score info
77
+ console.log(`\n 7-day score: ${formatScore(context.overallScore)}/100`);
78
+ // Category breakdown
79
+ console.log(chalk.dim('\n Category Breakdown:'));
80
+ console.log(chalk.dim(` Session Efficiency: ${context.metrics.sessionEfficiency}`));
81
+ console.log(chalk.dim(` Pattern Adoption: ${context.metrics.patternAdoption}`));
82
+ console.log(chalk.dim(` Collaboration Quality: ${context.metrics.collaborationQuality}`));
83
+ console.log(chalk.dim(` Anti-Patterns: ${context.metrics.antiPatterns}`));
84
+ // Source
85
+ console.log(chalk.dim(`\n Data source: ${SOURCE_LABELS[context.source]}`));
86
+ if (context.cacheAge !== undefined) {
87
+ console.log(chalk.dim(` Cache age: ${context.cacheAge} minutes`));
88
+ }
89
+ // Override status
90
+ if (context.override) {
91
+ console.log(chalk.yellow(`\n ⚠️ Manual override active: ${context.override}`));
92
+ console.log(chalk.dim(' Run `ginko nudging auto` to return to auto-adjustment'));
93
+ }
94
+ else {
95
+ console.log(chalk.green('\n ✓ Auto-adjusting based on 7-day insights'));
96
+ }
97
+ console.log('');
98
+ }
99
+ // =============================================================================
100
+ // Set Command
101
+ // =============================================================================
102
+ async function setNudgingLevel(level) {
103
+ // Validate level
104
+ const validLevels = ['minimal', 'standard', 'supportive', 'auto'];
105
+ if (!validLevels.includes(level)) {
106
+ console.error(chalk.red(`\n✗ Invalid level: ${level}`));
107
+ console.error(chalk.dim(` Valid options: ${validLevels.join(', ')}`));
108
+ process.exit(1);
109
+ }
110
+ // Get previous level before changing
111
+ const graphId = await getGraphId();
112
+ const previousContext = await getCoachingContext(graphId || undefined);
113
+ const previousLevel = previousContext.level;
114
+ await setCoachingOverride(level);
115
+ if (level === 'auto') {
116
+ // Fetch current auto level
117
+ const context = await getCoachingContext(graphId || undefined);
118
+ console.log(chalk.green('\n✓ Coaching returned to auto-adjustment'));
119
+ console.log(` Current level: ${formatLevel(context.level)} (score: ${context.overallScore})`);
120
+ // EPIC-016 Sprint 5 t05: Log level change for feedback loop
121
+ logCoachingLevelChange(context.level, false, context.overallScore, previousLevel).catch(() => {
122
+ // Non-critical - don't fail on logging errors
123
+ });
124
+ }
125
+ else {
126
+ const info = LEVEL_INFO[level];
127
+ console.log(chalk.green(`\n✓ Coaching set to: ${info.emoji} ${info.label}`));
128
+ console.log(chalk.dim(` ${info.description}`));
129
+ console.log(chalk.dim('\n Override active until: ginko nudging auto'));
130
+ // EPIC-016 Sprint 5 t05: Log level change for feedback loop
131
+ logCoachingLevelChange(level, true, previousContext.overallScore, previousLevel).catch(() => {
132
+ // Non-critical - don't fail on logging errors
133
+ });
134
+ }
135
+ console.log('');
136
+ }
137
+ // =============================================================================
138
+ // Command Registration
139
+ // =============================================================================
140
+ export function nudgingCommand() {
141
+ const nudging = new Command('nudging')
142
+ .description('Configure coaching intensity (EPIC-016 Sprint 5)')
143
+ .argument('[level]', 'Set coaching level: minimal, standard, supportive, or auto')
144
+ .action(async (level) => {
145
+ try {
146
+ if (level) {
147
+ await setNudgingLevel(level);
148
+ }
149
+ else {
150
+ await viewNudgingStatus();
151
+ }
152
+ }
153
+ catch (error) {
154
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
155
+ process.exit(1);
156
+ }
157
+ });
158
+ // Add help examples
159
+ nudging.addHelpText('after', `
160
+ Examples:
161
+ $ ginko nudging # View current coaching level
162
+ $ ginko nudging minimal # Expert mode - brief prompts
163
+ $ ginko nudging standard # Balanced guidance
164
+ $ ginko nudging supportive # Extra help and examples
165
+ $ ginko nudging auto # Return to auto-adjustment
166
+
167
+ Levels are determined by your 7-day insight score:
168
+ ≥75 → Minimal (assume competence)
169
+ 60-74 → Standard (balanced guidance)
170
+ <60 → Supportive (detailed prompts)
171
+ `);
172
+ return nudging;
173
+ }
174
+ export default nudgingCommand;
175
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/nudging/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
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
+ export interface CreateSprintResult {
12
+ success: boolean;
13
+ sprintId?: string;
14
+ taskCount?: number;
15
+ message?: string;
16
+ }
17
+ interface CreateSprintOptions {
18
+ adhoc?: boolean;
19
+ epic?: string;
20
+ }
21
+ /**
22
+ * Create a new feature sprint (conversational flow)
23
+ */
24
+ export declare function createSprintCommand(options?: CreateSprintOptions): Promise<CreateSprintResult>;
25
+ export default createSprintCommand;
26
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/sprint/create.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAuCH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,mBAAmB;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAuKD;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CAiH7B;AAGD,eAAe,mBAAmB,CAAC"}
@@ -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;AAItF;;;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,CAqBvC;AAGD,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,CAAC;AAClD,YAAY,EAAE,aAAa,EAAE,CAAC;AAE9B,eAAe,aAAa,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"}
@@ -13,6 +13,9 @@ import { SprintPipeline } from './sprint-pipeline.js';
13
13
  import { EnhancedSprintPipeline } from './sprint-pipeline-enhanced.js';
14
14
  import { createDepsCommand } from './deps.js';
15
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';
16
19
  /**
17
20
  * Sprint command router
18
21
  * Routes to enhanced pipeline by default (ADR-014 Safe Defaults)
@@ -56,6 +59,27 @@ export function sprintCommand() {
56
59
  // Add status commands (EPIC-015 Sprint 1)
57
60
  sprint.addCommand(createSprintStatusCommands());
58
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
+ });
59
83
  return sprint;
60
84
  }
61
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;AAC9C,OAAO,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAEnF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,SAAiB,EAAE,EAAE,UAAe,EAAE;IAC9E,6CAA6C;IAC7C,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;QACvB,OAAO;IACT,CAAC;IAED,6CAA6C;IAC7C,MAAM,aAAa,GAAkB;QACnC,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,KAAK;QACzB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK;QAC7B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;QAC/B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;QAC/B,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK;QAC7B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;KAChC,CAAC;IAEF,MAAM,QAAQ,GAAG,IAAI,sBAAsB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACnE,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;SACjC,WAAW,CAAC,yCAAyC,CAAC;SACtD,QAAQ,CAAC,UAAU,EAAE,8BAA8B,CAAC;SACpD,MAAM,CAAC,SAAS,EAAE,oBAAoB,CAAC;SACvC,MAAM,CAAC,OAAO,EAAE,iCAAiC,CAAC;SAClD,MAAM,CAAC,SAAS,EAAE,gBAAgB,CAAC;SACnC,MAAM,CAAC,UAAU,EAAE,cAAc,CAAC;SAClC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC;SACjC,MAAM,CAAC,SAAS,EAAE,iBAAiB,CAAC;SACpC,MAAM,CAAC,UAAU,EAAE,mBAAmB,CAAC;SACvC,MAAM,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAErE,sCAAsC;IACtC,MAAM,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAEvC,0CAA0C;IAC1C,MAAM,CAAC,UAAU,CAAC,0BAA0B,EAAE,CAAC,CAAC;IAChD,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAEjC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+BAA+B;AAC/B,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,CAAC;AAGlD,eAAe,aAAa,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"}