killer-skills 1.6.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/CHANGELOG.md +156 -0
- package/LICENSE +21 -0
- package/README.md +360 -0
- package/dist/commands/completion.d.ts +8 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +242 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/config.d.ts +24 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +132 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/create.d.ts +9 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +361 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/deps.d.ts +8 -0
- package/dist/commands/deps.d.ts.map +1 -0
- package/dist/commands/deps.js +144 -0
- package/dist/commands/deps.js.map +1 -0
- package/dist/commands/do.d.ts +13 -0
- package/dist/commands/do.d.ts.map +1 -0
- package/dist/commands/do.js +223 -0
- package/dist/commands/do.js.map +1 -0
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +191 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install.d.ts +13 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +234 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/list.d.ts +9 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +103 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/manage.d.ts +9 -0
- package/dist/commands/manage.d.ts.map +1 -0
- package/dist/commands/manage.js +132 -0
- package/dist/commands/manage.js.map +1 -0
- package/dist/commands/outdated.d.ts +9 -0
- package/dist/commands/outdated.d.ts.map +1 -0
- package/dist/commands/outdated.js +168 -0
- package/dist/commands/outdated.js.map +1 -0
- package/dist/commands/plugin.d.ts +8 -0
- package/dist/commands/plugin.d.ts.map +1 -0
- package/dist/commands/plugin.js +98 -0
- package/dist/commands/plugin.js.map +1 -0
- package/dist/commands/publish.d.ts +8 -0
- package/dist/commands/publish.d.ts.map +1 -0
- package/dist/commands/publish.js +199 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/read.d.ts +9 -0
- package/dist/commands/read.d.ts.map +1 -0
- package/dist/commands/read.js +69 -0
- package/dist/commands/read.js.map +1 -0
- package/dist/commands/search.d.ts +8 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +105 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/stats.d.ts +16 -0
- package/dist/commands/stats.d.ts.map +1 -0
- package/dist/commands/stats.js +137 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/submit.d.ts +9 -0
- package/dist/commands/submit.d.ts.map +1 -0
- package/dist/commands/submit.js +245 -0
- package/dist/commands/submit.js.map +1 -0
- package/dist/commands/sync.d.ts +11 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +134 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/update.d.ts +9 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +175 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/config/claude.d.ts +2 -0
- package/dist/config/claude.d.ts.map +1 -0
- package/dist/config/claude.js +19 -0
- package/dist/config/claude.js.map +1 -0
- package/dist/config/cursor.d.ts +2 -0
- package/dist/config/cursor.d.ts.map +1 -0
- package/dist/config/cursor.js +18 -0
- package/dist/config/cursor.js.map +1 -0
- package/dist/config/ides.d.ts +19 -0
- package/dist/config/ides.d.ts.map +1 -0
- package/dist/config/ides.js +221 -0
- package/dist/config/ides.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +57 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server.d.ts +11 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +264 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/registry.d.ts +8 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +34 -0
- package/dist/registry.js.map +1 -0
- package/dist/types.d.ts +78 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/agents-md.d.ts +33 -0
- package/dist/utils/agents-md.d.ts.map +1 -0
- package/dist/utils/agents-md.js +137 -0
- package/dist/utils/agents-md.js.map +1 -0
- package/dist/utils/dependencies.d.ts +49 -0
- package/dist/utils/dependencies.d.ts.map +1 -0
- package/dist/utils/dependencies.js +141 -0
- package/dist/utils/dependencies.js.map +1 -0
- package/dist/utils/github.d.ts +58 -0
- package/dist/utils/github.d.ts.map +1 -0
- package/dist/utils/github.js +198 -0
- package/dist/utils/github.js.map +1 -0
- package/dist/utils/platform.d.ts +54 -0
- package/dist/utils/platform.d.ts.map +1 -0
- package/dist/utils/platform.js +154 -0
- package/dist/utils/platform.js.map +1 -0
- package/dist/utils/plugins.d.ts +50 -0
- package/dist/utils/plugins.d.ts.map +1 -0
- package/dist/utils/plugins.js +115 -0
- package/dist/utils/plugins.js.map +1 -0
- package/dist/utils/prompt-templates.d.ts +47 -0
- package/dist/utils/prompt-templates.d.ts.map +1 -0
- package/dist/utils/prompt-templates.js +160 -0
- package/dist/utils/prompt-templates.js.map +1 -0
- package/dist/utils/skill-metadata.d.ts +55 -0
- package/dist/utils/skill-metadata.d.ts.map +1 -0
- package/dist/utils/skill-metadata.js +82 -0
- package/dist/utils/skill-metadata.js.map +1 -0
- package/dist/utils/skills.d.ts +27 -0
- package/dist/utils/skills.d.ts.map +1 -0
- package/dist/utils/skills.js +163 -0
- package/dist/utils/skills.js.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Platform Detection and Path Utilities
|
|
3
|
+
*
|
|
4
|
+
* Functions for detecting IDEs and creating installation paths.
|
|
5
|
+
* Converted from platform.js to TypeScript.
|
|
6
|
+
*/
|
|
7
|
+
export interface PlatformInfo {
|
|
8
|
+
platform: NodeJS.Platform;
|
|
9
|
+
isWindows: boolean;
|
|
10
|
+
isMac: boolean;
|
|
11
|
+
isLinux: boolean;
|
|
12
|
+
homedir: string;
|
|
13
|
+
cwd: string;
|
|
14
|
+
}
|
|
15
|
+
export interface DetectedIDE {
|
|
16
|
+
ide: string;
|
|
17
|
+
name: string;
|
|
18
|
+
priority: number;
|
|
19
|
+
path: string;
|
|
20
|
+
method?: 'path' | 'env';
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get current platform info
|
|
24
|
+
*/
|
|
25
|
+
export declare function getPlatformInfo(): PlatformInfo;
|
|
26
|
+
/**
|
|
27
|
+
* Detect which IDEs are available in the current project
|
|
28
|
+
*/
|
|
29
|
+
export declare function detectProjectIDEs(projectPath?: string): DetectedIDE[];
|
|
30
|
+
/**
|
|
31
|
+
* Detect which IDEs are installed globally
|
|
32
|
+
*/
|
|
33
|
+
export declare function detectGlobalIDEs(): DetectedIDE[];
|
|
34
|
+
/**
|
|
35
|
+
* Get the best IDE for the current context
|
|
36
|
+
*/
|
|
37
|
+
export declare function getBestIDE(scope?: 'project' | 'global', projectPath?: string): string;
|
|
38
|
+
/**
|
|
39
|
+
* Ensure directory exists
|
|
40
|
+
*/
|
|
41
|
+
export declare function ensureDir(dirPath: string): string;
|
|
42
|
+
/**
|
|
43
|
+
* Normalize path for current platform
|
|
44
|
+
*/
|
|
45
|
+
export declare function normalizePath(inputPath: string): string;
|
|
46
|
+
/**
|
|
47
|
+
* Check if a path is a local path (file or directory)
|
|
48
|
+
*/
|
|
49
|
+
export declare function isLocalPath(source: string): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Expand tilde to home directory
|
|
52
|
+
*/
|
|
53
|
+
export declare function expandTilde(filePath: string): string;
|
|
54
|
+
//# sourceMappingURL=platform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/utils/platform.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,WAAW,YAAY;IACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAS9C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,SAAgB,GAAG,WAAW,EAAE,CAuB5E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,WAAW,EAAE,CAwDhD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,GAAE,SAAS,GAAG,QAAoB,EAAE,WAAW,SAAgB,GAAG,MAAM,CAevG;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKjD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAOnD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKpD"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Platform Detection and Path Utilities
|
|
3
|
+
*
|
|
4
|
+
* Functions for detecting IDEs and creating installation paths.
|
|
5
|
+
* Converted from platform.js to TypeScript.
|
|
6
|
+
*/
|
|
7
|
+
import os from 'os';
|
|
8
|
+
import fs from 'fs';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
import { IDE_CONFIG, SUPPORTED_IDES } from '../config/ides.js';
|
|
11
|
+
/**
|
|
12
|
+
* Get current platform info
|
|
13
|
+
*/
|
|
14
|
+
export function getPlatformInfo() {
|
|
15
|
+
return {
|
|
16
|
+
platform: process.platform,
|
|
17
|
+
isWindows: process.platform === 'win32',
|
|
18
|
+
isMac: process.platform === 'darwin',
|
|
19
|
+
isLinux: process.platform === 'linux',
|
|
20
|
+
homedir: os.homedir(),
|
|
21
|
+
cwd: process.cwd()
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Detect which IDEs are available in the current project
|
|
26
|
+
*/
|
|
27
|
+
export function detectProjectIDEs(projectPath = process.cwd()) {
|
|
28
|
+
const detected = [];
|
|
29
|
+
for (const ideKey of SUPPORTED_IDES) {
|
|
30
|
+
const config = IDE_CONFIG[ideKey];
|
|
31
|
+
if (!config.detectFiles)
|
|
32
|
+
continue;
|
|
33
|
+
for (const detectFile of config.detectFiles) {
|
|
34
|
+
const checkPath = path.join(projectPath, detectFile);
|
|
35
|
+
if (fs.existsSync(checkPath)) {
|
|
36
|
+
detected.push({
|
|
37
|
+
ide: ideKey,
|
|
38
|
+
name: config.name,
|
|
39
|
+
priority: config.priority,
|
|
40
|
+
path: checkPath
|
|
41
|
+
});
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Sort by priority
|
|
47
|
+
return detected.sort((a, b) => a.priority - b.priority);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Detect which IDEs are installed globally
|
|
51
|
+
*/
|
|
52
|
+
export function detectGlobalIDEs() {
|
|
53
|
+
const detected = [];
|
|
54
|
+
const platform = getPlatformInfo();
|
|
55
|
+
for (const ideKey of SUPPORTED_IDES) {
|
|
56
|
+
const config = IDE_CONFIG[ideKey];
|
|
57
|
+
let foundPath = null;
|
|
58
|
+
// Check global path
|
|
59
|
+
if (config.paths?.global && fs.existsSync(config.paths.global)) {
|
|
60
|
+
foundPath = config.paths.global;
|
|
61
|
+
}
|
|
62
|
+
// Check platform-specific paths on Mac
|
|
63
|
+
if (!foundPath && platform.isMac) {
|
|
64
|
+
const macPaths = {
|
|
65
|
+
claude: path.join(platform.homedir, '.claude'),
|
|
66
|
+
antigravity: path.join(platform.homedir, '.gemini/antigravity'),
|
|
67
|
+
cursor: path.join(platform.homedir, '.cursor'),
|
|
68
|
+
vscode: path.join(platform.homedir, '.vscode'),
|
|
69
|
+
windsurf: path.join(platform.homedir, '.windsurf'),
|
|
70
|
+
kiro: path.join(platform.homedir, '.kiro')
|
|
71
|
+
};
|
|
72
|
+
if (macPaths[ideKey] && fs.existsSync(macPaths[ideKey])) {
|
|
73
|
+
foundPath = macPaths[ideKey];
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Check environment variables
|
|
77
|
+
const envVars = {
|
|
78
|
+
vscode: ['VSCODE_GIT_IPC_HANDLE', 'TERM_PROGRAM'],
|
|
79
|
+
cursor: ['CURSOR_TRACE'],
|
|
80
|
+
claude: ['CLAUDE_CODE_ENTRYPOINT']
|
|
81
|
+
};
|
|
82
|
+
if (envVars[ideKey]) {
|
|
83
|
+
for (const envVar of envVars[ideKey]) {
|
|
84
|
+
if (process.env[envVar]) {
|
|
85
|
+
foundPath = foundPath || 'runtime-detected';
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (foundPath) {
|
|
91
|
+
detected.push({
|
|
92
|
+
ide: ideKey,
|
|
93
|
+
name: config.name,
|
|
94
|
+
priority: config.priority,
|
|
95
|
+
path: foundPath,
|
|
96
|
+
method: foundPath === 'runtime-detected' ? 'env' : 'path'
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return detected.sort((a, b) => a.priority - b.priority);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get the best IDE for the current context
|
|
104
|
+
*/
|
|
105
|
+
export function getBestIDE(scope = 'project', projectPath = process.cwd()) {
|
|
106
|
+
if (scope === 'project') {
|
|
107
|
+
const projectIDEs = detectProjectIDEs(projectPath);
|
|
108
|
+
if (projectIDEs.length > 0) {
|
|
109
|
+
return projectIDEs[0].ide;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
const globalIDEs = detectGlobalIDEs();
|
|
113
|
+
if (globalIDEs.length > 0) {
|
|
114
|
+
return globalIDEs[0].ide;
|
|
115
|
+
}
|
|
116
|
+
// Default to Claude Code if nothing detected
|
|
117
|
+
return 'claude';
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Ensure directory exists
|
|
121
|
+
*/
|
|
122
|
+
export function ensureDir(dirPath) {
|
|
123
|
+
if (!fs.existsSync(dirPath)) {
|
|
124
|
+
fs.mkdirSync(dirPath, { recursive: true });
|
|
125
|
+
}
|
|
126
|
+
return dirPath;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Normalize path for current platform
|
|
130
|
+
*/
|
|
131
|
+
export function normalizePath(inputPath) {
|
|
132
|
+
return path.normalize(inputPath);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Check if a path is a local path (file or directory)
|
|
136
|
+
*/
|
|
137
|
+
export function isLocalPath(source) {
|
|
138
|
+
// Starts with /, ./, ../, or ~
|
|
139
|
+
return source.startsWith('/') ||
|
|
140
|
+
source.startsWith('./') ||
|
|
141
|
+
source.startsWith('../') ||
|
|
142
|
+
source.startsWith('~') ||
|
|
143
|
+
fs.existsSync(source);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Expand tilde to home directory
|
|
147
|
+
*/
|
|
148
|
+
export function expandTilde(filePath) {
|
|
149
|
+
if (filePath.startsWith('~')) {
|
|
150
|
+
return path.join(os.homedir(), filePath.slice(1));
|
|
151
|
+
}
|
|
152
|
+
return filePath;
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=platform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/utils/platform.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAmB/D;;GAEG;AACH,MAAM,UAAU,eAAe;IAC3B,OAAO;QACH,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,SAAS,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;QACvC,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,QAAQ;QACpC,OAAO,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;QACrC,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE;QACrB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;KACrB,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE;IACzD,MAAM,QAAQ,GAAkB,EAAE,CAAC;IAEnC,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,WAAW;YAAE,SAAS;QAElC,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;YACrD,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC3B,QAAQ,CAAC,IAAI,CAAC;oBACV,GAAG,EAAE,MAAM;oBACX,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,IAAI,EAAE,SAAS;iBAClB,CAAC,CAAC;gBACH,MAAM;YACV,CAAC;QACL,CAAC;IACL,CAAC;IAED,mBAAmB;IACnB,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC5B,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IAEnC,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAClC,IAAI,SAAS,GAAkB,IAAI,CAAC;QAEpC,oBAAoB;QACpB,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7D,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;QACpC,CAAC;QAED,uCAAuC;QACvC,IAAI,CAAC,SAAS,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAA2B;gBACrC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;gBAC9C,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;gBAC/D,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;gBAC9C,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;gBAC9C,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;gBAClD,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;aAC7C,CAAC;YACF,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;gBACtD,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;YACjC,CAAC;QACL,CAAC;QAED,8BAA8B;QAC9B,MAAM,OAAO,GAA6B;YACtC,MAAM,EAAE,CAAC,uBAAuB,EAAE,cAAc,CAAC;YACjD,MAAM,EAAE,CAAC,cAAc,CAAC;YACxB,MAAM,EAAE,CAAC,wBAAwB,CAAC;SACrC,CAAC;QAEF,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClB,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnC,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;oBACtB,SAAS,GAAG,SAAS,IAAI,kBAAkB,CAAC;oBAC5C,MAAM;gBACV,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAI,SAAS,EAAE,CAAC;YACZ,QAAQ,CAAC,IAAI,CAAC;gBACV,GAAG,EAAE,MAAM;gBACX,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,SAAS,KAAK,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;aAC5D,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,QAA8B,SAAS,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE;IAC3F,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACtB,MAAM,WAAW,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAC9B,CAAC;IACL,CAAC;IAED,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;IACtC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC7B,CAAC;IAED,6CAA6C;IAC7C,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,OAAe;IACrC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,OAAO,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,SAAiB;IAC3C,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc;IACtC,+BAA+B;IAC/B,OAAO,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;QACzB,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;QACvB,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC;QACxB,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;QACtB,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB;IACxC,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,QAAQ,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin System
|
|
3
|
+
*
|
|
4
|
+
* Enables third-party extensions for the CLI.
|
|
5
|
+
* Plugins can add new commands, IDE adapters, or post-install hooks.
|
|
6
|
+
*/
|
|
7
|
+
export interface Plugin {
|
|
8
|
+
name: string;
|
|
9
|
+
version: string;
|
|
10
|
+
description: string;
|
|
11
|
+
type: PluginType;
|
|
12
|
+
entryPoint: string;
|
|
13
|
+
config?: Record<string, unknown>;
|
|
14
|
+
}
|
|
15
|
+
export type PluginType = 'command' | 'ide-adapter' | 'hook';
|
|
16
|
+
export interface PluginManifest {
|
|
17
|
+
name: string;
|
|
18
|
+
version: string;
|
|
19
|
+
description: string;
|
|
20
|
+
type: PluginType;
|
|
21
|
+
main: string;
|
|
22
|
+
config?: Record<string, unknown>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Load all installed plugins
|
|
26
|
+
*/
|
|
27
|
+
export declare function loadPlugins(): Promise<Plugin[]>;
|
|
28
|
+
/**
|
|
29
|
+
* Install a plugin from a path or URL
|
|
30
|
+
*/
|
|
31
|
+
export declare function installPlugin(source: string): Promise<{
|
|
32
|
+
success: boolean;
|
|
33
|
+
message: string;
|
|
34
|
+
}>;
|
|
35
|
+
/**
|
|
36
|
+
* Uninstall a plugin
|
|
37
|
+
*/
|
|
38
|
+
export declare function uninstallPlugin(name: string): Promise<{
|
|
39
|
+
success: boolean;
|
|
40
|
+
message: string;
|
|
41
|
+
}>;
|
|
42
|
+
/**
|
|
43
|
+
* Get plugin by name
|
|
44
|
+
*/
|
|
45
|
+
export declare function getPlugin(name: string): Promise<Plugin | null>;
|
|
46
|
+
/**
|
|
47
|
+
* Execute plugin hooks
|
|
48
|
+
*/
|
|
49
|
+
export declare function executeHooks(hookName: string, context: Record<string, unknown>): Promise<void>;
|
|
50
|
+
//# sourceMappingURL=plugins.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../../src/utils/plugins.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,MAAM,WAAW,MAAM;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,MAAM,CAAC;AAE5D,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAiCrD;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CA4BlG;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAalG;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAGpE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAepG"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin System
|
|
3
|
+
*
|
|
4
|
+
* Enables third-party extensions for the CLI.
|
|
5
|
+
* Plugins can add new commands, IDE adapters, or post-install hooks.
|
|
6
|
+
*/
|
|
7
|
+
import fs from 'fs-extra';
|
|
8
|
+
import path from 'path';
|
|
9
|
+
import os from 'os';
|
|
10
|
+
const PLUGINS_DIR = path.join(os.homedir(), '.killer-skills', 'plugins');
|
|
11
|
+
/**
|
|
12
|
+
* Load all installed plugins
|
|
13
|
+
*/
|
|
14
|
+
export async function loadPlugins() {
|
|
15
|
+
const plugins = [];
|
|
16
|
+
try {
|
|
17
|
+
await fs.ensureDir(PLUGINS_DIR);
|
|
18
|
+
const entries = await fs.readdir(PLUGINS_DIR, { withFileTypes: true });
|
|
19
|
+
for (const entry of entries) {
|
|
20
|
+
if (entry.isDirectory()) {
|
|
21
|
+
const manifestPath = path.join(PLUGINS_DIR, entry.name, 'plugin.json');
|
|
22
|
+
if (await fs.pathExists(manifestPath)) {
|
|
23
|
+
try {
|
|
24
|
+
const manifest = await fs.readJson(manifestPath);
|
|
25
|
+
plugins.push({
|
|
26
|
+
name: manifest.name,
|
|
27
|
+
version: manifest.version,
|
|
28
|
+
description: manifest.description,
|
|
29
|
+
type: manifest.type,
|
|
30
|
+
entryPoint: path.join(PLUGINS_DIR, entry.name, manifest.main),
|
|
31
|
+
config: manifest.config
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// Invalid plugin, skip
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// Plugins dir doesn't exist, that's fine
|
|
43
|
+
}
|
|
44
|
+
return plugins;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Install a plugin from a path or URL
|
|
48
|
+
*/
|
|
49
|
+
export async function installPlugin(source) {
|
|
50
|
+
try {
|
|
51
|
+
await fs.ensureDir(PLUGINS_DIR);
|
|
52
|
+
// Local path
|
|
53
|
+
if (await fs.pathExists(source)) {
|
|
54
|
+
const manifestPath = path.join(source, 'plugin.json');
|
|
55
|
+
if (!await fs.pathExists(manifestPath)) {
|
|
56
|
+
return { success: false, message: 'Invalid plugin: missing plugin.json' };
|
|
57
|
+
}
|
|
58
|
+
const manifest = await fs.readJson(manifestPath);
|
|
59
|
+
const pluginDir = path.join(PLUGINS_DIR, manifest.name);
|
|
60
|
+
await fs.copy(source, pluginDir);
|
|
61
|
+
return { success: true, message: `Plugin "${manifest.name}" installed` };
|
|
62
|
+
}
|
|
63
|
+
// npm package (future)
|
|
64
|
+
if (source.startsWith('npm:')) {
|
|
65
|
+
return { success: false, message: 'npm plugins not yet supported' };
|
|
66
|
+
}
|
|
67
|
+
return { success: false, message: `Source not found: ${source}` };
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
return { success: false, message: error.message };
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Uninstall a plugin
|
|
75
|
+
*/
|
|
76
|
+
export async function uninstallPlugin(name) {
|
|
77
|
+
try {
|
|
78
|
+
const pluginDir = path.join(PLUGINS_DIR, name);
|
|
79
|
+
if (!await fs.pathExists(pluginDir)) {
|
|
80
|
+
return { success: false, message: `Plugin not found: ${name}` };
|
|
81
|
+
}
|
|
82
|
+
await fs.remove(pluginDir);
|
|
83
|
+
return { success: true, message: `Plugin "${name}" uninstalled` };
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
return { success: false, message: error.message };
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Get plugin by name
|
|
91
|
+
*/
|
|
92
|
+
export async function getPlugin(name) {
|
|
93
|
+
const plugins = await loadPlugins();
|
|
94
|
+
return plugins.find(p => p.name === name) || null;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Execute plugin hooks
|
|
98
|
+
*/
|
|
99
|
+
export async function executeHooks(hookName, context) {
|
|
100
|
+
const plugins = await loadPlugins();
|
|
101
|
+
const hookPlugins = plugins.filter(p => p.type === 'hook');
|
|
102
|
+
for (const plugin of hookPlugins) {
|
|
103
|
+
try {
|
|
104
|
+
// Dynamic import of hook
|
|
105
|
+
const hook = await import(plugin.entryPoint);
|
|
106
|
+
if (typeof hook[hookName] === 'function') {
|
|
107
|
+
await hook[hookName](context);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// Hook failed, continue
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=plugins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugins.js","sourceRoot":"","sources":["../../src/utils/plugins.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt Templates
|
|
3
|
+
*
|
|
4
|
+
* IDE-specific prompt templates for the sync command.
|
|
5
|
+
* Each IDE may have different preferred formats for skill discovery.
|
|
6
|
+
*/
|
|
7
|
+
import type { SkillInfo } from './agents-md.js';
|
|
8
|
+
/**
|
|
9
|
+
* Template format types
|
|
10
|
+
*/
|
|
11
|
+
export type PromptFormat = 'xml' | 'markdown' | 'yaml' | 'json';
|
|
12
|
+
/**
|
|
13
|
+
* Template configuration for each IDE
|
|
14
|
+
*/
|
|
15
|
+
export interface PromptTemplate {
|
|
16
|
+
format: PromptFormat;
|
|
17
|
+
generate: (skills: SkillInfo[]) => string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Default XML template (OpenSkills-compatible)
|
|
21
|
+
*/
|
|
22
|
+
export declare function generateXmlPrompt(skills: SkillInfo[]): string;
|
|
23
|
+
/**
|
|
24
|
+
* Markdown template (simpler format)
|
|
25
|
+
*/
|
|
26
|
+
export declare function generateMarkdownPrompt(skills: SkillInfo[]): string;
|
|
27
|
+
/**
|
|
28
|
+
* Cursor-optimized template
|
|
29
|
+
*/
|
|
30
|
+
export declare function generateCursorPrompt(skills: SkillInfo[]): string;
|
|
31
|
+
/**
|
|
32
|
+
* Windsurf-optimized template
|
|
33
|
+
*/
|
|
34
|
+
export declare function generateWindsurfPrompt(skills: SkillInfo[]): string;
|
|
35
|
+
/**
|
|
36
|
+
* Template registry
|
|
37
|
+
*/
|
|
38
|
+
export declare const PROMPT_TEMPLATES: Record<string, PromptTemplate>;
|
|
39
|
+
/**
|
|
40
|
+
* Get the appropriate template for an IDE
|
|
41
|
+
*/
|
|
42
|
+
export declare function getTemplateForIDE(ide: string): PromptTemplate;
|
|
43
|
+
/**
|
|
44
|
+
* Generate prompt for skills using IDE-specific template
|
|
45
|
+
*/
|
|
46
|
+
export declare function generatePromptForIDE(ide: string, skills: SkillInfo[]): string;
|
|
47
|
+
//# sourceMappingURL=prompt-templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-templates.d.ts","sourceRoot":"","sources":["../../src/utils/prompt-templates.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC;AAEhE;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,MAAM,CAAC;CAC7C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAoC7D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAsBlE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAqBhE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAoBlE;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAoC3D,CAAC;AAEF;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAE7D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAG7E"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt Templates
|
|
3
|
+
*
|
|
4
|
+
* IDE-specific prompt templates for the sync command.
|
|
5
|
+
* Each IDE may have different preferred formats for skill discovery.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Default XML template (OpenSkills-compatible)
|
|
9
|
+
*/
|
|
10
|
+
export function generateXmlPrompt(skills) {
|
|
11
|
+
const skillTags = skills.map(s => `<skill>
|
|
12
|
+
<name>${s.name}</name>
|
|
13
|
+
<description>${s.description || 'No description'}</description>
|
|
14
|
+
<location>${s.location}</location>
|
|
15
|
+
</skill>`).join('\n\n');
|
|
16
|
+
return `<skills_system priority="1">
|
|
17
|
+
|
|
18
|
+
## Available Skills
|
|
19
|
+
|
|
20
|
+
<!-- SKILLS_TABLE_START -->
|
|
21
|
+
<usage>
|
|
22
|
+
When users ask you to perform tasks, check if any of the available skills below can help complete the task more effectively. Skills provide specialized capabilities and domain knowledge.
|
|
23
|
+
|
|
24
|
+
How to use skills:
|
|
25
|
+
- Invoke: \`killer read <skill-name>\` (run in your shell)
|
|
26
|
+
- For multiple: \`killer read skill-one,skill-two\`
|
|
27
|
+
- The skill content will load with detailed instructions on how to complete the task
|
|
28
|
+
- Base directory provided in output for resolving bundled resources (references/, scripts/, assets/)
|
|
29
|
+
|
|
30
|
+
Usage notes:
|
|
31
|
+
- Only use skills listed in <available_skills> below
|
|
32
|
+
- Do not invoke a skill that is already loaded in your context
|
|
33
|
+
- Each skill invocation is stateless
|
|
34
|
+
</usage>
|
|
35
|
+
|
|
36
|
+
<available_skills>
|
|
37
|
+
|
|
38
|
+
${skillTags}
|
|
39
|
+
|
|
40
|
+
</available_skills>
|
|
41
|
+
<!-- SKILLS_TABLE_END -->
|
|
42
|
+
|
|
43
|
+
</skills_system>
|
|
44
|
+
`;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Markdown template (simpler format)
|
|
48
|
+
*/
|
|
49
|
+
export function generateMarkdownPrompt(skills) {
|
|
50
|
+
const skillList = skills.map(s => `- **${s.name}** (${s.location}): ${s.description || 'No description'}`).join('\n');
|
|
51
|
+
return `## Available Skills
|
|
52
|
+
|
|
53
|
+
The following skills are installed and can be invoked to help with specialized tasks.
|
|
54
|
+
|
|
55
|
+
### Skills List
|
|
56
|
+
|
|
57
|
+
${skillList}
|
|
58
|
+
|
|
59
|
+
### How to Use
|
|
60
|
+
|
|
61
|
+
To use a skill, run: \`killer read <skill-name>\`
|
|
62
|
+
|
|
63
|
+
For multiple skills: \`killer read skill-one,skill-two\`
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
`;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Cursor-optimized template
|
|
71
|
+
*/
|
|
72
|
+
export function generateCursorPrompt(skills) {
|
|
73
|
+
const skillList = skills.map(s => ` - ${s.name}: ${s.description || 'No description'}`).join('\n');
|
|
74
|
+
return `# Cursor Rules - Skills Integration
|
|
75
|
+
|
|
76
|
+
## Available Skills
|
|
77
|
+
|
|
78
|
+
${skillList}
|
|
79
|
+
|
|
80
|
+
## Skill Usage
|
|
81
|
+
|
|
82
|
+
When a task matches a skill's capability:
|
|
83
|
+
1. Run \`killer read <skill-name>\` in the terminal
|
|
84
|
+
2. Follow the skill's instructions
|
|
85
|
+
3. Skills provide specialized knowledge and tools
|
|
86
|
+
|
|
87
|
+
## Active Skills Count: ${skills.length}
|
|
88
|
+
|
|
89
|
+
`;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Windsurf-optimized template
|
|
93
|
+
*/
|
|
94
|
+
export function generateWindsurfPrompt(skills) {
|
|
95
|
+
const skillList = skills.map(s => `| ${s.name} | ${s.description ? s.description.slice(0, 50) + '...' : 'No description'} | ${s.location} |`).join('\n');
|
|
96
|
+
return `# Windsurf Rules - Skills
|
|
97
|
+
|
|
98
|
+
## Skills System
|
|
99
|
+
|
|
100
|
+
| Skill | Description | Location |
|
|
101
|
+
|-------|-------------|----------|
|
|
102
|
+
${skillList}
|
|
103
|
+
|
|
104
|
+
### Usage
|
|
105
|
+
|
|
106
|
+
Invoke skills with: \`killer read <skill-name>\`
|
|
107
|
+
|
|
108
|
+
Skills provide specialized capabilities for common development tasks.
|
|
109
|
+
|
|
110
|
+
`;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Template registry
|
|
114
|
+
*/
|
|
115
|
+
export const PROMPT_TEMPLATES = {
|
|
116
|
+
// Default XML (OpenSkills-compatible)
|
|
117
|
+
default: {
|
|
118
|
+
format: 'xml',
|
|
119
|
+
generate: generateXmlPrompt
|
|
120
|
+
},
|
|
121
|
+
// Claude-specific (uses XML)
|
|
122
|
+
claude: {
|
|
123
|
+
format: 'xml',
|
|
124
|
+
generate: generateXmlPrompt
|
|
125
|
+
},
|
|
126
|
+
// Antigravity (uses XML)
|
|
127
|
+
antigravity: {
|
|
128
|
+
format: 'xml',
|
|
129
|
+
generate: generateXmlPrompt
|
|
130
|
+
},
|
|
131
|
+
// Cursor (markdown-based rules)
|
|
132
|
+
cursor: {
|
|
133
|
+
format: 'markdown',
|
|
134
|
+
generate: generateCursorPrompt
|
|
135
|
+
},
|
|
136
|
+
// Windsurf (markdown-based rules)
|
|
137
|
+
windsurf: {
|
|
138
|
+
format: 'markdown',
|
|
139
|
+
generate: generateWindsurfPrompt
|
|
140
|
+
},
|
|
141
|
+
// Generic markdown
|
|
142
|
+
markdown: {
|
|
143
|
+
format: 'markdown',
|
|
144
|
+
generate: generateMarkdownPrompt
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
/**
|
|
148
|
+
* Get the appropriate template for an IDE
|
|
149
|
+
*/
|
|
150
|
+
export function getTemplateForIDE(ide) {
|
|
151
|
+
return PROMPT_TEMPLATES[ide] || PROMPT_TEMPLATES.default;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Generate prompt for skills using IDE-specific template
|
|
155
|
+
*/
|
|
156
|
+
export function generatePromptForIDE(ide, skills) {
|
|
157
|
+
const template = getTemplateForIDE(ide);
|
|
158
|
+
return template.generate(skills);
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=prompt-templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-templates.js","sourceRoot":"","sources":["../../src/utils/prompt-templates.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiBH;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAmB;IACjD,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9B,CAAC,CAAC,IAAI;eACC,CAAC,CAAC,WAAW,IAAI,gBAAgB;YACpC,CAAC,CAAC,QAAQ;SACb,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEpB,OAAO;;;;;;;;;;;;;;;;;;;;;;EAsBT,SAAS;;;;;;CAMV,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAmB;IACtD,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAC7B,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,WAAW,IAAI,gBAAgB,EAAE,CAC1E,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,OAAO;;;;;;EAMT,SAAS;;;;;;;;;;CAUV,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAmB;IACpD,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAC7B,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,WAAW,IAAI,gBAAgB,EAAE,CACxD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,OAAO;;;;EAIT,SAAS;;;;;;;;;0BASe,MAAM,CAAC,MAAM;;CAEtC,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAmB;IACtD,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAC7B,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,gBAAgB,MAAM,CAAC,CAAC,QAAQ,IAAI,CAC7G,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,OAAO;;;;;;EAMT,SAAS;;;;;;;;CAQV,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAmC;IAC5D,sCAAsC;IACtC,OAAO,EAAE;QACL,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,iBAAiB;KAC9B;IAED,6BAA6B;IAC7B,MAAM,EAAE;QACJ,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,iBAAiB;KAC9B;IAED,yBAAyB;IACzB,WAAW,EAAE;QACT,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,iBAAiB;KAC9B;IAED,gCAAgC;IAChC,MAAM,EAAE;QACJ,MAAM,EAAE,UAAU;QAClB,QAAQ,EAAE,oBAAoB;KACjC;IAED,kCAAkC;IAClC,QAAQ,EAAE;QACN,MAAM,EAAE,UAAU;QAClB,QAAQ,EAAE,sBAAsB;KACnC;IAED,mBAAmB;IACnB,QAAQ,EAAE;QACN,MAAM,EAAE,UAAU;QAClB,QAAQ,EAAE,sBAAsB;KACnC;CACJ,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAW;IACzC,OAAO,gBAAgB,CAAC,GAAG,CAAC,IAAI,gBAAgB,CAAC,OAAO,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAW,EAAE,MAAmB;IACjE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACxC,OAAO,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Metadata Management
|
|
3
|
+
*
|
|
4
|
+
* Tracks installation source for each skill, enabling:
|
|
5
|
+
* - One-command updates via `killer update`
|
|
6
|
+
* - Version tracking and change detection
|
|
7
|
+
* - Source transparency for users
|
|
8
|
+
*/
|
|
9
|
+
export declare const SKILL_METADATA_FILE = ".killer-meta.json";
|
|
10
|
+
export type SkillSourceType = 'git' | 'local' | 'registry';
|
|
11
|
+
export interface SkillSourceMetadata {
|
|
12
|
+
/** Original source input (e.g., "anthropics/skills", "./my-skill") */
|
|
13
|
+
source: string;
|
|
14
|
+
/** Type of source */
|
|
15
|
+
sourceType: SkillSourceType;
|
|
16
|
+
/** Full repository URL for git sources */
|
|
17
|
+
repoUrl?: string;
|
|
18
|
+
/** Subpath within the repository */
|
|
19
|
+
subpath?: string;
|
|
20
|
+
/** Local filesystem path for local sources */
|
|
21
|
+
localPath?: string;
|
|
22
|
+
/** Registry skill name for registry sources */
|
|
23
|
+
registryName?: string;
|
|
24
|
+
/** ISO timestamp of installation */
|
|
25
|
+
installedAt: string;
|
|
26
|
+
/** Semantic version if available */
|
|
27
|
+
version?: string;
|
|
28
|
+
/** Git commit hash for precise tracking */
|
|
29
|
+
commitHash?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Read skill metadata from a skill directory
|
|
33
|
+
*/
|
|
34
|
+
export declare function readSkillMetadata(skillDir: string): SkillSourceMetadata | null;
|
|
35
|
+
/**
|
|
36
|
+
* Write skill metadata to a skill directory
|
|
37
|
+
*/
|
|
38
|
+
export declare function writeSkillMetadata(skillDir: string, metadata: SkillSourceMetadata): void;
|
|
39
|
+
/**
|
|
40
|
+
* Check if a skill has metadata (indicating it was installed via killer-skills)
|
|
41
|
+
*/
|
|
42
|
+
export declare function hasSkillMetadata(skillDir: string): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Build metadata for a git source
|
|
45
|
+
*/
|
|
46
|
+
export declare function buildGitMetadata(source: string, repoUrl: string, subpath?: string, commitHash?: string): SkillSourceMetadata;
|
|
47
|
+
/**
|
|
48
|
+
* Build metadata for a local source
|
|
49
|
+
*/
|
|
50
|
+
export declare function buildLocalMetadata(source: string, localPath: string): SkillSourceMetadata;
|
|
51
|
+
/**
|
|
52
|
+
* Build metadata for a registry source
|
|
53
|
+
*/
|
|
54
|
+
export declare function buildRegistryMetadata(skillName: string, repoUrl: string, version?: string): SkillSourceMetadata;
|
|
55
|
+
//# sourceMappingURL=skill-metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-metadata.d.ts","sourceRoot":"","sources":["../../src/utils/skill-metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,eAAO,MAAM,mBAAmB,sBAAsB,CAAC;AAEvD,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,OAAO,GAAG,UAAU,CAAC;AAE3D,MAAM,WAAW,mBAAmB;IAChC,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,UAAU,EAAE,eAAe,CAAC;IAC5B,0CAA0C;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAa9E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CASxF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC5B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,MAAM,GACpB,mBAAmB,CASrB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,mBAAmB,CAOzF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACjC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACjB,mBAAmB,CASrB"}
|