@ginkoai/cli 2.1.0 → 2.1.2
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/graph/api-client.d.ts +36 -1
- package/dist/commands/graph/api-client.d.ts.map +1 -1
- package/dist/commands/graph/api-client.js +32 -2
- package/dist/commands/graph/api-client.js.map +1 -1
- package/dist/commands/graph/config.d.ts +6 -1
- package/dist/commands/graph/config.d.ts.map +1 -1
- package/dist/commands/graph/config.js +9 -1
- package/dist/commands/graph/config.js.map +1 -1
- package/dist/commands/graph/init.d.ts +1 -1
- package/dist/commands/graph/init.d.ts.map +1 -1
- package/dist/commands/graph/init.js +17 -2
- package/dist/commands/graph/init.js.map +1 -1
- package/dist/commands/handoff.d.ts +3 -3
- package/dist/commands/handoff.d.ts.map +1 -1
- package/dist/commands/handoff.js +32 -3
- package/dist/commands/handoff.js.map +1 -1
- package/dist/commands/nudging/index.d.ts +24 -0
- package/dist/commands/nudging/index.d.ts.map +1 -0
- package/dist/commands/nudging/index.js +175 -0
- package/dist/commands/nudging/index.js.map +1 -0
- package/dist/commands/sprint/create.d.ts +26 -0
- package/dist/commands/sprint/create.d.ts.map +1 -0
- package/dist/commands/sprint/create.js +269 -0
- package/dist/commands/sprint/create.js.map +1 -0
- package/dist/commands/sprint/index.d.ts.map +1 -1
- package/dist/commands/sprint/index.js +24 -0
- package/dist/commands/sprint/index.js.map +1 -1
- package/dist/commands/sprint/quick-fix.d.ts +25 -0
- package/dist/commands/sprint/quick-fix.d.ts.map +1 -0
- package/dist/commands/sprint/quick-fix.js +151 -0
- package/dist/commands/sprint/quick-fix.js.map +1 -0
- package/dist/commands/sprint/sprint-pipeline-enhanced.d.ts.map +1 -1
- package/dist/commands/sprint/sprint-pipeline-enhanced.js +37 -0
- package/dist/commands/sprint/sprint-pipeline-enhanced.js.map +1 -1
- package/dist/commands/sprint/status.d.ts.map +1 -1
- package/dist/commands/sprint/status.js +21 -1
- package/dist/commands/sprint/status.js.map +1 -1
- package/dist/commands/start/start-reflection.d.ts +14 -0
- package/dist/commands/start/start-reflection.d.ts.map +1 -1
- package/dist/commands/start/start-reflection.js +180 -9
- package/dist/commands/start/start-reflection.js.map +1 -1
- package/dist/commands/task/status.d.ts +3 -0
- package/dist/commands/task/status.d.ts.map +1 -1
- package/dist/commands/task/status.js +48 -1
- package/dist/commands/task/status.js.map +1 -1
- package/dist/commands/team/index.d.ts +5 -0
- package/dist/commands/team/index.d.ts.map +1 -1
- package/dist/commands/team/index.js +28 -0
- package/dist/commands/team/index.js.map +1 -1
- package/dist/commands/team/status.d.ts +16 -0
- package/dist/commands/team/status.d.ts.map +1 -0
- package/dist/commands/team/status.js +180 -0
- package/dist/commands/team/status.js.map +1 -0
- package/dist/index.js +10 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/adoption-score.d.ts +69 -0
- package/dist/lib/adoption-score.d.ts.map +1 -0
- package/dist/lib/adoption-score.js +206 -0
- package/dist/lib/adoption-score.js.map +1 -0
- package/dist/lib/coaching-level.d.ts +127 -0
- package/dist/lib/coaching-level.d.ts.map +1 -0
- package/dist/lib/coaching-level.js +406 -0
- package/dist/lib/coaching-level.js.map +1 -0
- package/dist/lib/event-logger.d.ts +42 -0
- package/dist/lib/event-logger.d.ts.map +1 -1
- package/dist/lib/event-logger.js +77 -0
- package/dist/lib/event-logger.js.map +1 -1
- package/dist/lib/planning-menu.d.ts +69 -0
- package/dist/lib/planning-menu.d.ts.map +1 -0
- package/dist/lib/planning-menu.js +342 -0
- package/dist/lib/planning-menu.js.map +1 -0
- package/dist/lib/targeted-coaching.d.ts +71 -0
- package/dist/lib/targeted-coaching.d.ts.map +1 -0
- package/dist/lib/targeted-coaching.js +318 -0
- package/dist/lib/targeted-coaching.js.map +1 -0
- package/dist/lib/task-parser.d.ts +2 -0
- package/dist/lib/task-parser.d.ts.map +1 -1
- package/dist/lib/task-parser.js +23 -0
- package/dist/lib/task-parser.js.map +1 -1
- package/dist/lib/user-sprint.d.ts +53 -0
- package/dist/lib/user-sprint.d.ts.map +1 -1
- package/dist/lib/user-sprint.js +137 -2
- package/dist/lib/user-sprint.js.map +1 -1
- package/dist/lib/work-reconciliation.d.ts +59 -0
- package/dist/lib/work-reconciliation.d.ts.map +1 -0
- package/dist/lib/work-reconciliation.js +267 -0
- package/dist/lib/work-reconciliation.js.map +1 -0
- package/dist/utils/version-check.d.ts +26 -0
- package/dist/utils/version-check.d.ts.map +1 -0
- package/dist/utils/version-check.js +186 -0
- package/dist/utils/version-check.js.map +1 -0
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-sprint.js","sourceRoot":"","sources":["../../src/lib/user-sprint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,YAAY,EAAe,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"user-sprint.js","sourceRoot":"","sources":["../../src/lib/user-sprint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: utility
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2026-01-26
|
|
5
|
+
* @tags: [reconciliation, handoff, untracked-work, coaching, epic-016-s04]
|
|
6
|
+
* @related: [handoff.ts, planning-menu.ts, user-sprint.ts, event-logger.ts]
|
|
7
|
+
* @priority: high
|
|
8
|
+
* @complexity: medium
|
|
9
|
+
* @dependencies: [prompts, chalk, simple-git, event-logger]
|
|
10
|
+
*/
|
|
11
|
+
export interface WorkReconciliationResult {
|
|
12
|
+
hasUntrackedWork: boolean;
|
|
13
|
+
untrackedCommits: number;
|
|
14
|
+
untrackedFiles: number;
|
|
15
|
+
userAction: 'tracked' | 'skipped' | 'no-work' | 'cancelled';
|
|
16
|
+
taskCreated?: string;
|
|
17
|
+
}
|
|
18
|
+
interface SessionWorkSummary {
|
|
19
|
+
commits: Array<{
|
|
20
|
+
hash: string;
|
|
21
|
+
message: string;
|
|
22
|
+
date: string;
|
|
23
|
+
}>;
|
|
24
|
+
modifiedFiles: string[];
|
|
25
|
+
hasActiveTask: boolean;
|
|
26
|
+
currentSprintId: string | null;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get summary of work done in current session
|
|
30
|
+
*/
|
|
31
|
+
declare function getSessionWorkSummary(): Promise<SessionWorkSummary>;
|
|
32
|
+
/**
|
|
33
|
+
* Determine if there's significant untracked work
|
|
34
|
+
*/
|
|
35
|
+
declare function hasSignificantUntrackedWork(summary: SessionWorkSummary): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Check for untracked work and prompt user if significant
|
|
38
|
+
*
|
|
39
|
+
* Called during handoff to catch work that should be tracked.
|
|
40
|
+
* Non-blocking - if user declines, handoff continues normally.
|
|
41
|
+
*
|
|
42
|
+
* @returns Reconciliation result with user's action
|
|
43
|
+
*/
|
|
44
|
+
export declare function reconcileWork(): Promise<WorkReconciliationResult>;
|
|
45
|
+
/**
|
|
46
|
+
* Quick check if reconciliation might be needed (for verbose output)
|
|
47
|
+
*/
|
|
48
|
+
export declare function hasUntrackedWork(): Promise<boolean>;
|
|
49
|
+
export declare const __testing: {
|
|
50
|
+
UNTRACKED_THRESHOLD: {
|
|
51
|
+
commits: number;
|
|
52
|
+
files: number;
|
|
53
|
+
};
|
|
54
|
+
IGNORED_PATTERNS: RegExp[];
|
|
55
|
+
getSessionWorkSummary: typeof getSessionWorkSummary;
|
|
56
|
+
hasSignificantUntrackedWork: typeof hasSignificantUntrackedWork;
|
|
57
|
+
};
|
|
58
|
+
export {};
|
|
59
|
+
//# sourceMappingURL=work-reconciliation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"work-reconciliation.d.ts","sourceRoot":"","sources":["../../src/lib/work-reconciliation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAyBH,MAAM,WAAW,wBAAwB;IACvC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,kBAAkB;IAC1B,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;IACH,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAyBD;;GAEG;AACH,iBAAe,qBAAqB,IAAI,OAAO,CAAC,kBAAkB,CAAC,CA4ClE;AAED;;GAEG;AACH,iBAAS,2BAA2B,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAWzE;AAkID;;;;;;;GAOG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,wBAAwB,CAAC,CAyBvE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CAOzD;AAMD,eAAO,MAAM,SAAS;;;;;;;;CAKrB,CAAC"}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: utility
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2026-01-26
|
|
5
|
+
* @tags: [reconciliation, handoff, untracked-work, coaching, epic-016-s04]
|
|
6
|
+
* @related: [handoff.ts, planning-menu.ts, user-sprint.ts, event-logger.ts]
|
|
7
|
+
* @priority: high
|
|
8
|
+
* @complexity: medium
|
|
9
|
+
* @dependencies: [prompts, chalk, simple-git, event-logger]
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Handoff Reconciliation (EPIC-016 Sprint 4 t06)
|
|
13
|
+
*
|
|
14
|
+
* Catches untracked work at session end by:
|
|
15
|
+
* 1. Detecting meaningful changes (commits, modified files)
|
|
16
|
+
* 2. Comparing against tracked sprint/task work
|
|
17
|
+
* 3. Prompting user to create ad-hoc tasks for untracked work
|
|
18
|
+
*
|
|
19
|
+
* Goal: Ensure all significant work is captured for knowledge graph
|
|
20
|
+
* without being annoying or slowing down the workflow.
|
|
21
|
+
*/
|
|
22
|
+
import prompts from 'prompts';
|
|
23
|
+
import chalk from 'chalk';
|
|
24
|
+
import simpleGit from 'simple-git';
|
|
25
|
+
import { logEvent } from './event-logger.js';
|
|
26
|
+
import { getUserCurrentSprint } from './user-sprint.js';
|
|
27
|
+
import { createQuickFixTask } from '../commands/sprint/quick-fix.js';
|
|
28
|
+
// =============================================================================
|
|
29
|
+
// Constants
|
|
30
|
+
// =============================================================================
|
|
31
|
+
// Minimum thresholds for prompting about untracked work
|
|
32
|
+
const UNTRACKED_THRESHOLD = {
|
|
33
|
+
commits: 1, // Prompt if 1+ commits without task
|
|
34
|
+
files: 5, // Or 5+ modified files
|
|
35
|
+
};
|
|
36
|
+
// File patterns to ignore when counting modified files
|
|
37
|
+
const IGNORED_PATTERNS = [
|
|
38
|
+
/^\.ginko\//,
|
|
39
|
+
/^node_modules\//,
|
|
40
|
+
/\.log$/,
|
|
41
|
+
/\.tmp$/,
|
|
42
|
+
/\.lock$/,
|
|
43
|
+
];
|
|
44
|
+
// =============================================================================
|
|
45
|
+
// Work Detection
|
|
46
|
+
// =============================================================================
|
|
47
|
+
/**
|
|
48
|
+
* Get summary of work done in current session
|
|
49
|
+
*/
|
|
50
|
+
async function getSessionWorkSummary() {
|
|
51
|
+
const git = simpleGit();
|
|
52
|
+
// Get current sprint info
|
|
53
|
+
const userSprint = await getUserCurrentSprint();
|
|
54
|
+
const hasActiveTask = userSprint !== null;
|
|
55
|
+
const currentSprintId = userSprint?.sprintId || null;
|
|
56
|
+
// Get recent commits (last 24 hours or since last handoff marker)
|
|
57
|
+
let commits = [];
|
|
58
|
+
try {
|
|
59
|
+
const log = await git.log({
|
|
60
|
+
'--since': '24 hours ago',
|
|
61
|
+
maxCount: 20,
|
|
62
|
+
});
|
|
63
|
+
commits = log.all.map(c => ({
|
|
64
|
+
hash: c.hash.slice(0, 7),
|
|
65
|
+
message: c.message.split('\n')[0],
|
|
66
|
+
date: c.date,
|
|
67
|
+
}));
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// Git log failed - might not be a git repo
|
|
71
|
+
}
|
|
72
|
+
// Get modified files (staged + unstaged)
|
|
73
|
+
let modifiedFiles = [];
|
|
74
|
+
try {
|
|
75
|
+
const status = await git.status();
|
|
76
|
+
modifiedFiles = [
|
|
77
|
+
...status.modified,
|
|
78
|
+
...status.staged,
|
|
79
|
+
...status.not_added,
|
|
80
|
+
].filter(f => !IGNORED_PATTERNS.some(p => p.test(f)));
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// Git status failed
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
commits,
|
|
87
|
+
modifiedFiles,
|
|
88
|
+
hasActiveTask,
|
|
89
|
+
currentSprintId,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Determine if there's significant untracked work
|
|
94
|
+
*/
|
|
95
|
+
function hasSignificantUntrackedWork(summary) {
|
|
96
|
+
// If user has an active task, assume work is tracked
|
|
97
|
+
if (summary.hasActiveTask) {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
// Check thresholds
|
|
101
|
+
return (summary.commits.length >= UNTRACKED_THRESHOLD.commits ||
|
|
102
|
+
summary.modifiedFiles.length >= UNTRACKED_THRESHOLD.files);
|
|
103
|
+
}
|
|
104
|
+
// =============================================================================
|
|
105
|
+
// User Prompts
|
|
106
|
+
// =============================================================================
|
|
107
|
+
/**
|
|
108
|
+
* Prompt user about untracked work
|
|
109
|
+
*/
|
|
110
|
+
async function promptForUntrackedWork(summary) {
|
|
111
|
+
console.log('');
|
|
112
|
+
console.log(chalk.yellow('📋 You have work that may not be tracked:'));
|
|
113
|
+
if (summary.commits.length > 0) {
|
|
114
|
+
console.log(chalk.dim(` ${summary.commits.length} commit(s) in the last 24h`));
|
|
115
|
+
// Show first commit message as context
|
|
116
|
+
if (summary.commits[0]) {
|
|
117
|
+
console.log(chalk.dim(` Latest: "${summary.commits[0].message.slice(0, 50)}..."`));
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (summary.modifiedFiles.length > 0) {
|
|
121
|
+
console.log(chalk.dim(` ${summary.modifiedFiles.length} modified file(s)`));
|
|
122
|
+
}
|
|
123
|
+
console.log('');
|
|
124
|
+
const { action } = await prompts({
|
|
125
|
+
type: 'select',
|
|
126
|
+
name: 'action',
|
|
127
|
+
message: 'Would you like to track this work?',
|
|
128
|
+
choices: [
|
|
129
|
+
{
|
|
130
|
+
title: 'Yes, create a quick task',
|
|
131
|
+
description: 'Track this work with a simple description',
|
|
132
|
+
value: 'track',
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
title: 'No, skip this time',
|
|
136
|
+
description: 'Continue without tracking',
|
|
137
|
+
value: 'skip',
|
|
138
|
+
},
|
|
139
|
+
],
|
|
140
|
+
});
|
|
141
|
+
if (action === undefined) {
|
|
142
|
+
return {
|
|
143
|
+
hasUntrackedWork: true,
|
|
144
|
+
untrackedCommits: summary.commits.length,
|
|
145
|
+
untrackedFiles: summary.modifiedFiles.length,
|
|
146
|
+
userAction: 'cancelled',
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
if (action === 'skip') {
|
|
150
|
+
// Log that user skipped tracking
|
|
151
|
+
await logEvent({
|
|
152
|
+
category: 'decision',
|
|
153
|
+
description: 'Skipped tracking untracked work at handoff',
|
|
154
|
+
tags: ['handoff', 'untracked-work', 'skipped'],
|
|
155
|
+
impact: 'low',
|
|
156
|
+
}).catch(() => { });
|
|
157
|
+
return {
|
|
158
|
+
hasUntrackedWork: true,
|
|
159
|
+
untrackedCommits: summary.commits.length,
|
|
160
|
+
untrackedFiles: summary.modifiedFiles.length,
|
|
161
|
+
userAction: 'skipped',
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
// User wants to track - get description
|
|
165
|
+
const { description } = await prompts({
|
|
166
|
+
type: 'text',
|
|
167
|
+
name: 'description',
|
|
168
|
+
message: 'Brief description of the work:',
|
|
169
|
+
initial: summary.commits[0]?.message.slice(0, 50) || '',
|
|
170
|
+
validate: (v) => v.trim().length >= 5 ? true : 'Please provide a brief description',
|
|
171
|
+
});
|
|
172
|
+
if (!description) {
|
|
173
|
+
return {
|
|
174
|
+
hasUntrackedWork: true,
|
|
175
|
+
untrackedCommits: summary.commits.length,
|
|
176
|
+
untrackedFiles: summary.modifiedFiles.length,
|
|
177
|
+
userAction: 'cancelled',
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
// Create quick-fix task
|
|
181
|
+
try {
|
|
182
|
+
const result = await createQuickFixTask(description.trim());
|
|
183
|
+
if (result.success && result.taskId) {
|
|
184
|
+
console.log(chalk.green(`✓ Created: ${result.taskId}`));
|
|
185
|
+
return {
|
|
186
|
+
hasUntrackedWork: true,
|
|
187
|
+
untrackedCommits: summary.commits.length,
|
|
188
|
+
untrackedFiles: summary.modifiedFiles.length,
|
|
189
|
+
userAction: 'tracked',
|
|
190
|
+
taskCreated: result.taskId,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
console.log(chalk.dim('Task creation skipped (graph may not be initialized)'));
|
|
196
|
+
}
|
|
197
|
+
// Log the work even if task creation failed
|
|
198
|
+
await logEvent({
|
|
199
|
+
category: 'feature',
|
|
200
|
+
description: `Handoff work: ${description}`,
|
|
201
|
+
tags: ['handoff', 'untracked-work', 'logged'],
|
|
202
|
+
impact: 'medium',
|
|
203
|
+
}).catch(() => { });
|
|
204
|
+
return {
|
|
205
|
+
hasUntrackedWork: true,
|
|
206
|
+
untrackedCommits: summary.commits.length,
|
|
207
|
+
untrackedFiles: summary.modifiedFiles.length,
|
|
208
|
+
userAction: 'tracked',
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
// =============================================================================
|
|
212
|
+
// Main Function
|
|
213
|
+
// =============================================================================
|
|
214
|
+
/**
|
|
215
|
+
* Check for untracked work and prompt user if significant
|
|
216
|
+
*
|
|
217
|
+
* Called during handoff to catch work that should be tracked.
|
|
218
|
+
* Non-blocking - if user declines, handoff continues normally.
|
|
219
|
+
*
|
|
220
|
+
* @returns Reconciliation result with user's action
|
|
221
|
+
*/
|
|
222
|
+
export async function reconcileWork() {
|
|
223
|
+
try {
|
|
224
|
+
const summary = await getSessionWorkSummary();
|
|
225
|
+
if (!hasSignificantUntrackedWork(summary)) {
|
|
226
|
+
return {
|
|
227
|
+
hasUntrackedWork: false,
|
|
228
|
+
untrackedCommits: 0,
|
|
229
|
+
untrackedFiles: 0,
|
|
230
|
+
userAction: 'no-work',
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
return await promptForUntrackedWork(summary);
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
// Non-critical - don't block handoff on reconciliation errors
|
|
237
|
+
console.warn(chalk.dim('Work reconciliation skipped:'), error instanceof Error ? error.message : String(error));
|
|
238
|
+
return {
|
|
239
|
+
hasUntrackedWork: false,
|
|
240
|
+
untrackedCommits: 0,
|
|
241
|
+
untrackedFiles: 0,
|
|
242
|
+
userAction: 'no-work',
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Quick check if reconciliation might be needed (for verbose output)
|
|
248
|
+
*/
|
|
249
|
+
export async function hasUntrackedWork() {
|
|
250
|
+
try {
|
|
251
|
+
const summary = await getSessionWorkSummary();
|
|
252
|
+
return hasSignificantUntrackedWork(summary);
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
return false;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
// =============================================================================
|
|
259
|
+
// Exports for Testing
|
|
260
|
+
// =============================================================================
|
|
261
|
+
export const __testing = {
|
|
262
|
+
UNTRACKED_THRESHOLD,
|
|
263
|
+
IGNORED_PATTERNS,
|
|
264
|
+
getSessionWorkSummary,
|
|
265
|
+
hasSignificantUntrackedWork,
|
|
266
|
+
};
|
|
267
|
+
//# sourceMappingURL=work-reconciliation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"work-reconciliation.js","sourceRoot":"","sources":["../../src/lib/work-reconciliation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: utility
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2026-01-21
|
|
5
|
+
* @tags: [version, update, npm, notification]
|
|
6
|
+
* @related: [start-reflection.ts]
|
|
7
|
+
* @priority: low
|
|
8
|
+
* @complexity: low
|
|
9
|
+
* @dependencies: [fs-extra, semver]
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Get the current installed version
|
|
13
|
+
* Reads from package.json relative to this module's location
|
|
14
|
+
*/
|
|
15
|
+
export declare function getCurrentVersion(): string;
|
|
16
|
+
/**
|
|
17
|
+
* Check for updates and return notification message if available
|
|
18
|
+
* Non-blocking, uses cache to avoid frequent npm requests
|
|
19
|
+
*/
|
|
20
|
+
export declare function checkForUpdates(): Promise<string | null>;
|
|
21
|
+
/**
|
|
22
|
+
* Run version check in background (fire and forget)
|
|
23
|
+
* Returns a promise that resolves to the message (or null)
|
|
24
|
+
*/
|
|
25
|
+
export declare function checkForUpdatesAsync(): Promise<string | null>;
|
|
26
|
+
//# sourceMappingURL=version-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-check.d.ts","sourceRoot":"","sources":["../../src/utils/version-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA8BH;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAuB1C;AAmFD;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiC9D;AAUD;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAE7D"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: utility
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2026-01-21
|
|
5
|
+
* @tags: [version, update, npm, notification]
|
|
6
|
+
* @related: [start-reflection.ts]
|
|
7
|
+
* @priority: low
|
|
8
|
+
* @complexity: low
|
|
9
|
+
* @dependencies: [fs-extra, semver]
|
|
10
|
+
*/
|
|
11
|
+
import fs from 'fs-extra';
|
|
12
|
+
import path from 'path';
|
|
13
|
+
import os from 'os';
|
|
14
|
+
import chalk from 'chalk';
|
|
15
|
+
import { fileURLToPath } from 'url';
|
|
16
|
+
// ES module compatibility: get __dirname equivalent
|
|
17
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
18
|
+
const __dirname = path.dirname(__filename);
|
|
19
|
+
// Package name for npm registry lookup
|
|
20
|
+
const PACKAGE_NAME = '@ginkoai/cli';
|
|
21
|
+
// Cache duration: 24 hours
|
|
22
|
+
const CACHE_DURATION_MS = 24 * 60 * 60 * 1000;
|
|
23
|
+
/**
|
|
24
|
+
* Get the path to the version cache file
|
|
25
|
+
*/
|
|
26
|
+
function getCacheFilePath() {
|
|
27
|
+
return path.join(os.homedir(), '.ginko', 'version-cache.json');
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get the current installed version
|
|
31
|
+
* Reads from package.json relative to this module's location
|
|
32
|
+
*/
|
|
33
|
+
export function getCurrentVersion() {
|
|
34
|
+
try {
|
|
35
|
+
// When compiled, this file is at dist/utils/version-check.js
|
|
36
|
+
// package.json is at the package root (../../ from here)
|
|
37
|
+
const packageJsonPath = path.resolve(__dirname, '..', '..', 'package.json');
|
|
38
|
+
const packageJson = fs.readJsonSync(packageJsonPath);
|
|
39
|
+
return packageJson.version || '0.0.0';
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// Fallback: try to call ginko --version
|
|
43
|
+
try {
|
|
44
|
+
const { execSync } = require('child_process');
|
|
45
|
+
const output = execSync('ginko --version', {
|
|
46
|
+
encoding: 'utf-8',
|
|
47
|
+
timeout: 2000,
|
|
48
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
49
|
+
}).trim();
|
|
50
|
+
const match = output.match(/(\d+\.\d+\.\d+)/);
|
|
51
|
+
if (match)
|
|
52
|
+
return match[1];
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// Version check failed - non-critical
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return '0.0.0';
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Load cached version info
|
|
62
|
+
*/
|
|
63
|
+
async function loadCache() {
|
|
64
|
+
try {
|
|
65
|
+
const cachePath = getCacheFilePath();
|
|
66
|
+
if (await fs.pathExists(cachePath)) {
|
|
67
|
+
const cache = await fs.readJson(cachePath);
|
|
68
|
+
return cache;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// Cache read failed - will fetch fresh
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Save version info to cache
|
|
78
|
+
*/
|
|
79
|
+
async function saveCache(latestVersion) {
|
|
80
|
+
try {
|
|
81
|
+
const cachePath = getCacheFilePath();
|
|
82
|
+
await fs.ensureDir(path.dirname(cachePath));
|
|
83
|
+
await fs.writeJson(cachePath, {
|
|
84
|
+
latestVersion,
|
|
85
|
+
checkedAt: new Date().toISOString(),
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// Cache write failed - non-critical
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Check if cache is still valid (less than 24 hours old)
|
|
94
|
+
*/
|
|
95
|
+
function isCacheValid(cache) {
|
|
96
|
+
const checkedAt = new Date(cache.checkedAt).getTime();
|
|
97
|
+
const now = Date.now();
|
|
98
|
+
return (now - checkedAt) < CACHE_DURATION_MS;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Fetch latest version from npm registry
|
|
102
|
+
*/
|
|
103
|
+
async function fetchLatestVersion() {
|
|
104
|
+
try {
|
|
105
|
+
// Use dynamic import for fetch (available in Node 18+)
|
|
106
|
+
const response = await fetch(`https://registry.npmjs.org/${PACKAGE_NAME}/latest`, {
|
|
107
|
+
headers: { 'Accept': 'application/json' },
|
|
108
|
+
signal: AbortSignal.timeout(3000), // 3 second timeout
|
|
109
|
+
});
|
|
110
|
+
if (!response.ok) {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
const data = await response.json();
|
|
114
|
+
return data.version;
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// Network error or timeout - non-critical
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Compare semver versions
|
|
123
|
+
* Returns: -1 if a < b, 0 if a == b, 1 if a > b
|
|
124
|
+
*/
|
|
125
|
+
function compareVersions(a, b) {
|
|
126
|
+
const partsA = a.split('.').map(Number);
|
|
127
|
+
const partsB = b.split('.').map(Number);
|
|
128
|
+
for (let i = 0; i < 3; i++) {
|
|
129
|
+
const numA = partsA[i] || 0;
|
|
130
|
+
const numB = partsB[i] || 0;
|
|
131
|
+
if (numA < numB)
|
|
132
|
+
return -1;
|
|
133
|
+
if (numA > numB)
|
|
134
|
+
return 1;
|
|
135
|
+
}
|
|
136
|
+
return 0;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Check for updates and return notification message if available
|
|
140
|
+
* Non-blocking, uses cache to avoid frequent npm requests
|
|
141
|
+
*/
|
|
142
|
+
export async function checkForUpdates() {
|
|
143
|
+
try {
|
|
144
|
+
const currentVersion = getCurrentVersion();
|
|
145
|
+
// Check cache first
|
|
146
|
+
const cache = await loadCache();
|
|
147
|
+
if (cache && isCacheValid(cache)) {
|
|
148
|
+
// Use cached version
|
|
149
|
+
if (compareVersions(currentVersion, cache.latestVersion) < 0) {
|
|
150
|
+
return formatUpdateMessage(currentVersion, cache.latestVersion);
|
|
151
|
+
}
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
// Fetch latest version from npm
|
|
155
|
+
const latestVersion = await fetchLatestVersion();
|
|
156
|
+
if (!latestVersion) {
|
|
157
|
+
return null; // Couldn't fetch - fail silently
|
|
158
|
+
}
|
|
159
|
+
// Save to cache
|
|
160
|
+
await saveCache(latestVersion);
|
|
161
|
+
// Compare versions
|
|
162
|
+
if (compareVersions(currentVersion, latestVersion) < 0) {
|
|
163
|
+
return formatUpdateMessage(currentVersion, latestVersion);
|
|
164
|
+
}
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
// Version check failed - non-critical
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Format the update notification message
|
|
174
|
+
*/
|
|
175
|
+
function formatUpdateMessage(currentVersion, latestVersion) {
|
|
176
|
+
return chalk.yellow(`\n Update available: ${chalk.dim(currentVersion)} → ${chalk.green(latestVersion)}\n`) +
|
|
177
|
+
chalk.dim(` Run ${chalk.cyan('npm update -g @ginkoai/cli')} to update\n`);
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Run version check in background (fire and forget)
|
|
181
|
+
* Returns a promise that resolves to the message (or null)
|
|
182
|
+
*/
|
|
183
|
+
export function checkForUpdatesAsync() {
|
|
184
|
+
return checkForUpdates().catch(() => null);
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=version-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-check.js","sourceRoot":"","sources":["../../src/utils/version-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,oDAAoD;AACpD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,uCAAuC;AACvC,MAAM,YAAY,GAAG,cAAc,CAAC;AAEpC,2BAA2B;AAC3B,MAAM,iBAAiB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAO9C;;GAEG;AACH,SAAS,gBAAgB;IACvB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,oBAAoB,CAAC,CAAC;AACjE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC;QACH,6DAA6D;QAC7D,yDAAyD;QACzD,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;QAC5E,MAAM,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;QACrD,OAAO,WAAW,CAAC,OAAO,IAAI,OAAO,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,wCAAwC;QACxC,IAAI,CAAC;YACH,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,iBAAiB,EAAE;gBACzC,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,IAAI;gBACb,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;aAChC,CAAC,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YAC9C,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,sCAAsC;QACxC,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,SAAS;IACtB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;QACrC,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YAC3C,OAAO,KAAqB,CAAC;QAC/B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,uCAAuC;IACzC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,SAAS,CAAC,aAAqB;IAC5C,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;QACrC,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QAC5C,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE;YAC5B,aAAa;YACb,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,oCAAoC;IACtC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,KAAmB;IACvC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;IACtD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC,GAAG,iBAAiB,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,kBAAkB;IAC/B,IAAI,CAAC;QACH,uDAAuD;QACvD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,8BAA8B,YAAY,SAAS,EAAE;YAChF,OAAO,EAAE,EAAE,QAAQ,EAAE,kBAAkB,EAAE;YACzC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,mBAAmB;SACvD,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAyB,CAAC;QAC1D,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,0CAA0C;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,CAAS,EAAE,CAAS;IAC3C,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAExC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,IAAI,GAAG,IAAI;YAAE,OAAO,CAAC,CAAC,CAAC;QAC3B,IAAI,IAAI,GAAG,IAAI;YAAE,OAAO,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC;QACH,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;QAE3C,oBAAoB;QACpB,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;QAChC,IAAI,KAAK,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,qBAAqB;YACrB,IAAI,eAAe,CAAC,cAAc,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7D,OAAO,mBAAmB,CAAC,cAAc,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;YAClE,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,gCAAgC;QAChC,MAAM,aAAa,GAAG,MAAM,kBAAkB,EAAE,CAAC;QACjD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,CAAC,iCAAiC;QAChD,CAAC;QAED,gBAAgB;QAChB,MAAM,SAAS,CAAC,aAAa,CAAC,CAAC;QAE/B,mBAAmB;QACnB,IAAI,eAAe,CAAC,cAAc,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;YACvD,OAAO,mBAAmB,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,cAAsB,EAAE,aAAqB;IACxE,OAAO,KAAK,CAAC,MAAM,CAAC,yBAAyB,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC;QACpG,KAAK,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,cAAc,CAAC,CAAC;AACpF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,eAAe,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;AAC7C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ginkoai/cli",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.2",
|
|
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": {
|
|
7
7
|
"ginko": "./dist/index.js"
|
|
8
8
|
},
|
|
9
9
|
"scripts": {
|
|
10
|
-
"build": "tsc && npm run copy:templates",
|
|
10
|
+
"build": "tsc && chmod +x dist/index.js && npm run copy:templates",
|
|
11
11
|
"copy:templates": "mkdir -p dist/templates && cp src/templates/*.md dist/templates/ 2>/dev/null || true",
|
|
12
12
|
"dev": "tsc --watch",
|
|
13
13
|
"test": "jest",
|