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,105 @@
1
+ /**
2
+ * Search Command
3
+ *
4
+ * Search for skills on GitHub and the registry.
5
+ */
6
+ import { Command } from 'commander';
7
+ import chalk from 'chalk';
8
+ import ora from 'ora';
9
+ import { searchSkillsOnGitHub } from '../utils/github.js';
10
+ import { searchSkills as searchRegistry } from '../registry.js';
11
+ export const searchCommand = new Command('search')
12
+ .argument('<query>', 'Search query')
13
+ .description('Search for skills on GitHub and registry')
14
+ .option('-s, --source <source>', 'Search source: all, github, registry', 'all')
15
+ .option('-l, --limit <number>', 'Maximum results per source', '10')
16
+ .action(async (query, options) => {
17
+ const spinner = ora(`Searching for "${query}"...`).start();
18
+ try {
19
+ const results = [];
20
+ const limit = parseInt(options.limit) || 10;
21
+ // Search registry
22
+ if (options.source === 'all' || options.source === 'registry') {
23
+ spinner.text = 'Searching registry...';
24
+ const registryResults = await searchRegistry(query);
25
+ for (const skill of registryResults.slice(0, limit)) {
26
+ results.push({
27
+ name: skill.name,
28
+ description: skill.description || 'No description',
29
+ source: 'registry',
30
+ repo: skill.repo
31
+ });
32
+ }
33
+ }
34
+ // Search GitHub
35
+ if (options.source === 'all' || options.source === 'github') {
36
+ spinner.text = 'Searching GitHub...';
37
+ const githubResults = await searchSkillsOnGitHub(query, limit);
38
+ for (const item of githubResults) {
39
+ if (item.repository) {
40
+ // Avoid duplicates
41
+ const repoName = item.repository.full_name || '';
42
+ if (!results.some(r => r.repo === repoName)) {
43
+ results.push({
44
+ name: repoName.split('/').pop() || repoName,
45
+ description: item.repository.description || 'No description',
46
+ source: 'github',
47
+ repo: repoName,
48
+ url: item.repository.html_url
49
+ });
50
+ }
51
+ }
52
+ }
53
+ }
54
+ spinner.stop();
55
+ if (results.length === 0) {
56
+ console.log(chalk.yellow(`\nNo skills found for "${query}"`));
57
+ console.log(chalk.dim('\n💡 Tips:'));
58
+ console.log(chalk.dim(' • Try a broader search term'));
59
+ console.log(chalk.dim(' • Search GitHub directly: killer search <query> -s github'));
60
+ return;
61
+ }
62
+ // Display results
63
+ console.log(chalk.bold(`\n🔍 Found ${results.length} skill(s) for "${query}"\n`));
64
+ // Group by source
65
+ const registryResults = results.filter(r => r.source === 'registry');
66
+ const githubResults = results.filter(r => r.source === 'github');
67
+ if (registryResults.length > 0) {
68
+ console.log(chalk.blue.bold('Registry Skills'));
69
+ console.log(chalk.dim('─'.repeat(50)));
70
+ for (const result of registryResults) {
71
+ console.log(` ${chalk.cyan('•')} ${chalk.bold(result.name)}`);
72
+ console.log(chalk.dim(` ${truncate(result.description, 60)}`));
73
+ if (result.repo) {
74
+ console.log(chalk.dim(` Install: killer install ${result.name}`));
75
+ }
76
+ console.log('');
77
+ }
78
+ }
79
+ if (githubResults.length > 0) {
80
+ console.log(chalk.dim.bold('GitHub Skills'));
81
+ console.log(chalk.dim('─'.repeat(50)));
82
+ for (const result of githubResults) {
83
+ console.log(` ${chalk.gray('•')} ${chalk.bold(result.name)}`);
84
+ console.log(chalk.dim(` ${truncate(result.description, 60)}`));
85
+ if (result.repo) {
86
+ console.log(chalk.dim(` Install: killer install ${result.repo}`));
87
+ }
88
+ console.log('');
89
+ }
90
+ }
91
+ console.log(chalk.dim('─'.repeat(50)));
92
+ console.log(chalk.dim(`Total: ${registryResults.length} registry, ${githubResults.length} github`));
93
+ }
94
+ catch (error) {
95
+ spinner.fail(chalk.red('Search failed'));
96
+ console.error(chalk.red(`\nError: ${error.message}`));
97
+ process.exit(1);
98
+ }
99
+ });
100
+ function truncate(str, length) {
101
+ if (str.length <= length)
102
+ return str;
103
+ return str.slice(0, length - 3) + '...';
104
+ }
105
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Stats Command
3
+ *
4
+ * Track and display CLI usage statistics.
5
+ */
6
+ import { Command } from 'commander';
7
+ export declare const statsCommand: Command;
8
+ /**
9
+ * Track a skill installation
10
+ */
11
+ export declare function trackInstall(skillName: string): Promise<void>;
12
+ /**
13
+ * Track command usage
14
+ */
15
+ export declare function trackCommand(commandName: string): Promise<void>;
16
+ //# sourceMappingURL=stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/commands/stats.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwBpC,eAAO,MAAM,YAAY,SAuEnB,CAAC;AAEP;;GAEG;AACH,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBnE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBrE"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Stats Command
3
+ *
4
+ * Track and display CLI usage statistics.
5
+ */
6
+ import { Command } from 'commander';
7
+ import chalk from 'chalk';
8
+ import fs from 'fs-extra';
9
+ import path from 'path';
10
+ import os from 'os';
11
+ const STATS_FILE = path.join(os.homedir(), '.killer-skills', 'stats.json');
12
+ const DEFAULT_STATS = {
13
+ installs: {},
14
+ commands: {},
15
+ lastRun: new Date().toISOString(),
16
+ totalRuns: 0,
17
+ firstRun: new Date().toISOString()
18
+ };
19
+ export const statsCommand = new Command('stats')
20
+ .description('View CLI usage statistics')
21
+ .option('--reset', 'Reset all statistics')
22
+ .option('--json', 'Output as JSON')
23
+ .action(async (options) => {
24
+ try {
25
+ await fs.ensureDir(path.dirname(STATS_FILE));
26
+ // Reset stats
27
+ if (options.reset) {
28
+ await fs.writeJson(STATS_FILE, DEFAULT_STATS, { spaces: 2 });
29
+ console.log(chalk.green('✅ Statistics reset'));
30
+ return;
31
+ }
32
+ // Load stats
33
+ let stats;
34
+ if (await fs.pathExists(STATS_FILE)) {
35
+ stats = await fs.readJson(STATS_FILE);
36
+ }
37
+ else {
38
+ stats = { ...DEFAULT_STATS };
39
+ await fs.writeJson(STATS_FILE, stats, { spaces: 2 });
40
+ }
41
+ // JSON output
42
+ if (options.json) {
43
+ console.log(JSON.stringify(stats, null, 2));
44
+ return;
45
+ }
46
+ // Display stats
47
+ console.log(chalk.bold('\n📊 Killer-Skills Usage Statistics\n'));
48
+ console.log(chalk.dim('─'.repeat(50)));
49
+ // General stats
50
+ console.log(chalk.bold('\nGeneral'));
51
+ console.log(` Total Runs: ${stats.totalRuns}`);
52
+ console.log(` First Run: ${formatDate(stats.firstRun)}`);
53
+ console.log(` Last Run: ${formatDate(stats.lastRun)}`);
54
+ // Top skills
55
+ const topSkills = Object.entries(stats.installs)
56
+ .sort(([, a], [, b]) => b - a)
57
+ .slice(0, 10);
58
+ if (topSkills.length > 0) {
59
+ console.log(chalk.bold('\n📦 Most Installed Skills'));
60
+ topSkills.forEach(([name, count], i) => {
61
+ const rank = `${i + 1}.`.padEnd(3);
62
+ console.log(` ${rank} ${name.padEnd(25)} ${count} installs`);
63
+ });
64
+ }
65
+ // Command usage
66
+ const topCommands = Object.entries(stats.commands)
67
+ .sort(([, a], [, b]) => b - a)
68
+ .slice(0, 10);
69
+ if (topCommands.length > 0) {
70
+ console.log(chalk.bold('\n🔧 Most Used Commands'));
71
+ topCommands.forEach(([name, count]) => {
72
+ console.log(` ${name.padEnd(15)} ${count} times`);
73
+ });
74
+ }
75
+ console.log(chalk.dim('\n─'.repeat(50)));
76
+ }
77
+ catch (error) {
78
+ console.error(chalk.red(`Error: ${error.message}`));
79
+ process.exit(1);
80
+ }
81
+ });
82
+ /**
83
+ * Track a skill installation
84
+ */
85
+ export async function trackInstall(skillName) {
86
+ try {
87
+ await fs.ensureDir(path.dirname(STATS_FILE));
88
+ let stats;
89
+ if (await fs.pathExists(STATS_FILE)) {
90
+ stats = await fs.readJson(STATS_FILE);
91
+ }
92
+ else {
93
+ stats = { ...DEFAULT_STATS };
94
+ }
95
+ stats.installs[skillName] = (stats.installs[skillName] || 0) + 1;
96
+ stats.lastRun = new Date().toISOString();
97
+ stats.totalRuns++;
98
+ await fs.writeJson(STATS_FILE, stats, { spaces: 2 });
99
+ }
100
+ catch {
101
+ // Ignore errors
102
+ }
103
+ }
104
+ /**
105
+ * Track command usage
106
+ */
107
+ export async function trackCommand(commandName) {
108
+ try {
109
+ await fs.ensureDir(path.dirname(STATS_FILE));
110
+ let stats;
111
+ if (await fs.pathExists(STATS_FILE)) {
112
+ stats = await fs.readJson(STATS_FILE);
113
+ }
114
+ else {
115
+ stats = { ...DEFAULT_STATS };
116
+ }
117
+ stats.commands[commandName] = (stats.commands[commandName] || 0) + 1;
118
+ stats.lastRun = new Date().toISOString();
119
+ stats.totalRuns++;
120
+ await fs.writeJson(STATS_FILE, stats, { spaces: 2 });
121
+ }
122
+ catch {
123
+ // Ignore errors
124
+ }
125
+ }
126
+ /**
127
+ * Format date string
128
+ */
129
+ function formatDate(dateStr) {
130
+ try {
131
+ return new Date(dateStr).toLocaleDateString();
132
+ }
133
+ catch {
134
+ return dateStr;
135
+ }
136
+ }
137
+ //# sourceMappingURL=stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/commands/stats.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAC;AAU3E,MAAM,aAAa,GAAU;IACzB,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,EAAE;IACZ,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;IACjC,SAAS,EAAE,CAAC;IACZ,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;CACrC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC3C,WAAW,CAAC,2BAA2B,CAAC;KACxC,MAAM,CAAC,SAAS,EAAE,sBAAsB,CAAC;KACzC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,KAAK,EAAE,OAA4C,EAAE,EAAE;IAC3D,IAAI,CAAC;QACD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QAE7C,cAAc;QACd,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;YAC/C,OAAO;QACX,CAAC;QAED,aAAa;QACb,IAAI,KAAY,CAAC;QACjB,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAClC,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACJ,KAAK,GAAG,EAAE,GAAG,aAAa,EAAE,CAAC;YAC7B,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,cAAc;QACd,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC5C,OAAO;QACX,CAAC;QAED,gBAAgB;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAEvC,gBAAgB;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,oBAAoB,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,oBAAoB,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAE7D,aAAa;QACb,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;aAC3C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;aAC7B,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAElB,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC;YACtD,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE;gBACnC,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACnC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;YAClE,CAAC,CAAC,CAAC;QACP,CAAC;QAED,gBAAgB;QAChB,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;aAC7C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;aAC7B,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAElB,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;YACnD,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;gBAClC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YACvD,CAAC,CAAC,CAAC;QACP,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAE7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAW,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC,CAAC,CAAC;AAEP;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,SAAiB;IAChD,IAAI,CAAC;QACD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QAE7C,IAAI,KAAY,CAAC;QACjB,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAClC,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACJ,KAAK,GAAG,EAAE,GAAG,aAAa,EAAE,CAAC;QACjC,CAAC;QAED,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACjE,KAAK,CAAC,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACzC,KAAK,CAAC,SAAS,EAAE,CAAC;QAElB,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACL,gBAAgB;IACpB,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAmB;IAClD,IAAI,CAAC;QACD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QAE7C,IAAI,KAAY,CAAC;QACjB,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAClC,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACJ,KAAK,GAAG,EAAE,GAAG,aAAa,EAAE,CAAC;QACjC,CAAC;QAED,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACrE,KAAK,CAAC,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACzC,KAAK,CAAC,SAAS,EAAE,CAAC;QAElB,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACL,gBAAgB;IACpB,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,OAAe;IAC/B,IAAI,CAAC;QACD,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,kBAAkB,EAAE,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,OAAO,CAAC;IACnB,CAAC;AACL,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Submit Command
3
+ *
4
+ * Submit a skill to the Killer-Skills registry for inclusion.
5
+ * This prepares and validates the skill, then sends it to the registry API.
6
+ */
7
+ import { Command } from 'commander';
8
+ export declare const submitCommand: Command;
9
+ //# sourceMappingURL=submit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submit.d.ts","sourceRoot":"","sources":["../../src/commands/submit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBpC,eAAO,MAAM,aAAa,SAwJpB,CAAC"}
@@ -0,0 +1,245 @@
1
+ /**
2
+ * Submit Command
3
+ *
4
+ * Submit a skill to the Killer-Skills registry for inclusion.
5
+ * This prepares and validates the skill, then sends it to the registry API.
6
+ */
7
+ import { Command } from 'commander';
8
+ import chalk from 'chalk';
9
+ import ora from 'ora';
10
+ import fs from 'fs-extra';
11
+ import path from 'path';
12
+ import https from 'https';
13
+ import { confirm, input } from '@inquirer/prompts';
14
+ export const submitCommand = new Command('submit')
15
+ .argument('[path]', 'Path to skill directory', '.')
16
+ .description('Submit a skill to the Killer-Skills registry')
17
+ .option('--dry-run', 'Validate without submitting')
18
+ .option('-y, --yes', 'Skip confirmation prompts')
19
+ .action(async (skillPath, options) => {
20
+ const spinner = ora('Preparing skill for submission...').start();
21
+ try {
22
+ // Resolve skill path
23
+ const resolvedPath = path.resolve(skillPath);
24
+ const skillMdPath = path.join(resolvedPath, 'SKILL.md');
25
+ // Check SKILL.md exists
26
+ if (!await fs.pathExists(skillMdPath)) {
27
+ spinner.fail(chalk.red('SKILL.md not found'));
28
+ console.log(chalk.dim(`Looking in: ${resolvedPath}`));
29
+ process.exit(1);
30
+ }
31
+ // Read and parse SKILL.md
32
+ const content = await fs.readFile(skillMdPath, 'utf-8');
33
+ const metadata = parseSkillMetadata(content);
34
+ spinner.succeed('Skill loaded');
35
+ // Validate metadata
36
+ console.log(chalk.bold('\n📦 Skill Information\n'));
37
+ console.log(chalk.dim('─'.repeat(50)));
38
+ console.log(` ${chalk.cyan('Name:')} ${metadata.name}`);
39
+ console.log(` ${chalk.cyan('Description:')} ${metadata.description || chalk.yellow('(missing)')}`);
40
+ console.log(` ${chalk.cyan('Author:')} ${metadata.author || chalk.yellow('(missing)')}`);
41
+ console.log(` ${chalk.cyan('Version:')} ${metadata.version || '1.0.0'}`);
42
+ console.log(` ${chalk.cyan('Tags:')} ${metadata.tags?.join(', ') || chalk.dim('none')}`);
43
+ console.log(chalk.dim('─'.repeat(50)));
44
+ // Check structure
45
+ const structure = {
46
+ 'SKILL.md': true,
47
+ 'scripts/': await fs.pathExists(path.join(resolvedPath, 'scripts')),
48
+ 'references/': await fs.pathExists(path.join(resolvedPath, 'references')),
49
+ 'examples/': await fs.pathExists(path.join(resolvedPath, 'examples')),
50
+ 'assets/': await fs.pathExists(path.join(resolvedPath, 'assets'))
51
+ };
52
+ console.log(chalk.bold('\n📁 Structure\n'));
53
+ for (const [item, exists] of Object.entries(structure)) {
54
+ const icon = exists ? chalk.green('✓') : chalk.dim('○');
55
+ console.log(` ${icon} ${item}`);
56
+ }
57
+ // Validate required fields
58
+ const errors = [];
59
+ if (!metadata.name)
60
+ errors.push('Missing skill name in frontmatter');
61
+ if (!metadata.description)
62
+ errors.push('Missing description in frontmatter');
63
+ if (errors.length > 0) {
64
+ console.log(chalk.red('\n⚠️ Validation Errors:\n'));
65
+ errors.forEach(e => console.log(chalk.red(` • ${e}`)));
66
+ console.log(chalk.dim('\nFix these issues before submitting.'));
67
+ process.exit(1);
68
+ }
69
+ // Collect additional info if needed
70
+ let author = metadata.author;
71
+ let email = metadata.email;
72
+ let repository = metadata.repository;
73
+ if (!options.yes) {
74
+ if (!author) {
75
+ author = await input({
76
+ message: 'Author name:',
77
+ required: true
78
+ });
79
+ }
80
+ if (!email) {
81
+ email = await input({
82
+ message: 'Contact email (optional):',
83
+ required: false
84
+ });
85
+ }
86
+ if (!repository) {
87
+ repository = await input({
88
+ message: 'GitHub repository URL (optional):',
89
+ required: false
90
+ });
91
+ }
92
+ }
93
+ // Dry run - stop here
94
+ if (options.dryRun) {
95
+ console.log(chalk.green('\n✅ Dry run complete. Skill is ready for submission.'));
96
+ console.log(chalk.dim('\nRemove --dry-run to submit.'));
97
+ return;
98
+ }
99
+ // Confirm submission
100
+ if (!options.yes) {
101
+ const proceed = await confirm({
102
+ message: 'Submit this skill to the registry?',
103
+ default: true
104
+ });
105
+ if (!proceed) {
106
+ console.log(chalk.yellow('\nSubmission cancelled.'));
107
+ return;
108
+ }
109
+ }
110
+ // Prepare submission
111
+ const submission = {
112
+ name: metadata.name,
113
+ description: metadata.description,
114
+ author: author || 'Anonymous',
115
+ email,
116
+ repository,
117
+ tags: metadata.tags || [],
118
+ version: metadata.version || '1.0.0',
119
+ content,
120
+ structure
121
+ };
122
+ // Submit to registry
123
+ spinner.start('Submitting to registry...');
124
+ const result = await submitToRegistry(submission);
125
+ if (result.success) {
126
+ spinner.succeed(chalk.green('Skill submitted successfully!'));
127
+ console.log(chalk.dim('\nYour skill will be reviewed and added to the registry.'));
128
+ if (result.trackingId) {
129
+ console.log(chalk.dim(`Tracking ID: ${result.trackingId}`));
130
+ }
131
+ }
132
+ else {
133
+ spinner.fail(chalk.red('Submission failed'));
134
+ console.log(chalk.red(`Error: ${result.error}`));
135
+ }
136
+ }
137
+ catch (error) {
138
+ if (error.name === 'ExitPromptError') {
139
+ console.log(chalk.yellow('\n\nCancelled'));
140
+ process.exit(0);
141
+ }
142
+ spinner.fail(chalk.red('Submission failed'));
143
+ console.error(chalk.red(`\nError: ${error.message}`));
144
+ process.exit(1);
145
+ }
146
+ });
147
+ /**
148
+ * Parse skill metadata from SKILL.md frontmatter
149
+ */
150
+ function parseSkillMetadata(content) {
151
+ const frontmatterMatch = content.match(/^---\s*\n([\s\S]*?)\n---/);
152
+ const result = {};
153
+ if (frontmatterMatch) {
154
+ const lines = frontmatterMatch[1].split('\n');
155
+ for (const line of lines) {
156
+ const match = line.match(/^(\w+):\s*(.+)?$/);
157
+ if (match) {
158
+ const [, key, value] = match;
159
+ if (value) {
160
+ result[key] = value.trim();
161
+ }
162
+ }
163
+ }
164
+ // Parse tags if present
165
+ const tagsMatch = frontmatterMatch[1].match(/tags:\s*\n((?:\s*-\s*.+\n?)*)/m);
166
+ if (tagsMatch) {
167
+ const tags = tagsMatch[1]
168
+ .split('\n')
169
+ .map(line => line.match(/^\s*-\s*(.+)$/)?.[1]?.trim())
170
+ .filter(Boolean);
171
+ result.tags = tags;
172
+ }
173
+ }
174
+ // Try to extract name from first heading if not in frontmatter
175
+ if (!result.name) {
176
+ const headingMatch = content.match(/^#\s+(.+)/m);
177
+ if (headingMatch) {
178
+ result.name = headingMatch[1].trim();
179
+ }
180
+ }
181
+ return result;
182
+ }
183
+ /**
184
+ * Submit skill to registry API
185
+ */
186
+ async function submitToRegistry(submission) {
187
+ return new Promise((resolve) => {
188
+ // For now, simulate submission
189
+ // In production, this would POST to the actual registry API
190
+ const registryUrl = process.env.KILLER_SKILLS_REGISTRY_API ||
191
+ 'https://killer-skills.vercel.app/api/skills/submit';
192
+ try {
193
+ const url = new URL(registryUrl);
194
+ const data = JSON.stringify(submission);
195
+ const req = https.request({
196
+ hostname: url.hostname,
197
+ port: url.port || 443,
198
+ path: url.pathname,
199
+ method: 'POST',
200
+ headers: {
201
+ 'Content-Type': 'application/json',
202
+ 'Content-Length': Buffer.byteLength(data),
203
+ 'User-Agent': 'killer-skills-cli/1.6.0'
204
+ }
205
+ }, (res) => {
206
+ let body = '';
207
+ res.on('data', chunk => body += chunk);
208
+ res.on('end', () => {
209
+ try {
210
+ const result = JSON.parse(body);
211
+ resolve({
212
+ success: result.success || res.statusCode === 200 || res.statusCode === 201,
213
+ trackingId: result.trackingId || result.id,
214
+ error: result.error || result.message
215
+ });
216
+ }
217
+ catch {
218
+ resolve({
219
+ success: res.statusCode === 200 || res.statusCode === 201,
220
+ error: body
221
+ });
222
+ }
223
+ });
224
+ });
225
+ req.on('error', (e) => {
226
+ // If API not available, provide instructions
227
+ resolve({
228
+ success: false,
229
+ error: `Registry API not available. Submit via GitHub instead:\n` +
230
+ ` 1. Create a PR to https://github.com/anthropics/killer-skills\n` +
231
+ ` 2. Add your skill to the registry/skills.json file`
232
+ });
233
+ });
234
+ req.write(data);
235
+ req.end();
236
+ }
237
+ catch (e) {
238
+ resolve({
239
+ success: false,
240
+ error: e.message
241
+ });
242
+ }
243
+ });
244
+ }
245
+ //# sourceMappingURL=submit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submit.js","sourceRoot":"","sources":["../../src/commands/submit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
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
+ export declare const syncCommand: Command;
11
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+BpC,eAAO,MAAM,WAAW,SAgGlB,CAAC"}