@ginkoai/cli 2.0.2 → 2.0.3
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.d.ts +4 -4
- package/dist/commands/epic.d.ts.map +1 -1
- package/dist/commands/epic.js +68 -6
- package/dist/commands/epic.js.map +1 -1
- package/dist/commands/graph/api-client.d.ts +14 -1
- package/dist/commands/graph/api-client.d.ts.map +1 -1
- package/dist/commands/graph/api-client.js.map +1 -1
- package/dist/commands/graph/explore.d.ts.map +1 -1
- package/dist/commands/graph/explore.js +27 -1
- package/dist/commands/graph/explore.js.map +1 -1
- package/dist/commands/graph/index.d.ts +3 -3
- package/dist/commands/graph/index.d.ts.map +1 -1
- package/dist/commands/graph/index.js +39 -3
- package/dist/commands/graph/index.js.map +1 -1
- package/dist/commands/graph/load.d.ts.map +1 -1
- package/dist/commands/graph/load.js +10 -1
- package/dist/commands/graph/load.js.map +1 -1
- package/dist/commands/graph/migrations/009-epic-roadmap-properties.d.ts +41 -0
- package/dist/commands/graph/migrations/009-epic-roadmap-properties.d.ts.map +1 -0
- package/dist/commands/graph/migrations/009-epic-roadmap-properties.js +90 -0
- package/dist/commands/graph/migrations/009-epic-roadmap-properties.js.map +1 -0
- package/dist/commands/graph/migrations/010-epic-graph-id.d.ts +30 -0
- package/dist/commands/graph/migrations/010-epic-graph-id.d.ts.map +1 -0
- package/dist/commands/graph/migrations/010-epic-graph-id.js +67 -0
- package/dist/commands/graph/migrations/010-epic-graph-id.js.map +1 -0
- package/dist/commands/graph/migrations/011-sprint-epic-id.d.ts +32 -0
- package/dist/commands/graph/migrations/011-sprint-epic-id.d.ts.map +1 -0
- package/dist/commands/graph/migrations/011-sprint-epic-id.js +71 -0
- package/dist/commands/graph/migrations/011-sprint-epic-id.js.map +1 -0
- package/dist/commands/roadmap/index.d.ts +27 -0
- package/dist/commands/roadmap/index.d.ts.map +1 -0
- package/dist/commands/roadmap/index.js +208 -0
- package/dist/commands/roadmap/index.js.map +1 -0
- package/dist/commands/start/start-reflection.d.ts +4 -2
- package/dist/commands/start/start-reflection.d.ts.map +1 -1
- package/dist/commands/start/start-reflection.js +121 -59
- package/dist/commands/start/start-reflection.js.map +1 -1
- package/dist/commands/sync/sprint-syncer.d.ts.map +1 -1
- package/dist/commands/sync/sprint-syncer.js +8 -0
- package/dist/commands/sync/sprint-syncer.js.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/output-formatter.d.ts +90 -0
- package/dist/lib/output-formatter.d.ts.map +1 -1
- package/dist/lib/output-formatter.js +244 -0
- package/dist/lib/output-formatter.js.map +1 -1
- package/dist/lib/roadmap/changelog-inference.d.ts +84 -0
- package/dist/lib/roadmap/changelog-inference.d.ts.map +1 -0
- package/dist/lib/roadmap/changelog-inference.js +163 -0
- package/dist/lib/roadmap/changelog-inference.js.map +1 -0
- package/dist/lib/sprint-loader.d.ts +25 -1
- package/dist/lib/sprint-loader.d.ts.map +1 -1
- package/dist/lib/sprint-loader.js +196 -2
- package/dist/lib/sprint-loader.js.map +1 -1
- package/dist/lib/user-sprint.d.ts +59 -0
- package/dist/lib/user-sprint.d.ts.map +1 -0
- package/dist/lib/user-sprint.js +147 -0
- package/dist/lib/user-sprint.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: utility
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2026-01-14
|
|
5
|
+
* @tags: [sprint, user, session, assignment]
|
|
6
|
+
* @related: [sprint-loader.ts, start-reflection.ts, ginko-root.ts]
|
|
7
|
+
* @priority: high
|
|
8
|
+
* @complexity: low
|
|
9
|
+
* @dependencies: [fs-extra, path]
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Per-User Sprint Management
|
|
13
|
+
*
|
|
14
|
+
* Manages user-specific sprint assignments stored in:
|
|
15
|
+
* .ginko/sessions/{user}/current-sprint.json
|
|
16
|
+
*
|
|
17
|
+
* Enables multiple users to work on different sprints simultaneously
|
|
18
|
+
* while maintaining a global CURRENT-SPRINT.md for team coordination.
|
|
19
|
+
*/
|
|
20
|
+
import fs from 'fs-extra';
|
|
21
|
+
import path from 'path';
|
|
22
|
+
import { getUserEmail } from '../utils/helpers.js';
|
|
23
|
+
import { getUserSessionPath, requireGinkoRoot } from '../utils/ginko-root.js';
|
|
24
|
+
const CURRENT_SPRINT_FILE = 'current-sprint.json';
|
|
25
|
+
/**
|
|
26
|
+
* Get the path to user's current-sprint.json
|
|
27
|
+
*/
|
|
28
|
+
async function getUserSprintFilePath() {
|
|
29
|
+
const userEmail = await getUserEmail();
|
|
30
|
+
const sessionPath = await getUserSessionPath(userEmail);
|
|
31
|
+
return path.join(sessionPath, CURRENT_SPRINT_FILE);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get user's current sprint assignment
|
|
35
|
+
* Returns null if no sprint is assigned
|
|
36
|
+
*/
|
|
37
|
+
export async function getUserCurrentSprint() {
|
|
38
|
+
try {
|
|
39
|
+
const filePath = await getUserSprintFilePath();
|
|
40
|
+
if (!await fs.pathExists(filePath)) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
const data = await fs.readJSON(filePath);
|
|
44
|
+
// Validate required fields
|
|
45
|
+
if (!data.sprintId || !data.sprintFile) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
return data;
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
// File doesn't exist or is invalid
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Set user's current sprint assignment
|
|
57
|
+
*/
|
|
58
|
+
export async function setUserCurrentSprint(assignment) {
|
|
59
|
+
const filePath = await getUserSprintFilePath();
|
|
60
|
+
// Ensure session directory exists
|
|
61
|
+
await fs.ensureDir(path.dirname(filePath));
|
|
62
|
+
await fs.writeJSON(filePath, assignment, { spaces: 2 });
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Clear user's current sprint assignment
|
|
66
|
+
* Used when sprint is complete and no next sprint is available
|
|
67
|
+
*/
|
|
68
|
+
export async function clearUserCurrentSprint() {
|
|
69
|
+
const filePath = await getUserSprintFilePath();
|
|
70
|
+
if (await fs.pathExists(filePath)) {
|
|
71
|
+
await fs.remove(filePath);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Extract sprint ID from sprint filename
|
|
76
|
+
* Handles patterns like:
|
|
77
|
+
* - SPRINT-2026-01-e011-s01-feature-name.md → e011_s01
|
|
78
|
+
* - e011-s01-something.md → e011_s01
|
|
79
|
+
* - epic011-sprint2.md → e011_s02
|
|
80
|
+
*/
|
|
81
|
+
export function extractSprintIdFromFilename(filename) {
|
|
82
|
+
const basename = path.basename(filename, '.md');
|
|
83
|
+
// Pattern 1: e{NNN}-s{NN} or e{NNN}_s{NN}
|
|
84
|
+
const modernPattern = /e(\d{3})[-_]s(\d{2})/i;
|
|
85
|
+
const modernMatch = basename.match(modernPattern);
|
|
86
|
+
if (modernMatch) {
|
|
87
|
+
const epicNum = modernMatch[1];
|
|
88
|
+
const sprintNum = modernMatch[2];
|
|
89
|
+
return {
|
|
90
|
+
sprintId: `e${epicNum}_s${sprintNum}`,
|
|
91
|
+
epicId: `e${epicNum}`
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
// Pattern 2: epic{NNN}-sprint{N} (legacy)
|
|
95
|
+
const legacyPattern = /epic(\d+)-sprint(\d+)/i;
|
|
96
|
+
const legacyMatch = basename.match(legacyPattern);
|
|
97
|
+
if (legacyMatch) {
|
|
98
|
+
const epicNum = legacyMatch[1].padStart(3, '0');
|
|
99
|
+
const sprintNum = legacyMatch[2].padStart(2, '0');
|
|
100
|
+
return {
|
|
101
|
+
sprintId: `e${epicNum}_s${sprintNum}`,
|
|
102
|
+
epicId: `e${epicNum}`
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Create sprint assignment from a sprint file path
|
|
109
|
+
*/
|
|
110
|
+
export async function createAssignmentFromFile(sprintFilePath, sprintName, assignedBy = 'auto') {
|
|
111
|
+
const projectRoot = await requireGinkoRoot();
|
|
112
|
+
const relativePath = path.relative(projectRoot, sprintFilePath);
|
|
113
|
+
const ids = extractSprintIdFromFilename(sprintFilePath);
|
|
114
|
+
if (!ids) {
|
|
115
|
+
// Can't extract sprint ID from filename
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
sprintId: ids.sprintId,
|
|
120
|
+
epicId: ids.epicId,
|
|
121
|
+
sprintFile: relativePath,
|
|
122
|
+
sprintName,
|
|
123
|
+
assignedAt: new Date().toISOString(),
|
|
124
|
+
assignedBy
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Check if user's assigned sprint file still exists and is valid
|
|
129
|
+
*/
|
|
130
|
+
export async function validateUserSprint(assignment) {
|
|
131
|
+
try {
|
|
132
|
+
const projectRoot = await requireGinkoRoot();
|
|
133
|
+
const fullPath = path.join(projectRoot, assignment.sprintFile);
|
|
134
|
+
return await fs.pathExists(fullPath);
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Get sprint file path from user assignment
|
|
142
|
+
*/
|
|
143
|
+
export async function getSprintFileFromAssignment(assignment) {
|
|
144
|
+
const projectRoot = await requireGinkoRoot();
|
|
145
|
+
return path.join(projectRoot, assignment.sprintFile);
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=user-sprint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-sprint.js","sourceRoot":"","sources":["../../src/lib/user-sprint.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED