@speclife/core 0.9.2 → 0.11.1
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/completions/bash-generator.d.ts +13 -0
- package/dist/completions/bash-generator.d.ts.map +1 -0
- package/dist/completions/bash-generator.js +148 -0
- package/dist/completions/bash-generator.js.map +1 -0
- package/dist/completions/commands.d.ts +14 -0
- package/dist/completions/commands.d.ts.map +1 -0
- package/dist/completions/commands.js +114 -0
- package/dist/completions/commands.js.map +1 -0
- package/dist/completions/fish-generator.d.ts +15 -0
- package/dist/completions/fish-generator.d.ts.map +1 -0
- package/dist/completions/fish-generator.js +152 -0
- package/dist/completions/fish-generator.js.map +1 -0
- package/dist/completions/index.d.ts +34 -0
- package/dist/completions/index.d.ts.map +1 -0
- package/dist/completions/index.js +52 -0
- package/dist/completions/index.js.map +1 -0
- package/dist/completions/types.d.ts +61 -0
- package/dist/completions/types.d.ts.map +1 -0
- package/dist/completions/types.js +5 -0
- package/dist/completions/types.js.map +1 -0
- package/dist/completions/zsh-generator.d.ts +16 -0
- package/dist/completions/zsh-generator.d.ts.map +1 -0
- package/dist/completions/zsh-generator.js +199 -0
- package/dist/completions/zsh-generator.js.map +1 -0
- package/dist/configurators/antigravity.d.ts +22 -0
- package/dist/configurators/antigravity.d.ts.map +1 -0
- package/dist/configurators/antigravity.js +100 -0
- package/dist/configurators/antigravity.js.map +1 -0
- package/dist/configurators/base.d.ts +67 -0
- package/dist/configurators/base.d.ts.map +1 -0
- package/dist/configurators/base.js +18 -0
- package/dist/configurators/base.js.map +1 -0
- package/dist/configurators/claude-code.d.ts +16 -0
- package/dist/configurators/claude-code.d.ts.map +1 -0
- package/dist/configurators/claude-code.js +91 -0
- package/dist/configurators/claude-code.js.map +1 -0
- package/dist/configurators/cursor.d.ts +17 -0
- package/dist/configurators/cursor.d.ts.map +1 -0
- package/dist/configurators/cursor.js +140 -0
- package/dist/configurators/cursor.js.map +1 -0
- package/dist/configurators/detector.d.ts +36 -0
- package/dist/configurators/detector.d.ts.map +1 -0
- package/dist/configurators/detector.js +131 -0
- package/dist/configurators/detector.js.map +1 -0
- package/dist/configurators/gemini.d.ts +17 -0
- package/dist/configurators/gemini.d.ts.map +1 -0
- package/dist/configurators/gemini.js +92 -0
- package/dist/configurators/gemini.js.map +1 -0
- package/dist/configurators/index.d.ts +20 -0
- package/dist/configurators/index.d.ts.map +1 -0
- package/dist/configurators/index.js +43 -0
- package/dist/configurators/index.js.map +1 -0
- package/dist/configurators/qwen.d.ts +18 -0
- package/dist/configurators/qwen.d.ts.map +1 -0
- package/dist/configurators/qwen.js +141 -0
- package/dist/configurators/qwen.js.map +1 -0
- package/dist/configurators/registry.d.ts +55 -0
- package/dist/configurators/registry.d.ts.map +1 -0
- package/dist/configurators/registry.js +82 -0
- package/dist/configurators/registry.js.map +1 -0
- package/dist/configurators/vscode.d.ts +18 -0
- package/dist/configurators/vscode.d.ts.map +1 -0
- package/dist/configurators/vscode.js +142 -0
- package/dist/configurators/vscode.js.map +1 -0
- package/dist/configurators/windsurf.d.ts +17 -0
- package/dist/configurators/windsurf.d.ts.map +1 -0
- package/dist/configurators/windsurf.js +89 -0
- package/dist/configurators/windsurf.js.map +1 -0
- package/dist/global-config.d.ts +76 -0
- package/dist/global-config.d.ts.map +1 -0
- package/dist/global-config.js +212 -0
- package/dist/global-config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/progress.d.ts +77 -0
- package/dist/utils/progress.d.ts.map +1 -0
- package/dist/utils/progress.js +83 -0
- package/dist/utils/progress.js.map +1 -0
- package/dist/utils/task-progress.d.ts +72 -0
- package/dist/utils/task-progress.d.ts.map +1 -0
- package/dist/utils/task-progress.js +165 -0
- package/dist/utils/task-progress.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-config.d.ts","sourceRoot":"","sources":["../src/global-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,kCAAkC;AAClC,MAAM,WAAW,YAAY;IAC3B,mDAAmD;IACnD,UAAU,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC5C,kCAAkC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uBAAuB;IACvB,WAAW,CAAC,EAAE;QACZ,4CAA4C;QAC5C,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,6CAA6C;QAC7C,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,2DAA2D;QAC3D,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;KAChC,CAAC;CACH;AAaD;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAkB3C;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED;;;;GAIG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,YAAY,CAAC,CAoB7D;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BnF;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAc3F;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBrF;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsCvE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAEvD;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAiB/B"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global configuration management
|
|
3
|
+
* XDG-compliant configuration storage for cross-platform support
|
|
4
|
+
*/
|
|
5
|
+
import { readFile, writeFile, mkdir } from 'fs/promises';
|
|
6
|
+
import { existsSync } from 'fs';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
import { homedir, platform } from 'os';
|
|
9
|
+
import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
|
|
10
|
+
/** Default global config values */
|
|
11
|
+
const defaultGlobalConfig = {
|
|
12
|
+
aiProvider: 'claude',
|
|
13
|
+
aiModel: 'claude-sonnet-4-20250514',
|
|
14
|
+
preferences: {
|
|
15
|
+
colors: true,
|
|
16
|
+
spinners: true,
|
|
17
|
+
outputFormat: 'text',
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Get the XDG-compliant config directory for SpecLife
|
|
22
|
+
* @returns Path to the global config directory
|
|
23
|
+
*/
|
|
24
|
+
export function getGlobalConfigDir() {
|
|
25
|
+
const xdgConfigHome = process.env.XDG_CONFIG_HOME;
|
|
26
|
+
if (xdgConfigHome) {
|
|
27
|
+
return join(xdgConfigHome, 'speclife');
|
|
28
|
+
}
|
|
29
|
+
// Windows uses APPDATA
|
|
30
|
+
if (platform() === 'win32') {
|
|
31
|
+
const appData = process.env.APPDATA;
|
|
32
|
+
if (appData) {
|
|
33
|
+
return join(appData, 'speclife');
|
|
34
|
+
}
|
|
35
|
+
return join(homedir(), 'AppData', 'Roaming', 'speclife');
|
|
36
|
+
}
|
|
37
|
+
// macOS and Linux follow XDG spec default
|
|
38
|
+
return join(homedir(), '.config', 'speclife');
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get the path to the global config file
|
|
42
|
+
* @returns Path to config.yaml
|
|
43
|
+
*/
|
|
44
|
+
export function getGlobalConfigPath() {
|
|
45
|
+
return join(getGlobalConfigDir(), 'config.yaml');
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Check if global config exists
|
|
49
|
+
* @returns true if config file exists
|
|
50
|
+
*/
|
|
51
|
+
export function globalConfigExists() {
|
|
52
|
+
return existsSync(getGlobalConfigPath());
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Load the global configuration
|
|
56
|
+
* Returns defaults merged with user settings
|
|
57
|
+
* @returns Global config object
|
|
58
|
+
*/
|
|
59
|
+
export async function getGlobalConfig() {
|
|
60
|
+
const configPath = getGlobalConfigPath();
|
|
61
|
+
try {
|
|
62
|
+
const content = await readFile(configPath, 'utf-8');
|
|
63
|
+
const userConfig = parseYaml(content);
|
|
64
|
+
// Deep merge with defaults
|
|
65
|
+
return {
|
|
66
|
+
...defaultGlobalConfig,
|
|
67
|
+
...userConfig,
|
|
68
|
+
preferences: {
|
|
69
|
+
...defaultGlobalConfig.preferences,
|
|
70
|
+
...userConfig?.preferences,
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// Return defaults if file doesn't exist or is invalid
|
|
76
|
+
return { ...defaultGlobalConfig };
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Save the global configuration
|
|
81
|
+
* @param config Config to save (will be merged with existing)
|
|
82
|
+
*/
|
|
83
|
+
export async function saveGlobalConfig(config) {
|
|
84
|
+
const configDir = getGlobalConfigDir();
|
|
85
|
+
const configPath = getGlobalConfigPath();
|
|
86
|
+
// Ensure directory exists
|
|
87
|
+
await mkdir(configDir, { recursive: true });
|
|
88
|
+
// Load existing config and merge
|
|
89
|
+
const existing = await getGlobalConfig();
|
|
90
|
+
const merged = {
|
|
91
|
+
...existing,
|
|
92
|
+
...config,
|
|
93
|
+
preferences: {
|
|
94
|
+
...existing.preferences,
|
|
95
|
+
...config.preferences,
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
// Write YAML with comments
|
|
99
|
+
const content = `# SpecLife Global Configuration
|
|
100
|
+
# This file stores user preferences that apply to all projects.
|
|
101
|
+
# Project-specific settings in .specliferc.yaml override these.
|
|
102
|
+
|
|
103
|
+
${stringifyYaml(merged)}`;
|
|
104
|
+
await writeFile(configPath, content, 'utf-8');
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Get a specific config value
|
|
108
|
+
* @param key Config key path (e.g., 'aiProvider' or 'preferences.colors')
|
|
109
|
+
* @returns Config value or undefined
|
|
110
|
+
*/
|
|
111
|
+
export async function getGlobalConfigValue(key) {
|
|
112
|
+
const config = await getGlobalConfig();
|
|
113
|
+
const parts = key.split('.');
|
|
114
|
+
let value = config;
|
|
115
|
+
for (const part of parts) {
|
|
116
|
+
if (value && typeof value === 'object' && part in value) {
|
|
117
|
+
value = value[part];
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
return undefined;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return value;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Set a specific config value
|
|
127
|
+
* @param key Config key path (e.g., 'aiProvider' or 'preferences.colors')
|
|
128
|
+
* @param value Value to set
|
|
129
|
+
*/
|
|
130
|
+
export async function setGlobalConfigValue(key, value) {
|
|
131
|
+
const config = await getGlobalConfig();
|
|
132
|
+
const parts = key.split('.');
|
|
133
|
+
// Navigate to the right level and set value
|
|
134
|
+
let target = config;
|
|
135
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
136
|
+
const part = parts[i];
|
|
137
|
+
if (!(part in target) || typeof target[part] !== 'object') {
|
|
138
|
+
target[part] = {};
|
|
139
|
+
}
|
|
140
|
+
target = target[part];
|
|
141
|
+
}
|
|
142
|
+
const lastPart = parts[parts.length - 1];
|
|
143
|
+
target[lastPart] = value;
|
|
144
|
+
await saveGlobalConfig(config);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Unset a specific config value (remove from file)
|
|
148
|
+
* @param key Config key path
|
|
149
|
+
*/
|
|
150
|
+
export async function unsetGlobalConfigValue(key) {
|
|
151
|
+
const configPath = getGlobalConfigPath();
|
|
152
|
+
const configDir = getGlobalConfigDir();
|
|
153
|
+
// Read raw user config (not merged with defaults)
|
|
154
|
+
let userConfig = {};
|
|
155
|
+
try {
|
|
156
|
+
const content = await readFile(configPath, 'utf-8');
|
|
157
|
+
userConfig = parseYaml(content) ?? {};
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
// File doesn't exist, nothing to unset
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const parts = key.split('.');
|
|
164
|
+
// Navigate to the right level and delete
|
|
165
|
+
let target = userConfig;
|
|
166
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
167
|
+
const part = parts[i];
|
|
168
|
+
if (!(part in target) || typeof target[part] !== 'object') {
|
|
169
|
+
return; // Key path doesn't exist
|
|
170
|
+
}
|
|
171
|
+
target = target[part];
|
|
172
|
+
}
|
|
173
|
+
const lastPart = parts[parts.length - 1];
|
|
174
|
+
delete target[lastPart];
|
|
175
|
+
// Ensure directory exists and write directly (don't merge)
|
|
176
|
+
await mkdir(configDir, { recursive: true });
|
|
177
|
+
const content = `# SpecLife Global Configuration
|
|
178
|
+
# This file stores user preferences that apply to all projects.
|
|
179
|
+
# Project-specific settings in .specliferc.yaml override these.
|
|
180
|
+
|
|
181
|
+
${stringifyYaml(userConfig)}`;
|
|
182
|
+
await writeFile(configPath, content, 'utf-8');
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Reset global config to defaults
|
|
186
|
+
*/
|
|
187
|
+
export async function resetGlobalConfig() {
|
|
188
|
+
await saveGlobalConfig(defaultGlobalConfig);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* List all config keys and values
|
|
192
|
+
* @param config Config object (defaults to current global config)
|
|
193
|
+
* @returns Flat map of key paths to values
|
|
194
|
+
*/
|
|
195
|
+
export async function listGlobalConfig(config) {
|
|
196
|
+
const cfg = config ?? await getGlobalConfig();
|
|
197
|
+
const result = new Map();
|
|
198
|
+
function flatten(obj, prefix = '') {
|
|
199
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
200
|
+
const path = prefix ? `${prefix}.${key}` : key;
|
|
201
|
+
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
202
|
+
flatten(value, path);
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
result.set(path, value);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
flatten(cfg);
|
|
210
|
+
return result;
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=global-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-config.js","sourceRoot":"","sources":["../src/global-config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -8,4 +8,7 @@ export { loadConfig, isAutoReleaseAllowed, type SpecLifeConfig, type GitConfig,
|
|
|
8
8
|
export * from './adapters/index.js';
|
|
9
9
|
export * from './workflows/index.js';
|
|
10
10
|
export * from './utils/index.js';
|
|
11
|
+
export { getGlobalConfigDir, getGlobalConfigPath, globalConfigExists, getGlobalConfig, saveGlobalConfig, getGlobalConfigValue, setGlobalConfigValue, unsetGlobalConfigValue, resetGlobalConfig, listGlobalConfig, type GlobalConfig, } from './global-config.js';
|
|
12
|
+
export { EditorConfigurator, EditorRegistry, CursorConfigurator, ClaudeCodeConfigurator, VSCodeConfigurator, WindsurfConfigurator, detectEditors, sortByPreference, formatDetectionSummary, initializeEditorRegistry, type ConfigureResult, type ConfigureOptions, type EditorDetectionResult, } from './configurators/index.js';
|
|
13
|
+
export { generateCompletions, getInstallInstructions, getSupportedShells, getGenerator, getCommandDefinitions, BashGenerator, ZshGenerator, FishGenerator, type Shell, type CompletionGenerator, type CommandDef, } from './completions/index.js';
|
|
11
14
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAkBA;;;;GAIG;AAGH,cAAc,YAAY,CAAC;AAG3B,OAAO,EACL,UAAU,EACV,oBAAoB,EACpB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,0BAA0B,EAC/B,KAAK,aAAa,EAClB,KAAK,iBAAiB,GACvB,MAAM,aAAa,CAAC;AAGrB,cAAc,qBAAqB,CAAC;AAGpC,cAAc,sBAAsB,CAAC;AAGrC,cAAc,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAkBA;;;;GAIG;AAGH,cAAc,YAAY,CAAC;AAG3B,OAAO,EACL,UAAU,EACV,oBAAoB,EACpB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,0BAA0B,EAC/B,KAAK,aAAa,EAClB,KAAK,iBAAiB,GACvB,MAAM,aAAa,CAAC;AAGrB,cAAc,qBAAqB,CAAC;AAGpC,cAAc,sBAAsB,CAAC;AAGrC,cAAc,kBAAkB,CAAC;AAGjC,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB,EAChB,KAAK,YAAY,GAClB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,gBAAgB,EAChB,sBAAsB,EACtB,wBAAwB,EACxB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,GAC3B,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,kBAAkB,EAClB,YAAY,EACZ,qBAAqB,EACrB,aAAa,EACb,YAAY,EACZ,aAAa,EACb,KAAK,KAAK,EACV,KAAK,mBAAmB,EACxB,KAAK,UAAU,GAChB,MAAM,wBAAwB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -30,4 +30,10 @@ export * from './adapters/index.js';
|
|
|
30
30
|
export * from './workflows/index.js';
|
|
31
31
|
// Re-export utilities
|
|
32
32
|
export * from './utils/index.js';
|
|
33
|
+
// Re-export global config
|
|
34
|
+
export { getGlobalConfigDir, getGlobalConfigPath, globalConfigExists, getGlobalConfig, saveGlobalConfig, getGlobalConfigValue, setGlobalConfigValue, unsetGlobalConfigValue, resetGlobalConfig, listGlobalConfig, } from './global-config.js';
|
|
35
|
+
// Re-export editor configurators
|
|
36
|
+
export { EditorConfigurator, EditorRegistry, CursorConfigurator, ClaudeCodeConfigurator, VSCodeConfigurator, WindsurfConfigurator, detectEditors, sortByPreference, formatDetectionSummary, initializeEditorRegistry, } from './configurators/index.js';
|
|
37
|
+
// Re-export shell completions
|
|
38
|
+
export { generateCompletions, getInstallInstructions, getSupportedShells, getGenerator, getCommandDefinitions, BashGenerator, ZshGenerator, FishGenerator, } from './completions/index.js';
|
|
33
39
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;;GAIG;AAEH,kBAAkB;AAClB,cAAc,YAAY,CAAC;AAE3B,mBAAmB;AACnB,OAAO,EACL,UAAU,EACV,oBAAoB,GAOrB,MAAM,aAAa,CAAC;AAErB,qBAAqB;AACrB,cAAc,qBAAqB,CAAC;AAEpC,sBAAsB;AACtB,cAAc,sBAAsB,CAAC;AAErC,sBAAsB;AACtB,cAAc,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;;GAIG;AAEH,kBAAkB;AAClB,cAAc,YAAY,CAAC;AAE3B,mBAAmB;AACnB,OAAO,EACL,UAAU,EACV,oBAAoB,GAOrB,MAAM,aAAa,CAAC;AAErB,qBAAqB;AACrB,cAAc,qBAAqB,CAAC;AAEpC,sBAAsB;AACtB,cAAc,sBAAsB,CAAC;AAErC,sBAAsB;AACtB,cAAc,kBAAkB,CAAC;AAEjC,0BAA0B;AAC1B,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB,GAEjB,MAAM,oBAAoB,CAAC;AAE5B,iCAAiC;AACjC,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,gBAAgB,EAChB,sBAAsB,EACtB,wBAAwB,GAIzB,MAAM,0BAA0B,CAAC;AAElC,8BAA8B;AAC9B,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,kBAAkB,EAClB,YAAY,EACZ,qBAAqB,EACrB,aAAa,EACb,YAAY,EACZ,aAAa,GAId,MAAM,wBAAwB,CAAC"}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -2,4 +2,6 @@
|
|
|
2
2
|
* Utility functions
|
|
3
3
|
*/
|
|
4
4
|
export { formatProgressBar, formatRelativeTime, formatPRStatus, formatCompactLine, formatTable, formatSummary, sortItems, filterByStatus, } from './format.js';
|
|
5
|
+
export { createProgressBar, createProgressBarFromChange, getSymbol, defaultSymbols, formatStepIndicator, getSpinnerFrame, formatLoadingMessage, type ProgressBarOptions, type SymbolOptions, } from './progress.js';
|
|
6
|
+
export { parseTaskLine, parseSectionHeader, parseTasksContent, loadTasksFile, getSectionProgress, getNextTask, getTasksByStatus, type ParsedTask, type ParsedTaskFile, } from './task-progress.js';
|
|
5
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,SAAS,EACT,cAAc,GACf,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,SAAS,EACT,cAAc,GACf,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,iBAAiB,EACjB,2BAA2B,EAC3B,SAAS,EACT,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,oBAAoB,EACpB,KAAK,kBAAkB,EACvB,KAAK,aAAa,GACnB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,KAAK,UAAU,EACf,KAAK,cAAc,GACpB,MAAM,oBAAoB,CAAC"}
|
package/dist/utils/index.js
CHANGED
|
@@ -2,4 +2,6 @@
|
|
|
2
2
|
* Utility functions
|
|
3
3
|
*/
|
|
4
4
|
export { formatProgressBar, formatRelativeTime, formatPRStatus, formatCompactLine, formatTable, formatSummary, sortItems, filterByStatus, } from './format.js';
|
|
5
|
+
export { createProgressBar, createProgressBarFromChange, getSymbol, defaultSymbols, formatStepIndicator, getSpinnerFrame, formatLoadingMessage, } from './progress.js';
|
|
6
|
+
export { parseTaskLine, parseSectionHeader, parseTasksContent, loadTasksFile, getSectionProgress, getNextTask, getTasksByStatus, } from './task-progress.js';
|
|
5
7
|
//# sourceMappingURL=index.js.map
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,SAAS,EACT,cAAc,GACf,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,SAAS,EACT,cAAc,GACf,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,iBAAiB,EACjB,2BAA2B,EAC3B,SAAS,EACT,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,oBAAoB,GAGrB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,gBAAgB,GAGjB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Progress bar utilities for CLI display
|
|
3
|
+
*/
|
|
4
|
+
import type { ChangeProgress } from '../types.js';
|
|
5
|
+
/** Progress bar display options */
|
|
6
|
+
export interface ProgressBarOptions {
|
|
7
|
+
/** Width of the bar in characters (default: 10) */
|
|
8
|
+
width?: number;
|
|
9
|
+
/** Character for filled portion (default: █) */
|
|
10
|
+
filledChar?: string;
|
|
11
|
+
/** Character for empty portion (default: ░) */
|
|
12
|
+
emptyChar?: string;
|
|
13
|
+
/** Include percentage text (default: false) */
|
|
14
|
+
showPercentage?: boolean;
|
|
15
|
+
/** Include count text like "3/5" (default: false) */
|
|
16
|
+
showCount?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Create a progress bar string from percentage
|
|
20
|
+
* @param percentage Value from 0-100
|
|
21
|
+
* @param options Display options
|
|
22
|
+
* @returns Formatted progress bar string
|
|
23
|
+
*/
|
|
24
|
+
export declare function createProgressBar(percentage: number, options?: ProgressBarOptions): string;
|
|
25
|
+
/**
|
|
26
|
+
* Create a progress bar from ChangeProgress object
|
|
27
|
+
* @param progress Progress info with completed/total
|
|
28
|
+
* @param options Display options
|
|
29
|
+
* @returns Formatted progress bar string
|
|
30
|
+
*/
|
|
31
|
+
export declare function createProgressBarFromChange(progress: ChangeProgress, options?: ProgressBarOptions): string;
|
|
32
|
+
/** Symbol options for different states */
|
|
33
|
+
export interface SymbolOptions {
|
|
34
|
+
/** Symbol for pending/incomplete (default: ○) */
|
|
35
|
+
pending?: string;
|
|
36
|
+
/** Symbol for in-progress (default: ◉) */
|
|
37
|
+
inProgress?: string;
|
|
38
|
+
/** Symbol for completed/success (default: ✓) */
|
|
39
|
+
completed?: string;
|
|
40
|
+
/** Symbol for error/failed (default: ✗) */
|
|
41
|
+
error?: string;
|
|
42
|
+
/** Symbol for warning (default: ⚠) */
|
|
43
|
+
warning?: string;
|
|
44
|
+
/** Symbol for info (default: ℹ) */
|
|
45
|
+
info?: string;
|
|
46
|
+
}
|
|
47
|
+
/** Default symbols for progress display */
|
|
48
|
+
export declare const defaultSymbols: Required<SymbolOptions>;
|
|
49
|
+
/**
|
|
50
|
+
* Get a symbol for a given state
|
|
51
|
+
* @param state State name
|
|
52
|
+
* @param options Custom symbols
|
|
53
|
+
* @returns Symbol character
|
|
54
|
+
*/
|
|
55
|
+
export declare function getSymbol(state: keyof SymbolOptions, options?: SymbolOptions): string;
|
|
56
|
+
/**
|
|
57
|
+
* Format a step indicator for multi-step operations
|
|
58
|
+
* @param current Current step (1-based)
|
|
59
|
+
* @param total Total steps
|
|
60
|
+
* @returns Formatted string like "Step 2/5:"
|
|
61
|
+
*/
|
|
62
|
+
export declare function formatStepIndicator(current: number, total: number): string;
|
|
63
|
+
/**
|
|
64
|
+
* Format a spinner frame (for use with ora or custom spinners)
|
|
65
|
+
* @param frameIndex Current frame index
|
|
66
|
+
* @param frames Array of frames (default: dots)
|
|
67
|
+
* @returns Current frame character
|
|
68
|
+
*/
|
|
69
|
+
export declare function getSpinnerFrame(frameIndex: number, frames?: string[]): string;
|
|
70
|
+
/**
|
|
71
|
+
* Create a simple text-based loading indicator
|
|
72
|
+
* @param message Message to display
|
|
73
|
+
* @param elapsed Elapsed time in ms
|
|
74
|
+
* @returns Formatted loading string
|
|
75
|
+
*/
|
|
76
|
+
export declare function formatLoadingMessage(message: string, elapsed?: number): string;
|
|
77
|
+
//# sourceMappingURL=progress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/utils/progress.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,mCAAmC;AACnC,MAAM,WAAW,kBAAkB;IACjC,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qDAAqD;IACrD,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,kBAAuB,GAC/B,MAAM,CAoBR;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,cAAc,EACxB,OAAO,GAAE,kBAAuB,GAC/B,MAAM,CAUR;AAED,0CAA0C;AAC1C,MAAM,WAAW,aAAa;IAC5B,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,2CAA2C;AAC3C,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,aAAa,CAOlD,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,MAAM,aAAa,EAC1B,OAAO,GAAE,aAAkB,GAC1B,MAAM,CAER;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,MAAM,EAAuD,GACpE,MAAM,CAER;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAI9E"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Progress bar utilities for CLI display
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Create a progress bar string from percentage
|
|
6
|
+
* @param percentage Value from 0-100
|
|
7
|
+
* @param options Display options
|
|
8
|
+
* @returns Formatted progress bar string
|
|
9
|
+
*/
|
|
10
|
+
export function createProgressBar(percentage, options = {}) {
|
|
11
|
+
const { width = 10, filledChar = '█', emptyChar = '░', showPercentage = false, } = options;
|
|
12
|
+
// Clamp percentage to valid range
|
|
13
|
+
const clamped = Math.max(0, Math.min(100, percentage));
|
|
14
|
+
const filled = Math.round((clamped / 100) * width);
|
|
15
|
+
const empty = width - filled;
|
|
16
|
+
let bar = `[${filledChar.repeat(filled)}${emptyChar.repeat(empty)}]`;
|
|
17
|
+
if (showPercentage) {
|
|
18
|
+
bar += ` ${Math.round(clamped)}%`;
|
|
19
|
+
}
|
|
20
|
+
return bar;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Create a progress bar from ChangeProgress object
|
|
24
|
+
* @param progress Progress info with completed/total
|
|
25
|
+
* @param options Display options
|
|
26
|
+
* @returns Formatted progress bar string
|
|
27
|
+
*/
|
|
28
|
+
export function createProgressBarFromChange(progress, options = {}) {
|
|
29
|
+
const { showCount = false } = options;
|
|
30
|
+
let bar = createProgressBar(progress.percentage, options);
|
|
31
|
+
if (showCount) {
|
|
32
|
+
bar += ` ${progress.completed}/${progress.total}`;
|
|
33
|
+
}
|
|
34
|
+
return bar;
|
|
35
|
+
}
|
|
36
|
+
/** Default symbols for progress display */
|
|
37
|
+
export const defaultSymbols = {
|
|
38
|
+
pending: '○',
|
|
39
|
+
inProgress: '◉',
|
|
40
|
+
completed: '✓',
|
|
41
|
+
error: '✗',
|
|
42
|
+
warning: '⚠',
|
|
43
|
+
info: 'ℹ',
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Get a symbol for a given state
|
|
47
|
+
* @param state State name
|
|
48
|
+
* @param options Custom symbols
|
|
49
|
+
* @returns Symbol character
|
|
50
|
+
*/
|
|
51
|
+
export function getSymbol(state, options = {}) {
|
|
52
|
+
return options[state] ?? defaultSymbols[state];
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Format a step indicator for multi-step operations
|
|
56
|
+
* @param current Current step (1-based)
|
|
57
|
+
* @param total Total steps
|
|
58
|
+
* @returns Formatted string like "Step 2/5:"
|
|
59
|
+
*/
|
|
60
|
+
export function formatStepIndicator(current, total) {
|
|
61
|
+
return `Step ${current}/${total}:`;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Format a spinner frame (for use with ora or custom spinners)
|
|
65
|
+
* @param frameIndex Current frame index
|
|
66
|
+
* @param frames Array of frames (default: dots)
|
|
67
|
+
* @returns Current frame character
|
|
68
|
+
*/
|
|
69
|
+
export function getSpinnerFrame(frameIndex, frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']) {
|
|
70
|
+
return frames[frameIndex % frames.length];
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Create a simple text-based loading indicator
|
|
74
|
+
* @param message Message to display
|
|
75
|
+
* @param elapsed Elapsed time in ms
|
|
76
|
+
* @returns Formatted loading string
|
|
77
|
+
*/
|
|
78
|
+
export function formatLoadingMessage(message, elapsed) {
|
|
79
|
+
const dots = '.'.repeat((Math.floor(Date.now() / 500) % 3) + 1).padEnd(3);
|
|
80
|
+
const timeStr = elapsed ? ` (${Math.round(elapsed / 1000)}s)` : '';
|
|
81
|
+
return `${message}${dots}${timeStr}`;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/utils/progress.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task progress parsing utilities
|
|
3
|
+
* Parses tasks.md files to extract completion status
|
|
4
|
+
*/
|
|
5
|
+
import type { ChangeProgress, ChangeTask } from '../types.js';
|
|
6
|
+
/** Parsed task with additional metadata */
|
|
7
|
+
export interface ParsedTask extends ChangeTask {
|
|
8
|
+
/** Section number (e.g., "1" from "## 1. Setup") */
|
|
9
|
+
section?: string;
|
|
10
|
+
/** Section name */
|
|
11
|
+
sectionName?: string;
|
|
12
|
+
}
|
|
13
|
+
/** Result of parsing a tasks.md file */
|
|
14
|
+
export interface ParsedTaskFile {
|
|
15
|
+
/** All parsed tasks */
|
|
16
|
+
tasks: ParsedTask[];
|
|
17
|
+
/** Progress summary */
|
|
18
|
+
progress: ChangeProgress;
|
|
19
|
+
/** Tasks grouped by section */
|
|
20
|
+
sections: Map<string, ParsedTask[]>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Parse a single task line
|
|
24
|
+
* @param line Line from tasks.md
|
|
25
|
+
* @param currentSection Current section number
|
|
26
|
+
* @param currentSectionName Current section name
|
|
27
|
+
* @returns Parsed task or null if not a task line
|
|
28
|
+
*/
|
|
29
|
+
export declare function parseTaskLine(line: string, currentSection?: string, currentSectionName?: string): ParsedTask | null;
|
|
30
|
+
/**
|
|
31
|
+
* Parse a section header line
|
|
32
|
+
* @param line Line from tasks.md
|
|
33
|
+
* @returns Section info or null if not a header
|
|
34
|
+
*/
|
|
35
|
+
export declare function parseSectionHeader(line: string): {
|
|
36
|
+
number: string;
|
|
37
|
+
name: string;
|
|
38
|
+
} | null;
|
|
39
|
+
/**
|
|
40
|
+
* Parse tasks.md content into structured data
|
|
41
|
+
* @param content Raw tasks.md content
|
|
42
|
+
* @returns Parsed task file data
|
|
43
|
+
*/
|
|
44
|
+
export declare function parseTasksContent(content: string): ParsedTaskFile;
|
|
45
|
+
/**
|
|
46
|
+
* Load and parse tasks.md from a change directory
|
|
47
|
+
* @param projectRoot Project root path
|
|
48
|
+
* @param specDir Spec directory name (e.g., "openspec")
|
|
49
|
+
* @param changeId Change identifier
|
|
50
|
+
* @returns Parsed task file data
|
|
51
|
+
*/
|
|
52
|
+
export declare function loadTasksFile(projectRoot: string, specDir: string, changeId: string): Promise<ParsedTaskFile>;
|
|
53
|
+
/**
|
|
54
|
+
* Get a summary of tasks by section
|
|
55
|
+
* @param parsed Parsed task file
|
|
56
|
+
* @returns Map of section name to progress
|
|
57
|
+
*/
|
|
58
|
+
export declare function getSectionProgress(parsed: ParsedTaskFile): Map<string, ChangeProgress>;
|
|
59
|
+
/**
|
|
60
|
+
* Find the next uncompleted task
|
|
61
|
+
* @param parsed Parsed task file
|
|
62
|
+
* @returns Next uncompleted task or undefined
|
|
63
|
+
*/
|
|
64
|
+
export declare function getNextTask(parsed: ParsedTaskFile): ParsedTask | undefined;
|
|
65
|
+
/**
|
|
66
|
+
* Get tasks by completion status
|
|
67
|
+
* @param parsed Parsed task file
|
|
68
|
+
* @param completed Whether to get completed or pending tasks
|
|
69
|
+
* @returns Filtered tasks
|
|
70
|
+
*/
|
|
71
|
+
export declare function getTasksByStatus(parsed: ParsedTaskFile, completed: boolean): ParsedTask[];
|
|
72
|
+
//# sourceMappingURL=task-progress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-progress.d.ts","sourceRoot":"","sources":["../../src/utils/task-progress.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAY9D,2CAA2C;AAC3C,MAAM,WAAW,UAAW,SAAQ,UAAU;IAC5C,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mBAAmB;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wCAAwC;AACxC,MAAM,WAAW,cAAc;IAC7B,uBAAuB;IACvB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,uBAAuB;IACvB,QAAQ,EAAE,cAAc,CAAC;IACzB,+BAA+B;IAC/B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;CACrC;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,cAAc,CAAC,EAAE,MAAM,EACvB,kBAAkB,CAAC,EAAE,MAAM,GAC1B,UAAU,GAAG,IAAI,CAiCnB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CASxF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAwCjE;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,cAAc,CAAC,CAczB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAatF;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,UAAU,GAAG,SAAS,CAE1E;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,cAAc,EACtB,SAAS,EAAE,OAAO,GACjB,UAAU,EAAE,CAEd"}
|