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.
- package/README.md +157 -19
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +268 -262
- package/dist/cli.js.map +1 -1
- package/dist/commands/addContent.d.ts +5 -0
- package/dist/commands/addContent.d.ts.map +1 -0
- package/dist/commands/addContent.js +74 -0
- package/dist/commands/addContent.js.map +1 -0
- package/dist/commands/buildIndex.d.ts +5 -0
- package/dist/commands/buildIndex.d.ts.map +1 -0
- package/dist/commands/buildIndex.js +17 -0
- package/dist/commands/buildIndex.js.map +1 -0
- package/dist/commands/downloadContext7.d.ts +5 -0
- package/dist/commands/downloadContext7.d.ts.map +1 -0
- package/dist/commands/downloadContext7.js +62 -0
- package/dist/commands/downloadContext7.js.map +1 -0
- package/dist/commands/init.d.ts +5 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +89 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/listContent.d.ts +5 -0
- package/dist/commands/listContent.d.ts.map +1 -0
- package/dist/commands/listContent.js +35 -0
- package/dist/commands/listContent.js.map +1 -0
- package/dist/commands/searchContent.d.ts +5 -0
- package/dist/commands/searchContent.d.ts.map +1 -0
- package/dist/commands/searchContent.js +98 -0
- package/dist/commands/searchContent.js.map +1 -0
- package/dist/commands/shared.d.ts +23 -0
- package/dist/commands/shared.d.ts.map +1 -0
- package/dist/commands/shared.js +92 -0
- package/dist/commands/shared.js.map +1 -0
- package/dist/core/autoSearchAdapter.d.ts +42 -0
- package/dist/core/autoSearchAdapter.d.ts.map +1 -0
- package/dist/core/autoSearchAdapter.js +116 -0
- package/dist/core/autoSearchAdapter.js.map +1 -0
- package/dist/core/chromaSearch.d.ts +2 -2
- package/dist/core/chromaSearch.d.ts.map +1 -1
- package/dist/core/chromaSearch.js +11 -9
- package/dist/core/chromaSearch.js.map +1 -1
- package/dist/core/chromaSearchAdapter.d.ts +86 -0
- package/dist/core/chromaSearchAdapter.d.ts.map +1 -0
- package/dist/core/chromaSearchAdapter.js +477 -0
- package/dist/core/chromaSearchAdapter.js.map +1 -0
- package/dist/core/chromaServerManager.d.ts +64 -0
- package/dist/core/chromaServerManager.d.ts.map +1 -0
- package/dist/core/chromaServerManager.js +186 -0
- package/dist/core/chromaServerManager.js.map +1 -0
- package/dist/core/contentManager.d.ts +1 -0
- package/dist/core/contentManager.d.ts.map +1 -1
- package/dist/core/contentManager.js +75 -21
- package/dist/core/contentManager.js.map +1 -1
- package/dist/core/fuzzySearchAdapter.d.ts +33 -0
- package/dist/core/fuzzySearchAdapter.d.ts.map +1 -0
- package/dist/core/fuzzySearchAdapter.js +185 -0
- package/dist/core/fuzzySearchAdapter.js.map +1 -0
- package/dist/core/portUtils.d.ts +51 -0
- package/dist/core/portUtils.d.ts.map +1 -0
- package/dist/core/portUtils.js +120 -0
- package/dist/core/portUtils.js.map +1 -0
- package/dist/core/runScript.d.ts +1 -1
- package/dist/core/runScript.d.ts.map +1 -1
- package/dist/core/runScript.js +27 -210
- package/dist/core/runScript.js.map +1 -1
- package/dist/core/searchAdapter.d.ts +48 -0
- package/dist/core/searchAdapter.d.ts.map +1 -0
- package/dist/core/searchAdapter.js +6 -0
- package/dist/core/searchAdapter.js.map +1 -0
- package/dist/core/searchEngineFactory.d.ts +30 -0
- package/dist/core/searchEngineFactory.d.ts.map +1 -0
- package/dist/core/searchEngineFactory.js +41 -0
- package/dist/core/searchEngineFactory.js.map +1 -0
- package/dist/core/skillCreator.d.ts +2 -4
- package/dist/core/skillCreator.d.ts.map +1 -1
- package/dist/core/skillCreator.js +46 -195
- package/dist/core/skillCreator.js.map +1 -1
- package/dist/core/templateManager.d.ts +2 -1
- package/dist/core/templateManager.d.ts.map +1 -1
- package/dist/core/templateManager.js +19 -13
- package/dist/core/templateManager.js.map +1 -1
- package/dist/core/unifiedSearch.d.ts +57 -11
- package/dist/core/unifiedSearch.d.ts.map +1 -1
- package/dist/core/unifiedSearch.js +88 -29
- package/dist/core/unifiedSearch.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/search_format/enhancedFormatter.d.ts +109 -0
- package/dist/search_format/enhancedFormatter.d.ts.map +1 -0
- package/dist/search_format/enhancedFormatter.js +262 -0
- package/dist/search_format/enhancedFormatter.js.map +1 -0
- package/dist/search_format/index.d.ts +10 -0
- package/dist/search_format/index.d.ts.map +1 -0
- package/dist/search_format/index.js +22 -0
- package/dist/search_format/index.js.map +1 -0
- package/dist/search_format/listFormatter.d.ts +16 -0
- package/dist/search_format/listFormatter.d.ts.map +1 -0
- package/dist/search_format/listFormatter.js +51 -0
- package/dist/search_format/listFormatter.js.map +1 -0
- package/dist/search_format/types.d.ts +69 -0
- package/dist/search_format/types.d.ts.map +1 -0
- package/dist/search_format/types.js +5 -0
- package/dist/search_format/types.js.map +1 -0
- package/dist/types/index.d.ts +6 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/package.d.ts +17 -0
- package/dist/utils/package.d.ts.map +1 -1
- package/dist/utils/package.js +51 -14
- package/dist/utils/package.js.map +1 -1
- package/package.json +9 -8
- package/templates/SKILL.md +193 -0
- package/templates/SKILL.zh-CN.md +193 -0
- package/templates/skill-creator.md +68 -154
- package/templates/skill-creator.zh-CN.md +98 -0
- package/dist/core/searchEngine.d.ts +0 -25
- package/dist/core/searchEngine.d.ts.map +0 -1
- package/dist/core/searchEngine.js +0 -198
- package/dist/core/searchEngine.js.map +0 -1
- package/dist/core/simpleSearch.d.ts +0 -21
- package/dist/core/simpleSearch.d.ts.map +0 -1
- package/dist/core/simpleSearch.js +0 -113
- 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
|
-
.
|
|
17
|
-
.
|
|
18
|
-
.option('
|
|
19
|
-
.option('
|
|
20
|
-
.option('--
|
|
21
|
-
.option('
|
|
22
|
-
.
|
|
23
|
-
.
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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: '
|
|
52
|
-
name: '
|
|
53
|
-
message: '
|
|
54
|
-
|
|
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
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
-
|
|
90
|
-
|
|
79
|
+
type: 'confirm',
|
|
80
|
+
name: 'packageNameConfirmed',
|
|
81
|
+
message: `Use '${skillDirName}' as the package name?`,
|
|
82
|
+
default: true,
|
|
91
83
|
},
|
|
92
|
-
]
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
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: '
|
|
102
|
-
message: '
|
|
105
|
+
name: 'confirmFinal',
|
|
106
|
+
message: 'Proceed with skill creation?',
|
|
103
107
|
default: true,
|
|
104
108
|
},
|
|
105
109
|
]);
|
|
106
|
-
if (!
|
|
107
|
-
|
|
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
|
-
|
|
120
|
-
|
|
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
|
|
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 {
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
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-
|
|
154
|
+
// Add get-info command for package information
|
|
222
155
|
program
|
|
223
|
-
.command('get-
|
|
224
|
-
.argument('<package_name>', '
|
|
225
|
-
.
|
|
226
|
-
.
|
|
227
|
-
|
|
228
|
-
|
|
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
|
|
233
|
-
|
|
234
|
-
|
|
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
|
|
196
|
+
// Add search-skill command
|
|
237
197
|
program
|
|
238
|
-
.command('
|
|
239
|
-
.argument('<
|
|
240
|
-
.
|
|
241
|
-
.option('
|
|
242
|
-
.option('
|
|
243
|
-
.
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
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
|
-
|
|
265
|
-
|
|
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 = ['--
|
|
272
|
-
|
|
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
|
|
250
|
+
// Add download-context7 command
|
|
280
251
|
program
|
|
281
|
-
.command('
|
|
282
|
-
.argument('<
|
|
283
|
-
.
|
|
284
|
-
.
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
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
|
-
|
|
302
|
-
|
|
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 = [
|
|
309
|
-
|
|
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
|
|
305
|
+
// Add add-skill command
|
|
316
306
|
program
|
|
317
|
-
.command('
|
|
318
|
-
.
|
|
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
|
-
.
|
|
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
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
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
|
-
|
|
343
|
-
|
|
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,
|
|
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
|
-
|
|
376
|
-
|
|
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
|