@ginkoai/cli 2.5.0 → 2.5.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/analysis/deep-analyzer.js +7 -7
- package/dist/analysis/deep-analyzer.js.map +1 -1
- package/dist/analysis/project-analyzer.js +2 -2
- package/dist/analysis/project-analyzer.js.map +1 -1
- package/dist/commands/graph/init.d.ts.map +1 -1
- package/dist/commands/graph/init.js +2 -4
- package/dist/commands/graph/init.js.map +1 -1
- package/dist/commands/handoff.d.ts +1 -0
- package/dist/commands/handoff.d.ts.map +1 -1
- package/dist/commands/handoff.js +55 -9
- package/dist/commands/handoff.js.map +1 -1
- package/dist/commands/health.js +1 -0
- package/dist/commands/health.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +134 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/migrate/status-migration.d.ts.map +1 -1
- package/dist/commands/migrate/status-migration.js +2 -4
- package/dist/commands/migrate/status-migration.js.map +1 -1
- package/dist/commands/pull/pull-command.d.ts.map +1 -1
- package/dist/commands/pull/pull-command.js +11 -1
- package/dist/commands/pull/pull-command.js.map +1 -1
- package/dist/commands/push/push-command.d.ts.map +1 -1
- package/dist/commands/push/push-command.js +10 -0
- package/dist/commands/push/push-command.js.map +1 -1
- package/dist/commands/sprint/index.d.ts.map +1 -1
- package/dist/commands/sprint/index.js +15 -0
- package/dist/commands/sprint/index.js.map +1 -1
- package/dist/commands/sprint/plan-check.d.ts +16 -0
- package/dist/commands/sprint/plan-check.d.ts.map +1 -0
- package/dist/commands/sprint/plan-check.js +122 -0
- package/dist/commands/sprint/plan-check.js.map +1 -0
- package/dist/commands/sprint/status.d.ts +1 -1
- package/dist/commands/sprint/status.d.ts.map +1 -1
- package/dist/commands/sprint/status.js +23 -1
- package/dist/commands/sprint/status.js.map +1 -1
- package/dist/commands/start/start-reflection.d.ts.map +1 -1
- package/dist/commands/start/start-reflection.js +28 -11
- package/dist/commands/start/start-reflection.js.map +1 -1
- package/dist/commands/sync/node-syncer.d.ts +3 -1
- package/dist/commands/sync/node-syncer.d.ts.map +1 -1
- package/dist/commands/sync/node-syncer.js +13 -2
- package/dist/commands/sync/node-syncer.js.map +1 -1
- package/dist/commands/sync/sprint-syncer.d.ts.map +1 -1
- package/dist/commands/sync/sprint-syncer.js +2 -4
- package/dist/commands/sync/sprint-syncer.js.map +1 -1
- package/dist/commands/sync/types.d.ts +1 -1
- package/dist/commands/sync/types.d.ts.map +1 -1
- package/dist/commands/task/status.d.ts.map +1 -1
- package/dist/commands/task/status.js +228 -0
- package/dist/commands/task/status.js.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/health-checker.d.ts.map +1 -1
- package/dist/lib/health-checker.js +80 -7
- package/dist/lib/health-checker.js.map +1 -1
- package/dist/lib/integration-warnings.d.ts +72 -0
- package/dist/lib/integration-warnings.d.ts.map +1 -0
- package/dist/lib/integration-warnings.js +273 -0
- package/dist/lib/integration-warnings.js.map +1 -0
- package/dist/lib/notification-hooks.js +1 -1
- package/dist/lib/notification-hooks.js.map +1 -1
- package/dist/lib/output-formatter.d.ts +1 -1
- package/dist/lib/output-formatter.d.ts.map +1 -1
- package/dist/lib/output-formatter.js +31 -1
- package/dist/lib/output-formatter.js.map +1 -1
- package/dist/lib/protected-manifest.d.ts +34 -0
- package/dist/lib/protected-manifest.d.ts.map +1 -0
- package/dist/lib/protected-manifest.js +112 -0
- package/dist/lib/protected-manifest.js.map +1 -0
- package/dist/lib/protection-hook.d.ts +35 -0
- package/dist/lib/protection-hook.d.ts.map +1 -0
- package/dist/lib/protection-hook.js +154 -0
- package/dist/lib/protection-hook.js.map +1 -0
- package/dist/lib/realtime-cursor.js +3 -3
- package/dist/lib/realtime-cursor.js.map +1 -1
- package/dist/lib/session-health.d.ts +75 -0
- package/dist/lib/session-health.d.ts.map +1 -0
- package/dist/lib/session-health.js +252 -0
- package/dist/lib/session-health.js.map +1 -0
- package/dist/lib/sprint-state.d.ts +82 -0
- package/dist/lib/sprint-state.d.ts.map +1 -0
- package/dist/lib/sprint-state.js +338 -0
- package/dist/lib/sprint-state.js.map +1 -0
- package/dist/lib/structural-safeguards.d.ts +26 -0
- package/dist/lib/structural-safeguards.d.ts.map +1 -0
- package/dist/lib/structural-safeguards.js +91 -0
- package/dist/lib/structural-safeguards.js.map +1 -0
- package/dist/lib/sync/scanner.d.ts.map +1 -1
- package/dist/lib/sync/scanner.js +3 -5
- package/dist/lib/sync/scanner.js.map +1 -1
- 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 +30 -0
- package/dist/lib/task-parser.js.map +1 -1
- package/dist/templates/ai-instructions-template.d.ts +11 -0
- package/dist/templates/ai-instructions-template.d.ts.map +1 -1
- package/dist/templates/ai-instructions-template.js +184 -0
- package/dist/templates/ai-instructions-template.js.map +1 -1
- package/dist/templates/sprint-template.md +52 -0
- package/dist/utils/reference-parser.d.ts.map +1 -1
- package/dist/utils/reference-parser.js +3 -6
- package/dist/utils/reference-parser.js.map +1 -1
- package/package.json +2 -3
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: utility
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2026-03-15
|
|
5
|
+
* @tags: [sprint-state, cache, materialization, epic-025]
|
|
6
|
+
* @related: [task-parser.ts, sprint-loader.ts, ../commands/task/status.ts]
|
|
7
|
+
* @priority: high
|
|
8
|
+
* @complexity: medium
|
|
9
|
+
* @dependencies: [fs-extra, path]
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Sprint State Materialization (EPIC-025 Sprint 2)
|
|
13
|
+
*
|
|
14
|
+
* Materializes graph state as `.ginko/sprint-state.json` — a read-only
|
|
15
|
+
* local cache the AI partner can access with zero friction.
|
|
16
|
+
*
|
|
17
|
+
* Write path: AI partner → `ginko task complete` → CLI → graph → local cache
|
|
18
|
+
* Read path: AI partner → `Read .ginko/sprint-state.json` (one tool call)
|
|
19
|
+
*
|
|
20
|
+
* The AI partner never writes to the cache directly. The CLI is the only writer.
|
|
21
|
+
*/
|
|
22
|
+
import fs from 'fs-extra';
|
|
23
|
+
import path from 'path';
|
|
24
|
+
import { execSync } from 'child_process';
|
|
25
|
+
// =============================================================================
|
|
26
|
+
// Helpers
|
|
27
|
+
// =============================================================================
|
|
28
|
+
function getProjectRoot() {
|
|
29
|
+
try {
|
|
30
|
+
return execSync('git rev-parse --show-toplevel', { encoding: 'utf-8' }).trim();
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return process.cwd();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function getCachePath(projectRoot) {
|
|
37
|
+
const root = projectRoot || getProjectRoot();
|
|
38
|
+
return path.join(root, '.ginko', 'sprint-state.json');
|
|
39
|
+
}
|
|
40
|
+
// =============================================================================
|
|
41
|
+
// Materialization
|
|
42
|
+
// =============================================================================
|
|
43
|
+
/**
|
|
44
|
+
* Materialize sprint state from graph to local cache.
|
|
45
|
+
*
|
|
46
|
+
* Uses getActiveSprint API to fetch current sprint data,
|
|
47
|
+
* then writes structured JSON to .ginko/sprint-state.json.
|
|
48
|
+
*
|
|
49
|
+
* @param projectRoot - Optional project root override
|
|
50
|
+
* @returns The materialized SprintState, or null if no active sprint
|
|
51
|
+
*/
|
|
52
|
+
export async function materializeSprintState(projectRoot) {
|
|
53
|
+
const root = projectRoot || getProjectRoot();
|
|
54
|
+
const cachePath = getCachePath(root);
|
|
55
|
+
try {
|
|
56
|
+
// Dynamic import to avoid circular dependencies
|
|
57
|
+
const { GraphApiClient } = await import('../commands/graph/api-client.js');
|
|
58
|
+
const { getGraphId } = await import('../commands/graph/config.js');
|
|
59
|
+
const graphId = process.env.GINKO_GRAPH_ID || await getGraphId();
|
|
60
|
+
if (!graphId)
|
|
61
|
+
return null;
|
|
62
|
+
const client = new GraphApiClient();
|
|
63
|
+
const activeSprint = await client.getActiveSprint(graphId);
|
|
64
|
+
if (!activeSprint?.sprint?.id)
|
|
65
|
+
return null;
|
|
66
|
+
// Build task map
|
|
67
|
+
const tasks = {};
|
|
68
|
+
const allKnownIssues = [];
|
|
69
|
+
const allBlockers = [];
|
|
70
|
+
let completedCount = 0;
|
|
71
|
+
for (const task of activeSprint.tasks || []) {
|
|
72
|
+
const taskEntry = {
|
|
73
|
+
title: task.title || 'Untitled',
|
|
74
|
+
status: task.status || 'not_started',
|
|
75
|
+
};
|
|
76
|
+
// Try to get extended properties (knownIssues, blockers) from graph node
|
|
77
|
+
try {
|
|
78
|
+
const nodeResponse = await client.request('GET', `/api/v1/graph/nodes/${encodeURIComponent(task.id)}?graphId=${encodeURIComponent(graphId)}`);
|
|
79
|
+
const props = nodeResponse.node?.properties;
|
|
80
|
+
if (props) {
|
|
81
|
+
if (props.knownIssues) {
|
|
82
|
+
const issues = Array.isArray(props.knownIssues)
|
|
83
|
+
? props.knownIssues
|
|
84
|
+
: typeof props.knownIssues === 'string'
|
|
85
|
+
? JSON.parse(props.knownIssues)
|
|
86
|
+
: [];
|
|
87
|
+
taskEntry.knownIssues = issues;
|
|
88
|
+
allKnownIssues.push(...issues);
|
|
89
|
+
}
|
|
90
|
+
if (props.blockers) {
|
|
91
|
+
const blockers = Array.isArray(props.blockers)
|
|
92
|
+
? props.blockers
|
|
93
|
+
: typeof props.blockers === 'string'
|
|
94
|
+
? JSON.parse(props.blockers)
|
|
95
|
+
: [];
|
|
96
|
+
taskEntry.blockers = blockers;
|
|
97
|
+
allBlockers.push(...blockers);
|
|
98
|
+
}
|
|
99
|
+
if (props.modifiedFiles) {
|
|
100
|
+
taskEntry.modifiedFiles = Array.isArray(props.modifiedFiles)
|
|
101
|
+
? props.modifiedFiles
|
|
102
|
+
: typeof props.modifiedFiles === 'string'
|
|
103
|
+
? JSON.parse(props.modifiedFiles)
|
|
104
|
+
: [];
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// Individual task property fetch failures are non-fatal
|
|
110
|
+
}
|
|
111
|
+
if (task.status === 'complete')
|
|
112
|
+
completedCount++;
|
|
113
|
+
tasks[task.id] = taskEntry;
|
|
114
|
+
}
|
|
115
|
+
const totalTasks = activeSprint.tasks?.length || 0;
|
|
116
|
+
const state = {
|
|
117
|
+
sprint: activeSprint.sprint.id,
|
|
118
|
+
epicId: activeSprint.sprint.id.split('_')[0] || 'unknown',
|
|
119
|
+
epicTitle: '',
|
|
120
|
+
sprintTitle: activeSprint.sprint.name || activeSprint.sprint.id,
|
|
121
|
+
progress: {
|
|
122
|
+
complete: completedCount,
|
|
123
|
+
total: totalTasks,
|
|
124
|
+
percentage: totalTasks > 0 ? Math.round((completedCount / totalTasks) * 100) : 0,
|
|
125
|
+
},
|
|
126
|
+
tasks,
|
|
127
|
+
knownIssues: [...new Set(allKnownIssues)],
|
|
128
|
+
blockers: [...new Set(allBlockers)],
|
|
129
|
+
lastDeployed: null,
|
|
130
|
+
lastUpdated: new Date().toISOString(),
|
|
131
|
+
lastUpdatedBy: null,
|
|
132
|
+
stale: false,
|
|
133
|
+
};
|
|
134
|
+
// Write cache
|
|
135
|
+
await fs.ensureDir(path.dirname(cachePath));
|
|
136
|
+
await fs.writeJson(cachePath, state, { spaces: 2 });
|
|
137
|
+
return state;
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
// Graph unavailable — try to keep existing cache, mark as stale
|
|
141
|
+
return markCacheStale(cachePath);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Mark existing cache as stale (graph was unavailable).
|
|
146
|
+
* Never deletes the cache — stale data is better than no data.
|
|
147
|
+
*/
|
|
148
|
+
async function markCacheStale(cachePath) {
|
|
149
|
+
try {
|
|
150
|
+
if (await fs.pathExists(cachePath)) {
|
|
151
|
+
const existing = await fs.readJson(cachePath);
|
|
152
|
+
existing.stale = true;
|
|
153
|
+
await fs.writeJson(cachePath, existing, { spaces: 2 });
|
|
154
|
+
return existing;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
// Can't even read the cache — nothing to do
|
|
159
|
+
}
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
// =============================================================================
|
|
163
|
+
// Cache Reading
|
|
164
|
+
// =============================================================================
|
|
165
|
+
/**
|
|
166
|
+
* Read sprint state from local cache.
|
|
167
|
+
*
|
|
168
|
+
* @param projectRoot - Optional project root override
|
|
169
|
+
* @returns SprintState or null if cache doesn't exist
|
|
170
|
+
*/
|
|
171
|
+
export async function readSprintState(projectRoot) {
|
|
172
|
+
const cachePath = getCachePath(projectRoot);
|
|
173
|
+
try {
|
|
174
|
+
if (!await fs.pathExists(cachePath))
|
|
175
|
+
return null;
|
|
176
|
+
return await fs.readJson(cachePath);
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Check if cache is stale (>1 hour old).
|
|
184
|
+
*/
|
|
185
|
+
export function isCacheStale(state, thresholdMs = 3600000) {
|
|
186
|
+
if (state.stale)
|
|
187
|
+
return true;
|
|
188
|
+
const age = Date.now() - new Date(state.lastUpdated).getTime();
|
|
189
|
+
return age > thresholdMs;
|
|
190
|
+
}
|
|
191
|
+
// =============================================================================
|
|
192
|
+
// Checkpoint Updates
|
|
193
|
+
// =============================================================================
|
|
194
|
+
/**
|
|
195
|
+
* Push checkpoint data to a task node in the graph.
|
|
196
|
+
*
|
|
197
|
+
* @param taskId - Task ID
|
|
198
|
+
* @param checkpoint - Checkpoint data (knownIssues, blockers, modifiedFiles)
|
|
199
|
+
*/
|
|
200
|
+
export async function pushCheckpointToGraph(taskId, checkpoint) {
|
|
201
|
+
try {
|
|
202
|
+
const { GraphApiClient } = await import('../commands/graph/api-client.js');
|
|
203
|
+
const { getGraphId } = await import('../commands/graph/config.js');
|
|
204
|
+
const graphId = process.env.GINKO_GRAPH_ID || await getGraphId();
|
|
205
|
+
if (!graphId)
|
|
206
|
+
return;
|
|
207
|
+
const client = new GraphApiClient();
|
|
208
|
+
// Update task node with checkpoint properties
|
|
209
|
+
const props = {};
|
|
210
|
+
if (checkpoint.knownIssues?.length) {
|
|
211
|
+
props.knownIssues = JSON.stringify(checkpoint.knownIssues);
|
|
212
|
+
}
|
|
213
|
+
if (checkpoint.blockers?.length) {
|
|
214
|
+
props.blockers = JSON.stringify(checkpoint.blockers);
|
|
215
|
+
}
|
|
216
|
+
if (checkpoint.modifiedFiles?.length) {
|
|
217
|
+
props.modifiedFiles = JSON.stringify(checkpoint.modifiedFiles);
|
|
218
|
+
}
|
|
219
|
+
if (checkpoint.lastDeployed) {
|
|
220
|
+
props.lastDeployed = checkpoint.lastDeployed;
|
|
221
|
+
}
|
|
222
|
+
if (Object.keys(props).length > 0) {
|
|
223
|
+
await client.request('PATCH', `/api/v1/graph/nodes/${encodeURIComponent(taskId)}?graphId=${encodeURIComponent(graphId)}`, props);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
// Checkpoint push failure is non-fatal — log but don't block
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Get modified files from git since last task complete.
|
|
232
|
+
*/
|
|
233
|
+
export function getModifiedFiles() {
|
|
234
|
+
try {
|
|
235
|
+
const diff = execSync('git diff --name-only HEAD', { encoding: 'utf-8' }).trim();
|
|
236
|
+
const untracked = execSync('git ls-files --others --exclude-standard', { encoding: 'utf-8' }).trim();
|
|
237
|
+
const files = new Set();
|
|
238
|
+
if (diff)
|
|
239
|
+
diff.split('\n').forEach(f => files.add(f));
|
|
240
|
+
if (untracked)
|
|
241
|
+
untracked.split('\n').forEach(f => files.add(f));
|
|
242
|
+
return Array.from(files).filter(f => f.length > 0).sort();
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
return [];
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
// =============================================================================
|
|
249
|
+
// Formatting
|
|
250
|
+
// =============================================================================
|
|
251
|
+
/**
|
|
252
|
+
* Format sprint state for CLI display.
|
|
253
|
+
*/
|
|
254
|
+
export function formatSprintState(state) {
|
|
255
|
+
const lines = [];
|
|
256
|
+
lines.push(`Sprint: ${state.sprint} — ${state.sprintTitle}`);
|
|
257
|
+
lines.push(`Progress: ${state.progress.percentage}% (${state.progress.complete}/${state.progress.total} tasks complete)`);
|
|
258
|
+
lines.push('');
|
|
259
|
+
// Tasks
|
|
260
|
+
lines.push('Tasks:');
|
|
261
|
+
for (const [id, task] of Object.entries(state.tasks)) {
|
|
262
|
+
const shortId = id.split('_').pop() || id;
|
|
263
|
+
let icon;
|
|
264
|
+
switch (task.status) {
|
|
265
|
+
case 'complete':
|
|
266
|
+
icon = '✅';
|
|
267
|
+
break;
|
|
268
|
+
case 'in_progress':
|
|
269
|
+
icon = '🔄';
|
|
270
|
+
break;
|
|
271
|
+
case 'blocked':
|
|
272
|
+
icon = '⛔';
|
|
273
|
+
break;
|
|
274
|
+
default:
|
|
275
|
+
icon = '⬜';
|
|
276
|
+
break;
|
|
277
|
+
}
|
|
278
|
+
lines.push(` ${icon} ${shortId}: ${task.title}`);
|
|
279
|
+
}
|
|
280
|
+
// Known Issues
|
|
281
|
+
if (state.knownIssues.length > 0) {
|
|
282
|
+
lines.push('');
|
|
283
|
+
lines.push('Known Issues:');
|
|
284
|
+
for (const issue of state.knownIssues) {
|
|
285
|
+
lines.push(` - ${issue}`);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
// Blockers
|
|
289
|
+
if (state.blockers.length > 0) {
|
|
290
|
+
lines.push('');
|
|
291
|
+
lines.push('Blockers:');
|
|
292
|
+
for (const blocker of state.blockers) {
|
|
293
|
+
lines.push(` - ${blocker}`);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
lines.push('');
|
|
298
|
+
lines.push('Blockers: none');
|
|
299
|
+
}
|
|
300
|
+
if (state.lastDeployed) {
|
|
301
|
+
lines.push(`Last deployed: ${state.lastDeployed}`);
|
|
302
|
+
}
|
|
303
|
+
lines.push(`Last updated: ${state.lastUpdated}${state.lastUpdatedBy ? ` (after ${state.lastUpdatedBy})` : ''}`);
|
|
304
|
+
if (state.stale) {
|
|
305
|
+
lines.push('⚠ Cache may be stale — run `ginko pull` to refresh');
|
|
306
|
+
}
|
|
307
|
+
return lines.join('\n');
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Format a compact sprint checkpoint for ginko start readiness message.
|
|
311
|
+
*/
|
|
312
|
+
export function formatCheckpointSummary(state) {
|
|
313
|
+
const lines = [];
|
|
314
|
+
lines.push(`Sprint: ${state.sprint} — ${state.sprintTitle} (${state.progress.percentage}%)`);
|
|
315
|
+
// Find last completed and next task
|
|
316
|
+
let lastCompleted = null;
|
|
317
|
+
let nextTask = null;
|
|
318
|
+
const taskEntries = Object.entries(state.tasks);
|
|
319
|
+
for (const [id, task] of taskEntries) {
|
|
320
|
+
if (task.status === 'complete')
|
|
321
|
+
lastCompleted = `${id.split('_').pop()}: ${task.title}`;
|
|
322
|
+
if (!nextTask && (task.status === 'not_started' || task.status === 'in_progress')) {
|
|
323
|
+
const verb = task.status === 'in_progress' ? 'continue' : 'start';
|
|
324
|
+
nextTask = `${id.split('_').pop()}: ${task.title} (${verb})`;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
if (lastCompleted)
|
|
328
|
+
lines.push(` Last: ${lastCompleted}`);
|
|
329
|
+
if (state.knownIssues.length > 0) {
|
|
330
|
+
lines.push(` Issues: ${state.knownIssues.join('; ')}`);
|
|
331
|
+
}
|
|
332
|
+
if (nextTask)
|
|
333
|
+
lines.push(` Next: ${nextTask}`);
|
|
334
|
+
if (state.stale)
|
|
335
|
+
lines.push(' ⚠ State may be stale — `ginko pull` to refresh');
|
|
336
|
+
return lines.join('\n');
|
|
337
|
+
}
|
|
338
|
+
//# sourceMappingURL=sprint-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sprint-state.js","sourceRoot":"","sources":["../../src/lib/sprint-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: utility
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2026-03-09
|
|
5
|
+
* @tags: [protection, safeguards, startup, lightweight]
|
|
6
|
+
* @related: [protected-manifest.ts, protection-hook.ts, ../commands/start/start-reflection.ts]
|
|
7
|
+
* @priority: high
|
|
8
|
+
* @complexity: low
|
|
9
|
+
*/
|
|
10
|
+
interface SafeguardResult {
|
|
11
|
+
installed: string[];
|
|
12
|
+
warnings: string[];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Check for and auto-install missing structural safeguards.
|
|
16
|
+
* Designed to be fast and safe to run on every `ginko start`.
|
|
17
|
+
* Returns messages to display (empty if everything is in place).
|
|
18
|
+
*/
|
|
19
|
+
export declare function ensureStructuralSafeguards(): Promise<SafeguardResult>;
|
|
20
|
+
/**
|
|
21
|
+
* Format safeguard results for display.
|
|
22
|
+
* Returns null if nothing to show.
|
|
23
|
+
*/
|
|
24
|
+
export declare function formatSafeguardMessage(result: SafeguardResult): string | null;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=structural-safeguards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structural-safeguards.d.ts","sourceRoot":"","sources":["../../src/lib/structural-safeguards.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAgBH,UAAU,eAAe;IACvB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,eAAe,CAAC,CA4C3E;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAqB7E"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: utility
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2026-03-09
|
|
5
|
+
* @tags: [protection, safeguards, startup, lightweight]
|
|
6
|
+
* @related: [protected-manifest.ts, protection-hook.ts, ../commands/start/start-reflection.ts]
|
|
7
|
+
* @priority: high
|
|
8
|
+
* @complexity: low
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Structural Safeguards — lightweight check for missing infrastructure.
|
|
12
|
+
*
|
|
13
|
+
* Runs on `ginko start` to detect and auto-install safeguards added in
|
|
14
|
+
* newer CLI versions. Unlike `ginko init --upgrade` (which regenerates
|
|
15
|
+
* CLAUDE.md, skills, and commands), this only touches structural pieces
|
|
16
|
+
* that are safe to create idempotently.
|
|
17
|
+
*/
|
|
18
|
+
import fs from 'fs-extra';
|
|
19
|
+
import path from 'path';
|
|
20
|
+
import chalk from 'chalk';
|
|
21
|
+
import { findGinkoRoot } from '../utils/ginko-root.js';
|
|
22
|
+
/**
|
|
23
|
+
* Check for and auto-install missing structural safeguards.
|
|
24
|
+
* Designed to be fast and safe to run on every `ginko start`.
|
|
25
|
+
* Returns messages to display (empty if everything is in place).
|
|
26
|
+
*/
|
|
27
|
+
export async function ensureStructuralSafeguards() {
|
|
28
|
+
const installed = [];
|
|
29
|
+
const warnings = [];
|
|
30
|
+
try {
|
|
31
|
+
const projectRoot = await findGinkoRoot();
|
|
32
|
+
if (!projectRoot)
|
|
33
|
+
return { installed, warnings };
|
|
34
|
+
const ginkoDir = path.join(projectRoot, '.ginko');
|
|
35
|
+
if (!(await fs.pathExists(ginkoDir)))
|
|
36
|
+
return { installed, warnings };
|
|
37
|
+
// 1. Check PROTECTED manifest
|
|
38
|
+
const protectedPath = path.join(ginkoDir, 'PROTECTED');
|
|
39
|
+
if (!(await fs.pathExists(protectedPath))) {
|
|
40
|
+
try {
|
|
41
|
+
const { generateManifest } = await import('./protected-manifest.js');
|
|
42
|
+
await fs.writeFile(protectedPath, generateManifest());
|
|
43
|
+
installed.push('.ginko/PROTECTED manifest');
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
warnings.push('Could not create .ginko/PROTECTED manifest');
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// 2. Check pre-commit protection hook
|
|
50
|
+
try {
|
|
51
|
+
const { isHookInstalled, installPreCommitHook } = await import('./protection-hook.js');
|
|
52
|
+
if (!(await isHookInstalled(projectRoot))) {
|
|
53
|
+
const result = await installPreCommitHook(projectRoot);
|
|
54
|
+
if (result.installed) {
|
|
55
|
+
installed.push('pre-commit protection hook');
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
warnings.push(result.message);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// Not a git repo or hook install failed — skip silently
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// Non-critical — don't break start
|
|
68
|
+
}
|
|
69
|
+
return { installed, warnings };
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Format safeguard results for display.
|
|
73
|
+
* Returns null if nothing to show.
|
|
74
|
+
*/
|
|
75
|
+
export function formatSafeguardMessage(result) {
|
|
76
|
+
if (result.installed.length === 0 && result.warnings.length === 0) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
const lines = [];
|
|
80
|
+
if (result.installed.length > 0) {
|
|
81
|
+
lines.push(chalk.green(' Safeguards installed: ') +
|
|
82
|
+
chalk.dim(result.installed.join(', ')));
|
|
83
|
+
}
|
|
84
|
+
if (result.warnings.length > 0) {
|
|
85
|
+
for (const w of result.warnings) {
|
|
86
|
+
lines.push(chalk.yellow(` Safeguard warning: ${w}`));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return lines.join('\n');
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=structural-safeguards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structural-safeguards.js","sourceRoot":"","sources":["../../src/lib/structural-safeguards.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAiBH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,eAAe,CAAC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,aAAa,EAAE,KAAK,CAAC;QACnB,IAAI,EAAE,YAAY,GAAG,YAAY,GAAG,aAAa,CAAC;QAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAyC/E;AA4BD;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKvE"}
|
package/dist/lib/sync/scanner.js
CHANGED
|
@@ -18,11 +18,9 @@
|
|
|
18
18
|
*
|
|
19
19
|
* Returns structured LocalNode objects with metadata and relationships
|
|
20
20
|
*/
|
|
21
|
-
import glob from 'glob';
|
|
21
|
+
import { glob } from 'glob';
|
|
22
22
|
import path from 'path';
|
|
23
|
-
import { promisify } from 'util';
|
|
24
23
|
import { parseMarkdownFile } from './parser.js';
|
|
25
|
-
const globAsync = promisify(glob);
|
|
26
24
|
/**
|
|
27
25
|
* Scan local filesystem for knowledge files
|
|
28
26
|
*/
|
|
@@ -31,7 +29,7 @@ export async function scanLocalKnowledge(basePath) {
|
|
|
31
29
|
try {
|
|
32
30
|
// Scan ADRs
|
|
33
31
|
const adrPattern = path.join(basePath, 'docs/adr/ADR-*.md');
|
|
34
|
-
const adrFiles = await
|
|
32
|
+
const adrFiles = await glob(adrPattern);
|
|
35
33
|
for (const filePath of adrFiles) {
|
|
36
34
|
try {
|
|
37
35
|
const parsed = await parseMarkdownFile(filePath);
|
|
@@ -44,7 +42,7 @@ export async function scanLocalKnowledge(basePath) {
|
|
|
44
42
|
}
|
|
45
43
|
// Scan PRDs
|
|
46
44
|
const prdPattern = path.join(basePath, 'docs/PRD/PRD-*.md');
|
|
47
|
-
const prdFiles = await
|
|
45
|
+
const prdFiles = await glob(prdPattern);
|
|
48
46
|
for (const filePath of prdFiles) {
|
|
49
47
|
try {
|
|
50
48
|
const parsed = await parseMarkdownFile(filePath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../../src/lib/sync/scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;;;;GASG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../../src/lib/sync/scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -63,6 +63,8 @@ export interface ParsedTask {
|
|
|
63
63
|
confidence: number | null;
|
|
64
64
|
/** Assessed content quality */
|
|
65
65
|
content_quality: TaskContentQuality;
|
|
66
|
+
/** Verification steps (EPIC-025) */
|
|
67
|
+
verification_steps: string[];
|
|
66
68
|
}
|
|
67
69
|
/**
|
|
68
70
|
* Sprint metadata extracted alongside tasks
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-parser.d.ts","sourceRoot":"","sources":["../../src/lib/task-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAmBH;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,aAAa,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE3F;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;AAE9D;;;;;;;;;GASG;AACH,MAAM,WAAW,UAAU;IACzB,kEAAkE;IAClE,EAAE,EAAE,MAAM,CAAC;IACX,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,qBAAqB;IACrB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,yDAAyD;IACzD,cAAc,EAAE,UAAU,CAAC;IAG3B,qDAAqD;IACrD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,oDAAoD;IACpD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,oDAAoD;IACpD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,yCAAyC;IACzC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAErB,2EAA2E;IAC3E,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAEpB,oDAAoD;IACpD,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,uBAAuB;IACvB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,6BAA6B;IAC7B,YAAY,EAAE,MAAM,EAAE,CAAC;IAGvB,wDAAwD;IACxD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,+BAA+B;IAC/B,eAAe,EAAE,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"task-parser.d.ts","sourceRoot":"","sources":["../../src/lib/task-parser.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/task-parser.js
CHANGED
|
@@ -223,6 +223,32 @@ function extractAcceptanceCriteria(blockText) {
|
|
|
223
223
|
}
|
|
224
224
|
return criteria;
|
|
225
225
|
}
|
|
226
|
+
/**
|
|
227
|
+
* Extract verification steps from task block (EPIC-025)
|
|
228
|
+
*
|
|
229
|
+
* Parses the **Verification:** section — concrete check steps
|
|
230
|
+
* distinct from acceptance criteria.
|
|
231
|
+
*/
|
|
232
|
+
function extractVerificationSteps(blockText) {
|
|
233
|
+
const steps = [];
|
|
234
|
+
// Find verification section — must not match "Verification Gate" or similar
|
|
235
|
+
const sectionMatch = blockText.match(/\*\*Verification(?:\s*\([^)]*\))?:\*\*\s*([\s\S]*?)(?=\n\*\*(?!Verification)|\n###|\n---|\n##|$)/i);
|
|
236
|
+
if (!sectionMatch)
|
|
237
|
+
return steps;
|
|
238
|
+
// Extract checkbox items: - [ ] or - [x]
|
|
239
|
+
const checkboxMatches = sectionMatch[1].matchAll(/^-\s+\[.\]\s+(.+?)$/gm);
|
|
240
|
+
for (const match of checkboxMatches) {
|
|
241
|
+
steps.push(match[1].trim());
|
|
242
|
+
}
|
|
243
|
+
// Also extract plain bullets if no checkboxes found
|
|
244
|
+
if (steps.length === 0) {
|
|
245
|
+
const bulletMatches = sectionMatch[1].matchAll(/^-\s+(.+?)$/gm);
|
|
246
|
+
for (const match of bulletMatches) {
|
|
247
|
+
steps.push(match[1].trim());
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return steps;
|
|
251
|
+
}
|
|
226
252
|
/**
|
|
227
253
|
* Extract file paths from task block
|
|
228
254
|
*/
|
|
@@ -341,6 +367,8 @@ export function parseTaskBlock(blockText, sprintContext) {
|
|
|
341
367
|
const confidence = extractConfidence(blockText);
|
|
342
368
|
// Extract acceptance criteria
|
|
343
369
|
const acceptanceCriteria = extractAcceptanceCriteria(blockText);
|
|
370
|
+
// Extract verification steps (EPIC-025)
|
|
371
|
+
const verificationSteps = extractVerificationSteps(blockText);
|
|
344
372
|
// Extract files
|
|
345
373
|
const files = extractFiles(blockText);
|
|
346
374
|
// Extract related ADRs
|
|
@@ -369,6 +397,8 @@ export function parseTaskBlock(blockText, sprintContext) {
|
|
|
369
397
|
// Quality metadata
|
|
370
398
|
confidence,
|
|
371
399
|
content_quality: 'thin', // Will be assessed below
|
|
400
|
+
// Verification (EPIC-025)
|
|
401
|
+
verification_steps: verificationSteps,
|
|
372
402
|
};
|
|
373
403
|
// Assess content quality
|
|
374
404
|
parsedTask.content_quality = assessTaskContentQuality(parsedTask);
|