@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
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: utility
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2026-01-26
|
|
5
|
+
* @tags: [adoption, coaching, behavior, quieting, epic-016-s04]
|
|
6
|
+
* @related: [planning-menu.ts, user-sprint.ts, insights/index.ts]
|
|
7
|
+
* @priority: medium
|
|
8
|
+
* @complexity: low
|
|
9
|
+
* @dependencies: [fs-extra, path]
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Behavior-Based Quieting (EPIC-016 Sprint 4 t05)
|
|
13
|
+
*
|
|
14
|
+
* Tracks pattern adoption signals and adjusts planning menu verbosity.
|
|
15
|
+
*
|
|
16
|
+
* Signals of Adoption:
|
|
17
|
+
* | User Behavior | Points |
|
|
18
|
+
* |----------------------------------|--------|
|
|
19
|
+
* | "What's our next task?" | +1 |
|
|
20
|
+
* | "Let's continue Sprint X" | +1 |
|
|
21
|
+
* | `ginko sprint` unprompted | +2 |
|
|
22
|
+
* | Selects [d] Something else | +0 |
|
|
23
|
+
* | 3+ consecutive ad-hoc sessions | reset |
|
|
24
|
+
*
|
|
25
|
+
* Quieting Levels:
|
|
26
|
+
* - 0-5 points: Full prompts (default for new users)
|
|
27
|
+
* - 6-15 points: Lighter prompts (briefer menu)
|
|
28
|
+
* - 16+ points: Minimal prompts (only when truly unstructured)
|
|
29
|
+
*/
|
|
30
|
+
import fs from 'fs-extra';
|
|
31
|
+
import path from 'path';
|
|
32
|
+
import { getUserEmail, getGinkoDir } from '../utils/helpers.js';
|
|
33
|
+
// =============================================================================
|
|
34
|
+
// Constants
|
|
35
|
+
// =============================================================================
|
|
36
|
+
const ADOPTION_FILE = 'adoption-score.json';
|
|
37
|
+
const SIGNAL_POINTS = {
|
|
38
|
+
'asked_next_task': 1,
|
|
39
|
+
'continued_sprint': 1,
|
|
40
|
+
'created_sprint': 2,
|
|
41
|
+
'created_epic': 2,
|
|
42
|
+
'used_quick_fix': 1,
|
|
43
|
+
'chose_adhoc': 0,
|
|
44
|
+
'completed_task': 1,
|
|
45
|
+
'adhoc_streak': -999, // Special: resets score
|
|
46
|
+
};
|
|
47
|
+
const LEVEL_THRESHOLDS = {
|
|
48
|
+
minimal: 16, // 16+ points
|
|
49
|
+
light: 6, // 6-15 points
|
|
50
|
+
full: 0, // 0-5 points
|
|
51
|
+
};
|
|
52
|
+
// =============================================================================
|
|
53
|
+
// Score Management
|
|
54
|
+
// =============================================================================
|
|
55
|
+
/**
|
|
56
|
+
* Get path to user's adoption score file
|
|
57
|
+
*/
|
|
58
|
+
async function getAdoptionFilePath() {
|
|
59
|
+
const ginkoDir = await getGinkoDir();
|
|
60
|
+
const userEmail = await getUserEmail();
|
|
61
|
+
const userSlug = userEmail.replace('@', '-at-').replace(/\./g, '-');
|
|
62
|
+
return path.join(ginkoDir, 'sessions', userSlug, ADOPTION_FILE);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Load user's adoption score
|
|
66
|
+
*/
|
|
67
|
+
export async function getAdoptionScore() {
|
|
68
|
+
const filePath = await getAdoptionFilePath();
|
|
69
|
+
try {
|
|
70
|
+
if (await fs.pathExists(filePath)) {
|
|
71
|
+
const data = await fs.readJSON(filePath);
|
|
72
|
+
return {
|
|
73
|
+
score: data.score || 0,
|
|
74
|
+
level: calculateLevel(data.score || 0),
|
|
75
|
+
history: data.history || [],
|
|
76
|
+
lastUpdated: data.lastUpdated || new Date().toISOString(),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// Return default if file is corrupted
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
score: 0,
|
|
85
|
+
level: 'full',
|
|
86
|
+
history: [],
|
|
87
|
+
lastUpdated: new Date().toISOString(),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Save user's adoption score
|
|
92
|
+
*/
|
|
93
|
+
async function saveAdoptionScore(score) {
|
|
94
|
+
const filePath = await getAdoptionFilePath();
|
|
95
|
+
await fs.ensureDir(path.dirname(filePath));
|
|
96
|
+
await fs.writeJSON(filePath, score, { spaces: 2 });
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Calculate quieting level from score
|
|
100
|
+
*/
|
|
101
|
+
function calculateLevel(score) {
|
|
102
|
+
if (score >= LEVEL_THRESHOLDS.minimal)
|
|
103
|
+
return 'minimal';
|
|
104
|
+
if (score >= LEVEL_THRESHOLDS.light)
|
|
105
|
+
return 'light';
|
|
106
|
+
return 'full';
|
|
107
|
+
}
|
|
108
|
+
// =============================================================================
|
|
109
|
+
// Signal Recording
|
|
110
|
+
// =============================================================================
|
|
111
|
+
/**
|
|
112
|
+
* Record an adoption signal
|
|
113
|
+
*
|
|
114
|
+
* @param signal - The adoption signal to record
|
|
115
|
+
* @returns Updated adoption score
|
|
116
|
+
*/
|
|
117
|
+
export async function recordAdoptionSignal(signal) {
|
|
118
|
+
const current = await getAdoptionScore();
|
|
119
|
+
const points = SIGNAL_POINTS[signal];
|
|
120
|
+
// Special case: adhoc_streak resets score
|
|
121
|
+
if (signal === 'adhoc_streak') {
|
|
122
|
+
current.score = 0;
|
|
123
|
+
current.history = [];
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
current.score = Math.max(0, current.score + points);
|
|
127
|
+
// Keep last 50 history entries
|
|
128
|
+
current.history.push({
|
|
129
|
+
date: new Date().toISOString(),
|
|
130
|
+
signal,
|
|
131
|
+
points,
|
|
132
|
+
});
|
|
133
|
+
if (current.history.length > 50) {
|
|
134
|
+
current.history = current.history.slice(-50);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
current.level = calculateLevel(current.score);
|
|
138
|
+
current.lastUpdated = new Date().toISOString();
|
|
139
|
+
await saveAdoptionScore(current);
|
|
140
|
+
return current;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Check if ad-hoc streak should reset score
|
|
144
|
+
*
|
|
145
|
+
* @param consecutiveAdhocSessions - Number of consecutive ad-hoc sessions
|
|
146
|
+
* @returns true if score was reset
|
|
147
|
+
*/
|
|
148
|
+
export async function checkAdhocStreak(consecutiveAdhocSessions) {
|
|
149
|
+
if (consecutiveAdhocSessions >= 3) {
|
|
150
|
+
await recordAdoptionSignal('adhoc_streak');
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Get planning menu configuration based on adoption level
|
|
157
|
+
*/
|
|
158
|
+
export async function getPlanningMenuConfig() {
|
|
159
|
+
const { level, score } = await getAdoptionScore();
|
|
160
|
+
switch (level) {
|
|
161
|
+
case 'minimal':
|
|
162
|
+
// High adopters: minimal prompts
|
|
163
|
+
return {
|
|
164
|
+
showFullDescription: false,
|
|
165
|
+
showCoachingTip: false,
|
|
166
|
+
showCelebration: score >= 20, // Celebrate high adopters occasionally
|
|
167
|
+
};
|
|
168
|
+
case 'light':
|
|
169
|
+
// Medium adopters: lighter prompts
|
|
170
|
+
return {
|
|
171
|
+
showFullDescription: true,
|
|
172
|
+
showCoachingTip: false,
|
|
173
|
+
showCelebration: false,
|
|
174
|
+
};
|
|
175
|
+
case 'full':
|
|
176
|
+
default:
|
|
177
|
+
// New/low adopters: full coaching
|
|
178
|
+
return {
|
|
179
|
+
showFullDescription: true,
|
|
180
|
+
showCoachingTip: true,
|
|
181
|
+
showCelebration: false,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Get a brief status message for the adoption score
|
|
187
|
+
* Used in `ginko insights` output
|
|
188
|
+
*/
|
|
189
|
+
export async function getAdoptionStatus() {
|
|
190
|
+
const { score, level } = await getAdoptionScore();
|
|
191
|
+
const levelEmoji = {
|
|
192
|
+
full: '🌱', // Growing
|
|
193
|
+
light: '🌿', // Established
|
|
194
|
+
minimal: '🌳', // Mature
|
|
195
|
+
};
|
|
196
|
+
return `${levelEmoji[level]} Pattern Adoption: ${score} points (${level} prompts)`;
|
|
197
|
+
}
|
|
198
|
+
// =============================================================================
|
|
199
|
+
// Exports
|
|
200
|
+
// =============================================================================
|
|
201
|
+
export const __testing = {
|
|
202
|
+
SIGNAL_POINTS,
|
|
203
|
+
LEVEL_THRESHOLDS,
|
|
204
|
+
calculateLevel,
|
|
205
|
+
};
|
|
206
|
+
//# sourceMappingURL=adoption-score.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adoption-score.js","sourceRoot":"","sources":["../../src/lib/adoption-score.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: utility
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2026-01-26
|
|
5
|
+
* @tags: [coaching, insights, adaptive, epic-016-s05]
|
|
6
|
+
* @related: [adoption-score.ts, planning-menu.ts, api-client.ts]
|
|
7
|
+
* @priority: high
|
|
8
|
+
* @complexity: medium
|
|
9
|
+
* @dependencies: [fs-extra, path]
|
|
10
|
+
*/
|
|
11
|
+
import { QuietingLevel } from './adoption-score.js';
|
|
12
|
+
export type CoachingLevel = 'minimal' | 'standard' | 'supportive';
|
|
13
|
+
export interface CoachingContext {
|
|
14
|
+
overallScore: number;
|
|
15
|
+
metrics: {
|
|
16
|
+
sessionEfficiency: number;
|
|
17
|
+
patternAdoption: number;
|
|
18
|
+
collaborationQuality: number;
|
|
19
|
+
antiPatterns: number;
|
|
20
|
+
};
|
|
21
|
+
level: CoachingLevel;
|
|
22
|
+
override: CoachingLevel | null;
|
|
23
|
+
source: 'dashboard' | 'cache' | 'adoption_fallback';
|
|
24
|
+
cacheAge?: number;
|
|
25
|
+
}
|
|
26
|
+
export interface InsightScores {
|
|
27
|
+
overallScore: number;
|
|
28
|
+
categoryScores: {
|
|
29
|
+
efficiency: number;
|
|
30
|
+
patterns: number;
|
|
31
|
+
quality: number;
|
|
32
|
+
'anti-patterns': number;
|
|
33
|
+
};
|
|
34
|
+
fetchedAt: string;
|
|
35
|
+
periodDays: number;
|
|
36
|
+
}
|
|
37
|
+
export interface CoachingConfig {
|
|
38
|
+
override: CoachingLevel | null;
|
|
39
|
+
overrideSetAt: string | null;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Get cache age in minutes
|
|
43
|
+
*/
|
|
44
|
+
declare function getCacheAgeMinutes(fetchedAt: string): number;
|
|
45
|
+
/**
|
|
46
|
+
* Load coaching config (manual overrides)
|
|
47
|
+
*/
|
|
48
|
+
export declare function loadCoachingConfig(): Promise<CoachingConfig>;
|
|
49
|
+
/**
|
|
50
|
+
* Save coaching config
|
|
51
|
+
*/
|
|
52
|
+
export declare function saveCoachingConfig(config: CoachingConfig): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Set manual coaching level override
|
|
55
|
+
*/
|
|
56
|
+
export declare function setCoachingOverride(level: CoachingLevel | 'auto'): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Calculate coaching level from overall score
|
|
59
|
+
*/
|
|
60
|
+
export declare function calculateCoachingLevel(score: number): CoachingLevel;
|
|
61
|
+
/**
|
|
62
|
+
* Convert adoption QuietingLevel to CoachingLevel
|
|
63
|
+
*/
|
|
64
|
+
declare function adoptionLevelToCoachingLevel(quieting: QuietingLevel): CoachingLevel;
|
|
65
|
+
/**
|
|
66
|
+
* Estimate score from adoption level for fallback
|
|
67
|
+
*/
|
|
68
|
+
declare function adoptionLevelToScore(quieting: QuietingLevel): number;
|
|
69
|
+
/**
|
|
70
|
+
* Get coaching context for current session
|
|
71
|
+
*
|
|
72
|
+
* Priority:
|
|
73
|
+
* 1. Manual override (if set)
|
|
74
|
+
* 2. Dashboard insight scores (if available)
|
|
75
|
+
* 3. Cached scores (if within TTL)
|
|
76
|
+
* 4. Adoption score fallback (if offline)
|
|
77
|
+
*/
|
|
78
|
+
export declare function getCoachingContext(graphId?: string): Promise<CoachingContext>;
|
|
79
|
+
/**
|
|
80
|
+
* Get coaching level for quick checks
|
|
81
|
+
* Simplified version that just returns the level
|
|
82
|
+
*/
|
|
83
|
+
export declare function getCoachingLevel(graphId?: string): Promise<CoachingLevel>;
|
|
84
|
+
/**
|
|
85
|
+
* Check if a specific metric is low and needs targeted coaching
|
|
86
|
+
*/
|
|
87
|
+
export declare function isMetricLow(value: number, threshold?: number): boolean;
|
|
88
|
+
/**
|
|
89
|
+
* Get targeted coaching suggestions based on low metrics
|
|
90
|
+
*/
|
|
91
|
+
export declare function getTargetedCoachingSuggestions(context: CoachingContext): string[];
|
|
92
|
+
export interface PromptVariants {
|
|
93
|
+
minimal: string;
|
|
94
|
+
standard: string;
|
|
95
|
+
supportive: string;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Get the appropriate prompt variant based on coaching level
|
|
99
|
+
*/
|
|
100
|
+
export declare function selectPrompt<T extends string>(variants: Record<CoachingLevel, T>, level: CoachingLevel): T;
|
|
101
|
+
/**
|
|
102
|
+
* Standard prompt variants for common scenarios
|
|
103
|
+
*/
|
|
104
|
+
export declare const PROMPT_VARIANTS: {
|
|
105
|
+
readonly noStructure: {
|
|
106
|
+
readonly minimal: "No active sprint. [a] Epic [b] Sprint [c] Quick [d] Ad-hoc";
|
|
107
|
+
readonly standard: "You have no planned work. What would you like to work on?\n\n[a] New Epic - Large initiative with multiple sprints\n[b] New Feature Sprint - Focused work with clear goals\n[c] Quick fix / Bug fix - Single task, minimal overhead\n[d] Something else - Explore, research, or work ad-hoc";
|
|
108
|
+
readonly supportive: "I notice you're not currently in a sprint. Sprints help track progress and maintain focus.\n\nWhat would you like to work on?\n\n[a] New Epic (Recommended)\n For large initiatives that need multiple sprints to complete.\n Example: \"Implement user authentication system\"\n\n[b] New Feature Sprint\n For focused work with a clear goal that can be done in ~1 week.\n Example: \"Add dark mode toggle\"\n\n[c] Quick fix / Bug fix\n For small, single tasks that don't need sprint overhead.\n Example: \"Fix login button alignment\"\n\n[d] Something else\n For exploration, research, or ad-hoc work.\n\nTip: Structured work (options a-c) improves your collaboration insights!";
|
|
109
|
+
};
|
|
110
|
+
readonly sprintComplete: {
|
|
111
|
+
readonly minimal: "Sprint done! [a] Next sprint [b] New epic [c] Ad-hoc";
|
|
112
|
+
readonly standard: "🎉 Sprint complete! All tasks finished.\n\nWhat's next?\n[a] Start next sprint\n[b] Create new epic\n[c] Work on something else";
|
|
113
|
+
readonly supportive: "🎉 Great work! You've completed all tasks in this sprint.\n\nWhat would you like to do next?\n\n[a] Start next sprint\n Continue momentum with the next planned sprint.\n\n[b] Create new epic\n Begin a new large initiative.\n\n[c] Work on something else\n Take a break or explore other work.\n\nTip: Completing sprints contributes to your pattern adoption score!";
|
|
114
|
+
};
|
|
115
|
+
};
|
|
116
|
+
export declare const __testing: {
|
|
117
|
+
LEVEL_THRESHOLDS: {
|
|
118
|
+
minimal: number;
|
|
119
|
+
standard: number;
|
|
120
|
+
};
|
|
121
|
+
CACHE_TTL_HOURS: number;
|
|
122
|
+
adoptionLevelToCoachingLevel: typeof adoptionLevelToCoachingLevel;
|
|
123
|
+
adoptionLevelToScore: typeof adoptionLevelToScore;
|
|
124
|
+
getCacheAgeMinutes: typeof getCacheAgeMinutes;
|
|
125
|
+
};
|
|
126
|
+
export {};
|
|
127
|
+
//# sourceMappingURL=coaching-level.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coaching-level.d.ts","sourceRoot":"","sources":["../../src/lib/coaching-level.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAuBH,OAAO,EAAoB,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAMtE,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,CAAC;AAElE,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE;QACP,iBAAiB,EAAE,MAAM,CAAC;QAC1B,eAAe,EAAE,MAAM,CAAC;QACxB,oBAAoB,EAAE,MAAM,CAAC;QAC7B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,WAAW,GAAG,OAAO,GAAG,mBAAmB,CAAC;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IAC/B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AA2ED;;GAEG;AACH,iBAAS,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAIrD;AAMD;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,cAAc,CAAC,CAelE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAI9E;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYtF;AA2ED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAInE;AAED;;GAEG;AACH,iBAAS,4BAA4B,CAAC,QAAQ,EAAE,aAAa,GAAG,aAAa,CAU5E;AAED;;GAEG;AACH,iBAAS,oBAAoB,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAU7D;AAMD;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA6DnF;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAG/E;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,MAAW,GAAG,OAAO,CAE1E;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,EAAE,CAqBjF;AAMD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,EAC3C,QAAQ,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,EAClC,KAAK,EAAE,aAAa,GACnB,CAAC,CAEH;AAED;;GAEG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;CAsDlB,CAAC;AAMX,eAAO,MAAM,SAAS;;;;;;;;;CAMrB,CAAC"}
|