@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.
Files changed (89) hide show
  1. package/dist/completions/bash-generator.d.ts +13 -0
  2. package/dist/completions/bash-generator.d.ts.map +1 -0
  3. package/dist/completions/bash-generator.js +148 -0
  4. package/dist/completions/bash-generator.js.map +1 -0
  5. package/dist/completions/commands.d.ts +14 -0
  6. package/dist/completions/commands.d.ts.map +1 -0
  7. package/dist/completions/commands.js +114 -0
  8. package/dist/completions/commands.js.map +1 -0
  9. package/dist/completions/fish-generator.d.ts +15 -0
  10. package/dist/completions/fish-generator.d.ts.map +1 -0
  11. package/dist/completions/fish-generator.js +152 -0
  12. package/dist/completions/fish-generator.js.map +1 -0
  13. package/dist/completions/index.d.ts +34 -0
  14. package/dist/completions/index.d.ts.map +1 -0
  15. package/dist/completions/index.js +52 -0
  16. package/dist/completions/index.js.map +1 -0
  17. package/dist/completions/types.d.ts +61 -0
  18. package/dist/completions/types.d.ts.map +1 -0
  19. package/dist/completions/types.js +5 -0
  20. package/dist/completions/types.js.map +1 -0
  21. package/dist/completions/zsh-generator.d.ts +16 -0
  22. package/dist/completions/zsh-generator.d.ts.map +1 -0
  23. package/dist/completions/zsh-generator.js +199 -0
  24. package/dist/completions/zsh-generator.js.map +1 -0
  25. package/dist/configurators/antigravity.d.ts +22 -0
  26. package/dist/configurators/antigravity.d.ts.map +1 -0
  27. package/dist/configurators/antigravity.js +100 -0
  28. package/dist/configurators/antigravity.js.map +1 -0
  29. package/dist/configurators/base.d.ts +67 -0
  30. package/dist/configurators/base.d.ts.map +1 -0
  31. package/dist/configurators/base.js +18 -0
  32. package/dist/configurators/base.js.map +1 -0
  33. package/dist/configurators/claude-code.d.ts +16 -0
  34. package/dist/configurators/claude-code.d.ts.map +1 -0
  35. package/dist/configurators/claude-code.js +91 -0
  36. package/dist/configurators/claude-code.js.map +1 -0
  37. package/dist/configurators/cursor.d.ts +17 -0
  38. package/dist/configurators/cursor.d.ts.map +1 -0
  39. package/dist/configurators/cursor.js +140 -0
  40. package/dist/configurators/cursor.js.map +1 -0
  41. package/dist/configurators/detector.d.ts +36 -0
  42. package/dist/configurators/detector.d.ts.map +1 -0
  43. package/dist/configurators/detector.js +131 -0
  44. package/dist/configurators/detector.js.map +1 -0
  45. package/dist/configurators/gemini.d.ts +17 -0
  46. package/dist/configurators/gemini.d.ts.map +1 -0
  47. package/dist/configurators/gemini.js +92 -0
  48. package/dist/configurators/gemini.js.map +1 -0
  49. package/dist/configurators/index.d.ts +20 -0
  50. package/dist/configurators/index.d.ts.map +1 -0
  51. package/dist/configurators/index.js +43 -0
  52. package/dist/configurators/index.js.map +1 -0
  53. package/dist/configurators/qwen.d.ts +18 -0
  54. package/dist/configurators/qwen.d.ts.map +1 -0
  55. package/dist/configurators/qwen.js +141 -0
  56. package/dist/configurators/qwen.js.map +1 -0
  57. package/dist/configurators/registry.d.ts +55 -0
  58. package/dist/configurators/registry.d.ts.map +1 -0
  59. package/dist/configurators/registry.js +82 -0
  60. package/dist/configurators/registry.js.map +1 -0
  61. package/dist/configurators/vscode.d.ts +18 -0
  62. package/dist/configurators/vscode.d.ts.map +1 -0
  63. package/dist/configurators/vscode.js +142 -0
  64. package/dist/configurators/vscode.js.map +1 -0
  65. package/dist/configurators/windsurf.d.ts +17 -0
  66. package/dist/configurators/windsurf.d.ts.map +1 -0
  67. package/dist/configurators/windsurf.js +89 -0
  68. package/dist/configurators/windsurf.js.map +1 -0
  69. package/dist/global-config.d.ts +76 -0
  70. package/dist/global-config.d.ts.map +1 -0
  71. package/dist/global-config.js +212 -0
  72. package/dist/global-config.js.map +1 -0
  73. package/dist/index.d.ts +3 -0
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +6 -0
  76. package/dist/index.js.map +1 -1
  77. package/dist/utils/index.d.ts +2 -0
  78. package/dist/utils/index.d.ts.map +1 -1
  79. package/dist/utils/index.js +2 -0
  80. package/dist/utils/index.js.map +1 -1
  81. package/dist/utils/progress.d.ts +77 -0
  82. package/dist/utils/progress.d.ts.map +1 -0
  83. package/dist/utils/progress.js +83 -0
  84. package/dist/utils/progress.js.map +1 -0
  85. package/dist/utils/task-progress.d.ts +72 -0
  86. package/dist/utils/task-progress.d.ts.map +1 -0
  87. package/dist/utils/task-progress.js +165 -0
  88. package/dist/utils/task-progress.js.map +1 -0
  89. 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
@@ -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"}
@@ -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"}
@@ -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
@@ -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"}