@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.
- 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/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/index.d.ts +17 -0
- package/dist/configurators/index.d.ts.map +1 -0
- package/dist/configurators/index.js +34 -0
- package/dist/configurators/index.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 +23 -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,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 @@
|
|
|
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"}
|