@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.
Files changed (59) hide show
  1. package/dist/commands/epic.d.ts +4 -4
  2. package/dist/commands/epic.d.ts.map +1 -1
  3. package/dist/commands/epic.js +68 -6
  4. package/dist/commands/epic.js.map +1 -1
  5. package/dist/commands/graph/api-client.d.ts +14 -1
  6. package/dist/commands/graph/api-client.d.ts.map +1 -1
  7. package/dist/commands/graph/api-client.js.map +1 -1
  8. package/dist/commands/graph/explore.d.ts.map +1 -1
  9. package/dist/commands/graph/explore.js +27 -1
  10. package/dist/commands/graph/explore.js.map +1 -1
  11. package/dist/commands/graph/index.d.ts +3 -3
  12. package/dist/commands/graph/index.d.ts.map +1 -1
  13. package/dist/commands/graph/index.js +39 -3
  14. package/dist/commands/graph/index.js.map +1 -1
  15. package/dist/commands/graph/load.d.ts.map +1 -1
  16. package/dist/commands/graph/load.js +10 -1
  17. package/dist/commands/graph/load.js.map +1 -1
  18. package/dist/commands/graph/migrations/009-epic-roadmap-properties.d.ts +41 -0
  19. package/dist/commands/graph/migrations/009-epic-roadmap-properties.d.ts.map +1 -0
  20. package/dist/commands/graph/migrations/009-epic-roadmap-properties.js +90 -0
  21. package/dist/commands/graph/migrations/009-epic-roadmap-properties.js.map +1 -0
  22. package/dist/commands/graph/migrations/010-epic-graph-id.d.ts +30 -0
  23. package/dist/commands/graph/migrations/010-epic-graph-id.d.ts.map +1 -0
  24. package/dist/commands/graph/migrations/010-epic-graph-id.js +67 -0
  25. package/dist/commands/graph/migrations/010-epic-graph-id.js.map +1 -0
  26. package/dist/commands/graph/migrations/011-sprint-epic-id.d.ts +32 -0
  27. package/dist/commands/graph/migrations/011-sprint-epic-id.d.ts.map +1 -0
  28. package/dist/commands/graph/migrations/011-sprint-epic-id.js +71 -0
  29. package/dist/commands/graph/migrations/011-sprint-epic-id.js.map +1 -0
  30. package/dist/commands/roadmap/index.d.ts +27 -0
  31. package/dist/commands/roadmap/index.d.ts.map +1 -0
  32. package/dist/commands/roadmap/index.js +208 -0
  33. package/dist/commands/roadmap/index.js.map +1 -0
  34. package/dist/commands/start/start-reflection.d.ts +4 -2
  35. package/dist/commands/start/start-reflection.d.ts.map +1 -1
  36. package/dist/commands/start/start-reflection.js +121 -59
  37. package/dist/commands/start/start-reflection.js.map +1 -1
  38. package/dist/commands/sync/sprint-syncer.d.ts.map +1 -1
  39. package/dist/commands/sync/sprint-syncer.js +8 -0
  40. package/dist/commands/sync/sprint-syncer.js.map +1 -1
  41. package/dist/index.js +6 -0
  42. package/dist/index.js.map +1 -1
  43. package/dist/lib/output-formatter.d.ts +90 -0
  44. package/dist/lib/output-formatter.d.ts.map +1 -1
  45. package/dist/lib/output-formatter.js +244 -0
  46. package/dist/lib/output-formatter.js.map +1 -1
  47. package/dist/lib/roadmap/changelog-inference.d.ts +84 -0
  48. package/dist/lib/roadmap/changelog-inference.d.ts.map +1 -0
  49. package/dist/lib/roadmap/changelog-inference.js +163 -0
  50. package/dist/lib/roadmap/changelog-inference.js.map +1 -0
  51. package/dist/lib/sprint-loader.d.ts +25 -1
  52. package/dist/lib/sprint-loader.d.ts.map +1 -1
  53. package/dist/lib/sprint-loader.js +196 -2
  54. package/dist/lib/sprint-loader.js.map +1 -1
  55. package/dist/lib/user-sprint.d.ts +59 -0
  56. package/dist/lib/user-sprint.d.ts.map +1 -0
  57. package/dist/lib/user-sprint.js +147 -0
  58. package/dist/lib/user-sprint.js.map +1 -0
  59. 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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ginkoai/cli",
3
- "version": "2.0.2",
3
+ "version": "2.0.3",
4
4
  "description": "Git-native session management and cloud context for AI-mediated development. AI Collaboration for Vibe Tribes.",
5
5
  "main": "dist/index.js",
6
6
  "bin": {