skill-creator 0.0.0 → 1.1.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 (123) hide show
  1. package/README.md +157 -19
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +268 -262
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/addContent.d.ts +5 -0
  6. package/dist/commands/addContent.d.ts.map +1 -0
  7. package/dist/commands/addContent.js +74 -0
  8. package/dist/commands/addContent.js.map +1 -0
  9. package/dist/commands/buildIndex.d.ts +5 -0
  10. package/dist/commands/buildIndex.d.ts.map +1 -0
  11. package/dist/commands/buildIndex.js +17 -0
  12. package/dist/commands/buildIndex.js.map +1 -0
  13. package/dist/commands/downloadContext7.d.ts +5 -0
  14. package/dist/commands/downloadContext7.d.ts.map +1 -0
  15. package/dist/commands/downloadContext7.js +62 -0
  16. package/dist/commands/downloadContext7.js.map +1 -0
  17. package/dist/commands/init.d.ts +5 -0
  18. package/dist/commands/init.d.ts.map +1 -0
  19. package/dist/commands/init.js +89 -0
  20. package/dist/commands/init.js.map +1 -0
  21. package/dist/commands/listContent.d.ts +5 -0
  22. package/dist/commands/listContent.d.ts.map +1 -0
  23. package/dist/commands/listContent.js +35 -0
  24. package/dist/commands/listContent.js.map +1 -0
  25. package/dist/commands/searchContent.d.ts +5 -0
  26. package/dist/commands/searchContent.d.ts.map +1 -0
  27. package/dist/commands/searchContent.js +98 -0
  28. package/dist/commands/searchContent.js.map +1 -0
  29. package/dist/commands/shared.d.ts +23 -0
  30. package/dist/commands/shared.d.ts.map +1 -0
  31. package/dist/commands/shared.js +92 -0
  32. package/dist/commands/shared.js.map +1 -0
  33. package/dist/core/autoSearchAdapter.d.ts +42 -0
  34. package/dist/core/autoSearchAdapter.d.ts.map +1 -0
  35. package/dist/core/autoSearchAdapter.js +116 -0
  36. package/dist/core/autoSearchAdapter.js.map +1 -0
  37. package/dist/core/chromaSearch.d.ts +2 -2
  38. package/dist/core/chromaSearch.d.ts.map +1 -1
  39. package/dist/core/chromaSearch.js +11 -9
  40. package/dist/core/chromaSearch.js.map +1 -1
  41. package/dist/core/chromaSearchAdapter.d.ts +86 -0
  42. package/dist/core/chromaSearchAdapter.d.ts.map +1 -0
  43. package/dist/core/chromaSearchAdapter.js +477 -0
  44. package/dist/core/chromaSearchAdapter.js.map +1 -0
  45. package/dist/core/chromaServerManager.d.ts +64 -0
  46. package/dist/core/chromaServerManager.d.ts.map +1 -0
  47. package/dist/core/chromaServerManager.js +186 -0
  48. package/dist/core/chromaServerManager.js.map +1 -0
  49. package/dist/core/contentManager.d.ts +1 -0
  50. package/dist/core/contentManager.d.ts.map +1 -1
  51. package/dist/core/contentManager.js +75 -21
  52. package/dist/core/contentManager.js.map +1 -1
  53. package/dist/core/fuzzySearchAdapter.d.ts +33 -0
  54. package/dist/core/fuzzySearchAdapter.d.ts.map +1 -0
  55. package/dist/core/fuzzySearchAdapter.js +185 -0
  56. package/dist/core/fuzzySearchAdapter.js.map +1 -0
  57. package/dist/core/portUtils.d.ts +51 -0
  58. package/dist/core/portUtils.d.ts.map +1 -0
  59. package/dist/core/portUtils.js +120 -0
  60. package/dist/core/portUtils.js.map +1 -0
  61. package/dist/core/runScript.d.ts +1 -1
  62. package/dist/core/runScript.d.ts.map +1 -1
  63. package/dist/core/runScript.js +27 -210
  64. package/dist/core/runScript.js.map +1 -1
  65. package/dist/core/searchAdapter.d.ts +48 -0
  66. package/dist/core/searchAdapter.d.ts.map +1 -0
  67. package/dist/core/searchAdapter.js +6 -0
  68. package/dist/core/searchAdapter.js.map +1 -0
  69. package/dist/core/searchEngineFactory.d.ts +30 -0
  70. package/dist/core/searchEngineFactory.d.ts.map +1 -0
  71. package/dist/core/searchEngineFactory.js +41 -0
  72. package/dist/core/searchEngineFactory.js.map +1 -0
  73. package/dist/core/skillCreator.d.ts +2 -4
  74. package/dist/core/skillCreator.d.ts.map +1 -1
  75. package/dist/core/skillCreator.js +46 -195
  76. package/dist/core/skillCreator.js.map +1 -1
  77. package/dist/core/templateManager.d.ts +2 -1
  78. package/dist/core/templateManager.d.ts.map +1 -1
  79. package/dist/core/templateManager.js +19 -13
  80. package/dist/core/templateManager.js.map +1 -1
  81. package/dist/core/unifiedSearch.d.ts +57 -11
  82. package/dist/core/unifiedSearch.d.ts.map +1 -1
  83. package/dist/core/unifiedSearch.js +88 -29
  84. package/dist/core/unifiedSearch.js.map +1 -1
  85. package/dist/index.d.ts +4 -1
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +3 -1
  88. package/dist/index.js.map +1 -1
  89. package/dist/search_format/enhancedFormatter.d.ts +109 -0
  90. package/dist/search_format/enhancedFormatter.d.ts.map +1 -0
  91. package/dist/search_format/enhancedFormatter.js +262 -0
  92. package/dist/search_format/enhancedFormatter.js.map +1 -0
  93. package/dist/search_format/index.d.ts +10 -0
  94. package/dist/search_format/index.d.ts.map +1 -0
  95. package/dist/search_format/index.js +22 -0
  96. package/dist/search_format/index.js.map +1 -0
  97. package/dist/search_format/listFormatter.d.ts +16 -0
  98. package/dist/search_format/listFormatter.d.ts.map +1 -0
  99. package/dist/search_format/listFormatter.js +51 -0
  100. package/dist/search_format/listFormatter.js.map +1 -0
  101. package/dist/search_format/types.d.ts +69 -0
  102. package/dist/search_format/types.d.ts.map +1 -0
  103. package/dist/search_format/types.js +5 -0
  104. package/dist/search_format/types.js.map +1 -0
  105. package/dist/types/index.d.ts +6 -1
  106. package/dist/types/index.d.ts.map +1 -1
  107. package/dist/utils/package.d.ts +17 -0
  108. package/dist/utils/package.d.ts.map +1 -1
  109. package/dist/utils/package.js +51 -14
  110. package/dist/utils/package.js.map +1 -1
  111. package/package.json +9 -8
  112. package/templates/SKILL.md +193 -0
  113. package/templates/SKILL.zh-CN.md +193 -0
  114. package/templates/skill-creator.md +68 -154
  115. package/templates/skill-creator.zh-CN.md +98 -0
  116. package/dist/core/searchEngine.d.ts +0 -25
  117. package/dist/core/searchEngine.d.ts.map +0 -1
  118. package/dist/core/searchEngine.js +0 -198
  119. package/dist/core/searchEngine.js.map +0 -1
  120. package/dist/core/simpleSearch.d.ts +0 -21
  121. package/dist/core/simpleSearch.d.ts.map +0 -1
  122. package/dist/core/simpleSearch.js +0 -113
  123. package/dist/core/simpleSearch.js.map +0 -1
package/dist/cli.js CHANGED
@@ -4,194 +4,140 @@
4
4
  */
5
5
  import { Command } from 'commander';
6
6
  import gradient from 'gradient-string';
7
- import inquirer from 'inquirer';
8
7
  import { SkillCreator } from './core/skillCreator.js';
9
8
  import { PackageUtils } from './utils/package.js';
10
9
  const program = new Command();
10
+ /**
11
+ * Helper function to create a skill for a package with interactive confirmation
12
+ */
13
+ async function createSkillForPackage(skillDirName, packageName, scope, force = false, description) {
14
+ const creator = new SkillCreator();
15
+ const createOptions = {
16
+ packageName: packageName, // Use the user-provided package name directly
17
+ path: scope === 'user' ? undefined : '.claude/skills',
18
+ scope: scope, // Map 'current' to 'project' for internal storage
19
+ noInitDocs: true, // Docs are downloaded in a separate step in the new flow
20
+ force: force, // Pass force option to SkillCreator
21
+ description: description, // Pass description option to SkillCreator
22
+ };
23
+ console.log(gradient('cyan', 'magenta')('\nšŸš€ Creating skill...'));
24
+ const result = await creator.createSkill(createOptions);
25
+ if (result.created) {
26
+ console.log(gradient('green', 'cyan')(`\nāœ… ${result.message}`));
27
+ console.log(gradient('blue', 'cyan')(`šŸ“ Skill Path: ${result.skillPath}`));
28
+ console.log('\nšŸŽ‰ Skill created successfully!');
29
+ console.log('\nNext steps:');
30
+ console.log(`1. Add content: skill-creator add-skill --pwd "${result.skillPath}" --title "My Note" --content "Your content"`);
31
+ console.log(`2. Search skill: skill-creator search-skill --pwd "${result.skillPath}" "query"`);
32
+ console.log(`3. Download docs: skill-creator download-context7 --pwd "${result.skillPath}" <context7_library_id>`);
33
+ return result.skillPath;
34
+ }
35
+ else {
36
+ throw new Error(result.message || 'Failed to create skill');
37
+ }
38
+ }
11
39
  program
12
40
  .name('skill-creator')
13
41
  .description('Create claude-code-skills with documentation management')
14
42
  .version('2.0.0');
43
+ // Add create-cc-skill command
15
44
  program
16
- .argument('<package_name>', 'Package name to create documentation skill for (e.g., tanstack-router)')
17
- .option('-p, --path <path>', 'Output path (default: current directory)', '.')
18
- .option('-d, --description <description>', 'Description of the skill')
19
- .option('-c, --context7-id <id>', 'Context7 library ID (e.g., /tanstack/router/docs)')
20
- .option('--no-init-docs', 'Skip initial documentation download')
21
- .option('-s, --storage <storage>', 'Where to store the skill', 'project')
22
- .option('--package-version <version>', 'Specific version to use')
23
- .option('--no-interactive', 'Skip interactive prompts')
24
- .option('--search', 'Enable interactive package search')
25
- .action(async (packageName, options, _command) => {
26
- // Validate package name
27
- if (!packageName || packageName.trim().length === 0) {
28
- console.error('āŒ Error: Package name is required');
29
- process.exit(1);
30
- }
31
- console.log(gradient('cyan', 'magenta')('\nšŸ” Searching for package:'));
32
- console.log(gradient('yellow', 'orange')(packageName));
33
- console.log(gradient('cyan', 'magenta')('='.repeat(50)));
34
- let selectedPackage = { name: packageName, version: options.packageVersion };
35
- // If not a valid package name or search is enabled, search for suggestions
36
- if (!PackageUtils.validatePackageName(packageName) || options.search) {
37
- const suggestions = await PackageUtils.suggestPackages(packageName, { limit: 10 });
38
- if (suggestions.length === 0) {
39
- console.error(`āŒ No packages found for "${packageName}"`);
40
- process.exit(1);
41
- }
42
- if (suggestions.length > 1 && !options.noInteractive) {
43
- console.log(`\nšŸ“¦ Found ${suggestions.length} package(s):`);
44
- const choices = suggestions.map((pkg) => ({
45
- name: `${pkg.name} (${pkg.version}) - ${pkg.description.slice(0, 80)}${pkg.description.length > 80 ? '...' : ''}`,
46
- value: pkg.name,
47
- short: pkg.name,
48
- }));
49
- const { selectedPkg } = await inquirer.prompt([
45
+ .command('create-cc-skill')
46
+ .requiredOption('--scope <scope>', 'Storage scope (user or current)')
47
+ .option('--name <name>', 'Package name for the skill')
48
+ .option('--interactive', 'Enable interactive confirmation prompts')
49
+ .option('--force', 'Force overwrite existing files in the skill directory')
50
+ .option('--description <description>', 'Custom description for the skill')
51
+ .argument('<skill_dir_name>', 'The name of the skill directory to create')
52
+ .action(async (skillDirName, options) => {
53
+ try {
54
+ const { scope, interactive, force, description, name } = options;
55
+ // Import inquirer for interactive prompts
56
+ const { default: inquirer } = await import('inquirer');
57
+ let finalSkillName = name || skillDirName;
58
+ if (interactive) {
59
+ // 1. ē”®č®¤å­˜å‚Øä½ē½®
60
+ console.log('Skill Creation Configuration:');
61
+ console.log(`- Skill directory name: ${skillDirName}`);
62
+ console.log(`- Storage scope: ${scope}`);
63
+ const { confirmLocation } = await inquirer.prompt([
50
64
  {
51
- type: 'list',
52
- name: 'selectedPkg',
53
- message: 'Select a package:',
54
- choices,
55
- pageSize: 10,
65
+ type: 'confirm',
66
+ name: 'confirmLocation',
67
+ message: `Create skill in ${scope === 'project' ? './.claude/skills/' : '~/.claude/skills/'}?`,
68
+ default: true,
56
69
  },
57
70
  ]);
58
- selectedPackage.name = selectedPkg;
59
- selectedPackage.version = await PackageUtils.getPackageVersion(selectedPkg) || suggestions.find(s => s.name === selectedPkg)?.version;
60
- }
61
- else {
62
- selectedPackage.name = suggestions[0].name;
63
- selectedPackage.version = suggestions[0].version;
64
- }
65
- }
66
- // Get version if not specified
67
- if (!selectedPackage.version) {
68
- selectedPackage.version = await PackageUtils.getPackageVersion(selectedPackage.name);
69
- }
70
- if (!selectedPackage.version) {
71
- console.warn(`āš ļø Could not determine version for ${selectedPackage.name}`);
72
- }
73
- console.log(gradient('green', 'cyan')(`\nāœ… Selected package: ${selectedPackage.name}@${selectedPackage.version || 'latest'}`));
74
- // Ask for storage location if not specified
75
- let storage = options.storage;
76
- let path = options.path;
77
- if (!options.noInteractive && !options.storage) {
78
- const { storageLocation } = await inquirer.prompt([
79
- {
80
- type: 'list',
81
- name: 'storageLocation',
82
- message: 'Where would you like to store this skill?',
83
- choices: [
84
- {
85
- name: 'šŸ“ Current project (./.claude/skills/)',
86
- value: 'project',
87
- },
71
+ if (!confirmLocation) {
72
+ console.log('Skill creation cancelled.');
73
+ process.exit(0);
74
+ }
75
+ // 2. å¦‚ęžœę²”ęœ‰ęä¾›--nameå‚ę•°ļ¼ŒčÆ¢é—®åŒ…å
76
+ if (!name) {
77
+ const { packageNameConfirmed } = await inquirer.prompt([
88
78
  {
89
- name: 'šŸ  User directory (~/.claude/skills/)',
90
- value: 'user',
79
+ type: 'confirm',
80
+ name: 'packageNameConfirmed',
81
+ message: `Use '${skillDirName}' as the package name?`,
82
+ default: true,
91
83
  },
92
- ],
93
- default: 'project',
94
- },
95
- ]);
96
- storage = storageLocation;
97
- if (storage === 'project' && path === '.') {
98
- const { useDefaultPath } = await inquirer.prompt([
84
+ ]);
85
+ if (!packageNameConfirmed) {
86
+ const { customPackageName } = await inquirer.prompt([
87
+ {
88
+ type: 'input',
89
+ name: 'customPackageName',
90
+ message: 'Enter the package name:',
91
+ validate: (input) => input.trim() !== '' || 'Package name cannot be empty',
92
+ },
93
+ ]);
94
+ finalSkillName = customPackageName.trim();
95
+ }
96
+ }
97
+ // 3. ē”®č®¤ęœ€ē»ˆé…ē½®
98
+ console.log('\nFinal Configuration:');
99
+ console.log(`- Skill directory name: ${skillDirName}`);
100
+ console.log(`- Package name: ${finalSkillName}`);
101
+ console.log(`- Storage location: ${scope === 'current' ? './.claude/skills/' : '~/.claude/skills/'}`);
102
+ const { confirmFinal } = await inquirer.prompt([
99
103
  {
100
104
  type: 'confirm',
101
- name: 'useDefaultPath',
102
- message: 'Use current directory for skill storage?',
105
+ name: 'confirmFinal',
106
+ message: 'Proceed with skill creation?',
103
107
  default: true,
104
108
  },
105
109
  ]);
106
- if (!useDefaultPath) {
107
- const { customPath } = await inquirer.prompt([
108
- {
109
- type: 'input',
110
- name: 'customPath',
111
- message: 'Enter custom path:',
112
- default: './',
113
- },
114
- ]);
115
- path = customPath;
110
+ if (!confirmFinal) {
111
+ console.log('Skill creation cancelled.');
112
+ process.exit(0);
116
113
  }
117
114
  }
115
+ // Create the skill with confirmed configuration
116
+ const skillPath = await createSkillForPackage(skillDirName, finalSkillName, scope, force, description);
117
+ console.log(`Skill created successfully at: ${skillPath}`);
118
118
  }
119
- console.log(gradient('cyan', 'magenta')('\nšŸ“ Creating skill...'));
120
- console.log(gradient('cyan', 'magenta')('='.repeat(50)));
121
- const creator = new SkillCreator();
122
- // Create skill folder name
123
- const skillName = PackageUtils.createSkillFolderName(selectedPackage.name, selectedPackage.version ?? '1.0.0');
124
- console.log(`\nšŸ“ Skill folder name: ${skillName}`);
125
- // Create skill
126
- const createOptions = {
127
- packageName: selectedPackage.name,
128
- path,
129
- description: options.description,
130
- context7Id: options.context7Id,
131
- noInitDocs: options.noInitDocs,
132
- storage,
133
- version: selectedPackage.version,
134
- };
135
- const result = await creator.createSkill(createOptions);
136
- // Print result
137
- if (result.created) {
138
- console.log(gradient('green', 'cyan')(`\nāœ… ${result.message}`));
139
- if (result.docsInitialized) {
140
- console.log(`āœ… Documentation downloaded and indexed`);
141
- }
142
- console.log(`\nšŸ“‹ Next steps:`);
143
- console.log(`1. cd ${result.skillPath}`);
144
- console.log(`2. npm install`);
145
- if (!result.docsInitialized) {
146
- console.log(`\nšŸ“š To initialize documentation:`);
147
- console.log(` Option A: Use Context7 (requires MCP)`);
148
- console.log(` - First, resolve library ID with AI help or Context7 search`);
149
- console.log(` - Update config.json with the correct context7_library_id`);
150
- console.log(` - Run: npm run update-context7`);
151
- console.log(`\n Option B: Add documentation manually`);
152
- console.log(` - Run: npm run add -- --title 'Topic' --content 'Your content'`);
153
- }
154
- console.log(`\n3. npm run build-index`);
155
- console.log(`4. npm run search -- --query 'test query'`);
156
- if (options.context7Id) {
157
- console.log(`\nšŸ’” Note: Context7 library ID set to: ${options.context7Id}`);
158
- console.log(` If this is incorrect, edit config.json and update context7_library_id`);
159
- }
160
- }
161
- else {
162
- console.error(`āŒ ${result.message}`);
119
+ catch (error) {
120
+ console.error('Error:', error instanceof Error ? error.message : String(error));
163
121
  process.exit(1);
164
122
  }
165
123
  });
166
- // Add init command to install subagents
124
+ // Add interactive init command
167
125
  program
168
126
  .command('init')
127
+ .description('Install skill-creator as subagent (interactive mode)')
128
+ .action(async () => {
129
+ const { runScript } = await import('./core/runScript.js');
130
+ await runScript('init', []);
131
+ });
132
+ // Add init command to install subagents (non-interactive version)
133
+ program
134
+ .command('init-cc')
169
135
  .description('Install skill-creator as subagent in ~/.claude/agents/')
170
136
  .action(async () => {
171
- const { homedir } = await import('node:os');
172
- const { join } = await import('node:path');
173
- const { mkdirSync, writeFileSync } = await import('node:fs');
174
- const agentsDir = join(homedir(), '.claude', 'agents');
175
- const skillCreatorDir = join(agentsDir, 'skill-creator');
176
- // Create directories
177
- mkdirSync(agentsDir, { recursive: true });
178
- mkdirSync(skillCreatorDir, { recursive: true });
179
- // Create subagent manifest
180
- const manifest = {
181
- name: 'skill-creator',
182
- version: '2.0.0',
183
- description: 'Claude Code skill creation agent',
184
- main: process.cwd(),
185
- commands: [
186
- 'search',
187
- 'get-name',
188
- 'download-context7',
189
- 'addSkill'
190
- ]
191
- };
192
- writeFileSync(join(skillCreatorDir, 'manifest.json'), JSON.stringify(manifest, null, 2));
193
- console.log(gradient('green', 'cyan')('\nāœ… Skill-creator subagent installed successfully!'));
194
- console.log(`šŸ“ Location: ${skillCreatorDir}`);
137
+ const { runScript } = await import('./core/runScript.js');
138
+ // For init-cc, we want the non-interactive version that installs to user directory
139
+ // Use --scope=user for consistency with other CLI commands
140
+ await runScript('init', ['--scope', 'user']);
195
141
  });
196
142
  // Add search command for package searching
197
143
  program
@@ -199,148 +145,205 @@ program
199
145
  .argument('<keywords>', 'Search keywords for npm packages')
200
146
  .option('-l, --limit <limit>', 'Number of results to show', '10')
201
147
  .action(async (keywords, options) => {
202
- // Handle multiple keywords by splitting
203
148
  const query = keywords;
204
- console.log(gradient('cyan', 'magenta')('\nšŸ” Searching npm packages...'));
205
- console.log(gradient('yellow', 'orange')(query));
206
- console.log(gradient('cyan', 'magenta')('='.repeat(50)));
207
149
  const suggestions = await PackageUtils.suggestPackages(query, {
208
- limit: parseInt(options.limit)
209
- });
210
- if (suggestions.length === 0) {
211
- console.error(`āŒ No packages found for "${query}"`);
212
- return;
213
- }
214
- console.log(`\nšŸ“¦ Found ${suggestions.length} package(s):`);
215
- suggestions.forEach((pkg, index) => {
216
- console.log(`\n${index + 1}. ${gradient('green', 'cyan')(pkg.name)} (${pkg.version})`);
217
- console.log(` ${pkg.description.slice(0, 100)}${pkg.description.length > 100 ? '...' : ''}`);
218
- console.log(` šŸ‘¤ ${pkg.publisher} | ⭐ ${pkg.score.toFixed(2)}`);
150
+ limit: parseInt(options.limit),
219
151
  });
152
+ console.log(JSON.stringify(suggestions, null, 2));
220
153
  });
221
- // Add get-name command to generate skill name
154
+ // Add get-info command for package information
222
155
  program
223
- .command('get-name')
224
- .argument('<package_name>', 'Package name')
225
- .option('-v, --version <version>', 'Specific version')
226
- .action(async (packageName, options) => {
227
- const version = options.version || await PackageUtils.getPackageVersion(packageName);
228
- if (!version) {
229
- console.error(`āŒ Could not determine version for ${packageName}`);
156
+ .command('get-info')
157
+ .argument('<package_name>', 'The npm package name to get information for')
158
+ .action(async (packageName) => {
159
+ const packageInfo = await PackageUtils.getPackageInfo(packageName);
160
+ if (!packageInfo) {
161
+ console.error(`āŒ Package "${packageName}" not found or API error occurred.`);
230
162
  process.exit(1);
231
163
  }
232
- const skillName = PackageUtils.createSkillFolderName(packageName, version);
233
- console.log(gradient('green', 'cyan')(`\nāœ… Skill name: ${skillName}`));
234
- console.log(` Package: ${packageName}@${version}`);
164
+ const version = packageInfo.version;
165
+ const skillDirName = PackageUtils.createSkillFolderName(packageName, version);
166
+ const result = {
167
+ skill_dir_name: skillDirName,
168
+ name: packageInfo.name,
169
+ version: version,
170
+ description: packageInfo.description || '',
171
+ keywords: packageInfo.keywords || [],
172
+ license: packageInfo.license || '',
173
+ author: packageInfo.author || '',
174
+ maintainers: packageInfo.maintainers || [],
175
+ homepage: packageInfo.homepage || '',
176
+ repository: {
177
+ url: packageInfo.repository?.url || '',
178
+ type: packageInfo.repository?.type || '',
179
+ },
180
+ bugs: {
181
+ url: packageInfo.bugs?.url || '',
182
+ },
183
+ funding: packageInfo.funding || '',
184
+ scripts: packageInfo.scripts || {},
185
+ engines: packageInfo.engines || {},
186
+ types: packageInfo.types || '',
187
+ dependencies: packageInfo.dependencies || {},
188
+ devDependencies: packageInfo.devDependencies || {},
189
+ time: {
190
+ created: packageInfo.time?.created || '',
191
+ modified: packageInfo.time?.modified || '',
192
+ },
193
+ };
194
+ console.log(JSON.stringify(result, null, 2));
235
195
  });
236
- // Add download-context7 command
196
+ // Add search-skill command
237
197
  program
238
- .command('download-context7')
239
- .argument('<package_name>', 'Package name')
240
- .argument('<context7_id>', 'Context7 library ID')
241
- .option('-f, --force', 'Force update even if up to date')
242
- .option('-s, --storage <storage>', 'Storage location (project|user)', 'project')
243
- .action(async (packageName, context7Id, options) => {
244
- console.log(gradient('cyan', 'magenta')('\nšŸ“„ Downloading Context7 documentation...'));
245
- console.log(`Package: ${packageName}`);
246
- console.log(`Context7 ID: ${context7Id}`);
247
- // Find existing skill
248
- const { join } = await import('node:path');
249
- const { homedir } = await import('node:os');
250
- const baseDir = options.storage === 'user'
251
- ? join(homedir(), '.claude', 'skills')
252
- : join(process.cwd(), '.claude', 'skills');
253
- // Find skill directory
254
- const { readdirSync } = await import('node:fs');
255
- const dirs = readdirSync(baseDir, { withFileTypes: true })
256
- .filter(dirent => dirent.isDirectory())
257
- .map(dirent => dirent.name)
258
- .filter(name => name.includes(packageName.replace(/[^a-z0-9]/gi, '')));
259
- if (dirs.length === 0) {
260
- console.error(`āŒ No skill found for package ${packageName}`);
261
- console.log(`šŸ’” Create a skill first with: skill-creator ${packageName}`);
198
+ .command('search-skill')
199
+ .argument('<query>', 'Search query')
200
+ .option('--pwd <path>', 'Path to the skill directory')
201
+ .option('--package <name>', 'Package name to find skill directory for')
202
+ .option('--mode <mode>', 'Search mode: auto, fuzzy, or chroma', 'auto')
203
+ .option('--list', 'Show simplified list view (basic info only)', false)
204
+ .action(async (query, options) => {
205
+ let skillDir;
206
+ if (options.pwd) {
207
+ skillDir = options.pwd;
208
+ }
209
+ else if (options.package) {
210
+ const { join } = await import('node:path');
211
+ const { homedir } = await import('node:os');
212
+ const { readdirSync, existsSync } = await import('node:fs');
213
+ const findDir = (base) => {
214
+ if (!existsSync(base))
215
+ return undefined;
216
+ const dirs = readdirSync(base, { withFileTypes: true })
217
+ .filter((dirent) => dirent.isDirectory())
218
+ .map((dirent) => dirent.name)
219
+ .filter((name) => name.includes(options.package.replace(/[^a-z0-9]/gi, '')));
220
+ return dirs.length > 0 ? join(base, dirs[0]) : undefined;
221
+ };
222
+ skillDir =
223
+ findDir(join(process.cwd(), '.claude', 'skills')) ||
224
+ findDir(join(homedir(), '.claude', 'skills'));
225
+ }
226
+ if (!skillDir) {
227
+ console.error('āŒ Could not find skill directory. Please provide --pwd or a valid --package.');
262
228
  process.exit(1);
263
229
  }
264
- const skillDir = join(baseDir, dirs[0]);
265
- // Change to skill directory and run update script
230
+ console.log(gradient('cyan', 'magenta')('\nšŸ” Searching in skill...'));
231
+ console.log(`Skill Path: ${skillDir}`);
232
+ console.log(`Query: ${query}`);
266
233
  const { chdir } = await import('node:process');
267
234
  const originalCwd = process.cwd();
268
235
  chdir(skillDir);
269
236
  try {
270
237
  const { runScript } = await import('./core/runScript.js');
271
- const args = ['--force'];
272
- await runScript('update-context7', args);
238
+ const args = ['--query', query];
239
+ if (options.mode !== 'auto')
240
+ args.push('--mode', options.mode);
241
+ if (options.list)
242
+ args.push('--list');
243
+ // Enhanced search is now enabled by default, no need for --enhanced flag
244
+ await runScript('search-skill', args);
273
245
  }
274
246
  finally {
275
247
  chdir(originalCwd);
276
248
  }
277
- console.log(gradient('green', 'cyan')('\nāœ… Documentation downloaded and sliced!'));
278
249
  });
279
- // Add search-in-skill command
250
+ // Add download-context7 command
280
251
  program
281
- .command('search-in-skill')
282
- .argument('<package_name>', 'Package name')
283
- .argument('<query>', 'Search query')
284
- .action(async (packageName, query) => {
285
- console.log(gradient('cyan', 'magenta')('\nšŸ” Searching in skill...'));
286
- console.log(`Package: ${packageName}`);
287
- console.log(`Query: ${query}`);
288
- // Find skill directory
289
- const { join, dirname } = await import('node:path');
290
- const { homedir } = await import('node:os');
291
- const { readdirSync } = await import('node:fs');
292
- const baseDir = join(process.cwd(), '.claude', 'skills');
293
- const dirs = readdirSync(baseDir, { withFileTypes: true })
294
- .filter(dirent => dirent.isDirectory())
295
- .map(dirent => dirent.name)
296
- .filter(name => name.includes(packageName.replace(/[^a-z0-9]/gi, '')));
297
- if (dirs.length === 0) {
298
- console.error(`āŒ No skill found for package ${packageName}`);
252
+ .command('download-context7')
253
+ .argument('<project_id>', 'Context7 library ID')
254
+ .option('--pwd <path>', 'Path to the skill directory')
255
+ .option('--package <name>', 'Package name to find skill directory for')
256
+ .option('-f, --force', 'Force update even if up to date')
257
+ .option('--skip-chroma-indexing', 'Skip automatic ChromaDB index building after download')
258
+ .action(async (projectId, options) => {
259
+ let skillDir;
260
+ if (options.pwd) {
261
+ skillDir = options.pwd;
262
+ }
263
+ else if (options.package) {
264
+ const { join } = await import('node:path');
265
+ const { homedir } = await import('node:os');
266
+ const { readdirSync, existsSync } = await import('node:fs');
267
+ const findDir = (base) => {
268
+ if (!existsSync(base))
269
+ return undefined;
270
+ const dirs = readdirSync(base, { withFileTypes: true })
271
+ .filter((dirent) => dirent.isDirectory())
272
+ .map((dirent) => dirent.name)
273
+ .filter((name) => name.includes(options.package.replace(/[^a-z0-9]/gi, '')));
274
+ return dirs.length > 0 ? join(base, dirs[0]) : undefined;
275
+ };
276
+ skillDir =
277
+ findDir(join(process.cwd(), '.claude', 'skills')) ||
278
+ findDir(join(homedir(), '.claude', 'skills'));
279
+ }
280
+ if (!skillDir) {
281
+ console.error('āŒ Could not find skill directory. Please provide --pwd or a valid --package.');
299
282
  process.exit(1);
300
283
  }
301
- const skillDir = join(baseDir, dirs[0]);
302
- // Change to skill directory and run search script
284
+ console.log(gradient('cyan', 'magenta')('\nšŸ“„ Downloading Context7 documentation...'));
285
+ console.log(`Skill Path: ${skillDir}`);
286
+ console.log(`Context7 ID: ${projectId}`);
303
287
  const { chdir } = await import('node:process');
304
288
  const originalCwd = process.cwd();
305
289
  chdir(skillDir);
306
290
  try {
307
291
  const { runScript } = await import('./core/runScript.js');
308
- const args = ['--query', query];
309
- await runScript('search', args);
292
+ const args = [];
293
+ if (options.force)
294
+ args.push('--force');
295
+ if (options['skip-chroma-indexing'])
296
+ args.push('--skip-chroma-indexing');
297
+ args.push('--project-id', projectId);
298
+ await runScript('download-context7', args);
310
299
  }
311
300
  finally {
312
301
  chdir(originalCwd);
313
302
  }
303
+ console.log(gradient('green', 'cyan')('\nāœ… Documentation downloaded and sliced!'));
314
304
  });
315
- // Add add-skill-content command
305
+ // Add add-skill command
316
306
  program
317
- .command('addSkill')
318
- .argument('<package_name>', 'Package name')
307
+ .command('add-skill')
308
+ .option('--pwd <path>', 'Path to the skill directory')
309
+ .option('--package <name>', 'Package name to find skill directory for')
319
310
  .option('-t, --title <title>', 'Content title')
320
311
  .option('-c, --content <content>', 'Content text')
321
312
  .option('-f, --file <file>', 'Read content from file')
322
- .action(async (packageName, options) => {
313
+ .option('--force', 'Force overwrite existing content')
314
+ .option('--force-append', 'Append content to existing file instead of creating new file')
315
+ .action(async (options) => {
323
316
  if (!options.title && !options.file) {
324
317
  console.error('āŒ Please provide either --title or --file');
325
318
  process.exit(1);
326
319
  }
327
- console.log(gradient('cyan', 'magenta')('\nšŸ“ Adding content to skill...'));
328
- console.log(`Package: ${packageName}`);
329
- // Find skill directory
330
- const { join, dirname } = await import('node:path');
331
- const { homedir } = await import('node:os');
332
- const { readdirSync } = await import('node:fs');
333
- const baseDir = join(process.cwd(), '.claude', 'skills');
334
- const dirs = readdirSync(baseDir, { withFileTypes: true })
335
- .filter(dirent => dirent.isDirectory())
336
- .map(dirent => dirent.name)
337
- .filter(name => name.includes(packageName.replace(/[^a-z0-9]/gi, '')));
338
- if (dirs.length === 0) {
339
- console.error(`āŒ No skill found for package ${packageName}`);
320
+ let skillDir;
321
+ if (options.pwd) {
322
+ skillDir = options.pwd;
323
+ }
324
+ else if (options.package) {
325
+ const { join } = await import('node:path');
326
+ const { homedir } = await import('node:os');
327
+ const { readdirSync, existsSync } = await import('node:fs');
328
+ const findDir = (base) => {
329
+ if (!existsSync(base))
330
+ return undefined;
331
+ const dirs = readdirSync(base, { withFileTypes: true })
332
+ .filter((dirent) => dirent.isDirectory())
333
+ .map((dirent) => dirent.name)
334
+ .filter((name) => name.includes(options.package.replace(/[^a-z0-9]/gi, '')));
335
+ return dirs.length > 0 ? join(base, dirs[0]) : undefined;
336
+ };
337
+ skillDir =
338
+ findDir(join(process.cwd(), '.claude', 'skills')) ||
339
+ findDir(join(homedir(), '.claude', 'skills'));
340
+ }
341
+ if (!skillDir) {
342
+ console.error('āŒ Could not find skill directory. Please provide --pwd or a valid --package.');
340
343
  process.exit(1);
341
344
  }
342
- const skillDir = join(baseDir, dirs[0]);
343
- // Change to skill directory and run add script
345
+ console.log(gradient('cyan', 'magenta')('\nšŸ“ Adding content to skill...'));
346
+ console.log(`Skill Path: ${skillDir}`);
344
347
  const { chdir } = await import('node:process');
345
348
  const originalCwd = process.cwd();
346
349
  chdir(skillDir);
@@ -353,6 +356,10 @@ program
353
356
  args.push('--content', options.content);
354
357
  if (options.file)
355
358
  args.push('--file', options.file);
359
+ if (options.force)
360
+ args.push('--force');
361
+ if (options.forceAppend)
362
+ args.push('--force-append');
356
363
  await runScript('add', args);
357
364
  }
358
365
  finally {
@@ -363,7 +370,7 @@ program
363
370
  // Add sub-commands for script execution
364
371
  program
365
372
  .command('run-script')
366
- .argument('<script>', 'Script to run (search, add, update-context7, build-index, list-content)')
373
+ .argument('<script>', 'Script to run (search, add, download-context7, build-index, list-content)')
367
374
  .allowUnknownOption(true)
368
375
  .action(async (script) => {
369
376
  const { runScript } = await import('./core/runScript.js');
@@ -372,7 +379,6 @@ program
372
379
  // Export for testing
373
380
  export { program };
374
381
  // Run CLI if this file is executed directly
375
- if (import.meta.url === `file://${process.argv[1]}`) {
376
- program.parse();
377
- }
382
+ // Always parse for now since we're using this as the main CLI entry point
383
+ program.parse();
378
384
  //# sourceMappingURL=cli.js.map