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.
Files changed (136) hide show
  1. package/CHANGELOG.md +156 -0
  2. package/LICENSE +21 -0
  3. package/README.md +360 -0
  4. package/dist/commands/completion.d.ts +8 -0
  5. package/dist/commands/completion.d.ts.map +1 -0
  6. package/dist/commands/completion.js +242 -0
  7. package/dist/commands/completion.js.map +1 -0
  8. package/dist/commands/config.d.ts +24 -0
  9. package/dist/commands/config.d.ts.map +1 -0
  10. package/dist/commands/config.js +132 -0
  11. package/dist/commands/config.js.map +1 -0
  12. package/dist/commands/create.d.ts +9 -0
  13. package/dist/commands/create.d.ts.map +1 -0
  14. package/dist/commands/create.js +361 -0
  15. package/dist/commands/create.js.map +1 -0
  16. package/dist/commands/deps.d.ts +8 -0
  17. package/dist/commands/deps.d.ts.map +1 -0
  18. package/dist/commands/deps.js +144 -0
  19. package/dist/commands/deps.js.map +1 -0
  20. package/dist/commands/do.d.ts +13 -0
  21. package/dist/commands/do.d.ts.map +1 -0
  22. package/dist/commands/do.js +223 -0
  23. package/dist/commands/do.js.map +1 -0
  24. package/dist/commands/init.d.ts +8 -0
  25. package/dist/commands/init.d.ts.map +1 -0
  26. package/dist/commands/init.js +191 -0
  27. package/dist/commands/init.js.map +1 -0
  28. package/dist/commands/install.d.ts +13 -0
  29. package/dist/commands/install.d.ts.map +1 -0
  30. package/dist/commands/install.js +234 -0
  31. package/dist/commands/install.js.map +1 -0
  32. package/dist/commands/list.d.ts +9 -0
  33. package/dist/commands/list.d.ts.map +1 -0
  34. package/dist/commands/list.js +103 -0
  35. package/dist/commands/list.js.map +1 -0
  36. package/dist/commands/manage.d.ts +9 -0
  37. package/dist/commands/manage.d.ts.map +1 -0
  38. package/dist/commands/manage.js +132 -0
  39. package/dist/commands/manage.js.map +1 -0
  40. package/dist/commands/outdated.d.ts +9 -0
  41. package/dist/commands/outdated.d.ts.map +1 -0
  42. package/dist/commands/outdated.js +168 -0
  43. package/dist/commands/outdated.js.map +1 -0
  44. package/dist/commands/plugin.d.ts +8 -0
  45. package/dist/commands/plugin.d.ts.map +1 -0
  46. package/dist/commands/plugin.js +98 -0
  47. package/dist/commands/plugin.js.map +1 -0
  48. package/dist/commands/publish.d.ts +8 -0
  49. package/dist/commands/publish.d.ts.map +1 -0
  50. package/dist/commands/publish.js +199 -0
  51. package/dist/commands/publish.js.map +1 -0
  52. package/dist/commands/read.d.ts +9 -0
  53. package/dist/commands/read.d.ts.map +1 -0
  54. package/dist/commands/read.js +69 -0
  55. package/dist/commands/read.js.map +1 -0
  56. package/dist/commands/search.d.ts +8 -0
  57. package/dist/commands/search.d.ts.map +1 -0
  58. package/dist/commands/search.js +105 -0
  59. package/dist/commands/search.js.map +1 -0
  60. package/dist/commands/stats.d.ts +16 -0
  61. package/dist/commands/stats.d.ts.map +1 -0
  62. package/dist/commands/stats.js +137 -0
  63. package/dist/commands/stats.js.map +1 -0
  64. package/dist/commands/submit.d.ts +9 -0
  65. package/dist/commands/submit.d.ts.map +1 -0
  66. package/dist/commands/submit.js +245 -0
  67. package/dist/commands/submit.js.map +1 -0
  68. package/dist/commands/sync.d.ts +11 -0
  69. package/dist/commands/sync.d.ts.map +1 -0
  70. package/dist/commands/sync.js +134 -0
  71. package/dist/commands/sync.js.map +1 -0
  72. package/dist/commands/update.d.ts +9 -0
  73. package/dist/commands/update.d.ts.map +1 -0
  74. package/dist/commands/update.js +175 -0
  75. package/dist/commands/update.js.map +1 -0
  76. package/dist/config/claude.d.ts +2 -0
  77. package/dist/config/claude.d.ts.map +1 -0
  78. package/dist/config/claude.js +19 -0
  79. package/dist/config/claude.js.map +1 -0
  80. package/dist/config/cursor.d.ts +2 -0
  81. package/dist/config/cursor.d.ts.map +1 -0
  82. package/dist/config/cursor.js +18 -0
  83. package/dist/config/cursor.js.map +1 -0
  84. package/dist/config/ides.d.ts +19 -0
  85. package/dist/config/ides.d.ts.map +1 -0
  86. package/dist/config/ides.js +221 -0
  87. package/dist/config/ides.js.map +1 -0
  88. package/dist/index.d.ts +3 -0
  89. package/dist/index.d.ts.map +1 -0
  90. package/dist/index.js +57 -0
  91. package/dist/index.js.map +1 -0
  92. package/dist/mcp-server.d.ts +11 -0
  93. package/dist/mcp-server.d.ts.map +1 -0
  94. package/dist/mcp-server.js +264 -0
  95. package/dist/mcp-server.js.map +1 -0
  96. package/dist/registry.d.ts +8 -0
  97. package/dist/registry.d.ts.map +1 -0
  98. package/dist/registry.js +34 -0
  99. package/dist/registry.js.map +1 -0
  100. package/dist/types.d.ts +78 -0
  101. package/dist/types.d.ts.map +1 -0
  102. package/dist/types.js +7 -0
  103. package/dist/types.js.map +1 -0
  104. package/dist/utils/agents-md.d.ts +33 -0
  105. package/dist/utils/agents-md.d.ts.map +1 -0
  106. package/dist/utils/agents-md.js +137 -0
  107. package/dist/utils/agents-md.js.map +1 -0
  108. package/dist/utils/dependencies.d.ts +49 -0
  109. package/dist/utils/dependencies.d.ts.map +1 -0
  110. package/dist/utils/dependencies.js +141 -0
  111. package/dist/utils/dependencies.js.map +1 -0
  112. package/dist/utils/github.d.ts +58 -0
  113. package/dist/utils/github.d.ts.map +1 -0
  114. package/dist/utils/github.js +198 -0
  115. package/dist/utils/github.js.map +1 -0
  116. package/dist/utils/platform.d.ts +54 -0
  117. package/dist/utils/platform.d.ts.map +1 -0
  118. package/dist/utils/platform.js +154 -0
  119. package/dist/utils/platform.js.map +1 -0
  120. package/dist/utils/plugins.d.ts +50 -0
  121. package/dist/utils/plugins.d.ts.map +1 -0
  122. package/dist/utils/plugins.js +115 -0
  123. package/dist/utils/plugins.js.map +1 -0
  124. package/dist/utils/prompt-templates.d.ts +47 -0
  125. package/dist/utils/prompt-templates.d.ts.map +1 -0
  126. package/dist/utils/prompt-templates.js +160 -0
  127. package/dist/utils/prompt-templates.js.map +1 -0
  128. package/dist/utils/skill-metadata.d.ts +55 -0
  129. package/dist/utils/skill-metadata.d.ts.map +1 -0
  130. package/dist/utils/skill-metadata.js +82 -0
  131. package/dist/utils/skill-metadata.js.map +1 -0
  132. package/dist/utils/skills.d.ts +27 -0
  133. package/dist/utils/skills.d.ts.map +1 -0
  134. package/dist/utils/skills.js +163 -0
  135. package/dist/utils/skills.js.map +1 -0
  136. package/package.json +77 -0
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Sync Command
3
+ *
4
+ * Synchronizes installed skills to a markdown file (AGENTS.md, CLAUDE.md, etc.)
5
+ * by generating standardized prompts that AI agents can understand.
6
+ *
7
+ * Uses IDE-specific templates for optimal compatibility.
8
+ */
9
+ import { Command } from 'commander';
10
+ import { existsSync, readFileSync, writeFileSync } from 'fs';
11
+ import chalk from 'chalk';
12
+ import ora from 'ora';
13
+ import { findAllSkills } from '../utils/skills.js';
14
+ import { replaceSkillsSection, removeSkillsSection, ensureMarkdownFile } from '../utils/agents-md.js';
15
+ import { IDE_CONFIG } from '../config/ides.js';
16
+ import { generatePromptForIDE } from '../utils/prompt-templates.js';
17
+ // IDE-specific output file configurations
18
+ const IDE_OUTPUT_FILES = {
19
+ antigravity: 'AGENTS.md',
20
+ claude: 'CLAUDE.md',
21
+ cursor: '.cursorrules',
22
+ windsurf: '.windsurfrules',
23
+ aider: 'AGENTS.md',
24
+ codex: 'AGENTS.md',
25
+ default: 'AGENTS.md',
26
+ };
27
+ export const syncCommand = new Command('sync')
28
+ .description('Sync installed skills to AGENTS.md (makes skills discoverable by AI)')
29
+ .option('-i, --ide <ide>', 'Target IDE for sync')
30
+ .option('-o, --output <path>', 'Output file path (default: auto-detect based on IDE)')
31
+ .option('-y, --yes', 'Skip interactive prompts, sync all skills')
32
+ .option('--remove', 'Remove skills section from output file')
33
+ .action(async (options) => {
34
+ const spinner = ora();
35
+ try {
36
+ // Determine target IDE
37
+ const targetIDE = options.ide || detectIDE();
38
+ const ideConfig = IDE_CONFIG[targetIDE];
39
+ if (!ideConfig) {
40
+ console.error(chalk.red(`Unknown IDE: ${targetIDE}`));
41
+ process.exit(1);
42
+ }
43
+ // Determine output file
44
+ const outputPath = options.output || IDE_OUTPUT_FILES[targetIDE] || IDE_OUTPUT_FILES.default;
45
+ console.log(chalk.dim(`Target IDE: ${ideConfig.name}`));
46
+ console.log(chalk.dim(`Output file: ${outputPath}`));
47
+ console.log('');
48
+ // Handle remove option
49
+ if (options.remove) {
50
+ if (!existsSync(outputPath)) {
51
+ console.log(chalk.yellow(`File not found: ${outputPath}`));
52
+ return;
53
+ }
54
+ spinner.start('Removing skills section...');
55
+ const content = readFileSync(outputPath, 'utf-8');
56
+ const updated = removeSkillsSection(content);
57
+ writeFileSync(outputPath, updated);
58
+ spinner.succeed(chalk.green(`Removed skills section from ${outputPath}`));
59
+ return;
60
+ }
61
+ // Find installed skills
62
+ spinner.start('Finding installed skills...');
63
+ const skills = findAllSkills(targetIDE);
64
+ spinner.succeed(`Found ${chalk.cyan(skills.length)} skill(s)`);
65
+ if (skills.length === 0) {
66
+ console.log(chalk.yellow('\nNo skills installed.'));
67
+ console.log(chalk.dim('Install skills first:'));
68
+ console.log(chalk.cyan(' killer install <skill-name>'));
69
+ console.log(chalk.cyan(' killer install owner/repo'));
70
+ return;
71
+ }
72
+ // Display skills to be synced
73
+ console.log(chalk.dim('\nSkills to sync:'));
74
+ skills.forEach(skill => {
75
+ const locationBadge = skill.location === 'project'
76
+ ? chalk.blue('(project)')
77
+ : chalk.dim('(global)');
78
+ console.log(` ${chalk.cyan('•')} ${skill.name} ${locationBadge}`);
79
+ });
80
+ console.log('');
81
+ // Ensure output file exists
82
+ spinner.start(`Writing to ${outputPath}...`);
83
+ ensureMarkdownFile(outputPath);
84
+ // Generate IDE-specific prompt
85
+ const prompt = generatePromptForIDE(targetIDE, skills);
86
+ const content = readFileSync(outputPath, 'utf-8');
87
+ const updated = replaceSkillsSection(content, prompt);
88
+ writeFileSync(outputPath, updated);
89
+ // Check if we updated existing or added new
90
+ const hadMarkers = content.includes('<skills_system') ||
91
+ content.includes('<!-- SKILLS_TABLE_START -->');
92
+ if (hadMarkers) {
93
+ spinner.succeed(chalk.green(`Synced ${skills.length} skill(s) to ${outputPath}`));
94
+ }
95
+ else {
96
+ spinner.succeed(chalk.green(`Added skills section to ${outputPath} (${skills.length} skill(s))`));
97
+ }
98
+ // Print usage tips
99
+ console.log(chalk.dim('\n💡 Tips:'));
100
+ console.log(chalk.dim(` • AI agents can now discover and use your skills`));
101
+ console.log(chalk.dim(` • Use 'killer read <skill>' to load skill content`));
102
+ console.log(chalk.dim(` • Run 'killer sync' again after installing new skills`));
103
+ }
104
+ catch (error) {
105
+ spinner.fail(chalk.red('Sync failed'));
106
+ console.error(error);
107
+ process.exit(1);
108
+ }
109
+ });
110
+ /**
111
+ * Detect the current IDE based on project files
112
+ */
113
+ function detectIDE() {
114
+ const cwd = process.cwd();
115
+ // Check for IDE-specific files
116
+ const detectionOrder = [
117
+ { ide: 'cursor', files: ['.cursor'] },
118
+ { ide: 'windsurf', files: ['.windsurf', '.windsurfrules'] },
119
+ { ide: 'claude', files: ['.claude', 'CLAUDE.md'] },
120
+ { ide: 'antigravity', files: ['.agent', '.gemini'] },
121
+ { ide: 'aider', files: ['.aider'] },
122
+ { ide: 'vscode', files: ['.vscode'] },
123
+ ];
124
+ for (const { ide, files } of detectionOrder) {
125
+ for (const file of files) {
126
+ if (existsSync(`${cwd}/${file}`)) {
127
+ return ide;
128
+ }
129
+ }
130
+ }
131
+ // Default to antigravity (AGENTS.md format)
132
+ return 'antigravity';
133
+ }
134
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC7D,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EACH,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AASpE,0CAA0C;AAC1C,MAAM,gBAAgB,GAA2B;IAC7C,WAAW,EAAE,WAAW;IACxB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,cAAc;IACtB,QAAQ,EAAE,gBAAgB;IAC1B,KAAK,EAAE,WAAW;IAClB,KAAK,EAAE,WAAW;IAClB,OAAO,EAAE,WAAW;CACvB,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KACzC,WAAW,CAAC,sEAAsE,CAAC;KACnF,MAAM,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;KAChD,MAAM,CAAC,qBAAqB,EAAE,sDAAsD,CAAC;KACrF,MAAM,CAAC,WAAW,EAAE,2CAA2C,CAAC;KAChE,MAAM,CAAC,UAAU,EAAE,wCAAwC,CAAC;KAC5D,MAAM,CAAC,KAAK,EAAE,OAAoB,EAAE,EAAE;IACnC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;IAEtB,IAAI,CAAC;QACD,uBAAuB;QACvB,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,IAAI,SAAS,EAAE,CAAC;QAC7C,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QAExC,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,SAAS,EAAE,CAAC,CAAC,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;QAED,wBAAwB;QACxB,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,IAAI,gBAAgB,CAAC,SAAS,CAAC,IAAI,gBAAgB,CAAC,OAAO,CAAC;QAE7F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,UAAU,EAAE,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,uBAAuB;QACvB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAC,CAAC;gBAC3D,OAAO;YACX,CAAC;YAED,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAC5C,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAClD,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;YAC7C,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACnC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,+BAA+B,UAAU,EAAE,CAAC,CAAC,CAAC;YAC1E,OAAO;QACX,CAAC;QAED,wBAAwB;QACxB,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;QACxC,OAAO,CAAC,OAAO,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAE/D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC;YACvD,OAAO;QACX,CAAC;QAED,8BAA8B;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACnB,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ,KAAK,SAAS;gBAC9C,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;gBACzB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,aAAa,EAAE,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,4BAA4B;QAC5B,OAAO,CAAC,KAAK,CAAC,cAAc,UAAU,KAAK,CAAC,CAAC;QAC7C,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAE/B,+BAA+B;QAC/B,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,oBAAoB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAEtD,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAEnC,4CAA4C;QAC5C,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YACjD,OAAO,CAAC,QAAQ,CAAC,6BAA6B,CAAC,CAAC;QAEpD,IAAI,UAAU,EAAE,CAAC;YACb,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,MAAM,CAAC,MAAM,gBAAgB,UAAU,EAAE,CAAC,CAAC,CAAC;QACtF,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,2BAA2B,UAAU,KAAK,MAAM,CAAC,MAAM,YAAY,CAAC,CAAC,CAAC;QACtG,CAAC;QAED,mBAAmB;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC,CAAC;QAC/E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC,CAAC;IAEvF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;QACvC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC,CAAC,CAAC;AAEP;;GAEG;AACH,SAAS,SAAS;IACd,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,+BAA+B;IAC/B,MAAM,cAAc,GAAG;QACnB,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE;QACrC,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,WAAW,EAAE,gBAAgB,CAAC,EAAE;QAC3D,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE;QAClD,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE;QACpD,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE;QACnC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE;KACxC,CAAC;IAEF,KAAK,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,cAAc,EAAE,CAAC;QAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,IAAI,UAAU,CAAC,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;gBAC/B,OAAO,GAAG,CAAC;YACf,CAAC;QACL,CAAC;IACL,CAAC;IAED,4CAA4C;IAC5C,OAAO,aAAa,CAAC;AACzB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Update Command
3
+ *
4
+ * Updates installed skills from their recorded source metadata.
5
+ * Supports git repositories and local sources.
6
+ */
7
+ import { Command } from 'commander';
8
+ export declare const updateCommand: Command;
9
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,eAAO,MAAM,aAAa,SA8JpB,CAAC"}
@@ -0,0 +1,175 @@
1
+ /**
2
+ * Update Command
3
+ *
4
+ * Updates installed skills from their recorded source metadata.
5
+ * Supports git repositories and local sources.
6
+ */
7
+ import { Command } from 'commander';
8
+ import { existsSync, cpSync, rmSync, mkdirSync } from 'fs';
9
+ import { join, dirname, resolve, sep } from 'path';
10
+ import { homedir } from 'os';
11
+ import { execSync } from 'child_process';
12
+ import chalk from 'chalk';
13
+ import ora from 'ora';
14
+ import { findAllSkills, normalizeSkillNames, getSkillBaseDir } from '../utils/skills.js';
15
+ import { readSkillMetadata, writeSkillMetadata } from '../utils/skill-metadata.js';
16
+ export const updateCommand = new Command('update')
17
+ .argument('[skill-names...]', 'Skill name(s) to update (default: all)')
18
+ .description('Update installed skills from their source')
19
+ .option('--force', 'Force update even if no changes detected')
20
+ .action(async (skillNamesArg, options) => {
21
+ const requested = normalizeSkillNames(skillNamesArg);
22
+ const allSkills = findAllSkills();
23
+ if (allSkills.length === 0) {
24
+ console.log(chalk.yellow('No skills installed.'));
25
+ console.log('');
26
+ console.log('Install skills:');
27
+ console.log(chalk.cyan(' killer install <skill-name>'));
28
+ console.log(chalk.cyan(' killer install owner/repo'));
29
+ return;
30
+ }
31
+ // Filter to requested skills, or all if none specified
32
+ let targets = allSkills;
33
+ if (requested.length > 0) {
34
+ const requestedSet = new Set(requested);
35
+ targets = allSkills.filter(skill => requestedSet.has(skill.name));
36
+ const missing = requested.filter(name => !allSkills.some(s => s.name === name));
37
+ if (missing.length > 0) {
38
+ console.log(chalk.yellow(`Skipping unknown skills: ${missing.join(', ')}`));
39
+ }
40
+ }
41
+ if (targets.length === 0) {
42
+ console.log(chalk.yellow('No matching skills to update.'));
43
+ return;
44
+ }
45
+ console.log(chalk.dim(`Updating ${targets.length} skill(s)...`));
46
+ console.log('');
47
+ let updated = 0;
48
+ let skipped = 0;
49
+ const issues = [];
50
+ for (const skill of targets) {
51
+ const skillDir = getSkillBaseDir(skill.path);
52
+ const metadata = readSkillMetadata(skillDir);
53
+ if (!metadata) {
54
+ console.log(chalk.yellow(`⏭ ${skill.name} - no metadata (re-install to enable updates)`));
55
+ issues.push({ name: skill.name, reason: 'no metadata' });
56
+ skipped++;
57
+ continue;
58
+ }
59
+ const spinner = ora(`Updating ${skill.name}...`).start();
60
+ try {
61
+ if (metadata.sourceType === 'local') {
62
+ // Update from local source
63
+ const localPath = metadata.localPath;
64
+ if (!localPath || !existsSync(localPath)) {
65
+ spinner.fail(`${skill.name} - local source missing`);
66
+ issues.push({ name: skill.name, reason: 'local source missing' });
67
+ skipped++;
68
+ continue;
69
+ }
70
+ if (!existsSync(join(localPath, 'SKILL.md'))) {
71
+ spinner.fail(`${skill.name} - SKILL.md missing at local source`);
72
+ issues.push({ name: skill.name, reason: 'SKILL.md missing' });
73
+ skipped++;
74
+ continue;
75
+ }
76
+ updateSkillFromDir(skillDir, localPath);
77
+ writeSkillMetadata(skillDir, {
78
+ ...metadata,
79
+ installedAt: new Date().toISOString()
80
+ });
81
+ spinner.succeed(chalk.green(`${skill.name} - updated from local`));
82
+ updated++;
83
+ continue;
84
+ }
85
+ if (metadata.sourceType === 'git' || metadata.sourceType === 'registry') {
86
+ const repoUrl = metadata.repoUrl;
87
+ if (!repoUrl) {
88
+ spinner.fail(`${skill.name} - missing repo URL`);
89
+ issues.push({ name: skill.name, reason: 'missing repo URL' });
90
+ skipped++;
91
+ continue;
92
+ }
93
+ // Clone to temp directory
94
+ const tempDir = join(homedir(), `.killer-temp-${Date.now()}`);
95
+ mkdirSync(tempDir, { recursive: true });
96
+ try {
97
+ execSync(`git clone --depth 1 --quiet "${repoUrl}" "${tempDir}/repo"`, {
98
+ stdio: 'pipe',
99
+ });
100
+ const repoDir = join(tempDir, 'repo');
101
+ const subpath = metadata.subpath && metadata.subpath !== '.'
102
+ ? metadata.subpath
103
+ : '';
104
+ const sourceDir = subpath ? join(repoDir, subpath) : repoDir;
105
+ if (!existsSync(join(sourceDir, 'SKILL.md'))) {
106
+ spinner.fail(`${skill.name} - SKILL.md not found in repo`);
107
+ issues.push({ name: skill.name, reason: 'SKILL.md not in repo' });
108
+ skipped++;
109
+ continue;
110
+ }
111
+ updateSkillFromDir(skillDir, sourceDir);
112
+ writeSkillMetadata(skillDir, {
113
+ ...metadata,
114
+ installedAt: new Date().toISOString(),
115
+ });
116
+ spinner.succeed(chalk.green(`${skill.name} - updated from git`));
117
+ updated++;
118
+ }
119
+ finally {
120
+ rmSync(tempDir, { recursive: true, force: true });
121
+ }
122
+ continue;
123
+ }
124
+ spinner.warn(`${skill.name} - unknown source type`);
125
+ issues.push({ name: skill.name, reason: 'unknown source type' });
126
+ skipped++;
127
+ }
128
+ catch (error) {
129
+ const errorMsg = error instanceof Error ? error.message : String(error);
130
+ spinner.fail(`${skill.name} - ${errorMsg}`);
131
+ issues.push({ name: skill.name, reason: errorMsg });
132
+ skipped++;
133
+ }
134
+ }
135
+ // Summary
136
+ console.log('');
137
+ console.log(chalk.dim('─'.repeat(50)));
138
+ console.log(`${chalk.green('✅ Updated:')} ${updated}`);
139
+ console.log(`${chalk.yellow('⏭ Skipped:')} ${skipped}`);
140
+ if (issues.length > 0 && issues.length <= 5) {
141
+ console.log('');
142
+ console.log(chalk.dim('Issues:'));
143
+ for (const { name, reason } of issues) {
144
+ console.log(chalk.dim(` • ${name}: ${reason}`));
145
+ }
146
+ }
147
+ if (updated > 0) {
148
+ console.log('');
149
+ console.log(chalk.dim('💡 Run `killer sync` to update AGENTS.md'));
150
+ }
151
+ });
152
+ /**
153
+ * Update skill directory from source directory
154
+ */
155
+ function updateSkillFromDir(targetPath, sourceDir) {
156
+ const targetDir = dirname(targetPath);
157
+ mkdirSync(targetDir, { recursive: true });
158
+ // Security check
159
+ if (!isPathInside(targetPath, targetDir)) {
160
+ throw new Error('Security error: path outside target directory');
161
+ }
162
+ // Remove old and copy new
163
+ rmSync(targetPath, { recursive: true, force: true });
164
+ cpSync(sourceDir, targetPath, { recursive: true, dereference: true });
165
+ }
166
+ /**
167
+ * Check if path is inside directory
168
+ */
169
+ function isPathInside(targetPath, targetDir) {
170
+ const resolvedPath = resolve(targetPath);
171
+ const resolvedDir = resolve(targetDir);
172
+ const dirWithSep = resolvedDir.endsWith(sep) ? resolvedDir : resolvedDir + sep;
173
+ return resolvedPath.startsWith(dirWithSep);
174
+ }
175
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function addToClaudeConfig(skillName: string, command: string): Promise<void>;
2
+ //# sourceMappingURL=claude.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/config/claude.ts"],"names":[],"mappings":"AAiBA,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBzF"}
@@ -0,0 +1,19 @@
1
+ // src/config/claude.ts
2
+ import fs from 'fs-extra';
3
+ import path from 'path';
4
+ import os from 'os';
5
+ const CLAUDE_CONFIG_PATH = path.join(os.homedir(), 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json');
6
+ export async function addToClaudeConfig(skillName, command) {
7
+ let config = { mcpServers: {} };
8
+ if (await fs.pathExists(CLAUDE_CONFIG_PATH)) {
9
+ const content = await fs.readFile(CLAUDE_CONFIG_PATH, 'utf-8');
10
+ config = JSON.parse(content);
11
+ }
12
+ if (!config.mcpServers) {
13
+ config.mcpServers = {};
14
+ }
15
+ config.mcpServers[skillName] = { command, args: [] };
16
+ await fs.ensureDir(path.dirname(CLAUDE_CONFIG_PATH));
17
+ await fs.writeFile(CLAUDE_CONFIG_PATH, JSON.stringify(config, null, 2));
18
+ }
19
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/config/claude.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAChC,EAAE,CAAC,OAAO,EAAE,EACZ,SAAS,EACT,qBAAqB,EACrB,QAAQ,EACR,4BAA4B,CAC/B,CAAC;AAMF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,SAAiB,EAAE,OAAe;IACtE,IAAI,MAAM,GAAc,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IAE3C,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;QAC/D,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAc,CAAC;IAC9C,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACrB,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC;IAC3B,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAErD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACrD,MAAM,EAAE,CAAC,SAAS,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function addToCursorConfig(skillName: string, command: string): Promise<void>;
2
+ //# sourceMappingURL=cursor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/config/cursor.ts"],"names":[],"mappings":"AAUA,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBzF"}
@@ -0,0 +1,18 @@
1
+ // src/config/cursor.ts
2
+ import fs from 'fs-extra';
3
+ import path from 'path';
4
+ const CURSOR_CONFIG_PATH = path.join(process.env.HOME || '~', '.cursor', 'mcp.json');
5
+ export async function addToCursorConfig(skillName, command) {
6
+ let config = { mcpServers: {} };
7
+ if (await fs.pathExists(CURSOR_CONFIG_PATH)) {
8
+ const content = await fs.readFile(CURSOR_CONFIG_PATH, 'utf-8');
9
+ config = JSON.parse(content);
10
+ }
11
+ if (!config.mcpServers) {
12
+ config.mcpServers = {};
13
+ }
14
+ config.mcpServers[skillName] = { command, args: [] };
15
+ await fs.ensureDir(path.dirname(CURSOR_CONFIG_PATH));
16
+ await fs.writeFile(CURSOR_CONFIG_PATH, JSON.stringify(config, null, 2));
17
+ }
18
+ //# sourceMappingURL=cursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/config/cursor.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AAMrF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,SAAiB,EAAE,OAAe;IACtE,IAAI,MAAM,GAAc,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IAE3C,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;QAC/D,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAc,CAAC;IAC9C,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACrB,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC;IAC3B,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAErD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACrD,MAAM,EAAE,CAAC,SAAS,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,19 @@
1
+ export interface IDEConfig {
2
+ name: string;
3
+ format: 'SKILL.md' | 'instructions.md' | 'rules.md' | 'agent.json' | 'mcp.json';
4
+ paths: {
5
+ global: string | null;
6
+ project: string;
7
+ };
8
+ mcpConfigPath?: string;
9
+ detectFiles: string[];
10
+ priority: number;
11
+ requiresConversion?: boolean;
12
+ category: 'editor' | 'cli' | 'agent' | 'extension';
13
+ }
14
+ export declare const IDE_CONFIG: Record<string, IDEConfig>;
15
+ export declare const SUPPORTED_IDES: string[];
16
+ export declare const SUPPORTED_IDE_COUNT: number;
17
+ export declare function getIDEsByCategory(category: IDEConfig['category']): string[];
18
+ export declare function getInstallPath(ide: string, scope: 'project' | 'global', skillName: string, cwd?: string): string;
19
+ //# sourceMappingURL=ides.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ides.d.ts","sourceRoot":"","sources":["../../src/config/ides.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,SAAS;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,GAAG,iBAAiB,GAAG,UAAU,GAAG,YAAY,GAAG,UAAU,CAAC;IAChF,KAAK,EAAE;QACH,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,OAAO,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,EAAE,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,WAAW,CAAC;CACtD;AAED,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAyMhD,CAAC;AAEF,eAAO,MAAM,cAAc,UAA0B,CAAC;AACtD,eAAO,MAAM,mBAAmB,QAAwB,CAAC;AAGzD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,SAAS,CAAC,UAAU,CAAC,GAAG,MAAM,EAAE,CAE3E;AAGD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAQhH"}
@@ -0,0 +1,221 @@
1
+ // src/config/ides.ts
2
+ // Complete configuration for all 17+ supported AI coding tools
3
+ import path from 'path';
4
+ import os from 'os';
5
+ const homedir = os.homedir();
6
+ export const IDE_CONFIG = {
7
+ // === EDITORS ===
8
+ cursor: {
9
+ name: 'Cursor',
10
+ format: 'SKILL.md',
11
+ paths: {
12
+ global: path.join(homedir, '.cursor', 'skills'),
13
+ project: '.cursor/skills'
14
+ },
15
+ mcpConfigPath: path.join(homedir, '.cursor', 'mcp.json'),
16
+ detectFiles: ['.cursor'],
17
+ priority: 1,
18
+ category: 'editor'
19
+ },
20
+ windsurf: {
21
+ name: 'Windsurf',
22
+ format: 'rules.md',
23
+ paths: {
24
+ global: null,
25
+ project: '.windsurf/rules'
26
+ },
27
+ detectFiles: ['.windsurf', '.windsurfrules'],
28
+ priority: 2,
29
+ requiresConversion: true,
30
+ category: 'editor'
31
+ },
32
+ vscode: {
33
+ name: 'VS Code + Copilot',
34
+ format: 'instructions.md',
35
+ paths: {
36
+ global: null,
37
+ project: '.github/instructions'
38
+ },
39
+ detectFiles: ['.vscode', '.github'],
40
+ priority: 3,
41
+ requiresConversion: true,
42
+ category: 'editor'
43
+ },
44
+ trae: {
45
+ name: 'Trae',
46
+ format: 'SKILL.md',
47
+ paths: {
48
+ global: path.join(homedir, '.trae', 'skills'),
49
+ project: '.trae/skills'
50
+ },
51
+ detectFiles: ['.trae'],
52
+ priority: 4,
53
+ category: 'editor'
54
+ },
55
+ // === CLI AGENTS ===
56
+ claude: {
57
+ name: 'Claude Code',
58
+ format: 'SKILL.md',
59
+ paths: {
60
+ global: path.join(homedir, '.claude', 'skills'),
61
+ project: '.claude/skills'
62
+ },
63
+ mcpConfigPath: path.join(homedir, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json'),
64
+ detectFiles: ['.claude'],
65
+ priority: 5,
66
+ category: 'cli'
67
+ },
68
+ antigravity: {
69
+ name: 'Antigravity (Gemini)',
70
+ format: 'SKILL.md',
71
+ paths: {
72
+ global: path.join(homedir, '.gemini', 'antigravity', 'skills'),
73
+ project: '.agent/skills'
74
+ },
75
+ detectFiles: ['.agent', '.gemini'],
76
+ priority: 6,
77
+ category: 'cli'
78
+ },
79
+ aider: {
80
+ name: 'Aider',
81
+ format: 'SKILL.md',
82
+ paths: {
83
+ global: path.join(homedir, '.aider', 'skills'),
84
+ project: '.aider/skills'
85
+ },
86
+ detectFiles: ['.aider'],
87
+ priority: 7,
88
+ category: 'cli'
89
+ },
90
+ codex: {
91
+ name: 'OpenAI Codex CLI',
92
+ format: 'SKILL.md',
93
+ paths: {
94
+ global: path.join(homedir, '.codex', 'skills'),
95
+ project: '.codex/skills'
96
+ },
97
+ detectFiles: ['.codex'],
98
+ priority: 8,
99
+ category: 'cli'
100
+ },
101
+ // === AGENTS ===
102
+ goose: {
103
+ name: 'Goose (Block)',
104
+ format: 'SKILL.md',
105
+ paths: {
106
+ global: path.join(homedir, '.goose', 'skills'),
107
+ project: '.goose/skills'
108
+ },
109
+ detectFiles: ['.goose'],
110
+ priority: 9,
111
+ category: 'agent'
112
+ },
113
+ cline: {
114
+ name: 'Cline',
115
+ format: 'SKILL.md',
116
+ paths: {
117
+ global: path.join(homedir, '.cline', 'skills'),
118
+ project: '.cline/skills'
119
+ },
120
+ detectFiles: ['.cline'],
121
+ priority: 10,
122
+ category: 'agent'
123
+ },
124
+ roo: {
125
+ name: 'Roo Cline',
126
+ format: 'SKILL.md',
127
+ paths: {
128
+ global: path.join(homedir, '.roo', 'skills'),
129
+ project: '.roo/skills'
130
+ },
131
+ detectFiles: ['.roo'],
132
+ priority: 11,
133
+ category: 'agent'
134
+ },
135
+ kiro: {
136
+ name: 'Kiro (AWS)',
137
+ format: 'agent.json',
138
+ paths: {
139
+ global: path.join(homedir, '.kiro', 'agents'),
140
+ project: '.kiro/agents'
141
+ },
142
+ detectFiles: ['.kiro'],
143
+ priority: 12,
144
+ requiresConversion: true,
145
+ category: 'agent'
146
+ },
147
+ augment: {
148
+ name: 'Augment Code',
149
+ format: 'SKILL.md',
150
+ paths: {
151
+ global: path.join(homedir, '.augment', 'skills'),
152
+ project: '.augment/skills'
153
+ },
154
+ detectFiles: ['.augment'],
155
+ priority: 13,
156
+ category: 'agent'
157
+ },
158
+ // === VS CODE EXTENSIONS ===
159
+ continue: {
160
+ name: 'Continue',
161
+ format: 'SKILL.md',
162
+ paths: {
163
+ global: path.join(homedir, '.continue', 'skills'),
164
+ project: '.continue/skills'
165
+ },
166
+ detectFiles: ['.continue'],
167
+ priority: 14,
168
+ category: 'extension'
169
+ },
170
+ copilot: {
171
+ name: 'GitHub Copilot',
172
+ format: 'instructions.md',
173
+ paths: {
174
+ global: null,
175
+ project: '.github/copilot-instructions.md'
176
+ },
177
+ detectFiles: ['.github'],
178
+ priority: 15,
179
+ requiresConversion: true,
180
+ category: 'extension'
181
+ },
182
+ cody: {
183
+ name: 'Sourcegraph Cody',
184
+ format: 'SKILL.md',
185
+ paths: {
186
+ global: path.join(homedir, '.cody', 'skills'),
187
+ project: '.cody/skills'
188
+ },
189
+ detectFiles: ['.cody'],
190
+ priority: 16,
191
+ category: 'extension'
192
+ },
193
+ amazonq: {
194
+ name: 'Amazon Q Developer',
195
+ format: 'SKILL.md',
196
+ paths: {
197
+ global: path.join(homedir, '.amazonq', 'skills'),
198
+ project: '.amazonq/skills'
199
+ },
200
+ detectFiles: ['.amazonq'],
201
+ priority: 17,
202
+ category: 'extension'
203
+ }
204
+ };
205
+ export const SUPPORTED_IDES = Object.keys(IDE_CONFIG);
206
+ export const SUPPORTED_IDE_COUNT = SUPPORTED_IDES.length;
207
+ // Get IDEs by category
208
+ export function getIDEsByCategory(category) {
209
+ return SUPPORTED_IDES.filter(key => IDE_CONFIG[key].category === category);
210
+ }
211
+ // Get IDE install path
212
+ export function getInstallPath(ide, scope, skillName, cwd) {
213
+ const config = IDE_CONFIG[ide];
214
+ if (!config)
215
+ throw new Error(`Unknown IDE: ${ide}`);
216
+ if (scope === 'global' && config.paths.global) {
217
+ return path.join(config.paths.global, skillName);
218
+ }
219
+ return path.join(cwd || process.cwd(), config.paths.project, skillName);
220
+ }
221
+ //# sourceMappingURL=ides.js.map