@ginkoai/cli 2.4.5 → 2.5.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/LICENSE +661 -21
- package/dist/commands/agent/status.d.ts.map +1 -1
- package/dist/commands/agent/status.js +2 -0
- package/dist/commands/agent/status.js.map +1 -1
- package/dist/commands/assign.d.ts.map +1 -1
- package/dist/commands/assign.js +2 -0
- package/dist/commands/assign.js.map +1 -1
- package/dist/commands/charter.js +3 -3
- package/dist/commands/charter.js.map +1 -1
- package/dist/commands/context/index.d.ts +28 -0
- package/dist/commands/context/index.d.ts.map +1 -0
- package/dist/commands/context/index.js +165 -0
- package/dist/commands/context/index.js.map +1 -0
- package/dist/commands/context/score.d.ts +34 -0
- package/dist/commands/context/score.d.ts.map +1 -0
- package/dist/commands/context/score.js +163 -0
- package/dist/commands/context/score.js.map +1 -0
- package/dist/commands/diff/diff-command.d.ts.map +1 -1
- package/dist/commands/diff/diff-command.js +2 -0
- package/dist/commands/diff/diff-command.js.map +1 -1
- package/dist/commands/epic/status.d.ts.map +1 -1
- package/dist/commands/epic/status.js +5 -0
- package/dist/commands/epic/status.js.map +1 -1
- package/dist/commands/graph/api-client.d.ts +130 -0
- package/dist/commands/graph/api-client.d.ts.map +1 -1
- package/dist/commands/graph/api-client.js +153 -0
- package/dist/commands/graph/api-client.js.map +1 -1
- package/dist/commands/graph/cleanup.d.ts.map +1 -1
- package/dist/commands/graph/cleanup.js +2 -0
- package/dist/commands/graph/cleanup.js.map +1 -1
- package/dist/commands/graph/explore.d.ts.map +1 -1
- package/dist/commands/graph/explore.js +2 -0
- package/dist/commands/graph/explore.js.map +1 -1
- package/dist/commands/graph/query.d.ts.map +1 -1
- package/dist/commands/graph/query.js +2 -0
- package/dist/commands/graph/query.js.map +1 -1
- package/dist/commands/graph/status.d.ts.map +1 -1
- package/dist/commands/graph/status.js +2 -0
- package/dist/commands/graph/status.js.map +1 -1
- package/dist/commands/handoff.d.ts.map +1 -1
- package/dist/commands/handoff.js +34 -0
- package/dist/commands/handoff.js.map +1 -1
- package/dist/commands/health.d.ts +15 -0
- package/dist/commands/health.d.ts.map +1 -0
- package/dist/commands/health.js +212 -0
- package/dist/commands/health.js.map +1 -0
- package/dist/commands/init-copilot.js +1 -1
- package/dist/commands/init-copilot.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +74 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/join/index.js +2 -2
- package/dist/commands/knowledge/create.d.ts.map +1 -1
- package/dist/commands/knowledge/create.js +2 -0
- package/dist/commands/knowledge/create.js.map +1 -1
- package/dist/commands/knowledge/graph.d.ts.map +1 -1
- package/dist/commands/knowledge/graph.js +2 -0
- package/dist/commands/knowledge/graph.js.map +1 -1
- package/dist/commands/knowledge/search.d.ts.map +1 -1
- package/dist/commands/knowledge/search.js +2 -0
- package/dist/commands/knowledge/search.js.map +1 -1
- package/dist/commands/log.d.ts.map +1 -1
- package/dist/commands/log.js +4 -3
- package/dist/commands/log.js.map +1 -1
- package/dist/commands/orchestrate.d.ts.map +1 -1
- package/dist/commands/orchestrate.js +2 -0
- package/dist/commands/orchestrate.js.map +1 -1
- package/dist/commands/pull/pull-command.d.ts.map +1 -1
- package/dist/commands/pull/pull-command.js +2 -0
- 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 +5 -0
- package/dist/commands/push/push-command.js.map +1 -1
- package/dist/commands/ship.js +1 -1
- package/dist/commands/ship.js.map +1 -1
- package/dist/commands/sprint/create.d.ts +9 -5
- package/dist/commands/sprint/create.d.ts.map +1 -1
- package/dist/commands/sprint/create.js +226 -29
- package/dist/commands/sprint/create.js.map +1 -1
- package/dist/commands/sprint/index.d.ts.map +1 -1
- package/dist/commands/sprint/index.js +9 -5
- package/dist/commands/sprint/index.js.map +1 -1
- package/dist/commands/sprint/status.d.ts +3 -0
- package/dist/commands/sprint/status.d.ts.map +1 -1
- package/dist/commands/sprint/status.js +88 -2
- package/dist/commands/sprint/status.js.map +1 -1
- package/dist/commands/start/index.js +3 -3
- package/dist/commands/start/index.js.map +1 -1
- package/dist/commands/start/start-reflection.d.ts +5 -0
- package/dist/commands/start/start-reflection.d.ts.map +1 -1
- package/dist/commands/start/start-reflection.js +60 -11
- package/dist/commands/start/start-reflection.js.map +1 -1
- package/dist/commands/sync/sync-command.js +1 -1
- package/dist/commands/sync/sync-command.js.map +1 -1
- package/dist/commands/sync/team-sync.js +1 -1
- package/dist/commands/task/status.d.ts +1 -1
- package/dist/commands/task/status.d.ts.map +1 -1
- package/dist/commands/task/status.js +161 -6
- package/dist/commands/task/status.js.map +1 -1
- package/dist/commands/team/members.d.ts.map +1 -1
- package/dist/commands/team/members.js +4 -0
- package/dist/commands/team/members.js.map +1 -1
- package/dist/commands/team/projects.d.ts.map +1 -1
- package/dist/commands/team/projects.js +3 -0
- package/dist/commands/team/projects.js.map +1 -1
- package/dist/commands/team/status.d.ts.map +1 -1
- package/dist/commands/team/status.js +2 -0
- package/dist/commands/team/status.js.map +1 -1
- package/dist/index.js +12 -8
- package/dist/index.js.map +1 -1
- package/dist/lib/adoption-score.d.ts +1 -1
- package/dist/lib/adoption-score.d.ts.map +1 -1
- package/dist/lib/adoption-score.js +1 -0
- package/dist/lib/adoption-score.js.map +1 -1
- package/dist/lib/context-loader-events.d.ts +4 -4
- package/dist/lib/context-loader-events.d.ts.map +1 -1
- package/dist/lib/context-loader-events.js +69 -18
- package/dist/lib/context-loader-events.js.map +1 -1
- package/dist/lib/context-quality.d.ts +224 -0
- package/dist/lib/context-quality.d.ts.map +1 -0
- package/dist/lib/context-quality.js +363 -0
- package/dist/lib/context-quality.js.map +1 -0
- package/dist/lib/event-logger.d.ts.map +1 -1
- package/dist/lib/event-logger.js +2 -3
- package/dist/lib/event-logger.js.map +1 -1
- package/dist/lib/health-checker.d.ts +35 -0
- package/dist/lib/health-checker.d.ts.map +1 -0
- package/dist/lib/health-checker.js +475 -0
- package/dist/lib/health-checker.js.map +1 -0
- package/dist/lib/output-formatter.d.ts +48 -0
- package/dist/lib/output-formatter.d.ts.map +1 -1
- package/dist/lib/output-formatter.js +168 -4
- package/dist/lib/output-formatter.js.map +1 -1
- package/dist/lib/resumption-brief.d.ts +91 -0
- package/dist/lib/resumption-brief.d.ts.map +1 -0
- package/dist/lib/resumption-brief.js +344 -0
- package/dist/lib/resumption-brief.js.map +1 -0
- package/dist/lib/staleness-detector.js +1 -1
- package/dist/lib/state-cache.d.ts +43 -0
- package/dist/lib/state-cache.d.ts.map +1 -1
- package/dist/lib/state-cache.js +72 -0
- package/dist/lib/state-cache.js.map +1 -1
- package/dist/lib/targeted-coaching.js +2 -2
- package/dist/lib/task-parser.d.ts +34 -4
- package/dist/lib/task-parser.d.ts.map +1 -1
- package/dist/lib/task-parser.js +110 -4
- package/dist/lib/task-parser.js.map +1 -1
- package/dist/services/context-search.d.ts.map +1 -1
- package/dist/services/context-search.js +4 -2
- package/dist/services/context-search.js.map +1 -1
- package/dist/templates/ai-instructions-template.d.ts.map +1 -1
- package/dist/templates/ai-instructions-template.js +20 -0
- package/dist/templates/ai-instructions-template.js.map +1 -1
- package/dist/templates/commands/handoff.md +40 -0
- package/dist/templates/commands/quick.md +27 -0
- package/dist/templates/commands/ship.md +43 -0
- package/dist/templates/commands/start.md +15 -0
- package/dist/templates/commands/vibecheck.md +36 -0
- package/dist/templates/skills/ginko/SKILL.md +1 -8
- package/dist/templates/sprint-template.md +273 -0
- package/dist/utils/cloud-guard.d.ts +48 -0
- package/dist/utils/cloud-guard.d.ts.map +1 -0
- package/dist/utils/cloud-guard.js +107 -0
- package/dist/utils/cloud-guard.js.map +1 -0
- package/dist/utils/config-loader.d.ts +2 -2
- package/dist/utils/config-loader.js +2 -2
- package/dist/utils/helpers.d.ts.map +1 -1
- package/dist/utils/helpers.js +11 -10
- package/dist/utils/helpers.js.map +1 -1
- package/dist/utils/perf-logger.d.ts +100 -0
- package/dist/utils/perf-logger.d.ts.map +1 -0
- package/dist/utils/perf-logger.js +132 -0
- package/dist/utils/perf-logger.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: utility
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2026-02-05
|
|
5
|
+
* @tags: [resumption-brief, context-synthesis, session-start, epic-018]
|
|
6
|
+
* @related: [context-loader-events.ts, ../commands/start/start-reflection.ts]
|
|
7
|
+
* @priority: critical
|
|
8
|
+
* @complexity: medium
|
|
9
|
+
* @dependencies: [context-loader-events.ts]
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Synthesize a resumption brief from loaded context (EPIC-018 Sprint 1 t01)
|
|
13
|
+
*
|
|
14
|
+
* Takes the raw events from LoadedContext and produces a structured
|
|
15
|
+
* ResumptionBrief that AI assistants can use to understand session state.
|
|
16
|
+
*
|
|
17
|
+
* @param context - Loaded context from event stream
|
|
18
|
+
* @param options - Synthesis options
|
|
19
|
+
* @returns Synthesized resumption brief
|
|
20
|
+
*/
|
|
21
|
+
export function synthesizeResumptionBrief(context, options = {}) {
|
|
22
|
+
const { maxEvents = 50, maxFiles = 10, includeTeam = false } = options;
|
|
23
|
+
// Combine events (my events + optionally team events)
|
|
24
|
+
const allEvents = includeTeam && context.teamEvents
|
|
25
|
+
? [...context.myEvents, ...context.teamEvents]
|
|
26
|
+
: context.myEvents;
|
|
27
|
+
// Sort by timestamp descending (most recent first)
|
|
28
|
+
const sortedEvents = [...allEvents]
|
|
29
|
+
.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime())
|
|
30
|
+
.slice(0, maxEvents);
|
|
31
|
+
// Extract components
|
|
32
|
+
const summary = generateSessionSummary(sortedEvents);
|
|
33
|
+
const stoppingPoint = findStoppingPoint(sortedEvents);
|
|
34
|
+
const openQuestions = extractOpenQuestions(sortedEvents);
|
|
35
|
+
const filesModified = extractFilesTouched(sortedEvents, maxFiles);
|
|
36
|
+
const duration = calculateSessionDuration(sortedEvents);
|
|
37
|
+
const decisions = extractDecisions(sortedEvents);
|
|
38
|
+
const insights = extractInsights(sortedEvents);
|
|
39
|
+
return {
|
|
40
|
+
lastSession: {
|
|
41
|
+
summary,
|
|
42
|
+
stoppingPoint,
|
|
43
|
+
openQuestions,
|
|
44
|
+
filesModified,
|
|
45
|
+
duration
|
|
46
|
+
},
|
|
47
|
+
decisions,
|
|
48
|
+
insights,
|
|
49
|
+
synthesizedAt: new Date(),
|
|
50
|
+
eventCount: sortedEvents.length
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Generate a summary of the session work (t01)
|
|
55
|
+
*
|
|
56
|
+
* Analyzes events to produce a concise summary like:
|
|
57
|
+
* "Renamed settings panel, investigating API"
|
|
58
|
+
*/
|
|
59
|
+
function generateSessionSummary(events) {
|
|
60
|
+
if (events.length === 0) {
|
|
61
|
+
return 'No recent session activity';
|
|
62
|
+
}
|
|
63
|
+
// Group events by category
|
|
64
|
+
const features = events.filter(e => e.category === 'feature');
|
|
65
|
+
const fixes = events.filter(e => e.category === 'fix');
|
|
66
|
+
const achievements = events.filter(e => e.category === 'achievement');
|
|
67
|
+
const summaryParts = [];
|
|
68
|
+
// Prioritize achievements (completed work)
|
|
69
|
+
if (achievements.length > 0) {
|
|
70
|
+
const recentAchievement = achievements[0];
|
|
71
|
+
summaryParts.push(truncateDescription(recentAchievement.description, 50));
|
|
72
|
+
}
|
|
73
|
+
// Add feature work
|
|
74
|
+
if (features.length > 0 && summaryParts.length < 2) {
|
|
75
|
+
const recentFeature = features[0];
|
|
76
|
+
const prefix = summaryParts.length > 0 ? 'working on' : '';
|
|
77
|
+
const desc = truncateDescription(recentFeature.description, 40);
|
|
78
|
+
summaryParts.push(prefix ? `${prefix} ${desc}` : desc);
|
|
79
|
+
}
|
|
80
|
+
// Add fix work
|
|
81
|
+
if (fixes.length > 0 && summaryParts.length < 2) {
|
|
82
|
+
const recentFix = fixes[0];
|
|
83
|
+
const prefix = summaryParts.length > 0 ? 'fixing' : '';
|
|
84
|
+
const desc = truncateDescription(recentFix.description, 40);
|
|
85
|
+
summaryParts.push(prefix ? `${prefix} ${desc}` : desc);
|
|
86
|
+
}
|
|
87
|
+
// Fallback to most recent event
|
|
88
|
+
if (summaryParts.length === 0) {
|
|
89
|
+
summaryParts.push(truncateDescription(events[0].description, 60));
|
|
90
|
+
}
|
|
91
|
+
return summaryParts.join(', ');
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Find where work stopped (t01)
|
|
95
|
+
*
|
|
96
|
+
* Looks at the most recent events to determine the stopping point.
|
|
97
|
+
* Returns something like: "Checking if 'team' appears in API responses"
|
|
98
|
+
*/
|
|
99
|
+
function findStoppingPoint(events) {
|
|
100
|
+
if (events.length === 0) {
|
|
101
|
+
return 'No stopping point identified';
|
|
102
|
+
}
|
|
103
|
+
// Most recent non-git event is typically where work stopped
|
|
104
|
+
const workEvents = events.filter(e => e.category !== 'git' &&
|
|
105
|
+
e.category !== 'achievement' // Achievements are completed, not stopping points
|
|
106
|
+
);
|
|
107
|
+
if (workEvents.length === 0) {
|
|
108
|
+
// If only git/achievements, last event was probably a commit
|
|
109
|
+
const lastEvent = events[0];
|
|
110
|
+
if (lastEvent.category === 'git') {
|
|
111
|
+
return `Last commit: ${truncateDescription(lastEvent.description, 60)}`;
|
|
112
|
+
}
|
|
113
|
+
if (lastEvent.category === 'achievement') {
|
|
114
|
+
return `Completed: ${truncateDescription(lastEvent.description, 60)}`;
|
|
115
|
+
}
|
|
116
|
+
return truncateDescription(lastEvent.description, 60);
|
|
117
|
+
}
|
|
118
|
+
const stoppingEvent = workEvents[0];
|
|
119
|
+
// Add file context if available
|
|
120
|
+
if (stoppingEvent.files && stoppingEvent.files.length > 0) {
|
|
121
|
+
const mainFile = stoppingEvent.files[0];
|
|
122
|
+
const fileName = mainFile.split('/').pop() || mainFile;
|
|
123
|
+
return `${truncateDescription(stoppingEvent.description, 50)} (in ${fileName})`;
|
|
124
|
+
}
|
|
125
|
+
return truncateDescription(stoppingEvent.description, 60);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Extract open questions from events (EPIC-018 Sprint 1 t03)
|
|
129
|
+
*
|
|
130
|
+
* Looks for decision/insight events with high impact that might indicate
|
|
131
|
+
* unresolved questions. Also parses descriptions for question patterns.
|
|
132
|
+
*/
|
|
133
|
+
function extractOpenQuestions(events) {
|
|
134
|
+
const questions = [];
|
|
135
|
+
const seenQuestions = new Set();
|
|
136
|
+
for (const event of events) {
|
|
137
|
+
// Look for explicit questions in descriptions
|
|
138
|
+
const questionPatterns = [
|
|
139
|
+
/\?$/, // Ends with question mark
|
|
140
|
+
/should we/i,
|
|
141
|
+
/need to decide/i,
|
|
142
|
+
/unclear/i,
|
|
143
|
+
/not sure/i,
|
|
144
|
+
/question:/i,
|
|
145
|
+
/todo:/i,
|
|
146
|
+
/tbd/i,
|
|
147
|
+
/investigate/i,
|
|
148
|
+
/figure out/i
|
|
149
|
+
];
|
|
150
|
+
const hasQuestionIndicator = questionPatterns.some(pattern => pattern.test(event.description));
|
|
151
|
+
// High-impact decisions might indicate open questions
|
|
152
|
+
const isHighImpactDecision = event.category === 'decision' &&
|
|
153
|
+
event.impact === 'high';
|
|
154
|
+
// Insights with uncertainty might be open questions
|
|
155
|
+
const isUncertainInsight = event.category === 'insight' &&
|
|
156
|
+
(event.description.toLowerCase().includes('maybe') ||
|
|
157
|
+
event.description.toLowerCase().includes('might') ||
|
|
158
|
+
event.description.toLowerCase().includes('could'));
|
|
159
|
+
if (hasQuestionIndicator || isHighImpactDecision || isUncertainInsight) {
|
|
160
|
+
// Extract the question or create one from the description
|
|
161
|
+
let question = event.description;
|
|
162
|
+
// Clean up the question
|
|
163
|
+
if (!question.endsWith('?')) {
|
|
164
|
+
// Convert statement to question if needed
|
|
165
|
+
if (question.toLowerCase().startsWith('should we')) {
|
|
166
|
+
question = question + '?';
|
|
167
|
+
}
|
|
168
|
+
else if (question.toLowerCase().includes('need to decide')) {
|
|
169
|
+
question = question.replace(/need to decide/i, 'Decision needed:');
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Deduplicate
|
|
173
|
+
const normalizedQuestion = question.toLowerCase().trim();
|
|
174
|
+
if (!seenQuestions.has(normalizedQuestion)) {
|
|
175
|
+
seenQuestions.add(normalizedQuestion);
|
|
176
|
+
questions.push(truncateDescription(question, 100));
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return questions.slice(0, 5); // Limit to 5 questions
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Extract files touched from events (EPIC-018 Sprint 1 t02)
|
|
184
|
+
*
|
|
185
|
+
* Collects unique files from event.files arrays and returns them
|
|
186
|
+
* sorted by frequency (most touched first).
|
|
187
|
+
*/
|
|
188
|
+
function extractFilesTouched(events, maxFiles) {
|
|
189
|
+
const fileCount = new Map();
|
|
190
|
+
for (const event of events) {
|
|
191
|
+
if (event.files && Array.isArray(event.files)) {
|
|
192
|
+
for (const file of event.files) {
|
|
193
|
+
if (file && typeof file === 'string') {
|
|
194
|
+
const count = fileCount.get(file) || 0;
|
|
195
|
+
fileCount.set(file, count + 1);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// Sort by frequency (most touched first)
|
|
201
|
+
const sortedFiles = Array.from(fileCount.entries())
|
|
202
|
+
.sort((a, b) => b[1] - a[1])
|
|
203
|
+
.map(([file]) => file);
|
|
204
|
+
return sortedFiles.slice(0, maxFiles);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Calculate session duration from events (t01)
|
|
208
|
+
*
|
|
209
|
+
* Returns human-readable duration like "2h 15m"
|
|
210
|
+
*/
|
|
211
|
+
function calculateSessionDuration(events) {
|
|
212
|
+
if (events.length < 2) {
|
|
213
|
+
return 'Unknown';
|
|
214
|
+
}
|
|
215
|
+
// Events are sorted descending (most recent first)
|
|
216
|
+
const mostRecent = new Date(events[0].timestamp);
|
|
217
|
+
const oldest = new Date(events[events.length - 1].timestamp);
|
|
218
|
+
const durationMs = mostRecent.getTime() - oldest.getTime();
|
|
219
|
+
const durationMinutes = Math.round(durationMs / (1000 * 60));
|
|
220
|
+
if (durationMinutes < 1) {
|
|
221
|
+
return 'Less than 1 minute';
|
|
222
|
+
}
|
|
223
|
+
else if (durationMinutes < 60) {
|
|
224
|
+
return `${durationMinutes}m`;
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
const hours = Math.floor(durationMinutes / 60);
|
|
228
|
+
const minutes = durationMinutes % 60;
|
|
229
|
+
return minutes > 0 ? `${hours}h ${minutes}m` : `${hours}h`;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Extract decisions from events (t01)
|
|
234
|
+
*/
|
|
235
|
+
function extractDecisions(events) {
|
|
236
|
+
return events
|
|
237
|
+
.filter(e => e.category === 'decision')
|
|
238
|
+
.map(e => ({
|
|
239
|
+
description: e.description,
|
|
240
|
+
timestamp: new Date(e.timestamp)
|
|
241
|
+
}))
|
|
242
|
+
.slice(0, 5); // Limit to 5 most recent
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Extract insights from events (t01)
|
|
246
|
+
*/
|
|
247
|
+
function extractInsights(events) {
|
|
248
|
+
return events
|
|
249
|
+
.filter(e => e.category === 'insight')
|
|
250
|
+
.map(e => ({
|
|
251
|
+
description: e.description,
|
|
252
|
+
timestamp: new Date(e.timestamp)
|
|
253
|
+
}))
|
|
254
|
+
.slice(0, 5); // Limit to 5 most recent
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Helper: Truncate description to max length with ellipsis
|
|
258
|
+
*/
|
|
259
|
+
function truncateDescription(description, maxLength) {
|
|
260
|
+
if (description.length <= maxLength) {
|
|
261
|
+
return description;
|
|
262
|
+
}
|
|
263
|
+
return description.substring(0, maxLength - 3) + '...';
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Format resumption brief for human display
|
|
267
|
+
*
|
|
268
|
+
* Converts the structured brief into a readable format.
|
|
269
|
+
*/
|
|
270
|
+
export function formatResumptionBrief(brief) {
|
|
271
|
+
const lines = [];
|
|
272
|
+
lines.push('=== Resumption Brief ===');
|
|
273
|
+
lines.push('');
|
|
274
|
+
// Last session summary
|
|
275
|
+
lines.push(`Summary: ${brief.lastSession.summary}`);
|
|
276
|
+
lines.push(`Stopping point: ${brief.lastSession.stoppingPoint}`);
|
|
277
|
+
lines.push(`Duration: ${brief.lastSession.duration}`);
|
|
278
|
+
lines.push('');
|
|
279
|
+
// Files modified
|
|
280
|
+
if (brief.lastSession.filesModified.length > 0) {
|
|
281
|
+
lines.push('Files touched:');
|
|
282
|
+
for (const file of brief.lastSession.filesModified.slice(0, 5)) {
|
|
283
|
+
lines.push(` - ${file}`);
|
|
284
|
+
}
|
|
285
|
+
if (brief.lastSession.filesModified.length > 5) {
|
|
286
|
+
lines.push(` ... and ${brief.lastSession.filesModified.length - 5} more`);
|
|
287
|
+
}
|
|
288
|
+
lines.push('');
|
|
289
|
+
}
|
|
290
|
+
// Open questions
|
|
291
|
+
if (brief.lastSession.openQuestions.length > 0) {
|
|
292
|
+
lines.push('Open questions:');
|
|
293
|
+
for (const question of brief.lastSession.openQuestions) {
|
|
294
|
+
lines.push(` ? ${question}`);
|
|
295
|
+
}
|
|
296
|
+
lines.push('');
|
|
297
|
+
}
|
|
298
|
+
// Decisions
|
|
299
|
+
if (brief.decisions.length > 0) {
|
|
300
|
+
lines.push('Recent decisions:');
|
|
301
|
+
for (const decision of brief.decisions.slice(0, 3)) {
|
|
302
|
+
lines.push(` - ${decision.description}`);
|
|
303
|
+
}
|
|
304
|
+
lines.push('');
|
|
305
|
+
}
|
|
306
|
+
// Insights
|
|
307
|
+
if (brief.insights.length > 0) {
|
|
308
|
+
lines.push('Insights:');
|
|
309
|
+
for (const insight of brief.insights.slice(0, 3)) {
|
|
310
|
+
lines.push(` - ${insight.description}`);
|
|
311
|
+
}
|
|
312
|
+
lines.push('');
|
|
313
|
+
}
|
|
314
|
+
lines.push(`Analyzed ${brief.eventCount} events`);
|
|
315
|
+
return lines.join('\n');
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Format resumption brief for AI context (JSONL entry)
|
|
319
|
+
*
|
|
320
|
+
* Returns a structured object suitable for AI consumption.
|
|
321
|
+
*/
|
|
322
|
+
export function formatResumptionBriefForAI(brief) {
|
|
323
|
+
return {
|
|
324
|
+
type: 'resumption_brief',
|
|
325
|
+
timestamp: brief.synthesizedAt.toISOString(),
|
|
326
|
+
lastSession: {
|
|
327
|
+
summary: brief.lastSession.summary,
|
|
328
|
+
stoppingPoint: brief.lastSession.stoppingPoint,
|
|
329
|
+
openQuestions: brief.lastSession.openQuestions,
|
|
330
|
+
filesModified: brief.lastSession.filesModified,
|
|
331
|
+
duration: brief.lastSession.duration
|
|
332
|
+
},
|
|
333
|
+
decisions: brief.decisions.map(d => ({
|
|
334
|
+
description: d.description,
|
|
335
|
+
timestamp: d.timestamp.toISOString()
|
|
336
|
+
})),
|
|
337
|
+
insights: brief.insights.map(i => ({
|
|
338
|
+
description: i.description,
|
|
339
|
+
timestamp: i.timestamp.toISOString()
|
|
340
|
+
})),
|
|
341
|
+
eventCount: brief.eventCount
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
//# sourceMappingURL=resumption-brief.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resumption-brief.js","sourceRoot":"","sources":["../../src/lib/resumption-brief.ts"],"names":[],"mappings":"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"}
|
|
@@ -166,7 +166,7 @@ export function displayStalenessWarning(result) {
|
|
|
166
166
|
}
|
|
167
167
|
}
|
|
168
168
|
console.log('');
|
|
169
|
-
console.log(chalk.dim(' Run `ginko
|
|
169
|
+
console.log(chalk.dim(' Run `ginko pull` to pull team updates.'));
|
|
170
170
|
console.log('');
|
|
171
171
|
}
|
|
172
172
|
// =============================================================================
|
|
@@ -123,6 +123,49 @@ export declare function checkCacheStaleness(cache: StateCache): CacheStalenessRe
|
|
|
123
123
|
* ```
|
|
124
124
|
*/
|
|
125
125
|
export declare function formatCacheAge(fetchedAt: string): string;
|
|
126
|
+
/**
|
|
127
|
+
* Load cached state only if it's fresh (< 5 minutes old)
|
|
128
|
+
* Returns null if cache is stale or doesn't exist
|
|
129
|
+
*
|
|
130
|
+
* This enables cache-first loading for faster startup:
|
|
131
|
+
* 1. Check cache - if fresh, return immediately (0ms network)
|
|
132
|
+
* 2. If stale/missing, fetch from API and update cache
|
|
133
|
+
*
|
|
134
|
+
* @param graphId - Graph ID to match against cached data
|
|
135
|
+
* @returns Fresh cache data or null if stale/missing
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* ```typescript
|
|
139
|
+
* // Cache-first pattern in start-reflection.ts:
|
|
140
|
+
* const cached = await loadFreshCache(graphId);
|
|
141
|
+
* if (cached) {
|
|
142
|
+
* return cached; // Skip API call, use cache
|
|
143
|
+
* }
|
|
144
|
+
* // Cache miss/stale - fetch from API
|
|
145
|
+
* const fresh = await fetchFromApi();
|
|
146
|
+
* await saveStateCache(fresh, graphId);
|
|
147
|
+
* ```
|
|
148
|
+
*/
|
|
149
|
+
export declare function loadFreshCache(graphId: string): Promise<ActiveSprintData | null>;
|
|
150
|
+
/**
|
|
151
|
+
* Try to load from cache first, falling back to API call
|
|
152
|
+
* Automatically updates cache on successful API fetch
|
|
153
|
+
*
|
|
154
|
+
* @param graphId - Graph namespace identifier
|
|
155
|
+
* @param fetchFn - Function to call if cache is stale/missing
|
|
156
|
+
* @returns Sprint data from cache or fresh API call
|
|
157
|
+
*
|
|
158
|
+
* @example
|
|
159
|
+
* ```typescript
|
|
160
|
+
* const data = await loadWithCacheFallback(graphId, async () => {
|
|
161
|
+
* return await client.getActiveSprint(graphId);
|
|
162
|
+
* });
|
|
163
|
+
* ```
|
|
164
|
+
*/
|
|
165
|
+
export declare function loadWithCacheFallback(graphId: string, fetchFn: () => Promise<ActiveSprintData>): Promise<{
|
|
166
|
+
data: ActiveSprintData;
|
|
167
|
+
source: 'cache' | 'api';
|
|
168
|
+
}>;
|
|
126
169
|
/**
|
|
127
170
|
* Get the full path to the cache file
|
|
128
171
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-cache.d.ts","sourceRoot":"","sources":["../../src/lib/state-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAsBH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE;QACR,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,WAAW,CAAC,EAAE;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,CAAC;KACjD,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,CAAC,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,gBAAgB,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;CACtB;AAiBD;;;;;;;;;;;;GAYG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAoBjE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CA4Bf;AAED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAUrD;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,GAAG,oBAAoB,CAsB3E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAwBxD;AAMD;;GAEG;AACH,iBAAe,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAG7C;AAED;;GAEG;AACH,iBAAS,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,UAAU,CAsCvD;AAMD,eAAO,MAAM,SAAS;;;;;;CAMrB,CAAC"}
|
|
1
|
+
{"version":3,"file":"state-cache.d.ts","sourceRoot":"","sources":["../../src/lib/state-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAsBH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE;QACR,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,WAAW,CAAC,EAAE;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,CAAC;KACjD,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,CAAC,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,gBAAgB,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;CACtB;AAiBD;;;;;;;;;;;;GAYG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAoBjE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CA4Bf;AAED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAUrD;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,GAAG,oBAAoB,CAsB3E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAwBxD;AAMD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAoBtF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,GACvC,OAAO,CAAC;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,OAAO,GAAG,KAAK,CAAA;CAAE,CAAC,CAgB9D;AAMD;;GAEG;AACH,iBAAe,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAG7C;AAED;;GAEG;AACH,iBAAS,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,UAAU,CAsCvD;AAMD,eAAO,MAAM,SAAS;;;;;;CAMrB,CAAC"}
|
package/dist/lib/state-cache.js
CHANGED
|
@@ -203,6 +203,78 @@ export function formatCacheAge(fetchedAt) {
|
|
|
203
203
|
return date.toLocaleDateString();
|
|
204
204
|
}
|
|
205
205
|
// =============================================================================
|
|
206
|
+
// EPIC-018 Sprint 1 TASK-04: Cache-First Optimization
|
|
207
|
+
// =============================================================================
|
|
208
|
+
/**
|
|
209
|
+
* Load cached state only if it's fresh (< 5 minutes old)
|
|
210
|
+
* Returns null if cache is stale or doesn't exist
|
|
211
|
+
*
|
|
212
|
+
* This enables cache-first loading for faster startup:
|
|
213
|
+
* 1. Check cache - if fresh, return immediately (0ms network)
|
|
214
|
+
* 2. If stale/missing, fetch from API and update cache
|
|
215
|
+
*
|
|
216
|
+
* @param graphId - Graph ID to match against cached data
|
|
217
|
+
* @returns Fresh cache data or null if stale/missing
|
|
218
|
+
*
|
|
219
|
+
* @example
|
|
220
|
+
* ```typescript
|
|
221
|
+
* // Cache-first pattern in start-reflection.ts:
|
|
222
|
+
* const cached = await loadFreshCache(graphId);
|
|
223
|
+
* if (cached) {
|
|
224
|
+
* return cached; // Skip API call, use cache
|
|
225
|
+
* }
|
|
226
|
+
* // Cache miss/stale - fetch from API
|
|
227
|
+
* const fresh = await fetchFromApi();
|
|
228
|
+
* await saveStateCache(fresh, graphId);
|
|
229
|
+
* ```
|
|
230
|
+
*/
|
|
231
|
+
export async function loadFreshCache(graphId) {
|
|
232
|
+
const cache = await loadStateCache();
|
|
233
|
+
// No cache exists
|
|
234
|
+
if (!cache) {
|
|
235
|
+
return null;
|
|
236
|
+
}
|
|
237
|
+
// Cache is for a different graph
|
|
238
|
+
if (cache.graph_id !== graphId) {
|
|
239
|
+
return null;
|
|
240
|
+
}
|
|
241
|
+
// Check if cache is fresh
|
|
242
|
+
const staleness = checkCacheStaleness(cache);
|
|
243
|
+
if (!staleness.isFresh) {
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
246
|
+
return cache.active_sprint;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Try to load from cache first, falling back to API call
|
|
250
|
+
* Automatically updates cache on successful API fetch
|
|
251
|
+
*
|
|
252
|
+
* @param graphId - Graph namespace identifier
|
|
253
|
+
* @param fetchFn - Function to call if cache is stale/missing
|
|
254
|
+
* @returns Sprint data from cache or fresh API call
|
|
255
|
+
*
|
|
256
|
+
* @example
|
|
257
|
+
* ```typescript
|
|
258
|
+
* const data = await loadWithCacheFallback(graphId, async () => {
|
|
259
|
+
* return await client.getActiveSprint(graphId);
|
|
260
|
+
* });
|
|
261
|
+
* ```
|
|
262
|
+
*/
|
|
263
|
+
export async function loadWithCacheFallback(graphId, fetchFn) {
|
|
264
|
+
// Try cache first
|
|
265
|
+
const cached = await loadFreshCache(graphId);
|
|
266
|
+
if (cached) {
|
|
267
|
+
return { data: cached, source: 'cache' };
|
|
268
|
+
}
|
|
269
|
+
// Cache miss - fetch from API
|
|
270
|
+
const fresh = await fetchFn();
|
|
271
|
+
// Update cache in background (don't await)
|
|
272
|
+
saveStateCache(fresh, graphId).catch(() => {
|
|
273
|
+
// Ignore cache save errors - non-critical
|
|
274
|
+
});
|
|
275
|
+
return { data: fresh, source: 'api' };
|
|
276
|
+
}
|
|
277
|
+
// =============================================================================
|
|
206
278
|
// Helper Functions
|
|
207
279
|
// =============================================================================
|
|
208
280
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-cache.js","sourceRoot":"","sources":["../../src/lib/state-cache.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"state-cache.js","sourceRoot":"","sources":["../../src/lib/state-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -109,8 +109,8 @@ export const COACHING_TIPS = [
|
|
|
109
109
|
id: 'quality-team-sync',
|
|
110
110
|
metric: 'collaborationQuality',
|
|
111
111
|
context: ['start'],
|
|
112
|
-
message: 'Run `ginko
|
|
113
|
-
action: 'ginko
|
|
112
|
+
message: 'Run `ginko pull` periodically to stay aligned with team updates',
|
|
113
|
+
action: 'ginko pull',
|
|
114
114
|
priority: 6,
|
|
115
115
|
},
|
|
116
116
|
// Anti-Patterns Tips
|
|
@@ -12,8 +12,19 @@
|
|
|
12
12
|
* Task status values (aligned with Status API)
|
|
13
13
|
*/
|
|
14
14
|
export type TaskStatus = 'not_started' | 'in_progress' | 'blocked' | 'complete' | 'paused';
|
|
15
|
+
/**
|
|
16
|
+
* Task content quality assessment (EPIC-018)
|
|
17
|
+
*/
|
|
18
|
+
export type TaskContentQuality = 'thin' | 'adequate' | 'rich';
|
|
15
19
|
/**
|
|
16
20
|
* Parsed task from sprint markdown
|
|
21
|
+
*
|
|
22
|
+
* EPIC-018: Rich task content follows WHY-WHAT-HOW structure:
|
|
23
|
+
* - problem: WHY this task exists (motivation)
|
|
24
|
+
* - solution: WHAT we're achieving (outcome)
|
|
25
|
+
* - approach: HOW we'll implement it (strategy)
|
|
26
|
+
* - scope: boundaries (in/out of scope)
|
|
27
|
+
* - acceptance_criteria: done when (definition of done)
|
|
17
28
|
*/
|
|
18
29
|
export interface ParsedTask {
|
|
19
30
|
/** Task ID (e.g., e015_s00a_t01, TASK-1, adhoc_260119_s01_t01) */
|
|
@@ -32,16 +43,26 @@ export interface ParsedTask {
|
|
|
32
43
|
assignee: string | null;
|
|
33
44
|
/** Initial status from checkbox (used only on CREATE) */
|
|
34
45
|
initial_status: TaskStatus;
|
|
35
|
-
/**
|
|
36
|
-
|
|
37
|
-
/**
|
|
46
|
+
/** WHY: Problem/motivation - why this task exists */
|
|
47
|
+
problem: string | null;
|
|
48
|
+
/** WHAT: Solution/outcome - what we're achieving */
|
|
49
|
+
solution: string | null;
|
|
50
|
+
/** HOW: Approach/strategy - implementation notes */
|
|
38
51
|
approach: string | null;
|
|
39
|
-
/**
|
|
52
|
+
/** Boundaries: What's in/out of scope */
|
|
53
|
+
scope: string | null;
|
|
54
|
+
/** @deprecated Use 'solution' instead. Kept for backward compatibility. */
|
|
55
|
+
goal: string | null;
|
|
56
|
+
/** Acceptance criteria list (definition of done) */
|
|
40
57
|
acceptance_criteria: string[];
|
|
41
58
|
/** Referenced files */
|
|
42
59
|
files: string[];
|
|
43
60
|
/** Related ADR references */
|
|
44
61
|
related_adrs: string[];
|
|
62
|
+
/** AI confidence score (0-100) when task was created */
|
|
63
|
+
confidence: number | null;
|
|
64
|
+
/** Assessed content quality */
|
|
65
|
+
content_quality: TaskContentQuality;
|
|
45
66
|
}
|
|
46
67
|
/**
|
|
47
68
|
* Sprint metadata extracted alongside tasks
|
|
@@ -73,6 +94,15 @@ export declare function parseTaskHierarchy(taskId: string): {
|
|
|
73
94
|
sprint_id: string;
|
|
74
95
|
epic_id: string;
|
|
75
96
|
} | null;
|
|
97
|
+
/**
|
|
98
|
+
* Assess task content quality (EPIC-018)
|
|
99
|
+
*
|
|
100
|
+
* Evaluates whether a task has enough content to work autonomously.
|
|
101
|
+
* - thin: Missing critical fields (problem, acceptance criteria)
|
|
102
|
+
* - adequate: Has basics but missing approach or scope
|
|
103
|
+
* - rich: Complete WHY-WHAT-HOW structure
|
|
104
|
+
*/
|
|
105
|
+
export declare function assessTaskContentQuality(task: ParsedTask): TaskContentQuality;
|
|
76
106
|
/**
|
|
77
107
|
* Parse a single task block
|
|
78
108
|
*
|
|
@@ -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,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;
|
|
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;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,mDAAmD;IACnD,EAAE,EAAE,MAAM,CAAC;IACX,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA8BhG;AAkJD;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,UAAU,GAAG,kBAAkB,CAa7E;AAwED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,aAAa,CAAC,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACrD,UAAU,GAAG,IAAI,CAgInB;AA4GD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CAwBrF;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAazF;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAyBtF"}
|