@ginkoai/cli 2.0.5 → 2.1.0

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 (91) 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 +209 -0
  10. package/dist/commands/graph/api-client.d.ts.map +1 -1
  11. package/dist/commands/graph/api-client.js +125 -0
  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/migrate/index.d.ts +27 -0
  17. package/dist/commands/migrate/index.d.ts.map +1 -0
  18. package/dist/commands/migrate/index.js +76 -0
  19. package/dist/commands/migrate/index.js.map +1 -0
  20. package/dist/commands/migrate/status-migration.d.ts +58 -0
  21. package/dist/commands/migrate/status-migration.d.ts.map +1 -0
  22. package/dist/commands/migrate/status-migration.js +323 -0
  23. package/dist/commands/migrate/status-migration.js.map +1 -0
  24. package/dist/commands/sprint/index.d.ts.map +1 -1
  25. package/dist/commands/sprint/index.js +4 -0
  26. package/dist/commands/sprint/index.js.map +1 -1
  27. package/dist/commands/sprint/status.d.ts +42 -0
  28. package/dist/commands/sprint/status.d.ts.map +1 -0
  29. package/dist/commands/sprint/status.js +278 -0
  30. package/dist/commands/sprint/status.js.map +1 -0
  31. package/dist/commands/start/start-reflection.d.ts +39 -0
  32. package/dist/commands/start/start-reflection.d.ts.map +1 -1
  33. package/dist/commands/start/start-reflection.js +311 -91
  34. package/dist/commands/start/start-reflection.js.map +1 -1
  35. package/dist/commands/sync/sprint-syncer.d.ts +19 -12
  36. package/dist/commands/sync/sprint-syncer.d.ts.map +1 -1
  37. package/dist/commands/sync/sprint-syncer.js +58 -140
  38. package/dist/commands/sync/sprint-syncer.js.map +1 -1
  39. package/dist/commands/sync/sync-command.d.ts.map +1 -1
  40. package/dist/commands/sync/sync-command.js +6 -18
  41. package/dist/commands/sync/sync-command.js.map +1 -1
  42. package/dist/commands/task/index.d.ts +25 -0
  43. package/dist/commands/task/index.d.ts.map +1 -0
  44. package/dist/commands/task/index.js +100 -0
  45. package/dist/commands/task/index.js.map +1 -0
  46. package/dist/commands/task/status.d.ts +43 -0
  47. package/dist/commands/task/status.d.ts.map +1 -0
  48. package/dist/commands/task/status.js +301 -0
  49. package/dist/commands/task/status.js.map +1 -0
  50. package/dist/index.js +12 -29
  51. package/dist/index.js.map +1 -1
  52. package/dist/lib/context-loader-events.d.ts +1 -0
  53. package/dist/lib/context-loader-events.d.ts.map +1 -1
  54. package/dist/lib/context-loader-events.js +28 -41
  55. package/dist/lib/context-loader-events.js.map +1 -1
  56. package/dist/lib/output-formatter.d.ts +12 -4
  57. package/dist/lib/output-formatter.d.ts.map +1 -1
  58. package/dist/lib/output-formatter.js +186 -14
  59. package/dist/lib/output-formatter.js.map +1 -1
  60. package/dist/lib/pending-updates.d.ts +148 -0
  61. package/dist/lib/pending-updates.d.ts.map +1 -0
  62. package/dist/lib/pending-updates.js +301 -0
  63. package/dist/lib/pending-updates.js.map +1 -0
  64. package/dist/lib/sprint-loader.d.ts +86 -14
  65. package/dist/lib/sprint-loader.d.ts.map +1 -1
  66. package/dist/lib/sprint-loader.js +293 -98
  67. package/dist/lib/sprint-loader.js.map +1 -1
  68. package/dist/lib/state-cache.d.ts +142 -0
  69. package/dist/lib/state-cache.d.ts.map +1 -0
  70. package/dist/lib/state-cache.js +259 -0
  71. package/dist/lib/state-cache.js.map +1 -0
  72. package/dist/lib/task-graph-sync.d.ts +105 -0
  73. package/dist/lib/task-graph-sync.d.ts.map +1 -0
  74. package/dist/lib/task-graph-sync.js +178 -0
  75. package/dist/lib/task-graph-sync.js.map +1 -0
  76. package/dist/lib/task-parser.d.ts +107 -0
  77. package/dist/lib/task-parser.d.ts.map +1 -0
  78. package/dist/lib/task-parser.js +384 -0
  79. package/dist/lib/task-parser.js.map +1 -0
  80. package/dist/templates/ai-instructions-template.d.ts.map +1 -1
  81. package/dist/templates/ai-instructions-template.js +7 -5
  82. package/dist/templates/ai-instructions-template.js.map +1 -1
  83. package/dist/templates/epic-template.md +0 -2
  84. package/dist/types/config.d.ts.map +1 -1
  85. package/dist/types/config.js +7 -5
  86. package/dist/types/config.js.map +1 -1
  87. package/dist/utils/synthesis.d.ts +4 -0
  88. package/dist/utils/synthesis.d.ts.map +1 -1
  89. package/dist/utils/synthesis.js +12 -18
  90. package/dist/utils/synthesis.js.map +1 -1
  91. package/package.json +1 -1
@@ -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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"}
@@ -326,6 +326,118 @@ export declare class GraphApiClient {
326
326
  * @returns Active sprint with tasks and statistics
327
327
  */
328
328
  getActiveSprint(graphId: 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
+ * Update sprint status in graph (EPIC-015 Sprint 1)
379
+ *
380
+ * @param graphId - Graph namespace identifier
381
+ * @param sprintId - Sprint ID to update
382
+ * @param status - New status value
383
+ * @returns Updated sprint info with previous status
384
+ */
385
+ updateSprintStatus(graphId: string, sprintId: string, status: SprintStatus): Promise<SprintStatusResponse>;
386
+ /**
387
+ * Get sprint status from graph (EPIC-015 Sprint 1)
388
+ *
389
+ * @param graphId - Graph namespace identifier
390
+ * @param sprintId - Sprint ID to query
391
+ * @returns Current sprint status
392
+ */
393
+ getSprintStatus(graphId: string, sprintId: string): Promise<{
394
+ id: string;
395
+ status: SprintStatus;
396
+ }>;
397
+ /**
398
+ * Update epic status in graph (EPIC-015 Sprint 1)
399
+ *
400
+ * @param graphId - Graph namespace identifier
401
+ * @param epicId - Epic ID to update
402
+ * @param status - New status value
403
+ * @returns Updated epic info with previous status
404
+ */
405
+ updateEpicStatus(graphId: string, epicId: string, status: EpicStatus): Promise<EpicStatusResponse>;
406
+ /**
407
+ * Get epic status from graph (EPIC-015 Sprint 1)
408
+ *
409
+ * @param graphId - Graph namespace identifier
410
+ * @param epicId - Epic ID to query
411
+ * @returns Current epic status
412
+ */
413
+ getEpicStatus(graphId: string, epicId: string): Promise<{
414
+ id: string;
415
+ status: EpicStatus;
416
+ }>;
417
+ /**
418
+ * Get all tasks in a sprint (for cascade completion checks)
419
+ *
420
+ * @param graphId - Graph namespace identifier
421
+ * @param sprintId - Sprint ID to query
422
+ * @returns Array of tasks with status
423
+ */
424
+ getSprintTasks(graphId: string, sprintId: string): Promise<Array<{
425
+ id: string;
426
+ title: string;
427
+ status: string;
428
+ }>>;
429
+ /**
430
+ * Get all sprints in an epic (for cascade completion checks)
431
+ *
432
+ * @param graphId - Graph namespace identifier
433
+ * @param epicId - Epic ID to query
434
+ * @returns Array of sprints with status
435
+ */
436
+ getEpicSprints(graphId: string, epicId: string): Promise<Array<{
437
+ id: string;
438
+ name: string;
439
+ status: string;
440
+ }>>;
329
441
  }
330
442
  /**
331
443
  * Gotcha encounter response (EPIC-002 Sprint 3 TASK-4)
@@ -564,6 +676,103 @@ export interface ActiveSprintResponse {
564
676
  timestamp: string;
565
677
  };
566
678
  }
679
+ /**
680
+ * Task sync input for API (EPIC-015 Sprint 0a)
681
+ */
682
+ export interface TaskSyncInput {
683
+ id: string;
684
+ sprint_id: string;
685
+ epic_id: string;
686
+ title: string;
687
+ estimate: string | null;
688
+ priority: 'CRITICAL' | 'HIGH' | 'MEDIUM' | 'LOW';
689
+ assignee: string | null;
690
+ initial_status: 'not_started' | 'in_progress' | 'blocked' | 'complete' | 'paused';
691
+ goal: string | null;
692
+ acceptance_criteria: string[];
693
+ files: string[];
694
+ related_adrs: string[];
695
+ }
696
+ /**
697
+ * Task sync response (EPIC-015 Sprint 0a)
698
+ */
699
+ export interface TaskSyncResponse {
700
+ success: boolean;
701
+ created: number;
702
+ updated: number;
703
+ relationships: number;
704
+ tasks: string[];
705
+ }
706
+ /**
707
+ * Task retrieved from graph (EPIC-015 Sprint 0a)
708
+ */
709
+ export interface TaskFromGraph {
710
+ id: string;
711
+ title: string;
712
+ status: string;
713
+ priority: string;
714
+ sprint_id: string;
715
+ epic_id: string;
716
+ estimate: string | null;
717
+ assignee: string | null;
718
+ goal: string | null;
719
+ synced_at: string | null;
720
+ }
721
+ /**
722
+ * Task status values (graph-authoritative)
723
+ */
724
+ export type TaskStatus = 'not_started' | 'in_progress' | 'blocked' | 'complete';
725
+ /**
726
+ * Sprint status values
727
+ */
728
+ export type SprintStatus = 'planned' | 'active' | 'paused' | 'complete';
729
+ /**
730
+ * Epic status values
731
+ */
732
+ export type EpicStatus = 'proposed' | 'active' | 'paused' | 'complete';
733
+ /**
734
+ * Task status update response
735
+ */
736
+ export interface TaskStatusResponse {
737
+ success: boolean;
738
+ task: {
739
+ id: string;
740
+ title?: string;
741
+ status: TaskStatus;
742
+ status_updated_at: string;
743
+ status_updated_by: string;
744
+ blocked_reason?: string;
745
+ };
746
+ previous_status: string;
747
+ }
748
+ /**
749
+ * Sprint status update response
750
+ */
751
+ export interface SprintStatusResponse {
752
+ success: boolean;
753
+ sprint: {
754
+ id: string;
755
+ name?: string;
756
+ status: SprintStatus;
757
+ status_updated_at: string;
758
+ status_updated_by: string;
759
+ };
760
+ previous_status: string;
761
+ }
762
+ /**
763
+ * Epic status update response
764
+ */
765
+ export interface EpicStatusResponse {
766
+ success: boolean;
767
+ epic: {
768
+ id: string;
769
+ title?: string;
770
+ status: EpicStatus;
771
+ status_updated_at: string;
772
+ status_updated_by: string;
773
+ };
774
+ previous_status: string;
775
+ }
567
776
  /**
568
777
  * Helper function to create graph events with default client
569
778
  * Used by event-queue for async syncing