@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.
- package/dist/commands/epic/index.d.ts +29 -0
- package/dist/commands/epic/index.d.ts.map +1 -0
- package/dist/commands/epic/index.js +94 -0
- package/dist/commands/epic/index.js.map +1 -0
- package/dist/commands/epic/status.d.ts +40 -0
- package/dist/commands/epic/status.d.ts.map +1 -0
- package/dist/commands/epic/status.js +244 -0
- package/dist/commands/epic/status.js.map +1 -0
- package/dist/commands/graph/api-client.d.ts +209 -0
- package/dist/commands/graph/api-client.d.ts.map +1 -1
- package/dist/commands/graph/api-client.js +125 -0
- package/dist/commands/graph/api-client.js.map +1 -1
- package/dist/commands/graph/load.d.ts.map +1 -1
- package/dist/commands/graph/load.js +40 -2
- package/dist/commands/graph/load.js.map +1 -1
- package/dist/commands/migrate/index.d.ts +27 -0
- package/dist/commands/migrate/index.d.ts.map +1 -0
- package/dist/commands/migrate/index.js +76 -0
- package/dist/commands/migrate/index.js.map +1 -0
- package/dist/commands/migrate/status-migration.d.ts +58 -0
- package/dist/commands/migrate/status-migration.d.ts.map +1 -0
- package/dist/commands/migrate/status-migration.js +323 -0
- package/dist/commands/migrate/status-migration.js.map +1 -0
- package/dist/commands/sprint/index.d.ts.map +1 -1
- package/dist/commands/sprint/index.js +4 -0
- package/dist/commands/sprint/index.js.map +1 -1
- package/dist/commands/sprint/status.d.ts +42 -0
- package/dist/commands/sprint/status.d.ts.map +1 -0
- package/dist/commands/sprint/status.js +278 -0
- package/dist/commands/sprint/status.js.map +1 -0
- package/dist/commands/start/start-reflection.d.ts +39 -0
- package/dist/commands/start/start-reflection.d.ts.map +1 -1
- package/dist/commands/start/start-reflection.js +311 -91
- package/dist/commands/start/start-reflection.js.map +1 -1
- package/dist/commands/sync/sprint-syncer.d.ts +19 -12
- package/dist/commands/sync/sprint-syncer.d.ts.map +1 -1
- package/dist/commands/sync/sprint-syncer.js +58 -140
- package/dist/commands/sync/sprint-syncer.js.map +1 -1
- package/dist/commands/sync/sync-command.d.ts.map +1 -1
- package/dist/commands/sync/sync-command.js +6 -18
- package/dist/commands/sync/sync-command.js.map +1 -1
- package/dist/commands/task/index.d.ts +25 -0
- package/dist/commands/task/index.d.ts.map +1 -0
- package/dist/commands/task/index.js +100 -0
- package/dist/commands/task/index.js.map +1 -0
- package/dist/commands/task/status.d.ts +43 -0
- package/dist/commands/task/status.d.ts.map +1 -0
- package/dist/commands/task/status.js +301 -0
- package/dist/commands/task/status.js.map +1 -0
- package/dist/index.js +12 -29
- package/dist/index.js.map +1 -1
- package/dist/lib/context-loader-events.d.ts +1 -0
- package/dist/lib/context-loader-events.d.ts.map +1 -1
- package/dist/lib/context-loader-events.js +28 -41
- package/dist/lib/context-loader-events.js.map +1 -1
- package/dist/lib/output-formatter.d.ts +12 -4
- package/dist/lib/output-formatter.d.ts.map +1 -1
- package/dist/lib/output-formatter.js +186 -14
- package/dist/lib/output-formatter.js.map +1 -1
- package/dist/lib/pending-updates.d.ts +148 -0
- package/dist/lib/pending-updates.d.ts.map +1 -0
- package/dist/lib/pending-updates.js +301 -0
- package/dist/lib/pending-updates.js.map +1 -0
- package/dist/lib/sprint-loader.d.ts +86 -14
- package/dist/lib/sprint-loader.d.ts.map +1 -1
- package/dist/lib/sprint-loader.js +293 -98
- package/dist/lib/sprint-loader.js.map +1 -1
- package/dist/lib/state-cache.d.ts +142 -0
- package/dist/lib/state-cache.d.ts.map +1 -0
- package/dist/lib/state-cache.js +259 -0
- package/dist/lib/state-cache.js.map +1 -0
- package/dist/lib/task-graph-sync.d.ts +105 -0
- package/dist/lib/task-graph-sync.d.ts.map +1 -0
- package/dist/lib/task-graph-sync.js +178 -0
- package/dist/lib/task-graph-sync.js.map +1 -0
- package/dist/lib/task-parser.d.ts +107 -0
- package/dist/lib/task-parser.d.ts.map +1 -0
- package/dist/lib/task-parser.js +384 -0
- package/dist/lib/task-parser.js.map +1 -0
- package/dist/templates/ai-instructions-template.d.ts.map +1 -1
- package/dist/templates/ai-instructions-template.js +7 -5
- package/dist/templates/ai-instructions-template.js.map +1 -1
- package/dist/templates/epic-template.md +0 -2
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +7 -5
- package/dist/types/config.js.map +1 -1
- package/dist/utils/synthesis.d.ts +4 -0
- package/dist/utils/synthesis.d.ts.map +1 -1
- package/dist/utils/synthesis.js +12 -18
- package/dist/utils/synthesis.js.map +1 -1
- package/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
|