@speclife/core 0.9.1 → 0.10.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.
Files changed (77) 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/base.d.ts +67 -0
  26. package/dist/configurators/base.d.ts.map +1 -0
  27. package/dist/configurators/base.js +18 -0
  28. package/dist/configurators/base.js.map +1 -0
  29. package/dist/configurators/claude-code.d.ts +16 -0
  30. package/dist/configurators/claude-code.d.ts.map +1 -0
  31. package/dist/configurators/claude-code.js +91 -0
  32. package/dist/configurators/claude-code.js.map +1 -0
  33. package/dist/configurators/cursor.d.ts +17 -0
  34. package/dist/configurators/cursor.d.ts.map +1 -0
  35. package/dist/configurators/cursor.js +140 -0
  36. package/dist/configurators/cursor.js.map +1 -0
  37. package/dist/configurators/detector.d.ts +36 -0
  38. package/dist/configurators/detector.d.ts.map +1 -0
  39. package/dist/configurators/detector.js +131 -0
  40. package/dist/configurators/detector.js.map +1 -0
  41. package/dist/configurators/index.d.ts +17 -0
  42. package/dist/configurators/index.d.ts.map +1 -0
  43. package/dist/configurators/index.js +34 -0
  44. package/dist/configurators/index.js.map +1 -0
  45. package/dist/configurators/registry.d.ts +55 -0
  46. package/dist/configurators/registry.d.ts.map +1 -0
  47. package/dist/configurators/registry.js +82 -0
  48. package/dist/configurators/registry.js.map +1 -0
  49. package/dist/configurators/vscode.d.ts +18 -0
  50. package/dist/configurators/vscode.d.ts.map +1 -0
  51. package/dist/configurators/vscode.js +142 -0
  52. package/dist/configurators/vscode.js.map +1 -0
  53. package/dist/configurators/windsurf.d.ts +17 -0
  54. package/dist/configurators/windsurf.d.ts.map +1 -0
  55. package/dist/configurators/windsurf.js +89 -0
  56. package/dist/configurators/windsurf.js.map +1 -0
  57. package/dist/global-config.d.ts +76 -0
  58. package/dist/global-config.d.ts.map +1 -0
  59. package/dist/global-config.js +212 -0
  60. package/dist/global-config.js.map +1 -0
  61. package/dist/index.d.ts +3 -0
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +23 -0
  64. package/dist/index.js.map +1 -1
  65. package/dist/utils/index.d.ts +2 -0
  66. package/dist/utils/index.d.ts.map +1 -1
  67. package/dist/utils/index.js +2 -0
  68. package/dist/utils/index.js.map +1 -1
  69. package/dist/utils/progress.d.ts +77 -0
  70. package/dist/utils/progress.d.ts.map +1 -0
  71. package/dist/utils/progress.js +83 -0
  72. package/dist/utils/progress.js.map +1 -0
  73. package/dist/utils/task-progress.d.ts +72 -0
  74. package/dist/utils/task-progress.d.ts.map +1 -0
  75. package/dist/utils/task-progress.js +165 -0
  76. package/dist/utils/task-progress.js.map +1 -0
  77. package/package.json +1 -1
@@ -0,0 +1,142 @@
1
+ /**
2
+ * VS Code editor configurator
3
+ * Sets up tasks.json for command integration
4
+ */
5
+ import { access, mkdir, writeFile, readFile } from 'fs/promises';
6
+ import { join } from 'path';
7
+ import { EditorConfigurator } from './base.js';
8
+ export class VSCodeConfigurator extends EditorConfigurator {
9
+ name = 'VS Code';
10
+ id = 'vscode';
11
+ description = 'Visual Studio Code with extensions';
12
+ configDir = '.vscode';
13
+ supportsDashPrefix = false;
14
+ async isAvailable(projectPath) {
15
+ try {
16
+ // Check if .vscode directory exists
17
+ await access(join(projectPath, this.configDir));
18
+ return true;
19
+ }
20
+ catch {
21
+ return false;
22
+ }
23
+ }
24
+ async isConfigured(projectPath) {
25
+ try {
26
+ const settingsPath = join(projectPath, this.configDir, 'settings.json');
27
+ const content = await readFile(settingsPath, 'utf-8');
28
+ const settings = JSON.parse(content);
29
+ return settings['speclife.enabled'] === true;
30
+ }
31
+ catch {
32
+ return false;
33
+ }
34
+ }
35
+ async configure(options) {
36
+ const { projectPath, specDir, force = false } = options;
37
+ const result = {
38
+ success: true,
39
+ filesModified: [],
40
+ filesSkipped: [],
41
+ warnings: [],
42
+ };
43
+ const vscodeDir = join(projectPath, this.configDir);
44
+ const settingsPath = join(vscodeDir, 'settings.json');
45
+ try {
46
+ // Ensure .vscode directory exists
47
+ await mkdir(vscodeDir, { recursive: true });
48
+ // Update settings.json to mark speclife as configured
49
+ let settings = {};
50
+ try {
51
+ const content = await readFile(settingsPath, 'utf-8');
52
+ settings = JSON.parse(content);
53
+ }
54
+ catch {
55
+ // File doesn't exist or is invalid, start fresh
56
+ }
57
+ if (settings['speclife.enabled'] && !force) {
58
+ result.filesSkipped.push(settingsPath);
59
+ }
60
+ else {
61
+ settings['speclife.enabled'] = true;
62
+ settings['speclife.specDir'] = specDir;
63
+ await writeFile(settingsPath, JSON.stringify(settings, null, 2), 'utf-8');
64
+ result.filesModified.push(settingsPath);
65
+ }
66
+ // Create tasks.json for CLI commands
67
+ const tasksPath = join(vscodeDir, 'tasks.json');
68
+ const tasksConfig = this.createTasksConfig();
69
+ try {
70
+ await access(tasksPath);
71
+ if (force) {
72
+ await writeFile(tasksPath, JSON.stringify(tasksConfig, null, 2), 'utf-8');
73
+ result.filesModified.push(tasksPath);
74
+ }
75
+ else {
76
+ result.filesSkipped.push(tasksPath);
77
+ }
78
+ }
79
+ catch {
80
+ await writeFile(tasksPath, JSON.stringify(tasksConfig, null, 2), 'utf-8');
81
+ result.filesModified.push(tasksPath);
82
+ }
83
+ result.warnings.push('VS Code has limited slash command support. Consider using Cursor or Claude Code for full experience.');
84
+ }
85
+ catch (err) {
86
+ result.success = false;
87
+ result.warnings.push(`Configuration failed: ${err}`);
88
+ }
89
+ return result;
90
+ }
91
+ async unconfigure(projectPath) {
92
+ const settingsPath = join(projectPath, this.configDir, 'settings.json');
93
+ try {
94
+ const content = await readFile(settingsPath, 'utf-8');
95
+ const settings = JSON.parse(content);
96
+ delete settings['speclife.enabled'];
97
+ delete settings['speclife.specDir'];
98
+ await writeFile(settingsPath, JSON.stringify(settings, null, 2), 'utf-8');
99
+ }
100
+ catch {
101
+ // Ignore errors during cleanup
102
+ }
103
+ }
104
+ createTasksConfig() {
105
+ return {
106
+ version: '2.0.0',
107
+ tasks: [
108
+ {
109
+ label: 'SpecLife: Status',
110
+ type: 'shell',
111
+ command: 'speclife status',
112
+ group: 'none',
113
+ presentation: {
114
+ reveal: 'always',
115
+ panel: 'new',
116
+ },
117
+ },
118
+ {
119
+ label: 'SpecLife: List Changes',
120
+ type: 'shell',
121
+ command: 'speclife list',
122
+ group: 'none',
123
+ presentation: {
124
+ reveal: 'always',
125
+ panel: 'new',
126
+ },
127
+ },
128
+ {
129
+ label: 'SpecLife: View Dashboard',
130
+ type: 'shell',
131
+ command: 'speclife view',
132
+ group: 'none',
133
+ presentation: {
134
+ reveal: 'always',
135
+ panel: 'new',
136
+ },
137
+ },
138
+ ],
139
+ };
140
+ }
141
+ }
142
+ //# sourceMappingURL=vscode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vscode.js","sourceRoot":"","sources":["../../src/configurators/vscode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Windsurf editor configurator
3
+ * Codeium's AI-powered editor
4
+ */
5
+ import { EditorConfigurator, type ConfigureResult, type ConfigureOptions } from './base.js';
6
+ export declare class WindsurfConfigurator extends EditorConfigurator {
7
+ readonly name = "Windsurf";
8
+ readonly id = "windsurf";
9
+ readonly description = "Codeium's AI-powered code editor";
10
+ readonly configDir = ".windsurf";
11
+ readonly supportsDashPrefix = true;
12
+ isAvailable(_projectPath: string): Promise<boolean>;
13
+ isConfigured(projectPath: string): Promise<boolean>;
14
+ configure(options: ConfigureOptions): Promise<ConfigureResult>;
15
+ unconfigure(projectPath: string): Promise<void>;
16
+ }
17
+ //# sourceMappingURL=windsurf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windsurf.d.ts","sourceRoot":"","sources":["../../src/configurators/windsurf.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,kBAAkB,EAAE,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE5F,qBAAa,oBAAqB,SAAQ,kBAAkB;IAC1D,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,EAAE,cAAc;IACzB,QAAQ,CAAC,WAAW,sCAAsC;IAC1D,QAAQ,CAAC,SAAS,eAAe;IACjC,QAAQ,CAAC,kBAAkB,QAAQ;IAE7B,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKnD,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUnD,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAkD9D,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAYtD"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Windsurf editor configurator
3
+ * Codeium's AI-powered editor
4
+ */
5
+ import { access, mkdir, symlink, unlink, lstat, readlink } from 'fs/promises';
6
+ import { join } from 'path';
7
+ import { EditorConfigurator } from './base.js';
8
+ export class WindsurfConfigurator extends EditorConfigurator {
9
+ name = 'Windsurf';
10
+ id = 'windsurf';
11
+ description = "Codeium's AI-powered code editor";
12
+ configDir = '.windsurf';
13
+ supportsDashPrefix = true;
14
+ async isAvailable(_projectPath) {
15
+ // Windsurf is always available as a supported editor
16
+ return true;
17
+ }
18
+ async isConfigured(projectPath) {
19
+ try {
20
+ const commandsDir = join(projectPath, this.configDir, 'commands', 'speclife');
21
+ await access(commandsDir);
22
+ return true;
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
28
+ async configure(options) {
29
+ const { projectPath, specDir, force = false } = options;
30
+ const result = {
31
+ success: true,
32
+ filesModified: [],
33
+ filesSkipped: [],
34
+ warnings: [],
35
+ };
36
+ const sourceDir = join(projectPath, specDir, 'commands', 'speclife');
37
+ const editorCommandsBase = join(projectPath, this.configDir, 'commands');
38
+ const editorCommandsDir = join(editorCommandsBase, 'speclife');
39
+ try {
40
+ // Ensure editor commands directory exists
41
+ await mkdir(editorCommandsBase, { recursive: true });
42
+ // Create symlink for speclife/ directory
43
+ try {
44
+ const stats = await lstat(editorCommandsDir);
45
+ if (stats.isSymbolicLink()) {
46
+ if (force) {
47
+ await unlink(editorCommandsDir);
48
+ await symlink(sourceDir, editorCommandsDir);
49
+ result.filesModified.push(editorCommandsDir);
50
+ }
51
+ else {
52
+ const target = await readlink(editorCommandsDir);
53
+ if (target !== sourceDir) {
54
+ result.warnings.push(`Existing symlink points to ${target}, not ${sourceDir}`);
55
+ }
56
+ result.filesSkipped.push(editorCommandsDir);
57
+ }
58
+ }
59
+ else {
60
+ result.warnings.push(`${editorCommandsDir} exists but is not a symlink`);
61
+ result.filesSkipped.push(editorCommandsDir);
62
+ }
63
+ }
64
+ catch {
65
+ // Symlink doesn't exist, create it
66
+ await symlink(sourceDir, editorCommandsDir);
67
+ result.filesModified.push(editorCommandsDir);
68
+ }
69
+ }
70
+ catch (err) {
71
+ result.success = false;
72
+ result.warnings.push(`Configuration failed: ${err}`);
73
+ }
74
+ return result;
75
+ }
76
+ async unconfigure(projectPath) {
77
+ const editorCommandsDir = join(projectPath, this.configDir, 'commands', 'speclife');
78
+ try {
79
+ const stats = await lstat(editorCommandsDir);
80
+ if (stats.isSymbolicLink()) {
81
+ await unlink(editorCommandsDir);
82
+ }
83
+ }
84
+ catch {
85
+ // Ignore errors during cleanup
86
+ }
87
+ }
88
+ }
89
+ //# sourceMappingURL=windsurf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windsurf.js","sourceRoot":"","sources":["../../src/configurators/windsurf.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Global configuration management
3
+ * XDG-compliant configuration storage for cross-platform support
4
+ */
5
+ /** Global configuration schema */
6
+ export interface GlobalConfig {
7
+ /** Default AI provider (claude, openai, gemini) */
8
+ aiProvider?: 'claude' | 'openai' | 'gemini';
9
+ /** Default AI model identifier */
10
+ aiModel?: string;
11
+ /** Default editor for init */
12
+ defaultEditor?: string;
13
+ /** User preferences */
14
+ preferences?: {
15
+ /** Show colors in output (default: true) */
16
+ colors?: boolean;
17
+ /** Show progress spinners (default: true) */
18
+ spinners?: boolean;
19
+ /** Default output format for commands (default: 'text') */
20
+ outputFormat?: 'text' | 'json';
21
+ };
22
+ }
23
+ /**
24
+ * Get the XDG-compliant config directory for SpecLife
25
+ * @returns Path to the global config directory
26
+ */
27
+ export declare function getGlobalConfigDir(): string;
28
+ /**
29
+ * Get the path to the global config file
30
+ * @returns Path to config.yaml
31
+ */
32
+ export declare function getGlobalConfigPath(): string;
33
+ /**
34
+ * Check if global config exists
35
+ * @returns true if config file exists
36
+ */
37
+ export declare function globalConfigExists(): boolean;
38
+ /**
39
+ * Load the global configuration
40
+ * Returns defaults merged with user settings
41
+ * @returns Global config object
42
+ */
43
+ export declare function getGlobalConfig(): Promise<GlobalConfig>;
44
+ /**
45
+ * Save the global configuration
46
+ * @param config Config to save (will be merged with existing)
47
+ */
48
+ export declare function saveGlobalConfig(config: Partial<GlobalConfig>): Promise<void>;
49
+ /**
50
+ * Get a specific config value
51
+ * @param key Config key path (e.g., 'aiProvider' or 'preferences.colors')
52
+ * @returns Config value or undefined
53
+ */
54
+ export declare function getGlobalConfigValue<T = unknown>(key: string): Promise<T | undefined>;
55
+ /**
56
+ * Set a specific config value
57
+ * @param key Config key path (e.g., 'aiProvider' or 'preferences.colors')
58
+ * @param value Value to set
59
+ */
60
+ export declare function setGlobalConfigValue(key: string, value: unknown): Promise<void>;
61
+ /**
62
+ * Unset a specific config value (remove from file)
63
+ * @param key Config key path
64
+ */
65
+ export declare function unsetGlobalConfigValue(key: string): Promise<void>;
66
+ /**
67
+ * Reset global config to defaults
68
+ */
69
+ export declare function resetGlobalConfig(): Promise<void>;
70
+ /**
71
+ * List all config keys and values
72
+ * @param config Config object (defaults to current global config)
73
+ * @returns Flat map of key paths to values
74
+ */
75
+ export declare function listGlobalConfig(config?: GlobalConfig): Promise<Map<string, unknown>>;
76
+ //# sourceMappingURL=global-config.d.ts.map
@@ -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":"AAAA;;;;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
@@ -1,3 +1,20 @@
1
+ /*
2
+ * SpecLife - Git and GitHub automation for spec-driven development
3
+ * Copyright (C) 2026 malarbase
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+ */
1
18
  /**
2
19
  * @speclife/core
3
20
  *
@@ -13,4 +30,10 @@ export * from './adapters/index.js';
13
30
  export * from './workflows/index.js';
14
31
  // Re-export utilities
15
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';
16
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;;;;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"}