@ginkoai/cli 2.0.6 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/dist/commands/epic/index.d.ts +29 -0
  2. package/dist/commands/epic/index.d.ts.map +1 -0
  3. package/dist/commands/epic/index.js +94 -0
  4. package/dist/commands/epic/index.js.map +1 -0
  5. package/dist/commands/epic/status.d.ts +40 -0
  6. package/dist/commands/epic/status.d.ts.map +1 -0
  7. package/dist/commands/epic/status.js +244 -0
  8. package/dist/commands/epic/status.js.map +1 -0
  9. package/dist/commands/graph/api-client.d.ts +221 -1
  10. package/dist/commands/graph/api-client.d.ts.map +1 -1
  11. package/dist/commands/graph/api-client.js +141 -2
  12. package/dist/commands/graph/api-client.js.map +1 -1
  13. package/dist/commands/graph/load.d.ts.map +1 -1
  14. package/dist/commands/graph/load.js +40 -2
  15. package/dist/commands/graph/load.js.map +1 -1
  16. package/dist/commands/handoff.d.ts +3 -3
  17. package/dist/commands/handoff.d.ts.map +1 -1
  18. package/dist/commands/handoff.js +32 -3
  19. package/dist/commands/handoff.js.map +1 -1
  20. package/dist/commands/migrate/index.d.ts +27 -0
  21. package/dist/commands/migrate/index.d.ts.map +1 -0
  22. package/dist/commands/migrate/index.js +76 -0
  23. package/dist/commands/migrate/index.js.map +1 -0
  24. package/dist/commands/migrate/status-migration.d.ts +58 -0
  25. package/dist/commands/migrate/status-migration.d.ts.map +1 -0
  26. package/dist/commands/migrate/status-migration.js +323 -0
  27. package/dist/commands/migrate/status-migration.js.map +1 -0
  28. package/dist/commands/nudging/index.d.ts +24 -0
  29. package/dist/commands/nudging/index.d.ts.map +1 -0
  30. package/dist/commands/nudging/index.js +175 -0
  31. package/dist/commands/nudging/index.js.map +1 -0
  32. package/dist/commands/sprint/create.d.ts +26 -0
  33. package/dist/commands/sprint/create.d.ts.map +1 -0
  34. package/dist/commands/sprint/create.js +269 -0
  35. package/dist/commands/sprint/create.js.map +1 -0
  36. package/dist/commands/sprint/index.d.ts.map +1 -1
  37. package/dist/commands/sprint/index.js +28 -0
  38. package/dist/commands/sprint/index.js.map +1 -1
  39. package/dist/commands/sprint/quick-fix.d.ts +25 -0
  40. package/dist/commands/sprint/quick-fix.d.ts.map +1 -0
  41. package/dist/commands/sprint/quick-fix.js +151 -0
  42. package/dist/commands/sprint/quick-fix.js.map +1 -0
  43. package/dist/commands/sprint/sprint-pipeline-enhanced.d.ts.map +1 -1
  44. package/dist/commands/sprint/sprint-pipeline-enhanced.js +37 -0
  45. package/dist/commands/sprint/sprint-pipeline-enhanced.js.map +1 -1
  46. package/dist/commands/sprint/status.d.ts +42 -0
  47. package/dist/commands/sprint/status.d.ts.map +1 -0
  48. package/dist/commands/sprint/status.js +298 -0
  49. package/dist/commands/sprint/status.js.map +1 -0
  50. package/dist/commands/start/start-reflection.d.ts +53 -0
  51. package/dist/commands/start/start-reflection.d.ts.map +1 -1
  52. package/dist/commands/start/start-reflection.js +464 -71
  53. package/dist/commands/start/start-reflection.js.map +1 -1
  54. package/dist/commands/sync/sprint-syncer.d.ts +19 -12
  55. package/dist/commands/sync/sprint-syncer.d.ts.map +1 -1
  56. package/dist/commands/sync/sprint-syncer.js +58 -140
  57. package/dist/commands/sync/sprint-syncer.js.map +1 -1
  58. package/dist/commands/sync/sync-command.d.ts.map +1 -1
  59. package/dist/commands/sync/sync-command.js +6 -18
  60. package/dist/commands/sync/sync-command.js.map +1 -1
  61. package/dist/commands/task/index.d.ts +25 -0
  62. package/dist/commands/task/index.d.ts.map +1 -0
  63. package/dist/commands/task/index.js +100 -0
  64. package/dist/commands/task/index.js.map +1 -0
  65. package/dist/commands/task/status.d.ts +46 -0
  66. package/dist/commands/task/status.d.ts.map +1 -0
  67. package/dist/commands/task/status.js +348 -0
  68. package/dist/commands/task/status.js.map +1 -0
  69. package/dist/commands/team/index.d.ts +5 -0
  70. package/dist/commands/team/index.d.ts.map +1 -1
  71. package/dist/commands/team/index.js +28 -0
  72. package/dist/commands/team/index.js.map +1 -1
  73. package/dist/commands/team/status.d.ts +16 -0
  74. package/dist/commands/team/status.d.ts.map +1 -0
  75. package/dist/commands/team/status.js +180 -0
  76. package/dist/commands/team/status.js.map +1 -0
  77. package/dist/index.js +21 -32
  78. package/dist/index.js.map +1 -1
  79. package/dist/lib/adoption-score.d.ts +69 -0
  80. package/dist/lib/adoption-score.d.ts.map +1 -0
  81. package/dist/lib/adoption-score.js +206 -0
  82. package/dist/lib/adoption-score.js.map +1 -0
  83. package/dist/lib/coaching-level.d.ts +127 -0
  84. package/dist/lib/coaching-level.d.ts.map +1 -0
  85. package/dist/lib/coaching-level.js +406 -0
  86. package/dist/lib/coaching-level.js.map +1 -0
  87. package/dist/lib/context-loader-events.d.ts.map +1 -1
  88. package/dist/lib/context-loader-events.js +7 -26
  89. package/dist/lib/context-loader-events.js.map +1 -1
  90. package/dist/lib/event-logger.d.ts +42 -0
  91. package/dist/lib/event-logger.d.ts.map +1 -1
  92. package/dist/lib/event-logger.js +77 -0
  93. package/dist/lib/event-logger.js.map +1 -1
  94. package/dist/lib/output-formatter.d.ts +8 -2
  95. package/dist/lib/output-formatter.d.ts.map +1 -1
  96. package/dist/lib/output-formatter.js +98 -18
  97. package/dist/lib/output-formatter.js.map +1 -1
  98. package/dist/lib/pending-updates.d.ts +148 -0
  99. package/dist/lib/pending-updates.d.ts.map +1 -0
  100. package/dist/lib/pending-updates.js +301 -0
  101. package/dist/lib/pending-updates.js.map +1 -0
  102. package/dist/lib/planning-menu.d.ts +69 -0
  103. package/dist/lib/planning-menu.d.ts.map +1 -0
  104. package/dist/lib/planning-menu.js +342 -0
  105. package/dist/lib/planning-menu.js.map +1 -0
  106. package/dist/lib/sprint-loader.d.ts +86 -14
  107. package/dist/lib/sprint-loader.d.ts.map +1 -1
  108. package/dist/lib/sprint-loader.js +293 -98
  109. package/dist/lib/sprint-loader.js.map +1 -1
  110. package/dist/lib/state-cache.d.ts +142 -0
  111. package/dist/lib/state-cache.d.ts.map +1 -0
  112. package/dist/lib/state-cache.js +259 -0
  113. package/dist/lib/state-cache.js.map +1 -0
  114. package/dist/lib/targeted-coaching.d.ts +71 -0
  115. package/dist/lib/targeted-coaching.d.ts.map +1 -0
  116. package/dist/lib/targeted-coaching.js +318 -0
  117. package/dist/lib/targeted-coaching.js.map +1 -0
  118. package/dist/lib/task-graph-sync.d.ts +105 -0
  119. package/dist/lib/task-graph-sync.d.ts.map +1 -0
  120. package/dist/lib/task-graph-sync.js +178 -0
  121. package/dist/lib/task-graph-sync.js.map +1 -0
  122. package/dist/lib/task-parser.d.ts +109 -0
  123. package/dist/lib/task-parser.d.ts.map +1 -0
  124. package/dist/lib/task-parser.js +407 -0
  125. package/dist/lib/task-parser.js.map +1 -0
  126. package/dist/lib/user-sprint.d.ts +53 -0
  127. package/dist/lib/user-sprint.d.ts.map +1 -1
  128. package/dist/lib/user-sprint.js +137 -2
  129. package/dist/lib/user-sprint.js.map +1 -1
  130. package/dist/lib/work-reconciliation.d.ts +59 -0
  131. package/dist/lib/work-reconciliation.d.ts.map +1 -0
  132. package/dist/lib/work-reconciliation.js +267 -0
  133. package/dist/lib/work-reconciliation.js.map +1 -0
  134. package/dist/templates/ai-instructions-template.d.ts.map +1 -1
  135. package/dist/templates/ai-instructions-template.js +7 -5
  136. package/dist/templates/ai-instructions-template.js.map +1 -1
  137. package/dist/templates/epic-template.md +0 -2
  138. package/dist/types/config.d.ts.map +1 -1
  139. package/dist/types/config.js +7 -5
  140. package/dist/types/config.js.map +1 -1
  141. package/dist/utils/synthesis.d.ts +4 -0
  142. package/dist/utils/synthesis.d.ts.map +1 -1
  143. package/dist/utils/synthesis.js +12 -18
  144. package/dist/utils/synthesis.js.map +1 -1
  145. package/dist/utils/version-check.d.ts +26 -0
  146. package/dist/utils/version-check.d.ts.map +1 -0
  147. package/dist/utils/version-check.js +186 -0
  148. package/dist/utils/version-check.js.map +1 -0
  149. package/package.json +2 -2
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @fileType: command
3
+ * @status: current
4
+ * @updated: 2026-01-19
5
+ * @tags: [cli, epic, status, graph-authoritative, epic-015]
6
+ * @related: [status.ts, ../graph/api-client.ts]
7
+ * @priority: high
8
+ * @complexity: medium
9
+ * @dependencies: [commander, chalk]
10
+ */
11
+ import { Command } from 'commander';
12
+ /**
13
+ * Epic command with status management and legacy functionality
14
+ * EPIC-015 Sprint 1: CLI Status Commands
15
+ *
16
+ * Usage:
17
+ * ginko epic Create new epic (default)
18
+ * ginko epic --list List existing epics
19
+ * ginko epic --view View epic details
20
+ * ginko epic --sync Sync epic to graph
21
+ * ginko epic start <id> Start epic
22
+ * ginko epic complete <id> Complete epic
23
+ * ginko epic pause <id> Pause epic
24
+ * ginko epic status show <id> Show epic status
25
+ */
26
+ export declare function epicStatusCommand(): Command;
27
+ export { epicExamples } from '../epic.js';
28
+ export default epicStatusCommand;
29
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/epic/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,YAgEhC;AAGD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * @fileType: command
3
+ * @status: current
4
+ * @updated: 2026-01-19
5
+ * @tags: [cli, epic, status, graph-authoritative, epic-015]
6
+ * @related: [status.ts, ../graph/api-client.ts]
7
+ * @priority: high
8
+ * @complexity: medium
9
+ * @dependencies: [commander, chalk]
10
+ */
11
+ import { Command } from 'commander';
12
+ import chalk from 'chalk';
13
+ import { epicCommand as legacyEpicCommand, epicExamples } from '../epic.js';
14
+ import { createEpicStatusCommands, addEpicStatusShortcuts } from './status.js';
15
+ /**
16
+ * Epic command with status management and legacy functionality
17
+ * EPIC-015 Sprint 1: CLI Status Commands
18
+ *
19
+ * Usage:
20
+ * ginko epic Create new epic (default)
21
+ * ginko epic --list List existing epics
22
+ * ginko epic --view View epic details
23
+ * ginko epic --sync Sync epic to graph
24
+ * ginko epic start <id> Start epic
25
+ * ginko epic complete <id> Complete epic
26
+ * ginko epic pause <id> Pause epic
27
+ * ginko epic status show <id> Show epic status
28
+ */
29
+ export function epicStatusCommand() {
30
+ const epic = new Command('epic')
31
+ .description('Create and manage epics with status tracking (EPIC-015)')
32
+ .option('--list', 'List existing epics')
33
+ .option('--view', 'View epic details')
34
+ .option('--sync', 'Sync epic to graph database')
35
+ .option('--no-ai', 'Run interactive mode instead of AI-mediated')
36
+ .option('--examples', 'Show epic command examples')
37
+ .addHelpText('after', `
38
+ ${chalk.gray('Creation & Management:')}
39
+ ${chalk.green('ginko epic')} ${chalk.dim('Create new epic via AI conversation')}
40
+ ${chalk.green('ginko epic --list')} ${chalk.dim('List existing epics')}
41
+ ${chalk.green('ginko epic --view')} ${chalk.dim('View epic details with sprints')}
42
+ ${chalk.green('ginko epic --sync')} ${chalk.dim('Sync epic to graph database')}
43
+
44
+ ${chalk.gray('Status Commands:')}
45
+ ${chalk.green('ginko epic start')} <id> ${chalk.dim('Start epic (proposed -> active)')}
46
+ ${chalk.green('ginko epic complete')} <id> ${chalk.dim('Complete epic (active -> complete)')}
47
+ ${chalk.green('ginko epic pause')} <id> ${chalk.dim('Pause epic (active -> paused)')}
48
+ ${chalk.green('ginko epic status show')} <id> ${chalk.dim('Show current epic status')}
49
+
50
+ ${chalk.gray('ID Formats:')}
51
+ ${chalk.dim('EPIC-015, e015, E015 - all accepted')}
52
+
53
+ ${chalk.gray('Valid Epic Statuses:')}
54
+ ${chalk.dim('proposed - Epic under consideration (default)')}
55
+ ${chalk.dim('active - Epic in progress')}
56
+ ${chalk.dim('paused - Epic temporarily on hold')}
57
+ ${chalk.dim('complete - Epic finished')}
58
+
59
+ ${chalk.gray('Examples:')}
60
+ ${chalk.green('ginko epic')}
61
+ ${chalk.green('ginko epic start EPIC-015')}
62
+ ${chalk.green('ginko epic complete e015')}
63
+ `)
64
+ .action(async (options) => {
65
+ // Handle --examples flag
66
+ if (options.examples) {
67
+ console.log(chalk.green('\n📋 Epic Command Examples:\n'));
68
+ epicExamples.forEach((example) => {
69
+ console.log(chalk.dim(` ${example}`));
70
+ });
71
+ // Add status examples
72
+ console.log(chalk.dim(' ginko epic start EPIC-015 # Start epic'));
73
+ console.log(chalk.dim(' ginko epic complete e015 # Complete epic'));
74
+ console.log(chalk.dim(' ginko epic pause EPIC-015 # Pause epic'));
75
+ console.log('');
76
+ return;
77
+ }
78
+ // Delegate to legacy command for create/list/view/sync
79
+ await legacyEpicCommand({
80
+ view: options.view,
81
+ list: options.list,
82
+ sync: options.sync,
83
+ noAi: !options.ai, // Commander handles --no-ai as options.ai = false
84
+ });
85
+ });
86
+ // Add status commands (EPIC-015 Sprint 1)
87
+ epic.addCommand(createEpicStatusCommands());
88
+ addEpicStatusShortcuts(epic);
89
+ return epic;
90
+ }
91
+ // Re-export for compatibility
92
+ export { epicExamples } from '../epic.js';
93
+ export default epicStatusCommand;
94
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/epic/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * @fileType: command
3
+ * @status: current
4
+ * @updated: 2026-01-19
5
+ * @tags: [cli, epic, 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 { Command } from 'commander';
12
+ interface EpicStatusOptions {
13
+ verbose?: boolean;
14
+ }
15
+ /**
16
+ * Start epic (proposed -> active)
17
+ */
18
+ declare function startEpicCommand(epicId: string, options?: EpicStatusOptions): Promise<void>;
19
+ /**
20
+ * Complete epic (active -> complete)
21
+ */
22
+ declare function completeEpicCommand(epicId: string, options?: EpicStatusOptions): Promise<void>;
23
+ /**
24
+ * Pause epic (active -> paused)
25
+ */
26
+ declare function pauseEpicCommand(epicId: string, options?: EpicStatusOptions): Promise<void>;
27
+ /**
28
+ * Show epic status
29
+ */
30
+ declare function showEpicCommand(epicId: string, options?: EpicStatusOptions): Promise<void>;
31
+ /**
32
+ * Create epic status subcommand group
33
+ */
34
+ export declare function createEpicStatusCommands(): Command;
35
+ /**
36
+ * Create shortcut commands for epic status (without "status" prefix)
37
+ */
38
+ export declare function addEpicStatusShortcuts(epic: Command): void;
39
+ export { startEpicCommand, completeEpicCommand, pauseEpicCommand, showEpicCommand, };
40
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/epic/status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8EpC,UAAU,iBAAiB;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,iBAAe,gBAAgB,CAC7B,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED;;GAEG;AACH,iBAAe,mBAAmB,CAChC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED;;GAEG;AACH,iBAAe,gBAAgB,CAC7B,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED;;GAEG;AACH,iBAAe,eAAe,CAC5B,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAYf;AAMD;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAqDlD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAkB1D;AAED,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,GAChB,CAAC"}
@@ -0,0 +1,244 @@
1
+ /**
2
+ * @fileType: command
3
+ * @status: current
4
+ * @updated: 2026-01-19
5
+ * @tags: [cli, epic, 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 { Command } from 'commander';
12
+ import chalk from 'chalk';
13
+ import { GraphApiClient } from '../graph/api-client.js';
14
+ import { getGraphId } from '../graph/config.js';
15
+ // =============================================================================
16
+ // Helpers
17
+ // =============================================================================
18
+ /**
19
+ * Get graph ID from config
20
+ */
21
+ async function requireGraphId() {
22
+ const graphId = process.env.GINKO_GRAPH_ID || await getGraphId();
23
+ if (!graphId) {
24
+ console.error(chalk.red('✗ Graph not initialized'));
25
+ console.error(chalk.dim(' Run `ginko graph init` first'));
26
+ process.exit(1);
27
+ }
28
+ return graphId;
29
+ }
30
+ /**
31
+ * Normalize epic ID
32
+ * Supports: EPIC-015, e015, E015
33
+ */
34
+ function normalizeEpicId(epicId) {
35
+ // Already in e format
36
+ if (/^e\d+$/i.test(epicId)) {
37
+ return epicId.toLowerCase();
38
+ }
39
+ // EPIC-NNN format
40
+ const match = epicId.match(/^EPIC-?(\d+)$/i);
41
+ if (match) {
42
+ return `e${match[1].padStart(3, '0')}`;
43
+ }
44
+ // Return as-is
45
+ return epicId;
46
+ }
47
+ function formatStatus(status) {
48
+ switch (status) {
49
+ case 'complete':
50
+ return chalk.green('✓ complete');
51
+ case 'active':
52
+ return chalk.cyan('▶ active');
53
+ case 'paused':
54
+ return chalk.yellow('⏸ paused');
55
+ case 'proposed':
56
+ default:
57
+ return chalk.dim('○ proposed');
58
+ }
59
+ }
60
+ function handleError(action, epicId, error) {
61
+ if (error instanceof Error) {
62
+ if (error.message.includes('EPIC_NOT_FOUND') || error.message.includes('not found')) {
63
+ console.error(chalk.red(`✗ Epic not found: ${epicId}`));
64
+ console.error(chalk.dim(' Make sure the epic ID is correct and exists in the graph'));
65
+ }
66
+ else if (error.message.includes('AUTH_REQUIRED')) {
67
+ console.error(chalk.red('✗ Authentication required'));
68
+ console.error(chalk.dim(' Run `ginko login` first'));
69
+ }
70
+ else if (error.message.includes('SERVICE_UNAVAILABLE')) {
71
+ console.error(chalk.red('✗ Graph database unavailable'));
72
+ console.error(chalk.dim(' Please try again later'));
73
+ }
74
+ else {
75
+ console.error(chalk.red(`✗ Failed to ${action} epic: ${error.message}`));
76
+ }
77
+ }
78
+ else {
79
+ console.error(chalk.red(`✗ Failed to ${action} epic`));
80
+ }
81
+ process.exit(1);
82
+ }
83
+ /**
84
+ * Start epic (proposed -> active)
85
+ */
86
+ async function startEpicCommand(epicId, options = {}) {
87
+ const graphId = await requireGraphId();
88
+ const client = new GraphApiClient();
89
+ const normalizedId = normalizeEpicId(epicId);
90
+ try {
91
+ const current = await client.getEpicStatus(graphId, normalizedId);
92
+ if (current.status === 'active') {
93
+ console.log(chalk.yellow(`Epic ${epicId} is already active (no change)`));
94
+ return;
95
+ }
96
+ const response = await client.updateEpicStatus(graphId, normalizedId, 'active');
97
+ console.log(chalk.cyan(`▶ Epic ${epicId} started`));
98
+ if (response.epic.title) {
99
+ console.log(chalk.dim(` "${response.epic.title}"`));
100
+ }
101
+ }
102
+ catch (error) {
103
+ handleError('start', epicId, error);
104
+ }
105
+ }
106
+ /**
107
+ * Complete epic (active -> complete)
108
+ */
109
+ async function completeEpicCommand(epicId, options = {}) {
110
+ const graphId = await requireGraphId();
111
+ const client = new GraphApiClient();
112
+ const normalizedId = normalizeEpicId(epicId);
113
+ try {
114
+ const current = await client.getEpicStatus(graphId, normalizedId);
115
+ if (current.status === 'complete') {
116
+ console.log(chalk.yellow(`Epic ${epicId} is already complete (no change)`));
117
+ return;
118
+ }
119
+ const response = await client.updateEpicStatus(graphId, normalizedId, 'complete');
120
+ console.log(chalk.green(`✓ Epic ${epicId} marked complete`));
121
+ if (response.epic.title) {
122
+ console.log(chalk.dim(` "${response.epic.title}"`));
123
+ }
124
+ }
125
+ catch (error) {
126
+ handleError('complete', epicId, error);
127
+ }
128
+ }
129
+ /**
130
+ * Pause epic (active -> paused)
131
+ */
132
+ async function pauseEpicCommand(epicId, options = {}) {
133
+ const graphId = await requireGraphId();
134
+ const client = new GraphApiClient();
135
+ const normalizedId = normalizeEpicId(epicId);
136
+ try {
137
+ const current = await client.getEpicStatus(graphId, normalizedId);
138
+ if (current.status === 'paused') {
139
+ console.log(chalk.yellow(`Epic ${epicId} is already paused (no change)`));
140
+ return;
141
+ }
142
+ const response = await client.updateEpicStatus(graphId, normalizedId, 'paused');
143
+ console.log(chalk.yellow(`⏸ Epic ${epicId} paused`));
144
+ if (response.epic.title) {
145
+ console.log(chalk.dim(` "${response.epic.title}"`));
146
+ }
147
+ }
148
+ catch (error) {
149
+ handleError('pause', epicId, error);
150
+ }
151
+ }
152
+ /**
153
+ * Show epic status
154
+ */
155
+ async function showEpicCommand(epicId, options = {}) {
156
+ const graphId = await requireGraphId();
157
+ const client = new GraphApiClient();
158
+ const normalizedId = normalizeEpicId(epicId);
159
+ try {
160
+ const status = await client.getEpicStatus(graphId, normalizedId);
161
+ console.log(chalk.bold(`Epic: ${epicId}`));
162
+ console.log(`Status: ${formatStatus(status.status)}`);
163
+ }
164
+ catch (error) {
165
+ handleError('show', epicId, error);
166
+ }
167
+ }
168
+ // =============================================================================
169
+ // Command Factory
170
+ // =============================================================================
171
+ /**
172
+ * Create epic status subcommand group
173
+ */
174
+ export function createEpicStatusCommands() {
175
+ const status = new Command('status')
176
+ .description('Epic status management (EPIC-015)')
177
+ .addHelpText('after', `
178
+ ${chalk.gray('Commands:')}
179
+ ${chalk.green('ginko epic status start')} <id> ${chalk.dim('Start epic (proposed -> active)')}
180
+ ${chalk.green('ginko epic status complete')} <id> ${chalk.dim('Complete epic (active -> complete)')}
181
+ ${chalk.green('ginko epic status pause')} <id> ${chalk.dim('Pause epic (active -> paused)')}
182
+ ${chalk.green('ginko epic status show')} <id> ${chalk.dim('Show current epic status')}
183
+
184
+ ${chalk.gray('Shortcuts (without "status"):')}
185
+ ${chalk.green('ginko epic start')} <id>
186
+ ${chalk.green('ginko epic complete')} <id>
187
+ ${chalk.green('ginko epic pause')} <id>
188
+
189
+ ${chalk.gray('ID Formats:')}
190
+ ${chalk.dim('EPIC-015, e015, E015 - all accepted')}
191
+
192
+ ${chalk.gray('Valid Epic Statuses:')}
193
+ ${chalk.dim('proposed - Epic under consideration (default)')}
194
+ ${chalk.dim('active - Epic in progress')}
195
+ ${chalk.dim('paused - Epic temporarily on hold')}
196
+ ${chalk.dim('complete - Epic finished')}
197
+ `)
198
+ .action(() => {
199
+ status.help({ error: false });
200
+ });
201
+ status
202
+ .command('start <epicId>')
203
+ .description('Start epic (proposed -> active)')
204
+ .option('-v, --verbose', 'Show detailed output')
205
+ .action(startEpicCommand);
206
+ status
207
+ .command('complete <epicId>')
208
+ .description('Complete epic')
209
+ .option('-v, --verbose', 'Show detailed output')
210
+ .action(completeEpicCommand);
211
+ status
212
+ .command('pause <epicId>')
213
+ .description('Pause epic (active -> paused)')
214
+ .option('-v, --verbose', 'Show detailed output')
215
+ .action(pauseEpicCommand);
216
+ status
217
+ .command('show <epicId>')
218
+ .description('Show epic status')
219
+ .option('-v, --verbose', 'Show detailed output')
220
+ .action(showEpicCommand);
221
+ return status;
222
+ }
223
+ /**
224
+ * Create shortcut commands for epic status (without "status" prefix)
225
+ */
226
+ export function addEpicStatusShortcuts(epic) {
227
+ epic
228
+ .command('start <epicId>')
229
+ .description('Start epic (shortcut for status start)')
230
+ .option('-v, --verbose', 'Show detailed output')
231
+ .action(startEpicCommand);
232
+ epic
233
+ .command('complete <epicId>')
234
+ .description('Complete epic (shortcut for status complete)')
235
+ .option('-v, --verbose', 'Show detailed output')
236
+ .action(completeEpicCommand);
237
+ epic
238
+ .command('pause <epicId>')
239
+ .description('Pause epic (shortcut for status pause)')
240
+ .option('-v, --verbose', 'Show detailed output')
241
+ .action(pauseEpicCommand);
242
+ }
243
+ export { startEpicCommand, completeEpicCommand, pauseEpicCommand, showEpicCommand, };
244
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/epic/status.ts"],"names":[],"mappings":"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"}
@@ -325,7 +325,130 @@ export declare class GraphApiClient {
325
325
  * @param graphId - Graph namespace identifier
326
326
  * @returns Active sprint with tasks and statistics
327
327
  */
328
- getActiveSprint(graphId: string): Promise<ActiveSprintResponse>;
328
+ getActiveSprint(graphId: string, preferredSprintId?: string): Promise<ActiveSprintResponse>;
329
+ /**
330
+ * Sync tasks to graph (EPIC-015 Sprint 0a)
331
+ * Creates or updates Task nodes with BELONGS_TO relationships
332
+ *
333
+ * Key principle (ADR-060): Content from Git, State from Graph.
334
+ * - On CREATE: Uses initial_status from markdown
335
+ * - On UPDATE: Preserves existing status (graph-authoritative)
336
+ *
337
+ * @param graphId - Graph namespace identifier
338
+ * @param tasks - Array of parsed tasks
339
+ * @param createRelationships - Whether to create BELONGS_TO relationships
340
+ * @returns Sync response with counts
341
+ */
342
+ syncTasks(graphId: string, tasks: TaskSyncInput[], createRelationships?: boolean): Promise<TaskSyncResponse>;
343
+ /**
344
+ * Get tasks from graph (EPIC-015 Sprint 0a)
345
+ *
346
+ * @param graphId - Graph namespace identifier
347
+ * @param filters - Optional filters (sprintId, epicId)
348
+ * @returns Array of task objects
349
+ */
350
+ getTasks(graphId: string, filters?: {
351
+ sprintId?: string;
352
+ epicId?: string;
353
+ }): Promise<TaskFromGraph[]>;
354
+ /**
355
+ * Update task status in graph (EPIC-015 Sprint 1)
356
+ * Updates status directly in Neo4j, emits status change event
357
+ *
358
+ * @param graphId - Graph namespace identifier
359
+ * @param taskId - Task ID to update
360
+ * @param status - New status value
361
+ * @param reason - Required for 'blocked' status
362
+ * @returns Updated task info with previous status
363
+ */
364
+ updateTaskStatus(graphId: string, taskId: string, status: TaskStatus, reason?: string): Promise<TaskStatusResponse>;
365
+ /**
366
+ * Get task status from graph (EPIC-015 Sprint 1)
367
+ *
368
+ * @param graphId - Graph namespace identifier
369
+ * @param taskId - Task ID to query
370
+ * @returns Current task status
371
+ */
372
+ getTaskStatus(graphId: string, taskId: string): Promise<{
373
+ id: string;
374
+ status: TaskStatus;
375
+ blocked_reason?: string;
376
+ }>;
377
+ /**
378
+ * Record user activity in graph (EPIC-016 Sprint 3)
379
+ *
380
+ * @param graphId - Graph namespace identifier
381
+ * @param activityType - Type of activity being recorded
382
+ * @returns Activity response with timestamp
383
+ */
384
+ recordActivity(graphId: string, activityType: 'session_start' | 'task_start' | 'task_complete' | 'task_block' | 'event_logged'): Promise<{
385
+ success: boolean;
386
+ lastActivityAt: string;
387
+ }>;
388
+ /**
389
+ * Update sprint status in graph (EPIC-015 Sprint 1)
390
+ *
391
+ * @param graphId - Graph namespace identifier
392
+ * @param sprintId - Sprint ID to update
393
+ * @param status - New status value
394
+ * @returns Updated sprint info with previous status
395
+ */
396
+ updateSprintStatus(graphId: string, sprintId: string, status: SprintStatus): Promise<SprintStatusResponse>;
397
+ /**
398
+ * Get sprint status from graph (EPIC-015 Sprint 1)
399
+ *
400
+ * @param graphId - Graph namespace identifier
401
+ * @param sprintId - Sprint ID to query
402
+ * @returns Current sprint status
403
+ */
404
+ getSprintStatus(graphId: string, sprintId: string): Promise<{
405
+ id: string;
406
+ status: SprintStatus;
407
+ }>;
408
+ /**
409
+ * Update epic status in graph (EPIC-015 Sprint 1)
410
+ *
411
+ * @param graphId - Graph namespace identifier
412
+ * @param epicId - Epic ID to update
413
+ * @param status - New status value
414
+ * @returns Updated epic info with previous status
415
+ */
416
+ updateEpicStatus(graphId: string, epicId: string, status: EpicStatus): Promise<EpicStatusResponse>;
417
+ /**
418
+ * Get epic status from graph (EPIC-015 Sprint 1)
419
+ *
420
+ * @param graphId - Graph namespace identifier
421
+ * @param epicId - Epic ID to query
422
+ * @returns Current epic status
423
+ */
424
+ getEpicStatus(graphId: string, epicId: string): Promise<{
425
+ id: string;
426
+ status: EpicStatus;
427
+ }>;
428
+ /**
429
+ * Get all tasks in a sprint (for cascade completion checks)
430
+ *
431
+ * @param graphId - Graph namespace identifier
432
+ * @param sprintId - Sprint ID to query
433
+ * @returns Array of tasks with status
434
+ */
435
+ getSprintTasks(graphId: string, sprintId: string): Promise<Array<{
436
+ id: string;
437
+ title: string;
438
+ status: string;
439
+ }>>;
440
+ /**
441
+ * Get all sprints in an epic (for cascade completion checks)
442
+ *
443
+ * @param graphId - Graph namespace identifier
444
+ * @param epicId - Epic ID to query
445
+ * @returns Array of sprints with status
446
+ */
447
+ getEpicSprints(graphId: string, epicId: string): Promise<Array<{
448
+ id: string;
449
+ name: string;
450
+ status: string;
451
+ }>>;
329
452
  }
330
453
  /**
331
454
  * Gotcha encounter response (EPIC-002 Sprint 3 TASK-4)
@@ -564,6 +687,103 @@ export interface ActiveSprintResponse {
564
687
  timestamp: string;
565
688
  };
566
689
  }
690
+ /**
691
+ * Task sync input for API (EPIC-015 Sprint 0a)
692
+ */
693
+ export interface TaskSyncInput {
694
+ id: string;
695
+ sprint_id: string;
696
+ epic_id: string;
697
+ title: string;
698
+ estimate: string | null;
699
+ priority: 'CRITICAL' | 'HIGH' | 'MEDIUM' | 'LOW';
700
+ assignee: string | null;
701
+ initial_status: 'not_started' | 'in_progress' | 'blocked' | 'complete' | 'paused';
702
+ goal: string | null;
703
+ acceptance_criteria: string[];
704
+ files: string[];
705
+ related_adrs: string[];
706
+ }
707
+ /**
708
+ * Task sync response (EPIC-015 Sprint 0a)
709
+ */
710
+ export interface TaskSyncResponse {
711
+ success: boolean;
712
+ created: number;
713
+ updated: number;
714
+ relationships: number;
715
+ tasks: string[];
716
+ }
717
+ /**
718
+ * Task retrieved from graph (EPIC-015 Sprint 0a)
719
+ */
720
+ export interface TaskFromGraph {
721
+ id: string;
722
+ title: string;
723
+ status: string;
724
+ priority: string;
725
+ sprint_id: string;
726
+ epic_id: string;
727
+ estimate: string | null;
728
+ assignee: string | null;
729
+ goal: string | null;
730
+ synced_at: string | null;
731
+ }
732
+ /**
733
+ * Task status values (graph-authoritative)
734
+ */
735
+ export type TaskStatus = 'not_started' | 'in_progress' | 'blocked' | 'complete';
736
+ /**
737
+ * Sprint status values
738
+ */
739
+ export type SprintStatus = 'planned' | 'active' | 'paused' | 'complete';
740
+ /**
741
+ * Epic status values
742
+ */
743
+ export type EpicStatus = 'proposed' | 'active' | 'paused' | 'complete';
744
+ /**
745
+ * Task status update response
746
+ */
747
+ export interface TaskStatusResponse {
748
+ success: boolean;
749
+ task: {
750
+ id: string;
751
+ title?: string;
752
+ status: TaskStatus;
753
+ status_updated_at: string;
754
+ status_updated_by: string;
755
+ blocked_reason?: string;
756
+ };
757
+ previous_status: string;
758
+ }
759
+ /**
760
+ * Sprint status update response
761
+ */
762
+ export interface SprintStatusResponse {
763
+ success: boolean;
764
+ sprint: {
765
+ id: string;
766
+ name?: string;
767
+ status: SprintStatus;
768
+ status_updated_at: string;
769
+ status_updated_by: string;
770
+ };
771
+ previous_status: string;
772
+ }
773
+ /**
774
+ * Epic status update response
775
+ */
776
+ export interface EpicStatusResponse {
777
+ success: boolean;
778
+ epic: {
779
+ id: string;
780
+ title?: string;
781
+ status: EpicStatus;
782
+ status_updated_at: string;
783
+ status_updated_by: string;
784
+ };
785
+ previous_status: string;
786
+ }
567
787
  /**
568
788
  * Helper function to create graph events with default client
569
789
  * Used by event-queue for async syncing