@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,61 @@
1
+ /**
2
+ * Types for shell completion system
3
+ */
4
+ /** Supported shells for completion generation */
5
+ export type Shell = 'bash' | 'zsh' | 'fish';
6
+ /** Completion type for a command argument */
7
+ export type CompletionType = 'none' | 'file' | 'directory' | 'change-id' | 'shell' | 'editor' | 'config-key' | 'static';
8
+ /** Definition of a completable command */
9
+ export interface CommandDef {
10
+ /** Command name (e.g., "status", "worktree create") */
11
+ name: string;
12
+ /** Subcommands if any */
13
+ subcommands?: CommandDef[];
14
+ /** Options/flags */
15
+ options?: OptionDef[];
16
+ /** Positional arguments */
17
+ args?: ArgDef[];
18
+ }
19
+ /** Definition of a command option */
20
+ export interface OptionDef {
21
+ /** Short flag (e.g., "-f") */
22
+ short?: string;
23
+ /** Long flag (e.g., "--force") */
24
+ long: string;
25
+ /** Description for help */
26
+ description: string;
27
+ /** Whether this option takes a value */
28
+ takesValue?: boolean;
29
+ /** Completion type for the value */
30
+ valueCompletion?: CompletionType;
31
+ /** Static values if valueCompletion is 'static' */
32
+ staticValues?: string[];
33
+ }
34
+ /** Definition of a positional argument */
35
+ export interface ArgDef {
36
+ /** Argument name for help */
37
+ name: string;
38
+ /** Completion type */
39
+ completion: CompletionType;
40
+ /** Static values if completion is 'static' */
41
+ staticValues?: string[];
42
+ /** Whether this argument is optional */
43
+ optional?: boolean;
44
+ }
45
+ /** Interface for shell completion generators */
46
+ export interface CompletionGenerator {
47
+ /** Shell this generator targets */
48
+ readonly shell: Shell;
49
+ /**
50
+ * Generate the completion script
51
+ * @param commands Command definitions
52
+ * @returns Shell script for completions
53
+ */
54
+ generate(commands: CommandDef[]): string;
55
+ /**
56
+ * Get installation instructions
57
+ * @returns Human-readable installation instructions
58
+ */
59
+ getInstallInstructions(): string;
60
+ }
61
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/completions/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,iDAAiD;AACjD,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAE5C,6CAA6C;AAC7C,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,MAAM,GACN,WAAW,GACX,WAAW,GACX,OAAO,GACP,QAAQ,GACR,YAAY,GACZ,QAAQ,CAAC;AAEb,0CAA0C;AAC1C,MAAM,WAAW,UAAU;IACzB,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,yBAAyB;IACzB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,oBAAoB;IACpB,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACtB,2BAA2B;IAC3B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,qCAAqC;AACrC,MAAM,WAAW,SAAS;IACxB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,oCAAoC;IACpC,eAAe,CAAC,EAAE,cAAc,CAAC;IACjC,mDAAmD;IACnD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,0CAA0C;AAC1C,MAAM,WAAW,MAAM;IACrB,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,UAAU,EAAE,cAAc,CAAC;IAC3B,8CAA8C;IAC9C,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,gDAAgD;AAChD,MAAM,WAAW,mBAAmB;IAClC,mCAAmC;IACnC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IAEtB;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IAEzC;;;OAGG;IACH,sBAAsB,IAAI,MAAM,CAAC;CAClC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Types for shell completion system
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/completions/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Zsh completion script generator
3
+ */
4
+ import type { CompletionGenerator, CommandDef } from './types.js';
5
+ export declare class ZshGenerator implements CompletionGenerator {
6
+ readonly shell: "zsh";
7
+ generate(commands: CommandDef[]): string;
8
+ getInstallInstructions(): string;
9
+ private getCommandDescription;
10
+ private generateCommandCase;
11
+ private getSubcommandDescription;
12
+ private generateArgsSpec;
13
+ private getZshValueSpec;
14
+ private getZshArgSpec;
15
+ }
16
+ //# sourceMappingURL=zsh-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zsh-generator.d.ts","sourceRoot":"","sources":["../../src/completions/zsh-generator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAqB,MAAM,YAAY,CAAC;AAGrF,qBAAa,YAAa,YAAW,mBAAmB;IACtD,QAAQ,CAAC,KAAK,EAAG,KAAK,CAAU;IAEhC,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,MAAM;IAkDxC,sBAAsB,IAAI,MAAM;IAUhC,OAAO,CAAC,qBAAqB;IAgB7B,OAAO,CAAC,mBAAmB;IAwC3B,OAAO,CAAC,wBAAwB;IAoBhC,OAAO,CAAC,gBAAgB;IAsCxB,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,aAAa;CActB"}
@@ -0,0 +1,199 @@
1
+ /**
2
+ * Zsh completion script generator
3
+ */
4
+ import { getConfigKeys } from './commands.js';
5
+ export class ZshGenerator {
6
+ shell = 'zsh';
7
+ generate(commands) {
8
+ const lines = [
9
+ '#compdef speclife',
10
+ '# Zsh completion for speclife',
11
+ '# Generated by speclife completion zsh',
12
+ '',
13
+ '_speclife_change_ids() {',
14
+ ' local changes',
15
+ ' changes=($(speclife list --json 2>/dev/null | grep -o \'"id":"[^"]*"\' | cut -d\'"\' -f4))',
16
+ ' _describe "change" changes',
17
+ '}',
18
+ '',
19
+ '_speclife_config_keys() {',
20
+ ` local keys=(${getConfigKeys().join(' ')})`,
21
+ ' _describe "config key" keys',
22
+ '}',
23
+ '',
24
+ '_speclife() {',
25
+ ' local -a commands',
26
+ ' commands=(',
27
+ ...commands.map(c => ` '${c.name}:${this.getCommandDescription(c)}'`),
28
+ ' )',
29
+ '',
30
+ ' _arguments -C \\',
31
+ ' "1: :->command" \\',
32
+ ' "*::arg:->args"',
33
+ '',
34
+ ' case "$state" in',
35
+ ' command)',
36
+ ' _describe "command" commands',
37
+ ' ;;',
38
+ ' args)',
39
+ ' case "$words[1]" in',
40
+ ];
41
+ for (const cmd of commands) {
42
+ lines.push(...this.generateCommandCase(cmd));
43
+ }
44
+ lines.push(' esac');
45
+ lines.push(' ;;');
46
+ lines.push(' esac');
47
+ lines.push('}');
48
+ lines.push('');
49
+ lines.push('_speclife "$@"');
50
+ lines.push('');
51
+ return lines.join('\n');
52
+ }
53
+ getInstallInstructions() {
54
+ return `# Add to your ~/.zshrc:
55
+ speclife completion zsh >> ~/.zshrc
56
+ source ~/.zshrc
57
+
58
+ # Or install to fpath:
59
+ speclife completion zsh > ~/.zsh/completions/_speclife
60
+ # Then ensure ~/.zsh/completions is in your fpath`;
61
+ }
62
+ getCommandDescription(cmd) {
63
+ const descriptions = {
64
+ init: 'Initialize SpecLife in this project',
65
+ worktree: 'Manage git worktrees',
66
+ status: 'Show change status',
67
+ list: 'List all changes',
68
+ view: 'Show dashboard view',
69
+ completion: 'Generate shell completions',
70
+ config: 'Manage configuration',
71
+ validate: 'Validate change spec',
72
+ update: 'Update managed files',
73
+ version: 'Show version',
74
+ };
75
+ return descriptions[cmd.name] ?? cmd.name;
76
+ }
77
+ generateCommandCase(cmd) {
78
+ const lines = [];
79
+ lines.push(` ${cmd.name})`);
80
+ if (cmd.subcommands && cmd.subcommands.length > 0) {
81
+ lines.push(' local -a subcommands');
82
+ lines.push(' subcommands=(');
83
+ for (const sub of cmd.subcommands) {
84
+ lines.push(` '${sub.name}:${this.getSubcommandDescription(cmd.name, sub.name)}'`);
85
+ }
86
+ lines.push(' )');
87
+ lines.push(' _arguments -C \\');
88
+ lines.push(' "1: :->subcommand" \\');
89
+ lines.push(' "*::arg:->subargs"');
90
+ lines.push(' case "$state" in');
91
+ lines.push(' subcommand)');
92
+ lines.push(' _describe "subcommand" subcommands');
93
+ lines.push(' ;;');
94
+ lines.push(' subargs)');
95
+ lines.push(' case "$words[1]" in');
96
+ for (const sub of cmd.subcommands) {
97
+ lines.push(` ${sub.name})`);
98
+ lines.push(...this.generateArgsSpec(sub.args ?? [], sub.options ?? [], 18));
99
+ lines.push(' ;;');
100
+ }
101
+ lines.push(' esac');
102
+ lines.push(' ;;');
103
+ lines.push(' esac');
104
+ }
105
+ else {
106
+ lines.push(...this.generateArgsSpec(cmd.args ?? [], cmd.options ?? [], 10));
107
+ }
108
+ lines.push(' ;;');
109
+ return lines;
110
+ }
111
+ getSubcommandDescription(cmd, sub) {
112
+ const descriptions = {
113
+ worktree: {
114
+ create: 'Create a worktree for a change',
115
+ rm: 'Remove a worktree',
116
+ list: 'List all worktrees',
117
+ },
118
+ config: {
119
+ path: 'Show config file path',
120
+ list: 'List all config values',
121
+ get: 'Get a config value',
122
+ set: 'Set a config value',
123
+ unset: 'Remove a config value',
124
+ reset: 'Reset to defaults',
125
+ edit: 'Open config in editor',
126
+ },
127
+ };
128
+ return descriptions[cmd]?.[sub] ?? sub;
129
+ }
130
+ generateArgsSpec(args, options, indent) {
131
+ const pad = ' '.repeat(indent);
132
+ const lines = [];
133
+ lines.push(`${pad}_arguments \\`);
134
+ // Add options
135
+ for (const opt of options) {
136
+ const flags = [opt.short, opt.long].filter(Boolean);
137
+ const spec = flags.length > 1
138
+ ? `{${flags.join(',')}}`
139
+ : flags[0];
140
+ if (opt.takesValue) {
141
+ const valueSpec = this.getZshValueSpec(opt);
142
+ lines.push(`${pad} '${spec}[${opt.description}]:${opt.long?.replace('--', '')}:${valueSpec}' \\`);
143
+ }
144
+ else {
145
+ lines.push(`${pad} '${spec}[${opt.description}]' \\`);
146
+ }
147
+ }
148
+ // Add positional args
149
+ for (let i = 0; i < args.length; i++) {
150
+ const arg = args[i];
151
+ const pos = i + 1;
152
+ const valueSpec = this.getZshArgSpec(arg);
153
+ const optional = arg.optional ? ':' : '';
154
+ lines.push(`${pad} '${optional}${pos}:${arg.name}:${valueSpec}' \\`);
155
+ }
156
+ // Remove trailing backslash from last line
157
+ if (lines.length > 1) {
158
+ lines[lines.length - 1] = lines[lines.length - 1].replace(/ \\$/, '');
159
+ }
160
+ return lines;
161
+ }
162
+ getZshValueSpec(opt) {
163
+ if (opt.valueCompletion === 'static' && opt.staticValues) {
164
+ return `(${opt.staticValues.join(' ')})`;
165
+ }
166
+ else if (opt.valueCompletion === 'change-id') {
167
+ return '_speclife_change_ids';
168
+ }
169
+ else if (opt.valueCompletion === 'config-key') {
170
+ return '_speclife_config_keys';
171
+ }
172
+ else if (opt.valueCompletion === 'file') {
173
+ return '_files';
174
+ }
175
+ else if (opt.valueCompletion === 'directory') {
176
+ return '_directories';
177
+ }
178
+ return '';
179
+ }
180
+ getZshArgSpec(arg) {
181
+ if (arg.completion === 'static' && arg.staticValues) {
182
+ return `(${arg.staticValues.join(' ')})`;
183
+ }
184
+ else if (arg.completion === 'change-id') {
185
+ return '_speclife_change_ids';
186
+ }
187
+ else if (arg.completion === 'config-key') {
188
+ return '_speclife_config_keys';
189
+ }
190
+ else if (arg.completion === 'file') {
191
+ return '_files';
192
+ }
193
+ else if (arg.completion === 'directory') {
194
+ return '_directories';
195
+ }
196
+ return '';
197
+ }
198
+ }
199
+ //# sourceMappingURL=zsh-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zsh-generator.js","sourceRoot":"","sources":["../../src/completions/zsh-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Base interface for editor configurators
3
+ * Each editor has its own configurator that handles setup specifics
4
+ */
5
+ import type { SpecLifeConfig } from '../config.js';
6
+ /** Editor configuration result */
7
+ export interface ConfigureResult {
8
+ /** Whether configuration was successful */
9
+ success: boolean;
10
+ /** Files that were created or modified */
11
+ filesModified: string[];
12
+ /** Files that were skipped (already exist) */
13
+ filesSkipped: string[];
14
+ /** Any warnings during configuration */
15
+ warnings: string[];
16
+ }
17
+ /** Options for editor configuration */
18
+ export interface ConfigureOptions {
19
+ /** Project root path */
20
+ projectPath: string;
21
+ /** Spec directory name (e.g., "openspec") */
22
+ specDir: string;
23
+ /** Force overwrite existing files */
24
+ force?: boolean;
25
+ /** SpecLife config for context */
26
+ config?: SpecLifeConfig;
27
+ }
28
+ /**
29
+ * Abstract base class for editor configurators
30
+ * Implement this to add support for new editors
31
+ */
32
+ export declare abstract class EditorConfigurator {
33
+ /** Human-readable name of the editor */
34
+ abstract readonly name: string;
35
+ /** Short identifier for the editor (used in commands) */
36
+ abstract readonly id: string;
37
+ /** Description of the editor */
38
+ abstract readonly description: string;
39
+ /** Directory name used by this editor (e.g., ".cursor", ".vscode") */
40
+ abstract readonly configDir: string;
41
+ /** Whether this editor supports dash-prefixed commands (e.g., /speclife-start) */
42
+ abstract readonly supportsDashPrefix: boolean;
43
+ /**
44
+ * Check if this editor is available on the system
45
+ * (e.g., check if its config directory exists or CLI is installed)
46
+ */
47
+ abstract isAvailable(projectPath: string): Promise<boolean>;
48
+ /**
49
+ * Check if this editor is already configured for SpecLife
50
+ */
51
+ abstract isConfigured(projectPath: string): Promise<boolean>;
52
+ /**
53
+ * Configure the editor for SpecLife
54
+ * Creates symlinks or copies command files
55
+ */
56
+ abstract configure(options: ConfigureOptions): Promise<ConfigureResult>;
57
+ /**
58
+ * Remove SpecLife configuration from this editor
59
+ */
60
+ abstract unconfigure(projectPath: string): Promise<void>;
61
+ /**
62
+ * Get detection hints for this editor
63
+ * @returns Array of paths to check for editor detection
64
+ */
65
+ getDetectionPaths(): string[];
66
+ }
67
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/configurators/base.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,kCAAkC;AAClC,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,0CAA0C;IAC1C,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,8CAA8C;IAC9C,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,wCAAwC;IACxC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,uCAAuC;AACvC,MAAM,WAAW,gBAAgB;IAC/B,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kCAAkC;IAClC,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB;AAED;;;GAGG;AACH,8BAAsB,kBAAkB;IACtC,wCAAwC;IACxC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAE/B,yDAAyD;IACzD,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAE7B,gCAAgC;IAChC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAEtC,sEAAsE;IACtE,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAEpC,kFAAkF;IAClF,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IAE9C;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAE3D;;OAEG;IACH,QAAQ,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAE5D;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAEvE;;OAEG;IACH,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAExD;;;OAGG;IACH,iBAAiB,IAAI,MAAM,EAAE;CAG9B"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Base interface for editor configurators
3
+ * Each editor has its own configurator that handles setup specifics
4
+ */
5
+ /**
6
+ * Abstract base class for editor configurators
7
+ * Implement this to add support for new editors
8
+ */
9
+ export class EditorConfigurator {
10
+ /**
11
+ * Get detection hints for this editor
12
+ * @returns Array of paths to check for editor detection
13
+ */
14
+ getDetectionPaths() {
15
+ return [this.configDir];
16
+ }
17
+ }
18
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/configurators/base.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA4BH;;;GAGG;AACH,MAAM,OAAgB,kBAAkB;IAsCtC;;;OAGG;IACH,iBAAiB;QACf,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1B,CAAC;CACF"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Claude Code (Anthropic) editor configurator
3
+ */
4
+ import { EditorConfigurator, type ConfigureResult, type ConfigureOptions } from './base.js';
5
+ export declare class ClaudeCodeConfigurator extends EditorConfigurator {
6
+ readonly name = "Claude Code";
7
+ readonly id = "claude-code";
8
+ readonly description = "Claude-powered agentic IDE from Anthropic";
9
+ readonly configDir = ".claude";
10
+ readonly supportsDashPrefix = false;
11
+ isAvailable(_projectPath: string): Promise<boolean>;
12
+ isConfigured(projectPath: string): Promise<boolean>;
13
+ configure(options: ConfigureOptions): Promise<ConfigureResult>;
14
+ unconfigure(projectPath: string): Promise<void>;
15
+ }
16
+ //# sourceMappingURL=claude-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../src/configurators/claude-code.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,kBAAkB,EAAE,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE5F,qBAAa,sBAAuB,SAAQ,kBAAkB;IAC5D,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,QAAQ,CAAC,EAAE,iBAAiB;IAC5B,QAAQ,CAAC,WAAW,+CAA+C;IACnE,QAAQ,CAAC,SAAS,aAAa;IAC/B,QAAQ,CAAC,kBAAkB,SAAS;IAE9B,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;IAsD9D,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAYtD"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Claude Code (Anthropic) editor configurator
3
+ */
4
+ import { access, mkdir, symlink, unlink, lstat, readlink } from 'fs/promises';
5
+ import { join } from 'path';
6
+ import { EditorConfigurator } from './base.js';
7
+ export class ClaudeCodeConfigurator extends EditorConfigurator {
8
+ name = 'Claude Code';
9
+ id = 'claude-code';
10
+ description = 'Claude-powered agentic IDE from Anthropic';
11
+ configDir = '.claude';
12
+ supportsDashPrefix = false; // Claude Code uses subdirectory format only
13
+ async isAvailable(_projectPath) {
14
+ // Claude Code is always available as a supported editor
15
+ return true;
16
+ }
17
+ async isConfigured(projectPath) {
18
+ try {
19
+ const commandsDir = join(projectPath, this.configDir, 'commands', 'speclife');
20
+ await access(commandsDir);
21
+ return true;
22
+ }
23
+ catch {
24
+ return false;
25
+ }
26
+ }
27
+ async configure(options) {
28
+ const { projectPath, specDir, force = false } = options;
29
+ const result = {
30
+ success: true,
31
+ filesModified: [],
32
+ filesSkipped: [],
33
+ warnings: [],
34
+ };
35
+ const sourceDir = join(projectPath, specDir, 'commands', 'speclife');
36
+ const editorCommandsBase = join(projectPath, this.configDir, 'commands');
37
+ const editorCommandsDir = join(editorCommandsBase, 'speclife');
38
+ try {
39
+ // Ensure editor commands directory exists
40
+ await mkdir(editorCommandsBase, { recursive: true });
41
+ // Create symlink for speclife/ directory
42
+ try {
43
+ const stats = await lstat(editorCommandsDir);
44
+ if (stats.isSymbolicLink()) {
45
+ if (force) {
46
+ await unlink(editorCommandsDir);
47
+ await symlink(sourceDir, editorCommandsDir);
48
+ result.filesModified.push(editorCommandsDir);
49
+ }
50
+ else {
51
+ // Check if symlink points to correct location
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
+ // Claude Code doesn't need dash-prefixed symlinks
70
+ // It only supports the subdirectory format: /speclife/command
71
+ }
72
+ catch (err) {
73
+ result.success = false;
74
+ result.warnings.push(`Configuration failed: ${err}`);
75
+ }
76
+ return result;
77
+ }
78
+ async unconfigure(projectPath) {
79
+ const editorCommandsDir = join(projectPath, this.configDir, 'commands', 'speclife');
80
+ try {
81
+ const stats = await lstat(editorCommandsDir);
82
+ if (stats.isSymbolicLink()) {
83
+ await unlink(editorCommandsDir);
84
+ }
85
+ }
86
+ catch {
87
+ // Ignore errors during cleanup
88
+ }
89
+ }
90
+ }
91
+ //# sourceMappingURL=claude-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/configurators/claude-code.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Cursor editor configurator
3
+ */
4
+ import { EditorConfigurator, type ConfigureResult, type ConfigureOptions } from './base.js';
5
+ export declare class CursorConfigurator extends EditorConfigurator {
6
+ readonly name = "Cursor";
7
+ readonly id = "cursor";
8
+ readonly description = "AI-first code editor with Claude integration";
9
+ readonly configDir = ".cursor";
10
+ readonly supportsDashPrefix = true;
11
+ isAvailable(_projectPath: string): Promise<boolean>;
12
+ isConfigured(projectPath: string): Promise<boolean>;
13
+ configure(options: ConfigureOptions): Promise<ConfigureResult>;
14
+ unconfigure(projectPath: string): Promise<void>;
15
+ private discoverCommands;
16
+ }
17
+ //# sourceMappingURL=cursor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/configurators/cursor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,kBAAkB,EAAE,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE5F,qBAAa,kBAAmB,SAAQ,kBAAkB;IACxD,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,EAAE,YAAY;IACvB,QAAQ,CAAC,WAAW,kDAAkD;IACtE,QAAQ,CAAC,SAAS,aAAa;IAC/B,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;IA6E9D,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YA2BvC,gBAAgB;CAU/B"}