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,82 @@
|
|
|
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
|
+
import { existsSync, readFileSync, writeFileSync } from 'fs';
|
|
10
|
+
import { join } from 'path';
|
|
11
|
+
export const SKILL_METADATA_FILE = '.killer-meta.json';
|
|
12
|
+
/**
|
|
13
|
+
* Read skill metadata from a skill directory
|
|
14
|
+
*/
|
|
15
|
+
export function readSkillMetadata(skillDir) {
|
|
16
|
+
const metadataPath = join(skillDir, SKILL_METADATA_FILE);
|
|
17
|
+
if (!existsSync(metadataPath)) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
const raw = readFileSync(metadataPath, 'utf-8');
|
|
22
|
+
return JSON.parse(raw);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Write skill metadata to a skill directory
|
|
30
|
+
*/
|
|
31
|
+
export function writeSkillMetadata(skillDir, metadata) {
|
|
32
|
+
const metadataPath = join(skillDir, SKILL_METADATA_FILE);
|
|
33
|
+
const payload = {
|
|
34
|
+
...metadata,
|
|
35
|
+
installedAt: metadata.installedAt || new Date().toISOString(),
|
|
36
|
+
};
|
|
37
|
+
writeFileSync(metadataPath, JSON.stringify(payload, null, 2));
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Check if a skill has metadata (indicating it was installed via killer-skills)
|
|
41
|
+
*/
|
|
42
|
+
export function hasSkillMetadata(skillDir) {
|
|
43
|
+
return existsSync(join(skillDir, SKILL_METADATA_FILE));
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Build metadata for a git source
|
|
47
|
+
*/
|
|
48
|
+
export function buildGitMetadata(source, repoUrl, subpath, commitHash) {
|
|
49
|
+
return {
|
|
50
|
+
source,
|
|
51
|
+
sourceType: 'git',
|
|
52
|
+
repoUrl,
|
|
53
|
+
subpath: subpath || '',
|
|
54
|
+
installedAt: new Date().toISOString(),
|
|
55
|
+
commitHash,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Build metadata for a local source
|
|
60
|
+
*/
|
|
61
|
+
export function buildLocalMetadata(source, localPath) {
|
|
62
|
+
return {
|
|
63
|
+
source,
|
|
64
|
+
sourceType: 'local',
|
|
65
|
+
localPath,
|
|
66
|
+
installedAt: new Date().toISOString(),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Build metadata for a registry source
|
|
71
|
+
*/
|
|
72
|
+
export function buildRegistryMetadata(skillName, repoUrl, version) {
|
|
73
|
+
return {
|
|
74
|
+
source: skillName,
|
|
75
|
+
sourceType: 'registry',
|
|
76
|
+
registryName: skillName,
|
|
77
|
+
repoUrl,
|
|
78
|
+
version,
|
|
79
|
+
installedAt: new Date().toISOString(),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=skill-metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-metadata.js","sourceRoot":"","sources":["../../src/utils/skill-metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,CAAC,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;AAyBvD;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IAEzD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,CAAC;QACD,MAAM,GAAG,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAwB,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB,EAAE,QAA6B;IAC9E,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IAEzD,MAAM,OAAO,GAAwB;QACjC,GAAG,QAAQ;QACX,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAChE,CAAC;IAEF,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC7C,OAAO,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC5B,MAAc,EACd,OAAe,EACf,OAAgB,EAChB,UAAmB;IAEnB,OAAO;QACH,MAAM;QACN,UAAU,EAAE,KAAK;QACjB,OAAO;QACP,OAAO,EAAE,OAAO,IAAI,EAAE;QACtB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,UAAU;KACb,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,SAAiB;IAChE,OAAO;QACH,MAAM;QACN,UAAU,EAAE,OAAO;QACnB,SAAS;QACT,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACxC,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACjC,SAAiB,EACjB,OAAe,EACf,OAAgB;IAEhB,OAAO;QACH,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE,UAAU;QACtB,YAAY,EAAE,SAAS;QACvB,OAAO;QACP,OAAO;QACP,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACxC,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skills Discovery and Management Utilities
|
|
3
|
+
*
|
|
4
|
+
* Functions for finding, parsing, and managing installed skills across multiple IDEs.
|
|
5
|
+
*/
|
|
6
|
+
import type { SkillInfo } from './agents-md.js';
|
|
7
|
+
/**
|
|
8
|
+
* Find all installed skills across all search paths for a specific IDE
|
|
9
|
+
*/
|
|
10
|
+
export declare function findAllSkills(targetIDE?: string): SkillInfo[];
|
|
11
|
+
/**
|
|
12
|
+
* Find a specific skill by name
|
|
13
|
+
*/
|
|
14
|
+
export declare function findSkill(skillName: string, targetIDE?: string): SkillInfo | null;
|
|
15
|
+
/**
|
|
16
|
+
* Get the base directory for a skill (for resource resolution)
|
|
17
|
+
*/
|
|
18
|
+
export declare function getSkillBaseDir(skillPath: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Normalize skill names input (handle comma-separated and array inputs)
|
|
21
|
+
*/
|
|
22
|
+
export declare function normalizeSkillNames(input: string[] | string | undefined): string[];
|
|
23
|
+
/**
|
|
24
|
+
* Get skill directories by IDE
|
|
25
|
+
*/
|
|
26
|
+
export declare function getSkillDirectories(ide: string, scope?: 'project' | 'global'): string[];
|
|
27
|
+
//# sourceMappingURL=skills.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/utils/skills.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAqBhD;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,CAmC7D;AAqED;;GAEG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAGjF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAQlF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,EAAE,CAevF"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skills Discovery and Management Utilities
|
|
3
|
+
*
|
|
4
|
+
* Functions for finding, parsing, and managing installed skills across multiple IDEs.
|
|
5
|
+
*/
|
|
6
|
+
import { existsSync, readFileSync, readdirSync, statSync } from 'fs';
|
|
7
|
+
import { join, dirname } from 'path';
|
|
8
|
+
import { IDE_CONFIG, SUPPORTED_IDES } from '../config/ides.js';
|
|
9
|
+
/**
|
|
10
|
+
* YAML frontmatter extraction
|
|
11
|
+
*/
|
|
12
|
+
function extractYamlField(content, field) {
|
|
13
|
+
const frontmatterMatch = content.match(/^---\s*\n([\s\S]*?)\n---/);
|
|
14
|
+
if (!frontmatterMatch)
|
|
15
|
+
return '';
|
|
16
|
+
const frontmatter = frontmatterMatch[1];
|
|
17
|
+
const fieldMatch = frontmatter.match(new RegExp(`^${field}:\\s*(.+)$`, 'm'));
|
|
18
|
+
return fieldMatch ? fieldMatch[1].trim().replace(/^["']|["']$/g, '') : '';
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Check if content has valid YAML frontmatter
|
|
22
|
+
*/
|
|
23
|
+
function hasValidFrontmatter(content) {
|
|
24
|
+
return /^---\s*\n[\s\S]*?\n---/.test(content);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Find all installed skills across all search paths for a specific IDE
|
|
28
|
+
*/
|
|
29
|
+
export function findAllSkills(targetIDE) {
|
|
30
|
+
const skills = [];
|
|
31
|
+
const seenNames = new Set();
|
|
32
|
+
const idesToSearch = targetIDE ? [targetIDE] : SUPPORTED_IDES;
|
|
33
|
+
for (const ide of idesToSearch) {
|
|
34
|
+
const config = IDE_CONFIG[ide];
|
|
35
|
+
if (!config)
|
|
36
|
+
continue;
|
|
37
|
+
// Search project-level skills
|
|
38
|
+
const projectPath = join(process.cwd(), config.paths.project);
|
|
39
|
+
if (existsSync(projectPath)) {
|
|
40
|
+
const projectSkills = findSkillsInDir(projectPath, 'project');
|
|
41
|
+
for (const skill of projectSkills) {
|
|
42
|
+
if (!seenNames.has(skill.name)) {
|
|
43
|
+
seenNames.add(skill.name);
|
|
44
|
+
skills.push(skill);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Search global skills
|
|
49
|
+
if (config.paths.global && existsSync(config.paths.global)) {
|
|
50
|
+
const globalSkills = findSkillsInDir(config.paths.global, 'global');
|
|
51
|
+
for (const skill of globalSkills) {
|
|
52
|
+
if (!seenNames.has(skill.name)) {
|
|
53
|
+
seenNames.add(skill.name);
|
|
54
|
+
skills.push(skill);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return skills;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Find skills in a specific directory
|
|
63
|
+
*/
|
|
64
|
+
function findSkillsInDir(dir, location) {
|
|
65
|
+
const skills = [];
|
|
66
|
+
if (!existsSync(dir))
|
|
67
|
+
return skills;
|
|
68
|
+
try {
|
|
69
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
70
|
+
for (const entry of entries) {
|
|
71
|
+
// Support both directories and symlinks to directories
|
|
72
|
+
if (!isDirectoryOrSymlink(entry, dir))
|
|
73
|
+
continue;
|
|
74
|
+
const skillDir = join(dir, entry.name);
|
|
75
|
+
const skillMdPath = join(skillDir, 'SKILL.md');
|
|
76
|
+
if (existsSync(skillMdPath)) {
|
|
77
|
+
try {
|
|
78
|
+
const content = readFileSync(skillMdPath, 'utf-8');
|
|
79
|
+
if (hasValidFrontmatter(content)) {
|
|
80
|
+
const name = extractYamlField(content, 'name') || entry.name;
|
|
81
|
+
const description = extractYamlField(content, 'description') || '';
|
|
82
|
+
skills.push({
|
|
83
|
+
name,
|
|
84
|
+
description,
|
|
85
|
+
location,
|
|
86
|
+
path: skillMdPath,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// Skip invalid skill files
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// Directory not accessible
|
|
98
|
+
}
|
|
99
|
+
return skills;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Check if entry is a directory or a symlink pointing to a directory
|
|
103
|
+
* This enables local development with symlinks:
|
|
104
|
+
* ln -s ~/dev/my-skill .claude/skills/my-skill
|
|
105
|
+
*/
|
|
106
|
+
function isDirectoryOrSymlink(entry, parentDir) {
|
|
107
|
+
if (entry.isDirectory()) {
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
if (entry.isSymbolicLink()) {
|
|
111
|
+
try {
|
|
112
|
+
// statSync follows symlinks, so it will tell us if target is a directory
|
|
113
|
+
const stats = statSync(join(parentDir, entry.name));
|
|
114
|
+
return stats.isDirectory();
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// Broken symlink or permission error
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Find a specific skill by name
|
|
125
|
+
*/
|
|
126
|
+
export function findSkill(skillName, targetIDE) {
|
|
127
|
+
const skills = findAllSkills(targetIDE);
|
|
128
|
+
return skills.find(s => s.name === skillName) || null;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Get the base directory for a skill (for resource resolution)
|
|
132
|
+
*/
|
|
133
|
+
export function getSkillBaseDir(skillPath) {
|
|
134
|
+
return dirname(skillPath);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Normalize skill names input (handle comma-separated and array inputs)
|
|
138
|
+
*/
|
|
139
|
+
export function normalizeSkillNames(input) {
|
|
140
|
+
if (!input)
|
|
141
|
+
return [];
|
|
142
|
+
if (Array.isArray(input)) {
|
|
143
|
+
return input.flatMap(name => name.split(',')).map(n => n.trim()).filter(Boolean);
|
|
144
|
+
}
|
|
145
|
+
return input.split(',').map(n => n.trim()).filter(Boolean);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Get skill directories by IDE
|
|
149
|
+
*/
|
|
150
|
+
export function getSkillDirectories(ide, scope) {
|
|
151
|
+
const config = IDE_CONFIG[ide];
|
|
152
|
+
if (!config)
|
|
153
|
+
return [];
|
|
154
|
+
const dirs = [];
|
|
155
|
+
if (!scope || scope === 'project') {
|
|
156
|
+
dirs.push(join(process.cwd(), config.paths.project));
|
|
157
|
+
}
|
|
158
|
+
if ((!scope || scope === 'global') && config.paths.global) {
|
|
159
|
+
dirs.push(config.paths.global);
|
|
160
|
+
}
|
|
161
|
+
return dirs;
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/utils/skills.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "killer-skills",
|
|
3
|
+
"version": "1.6.0",
|
|
4
|
+
"description": "Cross-platform CLI tool for installing AI agent skills to multiple IDEs",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"killer-skills": "./dist/index.js",
|
|
9
|
+
"killer": "./dist/index.js",
|
|
10
|
+
"killer-skills-mcp": "./dist/mcp-server.js"
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"dist",
|
|
14
|
+
"README.md",
|
|
15
|
+
"CHANGELOG.md",
|
|
16
|
+
"LICENSE"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc",
|
|
20
|
+
"prepublishOnly": "npm run build && npm test",
|
|
21
|
+
"dev": "tsx src/index.ts",
|
|
22
|
+
"mcp": "tsx src/mcp-server.ts",
|
|
23
|
+
"test": "vitest run",
|
|
24
|
+
"test:watch": "vitest",
|
|
25
|
+
"test:coverage": "vitest run --coverage",
|
|
26
|
+
"lint": "eslint src/"
|
|
27
|
+
},
|
|
28
|
+
"keywords": [
|
|
29
|
+
"skills",
|
|
30
|
+
"ai",
|
|
31
|
+
"claude",
|
|
32
|
+
"cursor",
|
|
33
|
+
"vscode",
|
|
34
|
+
"windsurf",
|
|
35
|
+
"kiro",
|
|
36
|
+
"cli",
|
|
37
|
+
"agent",
|
|
38
|
+
"natural-language",
|
|
39
|
+
"mcp",
|
|
40
|
+
"model-context-protocol",
|
|
41
|
+
"llm",
|
|
42
|
+
"copilot",
|
|
43
|
+
"gemini"
|
|
44
|
+
],
|
|
45
|
+
"author": "Killer-Skills Team",
|
|
46
|
+
"license": "MIT",
|
|
47
|
+
"repository": {
|
|
48
|
+
"type": "git",
|
|
49
|
+
"url": "https://github.com/anthropics/killer-skills.git",
|
|
50
|
+
"directory": "packages/cli"
|
|
51
|
+
},
|
|
52
|
+
"homepage": "https://killer-skills.vercel.app",
|
|
53
|
+
"bugs": {
|
|
54
|
+
"url": "https://github.com/anthropics/killer-skills/issues"
|
|
55
|
+
},
|
|
56
|
+
"dependencies": {
|
|
57
|
+
"@inquirer/prompts": "^7.0.0",
|
|
58
|
+
"@modelcontextprotocol/sdk": "^1.25.3",
|
|
59
|
+
"@types/fs-extra": "^11.0.4",
|
|
60
|
+
"chalk": "^5.3.0",
|
|
61
|
+
"commander": "^12.1.0",
|
|
62
|
+
"fs-extra": "^11.3.3",
|
|
63
|
+
"ora": "^8.0.1",
|
|
64
|
+
"simple-git": "^3.25.0",
|
|
65
|
+
"zod": "^3.25.76"
|
|
66
|
+
},
|
|
67
|
+
"engines": {
|
|
68
|
+
"node": ">=18.0.0"
|
|
69
|
+
},
|
|
70
|
+
"devDependencies": {
|
|
71
|
+
"@types/node": "^20.19.30",
|
|
72
|
+
"@vitest/coverage-v8": "^3.2.4",
|
|
73
|
+
"tsx": "^4.21.0",
|
|
74
|
+
"typescript": "^5.9.3",
|
|
75
|
+
"vitest": "^3.2.4"
|
|
76
|
+
}
|
|
77
|
+
}
|