@speclife/core 0.10.0 → 0.12.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/configurators/antigravity.d.ts +22 -0
- package/dist/configurators/antigravity.d.ts.map +1 -0
- package/dist/configurators/antigravity.js +115 -0
- package/dist/configurators/antigravity.js.map +1 -0
- package/dist/configurators/gemini.d.ts +17 -0
- package/dist/configurators/gemini.d.ts.map +1 -0
- package/dist/configurators/gemini.js +92 -0
- package/dist/configurators/gemini.js.map +1 -0
- package/dist/configurators/index.d.ts +3 -0
- package/dist/configurators/index.d.ts.map +1 -1
- package/dist/configurators/index.js +9 -0
- package/dist/configurators/index.js.map +1 -1
- package/dist/configurators/qwen.d.ts +18 -0
- package/dist/configurators/qwen.d.ts.map +1 -0
- package/dist/configurators/qwen.js +141 -0
- package/dist/configurators/qwen.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Antigravity editor configurator
|
|
3
|
+
* Google's AI-powered IDE using .agent directory with flat workflow files
|
|
4
|
+
*/
|
|
5
|
+
import { EditorConfigurator, type ConfigureResult, type ConfigureOptions } from './base.js';
|
|
6
|
+
export declare class AntigravityConfigurator extends EditorConfigurator {
|
|
7
|
+
readonly name = "Antigravity";
|
|
8
|
+
readonly id = "antigravity";
|
|
9
|
+
readonly description = "Google's AI-powered IDE";
|
|
10
|
+
readonly configDir = ".agent";
|
|
11
|
+
readonly supportsDashPrefix = false;
|
|
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
|
+
* Override detection paths for Antigravity
|
|
18
|
+
*/
|
|
19
|
+
getDetectionPaths(): string[];
|
|
20
|
+
private discoverCommands;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=antigravity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"antigravity.d.ts","sourceRoot":"","sources":["../../src/configurators/antigravity.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,kBAAkB,EAAE,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE5F,qBAAa,uBAAwB,SAAQ,kBAAkB;IAC7D,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,QAAQ,CAAC,EAAE,iBAAiB;IAC5B,QAAQ,CAAC,WAAW,6BAA6B;IACjD,QAAQ,CAAC,SAAS,YAAY;IAC9B,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;IAWnD,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAoD9D,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBrD;;OAEG;IACM,iBAAiB,IAAI,MAAM,EAAE;YAIxB,gBAAgB;CAU/B"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Antigravity editor configurator
|
|
3
|
+
* Google's AI-powered IDE using .agent directory with flat workflow files
|
|
4
|
+
*/
|
|
5
|
+
import { access, mkdir, symlink, unlink, lstat, readdir } from 'fs/promises';
|
|
6
|
+
import { join } from 'path';
|
|
7
|
+
import { EditorConfigurator } from './base.js';
|
|
8
|
+
export class AntigravityConfigurator extends EditorConfigurator {
|
|
9
|
+
name = 'Antigravity';
|
|
10
|
+
id = 'antigravity';
|
|
11
|
+
description = "Google's AI-powered IDE";
|
|
12
|
+
configDir = '.agent';
|
|
13
|
+
supportsDashPrefix = false; // Dash-prefix IS the primary format, not secondary
|
|
14
|
+
async isAvailable(_projectPath) {
|
|
15
|
+
// Antigravity is always available as a supported editor
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
async isConfigured(projectPath) {
|
|
19
|
+
try {
|
|
20
|
+
// Check if any speclife-*.md files exist in .agent/workflows/
|
|
21
|
+
const workflowsDir = join(projectPath, this.configDir, 'workflows');
|
|
22
|
+
const files = await readdir(workflowsDir);
|
|
23
|
+
return files.some(f => f.startsWith('speclife-') && f.endsWith('.md'));
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async configure(options) {
|
|
30
|
+
const { projectPath, specDir, force = false } = options;
|
|
31
|
+
const result = {
|
|
32
|
+
success: true,
|
|
33
|
+
filesModified: [],
|
|
34
|
+
filesSkipped: [],
|
|
35
|
+
warnings: [],
|
|
36
|
+
};
|
|
37
|
+
const sourceDir = join(projectPath, specDir, 'commands', 'speclife');
|
|
38
|
+
// Antigravity uses flat files: .agent/workflows/speclife-<cmd>.md
|
|
39
|
+
const workflowsDir = join(projectPath, this.configDir, 'workflows');
|
|
40
|
+
try {
|
|
41
|
+
// Ensure workflows directory exists
|
|
42
|
+
await mkdir(workflowsDir, { recursive: true });
|
|
43
|
+
// Discover available commands
|
|
44
|
+
const commands = await this.discoverCommands(sourceDir);
|
|
45
|
+
// Create individual symlinks for each command
|
|
46
|
+
for (const cmd of commands) {
|
|
47
|
+
const dashFile = join(workflowsDir, `speclife-${cmd}.md`);
|
|
48
|
+
const targetFile = join(sourceDir, `${cmd}.md`);
|
|
49
|
+
try {
|
|
50
|
+
await access(dashFile);
|
|
51
|
+
if (force) {
|
|
52
|
+
await unlink(dashFile);
|
|
53
|
+
await symlink(targetFile, dashFile);
|
|
54
|
+
result.filesModified.push(dashFile);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
result.filesSkipped.push(dashFile);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// File doesn't exist, create symlink
|
|
62
|
+
try {
|
|
63
|
+
await symlink(targetFile, dashFile);
|
|
64
|
+
result.filesModified.push(dashFile);
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
result.warnings.push(`Failed to create ${dashFile}: ${err}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
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 workflowsDir = join(projectPath, this.configDir, 'workflows');
|
|
80
|
+
try {
|
|
81
|
+
// Remove all speclife-*.md symlinks
|
|
82
|
+
const files = await readdir(workflowsDir);
|
|
83
|
+
for (const file of files) {
|
|
84
|
+
if (file.startsWith('speclife-') && file.endsWith('.md')) {
|
|
85
|
+
const filePath = join(workflowsDir, file);
|
|
86
|
+
const stats = await lstat(filePath);
|
|
87
|
+
if (stats.isSymbolicLink()) {
|
|
88
|
+
await unlink(filePath);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// Ignore errors during cleanup
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Override detection paths for Antigravity
|
|
99
|
+
*/
|
|
100
|
+
getDetectionPaths() {
|
|
101
|
+
return [this.configDir, join(this.configDir, 'workflows')];
|
|
102
|
+
}
|
|
103
|
+
async discoverCommands(sourceDir) {
|
|
104
|
+
try {
|
|
105
|
+
const files = await readdir(sourceDir);
|
|
106
|
+
return files
|
|
107
|
+
.filter(f => f.endsWith('.md'))
|
|
108
|
+
.map(f => f.replace('.md', ''));
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return [];
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=antigravity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"antigravity.js","sourceRoot":"","sources":["../../src/configurators/antigravity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gemini CLI editor configurator
|
|
3
|
+
* Google's AI-powered CLI tool
|
|
4
|
+
*/
|
|
5
|
+
import { EditorConfigurator, type ConfigureResult, type ConfigureOptions } from './base.js';
|
|
6
|
+
export declare class GeminiConfigurator extends EditorConfigurator {
|
|
7
|
+
readonly name = "Gemini CLI";
|
|
8
|
+
readonly id = "gemini";
|
|
9
|
+
readonly description = "Google's AI-powered command-line coding assistant";
|
|
10
|
+
readonly configDir = ".gemini";
|
|
11
|
+
readonly supportsDashPrefix = false;
|
|
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=gemini.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/configurators/gemini.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,kBAAkB,EAAE,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE5F,qBAAa,kBAAmB,SAAQ,kBAAkB;IACxD,QAAQ,CAAC,IAAI,gBAAgB;IAC7B,QAAQ,CAAC,EAAE,YAAY;IACvB,QAAQ,CAAC,WAAW,uDAAuD;IAC3E,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,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gemini CLI editor configurator
|
|
3
|
+
* Google's AI-powered CLI tool
|
|
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 GeminiConfigurator extends EditorConfigurator {
|
|
9
|
+
name = 'Gemini CLI';
|
|
10
|
+
id = 'gemini';
|
|
11
|
+
description = "Google's AI-powered command-line coding assistant";
|
|
12
|
+
configDir = '.gemini';
|
|
13
|
+
supportsDashPrefix = false; // Gemini CLI uses subdirectory format
|
|
14
|
+
async isAvailable(_projectPath) {
|
|
15
|
+
// Gemini CLI 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
|
+
// Check if symlink points to correct location
|
|
53
|
+
const target = await readlink(editorCommandsDir);
|
|
54
|
+
if (target !== sourceDir) {
|
|
55
|
+
result.warnings.push(`Existing symlink points to ${target}, not ${sourceDir}`);
|
|
56
|
+
}
|
|
57
|
+
result.filesSkipped.push(editorCommandsDir);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
result.warnings.push(`${editorCommandsDir} exists but is not a symlink`);
|
|
62
|
+
result.filesSkipped.push(editorCommandsDir);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Symlink doesn't exist, create it
|
|
67
|
+
await symlink(sourceDir, editorCommandsDir);
|
|
68
|
+
result.filesModified.push(editorCommandsDir);
|
|
69
|
+
}
|
|
70
|
+
// Gemini CLI doesn't need dash-prefixed symlinks
|
|
71
|
+
// It uses the subdirectory format: /speclife/command
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
result.success = false;
|
|
75
|
+
result.warnings.push(`Configuration failed: ${err}`);
|
|
76
|
+
}
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
async unconfigure(projectPath) {
|
|
80
|
+
const editorCommandsDir = join(projectPath, this.configDir, 'commands', 'speclife');
|
|
81
|
+
try {
|
|
82
|
+
const stats = await lstat(editorCommandsDir);
|
|
83
|
+
if (stats.isSymbolicLink()) {
|
|
84
|
+
await unlink(editorCommandsDir);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// Ignore errors during cleanup
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=gemini.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/configurators/gemini.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,9 @@ export { CursorConfigurator } from './cursor.js';
|
|
|
8
8
|
export { ClaudeCodeConfigurator } from './claude-code.js';
|
|
9
9
|
export { VSCodeConfigurator } from './vscode.js';
|
|
10
10
|
export { WindsurfConfigurator } from './windsurf.js';
|
|
11
|
+
export { QwenConfigurator } from './qwen.js';
|
|
12
|
+
export { GeminiConfigurator } from './gemini.js';
|
|
13
|
+
export { AntigravityConfigurator } from './antigravity.js';
|
|
11
14
|
export { detectEditors, sortByPreference, formatDetectionSummary, type EditorDetectionResult, } from './detector.js';
|
|
12
15
|
/**
|
|
13
16
|
* Initialize the editor registry with default editors
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/configurators/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,kBAAkB,EAClB,KAAK,eAAe,EACpB,KAAK,gBAAgB,GACtB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/configurators/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,kBAAkB,EAClB,KAAK,eAAe,EACpB,KAAK,gBAAgB,GACtB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAG3D,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,sBAAsB,EACtB,KAAK,qBAAqB,GAC3B,MAAM,eAAe,CAAC;AAYvB;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAQ/C"}
|
|
@@ -11,6 +11,9 @@ export { CursorConfigurator } from './cursor.js';
|
|
|
11
11
|
export { ClaudeCodeConfigurator } from './claude-code.js';
|
|
12
12
|
export { VSCodeConfigurator } from './vscode.js';
|
|
13
13
|
export { WindsurfConfigurator } from './windsurf.js';
|
|
14
|
+
export { QwenConfigurator } from './qwen.js';
|
|
15
|
+
export { GeminiConfigurator } from './gemini.js';
|
|
16
|
+
export { AntigravityConfigurator } from './antigravity.js';
|
|
14
17
|
// Export detection utilities
|
|
15
18
|
export { detectEditors, sortByPreference, formatDetectionSummary, } from './detector.js';
|
|
16
19
|
// Auto-register default editors
|
|
@@ -19,6 +22,9 @@ import { CursorConfigurator } from './cursor.js';
|
|
|
19
22
|
import { ClaudeCodeConfigurator } from './claude-code.js';
|
|
20
23
|
import { VSCodeConfigurator } from './vscode.js';
|
|
21
24
|
import { WindsurfConfigurator } from './windsurf.js';
|
|
25
|
+
import { QwenConfigurator } from './qwen.js';
|
|
26
|
+
import { GeminiConfigurator } from './gemini.js';
|
|
27
|
+
import { AntigravityConfigurator } from './antigravity.js';
|
|
22
28
|
/**
|
|
23
29
|
* Initialize the editor registry with default editors
|
|
24
30
|
* Call this once at startup
|
|
@@ -28,6 +34,9 @@ export function initializeEditorRegistry() {
|
|
|
28
34
|
EditorRegistry.register(new ClaudeCodeConfigurator());
|
|
29
35
|
EditorRegistry.register(new VSCodeConfigurator());
|
|
30
36
|
EditorRegistry.register(new WindsurfConfigurator());
|
|
37
|
+
EditorRegistry.register(new QwenConfigurator());
|
|
38
|
+
EditorRegistry.register(new GeminiConfigurator());
|
|
39
|
+
EditorRegistry.register(new AntigravityConfigurator());
|
|
31
40
|
}
|
|
32
41
|
// Auto-initialize on import
|
|
33
42
|
initializeEditorRegistry();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/configurators/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,kCAAkC;AAClC,OAAO,EACL,kBAAkB,GAGnB,MAAM,WAAW,CAAC;AAEnB,kBAAkB;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,yBAAyB;AACzB,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/configurators/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,kCAAkC;AAClC,OAAO,EACL,kBAAkB,GAGnB,MAAM,WAAW,CAAC;AAEnB,kBAAkB;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,yBAAyB;AACzB,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,6BAA6B;AAC7B,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,sBAAsB,GAEvB,MAAM,eAAe,CAAC;AAEvB,gCAAgC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE3D;;;GAGG;AACH,MAAM,UAAU,wBAAwB;IACtC,cAAc,CAAC,QAAQ,CAAC,IAAI,kBAAkB,EAAE,CAAC,CAAC;IAClD,cAAc,CAAC,QAAQ,CAAC,IAAI,sBAAsB,EAAE,CAAC,CAAC;IACtD,cAAc,CAAC,QAAQ,CAAC,IAAI,kBAAkB,EAAE,CAAC,CAAC;IAClD,cAAc,CAAC,QAAQ,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;IACpD,cAAc,CAAC,QAAQ,CAAC,IAAI,gBAAgB,EAAE,CAAC,CAAC;IAChD,cAAc,CAAC,QAAQ,CAAC,IAAI,kBAAkB,EAAE,CAAC,CAAC;IAClD,cAAc,CAAC,QAAQ,CAAC,IAAI,uBAAuB,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,4BAA4B;AAC5B,wBAAwB,EAAE,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Qwen Code editor configurator
|
|
3
|
+
* Alibaba's AI-powered code editor
|
|
4
|
+
*/
|
|
5
|
+
import { EditorConfigurator, type ConfigureResult, type ConfigureOptions } from './base.js';
|
|
6
|
+
export declare class QwenConfigurator extends EditorConfigurator {
|
|
7
|
+
readonly name = "Qwen Code";
|
|
8
|
+
readonly id = "qwen";
|
|
9
|
+
readonly description = "Alibaba's AI-powered code editor with Qwen integration";
|
|
10
|
+
readonly configDir = ".qwen";
|
|
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
|
+
private discoverCommands;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=qwen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qwen.d.ts","sourceRoot":"","sources":["../../src/configurators/qwen.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,kBAAkB,EAAE,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE5F,qBAAa,gBAAiB,SAAQ,kBAAkB;IACtD,QAAQ,CAAC,IAAI,eAAe;IAC5B,QAAQ,CAAC,EAAE,UAAU;IACrB,QAAQ,CAAC,WAAW,4DAA4D;IAChF,QAAQ,CAAC,SAAS,WAAW;IAC7B,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"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Qwen Code editor configurator
|
|
3
|
+
* Alibaba's AI-powered code editor
|
|
4
|
+
*/
|
|
5
|
+
import { access, mkdir, symlink, unlink, readdir, lstat, readlink } from 'fs/promises';
|
|
6
|
+
import { join } from 'path';
|
|
7
|
+
import { EditorConfigurator } from './base.js';
|
|
8
|
+
export class QwenConfigurator extends EditorConfigurator {
|
|
9
|
+
name = 'Qwen Code';
|
|
10
|
+
id = 'qwen';
|
|
11
|
+
description = "Alibaba's AI-powered code editor with Qwen integration";
|
|
12
|
+
configDir = '.qwen';
|
|
13
|
+
supportsDashPrefix = true;
|
|
14
|
+
async isAvailable(_projectPath) {
|
|
15
|
+
// Qwen Code 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
|
+
// Check if symlink points to correct location
|
|
53
|
+
const target = await readlink(editorCommandsDir);
|
|
54
|
+
if (target !== sourceDir) {
|
|
55
|
+
result.warnings.push(`Existing symlink points to ${target}, not ${sourceDir}`);
|
|
56
|
+
}
|
|
57
|
+
result.filesSkipped.push(editorCommandsDir);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
result.warnings.push(`${editorCommandsDir} exists but is not a symlink`);
|
|
62
|
+
result.filesSkipped.push(editorCommandsDir);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Symlink doesn't exist, create it
|
|
67
|
+
await symlink(sourceDir, editorCommandsDir);
|
|
68
|
+
result.filesModified.push(editorCommandsDir);
|
|
69
|
+
}
|
|
70
|
+
// Create dash-prefixed symlinks for Qwen Code
|
|
71
|
+
const slashCommands = await this.discoverCommands(sourceDir);
|
|
72
|
+
for (const cmd of slashCommands) {
|
|
73
|
+
const dashFile = join(editorCommandsBase, `speclife-${cmd}.md`);
|
|
74
|
+
const targetFile = join('speclife', `${cmd}.md`);
|
|
75
|
+
try {
|
|
76
|
+
await access(dashFile);
|
|
77
|
+
if (force) {
|
|
78
|
+
await unlink(dashFile);
|
|
79
|
+
await symlink(targetFile, dashFile);
|
|
80
|
+
result.filesModified.push(dashFile);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
result.filesSkipped.push(dashFile);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// File doesn't exist, create symlink
|
|
88
|
+
try {
|
|
89
|
+
await symlink(targetFile, dashFile);
|
|
90
|
+
result.filesModified.push(dashFile);
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
result.warnings.push(`Failed to create ${dashFile}: ${err}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
result.success = false;
|
|
100
|
+
result.warnings.push(`Configuration failed: ${err}`);
|
|
101
|
+
}
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
async unconfigure(projectPath) {
|
|
105
|
+
const editorCommandsBase = join(projectPath, this.configDir, 'commands');
|
|
106
|
+
const editorCommandsDir = join(editorCommandsBase, 'speclife');
|
|
107
|
+
try {
|
|
108
|
+
// Remove speclife directory symlink
|
|
109
|
+
const stats = await lstat(editorCommandsDir);
|
|
110
|
+
if (stats.isSymbolicLink()) {
|
|
111
|
+
await unlink(editorCommandsDir);
|
|
112
|
+
}
|
|
113
|
+
// Remove dash-prefixed symlinks
|
|
114
|
+
const files = await readdir(editorCommandsBase);
|
|
115
|
+
for (const file of files) {
|
|
116
|
+
if (file.startsWith('speclife-') && file.endsWith('.md')) {
|
|
117
|
+
const filePath = join(editorCommandsBase, file);
|
|
118
|
+
const fileStats = await lstat(filePath);
|
|
119
|
+
if (fileStats.isSymbolicLink()) {
|
|
120
|
+
await unlink(filePath);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
// Ignore errors during cleanup
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
async discoverCommands(sourceDir) {
|
|
130
|
+
try {
|
|
131
|
+
const files = await readdir(sourceDir);
|
|
132
|
+
return files
|
|
133
|
+
.filter(f => f.endsWith('.md'))
|
|
134
|
+
.map(f => f.replace('.md', ''));
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return [];
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=qwen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qwen.js","sourceRoot":"","sources":["../../src/configurators/qwen.ts"],"names":[],"mappings":"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"}
|